@acorex/core 7.1.52 → 7.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/README.md +3 -20
  2. package/config/README.md +3 -0
  3. package/config/index.d.ts +2 -5
  4. package/config/lib/configs.service.d.ts +5 -0
  5. package/dateTime/README.md +3 -0
  6. package/dateTime/index.d.ts +5 -5
  7. package/dateTime/{src → lib}/jalali.calendar.d.ts +1 -1
  8. package/esm2022/acorex-core.mjs +2 -2
  9. package/esm2022/config/acorex-core-config.mjs +2 -2
  10. package/esm2022/config/index.mjs +3 -0
  11. package/esm2022/config/lib/configs.mjs +24 -0
  12. package/esm2022/config/lib/configs.service.mjs +11 -0
  13. package/esm2022/dateTime/acorex-core-dateTime.mjs +2 -2
  14. package/esm2022/dateTime/index.mjs +6 -0
  15. package/esm2022/dateTime/lib/datetime.class.mjs +288 -0
  16. package/esm2022/dateTime/lib/datetime.module.mjs +39 -0
  17. package/esm2022/dateTime/lib/datetime.pipe.mjs +26 -0
  18. package/esm2022/dateTime/lib/georgian.calendar.mjs +189 -0
  19. package/esm2022/dateTime/lib/jalali.calendar.mjs +355 -0
  20. package/esm2022/events/acorex-core-events.mjs +2 -2
  21. package/esm2022/events/index.mjs +2 -0
  22. package/esm2022/events/lib/event.service.mjs +36 -0
  23. package/esm2022/file/acorex-core-file.mjs +2 -2
  24. package/esm2022/file/index.mjs +5 -0
  25. package/esm2022/file/lib/file-download-ref.class.mjs +12 -0
  26. package/esm2022/file/lib/file-download-result.class.mjs +46 -0
  27. package/esm2022/file/lib/file-upload-ref.class.mjs +12 -0
  28. package/esm2022/file/lib/file.service.mjs +102 -0
  29. package/esm2022/http/acorex-core-http.mjs +2 -2
  30. package/esm2022/http/index.mjs +7 -0
  31. package/esm2022/http/lib/http-error.class.mjs +2 -0
  32. package/esm2022/http/lib/http-events.interceptor.mjs +3 -0
  33. package/esm2022/http/lib/http-request.class.mjs +2 -0
  34. package/esm2022/http/lib/http-result.class.mjs +21 -0
  35. package/esm2022/http/lib/http.module.mjs +29 -0
  36. package/esm2022/http/lib/http.service.mjs +148 -0
  37. package/esm2022/image/acorex-core-image.mjs +2 -2
  38. package/esm2022/image/index.mjs +2 -0
  39. package/esm2022/image/lib/image.service.mjs +43 -0
  40. package/esm2022/index.mjs +2 -0
  41. package/esm2022/pipes/acorex-core-pipes.mjs +2 -2
  42. package/esm2022/pipes/index.mjs +3 -0
  43. package/esm2022/pipes/lib/pipes.module.mjs +19 -0
  44. package/esm2022/pipes/lib/safe.pipe.mjs +31 -0
  45. package/esm2022/platform/acorex-core-platform.mjs +2 -2
  46. package/esm2022/platform/index.mjs +2 -0
  47. package/esm2022/platform/lib/platform.service.mjs +155 -0
  48. package/esm2022/translation/acorex-core-translation.mjs +2 -2
  49. package/esm2022/translation/index.mjs +4 -0
  50. package/esm2022/translation/lib/translation.module.mjs +18 -0
  51. package/esm2022/translation/lib/translator.mjs +43 -0
  52. package/esm2022/translation/lib/translator.pipe.mjs +15 -0
  53. package/esm2022/utils/acorex-core-utils.mjs +2 -2
  54. package/esm2022/utils/index.mjs +6 -0
  55. package/esm2022/utils/lib/color-util.mjs +115 -0
  56. package/esm2022/utils/lib/drawing-util.mjs +29 -0
  57. package/esm2022/utils/lib/html-util.mjs +16 -0
  58. package/esm2022/utils/lib/object-util.mjs +39 -0
  59. package/esm2022/utils/lib/string-util.mjs +19 -0
  60. package/events/README.md +3 -0
  61. package/events/index.d.ts +1 -5
  62. package/fesm2022/acorex-core-config.mjs +14 -3
  63. package/fesm2022/acorex-core-config.mjs.map +1 -1
  64. package/fesm2022/acorex-core-dateTime.mjs +171 -178
  65. package/fesm2022/acorex-core-dateTime.mjs.map +1 -1
  66. package/fesm2022/acorex-core-events.mjs +6 -4
  67. package/fesm2022/acorex-core-events.mjs.map +1 -1
  68. package/fesm2022/acorex-core-file.mjs +19 -23
  69. package/fesm2022/acorex-core-file.mjs.map +1 -1
  70. package/fesm2022/acorex-core-http.mjs +10 -17
  71. package/fesm2022/acorex-core-http.mjs.map +1 -1
  72. package/fesm2022/acorex-core-image.mjs +3 -3
  73. package/fesm2022/acorex-core-image.mjs.map +1 -1
  74. package/fesm2022/acorex-core-pipes.mjs +8 -9
  75. package/fesm2022/acorex-core-pipes.mjs.map +1 -1
  76. package/fesm2022/acorex-core-platform.mjs +6 -8
  77. package/fesm2022/acorex-core-platform.mjs.map +1 -1
  78. package/fesm2022/acorex-core-translation.mjs +13 -13
  79. package/fesm2022/acorex-core-translation.mjs.map +1 -1
  80. package/fesm2022/acorex-core-utils.mjs +87 -87
  81. package/fesm2022/acorex-core-utils.mjs.map +1 -1
  82. package/fesm2022/acorex-core.mjs +1 -6
  83. package/fesm2022/acorex-core.mjs.map +1 -1
  84. package/file/README.md +3 -0
  85. package/file/index.d.ts +4 -5
  86. package/http/README.md +3 -0
  87. package/http/index.d.ts +6 -5
  88. package/image/README.md +3 -0
  89. package/image/index.d.ts +1 -5
  90. package/index.d.ts +2 -5
  91. package/package.json +13 -11
  92. package/pipes/README.md +3 -0
  93. package/pipes/index.d.ts +2 -5
  94. package/platform/README.md +3 -0
  95. package/platform/index.d.ts +1 -5
  96. package/translation/README.md +3 -0
  97. package/translation/index.d.ts +3 -5
  98. package/utils/README.md +3 -0
  99. package/utils/index.d.ts +5 -5
  100. package/config/public-api.d.ts +0 -1
  101. package/dateTime/public-api.d.ts +0 -5
  102. package/esm2022/config/public-api.mjs +0 -2
  103. package/esm2022/config/src/configs.mjs +0 -25
  104. package/esm2022/dateTime/public-api.mjs +0 -6
  105. package/esm2022/dateTime/src/datetime.class.mjs +0 -295
  106. package/esm2022/dateTime/src/datetime.module.mjs +0 -40
  107. package/esm2022/dateTime/src/datetime.pipe.mjs +0 -27
  108. package/esm2022/dateTime/src/georgian.calendar.mjs +0 -187
  109. package/esm2022/dateTime/src/jalali.calendar.mjs +0 -357
  110. package/esm2022/events/public-api.mjs +0 -2
  111. package/esm2022/events/src/event.service.mjs +0 -35
  112. package/esm2022/file/public-api.mjs +0 -5
  113. package/esm2022/file/src/file-download-ref.class.mjs +0 -13
  114. package/esm2022/file/src/file-download-result.class.mjs +0 -47
  115. package/esm2022/file/src/file-upload-ref.class.mjs +0 -13
  116. package/esm2022/file/src/file.service.mjs +0 -103
  117. package/esm2022/http/public-api.mjs +0 -6
  118. package/esm2022/http/src/http-error.class.mjs +0 -2
  119. package/esm2022/http/src/http-events.interceptor.mjs +0 -3
  120. package/esm2022/http/src/http-request.class.mjs +0 -2
  121. package/esm2022/http/src/http-result.class.mjs +0 -25
  122. package/esm2022/http/src/http.module.mjs +0 -30
  123. package/esm2022/http/src/http.service.mjs +0 -152
  124. package/esm2022/image/public-api.mjs +0 -2
  125. package/esm2022/image/src/image.service.mjs +0 -44
  126. package/esm2022/pipes/public-api.mjs +0 -3
  127. package/esm2022/pipes/src/pipes.module.mjs +0 -20
  128. package/esm2022/pipes/src/safe.pipe.mjs +0 -32
  129. package/esm2022/platform/public-api.mjs +0 -2
  130. package/esm2022/platform/src/platform.service.mjs +0 -158
  131. package/esm2022/public-api.mjs +0 -5
  132. package/esm2022/translation/public-api.mjs +0 -4
  133. package/esm2022/translation/src/translation.module.mjs +0 -19
  134. package/esm2022/translation/src/translator.mjs +0 -44
  135. package/esm2022/translation/src/translator.pipe.mjs +0 -16
  136. package/esm2022/utils/public-api.mjs +0 -6
  137. package/esm2022/utils/src/color-util.mjs +0 -115
  138. package/esm2022/utils/src/drawing-util.mjs +0 -29
  139. package/esm2022/utils/src/html-util.mjs +0 -16
  140. package/esm2022/utils/src/object-util.mjs +0 -39
  141. package/esm2022/utils/src/string-util.mjs +0 -19
  142. package/events/public-api.d.ts +0 -1
  143. package/file/public-api.d.ts +0 -4
  144. package/http/public-api.d.ts +0 -5
  145. package/image/public-api.d.ts +0 -1
  146. package/pipes/public-api.d.ts +0 -2
  147. package/platform/public-api.d.ts +0 -1
  148. package/public-api.d.ts +0 -1
  149. package/translation/public-api.d.ts +0 -3
  150. package/utils/public-api.d.ts +0 -5
  151. /package/config/{src → lib}/configs.d.ts +0 -0
  152. /package/dateTime/{src → lib}/datetime.class.d.ts +0 -0
  153. /package/dateTime/{src → lib}/datetime.module.d.ts +0 -0
  154. /package/dateTime/{src → lib}/datetime.pipe.d.ts +0 -0
  155. /package/dateTime/{src → lib}/georgian.calendar.d.ts +0 -0
  156. /package/events/{src → lib}/event.service.d.ts +0 -0
  157. /package/file/{src → lib}/file-download-ref.class.d.ts +0 -0
  158. /package/file/{src → lib}/file-download-result.class.d.ts +0 -0
  159. /package/file/{src → lib}/file-upload-ref.class.d.ts +0 -0
  160. /package/file/{src → lib}/file.service.d.ts +0 -0
  161. /package/http/{src → lib}/http-error.class.d.ts +0 -0
  162. /package/http/{src → lib}/http-events.interceptor.d.ts +0 -0
  163. /package/http/{src → lib}/http-request.class.d.ts +0 -0
  164. /package/http/{src → lib}/http-result.class.d.ts +0 -0
  165. /package/http/{src → lib}/http.module.d.ts +0 -0
  166. /package/http/{src → lib}/http.service.d.ts +0 -0
  167. /package/image/{src → lib}/image.service.d.ts +0 -0
  168. /package/pipes/{src → lib}/pipes.module.d.ts +0 -0
  169. /package/pipes/{src → lib}/safe.pipe.d.ts +0 -0
  170. /package/platform/{src → lib}/platform.service.d.ts +0 -0
  171. /package/translation/{src → lib}/translation.module.d.ts +0 -0
  172. /package/translation/{src → lib}/translator.d.ts +0 -0
  173. /package/translation/{src → lib}/translator.pipe.d.ts +0 -0
  174. /package/utils/{src → lib}/color-util.d.ts +0 -0
  175. /package/utils/{src → lib}/drawing-util.d.ts +0 -0
  176. /package/utils/{src → lib}/html-util.d.ts +0 -0
  177. /package/utils/{src → lib}/object-util.d.ts +0 -0
  178. /package/utils/{src → lib}/string-util.d.ts +0 -0
