islamic-date-adjustment 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +325 -0
- package/coverage/clover.xml +215 -0
- package/coverage/coverage-final.json +3 -0
- package/coverage/lcov-report/adjustmentEngine.js.html +1795 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +131 -0
- package/coverage/lcov-report/islamicCalendar.js.html +526 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov.info +458 -0
- package/jest.config.js +6 -0
- package/package.json +50 -0
- package/src/adjustmentEngine.js +602 -0
- package/src/cli.js +343 -0
- package/src/defaults.js +21 -0
- package/src/firebaseAdapter.js +190 -0
- package/src/index.js +27 -0
- package/src/islamicCalendar.js +160 -0
- package/src/useHijriYear.js +249 -0
- package/tests/adjustmentEngine.test.js +982 -0
- package/tests/firebaseAdapter.test.js +270 -0
- package/tests/islamicCalendar.test.js +230 -0
|
@@ -0,0 +1,1795 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for adjustmentEngine.js</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="index.html">All files</a> adjustmentEngine.js</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">94.03% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>205/218</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">82.03% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>105/128</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">100% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>36/36</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">97.2% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>174/179</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line high'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
+
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
+
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
+
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
+
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
+
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
+
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
+
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
+
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
+
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
+
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
+
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
+
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
+
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
+
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
+
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
+
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
+
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
+
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
+
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
+
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
+
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
+
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
+
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
+
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
+
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
+
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
+
<a name='L409'></a><a href='#L409'>409</a>
|
|
475
|
+
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
+
<a name='L411'></a><a href='#L411'>411</a>
|
|
477
|
+
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
+
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
+
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
+
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
+
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
+
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
+
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
+
<a name='L419'></a><a href='#L419'>419</a>
|
|
485
|
+
<a name='L420'></a><a href='#L420'>420</a>
|
|
486
|
+
<a name='L421'></a><a href='#L421'>421</a>
|
|
487
|
+
<a name='L422'></a><a href='#L422'>422</a>
|
|
488
|
+
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
|
+
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
|
+
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
+
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
+
<a name='L427'></a><a href='#L427'>427</a>
|
|
493
|
+
<a name='L428'></a><a href='#L428'>428</a>
|
|
494
|
+
<a name='L429'></a><a href='#L429'>429</a>
|
|
495
|
+
<a name='L430'></a><a href='#L430'>430</a>
|
|
496
|
+
<a name='L431'></a><a href='#L431'>431</a>
|
|
497
|
+
<a name='L432'></a><a href='#L432'>432</a>
|
|
498
|
+
<a name='L433'></a><a href='#L433'>433</a>
|
|
499
|
+
<a name='L434'></a><a href='#L434'>434</a>
|
|
500
|
+
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
|
+
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
|
+
<a name='L437'></a><a href='#L437'>437</a>
|
|
503
|
+
<a name='L438'></a><a href='#L438'>438</a>
|
|
504
|
+
<a name='L439'></a><a href='#L439'>439</a>
|
|
505
|
+
<a name='L440'></a><a href='#L440'>440</a>
|
|
506
|
+
<a name='L441'></a><a href='#L441'>441</a>
|
|
507
|
+
<a name='L442'></a><a href='#L442'>442</a>
|
|
508
|
+
<a name='L443'></a><a href='#L443'>443</a>
|
|
509
|
+
<a name='L444'></a><a href='#L444'>444</a>
|
|
510
|
+
<a name='L445'></a><a href='#L445'>445</a>
|
|
511
|
+
<a name='L446'></a><a href='#L446'>446</a>
|
|
512
|
+
<a name='L447'></a><a href='#L447'>447</a>
|
|
513
|
+
<a name='L448'></a><a href='#L448'>448</a>
|
|
514
|
+
<a name='L449'></a><a href='#L449'>449</a>
|
|
515
|
+
<a name='L450'></a><a href='#L450'>450</a>
|
|
516
|
+
<a name='L451'></a><a href='#L451'>451</a>
|
|
517
|
+
<a name='L452'></a><a href='#L452'>452</a>
|
|
518
|
+
<a name='L453'></a><a href='#L453'>453</a>
|
|
519
|
+
<a name='L454'></a><a href='#L454'>454</a>
|
|
520
|
+
<a name='L455'></a><a href='#L455'>455</a>
|
|
521
|
+
<a name='L456'></a><a href='#L456'>456</a>
|
|
522
|
+
<a name='L457'></a><a href='#L457'>457</a>
|
|
523
|
+
<a name='L458'></a><a href='#L458'>458</a>
|
|
524
|
+
<a name='L459'></a><a href='#L459'>459</a>
|
|
525
|
+
<a name='L460'></a><a href='#L460'>460</a>
|
|
526
|
+
<a name='L461'></a><a href='#L461'>461</a>
|
|
527
|
+
<a name='L462'></a><a href='#L462'>462</a>
|
|
528
|
+
<a name='L463'></a><a href='#L463'>463</a>
|
|
529
|
+
<a name='L464'></a><a href='#L464'>464</a>
|
|
530
|
+
<a name='L465'></a><a href='#L465'>465</a>
|
|
531
|
+
<a name='L466'></a><a href='#L466'>466</a>
|
|
532
|
+
<a name='L467'></a><a href='#L467'>467</a>
|
|
533
|
+
<a name='L468'></a><a href='#L468'>468</a>
|
|
534
|
+
<a name='L469'></a><a href='#L469'>469</a>
|
|
535
|
+
<a name='L470'></a><a href='#L470'>470</a>
|
|
536
|
+
<a name='L471'></a><a href='#L471'>471</a>
|
|
537
|
+
<a name='L472'></a><a href='#L472'>472</a>
|
|
538
|
+
<a name='L473'></a><a href='#L473'>473</a>
|
|
539
|
+
<a name='L474'></a><a href='#L474'>474</a>
|
|
540
|
+
<a name='L475'></a><a href='#L475'>475</a>
|
|
541
|
+
<a name='L476'></a><a href='#L476'>476</a>
|
|
542
|
+
<a name='L477'></a><a href='#L477'>477</a>
|
|
543
|
+
<a name='L478'></a><a href='#L478'>478</a>
|
|
544
|
+
<a name='L479'></a><a href='#L479'>479</a>
|
|
545
|
+
<a name='L480'></a><a href='#L480'>480</a>
|
|
546
|
+
<a name='L481'></a><a href='#L481'>481</a>
|
|
547
|
+
<a name='L482'></a><a href='#L482'>482</a>
|
|
548
|
+
<a name='L483'></a><a href='#L483'>483</a>
|
|
549
|
+
<a name='L484'></a><a href='#L484'>484</a>
|
|
550
|
+
<a name='L485'></a><a href='#L485'>485</a>
|
|
551
|
+
<a name='L486'></a><a href='#L486'>486</a>
|
|
552
|
+
<a name='L487'></a><a href='#L487'>487</a>
|
|
553
|
+
<a name='L488'></a><a href='#L488'>488</a>
|
|
554
|
+
<a name='L489'></a><a href='#L489'>489</a>
|
|
555
|
+
<a name='L490'></a><a href='#L490'>490</a>
|
|
556
|
+
<a name='L491'></a><a href='#L491'>491</a>
|
|
557
|
+
<a name='L492'></a><a href='#L492'>492</a>
|
|
558
|
+
<a name='L493'></a><a href='#L493'>493</a>
|
|
559
|
+
<a name='L494'></a><a href='#L494'>494</a>
|
|
560
|
+
<a name='L495'></a><a href='#L495'>495</a>
|
|
561
|
+
<a name='L496'></a><a href='#L496'>496</a>
|
|
562
|
+
<a name='L497'></a><a href='#L497'>497</a>
|
|
563
|
+
<a name='L498'></a><a href='#L498'>498</a>
|
|
564
|
+
<a name='L499'></a><a href='#L499'>499</a>
|
|
565
|
+
<a name='L500'></a><a href='#L500'>500</a>
|
|
566
|
+
<a name='L501'></a><a href='#L501'>501</a>
|
|
567
|
+
<a name='L502'></a><a href='#L502'>502</a>
|
|
568
|
+
<a name='L503'></a><a href='#L503'>503</a>
|
|
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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
637
|
+
<span class="cline-any cline-neutral"> </span>
|
|
638
|
+
<span class="cline-any cline-neutral"> </span>
|
|
639
|
+
<span class="cline-any cline-neutral"> </span>
|
|
640
|
+
<span class="cline-any cline-neutral"> </span>
|
|
641
|
+
<span class="cline-any cline-neutral"> </span>
|
|
642
|
+
<span class="cline-any cline-neutral"> </span>
|
|
643
|
+
<span class="cline-any cline-neutral"> </span>
|
|
644
|
+
<span class="cline-any cline-neutral"> </span>
|
|
645
|
+
<span class="cline-any cline-neutral"> </span>
|
|
646
|
+
<span class="cline-any cline-neutral"> </span>
|
|
647
|
+
<span class="cline-any cline-neutral"> </span>
|
|
648
|
+
<span class="cline-any cline-neutral"> </span>
|
|
649
|
+
<span class="cline-any cline-neutral"> </span>
|
|
650
|
+
<span class="cline-any cline-neutral"> </span>
|
|
651
|
+
<span class="cline-any cline-neutral"> </span>
|
|
652
|
+
<span class="cline-any cline-neutral"> </span>
|
|
653
|
+
<span class="cline-any cline-neutral"> </span>
|
|
654
|
+
<span class="cline-any cline-neutral"> </span>
|
|
655
|
+
<span class="cline-any cline-neutral"> </span>
|
|
656
|
+
<span class="cline-any cline-neutral"> </span>
|
|
657
|
+
<span class="cline-any cline-neutral"> </span>
|
|
658
|
+
<span class="cline-any cline-neutral"> </span>
|
|
659
|
+
<span class="cline-any cline-neutral"> </span>
|
|
660
|
+
<span class="cline-any cline-neutral"> </span>
|
|
661
|
+
<span class="cline-any cline-neutral"> </span>
|
|
662
|
+
<span class="cline-any cline-neutral"> </span>
|
|
663
|
+
<span class="cline-any cline-neutral"> </span>
|
|
664
|
+
<span class="cline-any cline-neutral"> </span>
|
|
665
|
+
<span class="cline-any cline-neutral"> </span>
|
|
666
|
+
<span class="cline-any cline-neutral"> </span>
|
|
667
|
+
<span class="cline-any cline-neutral"> </span>
|
|
668
|
+
<span class="cline-any cline-neutral"> </span>
|
|
669
|
+
<span class="cline-any cline-neutral"> </span>
|
|
670
|
+
<span class="cline-any cline-neutral"> </span>
|
|
671
|
+
<span class="cline-any cline-neutral"> </span>
|
|
672
|
+
<span class="cline-any cline-neutral"> </span>
|
|
673
|
+
<span class="cline-any cline-neutral"> </span>
|
|
674
|
+
<span class="cline-any cline-neutral"> </span>
|
|
675
|
+
<span class="cline-any cline-neutral"> </span>
|
|
676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
677
|
+
<span class="cline-any cline-neutral"> </span>
|
|
678
|
+
<span class="cline-any cline-neutral"> </span>
|
|
679
|
+
<span class="cline-any cline-neutral"> </span>
|
|
680
|
+
<span class="cline-any cline-neutral"> </span>
|
|
681
|
+
<span class="cline-any cline-neutral"> </span>
|
|
682
|
+
<span class="cline-any cline-neutral"> </span>
|
|
683
|
+
<span class="cline-any cline-yes">1x</span>
|
|
684
|
+
<span class="cline-any cline-neutral"> </span>
|
|
685
|
+
<span class="cline-any cline-neutral"> </span>
|
|
686
|
+
<span class="cline-any cline-neutral"> </span>
|
|
687
|
+
<span class="cline-any cline-neutral"> </span>
|
|
688
|
+
<span class="cline-any cline-yes">1x</span>
|
|
689
|
+
<span class="cline-any cline-yes">1x</span>
|
|
690
|
+
<span class="cline-any cline-neutral"> </span>
|
|
691
|
+
<span class="cline-any cline-neutral"> </span>
|
|
692
|
+
<span class="cline-any cline-neutral"> </span>
|
|
693
|
+
<span class="cline-any cline-neutral"> </span>
|
|
694
|
+
<span class="cline-any cline-neutral"> </span>
|
|
695
|
+
<span class="cline-any cline-neutral"> </span>
|
|
696
|
+
<span class="cline-any cline-neutral"> </span>
|
|
697
|
+
<span class="cline-any cline-neutral"> </span>
|
|
698
|
+
<span class="cline-any cline-neutral"> </span>
|
|
699
|
+
<span class="cline-any cline-neutral"> </span>
|
|
700
|
+
<span class="cline-any cline-neutral"> </span>
|
|
701
|
+
<span class="cline-any cline-neutral"> </span>
|
|
702
|
+
<span class="cline-any cline-neutral"> </span>
|
|
703
|
+
<span class="cline-any cline-neutral"> </span>
|
|
704
|
+
<span class="cline-any cline-yes">92x</span>
|
|
705
|
+
<span class="cline-any cline-yes">92x</span>
|
|
706
|
+
<span class="cline-any cline-neutral"> </span>
|
|
707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
708
|
+
<span class="cline-any cline-yes">92x</span>
|
|
709
|
+
<span class="cline-any cline-neutral"> </span>
|
|
710
|
+
<span class="cline-any cline-neutral"> </span>
|
|
711
|
+
<span class="cline-any cline-yes">1104x</span>
|
|
712
|
+
<span class="cline-any cline-neutral"> </span>
|
|
713
|
+
<span class="cline-any cline-neutral"> </span>
|
|
714
|
+
<span class="cline-any cline-neutral"> </span>
|
|
715
|
+
<span class="cline-any cline-neutral"> </span>
|
|
716
|
+
<span class="cline-any cline-neutral"> </span>
|
|
717
|
+
<span class="cline-any cline-neutral"> </span>
|
|
718
|
+
<span class="cline-any cline-neutral"> </span>
|
|
719
|
+
<span class="cline-any cline-yes">92x</span>
|
|
720
|
+
<span class="cline-any cline-neutral"> </span>
|
|
721
|
+
<span class="cline-any cline-neutral"> </span>
|
|
722
|
+
<span class="cline-any cline-neutral"> </span>
|
|
723
|
+
<span class="cline-any cline-neutral"> </span>
|
|
724
|
+
<span class="cline-any cline-neutral"> </span>
|
|
725
|
+
<span class="cline-any cline-neutral"> </span>
|
|
726
|
+
<span class="cline-any cline-yes">92x</span>
|
|
727
|
+
<span class="cline-any cline-yes">994x</span>
|
|
728
|
+
<span class="cline-any cline-yes">6478x</span>
|
|
729
|
+
<span class="cline-any cline-yes">994x</span>
|
|
730
|
+
<span class="cline-any cline-neutral"> </span>
|
|
731
|
+
<span class="cline-any cline-neutral"> </span>
|
|
732
|
+
<span class="cline-any cline-neutral"> </span>
|
|
733
|
+
<span class="cline-any cline-yes">92x</span>
|
|
734
|
+
<span class="cline-any cline-yes">1012x</span>
|
|
735
|
+
<span class="cline-any cline-yes">1012x</span>
|
|
736
|
+
<span class="cline-any cline-yes">1012x</span>
|
|
737
|
+
<span class="cline-any cline-yes">38x</span>
|
|
738
|
+
<span class="cline-any cline-neutral"> </span>
|
|
739
|
+
<span class="cline-any cline-neutral"> </span>
|
|
740
|
+
<span class="cline-any cline-neutral"> </span>
|
|
741
|
+
<span class="cline-any cline-neutral"> </span>
|
|
742
|
+
<span class="cline-any cline-yes">92x</span>
|
|
743
|
+
<span class="cline-any cline-yes">1012x</span>
|
|
744
|
+
<span class="cline-any cline-yes">1012x</span>
|
|
745
|
+
<span class="cline-any cline-yes">1012x</span>
|
|
746
|
+
<span class="cline-any cline-yes">72x</span>
|
|
747
|
+
<span class="cline-any cline-neutral"> </span>
|
|
748
|
+
<span class="cline-any cline-neutral"> </span>
|
|
749
|
+
<span class="cline-any cline-neutral"> </span>
|
|
750
|
+
<span class="cline-any cline-neutral"> </span>
|
|
751
|
+
<span class="cline-any cline-yes">92x</span>
|
|
752
|
+
<span class="cline-any cline-neutral"> </span>
|
|
753
|
+
<span class="cline-any cline-neutral"> </span>
|
|
754
|
+
<span class="cline-any cline-neutral"> </span>
|
|
755
|
+
<span class="cline-any cline-neutral"> </span>
|
|
756
|
+
<span class="cline-any cline-neutral"> </span>
|
|
757
|
+
<span class="cline-any cline-neutral"> </span>
|
|
758
|
+
<span class="cline-any cline-yes">156x</span>
|
|
759
|
+
<span class="cline-any cline-yes">1872x</span>
|
|
760
|
+
<span class="cline-any cline-yes">1872x</span>
|
|
761
|
+
<span class="cline-any cline-neutral"> </span>
|
|
762
|
+
<span class="cline-any cline-yes">1872x</span>
|
|
763
|
+
<span class="cline-any cline-neutral"> </span>
|
|
764
|
+
<span class="cline-any cline-neutral"> </span>
|
|
765
|
+
<span class="cline-any cline-neutral"> </span>
|
|
766
|
+
<span class="cline-any cline-neutral"> </span>
|
|
767
|
+
<span class="cline-any cline-neutral"> </span>
|
|
768
|
+
<span class="cline-any cline-yes">156x</span>
|
|
769
|
+
<span class="cline-any cline-yes">2x</span>
|
|
770
|
+
<span class="cline-any cline-no"> </span>
|
|
771
|
+
<span class="cline-any cline-neutral"> </span>
|
|
772
|
+
<span class="cline-any cline-neutral"> </span>
|
|
773
|
+
<span class="cline-any cline-yes">156x</span>
|
|
774
|
+
<span class="cline-any cline-yes">36x</span>
|
|
775
|
+
<span class="cline-any cline-neutral"> </span>
|
|
776
|
+
<span class="cline-any cline-neutral"> </span>
|
|
777
|
+
<span class="cline-any cline-neutral"> </span>
|
|
778
|
+
<span class="cline-any cline-neutral"> </span>
|
|
779
|
+
<span class="cline-any cline-neutral"> </span>
|
|
780
|
+
<span class="cline-any cline-neutral"> </span>
|
|
781
|
+
<span class="cline-any cline-neutral"> </span>
|
|
782
|
+
<span class="cline-any cline-neutral"> </span>
|
|
783
|
+
<span class="cline-any cline-neutral"> </span>
|
|
784
|
+
<span class="cline-any cline-neutral"> </span>
|
|
785
|
+
<span class="cline-any cline-neutral"> </span>
|
|
786
|
+
<span class="cline-any cline-neutral"> </span>
|
|
787
|
+
<span class="cline-any cline-neutral"> </span>
|
|
788
|
+
<span class="cline-any cline-neutral"> </span>
|
|
789
|
+
<span class="cline-any cline-neutral"> </span>
|
|
790
|
+
<span class="cline-any cline-neutral"> </span>
|
|
791
|
+
<span class="cline-any cline-neutral"> </span>
|
|
792
|
+
<span class="cline-any cline-neutral"> </span>
|
|
793
|
+
<span class="cline-any cline-neutral"> </span>
|
|
794
|
+
<span class="cline-any cline-yes">36x</span>
|
|
795
|
+
<span class="cline-any cline-neutral"> </span>
|
|
796
|
+
<span class="cline-any cline-yes">351x</span>
|
|
797
|
+
<span class="cline-any cline-yes">36x</span>
|
|
798
|
+
<span class="cline-any cline-neutral"> </span>
|
|
799
|
+
<span class="cline-any cline-yes">36x</span>
|
|
800
|
+
<span class="cline-any cline-neutral"> </span>
|
|
801
|
+
<span class="cline-any cline-neutral"> </span>
|
|
802
|
+
<span class="cline-any cline-yes">36x</span>
|
|
803
|
+
<span class="cline-any cline-yes">36x</span>
|
|
804
|
+
<span class="cline-any cline-yes">36x</span>
|
|
805
|
+
<span class="cline-any cline-neutral"> </span>
|
|
806
|
+
<span class="cline-any cline-yes">35x</span>
|
|
807
|
+
<span class="cline-any cline-neutral"> </span>
|
|
808
|
+
<span class="cline-any cline-neutral"> </span>
|
|
809
|
+
<span class="cline-any cline-yes">24x</span>
|
|
810
|
+
<span class="cline-any cline-yes">24x</span>
|
|
811
|
+
<span class="cline-any cline-yes">24x</span>
|
|
812
|
+
<span class="cline-any cline-yes">18x</span>
|
|
813
|
+
<span class="cline-any cline-neutral"> </span>
|
|
814
|
+
<span class="cline-any cline-neutral"> </span>
|
|
815
|
+
<span class="cline-any cline-yes">18x</span>
|
|
816
|
+
<span class="cline-any cline-yes">18x</span>
|
|
817
|
+
<span class="cline-any cline-yes">11x</span>
|
|
818
|
+
<span class="cline-any cline-neutral"> </span>
|
|
819
|
+
<span class="cline-any cline-neutral"> </span>
|
|
820
|
+
<span class="cline-any cline-neutral"> </span>
|
|
821
|
+
<span class="cline-any cline-neutral"> </span>
|
|
822
|
+
<span class="cline-any cline-yes">10x</span>
|
|
823
|
+
<span class="cline-any cline-yes">9x</span>
|
|
824
|
+
<span class="cline-any cline-yes">9x</span>
|
|
825
|
+
<span class="cline-any cline-yes">9x</span>
|
|
826
|
+
<span class="cline-any cline-yes">6x</span>
|
|
827
|
+
<span class="cline-any cline-yes">6x</span>
|
|
828
|
+
<span class="cline-any cline-neutral"> </span>
|
|
829
|
+
<span class="cline-any cline-neutral"> </span>
|
|
830
|
+
<span class="cline-any cline-yes">1x</span>
|
|
831
|
+
<span class="cline-any cline-neutral"> </span>
|
|
832
|
+
<span class="cline-any cline-yes">7x</span>
|
|
833
|
+
<span class="cline-any cline-neutral"> </span>
|
|
834
|
+
<span class="cline-any cline-neutral"> </span>
|
|
835
|
+
<span class="cline-any cline-yes">1x</span>
|
|
836
|
+
<span class="cline-any cline-yes">1x</span>
|
|
837
|
+
<span class="cline-any cline-neutral"> </span>
|
|
838
|
+
<span class="cline-any cline-neutral"> </span>
|
|
839
|
+
<span class="cline-any cline-neutral"> </span>
|
|
840
|
+
<span class="cline-any cline-neutral"> </span>
|
|
841
|
+
<span class="cline-any cline-neutral"> </span>
|
|
842
|
+
<span class="cline-any cline-neutral"> </span>
|
|
843
|
+
<span class="cline-any cline-neutral"> </span>
|
|
844
|
+
<span class="cline-any cline-neutral"> </span>
|
|
845
|
+
<span class="cline-any cline-yes">26x</span>
|
|
846
|
+
<span class="cline-any cline-yes">61x</span>
|
|
847
|
+
<span class="cline-any cline-neutral"> </span>
|
|
848
|
+
<span class="cline-any cline-neutral"> </span>
|
|
849
|
+
<span class="cline-any cline-neutral"> </span>
|
|
850
|
+
<span class="cline-any cline-neutral"> </span>
|
|
851
|
+
<span class="cline-any cline-neutral"> </span>
|
|
852
|
+
<span class="cline-any cline-neutral"> </span>
|
|
853
|
+
<span class="cline-any cline-neutral"> </span>
|
|
854
|
+
<span class="cline-any cline-neutral"> </span>
|
|
855
|
+
<span class="cline-any cline-neutral"> </span>
|
|
856
|
+
<span class="cline-any cline-neutral"> </span>
|
|
857
|
+
<span class="cline-any cline-neutral"> </span>
|
|
858
|
+
<span class="cline-any cline-yes">33x</span>
|
|
859
|
+
<span class="cline-any cline-yes">9x</span>
|
|
860
|
+
<span class="cline-any cline-neutral"> </span>
|
|
861
|
+
<span class="cline-any cline-neutral"> </span>
|
|
862
|
+
<span class="cline-any cline-neutral"> </span>
|
|
863
|
+
<span class="cline-any cline-neutral"> </span>
|
|
864
|
+
<span class="cline-any cline-neutral"> </span>
|
|
865
|
+
<span class="cline-any cline-neutral"> </span>
|
|
866
|
+
<span class="cline-any cline-neutral"> </span>
|
|
867
|
+
<span class="cline-any cline-neutral"> </span>
|
|
868
|
+
<span class="cline-any cline-neutral"> </span>
|
|
869
|
+
<span class="cline-any cline-neutral"> </span>
|
|
870
|
+
<span class="cline-any cline-neutral"> </span>
|
|
871
|
+
<span class="cline-any cline-neutral"> </span>
|
|
872
|
+
<span class="cline-any cline-neutral"> </span>
|
|
873
|
+
<span class="cline-any cline-neutral"> </span>
|
|
874
|
+
<span class="cline-any cline-neutral"> </span>
|
|
875
|
+
<span class="cline-any cline-yes">24x</span>
|
|
876
|
+
<span class="cline-any cline-yes">23x</span>
|
|
877
|
+
<span class="cline-any cline-yes">21x</span>
|
|
878
|
+
<span class="cline-any cline-yes">21x</span>
|
|
879
|
+
<span class="cline-any cline-yes">21x</span>
|
|
880
|
+
<span class="cline-any cline-neutral"> </span>
|
|
881
|
+
<span class="cline-any cline-neutral"> </span>
|
|
882
|
+
<span class="cline-any cline-neutral"> </span>
|
|
883
|
+
<span class="cline-any cline-neutral"> </span>
|
|
884
|
+
<span class="cline-any cline-neutral"> </span>
|
|
885
|
+
<span class="cline-any cline-neutral"> </span>
|
|
886
|
+
<span class="cline-any cline-neutral"> </span>
|
|
887
|
+
<span class="cline-any cline-neutral"> </span>
|
|
888
|
+
<span class="cline-any cline-neutral"> </span>
|
|
889
|
+
<span class="cline-any cline-neutral"> </span>
|
|
890
|
+
<span class="cline-any cline-yes">38x</span>
|
|
891
|
+
<span class="cline-any cline-yes">38x</span>
|
|
892
|
+
<span class="cline-any cline-neutral"> </span>
|
|
893
|
+
<span class="cline-any cline-yes">37x</span>
|
|
894
|
+
<span class="cline-any cline-yes">37x</span>
|
|
895
|
+
<span class="cline-any cline-neutral"> </span>
|
|
896
|
+
<span class="cline-any cline-yes">37x</span>
|
|
897
|
+
<span class="cline-any cline-yes">36x</span>
|
|
898
|
+
<span class="cline-any cline-neutral"> </span>
|
|
899
|
+
<span class="cline-any cline-yes">36x</span>
|
|
900
|
+
<span class="cline-any cline-yes">2x</span>
|
|
901
|
+
<span class="cline-any cline-neutral"> </span>
|
|
902
|
+
<span class="cline-any cline-neutral"> </span>
|
|
903
|
+
<span class="cline-any cline-neutral"> </span>
|
|
904
|
+
<span class="cline-any cline-neutral"> </span>
|
|
905
|
+
<span class="cline-any cline-neutral"> </span>
|
|
906
|
+
<span class="cline-any cline-neutral"> </span>
|
|
907
|
+
<span class="cline-any cline-neutral"> </span>
|
|
908
|
+
<span class="cline-any cline-yes">34x</span>
|
|
909
|
+
<span class="cline-any cline-neutral"> </span>
|
|
910
|
+
<span class="cline-any cline-neutral"> </span>
|
|
911
|
+
<span class="cline-any cline-neutral"> </span>
|
|
912
|
+
<span class="cline-any cline-neutral"> </span>
|
|
913
|
+
<span class="cline-any cline-neutral"> </span>
|
|
914
|
+
<span class="cline-any cline-neutral"> </span>
|
|
915
|
+
<span class="cline-any cline-neutral"> </span>
|
|
916
|
+
<span class="cline-any cline-neutral"> </span>
|
|
917
|
+
<span class="cline-any cline-yes">34x</span>
|
|
918
|
+
<span class="cline-any cline-neutral"> </span>
|
|
919
|
+
<span class="cline-any cline-neutral"> </span>
|
|
920
|
+
<span class="cline-any cline-yes">34x</span>
|
|
921
|
+
<span class="cline-any cline-yes">34x</span>
|
|
922
|
+
<span class="cline-any cline-neutral"> </span>
|
|
923
|
+
<span class="cline-any cline-yes">34x</span>
|
|
924
|
+
<span class="cline-any cline-yes">34x</span>
|
|
925
|
+
<span class="cline-any cline-neutral"> </span>
|
|
926
|
+
<span class="cline-any cline-neutral"> </span>
|
|
927
|
+
<span class="cline-any cline-yes">9x</span>
|
|
928
|
+
<span class="cline-any cline-yes">9x</span>
|
|
929
|
+
<span class="cline-any cline-yes">9x</span>
|
|
930
|
+
<span class="cline-any cline-neutral"> </span>
|
|
931
|
+
<span class="cline-any cline-neutral"> </span>
|
|
932
|
+
<span class="cline-any cline-yes">25x</span>
|
|
933
|
+
<span class="cline-any cline-neutral"> </span>
|
|
934
|
+
<span class="cline-any cline-neutral"> </span>
|
|
935
|
+
<span class="cline-any cline-neutral"> </span>
|
|
936
|
+
<span class="cline-any cline-neutral"> </span>
|
|
937
|
+
<span class="cline-any cline-neutral"> </span>
|
|
938
|
+
<span class="cline-any cline-neutral"> </span>
|
|
939
|
+
<span class="cline-any cline-neutral"> </span>
|
|
940
|
+
<span class="cline-any cline-neutral"> </span>
|
|
941
|
+
<span class="cline-any cline-neutral"> </span>
|
|
942
|
+
<span class="cline-any cline-neutral"> </span>
|
|
943
|
+
<span class="cline-any cline-yes">6x</span>
|
|
944
|
+
<span class="cline-any cline-yes">6x</span>
|
|
945
|
+
<span class="cline-any cline-neutral"> </span>
|
|
946
|
+
<span class="cline-any cline-yes">4x</span>
|
|
947
|
+
<span class="cline-any cline-yes">4x</span>
|
|
948
|
+
<span class="cline-any cline-neutral"> </span>
|
|
949
|
+
<span class="cline-any cline-neutral"> </span>
|
|
950
|
+
<span class="cline-any cline-yes">40x</span>
|
|
951
|
+
<span class="cline-any cline-yes">4x</span>
|
|
952
|
+
<span class="cline-any cline-yes">4x</span>
|
|
953
|
+
<span class="cline-any cline-yes">4x</span>
|
|
954
|
+
<span class="cline-any cline-neutral"> </span>
|
|
955
|
+
<span class="cline-any cline-neutral"> </span>
|
|
956
|
+
<span class="cline-any cline-yes">4x</span>
|
|
957
|
+
<span class="cline-any cline-yes">4x</span>
|
|
958
|
+
<span class="cline-any cline-yes">26x</span>
|
|
959
|
+
<span class="cline-any cline-neutral"> </span>
|
|
960
|
+
<span class="cline-any cline-neutral"> </span>
|
|
961
|
+
<span class="cline-any cline-yes">26x</span>
|
|
962
|
+
<span class="cline-any cline-yes">26x</span>
|
|
963
|
+
<span class="cline-any cline-yes">22x</span>
|
|
964
|
+
<span class="cline-any cline-yes">22x</span>
|
|
965
|
+
<span class="cline-any cline-yes">18x</span>
|
|
966
|
+
<span class="cline-any cline-neutral"> </span>
|
|
967
|
+
<span class="cline-any cline-neutral"> </span>
|
|
968
|
+
<span class="cline-any cline-neutral"> </span>
|
|
969
|
+
<span class="cline-any cline-yes">26x</span>
|
|
970
|
+
<span class="cline-any cline-neutral"> </span>
|
|
971
|
+
<span class="cline-any cline-neutral"> </span>
|
|
972
|
+
<span class="cline-any cline-neutral"> </span>
|
|
973
|
+
<span class="cline-any cline-neutral"> </span>
|
|
974
|
+
<span class="cline-any cline-neutral"> </span>
|
|
975
|
+
<span class="cline-any cline-neutral"> </span>
|
|
976
|
+
<span class="cline-any cline-neutral"> </span>
|
|
977
|
+
<span class="cline-any cline-neutral"> </span>
|
|
978
|
+
<span class="cline-any cline-neutral"> </span>
|
|
979
|
+
<span class="cline-any cline-neutral"> </span>
|
|
980
|
+
<span class="cline-any cline-yes">4x</span>
|
|
981
|
+
<span class="cline-any cline-neutral"> </span>
|
|
982
|
+
<span class="cline-any cline-neutral"> </span>
|
|
983
|
+
<span class="cline-any cline-neutral"> </span>
|
|
984
|
+
<span class="cline-any cline-neutral"> </span>
|
|
985
|
+
<span class="cline-any cline-neutral"> </span>
|
|
986
|
+
<span class="cline-any cline-neutral"> </span>
|
|
987
|
+
<span class="cline-any cline-yes">127x</span>
|
|
988
|
+
<span class="cline-any cline-yes">127x</span>
|
|
989
|
+
<span class="cline-any cline-neutral"> </span>
|
|
990
|
+
<span class="cline-any cline-yes">1124x</span>
|
|
991
|
+
<span class="cline-any cline-yes">126x</span>
|
|
992
|
+
<span class="cline-any cline-neutral"> </span>
|
|
993
|
+
<span class="cline-any cline-yes">126x</span>
|
|
994
|
+
<span class="cline-any cline-neutral"> </span>
|
|
995
|
+
<span class="cline-any cline-neutral"> </span>
|
|
996
|
+
<span class="cline-any cline-neutral"> </span>
|
|
997
|
+
<span class="cline-any cline-neutral"> </span>
|
|
998
|
+
<span class="cline-any cline-neutral"> </span>
|
|
999
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1000
|
+
<span class="cline-any cline-yes">780x</span>
|
|
1001
|
+
<span class="cline-any cline-yes">109x</span>
|
|
1002
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1003
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1004
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1005
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1006
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1007
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1008
|
+
<span class="cline-any cline-yes">228x</span>
|
|
1009
|
+
<span class="cline-any cline-yes">36x</span>
|
|
1010
|
+
<span class="cline-any cline-yes">36x</span>
|
|
1011
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1012
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1013
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1014
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1015
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1016
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1017
|
+
<span class="cline-any cline-yes">438x</span>
|
|
1018
|
+
<span class="cline-any cline-yes">58x</span>
|
|
1019
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1020
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1021
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1022
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1023
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1024
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1025
|
+
<span class="cline-any cline-yes">36x</span>
|
|
1026
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1027
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1028
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1029
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1030
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1031
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1032
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1033
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1034
|
+
<span class="cline-any cline-yes">360x</span>
|
|
1035
|
+
<span class="cline-any cline-yes">30x</span>
|
|
1036
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1037
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1038
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1039
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1040
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1041
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1042
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1043
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1044
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1045
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1046
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1047
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1048
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1049
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1050
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1051
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1052
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1053
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1054
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1055
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1056
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1057
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1058
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1059
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1060
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1061
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1062
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1063
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1064
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1065
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1066
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1067
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1068
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1069
|
+
<span class="cline-any cline-yes">40x</span>
|
|
1070
|
+
<span class="cline-any cline-yes">40x</span>
|
|
1071
|
+
<span class="cline-any cline-yes">40x</span>
|
|
1072
|
+
<span class="cline-any cline-yes">40x</span>
|
|
1073
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1074
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1075
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1076
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1077
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1078
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1079
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1080
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1081
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1082
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1083
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1084
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1085
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1086
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1087
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1088
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1089
|
+
<span class="cline-any cline-yes">54x</span>
|
|
1090
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1091
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1092
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1093
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1094
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1095
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1096
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1097
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1098
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1099
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1100
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1101
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1102
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1103
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1104
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1105
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1106
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1107
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1108
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1109
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1110
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1111
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1112
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1113
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1114
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1115
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1116
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1117
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1118
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1119
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1120
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1121
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1122
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1123
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1124
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1125
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1126
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1127
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1128
|
+
<span class="cline-any cline-yes">60x</span>
|
|
1129
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1130
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1131
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1132
|
+
<span class="cline-any cline-yes">54x</span>
|
|
1133
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1134
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1135
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1136
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1137
|
+
<span class="cline-any cline-yes">6x</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-neutral"> </span>
|
|
1141
|
+
<span class="cline-any cline-yes">54x</span>
|
|
1142
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1146
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1147
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1148
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1149
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1150
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1151
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1152
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1153
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1154
|
+
<span class="cline-any cline-no"> </span>
|
|
1155
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1156
|
+
<span class="cline-any cline-no"> </span>
|
|
1157
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1158
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1159
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1160
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1161
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1162
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1163
|
+
<span class="cline-any cline-no"> </span>
|
|
1164
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1165
|
+
<span class="cline-any cline-no"> </span>
|
|
1166
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1167
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1168
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1169
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1170
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1171
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1172
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1173
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1174
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1175
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1176
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1177
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1178
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1179
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1180
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1181
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1182
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1183
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1184
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1185
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1186
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1187
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1188
|
+
<span class="cline-any cline-yes">23x</span>
|
|
1189
|
+
<span class="cline-any cline-yes">23x</span>
|
|
1190
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1191
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1192
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1193
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1194
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1195
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1196
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1197
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1198
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1199
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1200
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1201
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1202
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1203
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1204
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1205
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1206
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/**
|
|
1207
|
+
* adjustmentEngine.js
|
|
1208
|
+
*
|
|
1209
|
+
* The core brain of the utility.
|
|
1210
|
+
*
|
|
1211
|
+
* Concepts
|
|
1212
|
+
* --------
|
|
1213
|
+
* 1. **HijriYear**: an ordered list of Hijri months, each with:
|
|
1214
|
+
* - a standard Gregorian start date (from authority / published calendar)
|
|
1215
|
+
* - the number of days in that month
|
|
1216
|
+
* Together they form a contiguous timeline for one Hijri year.
|
|
1217
|
+
*
|
|
1218
|
+
* 2. **Global offset**: a single integer applied to EVERY month's start date
|
|
1219
|
+
* uniformly. E.g. offset = -2 → every month starts 2 days earlier.
|
|
1220
|
+
* This is what a user sets at the beginning of the year based on their
|
|
1221
|
+
* local moon sighting.
|
|
1222
|
+
*
|
|
1223
|
+
* 3. **Event-based adjustment**: when a specific event (e.g. Eid al-Fitr)
|
|
1224
|
+
* is confirmed on a date that differs from (standard + global offset),
|
|
1225
|
+
* we compute a *local* correction that applies FROM that event's Hijri
|
|
1226
|
+
* day onward — without retroactively changing days the user already
|
|
1227
|
+
* observed (e.g. fasting days already completed).
|
|
1228
|
+
*
|
|
1229
|
+
* Edge-case handling
|
|
1230
|
+
* ------------------
|
|
1231
|
+
* • The user has already been fasting since their adjusted Ramadan start.
|
|
1232
|
+
* If Eid is moved by -1, we do NOT move Ramadan start — we shorten
|
|
1233
|
+
* Ramadan by 1 day (29 instead of 30) or extend it by 1 day, exactly
|
|
1234
|
+
* as real moon-sighting works.
|
|
1235
|
+
* • Adjustments propagate forward: months AFTER the event get shifted,
|
|
1236
|
+
* months BEFORE (and days already passed) stay fixed.
|
|
1237
|
+
* • Multiple adjustments can stack — each one is anchored to a specific
|
|
1238
|
+
* event and only affects that event's day onward.
|
|
1239
|
+
* • Year-boundary wrapping is handled (Dhul Hijjah → next Muharram).
|
|
1240
|
+
*/
|
|
1241
|
+
|
|
1242
|
+
'use strict';
|
|
1243
|
+
|
|
1244
|
+
const {
|
|
1245
|
+
ISLAMIC_MONTHS,
|
|
1246
|
+
SPECIAL_EVENTS,
|
|
1247
|
+
getMonth,
|
|
1248
|
+
getEvent,
|
|
1249
|
+
parseDate,
|
|
1250
|
+
formatDate,
|
|
1251
|
+
addDays,
|
|
1252
|
+
diffDays,
|
|
1253
|
+
} = require('./islamicCalendar');
|
|
1254
|
+
|
|
1255
|
+
// ──────────────────────────────────────────────
|
|
1256
|
+
// Islamic month length constraints
|
|
1257
|
+
// ──────────────────────────────────────────────
|
|
1258
|
+
const MIN_MONTH_DAYS = 29;
|
|
1259
|
+
const MAX_MONTH_DAYS = 30;
|
|
1260
|
+
|
|
1261
|
+
// ──────────────────────────────────────────────
|
|
1262
|
+
// HijriYear class
|
|
1263
|
+
// ──────────────────────────────────────────────
|
|
1264
|
+
|
|
1265
|
+
class HijriYear {
|
|
1266
|
+
/**
|
|
1267
|
+
* @param {number} year – Hijri year number (e.g. 1447)
|
|
1268
|
+
* @param {Object<number, string>} monthStarts
|
|
1269
|
+
* Map of hijriMonthIndex → "YYYY-MM-DD" Gregorian start date (standard)
|
|
1270
|
+
* You must supply at least month 1. Missing months are auto-computed
|
|
1271
|
+
* from the previous month's start + days.
|
|
1272
|
+
*/
|
|
1273
|
+
constructor(year, monthStarts) {
|
|
1274
|
+
this.year = year;
|
|
1275
|
+
this.globalOffset = 0;
|
|
1276
|
+
|
|
1277
|
+
// adjustments: array of { eventId, eventHijriMonth, eventHijriDay, offsetDelta }
|
|
1278
|
+
this.adjustments = [];
|
|
1279
|
+
|
|
1280
|
+
// Build internal month array
|
|
1281
|
+
this._months = ISLAMIC_MONTHS.map((m) => ({
|
|
1282
|
+
...m,
|
|
1283
|
+
standardStart: null, // Gregorian Date (before any offset)
|
|
1284
|
+
adjustedStart: null, // Gregorian Date (after offsets)
|
|
1285
|
+
adjustedDays: m.days, // may change when an event adjustment truncates/extends
|
|
1286
|
+
}));
|
|
1287
|
+
|
|
1288
|
+
// Populate standard starts from supplied data
|
|
1289
|
+
this._applyMonthStarts(monthStarts);
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1292
|
+
// ──── internal: populate standard starts ────
|
|
1293
|
+
|
|
1294
|
+
_applyMonthStarts(monthStarts) {
|
|
1295
|
+
// Set explicitly provided starts
|
|
1296
|
+
for (const [idx, dateStr] of Object.entries(monthStarts)) {
|
|
1297
|
+
const mi = Number(idx);
|
|
1298
|
+
const m = this._months.find((x) => x.index === mi);
|
|
1299
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (m) m.standardStart = parseDate(dateStr);
|
|
1300
|
+
}
|
|
1301
|
+
|
|
1302
|
+
// Fill gaps forward: if month N+1 has no start, derive from month N
|
|
1303
|
+
for (let i = 0; i < this._months.length - 1; i++) {
|
|
1304
|
+
const cur = this._months[i];
|
|
1305
|
+
const next = this._months[i + 1];
|
|
1306
|
+
if (cur.standardStart && !next.standardStart) {
|
|
1307
|
+
next.standardStart = addDays(cur.standardStart, cur.days);
|
|
1308
|
+
}
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
// Fill gaps backward (in case only later months were provided)
|
|
1312
|
+
for (let i = this._months.length - 1; i > 0; i--) {
|
|
1313
|
+
const cur = this._months[i];
|
|
1314
|
+
const prev = this._months[i - 1];
|
|
1315
|
+
if (cur.standardStart && !prev.standardStart) {
|
|
1316
|
+
prev.standardStart = addDays(cur.standardStart, -prev.days);
|
|
1317
|
+
}
|
|
1318
|
+
}
|
|
1319
|
+
|
|
1320
|
+
// Copy standard → adjusted (will be modified by offsets)
|
|
1321
|
+
this._recalculate();
|
|
1322
|
+
}
|
|
1323
|
+
|
|
1324
|
+
// ──── recalculate all adjusted dates ────
|
|
1325
|
+
|
|
1326
|
+
_recalculate() {
|
|
1327
|
+
// Step 1: apply global offset to every month independently, reset day counts
|
|
1328
|
+
for (const m of this._months) {
|
|
1329
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (m.standardStart) {
|
|
1330
|
+
m.adjustedStart = addDays(m.standardStart, this.globalOffset);
|
|
1331
|
+
}
|
|
1332
|
+
m.adjustedDays = m.days; // reset to standard
|
|
1333
|
+
}
|
|
1334
|
+
|
|
1335
|
+
// Step 2: apply event-based adjustments (in chronological order)
|
|
1336
|
+
// Each adjustment stores the absolute target Gregorian date for the event.
|
|
1337
|
+
// We compute the delta fresh against the current (global-offset-applied) position.
|
|
1338
|
+
const sorted = [...this.adjustments].sort((a, b) => {
|
|
1339
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (a.eventHijriMonth !== b.eventHijriMonth) return a.eventHijriMonth - b.eventHijriMonth;
|
|
1340
|
+
<span class="cstat-no" title="statement not covered" > return a.eventHijriDay - b.eventHijriDay;</span>
|
|
1341
|
+
});
|
|
1342
|
+
|
|
1343
|
+
for (const adj of sorted) {
|
|
1344
|
+
this._applyEventAdjustment(adj);
|
|
1345
|
+
}
|
|
1346
|
+
}
|
|
1347
|
+
|
|
1348
|
+
/**
|
|
1349
|
+
* Apply a single event adjustment.
|
|
1350
|
+
*
|
|
1351
|
+
* Each adjustment stores `targetDate` — the absolute Gregorian date the user
|
|
1352
|
+
* wants the event to land on. We compute the delta between the target and
|
|
1353
|
+
* the event's *current* adjusted position (which already includes the global
|
|
1354
|
+
* offset and any earlier adjustments).
|
|
1355
|
+
*
|
|
1356
|
+
* Rules:
|
|
1357
|
+
* - The month CONTAINING the event (or the previous month for day-1 events)
|
|
1358
|
+
* has its `adjustedDays` changed by the delta.
|
|
1359
|
+
* - All months AFTER that point are re-chained forward so the calendar
|
|
1360
|
+
* stays contiguous.
|
|
1361
|
+
* - Months BEFORE the event are UNTOUCHED.
|
|
1362
|
+
*/
|
|
1363
|
+
_applyEventAdjustment(adj) {
|
|
1364
|
+
const { eventHijriMonth, eventHijriDay, targetDate } = adj;
|
|
1365
|
+
|
|
1366
|
+
const eventMonthIdx = this._months.findIndex((m) => m.index === eventHijriMonth);
|
|
1367
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (eventMonthIdx === -1) <span class="cstat-no" title="statement not covered" >return;</span>
|
|
1368
|
+
|
|
1369
|
+
const eventMonth = this._months[eventMonthIdx];
|
|
1370
|
+
|
|
1371
|
+
// Where does this event currently sit (after global offset + earlier adj)?
|
|
1372
|
+
const currentEventDate = addDays(eventMonth.adjustedStart, eventHijriDay - 1);
|
|
1373
|
+
const offsetDelta = diffDays(targetDate, currentEventDate);
|
|
1374
|
+
if (offsetDelta === 0) return; // nothing to do
|
|
1375
|
+
|
|
1376
|
+
if (eventHijriDay === 1 && eventMonthIdx > 0) {
|
|
1377
|
+
// Day-1 events (e.g. Eid al-Fitr = 1 Shawwal):
|
|
1378
|
+
// adjust the PREVIOUS month's day count, then re-chain forward.
|
|
1379
|
+
const prevMonth = this._months[eventMonthIdx - 1];
|
|
1380
|
+
const newDays = prevMonth.adjustedDays + offsetDelta;
|
|
1381
|
+
HijriYear._validateMonthDays(prevMonth.name, newDays);
|
|
1382
|
+
prevMonth.adjustedDays = newDays;
|
|
1383
|
+
|
|
1384
|
+
// Re-chain from the event month onward
|
|
1385
|
+
eventMonth.adjustedStart = addDays(prevMonth.adjustedStart, prevMonth.adjustedDays);
|
|
1386
|
+
this._rechainFrom(eventMonthIdx + 1);
|
|
1387
|
+
} else if (eventHijriDay > 1) {
|
|
1388
|
+
// Mid-month events (e.g. Eid al-Adha = 10 Dhul Hijjah):
|
|
1389
|
+
// To move the event, we must move the month's start date.
|
|
1390
|
+
// The previous month absorbs the delta (its length changes)
|
|
1391
|
+
// so that the calendar remains contiguous.
|
|
1392
|
+
if (eventMonthIdx > 0) {
|
|
1393
|
+
const prevMonth = this._months[eventMonthIdx - 1];
|
|
1394
|
+
const newDays = prevMonth.adjustedDays + offsetDelta;
|
|
1395
|
+
HijriYear._validateMonthDays(prevMonth.name, newDays);
|
|
1396
|
+
prevMonth.adjustedDays = newDays;
|
|
1397
|
+
eventMonth.adjustedStart = addDays(prevMonth.adjustedStart, prevMonth.adjustedDays);
|
|
1398
|
+
} else {
|
|
1399
|
+
// First month in the year — shift the start directly
|
|
1400
|
+
eventMonth.adjustedStart = addDays(eventMonth.adjustedStart, offsetDelta);
|
|
1401
|
+
}
|
|
1402
|
+
this._rechainFrom(eventMonthIdx + 1);
|
|
1403
|
+
} else {
|
|
1404
|
+
// Day 1 of month 1 (no previous month) — shift start directly
|
|
1405
|
+
eventMonth.adjustedStart = addDays(eventMonth.adjustedStart, offsetDelta);
|
|
1406
|
+
this._rechainFrom(eventMonthIdx + 1);
|
|
1407
|
+
}
|
|
1408
|
+
}
|
|
1409
|
+
|
|
1410
|
+
/**
|
|
1411
|
+
* Re-chain month start dates from index `fromIdx` onward,
|
|
1412
|
+
* based on previous month's adjustedStart + adjustedDays.
|
|
1413
|
+
*/
|
|
1414
|
+
_rechainFrom(fromIdx) {
|
|
1415
|
+
for (let i = fromIdx; i < this._months.length; i++) {
|
|
1416
|
+
this._months[i].adjustedStart = addDays(
|
|
1417
|
+
this._months[i - 1].adjustedStart,
|
|
1418
|
+
this._months[i - 1].adjustedDays
|
|
1419
|
+
);
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1422
|
+
|
|
1423
|
+
/**
|
|
1424
|
+
* Validate that a month's day count is within Islamic calendar bounds (29–30).
|
|
1425
|
+
* @throws {Error} if days < 29 or days > 30
|
|
1426
|
+
*/
|
|
1427
|
+
static _validateMonthDays(monthName, days) {
|
|
1428
|
+
if (days < MIN_MONTH_DAYS || days > MAX_MONTH_DAYS) {
|
|
1429
|
+
throw new Error(
|
|
1430
|
+
`Invalid adjustment: ${monthName} would have ${days} days, ` +
|
|
1431
|
+
`but Islamic months must be ${MIN_MONTH_DAYS}–${MAX_MONTH_DAYS} days.`
|
|
1432
|
+
);
|
|
1433
|
+
}
|
|
1434
|
+
}
|
|
1435
|
+
|
|
1436
|
+
// ══════════════════════════════════════════════
|
|
1437
|
+
// PUBLIC API
|
|
1438
|
+
// ══════════════════════════════════════════════
|
|
1439
|
+
|
|
1440
|
+
/**
|
|
1441
|
+
* Set the global offset (days). Positive = later, negative = earlier.
|
|
1442
|
+
* This replaces any previous global offset.
|
|
1443
|
+
*/
|
|
1444
|
+
setGlobalOffset(offset) {
|
|
1445
|
+
if (!Number.isInteger(offset)) throw new Error('Offset must be an integer');
|
|
1446
|
+
if (Math.abs(offset) > 15) throw new Error('Offset magnitude > 15 days is unreasonable');
|
|
1447
|
+
this.globalOffset = offset;
|
|
1448
|
+
this._recalculate();
|
|
1449
|
+
return this;
|
|
1450
|
+
}
|
|
1451
|
+
|
|
1452
|
+
/**
|
|
1453
|
+
* Apply an event-based adjustment.
|
|
1454
|
+
*
|
|
1455
|
+
* @param {string} eventId – one of the SPECIAL_EVENTS ids
|
|
1456
|
+
* @param {string} actualGregorianDate – "YYYY-MM-DD" the user says the event really falls on
|
|
1457
|
+
* @returns {{ adjustment, message }}
|
|
1458
|
+
*/
|
|
1459
|
+
adjustEvent(eventId, actualGregorianDate) {
|
|
1460
|
+
const event = getEvent(eventId);
|
|
1461
|
+
if (!event) throw new Error(`Unknown event: "${eventId}"`);
|
|
1462
|
+
|
|
1463
|
+
const currentDate = this.getEventDate(eventId);
|
|
1464
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!currentDate) <span class="cstat-no" title="statement not covered" >throw new Error(`Cannot compute current date for event "${eventId}"`);</span>
|
|
1465
|
+
|
|
1466
|
+
const targetDate = parseDate(actualGregorianDate);
|
|
1467
|
+
const offsetDelta = diffDays(targetDate, currentDate);
|
|
1468
|
+
|
|
1469
|
+
if (offsetDelta === 0) {
|
|
1470
|
+
return {
|
|
1471
|
+
adjustment: null,
|
|
1472
|
+
message: `${event.name} is already on ${formatDate(currentDate)}. No adjustment needed.`,
|
|
1473
|
+
};
|
|
1474
|
+
}
|
|
1475
|
+
|
|
1476
|
+
// Store the adjustment as an absolute target date so that
|
|
1477
|
+
// _recalculate() can always recompute deltas from scratch.
|
|
1478
|
+
const adj = {
|
|
1479
|
+
eventId,
|
|
1480
|
+
eventHijriMonth: event.hijriMonth,
|
|
1481
|
+
eventHijriDay: event.hijriDay,
|
|
1482
|
+
targetDate, // absolute Date object
|
|
1483
|
+
offsetDelta, // for display purposes only
|
|
1484
|
+
};
|
|
1485
|
+
|
|
1486
|
+
// Save previous state so we can roll back on validation failure
|
|
1487
|
+
const prevAdjustments = [...this.adjustments];
|
|
1488
|
+
|
|
1489
|
+
// Remove any previous adjustment for same event
|
|
1490
|
+
this.adjustments = this.adjustments.filter((a) => a.eventId !== eventId);
|
|
1491
|
+
this.adjustments.push(adj);
|
|
1492
|
+
|
|
1493
|
+
try {
|
|
1494
|
+
this._recalculate();
|
|
1495
|
+
} catch (err) {
|
|
1496
|
+
// Roll back to previous state
|
|
1497
|
+
this.adjustments = prevAdjustments;
|
|
1498
|
+
this._recalculate();
|
|
1499
|
+
throw err;
|
|
1500
|
+
}
|
|
1501
|
+
|
|
1502
|
+
return {
|
|
1503
|
+
adjustment: adj,
|
|
1504
|
+
message: this._buildAdjustmentSummary(event, currentDate, targetDate, offsetDelta),
|
|
1505
|
+
};
|
|
1506
|
+
}
|
|
1507
|
+
|
|
1508
|
+
/**
|
|
1509
|
+
* Get the list of valid offsets a user can choose for an event.
|
|
1510
|
+
* Typically ±3 days from the current adjusted date (real-world moon sighting variance).
|
|
1511
|
+
*/
|
|
1512
|
+
getValidOffsets(eventId, range = 3) {
|
|
1513
|
+
const event = getEvent(eventId);
|
|
1514
|
+
if (!event) throw new Error(`Unknown event: "${eventId}"`);
|
|
1515
|
+
|
|
1516
|
+
const currentDate = this.getEventDate(eventId);
|
|
1517
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!currentDate) <span class="cstat-no" title="statement not covered" >return [];</span>
|
|
1518
|
+
|
|
1519
|
+
// Determine which month absorbs the length change
|
|
1520
|
+
const eventMonthIdx = this._months.findIndex((m) => m.index === event.hijriMonth);
|
|
1521
|
+
let affectedMonth = null;
|
|
1522
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (eventMonthIdx > 0) {
|
|
1523
|
+
affectedMonth = this._months[eventMonthIdx - 1];
|
|
1524
|
+
}
|
|
1525
|
+
|
|
1526
|
+
const offsets = [];
|
|
1527
|
+
for (let d = -range; d <= range; d++) {
|
|
1528
|
+
const date = addDays(currentDate, d);
|
|
1529
|
+
|
|
1530
|
+
// Check if this offset would produce a valid month length
|
|
1531
|
+
let valid = true;
|
|
1532
|
+
if (affectedMonth && d !== 0) {
|
|
1533
|
+
const newDays = affectedMonth.adjustedDays + d;
|
|
1534
|
+
if (newDays < MIN_MONTH_DAYS || newDays > MAX_MONTH_DAYS) {
|
|
1535
|
+
valid = false;
|
|
1536
|
+
}
|
|
1537
|
+
}
|
|
1538
|
+
|
|
1539
|
+
offsets.push({
|
|
1540
|
+
offset: d,
|
|
1541
|
+
date: formatDate(date),
|
|
1542
|
+
valid,
|
|
1543
|
+
label: d === 0
|
|
1544
|
+
? '(current)'
|
|
1545
|
+
: d > 0
|
|
1546
|
+
? `(+${d} day${d > 1 ? 's' : ''})`
|
|
1547
|
+
: `(${d} day${d < -1 ? 's' : ''})`,
|
|
1548
|
+
});
|
|
1549
|
+
}
|
|
1550
|
+
return offsets;
|
|
1551
|
+
}
|
|
1552
|
+
|
|
1553
|
+
/**
|
|
1554
|
+
* Get the Gregorian date for a specific event, after all adjustments.
|
|
1555
|
+
*/
|
|
1556
|
+
getEventDate(eventId) {
|
|
1557
|
+
const event = getEvent(eventId);
|
|
1558
|
+
if (!event) return null;
|
|
1559
|
+
|
|
1560
|
+
const month = this._months.find((m) => m.index === event.hijriMonth);
|
|
1561
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!month || !month.adjustedStart) <span class="cstat-no" title="statement not covered" >return null;</span>
|
|
1562
|
+
|
|
1563
|
+
return addDays(month.adjustedStart, event.hijriDay - 1);
|
|
1564
|
+
}
|
|
1565
|
+
|
|
1566
|
+
/**
|
|
1567
|
+
* Get the adjusted start date of a Hijri month (by index 1-12).
|
|
1568
|
+
*/
|
|
1569
|
+
getMonthStart(hijriMonthIndex) {
|
|
1570
|
+
const m = this._months.find((x) => x.index === hijriMonthIndex);
|
|
1571
|
+
return m ? m.adjustedStart : null;
|
|
1572
|
+
}
|
|
1573
|
+
|
|
1574
|
+
/**
|
|
1575
|
+
* Get the adjusted end date of a Hijri month (last day).
|
|
1576
|
+
*/
|
|
1577
|
+
getMonthEnd(hijriMonthIndex) {
|
|
1578
|
+
const m = this._months.find((x) => x.index === hijriMonthIndex);
|
|
1579
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!m || !m.adjustedStart) <span class="cstat-no" title="statement not covered" >return null;</span>
|
|
1580
|
+
return addDays(m.adjustedStart, m.adjustedDays - 1);
|
|
1581
|
+
}
|
|
1582
|
+
|
|
1583
|
+
/**
|
|
1584
|
+
* Get the adjusted number of days in a Hijri month.
|
|
1585
|
+
*/
|
|
1586
|
+
getMonthDays(hijriMonthIndex) {
|
|
1587
|
+
const m = this._months.find((x) => x.index === hijriMonthIndex);
|
|
1588
|
+
return m ? m.adjustedDays : null;
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1591
|
+
/**
|
|
1592
|
+
* Return a full calendar view of the Hijri year.
|
|
1593
|
+
*/
|
|
1594
|
+
getCalendar() {
|
|
1595
|
+
return this._months.map((m) => ({
|
|
1596
|
+
index: m.index,
|
|
1597
|
+
name: m.name,
|
|
1598
|
+
standardStart: m.standardStart ? formatDate(m.standardStart) : <span class="branch-1 cbranch-no" title="branch not covered" >null,</span>
|
|
1599
|
+
adjustedStart: m.adjustedStart ? formatDate(m.adjustedStart) : <span class="branch-1 cbranch-no" title="branch not covered" >null,</span>
|
|
1600
|
+
standardDays: m.days,
|
|
1601
|
+
adjustedDays: m.adjustedDays,
|
|
1602
|
+
adjustedEnd: m.adjustedStart ? formatDate(addDays(m.adjustedStart, m.adjustedDays - 1)) : <span class="branch-1 cbranch-no" title="branch not covered" >null,</span>
|
|
1603
|
+
events: SPECIAL_EVENTS
|
|
1604
|
+
.filter((e) => e.hijriMonth === m.index)
|
|
1605
|
+
.map((e) => ({
|
|
1606
|
+
...e,
|
|
1607
|
+
adjustedDate: m.adjustedStart
|
|
1608
|
+
? formatDate(addDays(m.adjustedStart, e.hijriDay - 1))
|
|
1609
|
+
: <span class="branch-1 cbranch-no" title="branch not covered" >null,</span>
|
|
1610
|
+
})),
|
|
1611
|
+
}));
|
|
1612
|
+
}
|
|
1613
|
+
|
|
1614
|
+
/**
|
|
1615
|
+
* Find which Hijri month a Gregorian date falls in.
|
|
1616
|
+
*/
|
|
1617
|
+
getHijriMonthForDate(gregorianDateStr) {
|
|
1618
|
+
const target = parseDate(gregorianDateStr);
|
|
1619
|
+
for (let i = this._months.length - 1; i >= 0; i--) {
|
|
1620
|
+
const m = this._months[i];
|
|
1621
|
+
if (m.adjustedStart && target >= m.adjustedStart) {
|
|
1622
|
+
const dayInMonth = diffDays(target, m.adjustedStart) + 1;
|
|
1623
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (dayInMonth <= m.adjustedDays) {
|
|
1624
|
+
return { month: m.name, monthIndex: m.index, day: dayInMonth };
|
|
1625
|
+
}
|
|
1626
|
+
}
|
|
1627
|
+
}
|
|
1628
|
+
return null;
|
|
1629
|
+
}
|
|
1630
|
+
|
|
1631
|
+
/**
|
|
1632
|
+
* Get upcoming events within the next N days from a reference date.
|
|
1633
|
+
*/
|
|
1634
|
+
getUpcomingEvents(referenceDateStr, withinDays = <span class="branch-0 cbranch-no" title="branch not covered" >7)</span> {
|
|
1635
|
+
const refDate = parseDate(referenceDateStr);
|
|
1636
|
+
const results = [];
|
|
1637
|
+
|
|
1638
|
+
for (const event of SPECIAL_EVENTS) {
|
|
1639
|
+
const eventDate = this.getEventDate(event.id);
|
|
1640
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!eventDate) <span class="cstat-no" title="statement not covered" >continue;</span>
|
|
1641
|
+
const daysUntil = diffDays(eventDate, refDate);
|
|
1642
|
+
if (daysUntil >= 0 && daysUntil <= withinDays) {
|
|
1643
|
+
results.push({
|
|
1644
|
+
...event,
|
|
1645
|
+
adjustedDate: formatDate(eventDate),
|
|
1646
|
+
daysUntil,
|
|
1647
|
+
});
|
|
1648
|
+
}
|
|
1649
|
+
}
|
|
1650
|
+
|
|
1651
|
+
return results.sort((a, b) => a.daysUntil - b.daysUntil);
|
|
1652
|
+
}
|
|
1653
|
+
|
|
1654
|
+
/**
|
|
1655
|
+
* Get the days the user has already observed in a given month
|
|
1656
|
+
* (from adjusted start up to and including the reference date).
|
|
1657
|
+
*/
|
|
1658
|
+
getDaysObserved(hijriMonthIndex, referenceDateStr) {
|
|
1659
|
+
const m = this._months.find((x) => x.index === hijriMonthIndex);
|
|
1660
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!m || !m.adjustedStart) <span class="cstat-no" title="statement not covered" >return 0;</span>
|
|
1661
|
+
const ref = parseDate(referenceDateStr);
|
|
1662
|
+
const diff = diffDays(ref, m.adjustedStart);
|
|
1663
|
+
if (diff < 0) return 0;
|
|
1664
|
+
return Math.min(diff + 1, m.adjustedDays);
|
|
1665
|
+
}
|
|
1666
|
+
|
|
1667
|
+
/**
|
|
1668
|
+
* Simulate what would happen if an event adjustment is applied,
|
|
1669
|
+
* WITHOUT actually changing state. Returns impact analysis.
|
|
1670
|
+
*/
|
|
1671
|
+
simulateEventAdjustment(eventId, actualGregorianDate) {
|
|
1672
|
+
const event = getEvent(eventId);
|
|
1673
|
+
if (!event) throw new Error(`Unknown event: "${eventId}"`);
|
|
1674
|
+
|
|
1675
|
+
const currentDate = this.getEventDate(eventId);
|
|
1676
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!currentDate) <span class="cstat-no" title="statement not covered" >throw new Error(`Cannot compute date for event "${eventId}"`);</span>
|
|
1677
|
+
|
|
1678
|
+
const targetDate = parseDate(actualGregorianDate);
|
|
1679
|
+
const offsetDelta = diffDays(targetDate, currentDate);
|
|
1680
|
+
|
|
1681
|
+
// Build impact report
|
|
1682
|
+
const impact = {
|
|
1683
|
+
event: event.name,
|
|
1684
|
+
currentDate: formatDate(currentDate),
|
|
1685
|
+
proposedDate: actualGregorianDate,
|
|
1686
|
+
offsetDelta,
|
|
1687
|
+
affectedMonths: [],
|
|
1688
|
+
preservedMonths: [],
|
|
1689
|
+
monthLengthChanges: [],
|
|
1690
|
+
};
|
|
1691
|
+
|
|
1692
|
+
if (offsetDelta === 0) {
|
|
1693
|
+
impact.noChange = true;
|
|
1694
|
+
return impact;
|
|
1695
|
+
}
|
|
1696
|
+
|
|
1697
|
+
// Which month is the event in?
|
|
1698
|
+
const eventMonthIdx = this._months.findIndex((m) => m.index === event.hijriMonth);
|
|
1699
|
+
|
|
1700
|
+
// Months before are preserved
|
|
1701
|
+
for (let i = 0; i < eventMonthIdx; i++) {
|
|
1702
|
+
impact.preservedMonths.push(this._months[i].name);
|
|
1703
|
+
}
|
|
1704
|
+
|
|
1705
|
+
// The previous month absorbs the length change for both day-1 and mid-month events
|
|
1706
|
+
// (except for day 1 of month 1 which has no previous month).
|
|
1707
|
+
if (eventMonthIdx > 0) {
|
|
1708
|
+
const prevMonth = this._months[eventMonthIdx - 1];
|
|
1709
|
+
const newDays = prevMonth.adjustedDays + offsetDelta;
|
|
1710
|
+
// Remove the previous month from preserved list if it was added
|
|
1711
|
+
impact.preservedMonths = impact.preservedMonths.filter((n) => n !== prevMonth.name);
|
|
1712
|
+
|
|
1713
|
+
const isValid = newDays >= MIN_MONTH_DAYS && newDays <= MAX_MONTH_DAYS;
|
|
1714
|
+
impact.monthLengthChanges.push({
|
|
1715
|
+
month: prevMonth.name,
|
|
1716
|
+
originalDays: prevMonth.adjustedDays,
|
|
1717
|
+
newDays,
|
|
1718
|
+
valid: isValid,
|
|
1719
|
+
reason: isValid
|
|
1720
|
+
? `${event.name} moved by ${offsetDelta} day(s)`
|
|
1721
|
+
: `${event.name} moved by ${offsetDelta} day(s) — INVALID: ${newDays} days is outside ${MIN_MONTH_DAYS}–${MAX_MONTH_DAYS} range`,
|
|
1722
|
+
});
|
|
1723
|
+
impact.valid = isValid;
|
|
1724
|
+
} else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (event.hijriDay > 1) {</span>
|
|
1725
|
+
// First month, mid-month event: month start shifts, no length change
|
|
1726
|
+
<span class="cstat-no" title="statement not covered" > impact.monthLengthChanges.push({</span>
|
|
1727
|
+
month: this._months[0].name,
|
|
1728
|
+
originalDays: this._months[0].adjustedDays,
|
|
1729
|
+
newDays: this._months[0].adjustedDays,
|
|
1730
|
+
valid: true,
|
|
1731
|
+
reason: `${event.name} moved by ${offsetDelta} day(s) — month start shifts`,
|
|
1732
|
+
});
|
|
1733
|
+
<span class="cstat-no" title="statement not covered" > impact.valid = true;</span>
|
|
1734
|
+
} else {
|
|
1735
|
+
<span class="cstat-no" title="statement not covered" > impact.valid = true;</span>
|
|
1736
|
+
}
|
|
1737
|
+
|
|
1738
|
+
// Months after are shifted
|
|
1739
|
+
for (let i = eventMonthIdx + 1; i < this._months.length; i++) {
|
|
1740
|
+
impact.affectedMonths.push(this._months[i].name);
|
|
1741
|
+
}
|
|
1742
|
+
|
|
1743
|
+
return impact;
|
|
1744
|
+
}
|
|
1745
|
+
|
|
1746
|
+
// ──── internal helpers ────
|
|
1747
|
+
|
|
1748
|
+
_buildAdjustmentSummary(event, oldDate, newDate, delta) {
|
|
1749
|
+
const direction = delta > 0 ? 'later' : 'earlier';
|
|
1750
|
+
const absDelta = Math.abs(delta);
|
|
1751
|
+
const lines = [
|
|
1752
|
+
`✅ ${event.name} adjusted: ${formatDate(oldDate)} → ${formatDate(newDate)} (${absDelta} day${absDelta !== 1 ? <span class="branch-0 cbranch-no" title="branch not covered" >'s' </span>: ''} ${direction})`,
|
|
1753
|
+
];
|
|
1754
|
+
|
|
1755
|
+
// Explain month-length impact
|
|
1756
|
+
const prevMonth = getMonth(event.hijriMonth - 1);
|
|
1757
|
+
if (prevMonth) {
|
|
1758
|
+
const newLen = prevMonth.days + delta;
|
|
1759
|
+
if (event.hijriDay === 1) {
|
|
1760
|
+
lines.push(
|
|
1761
|
+
` 📅 ${prevMonth.name} is now ${newLen} days (was ${prevMonth.days}) to preserve your already-observed days.`
|
|
1762
|
+
);
|
|
1763
|
+
} else {
|
|
1764
|
+
lines.push(
|
|
1765
|
+
` 📅 ${prevMonth.name} absorbs the shift: ${newLen} days (was ${prevMonth.days}).`
|
|
1766
|
+
);
|
|
1767
|
+
}
|
|
1768
|
+
}
|
|
1769
|
+
|
|
1770
|
+
lines.push(` 📆 All months after ${getMonth(event.hijriMonth)?.name || <span class="branch-1 cbranch-no" title="branch not covered" >'this month'}</span> are shifted accordingly.`);
|
|
1771
|
+
return lines.join('\n');
|
|
1772
|
+
}
|
|
1773
|
+
}
|
|
1774
|
+
|
|
1775
|
+
module.exports = { HijriYear };
|
|
1776
|
+
</pre></td></tr></table></pre>
|
|
1777
|
+
|
|
1778
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
1779
|
+
</div><!-- /wrapper -->
|
|
1780
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
1781
|
+
Code coverage generated by
|
|
1782
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1783
|
+
at 2026-03-18T14:14:39.359Z
|
|
1784
|
+
</div>
|
|
1785
|
+
<script src="prettify.js"></script>
|
|
1786
|
+
<script>
|
|
1787
|
+
window.onload = function () {
|
|
1788
|
+
prettyPrint();
|
|
1789
|
+
};
|
|
1790
|
+
</script>
|
|
1791
|
+
<script src="sorter.js"></script>
|
|
1792
|
+
<script src="block-navigation.js"></script>
|
|
1793
|
+
</body>
|
|
1794
|
+
</html>
|
|
1795
|
+
|