@acorex/core 7.0.41 → 7.1.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.
- package/config/index.d.ts +5 -5
- package/config/public-api.d.ts +1 -1
- package/config/src/configs.d.ts +9 -9
- package/dateTime/index.d.ts +5 -5
- package/dateTime/public-api.d.ts +5 -5
- package/dateTime/src/datetime.class.d.ts +100 -100
- package/dateTime/src/datetime.module.d.ts +8 -8
- package/dateTime/src/datetime.pipe.d.ts +8 -8
- package/dateTime/src/georgian.calendar.d.ts +20 -20
- package/dateTime/src/jalali.calendar.d.ts +35 -35
- package/{esm2020 → esm2022}/acorex-core.mjs +4 -4
- package/{esm2020 → esm2022}/config/acorex-core-config.mjs +4 -4
- package/{esm2020 → esm2022}/config/public-api.mjs +1 -1
- package/esm2022/config/src/configs.mjs +25 -0
- package/{esm2020 → esm2022}/dateTime/acorex-core-dateTime.mjs +4 -4
- package/{esm2020 → esm2022}/dateTime/public-api.mjs +5 -5
- package/esm2022/dateTime/src/datetime.class.mjs +295 -0
- package/esm2022/dateTime/src/datetime.module.mjs +40 -0
- package/esm2022/dateTime/src/datetime.pipe.mjs +27 -0
- package/esm2022/dateTime/src/georgian.calendar.mjs +187 -0
- package/esm2022/dateTime/src/jalali.calendar.mjs +357 -0
- package/{esm2020 → esm2022}/events/acorex-core-events.mjs +4 -4
- package/{esm2020 → esm2022}/events/public-api.mjs +1 -1
- package/esm2022/events/src/event.service.mjs +35 -0
- package/{esm2020 → esm2022}/file/acorex-core-file.mjs +4 -4
- package/{esm2020 → esm2022}/file/public-api.mjs +4 -4
- package/esm2022/file/src/file-download-ref.class.mjs +13 -0
- package/esm2022/file/src/file-download-result.class.mjs +47 -0
- package/esm2022/file/src/file-upload-ref.class.mjs +13 -0
- package/esm2022/file/src/file.service.mjs +103 -0
- package/{esm2020 → esm2022}/http/acorex-core-http.mjs +4 -4
- package/{esm2020 → esm2022}/http/public-api.mjs +5 -5
- package/{esm2020 → esm2022}/http/src/http-error.class.mjs +1 -1
- package/{esm2020 → esm2022}/http/src/http-events.interceptor.mjs +2 -2
- package/{esm2020 → esm2022}/http/src/http-request.class.mjs +1 -1
- package/esm2022/http/src/http-result.class.mjs +25 -0
- package/esm2022/http/src/http.module.mjs +30 -0
- package/esm2022/http/src/http.service.mjs +152 -0
- package/{esm2020 → esm2022}/image/acorex-core-image.mjs +4 -4
- package/{esm2020 → esm2022}/image/public-api.mjs +1 -1
- package/esm2022/image/src/image.service.mjs +44 -0
- package/{esm2020 → esm2022}/pipes/acorex-core-pipes.mjs +4 -4
- package/{esm2020 → esm2022}/pipes/public-api.mjs +2 -2
- package/esm2022/pipes/src/pipes.module.mjs +20 -0
- package/{esm2020 → esm2022}/pipes/src/safe.pipe.mjs +32 -30
- package/{esm2020 → esm2022}/platform/acorex-core-platform.mjs +4 -4
- package/{esm2020 → esm2022}/platform/public-api.mjs +1 -1
- package/esm2022/platform/src/platform.service.mjs +152 -0
- package/{esm2020 → esm2022}/public-api.mjs +4 -4
- package/{esm2020 → esm2022}/translation/acorex-core-translation.mjs +4 -4
- package/{esm2020 → esm2022}/translation/public-api.mjs +3 -3
- package/esm2022/translation/src/translation.module.mjs +19 -0
- package/esm2022/translation/src/translator.mjs +44 -0
- package/esm2022/translation/src/translator.pipe.mjs +16 -0
- package/{esm2020 → esm2022}/utils/acorex-core-utils.mjs +4 -4
- package/{esm2020 → esm2022}/utils/public-api.mjs +5 -5
- package/{esm2020 → esm2022}/utils/src/color-util.mjs +114 -114
- package/{esm2020 → esm2022}/utils/src/drawing-util.mjs +29 -29
- package/{esm2020 → esm2022}/utils/src/html-util.mjs +15 -15
- package/{esm2020 → esm2022}/utils/src/object-util.mjs +38 -38
- package/{esm2020 → esm2022}/utils/src/string-util.mjs +18 -18
- package/events/index.d.ts +5 -5
- package/events/public-api.d.ts +1 -1
- package/events/src/event.service.d.ts +9 -9
- package/{fesm2015 → fesm2022}/acorex-core-config.mjs +23 -24
- package/{fesm2015 → fesm2022}/acorex-core-config.mjs.map +1 -1
- package/{fesm2015 → fesm2022}/acorex-core-dateTime.mjs +882 -880
- package/{fesm2020 → fesm2022}/acorex-core-dateTime.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/acorex-core-events.mjs +32 -35
- package/fesm2022/acorex-core-events.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/acorex-core-file.mjs +162 -159
- package/{fesm2020 → fesm2022}/acorex-core-file.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/acorex-core-http.mjs +190 -184
- package/{fesm2020 → fesm2022}/acorex-core-http.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/acorex-core-image.mjs +41 -42
- package/{fesm2020 → fesm2022}/acorex-core-image.mjs.map +1 -1
- package/{fesm2015 → fesm2022}/acorex-core-pipes.mjs +41 -41
- package/fesm2022/acorex-core-pipes.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/acorex-core-platform.mjs +147 -154
- package/fesm2022/acorex-core-platform.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/acorex-core-translation.mjs +64 -65
- package/{fesm2020 → fesm2022}/acorex-core-translation.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/acorex-core-utils.mjs +209 -210
- package/{fesm2015 → fesm2022}/acorex-core.mjs +5 -6
- package/file/index.d.ts +5 -5
- package/file/public-api.d.ts +4 -4
- package/file/src/file-download-ref.class.d.ts +6 -6
- package/file/src/file-download-result.class.d.ts +8 -8
- package/file/src/file-upload-ref.class.d.ts +5 -5
- package/file/src/file.service.d.ts +18 -18
- package/http/index.d.ts +5 -5
- package/http/public-api.d.ts +5 -5
- package/http/src/http-error.class.d.ts +7 -7
- package/http/src/http-events.interceptor.d.ts +10 -10
- package/http/src/http-request.class.d.ts +14 -14
- package/http/src/http-result.class.d.ts +11 -11
- package/http/src/http.module.d.ts +8 -8
- package/http/src/http.service.d.ts +23 -23
- package/image/index.d.ts +5 -5
- package/image/public-api.d.ts +1 -1
- package/image/src/image.service.d.ts +12 -12
- package/index.d.ts +5 -5
- package/package.json +39 -65
- package/pipes/index.d.ts +5 -5
- package/pipes/public-api.d.ts +2 -2
- package/pipes/src/pipes.module.d.ts +8 -8
- package/pipes/src/safe.pipe.d.ts +10 -10
- package/platform/index.d.ts +5 -5
- package/platform/public-api.d.ts +1 -1
- package/platform/src/platform.service.d.ts +26 -26
- package/public-api.d.ts +1 -1
- package/translation/index.d.ts +5 -5
- package/translation/public-api.d.ts +3 -3
- package/translation/src/translation.module.d.ts +7 -7
- package/translation/src/translator.d.ts +11 -11
- package/translation/src/translator.pipe.d.ts +7 -7
- package/utils/index.d.ts +5 -5
- package/utils/public-api.d.ts +5 -5
- package/utils/src/color-util.d.ts +23 -23
- package/utils/src/drawing-util.d.ts +18 -18
- package/utils/src/html-util.d.ts +4 -4
- package/utils/src/object-util.d.ts +4 -4
- package/utils/src/string-util.d.ts +6 -6
- package/esm2020/config/src/configs.mjs +0 -24
- package/esm2020/dateTime/src/datetime.class.mjs +0 -288
- package/esm2020/dateTime/src/datetime.module.mjs +0 -39
- package/esm2020/dateTime/src/datetime.pipe.mjs +0 -26
- package/esm2020/dateTime/src/georgian.calendar.mjs +0 -189
- package/esm2020/dateTime/src/jalali.calendar.mjs +0 -359
- package/esm2020/events/src/event.service.mjs +0 -36
- package/esm2020/file/src/file-download-ref.class.mjs +0 -12
- package/esm2020/file/src/file-download-result.class.mjs +0 -46
- package/esm2020/file/src/file-upload-ref.class.mjs +0 -12
- package/esm2020/file/src/file.service.mjs +0 -101
- package/esm2020/http/src/http-result.class.mjs +0 -21
- package/esm2020/http/src/http.module.mjs +0 -29
- package/esm2020/http/src/http.service.mjs +0 -148
- package/esm2020/image/src/image.service.mjs +0 -43
- package/esm2020/pipes/src/pipes.module.mjs +0 -19
- package/esm2020/platform/src/platform.service.mjs +0 -157
- package/esm2020/translation/src/translation.module.mjs +0 -18
- package/esm2020/translation/src/translator.mjs +0 -43
- package/esm2020/translation/src/translator.pipe.mjs +0 -15
- package/fesm2015/acorex-core-dateTime.mjs.map +0 -1
- package/fesm2015/acorex-core-events.mjs +0 -44
- package/fesm2015/acorex-core-events.mjs.map +0 -1
- package/fesm2015/acorex-core-file.mjs +0 -176
- package/fesm2015/acorex-core-file.mjs.map +0 -1
- package/fesm2015/acorex-core-http.mjs +0 -203
- package/fesm2015/acorex-core-http.mjs.map +0 -1
- package/fesm2015/acorex-core-image.mjs +0 -54
- package/fesm2015/acorex-core-image.mjs.map +0 -1
- package/fesm2015/acorex-core-pipes.mjs.map +0 -1
- package/fesm2015/acorex-core-platform.mjs +0 -165
- package/fesm2015/acorex-core-platform.mjs.map +0 -1
- package/fesm2015/acorex-core-translation.mjs +0 -81
- package/fesm2015/acorex-core-translation.mjs.map +0 -1
- package/fesm2015/acorex-core-utils.mjs +0 -227
- package/fesm2020/acorex-core-config.mjs +0 -32
- package/fesm2020/acorex-core-config.mjs.map +0 -1
- package/fesm2020/acorex-core-dateTime.mjs +0 -899
- package/fesm2020/acorex-core-events.mjs.map +0 -1
- package/fesm2020/acorex-core-pipes.mjs +0 -54
- package/fesm2020/acorex-core-pipes.mjs.map +0 -1
- package/fesm2020/acorex-core-platform.mjs.map +0 -1
- package/fesm2020/acorex-core-utils.mjs.map +0 -1
- package/fesm2020/acorex-core.mjs +0 -12
- package/fesm2020/acorex-core.mjs.map +0 -1
- /package/{fesm2015 → fesm2022}/acorex-core-utils.mjs.map +0 -0
- /package/{fesm2015 → fesm2022}/acorex-core.mjs.map +0 -0
@@ -0,0 +1,187 @@
|
|
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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QU07Z0JBQ1AsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbkIsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2hFO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFVO1FBQ2IsSUFBSSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuRCxPQUFPLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDcEMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhDYWxlbmRhciwgQVhEYXRlVGltZSwgQVhEYXRlVmFsdWUsIFRpbWVVbml0IH0gZnJvbSBcIi4vZGF0ZXRpbWUuY2xhc3NcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHZW9yZ2lhbkNhbGVuZGFyIGltcGxlbWVudHMgQVhDYWxlbmRhciB7XHJcblxyXG4gICAgbW9udGhOYW1lcyA9IFtcclxuICAgICAgICBcIkphbnVhcnlcIiwgXCJGZWJydWFyeVwiLCBcIk1hcmNoXCIsXHJcbiAgICAgICAgXCJBcHJpbFwiLCBcIk1heVwiLCBcIkp1bmVcIiwgXCJKdWx5XCIsXHJcbiAgICAgICAgXCJBdWd1c3RcIiwgXCJTZXB0ZW1iZXJcIiwgXCJPY3RvYmVyXCIsXHJcbiAgICAgICAgXCJOb3ZlbWJlclwiLCBcIkRlY2VtYmVyXCJcclxuICAgIF07XHJcblxyXG4gICAgbW9udGhTaG9ydE5hbWVzID0gW1xyXG4gICAgICAgIFwiSmFuXCIsIFwiRmViXCIsIFwiTWFyXCIsXHJcbiAgICAgICAgXCJBcHJcIiwgXCJNYXlcIiwgXCJKdW5cIiwgXCJKdWxcIixcclxuICAgICAgICBcIkF1Z1wiLCBcIlNlcFwiLCBcIk9jdFwiLFxyXG4gICAgICAgIFwiTm92XCIsIFwiRGVjXCJcclxuICAgIF07XHJcblxyXG4gICAgZGF5TmFtZXMgPSBbXHJcbiAgICAgICAgXCJTdW5kYXlcIiwgXCJNb25kYXlcIiwgXCJUdWVzZGF5XCIsIFwiV2VkbmVzZGF5XCIsXHJcbiAgICAgICAgXCJUaHVyc2RheVwiLCBcIkZyaWRheVwiLCBcIlNhdHVyZGF5XCJcclxuICAgIF07XHJcblxyXG4gICAgZGF5U2hvcnROYW1lcyA9IFtcclxuICAgICAgICBcIlN1blwiLCBcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLFxyXG4gICAgICAgIFwiVGh1XCIsIFwiRnJpXCIsIFwiU2F0XCJcclxuICAgIF07XHJcblxyXG5cclxuICAgIGNyZWF0ZSh2YWx1ZTogQVhEYXRlVmFsdWUpOiBBWERhdGVUaW1lIHtcclxuICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUobmV3IERhdGUodmFsdWUueWVhciwgdmFsdWUubW9udGggLSAxLCB2YWx1ZS5kYXRlLCB2YWx1ZS5ob3VycyB8fCAwLCB2YWx1ZS5taW51dGVzIHx8IDAsIHZhbHVlLnNlY29uZHMgfHwgMCwgdmFsdWUubXMgfHwgMCksIHRoaXMubmFtZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBuYW1lKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdncmVnb3JpYW4nXHJcbiAgICB9XHJcblxyXG4gICAgZGF5T2ZNb250aChkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gZGF0ZS5nZXREYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZGF5T2ZZZWFyKGRhdGU6IERhdGUpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSAwO1xyXG4gICAgICAgIGxldCBtID0gWzMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdO1xyXG4gICAgICAgIGlmICh0aGlzLmlzTGVhcChkYXRlKSkge1xyXG4gICAgICAgICAgICBtWzFdID0gMjk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0ZS5nZXRNb250aCgpOyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbVtpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzdWx0ICs9IGRhdGUuZ2V0RGF0ZSgpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZGF5T2ZXZWVrKGRhdGU6IERhdGUpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBkYXRlLmdldERheSgpICsgMTtcclxuICAgIH1cclxuXHJcbiAgICB3ZWVrT2ZZZWFyKGRhdGU6IERhdGUpOiBudW1iZXIge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0RGF5ID0gbmV3IEFYRGF0ZVRpbWUoZGF0ZSkuc3RhcnRPZigneWVhcicpO1xyXG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwoKCgoZGF0ZS5nZXRUaW1lKCkgLSBmaXJzdERheS5kYXRlLmdldFRpbWUoKSkgLyA4NjQwMDAwMCkgKyBmaXJzdERheS5kYXRlLmdldERheSgpICsgMSkgLyA3KTtcclxuICAgIH1cclxuXHJcbiAgICB5ZWFyKGRhdGU6IERhdGUpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbW9udGhPZlllYXIoZGF0ZTogRGF0ZSk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGUuZ2V0TW9udGgoKSArIDE7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkKGRhdGU6IERhdGUsIHVuaXQ6IFRpbWVVbml0LCBhbW91bnQ6IG51bWJlcik6IEFYRGF0ZVRpbWUge1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IGRhdGUudmFsdWVPZigpO1xyXG4gICAgICAgIHN3aXRjaCAodW5pdCkge1xyXG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxyXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gMTAwMCAqIGFtb3VudDtcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSA2MDAwMCAqIGFtb3VudDtcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxyXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gMzYwMDAwMCAqIGFtb3VudDtcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcclxuICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgbW8gPSBkYXRlLmdldE1vbnRoKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgeXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgICAgICAgICAgICAgICBtbyA9IChtbyArIGFtb3VudCkgJSAxMjtcclxuICAgICAgICAgICAgICAgIGlmICgwID4gbW8pIHtcclxuICAgICAgICAgICAgICAgICAgICB5ciArPSAoZGF0ZS5nZXRNb250aCgpICsgYW1vdW50IC0gbW8gLSAxMikgLyAxMjtcclxuICAgICAgICAgICAgICAgICAgICBtbyArPSAxMjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB5ciArPSAoKGRhdGUuZ2V0TW9udGgoKSArIGFtb3VudCAtIG1vKSAvIDEyKTtcclxuICAgICAgICAgICAgICAgIHYuc2V0TW9udGgobW8pO1xyXG4gICAgICAgICAgICAgICAgdi5zZXRGdWxsWWVhcih5cik7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHYudmFsdWVPZigpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgY2FzZSAnd2Vlayc6XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSA3ICogODY0MDAwMDAgKiBhbW91bnQ7XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcclxuICAgICAgICAgICAgICAgIGNvbnN0IHl2ID0gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgeXYuc2V0RnVsbFllYXIoeXYuZ2V0RnVsbFllYXIoKSArIGFtb3VudCk7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHl2LnZhbHVlT2YoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSA4NjQwMDAwMCAqIGFtb3VudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKG5ldyBEYXRlKHZhbHVlKSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldChkYXRlOiBEYXRlLCB1bml0OiBUaW1lVW5pdCwgdmFsdWU6IG51bWJlcik6IEFYRGF0ZVRpbWUge1xyXG4gICAgICAgIGNvbnN0IGNsb25lID0gbmV3IERhdGUoZGF0ZS52YWx1ZU9mKCkpO1xyXG4gICAgICAgIHN3aXRjaCAodW5pdCkge1xyXG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgY2xvbmUuZ2V0TWludXRlcygpLCB2YWx1ZSwgY2xvbmUuZ2V0TWlsbGlzZWNvbmRzKCkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCB2YWx1ZSwgY2xvbmUuZ2V0U2Vjb25kcygpLCBjbG9uZS5nZXRNaWxsaXNlY29uZHMoKSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnaG91cic6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3Vycyh2YWx1ZSwgY2xvbmUuZ2V0TWludXRlcygpLCBjbG9uZS5nZXRTZWNvbmRzKCksIGNsb25lLmdldE1pbGxpc2Vjb25kcygpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBjYXNlICdkYXknOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0RGF0ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIndlZWtcIjpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwibW9udGhcIjpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldE1vbnRoKE1hdGgubWF4KDAsIHZhbHVlIC0gMSkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ5ZWFyXCI6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRGdWxsWWVhcih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnRPZihkYXRlOiBEYXRlLCB1bml0OiBUaW1lVW5pdCk6IEFYRGF0ZVRpbWUge1xyXG4gICAgICAgIGNvbnN0IGNsb25lID0gbmV3IERhdGUoZGF0ZS52YWx1ZU9mKCkpO1xyXG4gICAgICAgIHN3aXRjaCAodW5pdCkge1xyXG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgY2xvbmUuZ2V0TWludXRlcygpLCBjbG9uZS5nZXRTZWNvbmRzKCksIDApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCBjbG9uZS5nZXRNaW51dGVzKCksIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgMCwgMCwgMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgY2FzZSAnZGF5JzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKDAsIDAsIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ3ZWVrXCI6XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGluZGV4ID49IDAgPyBpbmRleCA6IDA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXkgPSBjbG9uZS5nZXREYXkoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpZmYgPSBjbG9uZS5nZXREYXRlKCkgLSBkYXkgKyAoc3RhcnQgPiBkYXkgPyBzdGFydCAtIDcgOiBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXREYXRlKGRpZmYpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSkuc3RhcnRPZignZGF5Jyk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJtb250aFwiOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0RGF0ZSgxKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSkuc3RhcnRPZignZGF5Jyk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ5ZWFyXCI6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRNb250aCgwKTtcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldERhdGUoMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKS5zdGFydE9mKCdkYXknKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZW5kT2YoZGF0ZTogRGF0ZSwgdW5pdDogVGltZVVuaXQpOiBBWERhdGVUaW1lIHtcclxuICAgICAgICBjb25zdCBjbG9uZSA9IG5ldyBEYXRlKGRhdGUudmFsdWVPZigpKTtcclxuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcclxuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIGNsb25lLmdldE1pbnV0ZXMoKSwgY2xvbmUuZ2V0U2Vjb25kcygpLCA5OTkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCBjbG9uZS5nZXRNaW51dGVzKCksIDU5LCA5OTkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgNTksIDU5LCA5OTkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZihkYXRlLCAnd2VlaycpLmFkZCgnZGF5JywgNikuZW5kT2YoJ2RheScpO1xyXG4gICAgICAgICAgICBjYXNlICdtb250aCc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUobmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCAwKSwgdGhpcy5uYW1lKCkpLmVuZE9mKCdkYXknKTtcclxuICAgICAgICAgICAgY2FzZSBcInllYXJcIjpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldE1vbnRoKDExKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpLmVuZE9mKCdtb250aCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpc0xlYXAoZGF0ZTogRGF0ZSkge1xyXG4gICAgICAgIGxldCBsZWFwWWVhciA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgMSwgMjkpO1xyXG4gICAgICAgIHJldHVybiBsZWFwWWVhci5nZXREYXRlKCkgPT0gMjk7XHJcbiAgICB9XHJcbn0iXX0=
|
@@ -0,0 +1,357 @@
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamFsYWxpLmNhbGVuZGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWNvcmV4L2NvcmUvZGF0ZVRpbWUvc3JjL2phbGFsaS5jYWxlbmRhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsVUFBVSxFQUF5QixNQUFNLGtCQUFrQixDQUFDO0FBRWpGLE1BQU0sT0FBTyxjQUFjO0lBRXZCLFVBQVUsR0FBRyxDQUFDLG9FQUFvRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRS9GLGVBQWUsR0FBRyxDQUFDLG9FQUFvRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRXBHLFFBQVEsR0FBRyxDQUFDLG1EQUFtRCxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTVFLGFBQWEsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRzNDLE1BQU0sQ0FBQyxLQUFrQjtRQUNyQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEUsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3RLLENBQUM7SUFFRCxJQUFJO1FBQ0EsT0FBTyxRQUFRLENBQUE7SUFDbkIsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDbkMsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFVO1FBQ2hCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQzNGLENBQUM7SUFFRCxTQUFTLENBQUMsSUFBVTtRQUNoQixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVU7UUFDakIscUJBQXFCO1FBQ3JCLE1BQU0sUUFBUSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pILENBQUM7SUFFRCxJQUFJLENBQUMsSUFBVTtRQUNYLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDcEMsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFVO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDckMsQ0FBQztJQUdELEdBQUcsQ0FBQyxJQUFVLEVBQUUsSUFBYyxFQUFFLE1BQWM7UUFDMUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNCLFFBQVEsSUFBSSxFQUFFO1lBQ1YsS0FBSyxRQUFRO2dCQUNULEtBQUssSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDO2dCQUN2QixNQUFLO1lBQ1QsS0FBSyxRQUFRO2dCQUNULEtBQUssSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDO2dCQUN4QixNQUFLO1lBQ1QsS0FBSyxNQUFNO2dCQUNQLEtBQUssSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO2dCQUMxQixNQUFLO1lBQ1QsS0FBSyxPQUFPO2dCQUNSO29CQUNJLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUMxQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMvQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN6QixNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQztvQkFDekIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQy9DLEVBQUUsSUFBSSxFQUFFLENBQUM7b0JBQ1QsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztvQkFDcEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUN4QyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO29CQUNoQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO29CQUMxQixDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO29CQUN4QixLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNwQixNQUFLO2lCQUNSO1lBQ0wsS0FBSyxNQUFNO2dCQUNQLEtBQUssSUFBSSxDQUFDLEdBQUcsUUFBUSxHQUFHLE1BQU0sQ0FBQztnQkFDL0IsTUFBSztZQUNULEtBQUssTUFBTTtnQkFDUDtvQkFDSSw2QkFBNkI7b0JBQzdCLDJDQUEyQztvQkFDM0MsdUJBQXVCO29CQUN2QixRQUFRO29CQUNSLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUMxQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMvQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN6QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUNqRCxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO29CQUNoQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO29CQUMxQixDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO29CQUN4QixLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNwQixNQUFLO2lCQUNSO1lBQ0wsS0FBSyxLQUFLLENBQUM7WUFDWDtnQkFDSSxLQUFLLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQztTQUNsQztRQUNELE9BQU8sSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELEdBQUcsQ0FBQyxJQUFVLEVBQUUsSUFBYyxFQUFFLEtBQWE7UUFDekMsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxRQUFRLElBQUksRUFBRTtZQUNWLEtBQUssUUFBUTtnQkFDVCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRixNQUFNO1lBQ1YsS0FBSyxRQUFRO2dCQUNULEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7Z0JBQ3JGLE1BQU07WUFDVixLQUFLLE1BQU07Z0JBQ1AsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztnQkFDdkYsTUFBTTtZQUNWLFFBQVE7WUFDUixLQUFLLEtBQUs7Z0JBQ04sTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQy9ELEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQy9CLE1BQU07WUFDVixLQUFLLE1BQU07Z0JBQ1AsTUFBTTtZQUNWLEtBQUssT0FBTztnQkFDUixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDOUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDbEMsTUFBTTtZQUNWLEtBQUssTUFBTTtnQkFDUCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDL0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDeEMsTUFBTTtTQUNiO1FBQ0QsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFVLEVBQUUsSUFBYztRQUM5QixNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN2QyxRQUFRLElBQUksRUFBRTtZQUNWLEtBQUssUUFBUTtnQkFDVCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM1RSxPQUFPLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM5QyxLQUFLLFFBQVE7Z0JBQ1QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDM0QsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDOUMsS0FBSyxNQUFNO2dCQUNQLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzFDLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLFFBQVE7WUFDUixLQUFLLEtBQUs7Z0JBQ04sS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDM0IsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDOUMsS0FBSyxNQUFNO2dCQUNQLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwRyxLQUFLLE9BQU87Z0JBQ1I7b0JBQ0ksTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDM0IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDbEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMxQyxPQUFPLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzVEO1lBQ0wsS0FBSyxNQUFNO2dCQUNQO29CQUNJLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDekMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUM1RDtTQUNSO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFVLEVBQUUsSUFBYztRQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN2QyxRQUFRLElBQUksRUFBRTtZQUNWLEtBQUssUUFBUTtnQkFDVCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUM5RSxPQUFPLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM5QyxLQUFLLFFBQVE7Z0JBQ1QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDOUQsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDOUMsS0FBSyxNQUFNO2dCQUNQLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQzlDLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLFFBQVE7WUFDUixLQUFLLEtBQUs7Z0JBQ04sS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDaEMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDOUMsS0FBSyxNQUFNO2dCQUNQO29CQUNJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ2hFO1lBQ0wsS0FBSyxPQUFPO2dCQUNSO29CQUNJLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2xDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUNwQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQzNDLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDMUQ7WUFDTCxLQUFLLE1BQU07Z0JBQ1AsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDekIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pFLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM5RDtJQUNMLENBQUM7SUFJRCxRQUFRLENBQUMsSUFBVTtRQUNmLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM5QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMxQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3hDLE9BQU87WUFDSCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDVixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDWCxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUU7U0FDWixDQUFBO0lBQ0wsQ0FBQztJQUVEOztNQUVFO0lBQ0YsV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUNsQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3hDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOztNQUVFO0lBQ0YsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUNkLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJO1lBQzFCLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7WUFDbkIsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDakQsQ0FBQztJQUVEOztNQUVFO0lBQ0YsVUFBVSxDQUFDLEVBQUU7UUFDVCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQTtJQUNyQyxDQUFDO0lBRUQ7O01BRUU7SUFDRixXQUFXLENBQUMsRUFBRSxFQUFFLEVBQUU7UUFDZCxJQUFJLEVBQUUsSUFBSSxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUE7UUFDdEIsSUFBSSxFQUFFLElBQUksRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFBO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQTtRQUNsQyxPQUFPLEVBQUUsQ0FBQTtJQUNiLENBQUM7SUFHTyxNQUFNLENBQUMsRUFBRTtRQUNiLDJDQUEyQztRQUMzQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUk7WUFDN0QsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJO1NBQ3pELEVBQ0ssRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQ2xCLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUNiLEtBQUssR0FBRyxDQUFDLEVBQUUsRUFDWCxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUNkLEVBQUUsRUFDRixJQUFJLEVBQ0osSUFBSSxFQUNKLEtBQUssRUFDTCxLQUFLLEVBQ0wsQ0FBQyxFQUNELENBQUMsQ0FBQTtRQUVQLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUVqRCxtREFBbUQ7UUFDbkQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN4QixFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2QsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUE7WUFDZCxJQUFJLEVBQUUsR0FBRyxFQUFFO2dCQUNQLE1BQUs7WUFDVCxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQ3hFLEVBQUUsR0FBRyxFQUFFLENBQUE7U0FDVjtRQUNELENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFBO1FBRVgsNkRBQTZEO1FBQzdELHVEQUF1RDtRQUN2RCxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUN0RSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDMUMsS0FBSyxJQUFJLENBQUMsQ0FBQTtRQUVkLDhEQUE4RDtRQUM5RCxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUE7UUFFeEUscURBQXFEO1FBQ3JELEtBQUssR0FBRyxFQUFFLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUUxQiw0REFBNEQ7UUFDNUQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDWixDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQzlDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0MsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDYixJQUFJLEdBQUcsQ0FBQyxDQUFBO1NBQ1g7UUFFRCxPQUFPO1lBQ0gsSUFBSSxFQUFFLElBQUk7WUFDUixFQUFFLEVBQUUsRUFBRTtZQUNOLEtBQUssRUFBRSxLQUFLO1NBQ2pCLENBQUE7SUFDTCxDQUFDO0lBRUQ7Ozs7OztNQU1FO0lBQ00sR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUNsQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDM0YsQ0FBQztJQUVEOzs7Ozs7O01BT0U7SUFDTSxHQUFHLENBQUMsR0FBRztRQUNYLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLGlDQUFpQztVQUNyRCxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFDYixDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFDbkIsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQ2hDLEVBQUUsRUFDRixFQUFFLEVBQ0YsQ0FBQyxDQUFBO1FBRVAscURBQXFEO1FBQ3JELENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFBO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ1IsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFO2dCQUNWLHNCQUFzQjtnQkFDdEIsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtnQkFDeEIsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDeEIsT0FBTztvQkFDSCxFQUFFLEVBQUUsRUFBRTtvQkFDSixFQUFFLEVBQUUsRUFBRTtvQkFDTixFQUFFLEVBQUUsRUFBRTtpQkFDWCxDQUFBO2FBQ0o7aUJBQU07Z0JBQ0gsd0JBQXdCO2dCQUN4QixDQUFDLElBQUksR0FBRyxDQUFBO2FBQ1g7U0FDSjthQUFNO1lBQ0gseUJBQXlCO1lBQ3pCLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDUCxDQUFDLElBQUksR0FBRyxDQUFBO1lBQ1IsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7Z0JBQ1osQ0FBQyxJQUFJLENBQUMsQ0FBQTtTQUNiO1FBQ0QsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUN4QixFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3hCLE9BQU87WUFDSCxFQUFFLEVBQUUsRUFBRTtZQUNKLEVBQUUsRUFBRSxFQUFFO1lBQ04sRUFBRSxFQUFFLEVBQUU7U0FDWCxDQUFBO0lBQ0wsQ0FBQztJQUdPLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7UUFDbEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztjQUN6RCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztjQUMzQyxFQUFFLEdBQUcsUUFBUSxDQUFBO1FBQ25CLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUE7UUFDL0UsT0FBTyxDQUFDLENBQUE7SUFDWixDQUFDO0lBR08sR0FBRyxDQUFDLEdBQUc7UUFDWCxJQUFJLENBQUMsRUFDQyxDQUFDLEVBQ0QsRUFBRSxFQUNGLEVBQUUsRUFDRixFQUFFLENBQUE7UUFDUixDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUE7UUFDdkIsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxTQUFTLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUE7UUFDekUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQTtRQUM1QyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDdEMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3ZDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3JELE9BQU87WUFDSCxFQUFFLEVBQUUsRUFBRTtZQUNKLEVBQUUsRUFBRSxFQUFFO1lBQ04sRUFBRSxFQUFFLEVBQUU7U0FDWCxDQUFBO0lBQ0wsQ0FBQztJQUVEOztNQUVFO0lBQ00sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1osT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDcEIsQ0FBQztJQUVPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDNUIsQ0FBQztDQUVKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhDYWxlbmRhciwgQVhEYXRlVGltZSwgQVhEYXRlVmFsdWUsIFRpbWVVbml0IH0gZnJvbSBcIi4vZGF0ZXRpbWUuY2xhc3NcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBKYWxhbGlDYWxlbmRhciBpbXBsZW1lbnRzIEFYQ2FsZW5kYXIge1xyXG5cclxuICAgIG1vbnRoTmFtZXMgPSAoXCLZgdix2YjYsdiv24zZhl/Yp9ix2K/bjNio2YfYtNiqX9iu2LHYr9in2K9f2KrbjNixX9mF2LHYr9in2K9f2LTZh9ix24zZiNixX9mF2YfYsV/Yotio2KfZhl/Yotiw2LFf2K/bjF/YqNmH2YXZhl/Yp9iz2YHZhtivXCIpLnNwbGl0KFwiX1wiKTtcclxuXHJcbiAgICBtb250aFNob3J0TmFtZXMgPSAoXCLZgdix2YjYsdiv24zZhl/Yp9ix2K/bjNio2YfYtNiqX9iu2LHYr9in2K9f2KrbjNixX9mF2LHYr9in2K9f2LTZh9ix24zZiNixX9mF2YfYsV/Yotio2KfZhl/Yotiw2LFf2K/bjF/YqNmH2YXZhl/Yp9iz2YHZhtivXCIpLnNwbGl0KFwiX1wiKTtcclxuXHJcbiAgICBkYXlOYW1lcyA9IChcIti02YbYqNmHX9uM2qnYtNmG2KjZh1/Yr9mI2LTZhtio2Ydf2LPZhyDYtNmG2KjZh1/ahtmH2KfYsdi02YbYqNmHX9m+2YbYrCDYtNmG2KjZh1/YrNmF2LnZh1wiKS5zcGxpdChcIl9cIik7XHJcblxyXG4gICAgZGF5U2hvcnROYW1lcyA9IFwi2LRf24xf2K9f2LNf2oZf2b5f2KxcIi5zcGxpdChcIl9cIik7XHJcblxyXG5cclxuICAgIGNyZWF0ZSh2YWx1ZTogQVhEYXRlVmFsdWUpOiBBWERhdGVUaW1lIHtcclxuICAgICAgICBjb25zdCBhID0gdGhpcy50b0dyZWdvcmlhbih2YWx1ZS55ZWFyLCB2YWx1ZS5tb250aCwgdmFsdWUuZGF0ZSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKG5ldyBEYXRlKGEuZ2V0RnVsbFllYXIoKSwgYS5nZXRNb250aCgpLCBhLmdldERhdGUoKSwgdmFsdWUuaG91cnMgfHwgMCwgdmFsdWUubWludXRlcyB8fCAwLCB2YWx1ZS5zZWNvbmRzIHx8IDAsIHZhbHVlLm1zIHx8IDApLCB0aGlzLm5hbWUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiAnamFsYWxpJ1xyXG4gICAgfVxyXG5cclxuICAgIGRheU9mTW9udGgoZGF0ZTogRGF0ZSk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudG9KYWxhbGkoZGF0ZSkuZGF5O1xyXG4gICAgfVxyXG5cclxuICAgIGRheU9mWWVhcihkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBqID0gdGhpcy50b0phbGFsaShkYXRlKTtcclxuICAgICAgICByZXR1cm4gKGoubW9udGggPD0gNiA/ICgoai5tb250aCAtIDEpICogMzEpIDogKCg2ICogMzEpICsgKGoubW9udGggLSA3KSAqIDMwKSkgKyBqLmRheTtcclxuICAgIH1cclxuXHJcbiAgICBkYXlPZldlZWsoZGF0ZTogRGF0ZSk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGUuZ2V0RGF5KCkgPT0gNiA/IDEgOiBkYXRlLmdldERheSgpICsgMjtcclxuICAgIH1cclxuXHJcbiAgICB3ZWVrT2ZZZWFyKGRhdGU6IERhdGUpOiBudW1iZXIge1xyXG4gICAgICAgIC8vVE9ETyA6IGFwcGx5IGphbGFsaVxyXG4gICAgICAgIGNvbnN0IGZpcnN0RGF5ID0gbmV3IEFYRGF0ZVRpbWUoZGF0ZSkuc3RhcnRPZigneWVhcicpO1xyXG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwoKCgoZGF0ZS5nZXRUaW1lKCkgLSBmaXJzdERheS5kYXRlLmdldFRpbWUoKSkgLyA4NjQwMDAwMCkgKyBmaXJzdERheS5kYXRlLmdldERheSgpICsgMSkgLyA3KTtcclxuICAgIH1cclxuXHJcbiAgICB5ZWFyKGRhdGU6IERhdGUpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRvSmFsYWxpKGRhdGUpLnllYXI7XHJcbiAgICB9XHJcblxyXG4gICAgbW9udGhPZlllYXIoZGF0ZTogRGF0ZSk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudG9KYWxhbGkoZGF0ZSkubW9udGg7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGFkZChkYXRlOiBEYXRlLCB1bml0OiBUaW1lVW5pdCwgYW1vdW50OiBudW1iZXIpOiBBWERhdGVUaW1lIHtcclxuICAgICAgICBsZXQgdmFsdWUgPSBkYXRlLnZhbHVlT2YoKTtcclxuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcclxuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcclxuICAgICAgICAgICAgICAgIHZhbHVlICs9IDEwMDAgKiBhbW91bnQ7XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxyXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gNjAwMDAgKiBhbW91bnQ7XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICBjYXNlICdob3VyJzpcclxuICAgICAgICAgICAgICAgIHZhbHVlICs9IDM2MDAwMDAgKiBhbW91bnQ7XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICBjYXNlICdtb250aCc6XHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IG5ldyBEYXRlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgamQgPSB0aGlzLmRheU9mTW9udGgoZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGptID0gdGhpcy5tb250aE9mWWVhcihkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgankgPSB0aGlzLnllYXIoZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm0gPSAoam0gKyBhbW91bnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG55ID0gKG5tICUgMTIpID8gTWF0aC5mbG9vcihubSAvIDEyKSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgankgKz0gbnk7XHJcbiAgICAgICAgICAgICAgICAgICAgam0gPSBubSAtIChueSAqIDEyKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2diA9IHRoaXMudG9HcmVnb3JpYW4oanksIGptLCBqZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdi5zZXRGdWxsWWVhcih2di5nZXRGdWxsWWVhcigpKTtcclxuICAgICAgICAgICAgICAgICAgICB2LnNldE1vbnRoKHZ2LmdldE1vbnRoKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHYuc2V0RGF0ZSh2di5nZXREYXRlKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdi52YWx1ZU9mKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSAnd2Vlayc6XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSA3ICogODY0MDAwMDAgKiBhbW91bnQ7XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCB2ID0gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHYuc2V0RnVsbFllYXIodi5nZXRGdWxsWWVhcigpICsgYW1vdW50KTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSA9IHYudmFsdWVPZigpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGJyZWFrXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IG5ldyBEYXRlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgamQgPSB0aGlzLmRheU9mTW9udGgoZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGptID0gdGhpcy5tb250aE9mWWVhcihkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgankgPSB0aGlzLnllYXIoZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdnYgPSB0aGlzLnRvR3JlZ29yaWFuKGp5ICsgYW1vdW50LCBqbSwgamQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHYuc2V0RnVsbFllYXIodnYuZ2V0RnVsbFllYXIoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdi5zZXRNb250aCh2di5nZXRNb250aCgpKTtcclxuICAgICAgICAgICAgICAgICAgICB2LnNldERhdGUodnYuZ2V0RGF0ZSgpKTtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHYudmFsdWVPZigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSA4NjQwMDAwMCAqIGFtb3VudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKG5ldyBEYXRlKHZhbHVlKSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldChkYXRlOiBEYXRlLCB1bml0OiBUaW1lVW5pdCwgdmFsdWU6IG51bWJlcik6IEFYRGF0ZVRpbWUge1xyXG4gICAgICAgIGNvbnN0IGNsb25lID0gbmV3IERhdGUoZGF0ZS52YWx1ZU9mKCkpO1xyXG4gICAgICAgIGNvbnN0IGpEYXRlID0gdGhpcy50b0phbGFsaShjbG9uZSk7XHJcbiAgICAgICAgc3dpdGNoICh1bml0KSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCBjbG9uZS5nZXRNaW51dGVzKCksIHZhbHVlLCBjbG9uZS5nZXRNaWxsaXNlY29uZHMoKSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIHZhbHVlLCBjbG9uZS5nZXRTZWNvbmRzKCksIGNsb25lLmdldE1pbGxpc2Vjb25kcygpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdob3VyJzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKHZhbHVlLCBjbG9uZS5nZXRNaW51dGVzKCksIGNsb25lLmdldFNlY29uZHMoKSwgY2xvbmUuZ2V0TWlsbGlzZWNvbmRzKCkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnRGF0ZSA9IHRoaXMudG9HcmVnb3JpYW4oakRhdGUueWVhciwgakRhdGUubW9udGgsIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldERhdGUoZ0RhdGUuZ2V0RGF0ZSgpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwid2Vla1wiOlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJtb250aFwiOlxyXG4gICAgICAgICAgICAgICAgY29uc3QgZ0RhdGUyID0gdGhpcy50b0dyZWdvcmlhbihqRGF0ZS55ZWFyLCB2YWx1ZSwgakRhdGUuZGF5KTtcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldE1vbnRoKGdEYXRlMi5nZXRNb250aCgpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwieWVhclwiOlxyXG4gICAgICAgICAgICAgICAgY29uc3QgZ0RhdGUzID0gdGhpcy50b0dyZWdvcmlhbih2YWx1ZSwgakRhdGUubW9udGgsIGpEYXRlLmRheSk7XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRGdWxsWWVhcihnRGF0ZTMuZ2V0RnVsbFllYXIoKSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnRPZihkYXRlOiBEYXRlLCB1bml0OiBUaW1lVW5pdCk6IEFYRGF0ZVRpbWUge1xyXG4gICAgICAgIGNvbnN0IGNsb25lID0gbmV3IERhdGUoZGF0ZS52YWx1ZU9mKCkpO1xyXG4gICAgICAgIHN3aXRjaCAodW5pdCkge1xyXG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgY2xvbmUuZ2V0TWludXRlcygpLCBjbG9uZS5nZXRTZWNvbmRzKCksIDApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCBjbG9uZS5nZXRNaW51dGVzKCksIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgMCwgMCwgMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgY2FzZSAnZGF5JzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKDAsIDAsIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGNsb25lLCB0aGlzLm5hbWUoKSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ3ZWVrXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoY2xvbmUsIHRoaXMubmFtZSgpKS5hZGQoJ2RheScsIC10aGlzLmRheU9mV2VlayhjbG9uZSkgKyAxKS5zdGFydE9mKCdkYXknKTtcclxuICAgICAgICAgICAgY2FzZSBcIm1vbnRoXCI6XHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgankgPSB0aGlzLnllYXIoZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgam0gPSB0aGlzLm1vbnRoT2ZZZWFyKGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdEYXRlID0gdGhpcy50b0dyZWdvcmlhbihqeSwgam0sIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShnRGF0ZSwgdGhpcy5uYW1lKCkpLnN0YXJ0T2YoJ2RheScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIFwieWVhclwiOlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGp5ID0gdGhpcy55ZWFyKGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdEYXRlID0gdGhpcy50b0dyZWdvcmlhbihqeSwgMSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBWERhdGVUaW1lKGdEYXRlLCB0aGlzLm5hbWUoKSkuc3RhcnRPZignZGF5Jyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVuZE9mKGRhdGU6IERhdGUsIHVuaXQ6IFRpbWVVbml0KTogQVhEYXRlVGltZSB7XHJcbiAgICAgICAgY29uc3QgY2xvbmUgPSBuZXcgRGF0ZShkYXRlLnZhbHVlT2YoKSk7XHJcbiAgICAgICAgc3dpdGNoICh1bml0KSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XHJcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRIb3VycyhjbG9uZS5nZXRIb3VycygpLCBjbG9uZS5nZXRNaW51dGVzKCksIGNsb25lLmdldFNlY29uZHMoKSwgOTk5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoY2xvbmUuZ2V0SG91cnMoKSwgY2xvbmUuZ2V0TWludXRlcygpLCA1OSwgOTk5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBjYXNlICdob3VyJzpcclxuICAgICAgICAgICAgICAgIGNsb25lLnNldEhvdXJzKGNsb25lLmdldEhvdXJzKCksIDU5LCA1OSwgOTk5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBjYXNlICdkYXknOlxyXG4gICAgICAgICAgICAgICAgY2xvbmUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShjbG9uZSwgdGhpcy5uYW1lKCkpO1xyXG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydE9mKGRhdGUsICd3ZWVrJykuYWRkKCdkYXknLCA2KS5lbmRPZignZGF5Jyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBqeSA9IHRoaXMueWVhcihkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBqbSA9IHRoaXMubW9udGhPZlllYXIoZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgamQgPSB0aGlzLm1vbnRoTGVuZ3RoKGp5LCBqbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ0RhdGUgPSB0aGlzLnRvR3JlZ29yaWFuKGp5LCBqbSwgamQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQVhEYXRlVGltZShnRGF0ZSwgdGhpcy5uYW1lKCkpLmVuZE9mKCdkYXknKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBcInllYXJcIjpcclxuICAgICAgICAgICAgICAgIGxldCBqeSA9IHRoaXMueWVhcihkYXRlKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdEYXRlID0gdGhpcy50b0dyZWdvcmlhbihqeSwgMTIsIHRoaXMubW9udGhMZW5ndGgoanksIDEyKSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFYRGF0ZVRpbWUoZ0RhdGUsIHRoaXMubmFtZSgpKS5lbmRPZignZGF5Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgdG9KYWxhbGkoZGF0ZTogRGF0ZSk6IHsgeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyLCBkYXk6IG51bWJlciB9IHtcclxuICAgICAgICBjb25zdCBneSA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgICBjb25zdCBnbSA9IGRhdGUuZ2V0TW9udGgoKSArIDE7XHJcbiAgICAgICAgY29uc3QgZ2QgPSBkYXRlLmdldERhdGUoKTtcclxuICAgICAgICBjb25zdCByID0gdGhpcy5kMmoodGhpcy5nMmQoZ3ksIGdtLCBnZCkpXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgeWVhcjogci5qeSxcclxuICAgICAgICAgICAgbW9udGg6IHIuam0sXHJcbiAgICAgICAgICAgIGRheTogci5qZCxcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAgQ29udmVydHMgYSBKYWxhYWxpIGRhdGUgdG8gR3JlZ29yaWFuLlxyXG4gICAgKi9cclxuICAgIHRvR3JlZ29yaWFuKGp5LCBqbSwgamQpIHtcclxuICAgICAgICBjb25zdCBnID0gdGhpcy5kMmcodGhpcy5qMmQoanksIGptLCBqZCkpXHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGcuZ3ksIGcuZ20gLSAxLCBnLmdkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICBDaGVja3Mgd2hldGhlciBhIEphbGFhbGkgZGF0ZSBpcyB2YWxpZCBvciBub3QuXHJcbiAgICAqL1xyXG4gICAgaXNWYWxpZChqeSwgam0sIGpkKSB7XHJcbiAgICAgICAgcmV0dXJuIGp5ID49IC02MSAmJiBqeSA8PSAzMTc3ICYmXHJcbiAgICAgICAgICAgIGptID49IDEgJiYgam0gPD0gMTIgJiZcclxuICAgICAgICAgICAgamQgPj0gMSAmJiBqZCA8PSB0aGlzLm1vbnRoTGVuZ3RoKGp5LCBqbSlcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICBJcyB0aGlzIGEgbGVhcCB5ZWFyIG9yIG5vdD9cclxuICAgICovXHJcbiAgICBpc0xlYXBZZWFyKGp5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuamFsQ2FsKGp5KS5sZWFwID09PSAwXHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAgTnVtYmVyIG9mIGRheXMgaW4gYSBnaXZlbiBtb250aCBpbiBhIEphbGFhbGkgeWVhci5cclxuICAgICovXHJcbiAgICBtb250aExlbmd0aChqeSwgam0pIHtcclxuICAgICAgICBpZiAoam0gPD0gNikgcmV0dXJuIDMxXHJcbiAgICAgICAgaWYgKGptIDw9IDExKSByZXR1cm4gMzBcclxuICAgICAgICBpZiAodGhpcy5pc0xlYXBZZWFyKGp5KSkgcmV0dXJuIDMwXHJcbiAgICAgICAgcmV0dXJuIDI5XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgamFsQ2FsKGp5KSB7XHJcbiAgICAgICAgLy8gSmFsYWFsaSB5ZWFycyBzdGFydGluZyB0aGUgMzMteWVhciBydWxlLlxyXG4gICAgICAgIGxldCBicmVha3MgPSBbLTYxLCA5LCAzOCwgMTk5LCA0MjYsIDY4NiwgNzU2LCA4MTgsIDExMTEsIDExODEsIDEyMTBcclxuICAgICAgICAgICAgLCAxNjM1LCAyMDYwLCAyMDk3LCAyMTkyLCAyMjYyLCAyMzI0LCAyMzk0LCAyNDU2LCAzMTc4XHJcbiAgICAgICAgXVxyXG4gICAgICAgICAgICAsIGJsID0gYnJlYWtzLmxlbmd0aFxyXG4gICAgICAgICAgICAsIGd5ID0gankgKyA2MjFcclxuICAgICAgICAgICAgLCBsZWFwSiA9IC0xNFxyXG4gICAgICAgICAgICAsIGpwID0gYnJlYWtzWzBdXHJcbiAgICAgICAgICAgICwgam1cclxuICAgICAgICAgICAgLCBqdW1wXHJcbiAgICAgICAgICAgICwgbGVhcFxyXG4gICAgICAgICAgICAsIGxlYXBHXHJcbiAgICAgICAgICAgICwgbWFyY2hcclxuICAgICAgICAgICAgLCBuXHJcbiAgICAgICAgICAgICwgaVxyXG5cclxuICAgICAgICBpZiAoankgPCBqcCB8fCBqeSA+PSBicmVha3NbYmwgLSAxXSlcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEphbGFhbGkgeWVhciAnICsgankpXHJcblxyXG4gICAgICAgIC8vIEZpbmQgdGhlIGxpbWl0aW5nIHllYXJzIGZvciB0aGUgSmFsYWFsaSB5ZWFyIGp5LlxyXG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBibDsgaSArPSAxKSB7XHJcbiAgICAgICAgICAgIGptID0gYnJlYWtzW2ldXHJcbiAgICAgICAgICAgIGp1bXAgPSBqbSAtIGpwXHJcbiAgICAgICAgICAgIGlmIChqeSA8IGptKVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgbGVhcEogPSBsZWFwSiArIHRoaXMuZGl2KGp1bXAsIDMzKSAqIDggKyB0aGlzLmRpdih0aGlzLm1vZChqdW1wLCAzMyksIDQpXHJcbiAgICAgICAgICAgIGpwID0gam1cclxuICAgICAgICB9XHJcbiAgICAgICAgbiA9IGp5IC0ganBcclxuXHJcbiAgICAgICAgLy8gRmluZCB0aGUgbnVtYmVyIG9mIGxlYXAgeWVhcnMgZnJvbSBBRCA2MjEgdG8gdGhlIGJlZ2lubmluZ1xyXG4gICAgICAgIC8vIG9mIHRoZSBjdXJyZW50IEphbGFhbGkgeWVhciBpbiB0aGUgUGVyc2lhbiBjYWxlbmRhci5cclxuICAgICAgICBsZWFwSiA9IGxlYXBKICsgdGhpcy5kaXYobiwgMzMpICogOCArIHRoaXMuZGl2KHRoaXMubW9kKG4sIDMzKSArIDMsIDQpXHJcbiAgICAgICAgaWYgKHRoaXMubW9kKGp1bXAsIDMzKSA9PT0gNCAmJiBqdW1wIC0gbiA9PT0gNClcclxuICAgICAgICAgICAgbGVhcEogKz0gMVxyXG5cclxuICAgICAgICAvLyBBbmQgdGhlIHNhbWUgaW4gdGhlIEdyZWdvcmlhbiBjYWxlbmRhciAodW50aWwgdGhlIHllYXIgZ3kpLlxyXG4gICAgICAgIGxlYXBHID0gdGhpcy5kaXYoZ3ksIDQpIC0gdGhpcy5kaXYoKHRoaXMuZGl2KGd5LCAxMDApICsgMSkgKiAzLCA0KSAtIDE1MFxyXG5cclxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIEdyZWdvcmlhbiBkYXRlIG9mIEZhcnZhcmRpbiB0aGUgMXN0LlxyXG4gICAgICAgIG1hcmNoID0gMjAgKyBsZWFwSiAtIGxlYXBHXHJcblxyXG4gICAgICAgIC8vIEZpbmQgaG93IG1hbnkgeWVhcnMgaGF2ZSBwYXNzZWQgc2luY2UgdGhlIGxhc3QgbGVhcCB5ZWFyLlxyXG4gICAgICAgIGlmIChqdW1wIC0gbiA8IDYpXHJcbiAgICAgICAgICAgIG4gPSBuIC0ganVtcCArIHRoaXMuZGl2KGp1bXAgKyA0LCAzMykgKiAzM1xyXG4gICAgICAgIGxlYXAgPSB0aGlzLm1vZCh0aGlzLm1vZChuICsgMSwgMzMpIC0gMSwgNClcclxuICAgICAgICBpZiAobGVhcCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgbGVhcCA9IDRcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGxlYXA6IGxlYXBcclxuICAgICAgICAgICAgLCBneTogZ3lcclxuICAgICAgICAgICAgLCBtYXJjaDogbWFyY2hcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAgQ29udmVydHMgYSBkYXRlIG9mIHRoZSBKYWxhYWxpIGNhbGVuZGFyIHRvIHRoZSBKdWxpYW4gRGF5IG51bWJlci5cclxuICAgICAgQHBhcmFtIGp5IEphbGFhbGkgeWVhciAoMSB0byAzMTAwKVxyXG4gICAgICBAcGFyYW0gam0gSmFsYWFsaSBtb250aCAoMSB0byAxMilcclxuICAgICAgQHBhcmFtIGpkIEphbGFhbGkgZGF5ICgxIHRvIDI5LzMxKVxyXG4gICAgICBAcmV0dXJuIEp1bGlhbiBEYXkgbnVtYmVyXHJcbiAgICAqL1xyXG4gICAgcHJpdmF0ZSBqMmQoanksIGptLCBqZCkge1xyXG4gICAgICAgIGxldCByID0gdGhpcy5qYWxDYWwoankpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZzJkKHIuZ3ksIDMsIHIubWFyY2gpICsgKGptIC0gMSkgKiAzMSAtIHRoaXMuZGl2KGptLCA3KSAqIChqbSAtIDcpICsgamQgLSAxXHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAgQ29udmVydHMgdGhlIEp1bGlhbiBEYXkgbnVtYmVyIHRvIGEgZGF0ZSBpbiB0aGUgSmFsYWFsaSBjYWxlbmRhci5cclxuICAgICAgQHBhcmFtIGpkbiBKdWxpYW4gRGF5IG51bWJlclxyXG4gICAgICBAcmV0dXJuXHJcbiAgICAgICAgank6IEphbGFhbGkgeWVhciAoMSB0byAzMTAwKVxyXG4gICAgICAgIGptOiBKYWxhYWxpIG1vbnRoICgxIHRvIDEyKVxyXG4gICAgICAgIGpkOiBKYWxhYWxpIGRheSAoMSB0byAyOS8zMSlcclxuICAgICovXHJcbiAgICBwcml2YXRlIGQyaihqZG4pIHtcclxuICAgICAgICBsZXQgZ3kgPSB0aGlzLmQyZyhqZG4pLmd5IC8vIENhbGN1bGF0ZSBHcmVnb3JpYW4geWVhciAoZ3kpLlxyXG4gICAgICAgICAgICAsIGp5ID0gZ3kgLSA2MjFcclxuICAgICAgICAgICAgLCByID0gdGhpcy5qYWxDYWwoankpXHJcbiAgICAgICAgICAgICwgamRuMWYgPSB0aGlzLmcyZChneSwgMywgci5tYXJjaClcclxuICAgICAgICAgICAgLCBqZFxyXG4gICAgICAgICAgICAsIGptXHJcbiAgICAgICAgICAgICwga1xyXG5cclxuICAgICAgICAvLyBGaW5kIG51bWJlciBvZiBkYXlzIHRoYXQgcGFzc2VkIHNpbmNlIDEgRmFydmFyZGluLlxyXG4gICAgICAgIGsgPSBqZG4gLSBqZG4xZlxyXG4gICAgICAgIGlmIChrID49IDApIHtcclxuICAgICAgICAgICAgaWYgKGsgPD0gMTg1KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3QgNiBtb250aHMuXHJcbiAgICAgICAgICAgICAgICBqbSA9IDEgKyB0aGlzLmRpdihrLCAzMSlcclxuICAgICAgICAgICAgICAgIGpkID0gdGhpcy5tb2QoaywgMzEpICsgMVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBqeToganlcclxuICAgICAgICAgICAgICAgICAgICAsIGptOiBqbVxyXG4gICAgICAgICAgICAgICAgICAgICwgamQ6IGpkXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUaGUgcmVtYWluaW5nIG1vbnRocy5cclxuICAgICAgICAgICAgICAgIGsgLT0gMTg2XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBQcmV2aW91cyBKYWxhYWxpIHllYXIuXHJcbiAgICAgICAgICAgIGp5IC09IDFcclxuICAgICAgICAgICAgayArPSAxNzlcclxuICAgICAgICAgICAgaWYgKHIubGVhcCA9PT0gMSlcclxuICAgICAgICAgICAgICAgIGsgKz0gMVxyXG4gICAgICAgIH1cclxuICAgICAgICBqbSA9IDcgKyB0aGlzLmRpdihrLCAzMClcclxuICAgICAgICBqZCA9IHRoaXMubW9kKGssIDMwKSArIDFcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBqeToganlcclxuICAgICAgICAgICAgLCBqbTogam1cclxuICAgICAgICAgICAgLCBqZDogamRcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgZzJkKGd5LCBnbSwgZ2QpIHtcclxuICAgICAgICBsZXQgZCA9IHRoaXMuZGl2KChneSArIHRoaXMuZGl2KGdtIC0gOCwgNikgKyAxMDAxMDApICogMTQ2MSwgNClcclxuICAgICAgICAgICAgKyB0aGlzLmRpdigxNTMgKiB0aGlzLm1vZChnbSArIDksIDEyKSArIDIsIDUpXHJcbiAgICAgICAgICAgICsgZ2QgLSAzNDg0MDQwOFxyXG4gICAgICAgIGQgPSBkIC0gdGhpcy5kaXYodGhpcy5kaXYoZ3kgKyAxMDAxMDAgKyB0aGlzLmRpdihnbSAtIDgsIDYpLCAxMDApICogMywgNCkgKyA3NTJcclxuICAgICAgICByZXR1cm4gZFxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIGQyZyhqZG4pIHtcclxuICAgICAgICBsZXQgalxyXG4gICAgICAgICAgICAsIGlcclxuICAgICAgICAgICAgLCBnZFxyXG4gICAgICAgICAgICAsIGdtXHJcbiAgICAgICAgICAgICwgZ3lcclxuICAgICAgICBqID0gNCAqIGpkbiArIDEzOTM2MTYzMVxyXG4gICAgICAgIGogPSBqICsgdGhpcy5kaXYodGhpcy5kaXYoNCAqIGpkbiArIDE4MzE4NzcyMCwgMTQ2MDk3KSAqIDMsIDQpICogNCAtIDM5MDhcclxuICAgICAgICBpID0gdGhpcy5kaXYodGhpcy5tb2QoaiwgMTQ2MSksIDQpICogNSArIDMwOFxyXG4gICAgICAgIGdkID0gdGhpcy5kaXYodGhpcy5tb2QoaSwgMTUzKSwgNSkgKyAxXHJcbiAgICAgICAgZ20gPSB0aGlzLm1vZCh0aGlzLmRpdihpLCAxNTMpLCAxMikgKyAxXHJcbiAgICAgICAgZ3kgPSB0aGlzLmRpdihqLCAxNDYxKSAtIDEwMDEwMCArIHRoaXMuZGl2KDggLSBnbSwgNilcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBneTogZ3lcclxuICAgICAgICAgICAgLCBnbTogZ21cclxuICAgICAgICAgICAgLCBnZDogZ2RcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAgVXRpbGl0eSBoZWxwZXIgZnVuY3Rpb25zLlxyXG4gICAgKi9cclxuICAgIHByaXZhdGUgZGl2KGEsIGIpIHtcclxuICAgICAgICByZXR1cm4gfn4oYSAvIGIpXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtb2QoYSwgYikge1xyXG4gICAgICAgIHJldHVybiBhIC0gfn4oYSAvIGIpICogYlxyXG4gICAgfVxyXG5cclxufSJdfQ==
|