@@ -1,187 +0,0 @@
1
- import { AXDateTime } from "./datetime.class";
2
- export class GeorgianCalendar {
3
- monthNames = [
4
- "January", "February", "March",
5
- "April", "May", "June", "July",
6
- "August", "September", "October",
7
- "November", "December"
8
- ];
9
- monthShortNames = [
10
- "Jan", "Feb", "Mar",
11
- "Apr", "May", "Jun", "Jul",
12
- "Aug", "Sep", "Oct",
13
- "Nov", "Dec"
14
- ];
15
- dayNames = [
16
- "Sunday", "Monday", "Tuesday", "Wednesday",
17
- "Thursday", "Friday", "Saturday"
18
- ];
19
- dayShortNames = [
20
- "Sun", "Mon", "Tue", "Wed",
21
- "Thu", "Fri", "Sat"
22
- ];
23
- create(value) {
24
- return new AXDateTime(new Date(value.year, value.month - 1, value.date, value.hours || 0, value.minutes || 0, value.seconds || 0, value.ms || 0), this.name());
25
- }
26
- name() {
27
- return 'gregorian';
28
- }
29
- dayOfMonth(date) {
30
- return date.getDate();
31
- }
32
- dayOfYear(date) {
33
- let result = 0;
34
- let m = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
35
- if (this.isLeap(date)) {
36
- m[1] = 29;
37
- }
38
- for (let i = 0; i < date.getMonth(); i++) {
39
- result = result + m[i];
40
- }
41
- result += date.getDate();
42
- return result;
43
- }
44
- dayOfWeek(date) {
45
- return date.getDay() + 1;
46
- }
47
- weekOfYear(date) {
48
- const firstDay = new AXDateTime(date).startOf('year');
49
- return Math.ceil((((date.getTime() - firstDay.date.getTime()) / 86400000) + firstDay.date.getDay() + 1) / 7);
50
- }
51
- year(date) {
52
- return date.getFullYear();
53
- }
54
- monthOfYear(date) {
55
- return date.getMonth() + 1;
56
- }
57
- add(date, unit, amount) {
58
- let value = date.valueOf();
59
- switch (unit) {
60
- case 'second':
61
- value += 1000 * amount;
62
- break;
63
- case 'minute':
64
- value += 60000 * amount;
65
- break;
66
- case 'hour':
67
- value += 3600000 * amount;
68
- break;
69
- case 'month':
70
- const v = new Date(value);
71
- var mo = date.getMonth();
72
- var yr = date.getFullYear();
73
- mo = (mo + amount) % 12;
74
- if (0 > mo) {
75
- yr += (date.getMonth() + amount - mo - 12) / 12;
76
- mo += 12;
77
- }
78
- else
79
- yr += ((date.getMonth() + amount - mo) / 12);
80
- v.setMonth(mo);
81
- v.setFullYear(yr);
82
- value = v.valueOf();
83
- break;
84
- case 'week':
85
- value += 7 * 86400000 * amount;
86
- break;
87
- case 'year':
88
- const yv = new Date(value);
89
- yv.setFullYear(yv.getFullYear() + amount);
90
- value = yv.valueOf();
91
- break;
92
- case 'day':
93
- default:
94
- value += 86400000 * amount;
95
- }
96
- return new AXDateTime(new Date(value), this.name());
97
- }
98
- set(date, unit, value) {
99
- const clone = new Date(date.valueOf());
100
- switch (unit) {
101
- case 'second':
102
- clone.setHours(clone.getHours(), clone.getMinutes(), value, clone.getMilliseconds());
103
- break;
104
- case 'minute':
105
- clone.setHours(clone.getHours(), value, clone.getSeconds(), clone.getMilliseconds());
106
- break;
107
- case 'hour':
108
- clone.setHours(value, clone.getMinutes(), clone.getSeconds(), clone.getMilliseconds());
109
- break;
110
- default:
111
- case 'day':
112
- clone.setDate(value);
113
- break;
114
- case "week":
115
- break;
116
- case "month":
117
- clone.setMonth(Math.max(0, value - 1));
118
- break;
119
- case "year":
120
- clone.setFullYear(value);
121
- break;
122
- }
123
- return new AXDateTime(clone, this.name());
124
- }
125
- startOf(date, unit) {
126
- const clone = new Date(date.valueOf());
127
- switch (unit) {
128
- case 'second':
129
- clone.setHours(clone.getHours(), clone.getMinutes(), clone.getSeconds(), 0);
130
- return new AXDateTime(clone, this.name());
131
- case 'minute':
132
- clone.setHours(clone.getHours(), clone.getMinutes(), 0, 0);
133
- return new AXDateTime(clone, this.name());
134
- case 'hour':
135
- clone.setHours(clone.getHours(), 0, 0, 0);
136
- return new AXDateTime(clone, this.name());
137
- default:
138
- case 'day':
139
- clone.setHours(0, 0, 0, 0);
140
- return new AXDateTime(clone, this.name());
141
- case "week":
142
- const index = 0;
143
- const start = index >= 0 ? index : 0;
144
- const day = clone.getDay();
145
- const diff = clone.getDate() - day + (start > day ? start - 7 : start);
146
- clone.setDate(diff);
147
- return new AXDateTime(clone, this.name()).startOf('day');
148
- case "month":
149
- clone.setDate(1);
150
- return new AXDateTime(clone, this.name()).startOf('day');
151
- case "year":
152
- clone.setMonth(0);
153
- clone.setDate(1);
154
- return new AXDateTime(clone, this.name()).startOf('day');
155
- }
156
- }
157
- endOf(date, unit) {
158
- const clone = new Date(date.valueOf());
159
- switch (unit) {
160
- case 'second':
161
- clone.setHours(clone.getHours(), clone.getMinutes(), clone.getSeconds(), 999);
162
- return new AXDateTime(clone, this.name());
163
- case 'minute':
164
- clone.setHours(clone.getHours(), clone.getMinutes(), 59, 999);
165
- return new AXDateTime(clone, this.name());
166
- case 'hour':
167
- clone.setHours(clone.getHours(), 59, 59, 999);
168
- return new AXDateTime(clone, this.name());
169
- default:
170
- case 'day':
171
- clone.setHours(23, 59, 59, 999);
172
- return new AXDateTime(clone, this.name());
173
- case 'week':
174
- return this.startOf(date, 'week').add('day', 6).endOf('day');
175
- case 'month':
176
- return new AXDateTime(new Date(date.getFullYear(), date.getMonth() + 1, 0), this.name()).endOf('day');
177
- case "year":
178
- clone.setMonth(11);
179
- return new AXDateTime(clone, this.name()).endOf('month');
180
- }
181
- }
182
- isLeap(date) {
183
- let leapYear = new Date(date.getFullYear(), 1, 29);
184
- return leapYear.getDate() == 29;
185
- }
186
- }
187
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvcmdpYW4uY2FsZW5kYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hY29yZXgvY29yZS9kYXRlVGltZS9zcmMvZ2VvcmdpYW4uY2FsZW5kYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFVBQVUsRUFBeUIsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRixNQUFNLE9BQU8sZ0JBQWdCO0lBRXpCLFVBQVUsR0FBRztRQUNULFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTztRQUM5QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNO1FBQzlCLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUztRQUNoQyxVQUFVLEVBQUUsVUFBVTtLQUN6QixDQUFDO0lBRUYsZUFBZSxHQUFHO1FBQ2QsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLO1FBQ25CLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUs7UUFDMUIsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLO1FBQ25CLEtBQUssRUFBRSxLQUFLO0tBQ2YsQ0FBQztJQUVGLFFBQVEsR0FBRztRQUNQLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVc7UUFDMUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVO0tBQ25DLENBQUM7SUFFRixhQUFhLEdBQUc7UUFDWixLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLO1FBQzFCLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSztLQUN0QixDQUFDO0lBR0YsTUFBTSxDQUFDLEtBQWtCO1FBQ3JCLE9BQU8sSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxP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QU07Z0JBQ1AsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbkIsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2hFO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFVO1FBQ2IsSUFBSSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuRCxPQUFPLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDcEMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhDYWxlbmRhciwgQVhEYXRlVGltZSwgQVhEYXRlVmFsdWUsIFRpbWVVbml0IH0gZnJvbSBcIi4vZGF0ZXRpbWUuY2xhc3NcIjtcblxuZXhwb3J0IGNsYXNzIEdlb3JnaWFuQ2FsZW5kYXIgaW1wbGVtZW50cyBBWENhbGVuZGFyIHtcblxuICAgIG1vbnRoTmFtZXMgPSBbXG4gICAgICAgIFwiSmFudWFyeVwiLCBcIkZlYnJ1YXJ5XCIsIFwiTWFyY2hcIixcbiAgICAgICAgXCJBcHJpbFwiLCBcIk1heVwiLCBcIkp1bmVcIiwgXCJKdWx5XCIsXG4gICAgICAgIFwiQXVndXN0XCIsIFwiU2VwdGVtYmVyXCIsIFwiT2N0b2JlclwiLFxuICAgICAgICBcIk5vdmVtYmVyXCIsIFwiRGVjZW1iZXJcIlxuICAgIF07XG5cbiAgICBtb250aFNob3J0TmFtZXMgPSBbXG4gICAgICAgIFwiSmFuXCIsIFwiRmViXCIsIFwiTWFyXCIsXG4gICAgICAgIFwiQXByXCIsIFwiTWF5XCIsIFwiSnVuXCIsIFwiSnVsXCIsXG4gICAgICAgIFwiQXVnXCIsIFwiU2VwXCIsIFwiT2N0XCIsXG4gICAgICAgIFwiTm92XCIsIFwiRGVjXCJcbiAgICBdO1xuXG4gICAgZGF5TmFtZXMgPSBbXG4gICAgICAgIFwiU3VuZGF5XCIsIFwiTW9uZGF5XCIsIFwiVHVlc2RheVwiLCBcIldlZG5lc2RheVwiLFxuICAgICAgICBcIlRodXJzZGF5XCIsIFwiRnJpZGF5XCIsIFwiU2F0dXJkYXlcIlxuICAgIF07XG5cbiAgICBkYXlTaG9ydE5hbWVzID0gW1xuICAgICAgICBcIlN1blwiLCBcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLFxuICAgICAgICBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiXG4gICAgXTtcblxuXG4gICAgY3JlYXRlKHZhbHVlOiBBWERhdGVWYWx1ZSk6IEFYRGF0ZVRpbWUge1xuICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUobmV3IERhdGUodmFsdWUueWVhciwgdmFsdWUubW9udGggLSAxLCB2YWx1ZS5kYXRlLCB2YWx1ZS5ob3VycyB8fCAwLCB2YWx1ZS5taW51dGVzIHx8IDAsIHZhbHVlLnNlY29uZHMgfHwgMCwgdmFsdWUubXMgfHwgMCksIHRoaXMubmFtZSgpKTtcbiAgICB9XG5cbiAgICBuYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnZ3JlZ29yaWFuJ1xuICAgIH1cblxuICAgIGRheU9mTW9udGgoZGF0ZTogRGF0ZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBkYXRlLmdldERhdGUoKTtcbiAgICB9XG5cbiAgICBkYXlPZlllYXIoZGF0ZTogRGF0ZSk6IG51bWJlciB7XG4gICAgICAgIGxldCByZXN1bHQgPSAwO1xuICAgICAgICBsZXQgbSA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcbiAgICAgICAgaWYgKHRoaXMuaXNMZWFwKGRhdGUpKSB7XG4gICAgICAgICAgICBtWzFdID0gMjk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRlLmdldE1vbnRoKCk7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbVtpXTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgKz0gZGF0ZS5nZXREYXRlKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZGF5T2ZXZWVrKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gZGF0ZS5nZXREYXkoKSArIDE7XG4gICAgfVxuXG4gICAgd2Vla09mWWVhcihkYXRlOiBEYXRlKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgZmlyc3REYXkgPSBuZXcgQVhEYXRlVGltZShkYXRlKS5zdGFydE9mKCd5ZWFyJyk7XG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwoKCgoZGF0ZS5nZXRUaW1lKCkgLSBmaXJzdERheS5kYXRlLmdldFRpbWUoKSkgLyA4NjQwMDAwMCkgKyBmaXJzdERheS5kYXRlLmdldERheSgpICsgMSkgLyA3KTtcbiAgICB9XG5cbiAgICB5ZWFyKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIH1cblxuICAgIG1vbnRoT2ZZZWFyKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gZGF0ZS5nZXRNb250aCgpICsgMTtcbiAgICB9XG5cbiAgICBhZGQoZGF0ZTogRGF0ZSwgdW5pdDogVGltZVVuaXQsIGFtb3VudDogbnVtYmVyKTogQVhEYXRlVGltZSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGRhdGUudmFsdWVPZigpO1xuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gMTAwMCAqIGFtb3VudDtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSA2MDAwMCAqIGFtb3VudDtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gMzYwMDAwMCAqIGFtb3VudDtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFyIG1vID0gZGF0ZS5nZXRNb250aCgpO1xuICAgICAgICAgICAgICAgIHZhciB5ciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgICAgICBtbyA9IChtbyArIGFtb3VudCkgJSAxMjtcbiAgICAgICAgICAgICAgICBpZiAoMCA+IG1vKSB7XG4gICAgICAgICAgICAgICAgICAgIHlyICs9IChkYXRlLmdldE1vbnRoKCkgKyBhbW91bnQgLSBtbyAtIDEyKSAvIDEyO1xuICAgICAgICAgICAgICAgICAgICBtbyArPSAxMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB5ciArPSAoKGRhdGUuZ2V0TW9udGgoKSArIGFtb3VudCAtIG1vKSAvIDEyKTtcbiAgICAgICAgICAgICAgICB2LnNldE1vbnRoKG1vKTtcbiAgICAgICAgICAgICAgICB2LnNldEZ1bGxZZWFyKHlyKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHYudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSA3ICogODY0MDAwMDAgKiBhbW91bnQ7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgICAgIGNvbnN0IHl2ID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICAgICAgICAgIHl2LnNldEZ1bGxZZWFyKHl2LmdldEZ1bGxZZWFyKCkgKyBhbW91bnQpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0geXYudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSA4NjQwMDAwMCAqIGFtb3VudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUobmV3IERhdGUodmFsdWUpLCB0aGlzLm5hbWUoKSk7XG4gICAgfVxuXG4gICAgc2V0KGRhdGU6IERhdGUsIHVuaXQ6IFRpbWVVbml0LCB2YWx1ZTogbnVtYmVyKTogQVhEYXRlVGltZSB7XG4gICAgICAgIGNvbnN0IGNsb25lID0gbmV3IERhdGUoZGF0ZS52YWx1ZU9mKCkpO1xuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgY2xvbmUuZ2V0TWludXRlcygpLCB2YWx1ZSwgY2xvbmUuZ2V0TWlsbGlzZWNvbmRzKCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCB2YWx1ZSwgY2xvbmUuZ2V0U2Vjb25kcygpLCBjbG9uZS5nZXRNaWxsaXNlY29uZHMoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3Vycyh2YWx1ZSwgY2xvbmUuZ2V0TWludXRlcygpLCBjbG9uZS5nZXRTZWNvbmRzKCksIGNsb25lLmdldE1pbGxpc2Vjb25kcygpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgICAgIGNsb25lLnNldERhdGUodmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIndlZWtcIjpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtb250aFwiOlxuICAgICAgICAgICAgICAgIGNsb25lLnNldE1vbnRoKE1hdGgubWF4KDAsIHZhbHVlIC0gMSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInllYXJcIjpcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRGdWxsWWVhcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XG4gICAgfVxuXG4gICAgc3RhcnRPZihkYXRlOiBEYXRlLCB1bml0OiBUaW1lVW5pdCk6IEFYRGF0ZVRpbWUge1xuICAgICAgICBjb25zdCBjbG9uZSA9IG5ldyBEYXRlKGRhdGUudmFsdWVPZigpKTtcbiAgICAgICAgc3dpdGNoICh1bml0KSB7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIGNsb25lLmdldE1pbnV0ZXMoKSwgY2xvbmUuZ2V0U2Vjb25kcygpLCAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKTtcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgY2xvbmUuZ2V0TWludXRlcygpLCAwLCAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKTtcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIDAsIDAsIDApO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XG4gICAgICAgICAgICBjYXNlIFwid2Vla1wiOlxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGluZGV4ID49IDAgPyBpbmRleCA6IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF5ID0gY2xvbmUuZ2V0RGF5KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IGNsb25lLmdldERhdGUoKSAtIGRheSArIChzdGFydCA+IGRheSA/IHN0YXJ0IC0gNyA6IHN0YXJ0KTtcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXREYXRlKGRpZmYpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpLnN0YXJ0T2YoJ2RheScpO1xuICAgICAgICAgICAgY2FzZSBcIm1vbnRoXCI6XG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0RGF0ZSgxKVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpLnN0YXJ0T2YoJ2RheScpO1xuICAgICAgICAgICAgY2FzZSBcInllYXJcIjpcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRNb250aCgwKTtcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXREYXRlKDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpLnN0YXJ0T2YoJ2RheScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW5kT2YoZGF0ZTogRGF0ZSwgdW5pdDogVGltZVVuaXQpOiBBWERhdGVUaW1lIHtcbiAgICAgICAgY29uc3QgY2xvbmUgPSBuZXcgRGF0ZShkYXRlLnZhbHVlT2YoKSk7XG4gICAgICAgIHN3aXRjaCAodW5pdCkge1xuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCBjbG9uZS5nZXRNaW51dGVzKCksIGNsb25lLmdldFNlY29uZHMoKSwgOTk5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKTtcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgY2xvbmUuZ2V0TWludXRlcygpLCA1OSwgOTk5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKTtcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIDU5LCA1OSwgOTk5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydE9mKGRhdGUsICd3ZWVrJykuYWRkKCdkYXknLCA2KS5lbmRPZignZGF5Jyk7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpICsgMSwgMCksIHRoaXMubmFtZSgpKS5lbmRPZignZGF5Jyk7XG4gICAgICAgICAgICBjYXNlIFwieWVhclwiOlxuICAgICAgICAgICAgICAgIGNsb25lLnNldE1vbnRoKDExKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKS5lbmRPZignbW9udGgnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzTGVhcChkYXRlOiBEYXRlKSB7XG4gICAgICAgIGxldCBsZWFwWWVhciA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgMSwgMjkpO1xuICAgICAgICByZXR1cm4gbGVhcFllYXIuZ2V0RGF0ZSgpID09IDI5O1xuICAgIH1cbn0iXX0=
@@ -1,357 +0,0 @@
1
- import { AXDateTime } from "./datetime.class";
2
- export class JalaliCalendar {
3
- monthNames = ("فروردین_اردیبهشت_خرداد_تیر_مرداد_شهریور_مهر_آبان_آذر_دی_بهمن_اسفند").split("_");
4
- monthShortNames = ("فروردین_اردیبهشت_خرداد_تیر_مرداد_شهریور_مهر_آبان_آذر_دی_بهمن_اسفند").split("_");
5
- dayNames = ("شنبه_یکشنبه_دوشنبه_سه شنبه_چهارشنبه_پنج شنبه_جمعه").split("_");
6
- dayShortNames = "ش_ی_د_س_چ_پ_ج".split("_");
7
- create(value) {
8
- const a = this.toGregorian(value.year, value.month, value.date);
9
- return new AXDateTime(new Date(a.getFullYear(), a.getMonth(), a.getDate(), value.hours || 0, value.minutes || 0, value.seconds || 0, value.ms || 0), this.name());
10
- }
11
- name() {
12
- return 'jalali';
13
- }
14
- dayOfMonth(date) {
15
- return this.toJalali(date).day;
16
- }
17
- dayOfYear(date) {
18
- const j = this.toJalali(date);
19
- return (j.month <= 6 ? ((j.month - 1) * 31) : ((6 * 31) + (j.month - 7) * 30)) + j.day;
20
- }
21
- dayOfWeek(date) {
22
- return date.getDay() == 6 ? 1 : date.getDay() + 2;
23
- }
24
- weekOfYear(date) {
25
- //TODO : apply jalali
26
- const firstDay = new AXDateTime(date).startOf('year');
27
- return Math.ceil((((date.getTime() - firstDay.date.getTime()) / 86400000) + firstDay.date.getDay() + 1) / 7);
28
- }
29
- year(date) {
30
- return this.toJalali(date).year;
31
- }
32
- monthOfYear(date) {
33
- return this.toJalali(date).month;
34
- }
35
- add(date, unit, amount) {
36
- let value = date.valueOf();
37
- switch (unit) {
38
- case 'second':
39
- value += 1000 * amount;
40
- break;
41
- case 'minute':
42
- value += 60000 * amount;
43
- break;
44
- case 'hour':
45
- value += 3600000 * amount;
46
- break;
47
- case 'month':
48
- {
49
- const v = new Date(value);
50
- let jd = this.dayOfMonth(date);
51
- let jm = this.monthOfYear(date);
52
- let jy = this.year(date);
53
- const nm = (jm + amount);
54
- const ny = (nm % 12) ? Math.floor(nm / 12) : 0;
55
- jy += ny;
56
- jm = nm - (ny * 12);
57
- const vv = this.toGregorian(jy, jm, jd);
58
- v.setFullYear(vv.getFullYear());
59
- v.setMonth(vv.getMonth());
60
- v.setDate(vv.getDate());
61
- value = v.valueOf();
62
- break;
63
- }
64
- case 'week':
65
- value += 7 * 86400000 * amount;
66
- break;
67
- case 'year':
68
- {
69
- // const v = new Date(value);
70
- // v.setFullYear(v.getFullYear() + amount);
71
- // value = v.valueOf();
72
- // break
73
- const v = new Date(value);
74
- let jd = this.dayOfMonth(date);
75
- let jm = this.monthOfYear(date);
76
- let jy = this.year(date);
77
- const vv = this.toGregorian(jy + amount, jm, jd);
78
- v.setFullYear(vv.getFullYear());
79
- v.setMonth(vv.getMonth());
80
- v.setDate(vv.getDate());
81
- value = v.valueOf();
82
- break;
83
- }
84
- case 'day':
85
- default:
86
- value += 86400000 * amount;
87
- }
88
- return new AXDateTime(new Date(value), this.name());
89
- }
90
- set(date, unit, value) {
91
- const clone = new Date(date.valueOf());
92
- const jDate = this.toJalali(clone);
93
- switch (unit) {
94
- case 'second':
95
- clone.setHours(clone.getHours(), clone.getMinutes(), value, clone.getMilliseconds());
96
- break;
97
- case 'minute':
98
- clone.setHours(clone.getHours(), value, clone.getSeconds(), clone.getMilliseconds());
99
- break;
100
- case 'hour':
101
- clone.setHours(value, clone.getMinutes(), clone.getSeconds(), clone.getMilliseconds());
102
- break;
103
- default:
104
- case 'day':
105
- const gDate = this.toGregorian(jDate.year, jDate.month, value);
106
- clone.setDate(gDate.getDate());
107
- break;
108
- case "week":
109
- break;
110
- case "month":
111
- const gDate2 = this.toGregorian(jDate.year, value, jDate.day);
112
- clone.setMonth(gDate2.getMonth());
113
- break;
114
- case "year":
115
- const gDate3 = this.toGregorian(value, jDate.month, jDate.day);
116
- clone.setFullYear(gDate3.getFullYear());
117
- break;
118
- }
119
- return new AXDateTime(clone, this.name());
120
- }
121
- startOf(date, unit) {
122
- const clone = new Date(date.valueOf());
123
- switch (unit) {
124
- case 'second':
125
- clone.setHours(clone.getHours(), clone.getMinutes(), clone.getSeconds(), 0);
126
- return new AXDateTime(clone, this.name());
127
- case 'minute':
128
- clone.setHours(clone.getHours(), clone.getMinutes(), 0, 0);
129
- return new AXDateTime(clone, this.name());
130
- case 'hour':
131
- clone.setHours(clone.getHours(), 0, 0, 0);
132
- return new AXDateTime(clone, this.name());
133
- default:
134
- case 'day':
135
- clone.setHours(0, 0, 0, 0);
136
- return new AXDateTime(clone, this.name());
137
- case "week":
138
- return new AXDateTime(clone, this.name()).add('day', -this.dayOfWeek(clone) + 1).startOf('day');
139
- case "month":
140
- {
141
- const jy = this.year(date);
142
- const jm = this.monthOfYear(date);
143
- const gDate = this.toGregorian(jy, jm, 1);
144
- return new AXDateTime(gDate, this.name()).startOf('day');
145
- }
146
- case "year":
147
- {
148
- const jy = this.year(date);
149
- const gDate = this.toGregorian(jy, 1, 1);
150
- return new AXDateTime(gDate, this.name()).startOf('day');
151
- }
152
- }
153
- }
154
- endOf(date, unit) {
155
- const clone = new Date(date.valueOf());
156
- switch (unit) {
157
- case 'second':
158
- clone.setHours(clone.getHours(), clone.getMinutes(), clone.getSeconds(), 999);
159
- return new AXDateTime(clone, this.name());
160
- case 'minute':
161
- clone.setHours(clone.getHours(), clone.getMinutes(), 59, 999);
162
- return new AXDateTime(clone, this.name());
163
- case 'hour':
164
- clone.setHours(clone.getHours(), 59, 59, 999);
165
- return new AXDateTime(clone, this.name());
166
- default:
167
- case 'day':
168
- clone.setHours(23, 59, 59, 999);
169
- return new AXDateTime(clone, this.name());
170
- case 'week':
171
- {
172
- return this.startOf(date, 'week').add('day', 6).endOf('day');
173
- }
174
- case 'month':
175
- {
176
- const jy = this.year(date);
177
- const jm = this.monthOfYear(date);
178
- const jd = this.monthLength(jy, jm);
179
- const gDate = this.toGregorian(jy, jm, jd);
180
- return new AXDateTime(gDate, this.name()).endOf('day');
181
- }
182
- case "year":
183
- let jy = this.year(date);
184
- const gDate = this.toGregorian(jy, 12, this.monthLength(jy, 12));
185
- return new AXDateTime(gDate, this.name()).endOf('day');
186
- }
187
- }
188
- toJalali(date) {
189
- const gy = date.getFullYear();
190
- const gm = date.getMonth() + 1;
191
- const gd = date.getDate();
192
- const r = this.d2j(this.g2d(gy, gm, gd));
193
- return {
194
- year: r.jy,
195
- month: r.jm,
196
- day: r.jd,
197
- };
198
- }
199
- /*
200
- Converts a Jalaali date to Gregorian.
201
- */
202
- toGregorian(jy, jm, jd) {
203
- const g = this.d2g(this.j2d(jy, jm, jd));
204
- return new Date(g.gy, g.gm - 1, g.gd);
205
- }
206
- /*
207
- Checks whether a Jalaali date is valid or not.
208
- */
209
- isValid(jy, jm, jd) {
210
- return jy >= -61 && jy <= 3177 &&
211
- jm >= 1 && jm <= 12 &&
212
- jd >= 1 && jd <= this.monthLength(jy, jm);
213
- }
214
- /*
215
- Is this a leap year or not?
216
- */
217
- isLeapYear(jy) {
218
- return this.jalCal(jy).leap === 0;
219
- }
220
- /*
221
- Number of days in a given month in a Jalaali year.
222
- */
223
- monthLength(jy, jm) {
224
- if (jm <= 6)
225
- return 31;
226
- if (jm <= 11)
227
- return 30;
228
- if (this.isLeapYear(jy))
229
- return 30;
230
- return 29;
231
- }
232
- jalCal(jy) {
233
- // Jalaali years starting the 33-year rule.
234
- let breaks = [-61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210,
235
- 1635, 2060, 2097, 2192, 2262, 2324, 2394, 2456, 3178
236
- ], bl = breaks.length, gy = jy + 621, leapJ = -14, jp = breaks[0], jm, jump, leap, leapG, march, n, i;
237
- if (jy < jp || jy >= breaks[bl - 1])
238
- throw new Error('Invalid Jalaali year ' + jy);
239
- // Find the limiting years for the Jalaali year jy.
240
- for (i = 1; i < bl; i += 1) {
241
- jm = breaks[i];
242
- jump = jm - jp;
243
- if (jy < jm)
244
- break;
245
- leapJ = leapJ + this.div(jump, 33) * 8 + this.div(this.mod(jump, 33), 4);
246
- jp = jm;
247
- }
248
- n = jy - jp;
249
- // Find the number of leap years from AD 621 to the beginning
250
- // of the current Jalaali year in the Persian calendar.
251
- leapJ = leapJ + this.div(n, 33) * 8 + this.div(this.mod(n, 33) + 3, 4);
252
- if (this.mod(jump, 33) === 4 && jump - n === 4)
253
- leapJ += 1;
254
- // And the same in the Gregorian calendar (until the year gy).
255
- leapG = this.div(gy, 4) - this.div((this.div(gy, 100) + 1) * 3, 4) - 150;
256
- // Determine the Gregorian date of Farvardin the 1st.
257
- march = 20 + leapJ - leapG;
258
- // Find how many years have passed since the last leap year.
259
- if (jump - n < 6)
260
- n = n - jump + this.div(jump + 4, 33) * 33;
261
- leap = this.mod(this.mod(n + 1, 33) - 1, 4);
262
- if (leap === -1) {
263
- leap = 4;
264
- }
265
- return {
266
- leap: leap,
267
- gy: gy,
268
- march: march
269
- };
270
- }
271
- /*
272
- Converts a date of the Jalaali calendar to the Julian Day number.
273
- @param jy Jalaali year (1 to 3100)
274
- @param jm Jalaali month (1 to 12)
275
- @param jd Jalaali day (1 to 29/31)
276
- @return Julian Day number
277
- */
278
- j2d(jy, jm, jd) {
279
- let r = this.jalCal(jy);
280
- return this.g2d(r.gy, 3, r.march) + (jm - 1) * 31 - this.div(jm, 7) * (jm - 7) + jd - 1;
281
- }
282
- /*
283
- Converts the Julian Day number to a date in the Jalaali calendar.
284
- @param jdn Julian Day number
285
- @return
286
- jy: Jalaali year (1 to 3100)
287
- jm: Jalaali month (1 to 12)
288
- jd: Jalaali day (1 to 29/31)
289
- */
290
- d2j(jdn) {
291
- let gy = this.d2g(jdn).gy // Calculate Gregorian year (gy).
292
- , jy = gy - 621, r = this.jalCal(jy), jdn1f = this.g2d(gy, 3, r.march), jd, jm, k;
293
- // Find number of days that passed since 1 Farvardin.
294
- k = jdn - jdn1f;
295
- if (k >= 0) {
296
- if (k <= 185) {
297
- // The first 6 months.
298
- jm = 1 + this.div(k, 31);
299
- jd = this.mod(k, 31) + 1;
300
- return {
301
- jy: jy,
302
- jm: jm,
303
- jd: jd
304
- };
305
- }
306
- else {
307
- // The remaining months.
308
- k -= 186;
309
- }
310
- }
311
- else {
312
- // Previous Jalaali year.
313
- jy -= 1;
314
- k += 179;
315
- if (r.leap === 1)
316
- k += 1;
317
- }
318
- jm = 7 + this.div(k, 30);
319
- jd = this.mod(k, 30) + 1;
320
- return {
321
- jy: jy,
322
- jm: jm,
323
- jd: jd
324
- };
325
- }
326
- g2d(gy, gm, gd) {
327
- let d = this.div((gy + this.div(gm - 8, 6) + 100100) * 1461, 4)
328
- + this.div(153 * this.mod(gm + 9, 12) + 2, 5)
329
- + gd - 34840408;
330
- d = d - this.div(this.div(gy + 100100 + this.div(gm - 8, 6), 100) * 3, 4) + 752;
331
- return d;
332
- }
333
- d2g(jdn) {
334
- let j, i, gd, gm, gy;
335
- j = 4 * jdn + 139361631;
336
- j = j + this.div(this.div(4 * jdn + 183187720, 146097) * 3, 4) * 4 - 3908;
337
- i = this.div(this.mod(j, 1461), 4) * 5 + 308;
338
- gd = this.div(this.mod(i, 153), 5) + 1;
339
- gm = this.mod(this.div(i, 153), 12) + 1;
340
- gy = this.div(j, 1461) - 100100 + this.div(8 - gm, 6);
341
- return {
342
- gy: gy,
343
- gm: gm,
344
- gd: gd
345
- };
346
- }
347
- /*
348
- Utility helper functions.
349
- */
350
- div(a, b) {
351
- return ~~(a / b);
352
- }
353
- mod(a, b) {
354
- return a - ~~(a / b) * b;
355
- }
356
- }
357
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamFsYWxpLmNhbGVuZGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWNvcmV4L2NvcmUvZGF0ZVRpbWUvc3JjL2phbGFsaS5jYWxlbmRhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsVUFBVSxFQUF5QixNQUFNLGtCQUFrQixDQUFDO0FBRWpGLE1BQU0sT0FBTyxjQUFjO0lBRXZCLFVBQVUsR0FBRyxDQUFDLG9FQUFvRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRS9GLGVBQWUsR0FBRyxDQUFDLG9FQUFvRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRXBHLFFBQVEsR0FBRyxDQUFDLG1EQUFtRCxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTVFLGFBQWEsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRzNDLE1BQU0sQ0FBQyxLQUFrQjtRQUNyQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEUsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3RLLENBQUM7SUFFRCxJQUFJO1FBQ0EsT0FBTyxR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QUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUE7UUFDL0UsT0FBTyxDQUFDLENBQUE7SUFDWixDQUFDO0lBR08sR0FBRyxDQUFDLEdBQUc7UUFDWCxJQUFJLENBQUMsRUFDQyxDQUFDLEVBQ0QsRUFBRSxFQUNGLEVBQUUsRUFDRixFQUFFLENBQUE7UUFDUixDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUE7UUFDdkIsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxTQUFTLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUE7UUFDekUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQTtRQUM1QyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDdEMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3ZDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3JELE9BQU87WUFDSCxFQUFFLEVBQUUsRUFBRTtZQUNKLEVBQUUsRUFBRSxFQUFFO1lBQ04sRUFBRSxFQUFFLEVBQUU7U0FDWCxDQUFBO0lBQ0wsQ0FBQztJQUVEOztNQUVFO0lBQ00sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1osT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDcEIsQ0FBQztJQUVPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDNUIsQ0FBQztDQUVKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhDYWxlbmRhciwgQVhEYXRlVGltZSwgQVhEYXRlVmFsdWUsIFRpbWVVbml0IH0gZnJvbSBcIi4vZGF0ZXRpbWUuY2xhc3NcIjtcblxuZXhwb3J0IGNsYXNzIEphbGFsaUNhbGVuZGFyIGltcGxlbWVudHMgQVhDYWxlbmRhciB7XG5cbiAgICBtb250aE5hbWVzID0gKFwi2YHYsdmI2LHYr9uM2YZf2KfYsdiv24zYqNmH2LTYql/Yrtix2K/Yp9ivX9iq24zYsV/Zhdix2K/Yp9ivX9i02YfYsduM2YjYsV/ZhdmH2LFf2KLYqNin2YZf2KLYsNixX9iv24xf2KjZh9mF2YZf2KfYs9mB2YbYr1wiKS5zcGxpdChcIl9cIik7XG5cbiAgICBtb250aFNob3J0TmFtZXMgPSAoXCLZgdix2YjYsdiv24zZhl/Yp9ix2K/bjNio2YfYtNiqX9iu2LHYr9in2K9f2KrbjNixX9mF2LHYr9in2K9f2LTZh9ix24zZiNixX9mF2YfYsV/Yotio2KfZhl/Yotiw2LFf2K/bjF/YqNmH2YXZhl/Yp9iz2YHZhtivXCIpLnNwbGl0KFwiX1wiKTtcblxuICAgIGRheU5hbWVzID0gKFwi2LTZhtio2Ydf24zaqdi02YbYqNmHX9iv2YjYtNmG2KjZh1/Ys9mHINi02YbYqNmHX9qG2YfYp9ix2LTZhtio2Ydf2b7ZhtisINi02YbYqNmHX9is2YXYudmHXCIpLnNwbGl0KFwiX1wiKTtcblxuICAgIGRheVNob3J0TmFtZXMgPSBcIti0X9uMX9ivX9izX9qGX9m+X9isXCIuc3BsaXQoXCJfXCIpO1xuXG5cbiAgICBjcmVhdGUodmFsdWU6IEFYRGF0ZVZhbHVlKTogQVhEYXRlVGltZSB7XG4gICAgICAgIGNvbnN0IGEgPSB0aGlzLnRvR3JlZ29yaWFuKHZhbHVlLnllYXIsIHZhbHVlLm1vbnRoLCB2YWx1ZS5kYXRlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKG5ldyBEYXRlKGEuZ2V0RnVsbFllYXIoKSwgYS5nZXRNb250aCgpLCBhLmdldERhdGUoKSwgdmFsdWUuaG91cnMgfHwgMCwgdmFsdWUubWludXRlcyB8fCAwLCB2YWx1ZS5zZWNvbmRzIHx8IDAsIHZhbHVlLm1zIHx8IDApLCB0aGlzLm5hbWUoKSk7XG4gICAgfVxuXG4gICAgbmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ2phbGFsaSdcbiAgICB9XG5cbiAgICBkYXlPZk1vbnRoKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy50b0phbGFsaShkYXRlKS5kYXk7XG4gICAgfVxuXG4gICAgZGF5T2ZZZWFyKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBqID0gdGhpcy50b0phbGFsaShkYXRlKTtcbiAgICAgICAgcmV0dXJuIChqLm1vbnRoIDw9IDYgPyAoKGoubW9udGggLSAxKSAqIDMxKSA6ICgoNiAqIDMxKSArIChqLm1vbnRoIC0gNykgKiAzMCkpICsgai5kYXk7XG4gICAgfVxuXG4gICAgZGF5T2ZXZWVrKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gZGF0ZS5nZXREYXkoKSA9PSA2ID8gMSA6IGRhdGUuZ2V0RGF5KCkgKyAyO1xuICAgIH1cblxuICAgIHdlZWtPZlllYXIoZGF0ZTogRGF0ZSk6IG51bWJlciB7XG4gICAgICAgIC8vVE9ETyA6IGFwcGx5IGphbGFsaVxuICAgICAgICBjb25zdCBmaXJzdERheSA9IG5ldyBBWERhdGVUaW1lKGRhdGUpLnN0YXJ0T2YoJ3llYXInKTtcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCgoKChkYXRlLmdldFRpbWUoKSAtIGZpcnN0RGF5LmRhdGUuZ2V0VGltZSgpKSAvIDg2NDAwMDAwKSArIGZpcnN0RGF5LmRhdGUuZ2V0RGF5KCkgKyAxKSAvIDcpO1xuICAgIH1cblxuICAgIHllYXIoZGF0ZTogRGF0ZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvSmFsYWxpKGRhdGUpLnllYXI7XG4gICAgfVxuXG4gICAgbW9udGhPZlllYXIoZGF0ZTogRGF0ZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvSmFsYWxpKGRhdGUpLm1vbnRoO1xuICAgIH1cblxuXG4gICAgYWRkKGRhdGU6IERhdGUsIHVuaXQ6IFRpbWVVbml0LCBhbW91bnQ6IG51bWJlcik6IEFYRGF0ZVRpbWUge1xuICAgICAgICBsZXQgdmFsdWUgPSBkYXRlLnZhbHVlT2YoKTtcbiAgICAgICAgc3dpdGNoICh1bml0KSB7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIHZhbHVlICs9IDEwMDAgKiBhbW91bnQ7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gNjAwMDAgKiBhbW91bnQ7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIHZhbHVlICs9IDM2MDAwMDAgKiBhbW91bnQ7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBqZCA9IHRoaXMuZGF5T2ZNb250aChkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGptID0gdGhpcy5tb250aE9mWWVhcihkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGp5ID0gdGhpcy55ZWFyKGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBubSA9IChqbSArIGFtb3VudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG55ID0gKG5tICUgMTIpID8gTWF0aC5mbG9vcihubSAvIDEyKSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIGp5ICs9IG55O1xuICAgICAgICAgICAgICAgICAgICBqbSA9IG5tIC0gKG55ICogMTIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2diA9IHRoaXMudG9HcmVnb3JpYW4oanksIGptLCBqZCk7XG4gICAgICAgICAgICAgICAgICAgIHYuc2V0RnVsbFllYXIodnYuZ2V0RnVsbFllYXIoKSk7XG4gICAgICAgICAgICAgICAgICAgIHYuc2V0TW9udGgodnYuZ2V0TW9udGgoKSk7XG4gICAgICAgICAgICAgICAgICAgIHYuc2V0RGF0ZSh2di5nZXREYXRlKCkpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHYudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgICAgIHZhbHVlICs9IDcgKiA4NjQwMDAwMCAqIGFtb3VudDtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCB2ID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyB2LnNldEZ1bGxZZWFyKHYuZ2V0RnVsbFllYXIoKSArIGFtb3VudCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlID0gdi52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBqZCA9IHRoaXMuZGF5T2ZNb250aChkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGptID0gdGhpcy5tb250aE9mWWVhcihkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGp5ID0gdGhpcy55ZWFyKGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2diA9IHRoaXMudG9HcmVnb3JpYW4oankgKyBhbW91bnQsIGptLCBqZCk7XG4gICAgICAgICAgICAgICAgICAgIHYuc2V0RnVsbFllYXIodnYuZ2V0RnVsbFllYXIoKSk7XG4gICAgICAgICAgICAgICAgICAgIHYuc2V0TW9udGgodnYuZ2V0TW9udGgoKSk7XG4gICAgICAgICAgICAgICAgICAgIHYuc2V0RGF0ZSh2di5nZXREYXRlKCkpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHYudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHZhbHVlICs9IDg2NDAwMDAwICogYW1vdW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShuZXcgRGF0ZSh2YWx1ZSksIHRoaXMubmFtZSgpKTtcbiAgICB9XG5cbiAgICBzZXQoZGF0ZTogRGF0ZSwgdW5pdDogVGltZVVuaXQsIHZhbHVlOiBudW1iZXIpOiBBWERhdGVUaW1lIHtcbiAgICAgICAgY29uc3QgY2xvbmUgPSBuZXcgRGF0ZShkYXRlLnZhbHVlT2YoKSk7XG4gICAgICAgIGNvbnN0IGpEYXRlID0gdGhpcy50b0phbGFsaShjbG9uZSk7XG4gICAgICAgIHN3aXRjaCAodW5pdCkge1xuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCBjbG9uZS5nZXRNaW51dGVzKCksIHZhbHVlLCBjbG9uZS5nZXRNaWxsaXNlY29uZHMoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIHZhbHVlLCBjbG9uZS5nZXRTZWNvbmRzKCksIGNsb25lLmdldE1pbGxpc2Vjb25kcygpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKHZhbHVlLCBjbG9uZS5nZXRNaW51dGVzKCksIGNsb25lLmdldFNlY29uZHMoKSwgY2xvbmUuZ2V0TWlsbGlzZWNvbmRzKCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICAgICAgY29uc3QgZ0RhdGUgPSB0aGlzLnRvR3JlZ29yaWFuKGpEYXRlLnllYXIsIGpEYXRlLm1vbnRoLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0RGF0ZShnRGF0ZS5nZXREYXRlKCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIndlZWtcIjpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtb250aFwiOlxuICAgICAgICAgICAgICAgIGNvbnN0IGdEYXRlMiA9IHRoaXMudG9HcmVnb3JpYW4oakRhdGUueWVhciwgdmFsdWUsIGpEYXRlLmRheSk7XG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0TW9udGgoZ0RhdGUyLmdldE1vbnRoKCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInllYXJcIjpcbiAgICAgICAgICAgICAgICBjb25zdCBnRGF0ZTMgPSB0aGlzLnRvR3JlZ29yaWFuKHZhbHVlLCBqRGF0ZS5tb250aCwgakRhdGUuZGF5KTtcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRGdWxsWWVhcihnRGF0ZTMuZ2V0RnVsbFllYXIoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XG4gICAgfVxuXG4gICAgc3RhcnRPZihkYXRlOiBEYXRlLCB1bml0OiBUaW1lVW5pdCk6IEFYRGF0ZVRpbWUge1xuICAgICAgICBjb25zdCBjbG9uZSA9IG5ldyBEYXRlKGRhdGUudmFsdWVPZigpKTtcbiAgICAgICAgc3dpdGNoICh1bml0KSB7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIGNsb25lLmdldE1pbnV0ZXMoKSwgY2xvbmUuZ2V0U2Vjb25kcygpLCAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKTtcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgY2xvbmUuZ2V0TWludXRlcygpLCAwLCAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKTtcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIDAsIDAsIDApO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XG4gICAgICAgICAgICBjYXNlIFwid2Vla1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpLmFkZCgnZGF5JywgLXRoaXMuZGF5T2ZXZWVrKGNsb25lKSArIDEpLnN0YXJ0T2YoJ2RheScpO1xuICAgICAgICAgICAgY2FzZSBcIm1vbnRoXCI6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBqeSA9IHRoaXMueWVhcihkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgam0gPSB0aGlzLm1vbnRoT2ZZZWFyKGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBnRGF0ZSA9IHRoaXMudG9HcmVnb3JpYW4oanksIGptLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGdEYXRlLCB0aGlzLm5hbWUoKSkuc3RhcnRPZignZGF5Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInllYXJcIjpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGp5ID0gdGhpcy55ZWFyKGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBnRGF0ZSA9IHRoaXMudG9HcmVnb3JpYW4oanksIDEsIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoZ0RhdGUsIHRoaXMubmFtZSgpKS5zdGFydE9mKCdkYXknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlbmRPZihkYXRlOiBEYXRlLCB1bml0OiBUaW1lVW5pdCk6IEFYRGF0ZVRpbWUge1xuICAgICAgICBjb25zdCBjbG9uZSA9IG5ldyBEYXRlKGRhdGUudmFsdWVPZigpKTtcbiAgICAgICAgc3dpdGNoICh1bml0KSB7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIGNsb25lLmdldE1pbnV0ZXMoKSwgY2xvbmUuZ2V0U2Vjb25kcygpLCA5OTkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCBjbG9uZS5nZXRNaW51dGVzKCksIDU5LCA5OTkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgNTksIDU5LCA5OTkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKTtcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZihkYXRlLCAnd2VlaycpLmFkZCgnZGF5JywgNikuZW5kT2YoJ2RheScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGp5ID0gdGhpcy55ZWFyKGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBqbSA9IHRoaXMubW9udGhPZlllYXIoZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGpkID0gdGhpcy5tb250aExlbmd0aChqeSwgam0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBnRGF0ZSA9IHRoaXMudG9HcmVnb3JpYW4oanksIGptLCBqZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShnRGF0ZSwgdGhpcy5uYW1lKCkpLmVuZE9mKCdkYXknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwieWVhclwiOlxuICAgICAgICAgICAgICAgIGxldCBqeSA9IHRoaXMueWVhcihkYXRlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBnRGF0ZSA9IHRoaXMudG9HcmVnb3JpYW4oanksIDEyLCB0aGlzLm1vbnRoTGVuZ3RoKGp5LCAxMikpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShnRGF0ZSwgdGhpcy5uYW1lKCkpLmVuZE9mKCdkYXknKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbiAgICB0b0phbGFsaShkYXRlOiBEYXRlKTogeyB5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIGRheTogbnVtYmVyIH0ge1xuICAgICAgICBjb25zdCBneSA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgY29uc3QgZ20gPSBkYXRlLmdldE1vbnRoKCkgKyAxO1xuICAgICAgICBjb25zdCBnZCA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgICAgICBjb25zdCByID0gdGhpcy5kMmoodGhpcy5nMmQoZ3ksIGdtLCBnZCkpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB5ZWFyOiByLmp5LFxuICAgICAgICAgICAgbW9udGg6IHIuam0sXG4gICAgICAgICAgICBkYXk6IHIuamQsXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKlxuICAgICAgQ29udmVydHMgYSBKYWxhYWxpIGRhdGUgdG8gR3JlZ29yaWFuLlxuICAgICovXG4gICAgdG9HcmVnb3JpYW4oanksIGptLCBqZCkge1xuICAgICAgICBjb25zdCBnID0gdGhpcy5kMmcodGhpcy5qMmQoanksIGptLCBqZCkpXG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShnLmd5LCBnLmdtIC0gMSwgZy5nZCk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgIENoZWNrcyB3aGV0aGVyIGEgSmFsYWFsaSBkYXRlIGlzIHZhbGlkIG9yIG5vdC5cbiAgICAqL1xuICAgIGlzVmFsaWQoanksIGptLCBqZCkge1xuICAgICAgICByZXR1cm4gankgPj0gLTYxICYmIGp5IDw9IDMxNzcgJiZcbiAgICAgICAgICAgIGptID49IDEgJiYgam0gPD0gMTIgJiZcbiAgICAgICAgICAgIGpkID49IDEgJiYgamQgPD0gdGhpcy5tb250aExlbmd0aChqeSwgam0pXG4gICAgfVxuXG4gICAgLypcbiAgICAgIElzIHRoaXMgYSBsZWFwIHllYXIgb3Igbm90P1xuICAgICovXG4gICAgaXNMZWFwWWVhcihqeSkge1xuICAgICAgICByZXR1cm4gdGhpcy5qYWxDYWwoankpLmxlYXAgPT09IDBcbiAgICB9XG5cbiAgICAvKlxuICAgICAgTnVtYmVyIG9mIGRheXMgaW4gYSBnaXZlbiBtb250aCBpbiBhIEphbGFhbGkgeWVhci5cbiAgICAqL1xuICAgIG1vbnRoTGVuZ3RoKGp5LCBqbSkge1xuICAgICAgICBpZiAoam0gPD0gNikgcmV0dXJuIDMxXG4gICAgICAgIGlmIChqbSA8PSAxMSkgcmV0dXJuIDMwXG4gICAgICAgIGlmICh0aGlzLmlzTGVhcFllYXIoankpKSByZXR1cm4gMzBcbiAgICAgICAgcmV0dXJuIDI5XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGphbENhbChqeSkge1xuICAgICAgICAvLyBKYWxhYWxpIHllYXJzIHN0YXJ0aW5nIHRoZSAzMy15ZWFyIHJ1bGUuXG4gICAgICAgIGxldCBicmVha3MgPSBbLTYxLCA5LCAzOCwgMTk5LCA0MjYsIDY4NiwgNzU2LCA4MTgsIDExMTEsIDExODEsIDEyMTBcbiAgICAgICAgICAgICwgMTYzNSwgMjA2MCwgMjA5NywgMjE5MiwgMjI2MiwgMjMyNCwgMjM5NCwgMjQ1NiwgMzE3OFxuICAgICAgICBdXG4gICAgICAgICAgICAsIGJsID0gYnJlYWtzLmxlbmd0aFxuICAgICAgICAgICAgLCBneSA9IGp5ICsgNjIxXG4gICAgICAgICAgICAsIGxlYXBKID0gLTE0XG4gICAgICAgICAgICAsIGpwID0gYnJlYWtzWzBdXG4gICAgICAgICAgICAsIGptXG4gICAgICAgICAgICAsIGp1bXBcbiAgICAgICAgICAgICwgbGVhcFxuICAgICAgICAgICAgLCBsZWFwR1xuICAgICAgICAgICAgLCBtYXJjaFxuICAgICAgICAgICAgLCBuXG4gICAgICAgICAgICAsIGlcblxuICAgICAgICBpZiAoankgPCBqcCB8fCBqeSA+PSBicmVha3NbYmwgLSAxXSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBKYWxhYWxpIHllYXIgJyArIGp5KVxuXG4gICAgICAgIC8vIEZpbmQgdGhlIGxpbWl0aW5nIHllYXJzIGZvciB0aGUgSmFsYWFsaSB5ZWFyIGp5LlxuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYmw7IGkgKz0gMSkge1xuICAgICAgICAgICAgam0gPSBicmVha3NbaV1cbiAgICAgICAgICAgIGp1bXAgPSBqbSAtIGpwXG4gICAgICAgICAgICBpZiAoankgPCBqbSlcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgbGVhcEogPSBsZWFwSiArIHRoaXMuZGl2KGp1bXAsIDMzKSAqIDggKyB0aGlzLmRpdih0aGlzLm1vZChqdW1wLCAzMyksIDQpXG4gICAgICAgICAgICBqcCA9IGptXG4gICAgICAgIH1cbiAgICAgICAgbiA9IGp5IC0ganBcblxuICAgICAgICAvLyBGaW5kIHRoZSBudW1iZXIgb2YgbGVhcCB5ZWFycyBmcm9tIEFEIDYyMSB0byB0aGUgYmVnaW5uaW5nXG4gICAgICAgIC8vIG9mIHRoZSBjdXJyZW50IEphbGFhbGkgeWVhciBpbiB0aGUgUGVyc2lhbiBjYWxlbmRhci5cbiAgICAgICAgbGVhcEogPSBsZWFwSiArIHRoaXMuZGl2KG4sIDMzKSAqIDggKyB0aGlzLmRpdih0aGlzLm1vZChuLCAzMykgKyAzLCA0KVxuICAgICAgICBpZiAodGhpcy5tb2QoanVtcCwgMzMpID09PSA0ICYmIGp1bXAgLSBuID09PSA0KVxuICAgICAgICAgICAgbGVhcEogKz0gMVxuXG4gICAgICAgIC8vIEFuZCB0aGUgc2FtZSBpbiB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyICh1bnRpbCB0aGUgeWVhciBneSkuXG4gICAgICAgIGxlYXBHID0gdGhpcy5kaXYoZ3ksIDQpIC0gdGhpcy5kaXYoKHRoaXMuZGl2KGd5LCAxMDApICsgMSkgKiAzLCA0KSAtIDE1MFxuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgR3JlZ29yaWFuIGRhdGUgb2YgRmFydmFyZGluIHRoZSAxc3QuXG4gICAgICAgIG1hcmNoID0gMjAgKyBsZWFwSiAtIGxlYXBHXG5cbiAgICAgICAgLy8gRmluZCBob3cgbWFueSB5ZWFycyBoYXZlIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBsZWFwIHllYXIuXG4gICAgICAgIGlmIChqdW1wIC0gbiA8IDYpXG4gICAgICAgICAgICBuID0gbiAtIGp1bXAgKyB0aGlzLmRpdihqdW1wICsgNCwgMzMpICogMzNcbiAgICAgICAgbGVhcCA9IHRoaXMubW9kKHRoaXMubW9kKG4gKyAxLCAzMykgLSAxLCA0KVxuICAgICAgICBpZiAobGVhcCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGxlYXAgPSA0XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGVhcDogbGVhcFxuICAgICAgICAgICAgLCBneTogZ3lcbiAgICAgICAgICAgICwgbWFyY2g6IG1hcmNoXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKlxuICAgICAgQ29udmVydHMgYSBkYXRlIG9mIHRoZSBKYWxhYWxpIGNhbGVuZGFyIHRvIHRoZSBKdWxpYW4gRGF5IG51bWJlci5cbiAgICAgIEBwYXJhbSBqeSBKYWxhYWxpIHllYXIgKDEgdG8gMzEwMClcbiAgICAgIEBwYXJhbSBqbSBKYWxhYWxpIG1vbnRoICgxIHRvIDEyKVxuICAgICAgQHBhcmFtIGpkIEphbGFhbGkgZGF5ICgxIHRvIDI5LzMxKVxuICAgICAgQHJldHVybiBKdWxpYW4gRGF5IG51bWJlclxuICAgICovXG4gICAgcHJpdmF0ZSBqMmQoanksIGptLCBqZCkge1xuICAgICAgICBsZXQgciA9IHRoaXMuamFsQ2FsKGp5KVxuICAgICAgICByZXR1cm4gdGhpcy5nMmQoci5neSwgMywgci5tYXJjaCkgKyAoam0gLSAxKSAqIDMxIC0gdGhpcy5kaXYoam0sIDcpICogKGptIC0gNykgKyBqZCAtIDFcbiAgICB9XG5cbiAgICAvKlxuICAgICAgQ29udmVydHMgdGhlIEp1bGlhbiBEYXkgbnVtYmVyIHRvIGEgZGF0ZSBpbiB0aGUgSmFsYWFsaSBjYWxlbmRhci5cbiAgICAgIEBwYXJhbSBqZG4gSnVsaWFuIERheSBudW1iZXJcbiAgICAgIEByZXR1cm5cbiAgICAgICAgank6IEphbGFhbGkgeWVhciAoMSB0byAzMTAwKVxuICAgICAgICBqbTogSmFsYWFsaSBtb250aCAoMSB0byAxMilcbiAgICAgICAgamQ6IEphbGFhbGkgZGF5ICgxIHRvIDI5LzMxKVxuICAgICovXG4gICAgcHJpdmF0ZSBkMmooamRuKSB7XG4gICAgICAgIGxldCBneSA9IHRoaXMuZDJnKGpkbikuZ3kgLy8gQ2FsY3VsYXRlIEdyZWdvcmlhbiB5ZWFyIChneSkuXG4gICAgICAgICAgICAsIGp5ID0gZ3kgLSA2MjFcbiAgICAgICAgICAgICwgciA9IHRoaXMuamFsQ2FsKGp5KVxuICAgICAgICAgICAgLCBqZG4xZiA9IHRoaXMuZzJkKGd5LCAzLCByLm1hcmNoKVxuICAgICAgICAgICAgLCBqZFxuICAgICAgICAgICAgLCBqbVxuICAgICAgICAgICAgLCBrXG5cbiAgICAgICAgLy8gRmluZCBudW1iZXIgb2YgZGF5cyB0aGF0IHBhc3NlZCBzaW5jZSAxIEZhcnZhcmRpbi5cbiAgICAgICAgayA9IGpkbiAtIGpkbjFmXG4gICAgICAgIGlmIChrID49IDApIHtcbiAgICAgICAgICAgIGlmIChrIDw9IDE4NSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCA2IG1vbnRocy5cbiAgICAgICAgICAgICAgICBqbSA9IDEgKyB0aGlzLmRpdihrLCAzMSlcbiAgICAgICAgICAgICAgICBqZCA9IHRoaXMubW9kKGssIDMxKSArIDFcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBqeToganlcbiAgICAgICAgICAgICAgICAgICAgLCBqbTogam1cbiAgICAgICAgICAgICAgICAgICAgLCBqZDogamRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZW1haW5pbmcgbW9udGhzLlxuICAgICAgICAgICAgICAgIGsgLT0gMTg2XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBQcmV2aW91cyBKYWxhYWxpIHllYXIuXG4gICAgICAgICAgICBqeSAtPSAxXG4gICAgICAgICAgICBrICs9IDE3OVxuICAgICAgICAgICAgaWYgKHIubGVhcCA9PT0gMSlcbiAgICAgICAgICAgICAgICBrICs9IDFcbiAgICAgICAgfVxuICAgICAgICBqbSA9IDcgKyB0aGlzLmRpdihrLCAzMClcbiAgICAgICAgamQgPSB0aGlzLm1vZChrLCAzMCkgKyAxXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBqeToganlcbiAgICAgICAgICAgICwgam06IGptXG4gICAgICAgICAgICAsIGpkOiBqZFxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGcyZChneSwgZ20sIGdkKSB7XG4gICAgICAgIGxldCBkID0gdGhpcy5kaXYoKGd5ICsgdGhpcy5kaXYoZ20gLSA4LCA2KSArIDEwMDEwMCkgKiAxNDYxLCA0KVxuICAgICAgICAgICAgKyB0aGlzLmRpdigxNTMgKiB0aGlzLm1vZChnbSArIDksIDEyKSArIDIsIDUpXG4gICAgICAgICAgICArIGdkIC0gMzQ4NDA0MDhcbiAgICAgICAgZCA9IGQgLSB0aGlzLmRpdih0aGlzLmRpdihneSArIDEwMDEwMCArIHRoaXMuZGl2KGdtIC0gOCwgNiksIDEwMCkgKiAzLCA0KSArIDc1MlxuICAgICAgICByZXR1cm4gZFxuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBkMmcoamRuKSB7XG4gICAgICAgIGxldCBqXG4gICAgICAgICAgICAsIGlcbiAgICAgICAgICAgICwgZ2RcbiAgICAgICAgICAgICwgZ21cbiAgICAgICAgICAgICwgZ3lcbiAgICAgICAgaiA9IDQgKiBqZG4gKyAxMzkzNjE2MzFcbiAgICAgICAgaiA9IGogKyB0aGlzLmRpdih0aGlzLmRpdig0ICogamRuICsgMTgzMTg3NzIwLCAxNDYwOTcpICogMywgNCkgKiA0IC0gMzkwOFxuICAgICAgICBpID0gdGhpcy5kaXYodGhpcy5tb2QoaiwgMTQ2MSksIDQpICogNSArIDMwOFxuICAgICAgICBnZCA9IHRoaXMuZGl2KHRoaXMubW9kKGksIDE1MyksIDUpICsgMVxuICAgICAgICBnbSA9IHRoaXMubW9kKHRoaXMuZGl2KGksIDE1MyksIDEyKSArIDFcbiAgICAgICAgZ3kgPSB0aGlzLmRpdihqLCAxNDYxKSAtIDEwMDEwMCArIHRoaXMuZGl2KDggLSBnbSwgNilcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGd5OiBneVxuICAgICAgICAgICAgLCBnbTogZ21cbiAgICAgICAgICAgICwgZ2Q6IGdkXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKlxuICAgICAgVXRpbGl0eSBoZWxwZXIgZnVuY3Rpb25zLlxuICAgICovXG4gICAgcHJpdmF0ZSBkaXYoYSwgYikge1xuICAgICAgICByZXR1cm4gfn4oYSAvIGIpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtb2QoYSwgYikge1xuICAgICAgICByZXR1cm4gYSAtIH5+KGEgLyBiKSAqIGJcbiAgICB9XG5cbn0iXX0=