merchi_checkout 1.2.6 → 1.2.8
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/lib/area.js +298 -0
- package/lib/components/JobInfoContent.js +310 -103
- package/lib/styles/globals.css +8 -2
- package/lib/styles/globals.css.map +1 -1
- package/lib/styles/globals.scss +8 -1
- package/lib/utils.js +4 -2
- package/package.json +2 -2
package/lib/area.js
ADDED
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/** Shared helpers for Area (height × width) variation fields. Stored value is always millimetres. */
|
|
2
|
+
|
|
3
|
+
var MM_PER_INCH = 25.4;
|
|
4
|
+
var MM_PER_FOOT = 304.8;
|
|
5
|
+
var MM_PER_CM = 10;
|
|
6
|
+
var MM_PER_M = 1000;
|
|
7
|
+
export function parseAreaValue(value) {
|
|
8
|
+
if (value == null) return null;
|
|
9
|
+
var text = String(value).trim();
|
|
10
|
+
if (!text) return null;
|
|
11
|
+
var parts = text.split(',').map(function (p) {
|
|
12
|
+
return p.trim();
|
|
13
|
+
});
|
|
14
|
+
if (parts.length !== 2) return null;
|
|
15
|
+
var heightMm = Number(parts[0]);
|
|
16
|
+
var widthMm = Number(parts[1]);
|
|
17
|
+
if (!Number.isFinite(heightMm) || !Number.isFinite(widthMm)) return null;
|
|
18
|
+
if (heightMm <= 0 || widthMm <= 0) return null;
|
|
19
|
+
return {
|
|
20
|
+
heightMm: heightMm,
|
|
21
|
+
widthMm: widthMm
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function formatAreaValue(heightMm, widthMm) {
|
|
25
|
+
var h = Number(heightMm);
|
|
26
|
+
var w = Number(widthMm);
|
|
27
|
+
if (!Number.isFinite(h) || !Number.isFinite(w) || h <= 0 || w <= 0) return '';
|
|
28
|
+
return "".concat(trimNum(h), ",").concat(trimNum(w));
|
|
29
|
+
}
|
|
30
|
+
function trimNum(n) {
|
|
31
|
+
return String(Number(n.toFixed(6)));
|
|
32
|
+
}
|
|
33
|
+
export function isImperialUnit(unit) {
|
|
34
|
+
var u = String(unit || 'mm').toLowerCase();
|
|
35
|
+
return u === 'in' || u === 'ft';
|
|
36
|
+
}
|
|
37
|
+
export function normaliseAreaUnit(unit) {
|
|
38
|
+
var u = String(unit || 'mm').toLowerCase();
|
|
39
|
+
if (u === 'cm' || u === 'm' || u === 'in' || u === 'ft' || u === 'mm') {
|
|
40
|
+
return u;
|
|
41
|
+
}
|
|
42
|
+
return 'mm';
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Imperial for en-US / en-LR / en-MM; otherwise metric (incl. en-GB). */
|
|
46
|
+
export function localePrefersImperial(locale) {
|
|
47
|
+
var lang = locale || (typeof navigator !== 'undefined' ? navigator.language : undefined) || '';
|
|
48
|
+
var normalized = lang.toLowerCase().replace('_', '-');
|
|
49
|
+
return normalized === 'en-us' || normalized === 'en-lr' || normalized === 'en-mm' || normalized.endsWith('-us') || normalized.endsWith('-lr') || normalized.endsWith('-mm');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Millimetres per one unit of the given area unit. */
|
|
53
|
+
export function unitFactorMm() {
|
|
54
|
+
var unit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'mm';
|
|
55
|
+
switch (normaliseAreaUnit(unit)) {
|
|
56
|
+
case 'cm':
|
|
57
|
+
return MM_PER_CM;
|
|
58
|
+
case 'm':
|
|
59
|
+
return MM_PER_M;
|
|
60
|
+
case 'in':
|
|
61
|
+
return MM_PER_INCH;
|
|
62
|
+
case 'ft':
|
|
63
|
+
return MM_PER_FOOT;
|
|
64
|
+
default:
|
|
65
|
+
return 1;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** @deprecated use unitFactorMm */
|
|
70
|
+
export function metricUnitFactor() {
|
|
71
|
+
var unit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'mm';
|
|
72
|
+
return unitFactorMm(unit);
|
|
73
|
+
}
|
|
74
|
+
export function mmToUnit(mm) {
|
|
75
|
+
var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'mm';
|
|
76
|
+
return mm / unitFactorMm(unit);
|
|
77
|
+
}
|
|
78
|
+
export function unitToMm(value) {
|
|
79
|
+
var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'mm';
|
|
80
|
+
return value * unitFactorMm(unit);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** @deprecated use mmToUnit */
|
|
84
|
+
export function mmToMetricDisplay(mm) {
|
|
85
|
+
var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'mm';
|
|
86
|
+
return mmToUnit(mm, unit);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** @deprecated use unitToMm */
|
|
90
|
+
export function metricDisplayToMm(value) {
|
|
91
|
+
var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'mm';
|
|
92
|
+
return unitToMm(value, unit);
|
|
93
|
+
}
|
|
94
|
+
export function mmToInches(mm) {
|
|
95
|
+
return mm / MM_PER_INCH;
|
|
96
|
+
}
|
|
97
|
+
export function inchesToMm(inches) {
|
|
98
|
+
return inches * MM_PER_INCH;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Unit shown for the current buyer modality.
|
|
103
|
+
* Metric → field unit if metric, else mm.
|
|
104
|
+
* Imperial → field unit if imperial, else inches.
|
|
105
|
+
*/
|
|
106
|
+
export function activeDisplayUnit(modality) {
|
|
107
|
+
var areaUnit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'mm';
|
|
108
|
+
var unit = normaliseAreaUnit(areaUnit);
|
|
109
|
+
if (modality === 'imperial') {
|
|
110
|
+
return isImperialUnit(unit) ? unit : 'in';
|
|
111
|
+
}
|
|
112
|
+
return isImperialUnit(unit) ? 'mm' : unit;
|
|
113
|
+
}
|
|
114
|
+
export function defaultModalityForAreaUnit() {
|
|
115
|
+
var areaUnit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'mm';
|
|
116
|
+
if (isImperialUnit(areaUnit)) return 'imperial';
|
|
117
|
+
return localePrefersImperial() ? 'imperial' : 'metric';
|
|
118
|
+
}
|
|
119
|
+
export function mmToDisplay(mm, modality) {
|
|
120
|
+
var areaUnit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'mm';
|
|
121
|
+
return mmToUnit(mm, activeDisplayUnit(modality, areaUnit));
|
|
122
|
+
}
|
|
123
|
+
export function displayToMm(value, modality) {
|
|
124
|
+
var areaUnit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'mm';
|
|
125
|
+
return unitToMm(value, activeDisplayUnit(modality, areaUnit));
|
|
126
|
+
}
|
|
127
|
+
export function unitLabel(modality) {
|
|
128
|
+
var areaUnit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'mm';
|
|
129
|
+
return activeDisplayUnit(modality, areaUnit);
|
|
130
|
+
}
|
|
131
|
+
export function defaultAreaStep() {
|
|
132
|
+
var unit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'mm';
|
|
133
|
+
switch (normaliseAreaUnit(unit)) {
|
|
134
|
+
case 'm':
|
|
135
|
+
return 0.001;
|
|
136
|
+
case 'cm':
|
|
137
|
+
return 0.1;
|
|
138
|
+
case 'in':
|
|
139
|
+
return 0.125;
|
|
140
|
+
case 'ft':
|
|
141
|
+
return 0.01;
|
|
142
|
+
default:
|
|
143
|
+
return 1;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Step for inputs/sliders in the current display unit.
|
|
149
|
+
* `stepMm` is the admin-configured step stored in millimetres.
|
|
150
|
+
*/
|
|
151
|
+
export function stepInDisplayUnit(stepMm, modality) {
|
|
152
|
+
var areaUnit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'mm';
|
|
153
|
+
var unit = activeDisplayUnit(modality, areaUnit);
|
|
154
|
+
var raw = Number(stepMm);
|
|
155
|
+
if (Number.isFinite(raw) && raw > 0) {
|
|
156
|
+
return raw / unitFactorMm(unit);
|
|
157
|
+
}
|
|
158
|
+
return defaultAreaStep(unit);
|
|
159
|
+
}
|
|
160
|
+
function decimalsForUnit(unit) {
|
|
161
|
+
if (unit === 'm') return 4;
|
|
162
|
+
if (unit === 'ft') return 3;
|
|
163
|
+
if (unit === 'in' || unit === 'cm') return 2;
|
|
164
|
+
return 2;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** Format a length in mm for buyer-facing summary. */
|
|
168
|
+
export function formatLengthFromMm(mm, modality) {
|
|
169
|
+
var areaUnit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'mm';
|
|
170
|
+
var unit = activeDisplayUnit(modality, areaUnit);
|
|
171
|
+
if (unit === 'ft') {
|
|
172
|
+
var feet = mmToUnit(mm, 'ft');
|
|
173
|
+
return "".concat(trimNum(Number(feet.toFixed(3))), " ft");
|
|
174
|
+
}
|
|
175
|
+
if (unit === 'in') {
|
|
176
|
+
var inches = mmToInches(mm);
|
|
177
|
+
if (inches >= 12) {
|
|
178
|
+
var _feet = Math.floor(inches / 12);
|
|
179
|
+
var rem = inches - _feet * 12;
|
|
180
|
+
if (rem < 0.05) return "".concat(_feet, " ft");
|
|
181
|
+
return "".concat(_feet, " ft ").concat(trimNum(Number(rem.toFixed(2))), " in");
|
|
182
|
+
}
|
|
183
|
+
return "".concat(trimNum(Number(inches.toFixed(2))), " in");
|
|
184
|
+
}
|
|
185
|
+
var display = mmToUnit(mm, unit);
|
|
186
|
+
return "".concat(trimNum(Number(display.toFixed(decimalsForUnit(unit)))), " ").concat(unit);
|
|
187
|
+
}
|
|
188
|
+
export function formatAreaParts(value) {
|
|
189
|
+
var modality = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'metric';
|
|
190
|
+
var areaUnit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'mm';
|
|
191
|
+
var parsed = parseAreaValue(value);
|
|
192
|
+
if (!parsed) return null;
|
|
193
|
+
var heightMm = parsed.heightMm,
|
|
194
|
+
widthMm = parsed.widthMm;
|
|
195
|
+
var height = formatLengthFromMm(heightMm, modality, areaUnit);
|
|
196
|
+
var width = formatLengthFromMm(widthMm, modality, areaUnit);
|
|
197
|
+
var areaMm2 = heightMm * widthMm;
|
|
198
|
+
var unit = activeDisplayUnit(modality, areaUnit);
|
|
199
|
+
var areaLabel;
|
|
200
|
+
if (unit === 'ft') {
|
|
201
|
+
var sqFt = areaMm2 / (MM_PER_FOOT * MM_PER_FOOT);
|
|
202
|
+
areaLabel = "".concat(trimNum(Number(sqFt.toFixed(3))), " sq ft");
|
|
203
|
+
} else if (unit === 'in') {
|
|
204
|
+
var sqIn = areaMm2 / (MM_PER_INCH * MM_PER_INCH);
|
|
205
|
+
if (sqIn >= 144) {
|
|
206
|
+
areaLabel = "".concat(trimNum(Number((sqIn / 144).toFixed(3))), " sq ft");
|
|
207
|
+
} else {
|
|
208
|
+
areaLabel = "".concat(trimNum(Number(sqIn.toFixed(2))), " sq in");
|
|
209
|
+
}
|
|
210
|
+
} else if (unit === 'm') {
|
|
211
|
+
areaLabel = "".concat(trimNum(Number((areaMm2 / 1000000).toFixed(4))), " m\xB2");
|
|
212
|
+
} else if (unit === 'cm') {
|
|
213
|
+
areaLabel = "".concat(trimNum(Number((areaMm2 / 100).toFixed(2))), " cm\xB2");
|
|
214
|
+
} else {
|
|
215
|
+
areaLabel = "".concat(trimNum(Number(areaMm2.toFixed(2))), " mm\xB2");
|
|
216
|
+
}
|
|
217
|
+
return {
|
|
218
|
+
width: width,
|
|
219
|
+
height: height,
|
|
220
|
+
areaLabel: areaLabel
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
export function formatAreaSummary(value) {
|
|
224
|
+
var modality = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'metric';
|
|
225
|
+
var areaUnit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'mm';
|
|
226
|
+
var parts = formatAreaParts(value, modality, areaUnit);
|
|
227
|
+
if (!parts) return null;
|
|
228
|
+
// Width × height (landscape-first) to match the buyer control order.
|
|
229
|
+
return "Width ".concat(parts.width, " \xD7 Height ").concat(parts.height, " (").concat(parts.areaLabel, ")");
|
|
230
|
+
}
|
|
231
|
+
export function clamp(n, min, max) {
|
|
232
|
+
var v = n;
|
|
233
|
+
if (min != null && Number.isFinite(min)) v = Math.max(v, min);
|
|
234
|
+
if (max != null && Number.isFinite(max)) v = Math.min(v, max);
|
|
235
|
+
return v;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Client-side Area cost estimate (pre-discount), matching API formula:
|
|
240
|
+
* onceOff = heightCost × widthCost × height_u × width_u
|
|
241
|
+
* unitCost = heightUnit × widthUnit × height_u × width_u
|
|
242
|
+
* (dimensions expressed in the field's areaUnit)
|
|
243
|
+
*/
|
|
244
|
+
export function estimateAreaCosts(variationField, value) {
|
|
245
|
+
var _ref, _variationField$areaU, _variationField$heigh, _variationField$width, _variationField$heigh2, _variationField$width2;
|
|
246
|
+
var parsed = parseAreaValue(value);
|
|
247
|
+
if (!parsed) return null;
|
|
248
|
+
var areaUnit = normaliseAreaUnit((_ref = (_variationField$areaU = variationField === null || variationField === void 0 ? void 0 : variationField.areaUnit) !== null && _variationField$areaU !== void 0 ? _variationField$areaU : variationField === null || variationField === void 0 ? void 0 : variationField.area_unit) !== null && _ref !== void 0 ? _ref : 'mm');
|
|
249
|
+
var heightU = mmToUnit(parsed.heightMm, areaUnit);
|
|
250
|
+
var widthU = mmToUnit(parsed.widthMm, areaUnit);
|
|
251
|
+
var area = heightU * widthU;
|
|
252
|
+
var heightCost = Number((_variationField$heigh = variationField === null || variationField === void 0 ? void 0 : variationField.heightVariationCost) !== null && _variationField$heigh !== void 0 ? _variationField$heigh : variationField === null || variationField === void 0 ? void 0 : variationField.height_variation_cost) || 0;
|
|
253
|
+
var widthCost = Number((_variationField$width = variationField === null || variationField === void 0 ? void 0 : variationField.widthVariationCost) !== null && _variationField$width !== void 0 ? _variationField$width : variationField === null || variationField === void 0 ? void 0 : variationField.width_variation_cost) || 0;
|
|
254
|
+
var heightUnit = Number((_variationField$heigh2 = variationField === null || variationField === void 0 ? void 0 : variationField.heightVariationUnitCost) !== null && _variationField$heigh2 !== void 0 ? _variationField$heigh2 : variationField === null || variationField === void 0 ? void 0 : variationField.height_variation_unit_cost) || 0;
|
|
255
|
+
var widthUnit = Number((_variationField$width2 = variationField === null || variationField === void 0 ? void 0 : variationField.widthVariationUnitCost) !== null && _variationField$width2 !== void 0 ? _variationField$width2 : variationField === null || variationField === void 0 ? void 0 : variationField.width_variation_unit_cost) || 0;
|
|
256
|
+
var onceOffCost = heightCost * widthCost * area;
|
|
257
|
+
var unitCost = heightUnit * widthUnit * area;
|
|
258
|
+
if (!(onceOffCost > 0) && !(unitCost > 0)) return null;
|
|
259
|
+
return {
|
|
260
|
+
onceOffCost: Number(onceOffCost.toFixed(3)),
|
|
261
|
+
unitCost: Number(unitCost.toFixed(3))
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Keep width/height linked by aspectRatio (width/height).
|
|
267
|
+
* `changed` indicates which dimension the user edited.
|
|
268
|
+
*/
|
|
269
|
+
export function clampWithAspectRatio(args) {
|
|
270
|
+
var ratio = args.aspectRatio;
|
|
271
|
+
if (!Number.isFinite(ratio) || ratio <= 0) {
|
|
272
|
+
return {
|
|
273
|
+
heightMm: clamp(args.heightMm, args.heightMin, args.heightMax),
|
|
274
|
+
widthMm: clamp(args.widthMm, args.widthMin, args.widthMax)
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
var heightMm = args.heightMm;
|
|
278
|
+
var widthMm = args.widthMm;
|
|
279
|
+
if (args.changed === 'height') {
|
|
280
|
+
heightMm = clamp(heightMm, args.heightMin, args.heightMax);
|
|
281
|
+
widthMm = heightMm * ratio;
|
|
282
|
+
widthMm = clamp(widthMm, args.widthMin, args.widthMax);
|
|
283
|
+
heightMm = widthMm / ratio;
|
|
284
|
+
heightMm = clamp(heightMm, args.heightMin, args.heightMax);
|
|
285
|
+
widthMm = heightMm * ratio;
|
|
286
|
+
} else {
|
|
287
|
+
widthMm = clamp(widthMm, args.widthMin, args.widthMax);
|
|
288
|
+
heightMm = widthMm / ratio;
|
|
289
|
+
heightMm = clamp(heightMm, args.heightMin, args.heightMax);
|
|
290
|
+
widthMm = heightMm * ratio;
|
|
291
|
+
widthMm = clamp(widthMm, args.widthMin, args.widthMax);
|
|
292
|
+
}
|
|
293
|
+
return {
|
|
294
|
+
heightMm: heightMm,
|
|
295
|
+
widthMm: widthMm
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNTV9QRVJfSU5DSCIsIk1NX1BFUl9GT09UIiwiTU1fUEVSX0NNIiwiTU1fUEVSX00iLCJwYXJzZUFyZWFWYWx1ZSIsInZhbHVlIiwidGV4dCIsIlN0cmluZyIsInRyaW0iLCJwYXJ0cyIsInNwbGl0IiwibWFwIiwicCIsImxlbmd0aCIsImhlaWdodE1tIiwiTnVtYmVyIiwid2lkdGhNbSIsImlzRmluaXRlIiwiZm9ybWF0QXJlYVZhbHVlIiwiaCIsInciLCJjb25jYXQiLCJ0cmltTnVtIiwibiIsInRvRml4ZWQiLCJpc0ltcGVyaWFsVW5pdCIsInVuaXQiLCJ1IiwidG9Mb3dlckNhc2UiLCJub3JtYWxpc2VBcmVhVW5pdCIsImxvY2FsZVByZWZlcnNJbXBlcmlhbCIsImxvY2FsZSIsImxhbmciLCJuYXZpZ2F0b3IiLCJsYW5ndWFnZSIsInVuZGVmaW5lZCIsIm5vcm1hbGl6ZWQiLCJyZXBsYWNlIiwiZW5kc1dpdGgiLCJ1bml0RmFjdG9yTW0iLCJhcmd1bWVudHMiLCJtZXRyaWNVbml0RmFjdG9yIiwibW1Ub1VuaXQiLCJtbSIsInVuaXRUb01tIiwibW1Ub01ldHJpY0Rpc3BsYXkiLCJtZXRyaWNEaXNwbGF5VG9NbSIsIm1tVG9JbmNoZXMiLCJpbmNoZXNUb01tIiwiaW5jaGVzIiwiYWN0aXZlRGlzcGxheVVuaXQiLCJtb2RhbGl0eSIsImFyZWFVbml0IiwiZGVmYXVsdE1vZGFsaXR5Rm9yQXJlYVVuaXQiLCJtbVRvRGlzcGxheSIsImRpc3BsYXlUb01tIiwidW5pdExhYmVsIiwiZGVmYXVsdEFyZWFTdGVwIiwic3RlcEluRGlzcGxheVVuaXQiLCJzdGVwTW0iLCJyYXciLCJkZWNpbWFsc0ZvclVuaXQiLCJmb3JtYXRMZW5ndGhGcm9tTW0iLCJmZWV0IiwiTWF0aCIsImZsb29yIiwicmVtIiwiZGlzcGxheSIsImZvcm1hdEFyZWFQYXJ0cyIsInBhcnNlZCIsImhlaWdodCIsIndpZHRoIiwiYXJlYU1tMiIsImFyZWFMYWJlbCIsInNxRnQiLCJzcUluIiwiZm9ybWF0QXJlYVN1bW1hcnkiLCJjbGFtcCIsIm1pbiIsIm1heCIsInYiLCJlc3RpbWF0ZUFyZWFDb3N0cyIsInZhcmlhdGlvbkZpZWxkIiwiX3JlZiIsIl92YXJpYXRpb25GaWVsZCRhcmVhVSIsIl92YXJpYXRpb25GaWVsZCRoZWlnaCIsIl92YXJpYXRpb25GaWVsZCR3aWR0aCIsIl92YXJpYXRpb25GaWVsZCRoZWlnaDIiLCJfdmFyaWF0aW9uRmllbGQkd2lkdGgyIiwiYXJlYV91bml0IiwiaGVpZ2h0VSIsIndpZHRoVSIsImFyZWEiLCJoZWlnaHRDb3N0IiwiaGVpZ2h0VmFyaWF0aW9uQ29zdCIsImhlaWdodF92YXJpYXRpb25fY29zdCIsIndpZHRoQ29zdCIsIndpZHRoVmFyaWF0aW9uQ29zdCIsIndpZHRoX3ZhcmlhdGlvbl9jb3N0IiwiaGVpZ2h0VW5pdCIsImhlaWdodFZhcmlhdGlvblVuaXRDb3N0IiwiaGVpZ2h0X3ZhcmlhdGlvbl91bml0X2Nvc3QiLCJ3aWR0aFVuaXQiLCJ3aWR0aFZhcmlhdGlvblVuaXRDb3N0Iiwid2lkdGhfdmFyaWF0aW9uX3VuaXRfY29zdCIsIm9uY2VPZmZDb3N0IiwidW5pdENvc3QiLCJjbGFtcFdpdGhBc3BlY3RSYXRpbyIsImFyZ3MiLCJyYXRpbyIsImFzcGVjdFJhdGlvIiwiaGVpZ2h0TWluIiwiaGVpZ2h0TWF4Iiwid2lkdGhNaW4iLCJ3aWR0aE1heCIsImNoYW5nZWQiXSwic291cmNlcyI6WyIuLi9zcmMvYXJlYS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogU2hhcmVkIGhlbHBlcnMgZm9yIEFyZWEgKGhlaWdodCDDlyB3aWR0aCkgdmFyaWF0aW9uIGZpZWxkcy4gU3RvcmVkIHZhbHVlIGlzIGFsd2F5cyBtaWxsaW1ldHJlcy4gKi9cclxuXHJcbmV4cG9ydCB0eXBlIEFyZWFVbml0ID0gJ21tJyB8ICdjbScgfCAnbScgfCAnaW4nIHwgJ2Z0JztcclxuZXhwb3J0IHR5cGUgQXJlYUlucHV0VHlwZSA9ICdpbnB1dCcgfCAnc2xpZGVyJztcclxuZXhwb3J0IHR5cGUgRGlzcGxheU1vZGFsaXR5ID0gJ21ldHJpYycgfCAnaW1wZXJpYWwnO1xyXG5cclxuY29uc3QgTU1fUEVSX0lOQ0ggPSAyNS40O1xyXG5jb25zdCBNTV9QRVJfRk9PVCA9IDMwNC44O1xyXG5jb25zdCBNTV9QRVJfQ00gPSAxMDtcclxuY29uc3QgTU1fUEVSX00gPSAxMDAwO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQXJlYVZhbHVlKFxyXG4gIHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXHJcbik6IHsgaGVpZ2h0TW06IG51bWJlcjsgd2lkdGhNbTogbnVtYmVyIH0gfCBudWxsIHtcclxuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7XHJcbiAgY29uc3QgdGV4dCA9IFN0cmluZyh2YWx1ZSkudHJpbSgpO1xyXG4gIGlmICghdGV4dCkgcmV0dXJuIG51bGw7XHJcbiAgY29uc3QgcGFydHMgPSB0ZXh0LnNwbGl0KCcsJykubWFwKChwKSA9PiBwLnRyaW0oKSk7XHJcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMikgcmV0dXJuIG51bGw7XHJcbiAgY29uc3QgaGVpZ2h0TW0gPSBOdW1iZXIocGFydHNbMF0pO1xyXG4gIGNvbnN0IHdpZHRoTW0gPSBOdW1iZXIocGFydHNbMV0pO1xyXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGhlaWdodE1tKSB8fCAhTnVtYmVyLmlzRmluaXRlKHdpZHRoTW0pKSByZXR1cm4gbnVsbDtcclxuICBpZiAoaGVpZ2h0TW0gPD0gMCB8fCB3aWR0aE1tIDw9IDApIHJldHVybiBudWxsO1xyXG4gIHJldHVybiB7IGhlaWdodE1tLCB3aWR0aE1tIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRBcmVhVmFsdWUoaGVpZ2h0TW06IG51bWJlciwgd2lkdGhNbTogbnVtYmVyKTogc3RyaW5nIHtcclxuICBjb25zdCBoID0gTnVtYmVyKGhlaWdodE1tKTtcclxuICBjb25zdCB3ID0gTnVtYmVyKHdpZHRoTW0pO1xyXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGgpIHx8ICFOdW1iZXIuaXNGaW5pdGUodykgfHwgaCA8PSAwIHx8IHcgPD0gMCkgcmV0dXJuICcnO1xyXG4gIHJldHVybiBgJHt0cmltTnVtKGgpfSwke3RyaW1OdW0odyl9YDtcclxufVxyXG5cclxuZnVuY3Rpb24gdHJpbU51bShuOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gIHJldHVybiBTdHJpbmcoTnVtYmVyKG4udG9GaXhlZCg2KSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJbXBlcmlhbFVuaXQodW5pdDogQXJlYVVuaXQgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XHJcbiAgY29uc3QgdSA9IFN0cmluZyh1bml0IHx8ICdtbScpLnRvTG93ZXJDYXNlKCk7XHJcbiAgcmV0dXJuIHUgPT09ICdpbicgfHwgdSA9PT0gJ2Z0JztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGlzZUFyZWFVbml0KHVuaXQ/OiBzdHJpbmcgfCBudWxsKTogQXJlYVVuaXQge1xyXG4gIGNvbnN0IHUgPSBTdHJpbmcodW5pdCB8fCAnbW0nKS50b0xvd2VyQ2FzZSgpO1xyXG4gIGlmICh1ID09PSAnY20nIHx8IHUgPT09ICdtJyB8fCB1ID09PSAnaW4nIHx8IHUgPT09ICdmdCcgfHwgdSA9PT0gJ21tJykge1xyXG4gICAgcmV0dXJuIHU7XHJcbiAgfVxyXG4gIHJldHVybiAnbW0nO1xyXG59XHJcblxyXG4vKiogSW1wZXJpYWwgZm9yIGVuLVVTIC8gZW4tTFIgLyBlbi1NTTsgb3RoZXJ3aXNlIG1ldHJpYyAoaW5jbC4gZW4tR0IpLiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbG9jYWxlUHJlZmVyc0ltcGVyaWFsKGxvY2FsZT86IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gIGNvbnN0IGxhbmcgPVxyXG4gICAgbG9jYWxlIHx8XHJcbiAgICAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgPyBuYXZpZ2F0b3IubGFuZ3VhZ2UgOiB1bmRlZmluZWQpIHx8XHJcbiAgICAnJztcclxuICBjb25zdCBub3JtYWxpemVkID0gbGFuZy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJ18nLCAnLScpO1xyXG4gIHJldHVybiAoXHJcbiAgICBub3JtYWxpemVkID09PSAnZW4tdXMnIHx8XHJcbiAgICBub3JtYWxpemVkID09PSAnZW4tbHInIHx8XHJcbiAgICBub3JtYWxpemVkID09PSAnZW4tbW0nIHx8XHJcbiAgICBub3JtYWxpemVkLmVuZHNXaXRoKCctdXMnKSB8fFxyXG4gICAgbm9ybWFsaXplZC5lbmRzV2l0aCgnLWxyJykgfHxcclxuICAgIG5vcm1hbGl6ZWQuZW5kc1dpdGgoJy1tbScpXHJcbiAgKTtcclxufVxyXG5cclxuLyoqIE1pbGxpbWV0cmVzIHBlciBvbmUgdW5pdCBvZiB0aGUgZ2l2ZW4gYXJlYSB1bml0LiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdW5pdEZhY3Rvck1tKHVuaXQ6IEFyZWFVbml0IHwgc3RyaW5nID0gJ21tJyk6IG51bWJlciB7XHJcbiAgc3dpdGNoIChub3JtYWxpc2VBcmVhVW5pdCh1bml0KSkge1xyXG4gICAgY2FzZSAnY20nOlxyXG4gICAgICByZXR1cm4gTU1fUEVSX0NNO1xyXG4gICAgY2FzZSAnbSc6XHJcbiAgICAgIHJldHVybiBNTV9QRVJfTTtcclxuICAgIGNhc2UgJ2luJzpcclxuICAgICAgcmV0dXJuIE1NX1BFUl9JTkNIO1xyXG4gICAgY2FzZSAnZnQnOlxyXG4gICAgICByZXR1cm4gTU1fUEVSX0ZPT1Q7XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gMTtcclxuICB9XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCB1c2UgdW5pdEZhY3Rvck1tICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtZXRyaWNVbml0RmFjdG9yKHVuaXQ6IEFyZWFVbml0ID0gJ21tJyk6IG51bWJlciB7XHJcbiAgcmV0dXJuIHVuaXRGYWN0b3JNbSh1bml0KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1tVG9Vbml0KG1tOiBudW1iZXIsIHVuaXQ6IEFyZWFVbml0IHwgc3RyaW5nID0gJ21tJyk6IG51bWJlciB7XHJcbiAgcmV0dXJuIG1tIC8gdW5pdEZhY3Rvck1tKHVuaXQpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdW5pdFRvTW0odmFsdWU6IG51bWJlciwgdW5pdDogQXJlYVVuaXQgfCBzdHJpbmcgPSAnbW0nKTogbnVtYmVyIHtcclxuICByZXR1cm4gdmFsdWUgKiB1bml0RmFjdG9yTW0odW5pdCk7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCB1c2UgbW1Ub1VuaXQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG1tVG9NZXRyaWNEaXNwbGF5KG1tOiBudW1iZXIsIHVuaXQ6IEFyZWFVbml0ID0gJ21tJyk6IG51bWJlciB7XHJcbiAgcmV0dXJuIG1tVG9Vbml0KG1tLCB1bml0KTtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkIHVzZSB1bml0VG9NbSAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbWV0cmljRGlzcGxheVRvTW0odmFsdWU6IG51bWJlciwgdW5pdDogQXJlYVVuaXQgPSAnbW0nKTogbnVtYmVyIHtcclxuICByZXR1cm4gdW5pdFRvTW0odmFsdWUsIHVuaXQpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbW1Ub0luY2hlcyhtbTogbnVtYmVyKTogbnVtYmVyIHtcclxuICByZXR1cm4gbW0gLyBNTV9QRVJfSU5DSDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGluY2hlc1RvTW0oaW5jaGVzOiBudW1iZXIpOiBudW1iZXIge1xyXG4gIHJldHVybiBpbmNoZXMgKiBNTV9QRVJfSU5DSDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFVuaXQgc2hvd24gZm9yIHRoZSBjdXJyZW50IGJ1eWVyIG1vZGFsaXR5LlxyXG4gKiBNZXRyaWMg4oaSIGZpZWxkIHVuaXQgaWYgbWV0cmljLCBlbHNlIG1tLlxyXG4gKiBJbXBlcmlhbCDihpIgZmllbGQgdW5pdCBpZiBpbXBlcmlhbCwgZWxzZSBpbmNoZXMuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZlRGlzcGxheVVuaXQoXHJcbiAgbW9kYWxpdHk6IERpc3BsYXlNb2RhbGl0eSxcclxuICBhcmVhVW5pdDogQXJlYVVuaXQgfCBzdHJpbmcgPSAnbW0nXHJcbik6IEFyZWFVbml0IHtcclxuICBjb25zdCB1bml0ID0gbm9ybWFsaXNlQXJlYVVuaXQoYXJlYVVuaXQpO1xyXG4gIGlmIChtb2RhbGl0eSA9PT0gJ2ltcGVyaWFsJykge1xyXG4gICAgcmV0dXJuIGlzSW1wZXJpYWxVbml0KHVuaXQpID8gdW5pdCA6ICdpbic7XHJcbiAgfVxyXG4gIHJldHVybiBpc0ltcGVyaWFsVW5pdCh1bml0KSA/ICdtbScgOiB1bml0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdE1vZGFsaXR5Rm9yQXJlYVVuaXQoXHJcbiAgYXJlYVVuaXQ6IEFyZWFVbml0IHwgc3RyaW5nID0gJ21tJ1xyXG4pOiBEaXNwbGF5TW9kYWxpdHkge1xyXG4gIGlmIChpc0ltcGVyaWFsVW5pdChhcmVhVW5pdCkpIHJldHVybiAnaW1wZXJpYWwnO1xyXG4gIHJldHVybiBsb2NhbGVQcmVmZXJzSW1wZXJpYWwoKSA/ICdpbXBlcmlhbCcgOiAnbWV0cmljJztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1tVG9EaXNwbGF5KFxyXG4gIG1tOiBudW1iZXIsXHJcbiAgbW9kYWxpdHk6IERpc3BsYXlNb2RhbGl0eSxcclxuICBhcmVhVW5pdDogQXJlYVVuaXQgfCBzdHJpbmcgPSAnbW0nXHJcbik6IG51bWJlciB7XHJcbiAgcmV0dXJuIG1tVG9Vbml0KG1tLCBhY3RpdmVEaXNwbGF5VW5pdChtb2RhbGl0eSwgYXJlYVVuaXQpKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRpc3BsYXlUb01tKFxyXG4gIHZhbHVlOiBudW1iZXIsXHJcbiAgbW9kYWxpdHk6IERpc3BsYXlNb2RhbGl0eSxcclxuICBhcmVhVW5pdDogQXJlYVVuaXQgfCBzdHJpbmcgPSAnbW0nXHJcbik6IG51bWJlciB7XHJcbiAgcmV0dXJuIHVuaXRUb01tKHZhbHVlLCBhY3RpdmVEaXNwbGF5VW5pdChtb2RhbGl0eSwgYXJlYVVuaXQpKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVuaXRMYWJlbChcclxuICBtb2RhbGl0eTogRGlzcGxheU1vZGFsaXR5LFxyXG4gIGFyZWFVbml0OiBBcmVhVW5pdCB8IHN0cmluZyA9ICdtbSdcclxuKTogc3RyaW5nIHtcclxuICByZXR1cm4gYWN0aXZlRGlzcGxheVVuaXQobW9kYWxpdHksIGFyZWFVbml0KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRBcmVhU3RlcCh1bml0OiBBcmVhVW5pdCB8IHN0cmluZyA9ICdtbScpOiBudW1iZXIge1xyXG4gIHN3aXRjaCAobm9ybWFsaXNlQXJlYVVuaXQodW5pdCkpIHtcclxuICAgIGNhc2UgJ20nOlxyXG4gICAgICByZXR1cm4gMC4wMDE7XHJcbiAgICBjYXNlICdjbSc6XHJcbiAgICAgIHJldHVybiAwLjE7XHJcbiAgICBjYXNlICdpbic6XHJcbiAgICAgIHJldHVybiAwLjEyNTtcclxuICAgIGNhc2UgJ2Z0JzpcclxuICAgICAgcmV0dXJuIDAuMDE7XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gMTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTdGVwIGZvciBpbnB1dHMvc2xpZGVycyBpbiB0aGUgY3VycmVudCBkaXNwbGF5IHVuaXQuXHJcbiAqIGBzdGVwTW1gIGlzIHRoZSBhZG1pbi1jb25maWd1cmVkIHN0ZXAgc3RvcmVkIGluIG1pbGxpbWV0cmVzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHN0ZXBJbkRpc3BsYXlVbml0KFxyXG4gIHN0ZXBNbTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCxcclxuICBtb2RhbGl0eTogRGlzcGxheU1vZGFsaXR5LFxyXG4gIGFyZWFVbml0OiBBcmVhVW5pdCB8IHN0cmluZyA9ICdtbSdcclxuKTogbnVtYmVyIHtcclxuICBjb25zdCB1bml0ID0gYWN0aXZlRGlzcGxheVVuaXQobW9kYWxpdHksIGFyZWFVbml0KTtcclxuICBjb25zdCByYXcgPSBOdW1iZXIoc3RlcE1tKTtcclxuICBpZiAoTnVtYmVyLmlzRmluaXRlKHJhdykgJiYgcmF3ID4gMCkge1xyXG4gICAgcmV0dXJuIHJhdyAvIHVuaXRGYWN0b3JNbSh1bml0KTtcclxuICB9XHJcbiAgcmV0dXJuIGRlZmF1bHRBcmVhU3RlcCh1bml0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZGVjaW1hbHNGb3JVbml0KHVuaXQ6IEFyZWFVbml0KTogbnVtYmVyIHtcclxuICBpZiAodW5pdCA9PT0gJ20nKSByZXR1cm4gNDtcclxuICBpZiAodW5pdCA9PT0gJ2Z0JykgcmV0dXJuIDM7XHJcbiAgaWYgKHVuaXQgPT09ICdpbicgfHwgdW5pdCA9PT0gJ2NtJykgcmV0dXJuIDI7XHJcbiAgcmV0dXJuIDI7XHJcbn1cclxuXHJcbi8qKiBGb3JtYXQgYSBsZW5ndGggaW4gbW0gZm9yIGJ1eWVyLWZhY2luZyBzdW1tYXJ5LiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TGVuZ3RoRnJvbU1tKFxyXG4gIG1tOiBudW1iZXIsXHJcbiAgbW9kYWxpdHk6IERpc3BsYXlNb2RhbGl0eSxcclxuICBhcmVhVW5pdDogQXJlYVVuaXQgfCBzdHJpbmcgPSAnbW0nXHJcbik6IHN0cmluZyB7XHJcbiAgY29uc3QgdW5pdCA9IGFjdGl2ZURpc3BsYXlVbml0KG1vZGFsaXR5LCBhcmVhVW5pdCk7XHJcbiAgaWYgKHVuaXQgPT09ICdmdCcpIHtcclxuICAgIGNvbnN0IGZlZXQgPSBtbVRvVW5pdChtbSwgJ2Z0Jyk7XHJcbiAgICByZXR1cm4gYCR7dHJpbU51bShOdW1iZXIoZmVldC50b0ZpeGVkKDMpKSl9IGZ0YDtcclxuICB9XHJcbiAgaWYgKHVuaXQgPT09ICdpbicpIHtcclxuICAgIGNvbnN0IGluY2hlcyA9IG1tVG9JbmNoZXMobW0pO1xyXG4gICAgaWYgKGluY2hlcyA+PSAxMikge1xyXG4gICAgICBjb25zdCBmZWV0ID0gTWF0aC5mbG9vcihpbmNoZXMgLyAxMik7XHJcbiAgICAgIGNvbnN0IHJlbSA9IGluY2hlcyAtIGZlZXQgKiAxMjtcclxuICAgICAgaWYgKHJlbSA8IDAuMDUpIHJldHVybiBgJHtmZWV0fSBmdGA7XHJcbiAgICAgIHJldHVybiBgJHtmZWV0fSBmdCAke3RyaW1OdW0oTnVtYmVyKHJlbS50b0ZpeGVkKDIpKSl9IGluYDtcclxuICAgIH1cclxuICAgIHJldHVybiBgJHt0cmltTnVtKE51bWJlcihpbmNoZXMudG9GaXhlZCgyKSkpfSBpbmA7XHJcbiAgfVxyXG4gIGNvbnN0IGRpc3BsYXkgPSBtbVRvVW5pdChtbSwgdW5pdCk7XHJcbiAgcmV0dXJuIGAke3RyaW1OdW0oTnVtYmVyKGRpc3BsYXkudG9GaXhlZChkZWNpbWFsc0ZvclVuaXQodW5pdCkpKSl9ICR7dW5pdH1gO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0QXJlYVBhcnRzKFxyXG4gIHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxyXG4gIG1vZGFsaXR5OiBEaXNwbGF5TW9kYWxpdHkgPSAnbWV0cmljJyxcclxuICBhcmVhVW5pdDogQXJlYVVuaXQgfCBzdHJpbmcgPSAnbW0nXHJcbik6IHsgd2lkdGg6IHN0cmluZzsgaGVpZ2h0OiBzdHJpbmc7IGFyZWFMYWJlbDogc3RyaW5nIH0gfCBudWxsIHtcclxuICBjb25zdCBwYXJzZWQgPSBwYXJzZUFyZWFWYWx1ZSh2YWx1ZSk7XHJcbiAgaWYgKCFwYXJzZWQpIHJldHVybiBudWxsO1xyXG4gIGNvbnN0IHsgaGVpZ2h0TW0sIHdpZHRoTW0gfSA9IHBhcnNlZDtcclxuICBjb25zdCBoZWlnaHQgPSBmb3JtYXRMZW5ndGhGcm9tTW0oaGVpZ2h0TW0sIG1vZGFsaXR5LCBhcmVhVW5pdCk7XHJcbiAgY29uc3Qgd2lkdGggPSBmb3JtYXRMZW5ndGhGcm9tTW0od2lkdGhNbSwgbW9kYWxpdHksIGFyZWFVbml0KTtcclxuICBjb25zdCBhcmVhTW0yID0gaGVpZ2h0TW0gKiB3aWR0aE1tO1xyXG4gIGNvbnN0IHVuaXQgPSBhY3RpdmVEaXNwbGF5VW5pdChtb2RhbGl0eSwgYXJlYVVuaXQpO1xyXG4gIGxldCBhcmVhTGFiZWw6IHN0cmluZztcclxuICBpZiAodW5pdCA9PT0gJ2Z0Jykge1xyXG4gICAgY29uc3Qgc3FGdCA9IGFyZWFNbTIgLyAoTU1fUEVSX0ZPT1QgKiBNTV9QRVJfRk9PVCk7XHJcbiAgICBhcmVhTGFiZWwgPSBgJHt0cmltTnVtKE51bWJlcihzcUZ0LnRvRml4ZWQoMykpKX0gc3EgZnRgO1xyXG4gIH0gZWxzZSBpZiAodW5pdCA9PT0gJ2luJykge1xyXG4gICAgY29uc3Qgc3FJbiA9IGFyZWFNbTIgLyAoTU1fUEVSX0lOQ0ggKiBNTV9QRVJfSU5DSCk7XHJcbiAgICBpZiAoc3FJbiA+PSAxNDQpIHtcclxuICAgICAgYXJlYUxhYmVsID0gYCR7dHJpbU51bShOdW1iZXIoKHNxSW4gLyAxNDQpLnRvRml4ZWQoMykpKX0gc3EgZnRgO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXJlYUxhYmVsID0gYCR7dHJpbU51bShOdW1iZXIoc3FJbi50b0ZpeGVkKDIpKSl9IHNxIGluYDtcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKHVuaXQgPT09ICdtJykge1xyXG4gICAgYXJlYUxhYmVsID0gYCR7dHJpbU51bShOdW1iZXIoKGFyZWFNbTIgLyAxXzAwMF8wMDApLnRvRml4ZWQoNCkpKX0gbcKyYDtcclxuICB9IGVsc2UgaWYgKHVuaXQgPT09ICdjbScpIHtcclxuICAgIGFyZWFMYWJlbCA9IGAke3RyaW1OdW0oTnVtYmVyKChhcmVhTW0yIC8gMTAwKS50b0ZpeGVkKDIpKSl9IGNtwrJgO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBhcmVhTGFiZWwgPSBgJHt0cmltTnVtKE51bWJlcihhcmVhTW0yLnRvRml4ZWQoMikpKX0gbW3CsmA7XHJcbiAgfVxyXG4gIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIGFyZWFMYWJlbCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0QXJlYVN1bW1hcnkoXHJcbiAgdmFsdWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXHJcbiAgbW9kYWxpdHk6IERpc3BsYXlNb2RhbGl0eSA9ICdtZXRyaWMnLFxyXG4gIGFyZWFVbml0OiBBcmVhVW5pdCB8IHN0cmluZyA9ICdtbSdcclxuKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgY29uc3QgcGFydHMgPSBmb3JtYXRBcmVhUGFydHModmFsdWUsIG1vZGFsaXR5LCBhcmVhVW5pdCk7XHJcbiAgaWYgKCFwYXJ0cykgcmV0dXJuIG51bGw7XHJcbiAgLy8gV2lkdGggw5cgaGVpZ2h0IChsYW5kc2NhcGUtZmlyc3QpIHRvIG1hdGNoIHRoZSBidXllciBjb250cm9sIG9yZGVyLlxyXG4gIHJldHVybiBgV2lkdGggJHtwYXJ0cy53aWR0aH0gw5cgSGVpZ2h0ICR7cGFydHMuaGVpZ2h0fSAoJHtwYXJ0cy5hcmVhTGFiZWx9KWA7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjbGFtcChuOiBudW1iZXIsIG1pbj86IG51bWJlciB8IG51bGwsIG1heD86IG51bWJlciB8IG51bGwpOiBudW1iZXIge1xyXG4gIGxldCB2ID0gbjtcclxuICBpZiAobWluICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKG1pbikpIHYgPSBNYXRoLm1heCh2LCBtaW4pO1xyXG4gIGlmIChtYXggIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUobWF4KSkgdiA9IE1hdGgubWluKHYsIG1heCk7XHJcbiAgcmV0dXJuIHY7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDbGllbnQtc2lkZSBBcmVhIGNvc3QgZXN0aW1hdGUgKHByZS1kaXNjb3VudCksIG1hdGNoaW5nIEFQSSBmb3JtdWxhOlxyXG4gKiBvbmNlT2ZmID0gaGVpZ2h0Q29zdCDDlyB3aWR0aENvc3Qgw5cgaGVpZ2h0X3Ugw5cgd2lkdGhfdVxyXG4gKiB1bml0Q29zdCA9IGhlaWdodFVuaXQgw5cgd2lkdGhVbml0IMOXIGhlaWdodF91IMOXIHdpZHRoX3VcclxuICogKGRpbWVuc2lvbnMgZXhwcmVzc2VkIGluIHRoZSBmaWVsZCdzIGFyZWFVbml0KVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGVzdGltYXRlQXJlYUNvc3RzKFxyXG4gIHZhcmlhdGlvbkZpZWxkOiBhbnksXHJcbiAgdmFsdWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcclxuKTogeyBvbmNlT2ZmQ29zdDogbnVtYmVyOyB1bml0Q29zdDogbnVtYmVyIH0gfCBudWxsIHtcclxuICBjb25zdCBwYXJzZWQgPSBwYXJzZUFyZWFWYWx1ZSh2YWx1ZSk7XHJcbiAgaWYgKCFwYXJzZWQpIHJldHVybiBudWxsO1xyXG4gIGNvbnN0IGFyZWFVbml0ID0gbm9ybWFsaXNlQXJlYVVuaXQoXHJcbiAgICB2YXJpYXRpb25GaWVsZD8uYXJlYVVuaXQgPz8gdmFyaWF0aW9uRmllbGQ/LmFyZWFfdW5pdCA/PyAnbW0nXHJcbiAgKTtcclxuICBjb25zdCBoZWlnaHRVID0gbW1Ub1VuaXQocGFyc2VkLmhlaWdodE1tLCBhcmVhVW5pdCk7XHJcbiAgY29uc3Qgd2lkdGhVID0gbW1Ub1VuaXQocGFyc2VkLndpZHRoTW0sIGFyZWFVbml0KTtcclxuICBjb25zdCBhcmVhID0gaGVpZ2h0VSAqIHdpZHRoVTtcclxuICBjb25zdCBoZWlnaHRDb3N0ID0gTnVtYmVyKFxyXG4gICAgdmFyaWF0aW9uRmllbGQ/LmhlaWdodFZhcmlhdGlvbkNvc3QgPz9cclxuICAgICAgdmFyaWF0aW9uRmllbGQ/LmhlaWdodF92YXJpYXRpb25fY29zdFxyXG4gICkgfHwgMDtcclxuICBjb25zdCB3aWR0aENvc3QgPSBOdW1iZXIoXHJcbiAgICB2YXJpYXRpb25GaWVsZD8ud2lkdGhWYXJpYXRpb25Db3N0ID8/IHZhcmlhdGlvbkZpZWxkPy53aWR0aF92YXJpYXRpb25fY29zdFxyXG4gICkgfHwgMDtcclxuICBjb25zdCBoZWlnaHRVbml0ID0gTnVtYmVyKFxyXG4gICAgdmFyaWF0aW9uRmllbGQ/LmhlaWdodFZhcmlhdGlvblVuaXRDb3N0ID8/XHJcbiAgICAgIHZhcmlhdGlvbkZpZWxkPy5oZWlnaHRfdmFyaWF0aW9uX3VuaXRfY29zdFxyXG4gICkgfHwgMDtcclxuICBjb25zdCB3aWR0aFVuaXQgPSBOdW1iZXIoXHJcbiAgICB2YXJpYXRpb25GaWVsZD8ud2lkdGhWYXJpYXRpb25Vbml0Q29zdCA/P1xyXG4gICAgICB2YXJpYXRpb25GaWVsZD8ud2lkdGhfdmFyaWF0aW9uX3VuaXRfY29zdFxyXG4gICkgfHwgMDtcclxuICBjb25zdCBvbmNlT2ZmQ29zdCA9IGhlaWdodENvc3QgKiB3aWR0aENvc3QgKiBhcmVhO1xyXG4gIGNvbnN0IHVuaXRDb3N0ID0gaGVpZ2h0VW5pdCAqIHdpZHRoVW5pdCAqIGFyZWE7XHJcbiAgaWYgKCEob25jZU9mZkNvc3QgPiAwKSAmJiAhKHVuaXRDb3N0ID4gMCkpIHJldHVybiBudWxsO1xyXG4gIHJldHVybiB7XHJcbiAgICBvbmNlT2ZmQ29zdDogTnVtYmVyKG9uY2VPZmZDb3N0LnRvRml4ZWQoMykpLFxyXG4gICAgdW5pdENvc3Q6IE51bWJlcih1bml0Q29zdC50b0ZpeGVkKDMpKSxcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogS2VlcCB3aWR0aC9oZWlnaHQgbGlua2VkIGJ5IGFzcGVjdFJhdGlvICh3aWR0aC9oZWlnaHQpLlxyXG4gKiBgY2hhbmdlZGAgaW5kaWNhdGVzIHdoaWNoIGRpbWVuc2lvbiB0aGUgdXNlciBlZGl0ZWQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY2xhbXBXaXRoQXNwZWN0UmF0aW8oYXJnczoge1xyXG4gIGhlaWdodE1tOiBudW1iZXI7XHJcbiAgd2lkdGhNbTogbnVtYmVyO1xyXG4gIGNoYW5nZWQ6ICdoZWlnaHQnIHwgJ3dpZHRoJztcclxuICBhc3BlY3RSYXRpbzogbnVtYmVyO1xyXG4gIGhlaWdodE1pbj86IG51bWJlciB8IG51bGw7XHJcbiAgaGVpZ2h0TWF4PzogbnVtYmVyIHwgbnVsbDtcclxuICB3aWR0aE1pbj86IG51bWJlciB8IG51bGw7XHJcbiAgd2lkdGhNYXg/OiBudW1iZXIgfCBudWxsO1xyXG59KTogeyBoZWlnaHRNbTogbnVtYmVyOyB3aWR0aE1tOiBudW1iZXIgfSB7XHJcbiAgY29uc3QgcmF0aW8gPSBhcmdzLmFzcGVjdFJhdGlvO1xyXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHJhdGlvKSB8fCByYXRpbyA8PSAwKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBoZWlnaHRNbTogY2xhbXAoYXJncy5oZWlnaHRNbSwgYXJncy5oZWlnaHRNaW4sIGFyZ3MuaGVpZ2h0TWF4KSxcclxuICAgICAgd2lkdGhNbTogY2xhbXAoYXJncy53aWR0aE1tLCBhcmdzLndpZHRoTWluLCBhcmdzLndpZHRoTWF4KSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBsZXQgaGVpZ2h0TW0gPSBhcmdzLmhlaWdodE1tO1xyXG4gIGxldCB3aWR0aE1tID0gYXJncy53aWR0aE1tO1xyXG5cclxuICBpZiAoYXJncy5jaGFuZ2VkID09PSAnaGVpZ2h0Jykge1xyXG4gICAgaGVpZ2h0TW0gPSBjbGFtcChoZWlnaHRNbSwgYXJncy5oZWlnaHRNaW4sIGFyZ3MuaGVpZ2h0TWF4KTtcclxuICAgIHdpZHRoTW0gPSBoZWlnaHRNbSAqIHJhdGlvO1xyXG4gICAgd2lkdGhNbSA9IGNsYW1wKHdpZHRoTW0sIGFyZ3Mud2lkdGhNaW4sIGFyZ3Mud2lkdGhNYXgpO1xyXG4gICAgaGVpZ2h0TW0gPSB3aWR0aE1tIC8gcmF0aW87XHJcbiAgICBoZWlnaHRNbSA9IGNsYW1wKGhlaWdodE1tLCBhcmdzLmhlaWdodE1pbiwgYXJncy5oZWlnaHRNYXgpO1xyXG4gICAgd2lkdGhNbSA9IGhlaWdodE1tICogcmF0aW87XHJcbiAgfSBlbHNlIHtcclxuICAgIHdpZHRoTW0gPSBjbGFtcCh3aWR0aE1tLCBhcmdzLndpZHRoTWluLCBhcmdzLndpZHRoTWF4KTtcclxuICAgIGhlaWdodE1tID0gd2lkdGhNbSAvIHJhdGlvO1xyXG4gICAgaGVpZ2h0TW0gPSBjbGFtcChoZWlnaHRNbSwgYXJncy5oZWlnaHRNaW4sIGFyZ3MuaGVpZ2h0TWF4KTtcclxuICAgIHdpZHRoTW0gPSBoZWlnaHRNbSAqIHJhdGlvO1xyXG4gICAgd2lkdGhNbSA9IGNsYW1wKHdpZHRoTW0sIGFyZ3Mud2lkdGhNaW4sIGFyZ3Mud2lkdGhNYXgpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHsgaGVpZ2h0TW0sIHdpZHRoTW0gfTtcclxufVxyXG4iXSwibWFwcGluZ3MiOiJBQUFBOztBQU1BLElBQU1BLFdBQVcsR0FBRyxJQUFJO0FBQ3hCLElBQU1DLFdBQVcsR0FBRyxLQUFLO0FBQ3pCLElBQU1DLFNBQVMsR0FBRyxFQUFFO0FBQ3BCLElBQU1DLFFBQVEsR0FBRyxJQUFJO0FBRXJCLE9BQU8sU0FBU0MsY0FBY0EsQ0FDNUJDLEtBQWdDLEVBQ2M7RUFDOUMsSUFBSUEsS0FBSyxJQUFJLElBQUksRUFBRSxPQUFPLElBQUk7RUFDOUIsSUFBTUMsSUFBSSxHQUFHQyxNQUFNLENBQUNGLEtBQUssQ0FBQyxDQUFDRyxJQUFJLENBQUMsQ0FBQztFQUNqQyxJQUFJLENBQUNGLElBQUksRUFBRSxPQUFPLElBQUk7RUFDdEIsSUFBTUcsS0FBSyxHQUFHSCxJQUFJLENBQUNJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQ0MsR0FBRyxDQUFDLFVBQUNDLENBQUM7SUFBQSxPQUFLQSxDQUFDLENBQUNKLElBQUksQ0FBQyxDQUFDO0VBQUEsRUFBQztFQUNsRCxJQUFJQyxLQUFLLENBQUNJLE1BQU0sS0FBSyxDQUFDLEVBQUUsT0FBTyxJQUFJO0VBQ25DLElBQU1DLFFBQVEsR0FBR0MsTUFBTSxDQUFDTixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDakMsSUFBTU8sT0FBTyxHQUFHRCxNQUFNLENBQUNOLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNoQyxJQUFJLENBQUNNLE1BQU0sQ0FBQ0UsUUFBUSxDQUFDSCxRQUFRLENBQUMsSUFBSSxDQUFDQyxN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
|