@appium/support 2.55.0 → 2.55.4
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/build/lib/image-util.js +3 -329
- package/build/lib/index.js +98 -0
- package/build/lib/log-internal.js +1 -1
- package/build/lib/logging.js +1 -1
- package/build/test/assets/sample_binary.plist +0 -0
- package/build/test/assets/sample_text.plist +28 -0
- package/build/test/fs-specs.js +264 -0
- package/build/test/helpers.js +35 -0
- package/build/test/image-util-e2e-specs.js +78 -0
- package/build/test/index-specs.js +49 -0
- package/build/test/log-internals-specs.js +97 -0
- package/build/test/logger/helpers.js +71 -0
- package/build/test/logger/logger-force-specs.js +41 -0
- package/build/test/logger/logger-normal-specs.js +113 -0
- package/build/test/logger/logger-test-specs.js +40 -0
- package/build/test/mjpeg-e2e-specs.js +96 -0
- package/build/test/net-e2e-specs.js +32 -0
- package/build/test/node-e2e-specs.js +22 -0
- package/build/test/plist-specs.js +54 -0
- package/build/test/process-specs.js +104 -0
- package/build/test/system-specs.js +136 -0
- package/build/test/tempdir-specs.js +86 -0
- package/build/test/timing-specs.js +125 -0
- package/build/test/util-e2e-specs.js +136 -0
- package/build/test/util-specs.js +537 -0
- package/build/test/zip-e2e-specs.js +233 -0
- package/index.js +1 -28
- package/lib/image-util.js +3 -570
- package/lib/index.js +28 -0
- package/lib/log-internal.js +1 -1
- package/lib/logging.js +1 -1
- package/package.json +7 -12
- package/build/index.js +0 -98
package/build/lib/image-util.js
CHANGED
|
@@ -9,9 +9,6 @@ exports.MIME_PNG = exports.MIME_JPEG = exports.MIME_BMP = void 0;
|
|
|
9
9
|
exports.base64ToImage = base64ToImage;
|
|
10
10
|
exports.cropBase64Image = cropBase64Image;
|
|
11
11
|
exports.cropImage = cropImage;
|
|
12
|
-
exports.getImageOccurrence = getImageOccurrence;
|
|
13
|
-
exports.getImagesMatches = getImagesMatches;
|
|
14
|
-
exports.getImagesSimilarity = getImagesSimilarity;
|
|
15
12
|
exports.getJimpImage = getJimpImage;
|
|
16
13
|
exports.imageToBase64 = imageToBase64;
|
|
17
14
|
|
|
@@ -27,12 +24,8 @@ var _pngjs = require("pngjs");
|
|
|
27
24
|
|
|
28
25
|
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
29
26
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
var _logger = _interopRequireDefault(require("./logger"));
|
|
33
|
-
|
|
34
|
-
var _node = require("./node");
|
|
35
|
-
|
|
27
|
+
const BYTES_IN_PIXEL_BLOCK = 4;
|
|
28
|
+
const SCANLINE_FILTER_METHOD = 4;
|
|
36
29
|
const {
|
|
37
30
|
MIME_JPEG,
|
|
38
31
|
MIME_PNG,
|
|
@@ -41,23 +34,6 @@ const {
|
|
|
41
34
|
exports.MIME_BMP = MIME_BMP;
|
|
42
35
|
exports.MIME_PNG = MIME_PNG;
|
|
43
36
|
exports.MIME_JPEG = MIME_JPEG;
|
|
44
|
-
let cv = null;
|
|
45
|
-
const BYTES_IN_PIXEL_BLOCK = 4;
|
|
46
|
-
const SCANLINE_FILTER_METHOD = 4;
|
|
47
|
-
const DEFAULT_MATCH_THRESHOLD = 0.5;
|
|
48
|
-
const MATCH_NEIGHBOUR_THRESHOLD = 10;
|
|
49
|
-
const AVAILABLE_DETECTORS = ['AKAZE', 'AGAST', 'BRISK', 'FAST', 'GFTT', 'KAZE', 'MSER', 'SIFT', 'ORB'];
|
|
50
|
-
const AVAILABLE_MATCHING_FUNCTIONS = ['FlannBased', 'BruteForce', 'BruteForceL1', 'BruteForceHamming', 'BruteForceHammingLut', 'BruteForceSL2'];
|
|
51
|
-
const MATCHING_METHODS = ['TM_CCOEFF', 'TM_CCOEFF_NORMED', 'TM_CCORR', 'TM_CCORR_NORMED', 'TM_SQDIFF', 'TM_SQDIFF_NORMED'];
|
|
52
|
-
const DEFAULT_MATCHING_METHOD = 'TM_CCOEFF_NORMED';
|
|
53
|
-
|
|
54
|
-
function toMatchingMethod(name) {
|
|
55
|
-
if (!MATCHING_METHODS.includes(name)) {
|
|
56
|
-
throw new Error(`The matching method '${name}' is unknown. ` + `Only the following matching methods are supported: ${MATCHING_METHODS}`);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return cv[name];
|
|
60
|
-
}
|
|
61
37
|
|
|
62
38
|
async function getJimpImage(data) {
|
|
63
39
|
return await new _bluebird.default((resolve, reject) => {
|
|
@@ -87,308 +63,6 @@ async function getJimpImage(data) {
|
|
|
87
63
|
});
|
|
88
64
|
}
|
|
89
65
|
|
|
90
|
-
async function initOpenCV() {
|
|
91
|
-
if (cv) {
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
_logger.default.debug(`Initializing opencv`);
|
|
96
|
-
|
|
97
|
-
try {
|
|
98
|
-
cv = await (0, _node.requirePackage)('opencv4nodejs');
|
|
99
|
-
} catch (err) {
|
|
100
|
-
_logger.default.warn(`Unable to load 'opencv4nodejs': ${err.message}`);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
if (!cv) {
|
|
104
|
-
throw new Error(`'opencv4nodejs' module is required to use OpenCV features. ` + `Please install it first ('npm i -g opencv4nodejs') and restart Appium. ` + 'Read https://github.com/justadudewhohacks/opencv4nodejs#how-to-install for more details on this topic.');
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
async function detectAndCompute(img, detector) {
|
|
109
|
-
const keyPoints = await detector.detectAsync(img);
|
|
110
|
-
const descriptor = await detector.computeAsync(img, keyPoints);
|
|
111
|
-
return {
|
|
112
|
-
keyPoints,
|
|
113
|
-
descriptor
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function calculateMatchedRect(matchedPoints) {
|
|
118
|
-
if (matchedPoints.length < 2) {
|
|
119
|
-
return {
|
|
120
|
-
x: 0,
|
|
121
|
-
y: 0,
|
|
122
|
-
width: 0,
|
|
123
|
-
height: 0
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
const pointsSortedByDistance = matchedPoints.map(point => [Math.sqrt(point.x * point.x + point.y * point.y), point]).sort((pair1, pair2) => pair1[0] >= pair2[0]).map(pair => pair[1]);
|
|
128
|
-
|
|
129
|
-
const firstPoint = _lodash.default.head(pointsSortedByDistance);
|
|
130
|
-
|
|
131
|
-
const lastPoint = _lodash.default.last(pointsSortedByDistance);
|
|
132
|
-
|
|
133
|
-
const topLeftPoint = {
|
|
134
|
-
x: firstPoint.x <= lastPoint.x ? firstPoint.x : lastPoint.x,
|
|
135
|
-
y: firstPoint.y <= lastPoint.y ? firstPoint.y : lastPoint.y
|
|
136
|
-
};
|
|
137
|
-
const bottomRightPoint = {
|
|
138
|
-
x: firstPoint.x >= lastPoint.x ? firstPoint.x : lastPoint.x,
|
|
139
|
-
y: firstPoint.y >= lastPoint.y ? firstPoint.y : lastPoint.y
|
|
140
|
-
};
|
|
141
|
-
return {
|
|
142
|
-
x: topLeftPoint.x,
|
|
143
|
-
y: topLeftPoint.y,
|
|
144
|
-
width: bottomRightPoint.x - topLeftPoint.x,
|
|
145
|
-
height: bottomRightPoint.y - topLeftPoint.y
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
function highlightRegion(mat, region) {
|
|
150
|
-
if (region.width <= 0 || region.height <= 0) {
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
const color = new cv.Vec(0, 0, 255);
|
|
155
|
-
const thickness = 2;
|
|
156
|
-
mat.drawRectangle(new cv.Rect(region.x, region.y, region.width, region.height), color, thickness, cv.LINE_8);
|
|
157
|
-
return mat;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
async function getImagesMatches(img1Data, img2Data, options = {}) {
|
|
161
|
-
await initOpenCV();
|
|
162
|
-
const {
|
|
163
|
-
detectorName = 'ORB',
|
|
164
|
-
visualize = false,
|
|
165
|
-
goodMatchesFactor,
|
|
166
|
-
matchFunc = 'BruteForce'
|
|
167
|
-
} = options;
|
|
168
|
-
|
|
169
|
-
if (!_lodash.default.includes(AVAILABLE_DETECTORS, detectorName)) {
|
|
170
|
-
throw new Error(`'${detectorName}' detector is unknown. ` + `Only ${JSON.stringify(AVAILABLE_DETECTORS)} detectors are supported.`);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
if (!_lodash.default.includes(AVAILABLE_MATCHING_FUNCTIONS, matchFunc)) {
|
|
174
|
-
throw new Error(`'${matchFunc}' matching function is unknown. ` + `Only ${JSON.stringify(AVAILABLE_MATCHING_FUNCTIONS)} matching functions are supported.`);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
const detector = new cv[`${detectorName}Detector`]();
|
|
178
|
-
const [img1, img2] = await _bluebird.default.all([cv.imdecodeAsync(img1Data), cv.imdecodeAsync(img2Data)]);
|
|
179
|
-
const [result1, result2] = await _bluebird.default.all([detectAndCompute(img1, detector), detectAndCompute(img2, detector)]);
|
|
180
|
-
let matches = [];
|
|
181
|
-
|
|
182
|
-
try {
|
|
183
|
-
matches = await cv[`match${matchFunc}Async`](result1.descriptor, result2.descriptor);
|
|
184
|
-
} catch (e) {
|
|
185
|
-
throw new Error(`Cannot find any matches between the given images. Try another detection algorithm. ` + ` Original error: ${e}`);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
const totalCount = matches.length;
|
|
189
|
-
|
|
190
|
-
if ((0, _util.hasValue)(goodMatchesFactor)) {
|
|
191
|
-
if (_lodash.default.isFunction(goodMatchesFactor)) {
|
|
192
|
-
const distances = matches.map(match => match.distance);
|
|
193
|
-
|
|
194
|
-
const minDistance = _lodash.default.min(distances);
|
|
195
|
-
|
|
196
|
-
const maxDistance = _lodash.default.max(distances);
|
|
197
|
-
|
|
198
|
-
matches = matches.filter(match => goodMatchesFactor(match.distance, minDistance, maxDistance));
|
|
199
|
-
} else {
|
|
200
|
-
if (matches.length > goodMatchesFactor) {
|
|
201
|
-
matches = matches.sort((match1, match2) => match1.distance - match2.distance).slice(0, goodMatchesFactor);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
const extractPoint = (keyPoints, indexPropertyName) => match => {
|
|
207
|
-
const {
|
|
208
|
-
pt,
|
|
209
|
-
point
|
|
210
|
-
} = keyPoints[match[indexPropertyName]];
|
|
211
|
-
return pt || point;
|
|
212
|
-
};
|
|
213
|
-
|
|
214
|
-
const points1 = matches.map(extractPoint(result1.keyPoints, 'queryIdx'));
|
|
215
|
-
const rect1 = calculateMatchedRect(points1);
|
|
216
|
-
const points2 = matches.map(extractPoint(result2.keyPoints, 'trainIdx'));
|
|
217
|
-
const rect2 = calculateMatchedRect(points2);
|
|
218
|
-
const result = {
|
|
219
|
-
points1,
|
|
220
|
-
rect1,
|
|
221
|
-
points2,
|
|
222
|
-
rect2,
|
|
223
|
-
totalCount,
|
|
224
|
-
count: matches.length
|
|
225
|
-
};
|
|
226
|
-
|
|
227
|
-
if (visualize) {
|
|
228
|
-
const visualization = cv.drawMatches(img1, img2, result1.keyPoints, result2.keyPoints, matches);
|
|
229
|
-
highlightRegion(visualization, rect1);
|
|
230
|
-
highlightRegion(visualization, {
|
|
231
|
-
x: img1.cols + rect2.x,
|
|
232
|
-
y: rect2.y,
|
|
233
|
-
width: rect2.width,
|
|
234
|
-
height: rect2.height
|
|
235
|
-
});
|
|
236
|
-
result.visualization = await cv.imencodeAsync('.png', visualization);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
return result;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
async function getImagesSimilarity(img1Data, img2Data, options = {}) {
|
|
243
|
-
await initOpenCV();
|
|
244
|
-
const {
|
|
245
|
-
method = DEFAULT_MATCHING_METHOD,
|
|
246
|
-
visualize = false
|
|
247
|
-
} = options;
|
|
248
|
-
let [template, reference] = await _bluebird.default.all([cv.imdecodeAsync(img1Data), cv.imdecodeAsync(img2Data)]);
|
|
249
|
-
|
|
250
|
-
if (template.rows !== reference.rows || template.cols !== reference.cols) {
|
|
251
|
-
throw new Error('Both images are expected to have the same size in order to ' + 'calculate the similarity score.');
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
[template, reference] = await _bluebird.default.all([template.convertToAsync(cv.CV_8UC3), reference.convertToAsync(cv.CV_8UC3)]);
|
|
255
|
-
let matched;
|
|
256
|
-
|
|
257
|
-
try {
|
|
258
|
-
matched = await reference.matchTemplateAsync(template, toMatchingMethod(method));
|
|
259
|
-
} catch (e) {
|
|
260
|
-
throw new Error(`The reference image did not match to the template one. Original error: ${e.message}`);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
const minMax = await matched.minMaxLocAsync();
|
|
264
|
-
const result = {
|
|
265
|
-
score: minMax.maxVal
|
|
266
|
-
};
|
|
267
|
-
|
|
268
|
-
if (visualize) {
|
|
269
|
-
const resultMat = new cv.Mat(template.rows, template.cols * 2, cv.CV_8UC3);
|
|
270
|
-
await _bluebird.default.all([reference.copyToAsync(resultMat.getRegion(new cv.Rect(0, 0, reference.cols, reference.rows))), template.copyToAsync(resultMat.getRegion(new cv.Rect(reference.cols, 0, template.cols, template.rows)))]);
|
|
271
|
-
let mask = reference.absdiff(template);
|
|
272
|
-
mask = await mask.cvtColorAsync(cv.COLOR_BGR2GRAY);
|
|
273
|
-
let contours = [];
|
|
274
|
-
|
|
275
|
-
try {
|
|
276
|
-
mask = await mask.thresholdAsync(128, 255, cv.THRESH_BINARY | cv.THRESH_OTSU);
|
|
277
|
-
contours = await mask.findContoursAsync(cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE);
|
|
278
|
-
} catch (ign) {}
|
|
279
|
-
|
|
280
|
-
for (const contour of contours) {
|
|
281
|
-
const boundingRect = contour.boundingRect();
|
|
282
|
-
highlightRegion(resultMat, boundingRect);
|
|
283
|
-
highlightRegion(resultMat, {
|
|
284
|
-
x: reference.cols + boundingRect.x,
|
|
285
|
-
y: boundingRect.y,
|
|
286
|
-
width: boundingRect.width,
|
|
287
|
-
height: boundingRect.height
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
result.visualization = await cv.imencodeAsync('.png', resultMat);
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
return result;
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
async function getImageOccurrence(fullImgData, partialImgData, options = {}) {
|
|
298
|
-
await initOpenCV();
|
|
299
|
-
const {
|
|
300
|
-
visualize = false,
|
|
301
|
-
threshold = DEFAULT_MATCH_THRESHOLD,
|
|
302
|
-
multiple = false,
|
|
303
|
-
matchNeighbourThreshold = MATCH_NEIGHBOUR_THRESHOLD,
|
|
304
|
-
method = DEFAULT_MATCHING_METHOD
|
|
305
|
-
} = options;
|
|
306
|
-
const [fullImg, partialImg] = await _bluebird.default.all([cv.imdecodeAsync(fullImgData), cv.imdecodeAsync(partialImgData)]);
|
|
307
|
-
const results = [];
|
|
308
|
-
let visualization = null;
|
|
309
|
-
|
|
310
|
-
try {
|
|
311
|
-
const matched = await fullImg.matchTemplateAsync(partialImg, toMatchingMethod(method));
|
|
312
|
-
const minMax = await matched.minMaxLocAsync();
|
|
313
|
-
|
|
314
|
-
if (multiple) {
|
|
315
|
-
const nonZeroMatchResults = matched.threshold(threshold, 1, cv.THRESH_BINARY).convertTo(cv.CV_8U).findNonZero();
|
|
316
|
-
const matches = filterNearMatches(nonZeroMatchResults, matchNeighbourThreshold);
|
|
317
|
-
|
|
318
|
-
for (const {
|
|
319
|
-
x,
|
|
320
|
-
y
|
|
321
|
-
} of matches) {
|
|
322
|
-
results.push({
|
|
323
|
-
score: matched.at(y, x),
|
|
324
|
-
rect: {
|
|
325
|
-
x,
|
|
326
|
-
y,
|
|
327
|
-
width: partialImg.cols,
|
|
328
|
-
height: partialImg.rows
|
|
329
|
-
}
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
} else if (minMax.maxVal >= threshold) {
|
|
333
|
-
const {
|
|
334
|
-
x,
|
|
335
|
-
y
|
|
336
|
-
} = method.includes('SQDIFF') ? minMax.minLoc : minMax.maxLoc;
|
|
337
|
-
results.push({
|
|
338
|
-
score: minMax.maxVal,
|
|
339
|
-
rect: {
|
|
340
|
-
x,
|
|
341
|
-
y,
|
|
342
|
-
width: partialImg.cols,
|
|
343
|
-
height: partialImg.rows
|
|
344
|
-
}
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
if (_lodash.default.isEmpty(results)) {
|
|
349
|
-
throw new Error(`Match threshold: ${threshold}. Highest match value ` + `found was ${minMax.maxVal}`);
|
|
350
|
-
}
|
|
351
|
-
} catch (e) {
|
|
352
|
-
throw new Error(`Cannot find any occurrences of the partial image in the full image. ` + `Original error: ${e.message}`);
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
if (visualize) {
|
|
356
|
-
const fullHighlightedImage = fullImg.copy();
|
|
357
|
-
|
|
358
|
-
for (const result of results) {
|
|
359
|
-
const singleHighlightedImage = fullImg.copy();
|
|
360
|
-
highlightRegion(singleHighlightedImage, result.rect);
|
|
361
|
-
highlightRegion(fullHighlightedImage, result.rect);
|
|
362
|
-
result.visualization = await cv.imencodeAsync('.png', singleHighlightedImage);
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
visualization = await cv.imencodeAsync('.png', fullHighlightedImage);
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
return {
|
|
369
|
-
rect: results[0].rect,
|
|
370
|
-
score: results[0].score,
|
|
371
|
-
visualization,
|
|
372
|
-
multiple: results
|
|
373
|
-
};
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
function filterNearMatches(nonZeroMatchResults, matchNeighbourThreshold) {
|
|
377
|
-
return nonZeroMatchResults.reduce((acc, element) => {
|
|
378
|
-
if (!acc.some(match => distance(match, element) <= matchNeighbourThreshold)) {
|
|
379
|
-
acc.push(element);
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
return acc;
|
|
383
|
-
}, []);
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
function distance(point1, point2) {
|
|
387
|
-
const a2 = Math.pow(point1.x - point2.x, 2);
|
|
388
|
-
const b2 = Math.pow(point1.y - point2.y, 2);
|
|
389
|
-
return Math.sqrt(a2 + b2);
|
|
390
|
-
}
|
|
391
|
-
|
|
392
66
|
async function cropBase64Image(base64Image, rect) {
|
|
393
67
|
const image = await base64ToImage(base64Image);
|
|
394
68
|
cropImage(image, rect);
|
|
@@ -470,4 +144,4 @@ function getRectIntersection(rect, imageSize) {
|
|
|
470
144
|
}require('source-map-support').install();
|
|
471
145
|
|
|
472
146
|
|
|
473
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9pbWFnZS11dGlsLmpzIl0sIm5hbWVzIjpbIk1JTUVfSlBFRyIsIk1JTUVfUE5HIiwiTUlNRV9CTVAiLCJKaW1wIiwiY3YiLCJCWVRFU19JTl9QSVhFTF9CTE9DSyIsIlNDQU5MSU5FX0ZJTFRFUl9NRVRIT0QiLCJERUZBVUxUX01BVENIX1RIUkVTSE9MRCIsIk1BVENIX05FSUdIQk9VUl9USFJFU0hPTEQiLCJBVkFJTEFCTEVfREVURUNUT1JTIiwiQVZBSUxBQkxFX01BVENISU5HX0ZVTkNUSU9OUyIsIk1BVENISU5HX01FVEhPRFMiLCJERUZBVUxUX01BVENISU5HX01FVEhPRCIsInRvTWF0Y2hpbmdNZXRob2QiLCJuYW1lIiwiaW5jbHVkZXMiLCJFcnJvciIsImdldEppbXBJbWFnZSIsImRhdGEiLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsIl8iLCJpc1N0cmluZyIsImlzQnVmZmVyIiwiQnVmZmVyIiwiZnJvbSIsImVyciIsImltZ09iaiIsIl9nZXRCdWZmZXIiLCJnZXRCdWZmZXIiLCJiaW5kIiwicHJvbWlzaWZ5IiwiY29udGV4dCIsImluaXRPcGVuQ1YiLCJsb2ciLCJkZWJ1ZyIsIndhcm4iLCJtZXNzYWdlIiwiZGV0ZWN0QW5kQ29tcHV0ZSIsImltZyIsImRldGVjdG9yIiwia2V5UG9pbnRzIiwiZGV0ZWN0QXN5bmMiLCJkZXNjcmlwdG9yIiwiY29tcHV0ZUFzeW5jIiwiY2FsY3VsYXRlTWF0Y2hlZFJlY3QiLCJtYXRjaGVkUG9pbnRzIiwibGVuZ3RoIiwieCIsInkiLCJ3aWR0aCIsImhlaWdodCIsInBvaW50c1NvcnRlZEJ5RGlzdGFuY2UiLCJtYXAiLCJwb2ludCIsIk1hdGgiLCJzcXJ0Iiwic29ydCIsInBhaXIxIiwicGFpcjIiLCJwYWlyIiwiZmlyc3RQb2ludCIsImhlYWQiLCJsYXN0UG9pbnQiLCJsYXN0IiwidG9wTGVmdFBvaW50IiwiYm90dG9tUmlnaHRQb2ludCIsImhpZ2hsaWdodFJlZ2lvbiIsIm1hdCIsInJlZ2lvbiIsImNvbG9yIiwiVmVjIiwidGhpY2tuZXNzIiwiZHJhd1JlY3RhbmdsZSIsIlJlY3QiLCJMSU5FXzgiLCJnZXRJbWFnZXNNYXRjaGVzIiwiaW1nMURhdGEiLCJpbWcyRGF0YSIsIm9wdGlvbnMiLCJkZXRlY3Rvck5hbWUiLCJ2aXN1YWxpemUiLCJnb29kTWF0Y2hlc0ZhY3RvciIsIm1hdGNoRnVuYyIsIkpTT04iLCJzdHJpbmdpZnkiLCJpbWcxIiwiaW1nMiIsImFsbCIsImltZGVjb2RlQXN5bmMiLCJyZXN1bHQxIiwicmVzdWx0MiIsIm1hdGNoZXMiLCJlIiwidG90YWxDb3VudCIsImlzRnVuY3Rpb24iLCJkaXN0YW5jZXMiLCJtYXRjaCIsImRpc3RhbmNlIiwibWluRGlzdGFuY2UiLCJtaW4iLCJtYXhEaXN0YW5jZSIsIm1heCIsImZpbHRlciIsIm1hdGNoMSIsIm1hdGNoMiIsInNsaWNlIiwiZXh0cmFjdFBvaW50IiwiaW5kZXhQcm9wZXJ0eU5hbWUiLCJwdCIsInBvaW50czEiLCJyZWN0MSIsInBvaW50czIiLCJyZWN0MiIsInJlc3VsdCIsImNvdW50IiwidmlzdWFsaXphdGlvbiIsImRyYXdNYXRjaGVzIiwiY29scyIsImltZW5jb2RlQXN5bmMiLCJnZXRJbWFnZXNTaW1pbGFyaXR5IiwibWV0aG9kIiwidGVtcGxhdGUiLCJyZWZlcmVuY2UiLCJyb3dzIiwiY29udmVydFRvQXN5bmMiLCJDVl84VUMzIiwibWF0Y2hlZCIsIm1hdGNoVGVtcGxhdGVBc3luYyIsIm1pbk1heCIsIm1pbk1heExvY0FzeW5jIiwic2NvcmUiLCJtYXhWYWwiLCJyZXN1bHRNYXQiLCJNYXQiLCJjb3B5VG9Bc3luYyIsImdldFJlZ2lvbiIsIm1hc2siLCJhYnNkaWZmIiwiY3Z0Q29sb3JBc3luYyIsIkNPTE9SX0JHUjJHUkFZIiwiY29udG91cnMiLCJ0aHJlc2hvbGRBc3luYyIsIlRIUkVTSF9CSU5BUlkiLCJUSFJFU0hfT1RTVSIsImZpbmRDb250b3Vyc0FzeW5jIiwiUkVUUl9FWFRFUk5BTCIsIkNIQUlOX0FQUFJPWF9TSU1QTEUiLCJpZ24iLCJjb250b3VyIiwiYm91bmRpbmdSZWN0IiwiZ2V0SW1hZ2VPY2N1cnJlbmNlIiwiZnVsbEltZ0RhdGEiLCJwYXJ0aWFsSW1nRGF0YSIsInRocmVzaG9sZCIsIm11bHRpcGxlIiwibWF0Y2hOZWlnaGJvdXJUaHJlc2hvbGQiLCJmdWxsSW1nIiwicGFydGlhbEltZyIsInJlc3VsdHMiLCJub25aZXJvTWF0Y2hSZXN1bHRzIiwiY29udmVydFRvIiwiQ1ZfOFUiLCJmaW5kTm9uWmVybyIsImZpbHRlck5lYXJNYXRjaGVzIiwicHVzaCIsImF0IiwicmVjdCIsIm1pbkxvYyIsIm1heExvYyIsImlzRW1wdHkiLCJmdWxsSGlnaGxpZ2h0ZWRJbWFnZSIsImNvcHkiLCJzaW5nbGVIaWdobGlnaHRlZEltYWdlIiwicmVkdWNlIiwiYWNjIiwiZWxlbWVudCIsInNvbWUiLCJwb2ludDEiLCJwb2ludDIiLCJhMiIsInBvdyIsImIyIiwiY3JvcEJhc2U2NEltYWdlIiwiYmFzZTY0SW1hZ2UiLCJpbWFnZSIsImJhc2U2NFRvSW1hZ2UiLCJjcm9wSW1hZ2UiLCJpbWFnZVRvQmFzZTY0IiwiaW1hZ2VCdWZmZXIiLCJQTkciLCJmaWx0ZXJUeXBlIiwicGFyc2UiLCJjaHVua3MiLCJwYWNrIiwib24iLCJjaHVuayIsImNvbmNhdCIsInRvU3RyaW5nIiwiaW1hZ2VSZWN0IiwiaW50ZXJSZWN0IiwiZ2V0UmVjdEludGVyc2VjdGlvbiIsImZpcnN0VmVydGljYWxQaXhlbCIsInRvcCIsImxhc3RWZXJ0aWNhbFBpeGVsIiwiZmlyc3RIb3Jpem9udGFsUGl4ZWwiLCJsZWZ0IiwibGFzdEhvcml6b250YWxQaXhlbCIsImNyb3BwZWRBcnJheSIsImZpcnN0Qnl0ZUlkeEluUGl4ZWxCbG9jayIsImJ5dGVJZHgiLCJpbWFnZVNpemUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNO0FBQUVBLEVBQUFBLFNB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QUNySixNQUF6QjtBQUNBLFNBQU9zSSxLQUFQO0FBQ0Q7O0FBRUQsU0FBU2dCLG1CQUFULENBQThCbEMsSUFBOUIsRUFBb0M0QyxTQUFwQyxFQUErQztBQUM3QyxRQUFNTCxJQUFJLEdBQUd2QyxJQUFJLENBQUN1QyxJQUFMLElBQWFLLFNBQVMsQ0FBQ2pLLEtBQXZCLEdBQStCaUssU0FBUyxDQUFDakssS0FBekMsR0FBaURxSCxJQUFJLENBQUN1QyxJQUFuRTtBQUNBLFFBQU1ILEdBQUcsR0FBR3BDLElBQUksQ0FBQ29DLEdBQUwsSUFBWVEsU0FBUyxDQUFDaEssTUFBdEIsR0FBK0JnSyxTQUFTLENBQUNoSyxNQUF6QyxHQUFrRG9ILElBQUksQ0FBQ29DLEdBQW5FO0FBQ0EsUUFBTXpKLEtBQUssR0FBR2lLLFNBQVMsQ0FBQ2pLLEtBQVYsSUFBb0I0SixJQUFJLEdBQUd2QyxJQUFJLENBQUNySCxLQUFoQyxHQUF5Q3FILElBQUksQ0FBQ3JILEtBQTlDLEdBQXVEaUssU0FBUyxDQUFDakssS0FBVixHQUFrQjRKLElBQXZGO0FBQ0EsUUFBTTNKLE1BQU0sR0FBR2dLLFNBQVMsQ0FBQ2hLLE1BQVYsSUFBcUJ3SixHQUFHLEdBQUdwQyxJQUFJLENBQUNwSCxNQUFoQyxHQUEwQ29ILElBQUksQ0FBQ3BILE1BQS9DLEdBQXlEZ0ssU0FBUyxDQUFDaEssTUFBVixHQUFtQndKLEdBQTNGO0FBQ0EsU0FBTztBQUFDRyxJQUFBQSxJQUFEO0FBQU9ILElBQUFBLEdBQVA7QUFBWXpKLElBQUFBLEtBQVo7QUFBbUJDLElBQUFBO0FBQW5CLEdBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgSmltcCBmcm9tICdqaW1wJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyBQTkcgfSBmcm9tICdwbmdqcyc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBoYXNWYWx1ZSB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IHJlcXVpcmVQYWNrYWdlIH0gZnJvbSAnLi9ub2RlJztcblxuXG5jb25zdCB7IE1JTUVfSlBFRywgTUlNRV9QTkcsIE1JTUVfQk1QIH0gPSBKaW1wO1xubGV0IGN2ID0gbnVsbDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSZWdpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZWZ0IC0gVGhlIG9mZnNldCBmcm9tIHRoZSBsZWZ0IHNpZGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0b3AgLSBUaGUgb2Zmc2V0IGZyb20gdGhlIHRvcFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoXG4gKiBAcHJvcGVydHkge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUG9pbnRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSZWN0XG4gKiBAcHJvcGVydHkge251bWJlcn0geCAtIFRoZSB0b3AgbGVmdCBjb29yZGluYXRlXG4gKiBAcHJvcGVydHkge251bWJlcn0geSAtIFRoZSBib3R0b20gcmlnaHQgY29vcmRpbmF0ZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoXG4gKiBAcHJvcGVydHkge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodFxuICovXG5cbmNvbnN0IEJZVEVTX0lOX1BJWEVMX0JMT0NLID0gNDtcbmNvbnN0IFNDQU5MSU5FX0ZJTFRFUl9NRVRIT0QgPSA0O1xuY29uc3QgREVGQVVMVF9NQVRDSF9USFJFU0hPTEQgPSAwLjU7XG5jb25zdCBNQVRDSF9ORUlHSEJPVVJfVEhSRVNIT0xEID0gMTA7XG5cbmNvbnN0IEFWQUlMQUJMRV9ERVRFQ1RPUlMgPSBbXG4gICdBS0FaRScsXG4gICdBR0FTVCcsXG4gICdCUklTSycsXG4gICdGQVNUJyxcbiAgJ0dGVFQnLFxuICAnS0FaRScsXG4gICdNU0VSJyxcbiAgJ1NJRlQnLFxuICAnT1JCJyxcbl07XG5cbmNvbnN0IEFWQUlMQUJMRV9NQVRDSElOR19GVU5DVElPTlMgPSBbXG4gICdGbGFubkJhc2VkJyxcbiAgJ0JydXRlRm9yY2UnLFxuICAnQnJ1dGVGb3JjZUwxJyxcbiAgJ0JydXRlRm9yY2VIYW1taW5nJyxcbiAgJ0JydXRlRm9yY2VIYW1taW5nTHV0JyxcbiAgJ0JydXRlRm9yY2VTTDInLFxuXTtcblxuY29uc3QgTUFUQ0hJTkdfTUVUSE9EUyA9IFtcbiAgJ1RNX0NDT0VGRicsXG4gICdUTV9DQ09FRkZfTk9STUVEJyxcbiAgJ1RNX0NDT1JSJyxcbiAgJ1RNX0NDT1JSX05PUk1FRCcsXG4gICdUTV9TUURJRkYnLFxuICAnVE1fU1FESUZGX05PUk1FRCcsXG5dO1xuY29uc3QgREVGQVVMVF9NQVRDSElOR19NRVRIT0QgPSAnVE1fQ0NPRUZGX05PUk1FRCc7XG5cbi8qKlxuICogVHJhbnNmb3JtcyBtYXRjaGluZyBtZXRob2QgbmFtZSB0byB0aGUgYWN0dWFsXG4gKiBjb25zdGFudCB2YWx1ZSBmcm9tIE9wZW5DViBsaWJyYXJ5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgT25lIG9mIHN1cHBvcnRlZCBtZXRob2QgbmFtZXNcbiAqIChzZWUgTUFUQ0hJTkdfTUVUSE9EUyBhcnJheSBhYm92ZSlcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBtZXRob2QgdmFsdWVcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBhbiB1bnN1cHBvcnRlZCBtZXRob2QgbmFtZSBpcyBnaXZlblxuICovXG5mdW5jdGlvbiB0b01hdGNoaW5nTWV0aG9kIChuYW1lKSB7XG4gIGlmICghTUFUQ0hJTkdfTUVUSE9EUy5pbmNsdWRlcyhuYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIG1hdGNoaW5nIG1ldGhvZCAnJHtuYW1lfScgaXMgdW5rbm93bi4gYCArXG4gICAgICBgT25seSB0aGUgZm9sbG93aW5nIG1hdGNoaW5nIG1ldGhvZHMgYXJlIHN1cHBvcnRlZDogJHtNQVRDSElOR19NRVRIT0RTfWApO1xuICB9XG4gIHJldHVybiBjdltuYW1lXTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdldCBhIEppbXAgaW1hZ2Ugb2JqZWN0IGZyb20gYnVmZmVyIG9yIGJhc2U2NCBkYXRhLiBKaW1wXG4gKiBpcyBhIGdyZWF0IGxpYnJhcnkgaG93ZXZlciBpdCBkb2VzIElPIGluIHRoZSBjb25zdHJ1Y3RvciBzbyBpdCdzIG5vdFxuICogY29udmVuaWVudCBmb3Igb3VyIGFzeW5jL2F3YWl0IG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfHN0cmluZ30gZGF0YSAtIGJpbmFyeSBpbWFnZSBidWZmZXIgb3IgYmFzZTY0LWVuY29kZWQgaW1hZ2VcbiAqIHN0cmluZ1xuICogQHJldHVybnMge0ppbXB9IC0gdGhlIGppbXAgaW1hZ2Ugb2JqZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEppbXBJbWFnZSAoZGF0YSkge1xuICByZXR1cm4gYXdhaXQgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGlmICghXy5pc1N0cmluZyhkYXRhKSAmJiAhXy5pc0J1ZmZlcihkYXRhKSkge1xuICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ011c3QgaW5pdGlhbGl6ZSBqaW1wIG9iamVjdCB3aXRoIHN0cmluZyBvciBidWZmZXInKSk7XG4gICAgfVxuICAgIC8vIGlmIGRhdGEgaXMgYSBzdHJpbmcsIGFzc3VtZSBpdCBpcyBhIGJhc2U2NC1lbmNvZGVkIGltYWdlXG4gICAgaWYgKF8uaXNTdHJpbmcoZGF0YSkpIHtcbiAgICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhLCAnYmFzZTY0Jyk7XG4gICAgfVxuICAgIG5ldyBKaW1wKGRhdGEsIChlcnIsIGltZ09iaikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICB9XG4gICAgICBpZiAoIWltZ09iaikge1xuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignQ291bGQgbm90IGNyZWF0ZSBqaW1wIGltYWdlIGZyb20gdGhhdCBkYXRhJykpO1xuICAgICAgfVxuICAgICAgaW1nT2JqLl9nZXRCdWZmZXIgPSBpbWdPYmouZ2V0QnVmZmVyLmJpbmQoaW1nT2JqKTtcbiAgICAgIGltZ09iai5nZXRCdWZmZXIgPSBCLnByb21pc2lmeShpbWdPYmouX2dldEJ1ZmZlciwge2NvbnRleHQ6IGltZ09ian0pO1xuICAgICAgcmVzb2x2ZShpbWdPYmopO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgb3BlbmN2NG5vZGVqcyBtb2R1bGUgaXMgbm90IGluc3RhbGxlZCBvciBjYW5ub3QgYmUgbG9hZGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRPcGVuQ1YgKCkge1xuICBpZiAoY3YpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsb2cuZGVidWcoYEluaXRpYWxpemluZyBvcGVuY3ZgKTtcbiAgdHJ5IHtcbiAgICBjdiA9IGF3YWl0IHJlcXVpcmVQYWNrYWdlKCdvcGVuY3Y0bm9kZWpzJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKGBVbmFibGUgdG8gbG9hZCAnb3BlbmN2NG5vZGVqcyc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cblxuICBpZiAoIWN2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnb3BlbmN2NG5vZGVqcycgbW9kdWxlIGlzIHJlcXVpcmVkIHRvIHVzZSBPcGVuQ1YgZmVhdHVyZXMuIGAgK1xuICAgICAgICAgICAgICAgICAgICBgUGxlYXNlIGluc3RhbGwgaXQgZmlyc3QgKCducG0gaSAtZyBvcGVuY3Y0bm9kZWpzJykgYW5kIHJlc3RhcnQgQXBwaXVtLiBgICtcbiAgICAgICAgICAgICAgICAgICAgJ1JlYWQgaHR0cHM6Ly9naXRodWIuY29tL2p1c3RhZHVkZXdob2hhY2tzL29wZW5jdjRub2RlanMjaG93LXRvLWluc3RhbGwgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzIHRvcGljLicpO1xuICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWF0Y2hDb21wdXRhdGlvblJlc3VsdFxuICogQHByb3BlcnR5IHtjdi5EZXNjcmlwdG9yTWF0Y2h9IGRlc2NpcHRvciAtIE9wZW5DViBtYXRjaCBkZXNjcmlwdG9yXG4gKiBAcHJvcGVydHkge0FycmF5PGN2LktleVBvaW50Pn0ga2V5UG9pbnRzIC0gVGhlIGFycmF5IG9mIGtleSBwb2ludHNcbiAqL1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgYW4gT3BlbkNWIG1hdGNoIGRlc2NyaXB0b3Igb2YgYW4gaW1hZ2UsIHdoaWNoIGNhbiBiZSB1c2VkXG4gKiBmb3IgYnJ1dGUtZm9yY2UgbWF0Y2hpbmcuXG4gKiBSZWFkIGh0dHBzOi8vZG9jcy5vcGVuY3Yub3JnLzMuMC1iZXRhL2RvYy9weV90dXRvcmlhbHMvcHlfZmVhdHVyZTJkL3B5X21hdGNoZXIvcHlfbWF0Y2hlci5odG1sXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSB7Y3YuTWF0fSBpbWcgSW1hZ2UgZGF0YVxuICogQHBhcmFtIHtjdi5GZWF0dXJlRGV0ZWN0b3J9IGRldGVjdG9yIE9wZW5DViBmZWF0dXJlIGRldGVjdG9yIGluc3RhbmNlXG4gKlxuICogQHJldHVybnMge01hdGNoQ29tcHV0YXRpb25SZXN1bHR9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRldGVjdEFuZENvbXB1dGUgKGltZywgZGV0ZWN0b3IpIHtcbiAgY29uc3Qga2V5UG9pbnRzID0gYXdhaXQgZGV0ZWN0b3IuZGV0ZWN0QXN5bmMoaW1nKTtcbiAgY29uc3QgZGVzY3JpcHRvciA9IGF3YWl0IGRldGVjdG9yLmNvbXB1dGVBc3luYyhpbWcsIGtleVBvaW50cyk7XG4gIHJldHVybiB7XG4gICAga2V5UG9pbnRzLFxuICAgIGRlc2NyaXB0b3JcbiAgfTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVkIHRoZSBib3VuZGluZyByZWN0IGNvb3JkaW5hdGVzIGZvciB0aGUgYXJyYXkgb2YgbWF0Y2hpbmcgcG9pbnRzXG4gKlxuICogQHBhcmFtIHtBcnJheTxQb2ludD59IG1hdGNoZWRQb2ludHMgQXJyYXkgb2YgbWF0Y2hpbmcgcG9pbnRzXG4gKiBAcmV0dXJucyB7UmVjdH0gVGhlIG1hdGNoaW5nIGJvdW5kaW5nIHJlY3Qgb3IgYSB6ZXJvIHJlY3QgaWYgbm8gbWF0Y2hcbiAqIGNhbiBiZSBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlTWF0Y2hlZFJlY3QgKG1hdGNoZWRQb2ludHMpIHtcbiAgaWYgKG1hdGNoZWRQb2ludHMubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMCxcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHBvaW50c1NvcnRlZEJ5RGlzdGFuY2UgPSBtYXRjaGVkUG9pbnRzXG4gICAgLm1hcCgocG9pbnQpID0+IFtNYXRoLnNxcnQocG9pbnQueCAqIHBvaW50LnggKyBwb2ludC55ICogcG9pbnQueSksIHBvaW50XSlcbiAgICAuc29ydCgocGFpcjEsIHBhaXIyKSA9PiBwYWlyMVswXSA+PSBwYWlyMlswXSlcbiAgICAubWFwKChwYWlyKSA9PiBwYWlyWzFdKTtcbiAgY29uc3QgZmlyc3RQb2ludCA9IF8uaGVhZChwb2ludHNTb3J0ZWRCeURpc3RhbmNlKTtcbiAgY29uc3QgbGFzdFBvaW50ID0gXy5sYXN0KHBvaW50c1NvcnRlZEJ5RGlzdGFuY2UpO1xuICBjb25zdCB0b3BMZWZ0UG9pbnQgPSB7XG4gICAgeDogZmlyc3RQb2ludC54IDw9IGxhc3RQb2ludC54ID8gZmlyc3RQb2ludC54IDogbGFzdFBvaW50LngsXG4gICAgeTogZmlyc3RQb2ludC55IDw9IGxhc3RQb2ludC55ID8gZmlyc3RQb2ludC55IDogbGFzdFBvaW50LnksXG4gIH07XG4gIGNvbnN0IGJvdHRvbVJpZ2h0UG9pbnQgPSB7XG4gICAgeDogZmlyc3RQb2ludC54ID49IGxhc3RQb2ludC54ID8gZmlyc3RQb2ludC54IDogbGFzdFBvaW50LngsXG4gICAgeTogZmlyc3RQb2ludC55ID49IGxhc3RQb2ludC55ID8gZmlyc3RQb2ludC55IDogbGFzdFBvaW50LnksXG4gIH07XG4gIHJldHVybiB7XG4gICAgeDogdG9wTGVmdFBvaW50LngsXG4gICAgeTogdG9wTGVmdFBvaW50LnksXG4gICAgd2lkdGg6IGJvdHRvbVJpZ2h0UG9pbnQueCAtIHRvcExlZnRQb2ludC54LFxuICAgIGhlaWdodDogYm90dG9tUmlnaHRQb2ludC55IC0gdG9wTGVmdFBvaW50LnlcbiAgfTtcbn1cblxuLyoqXG4gKiBEcmF3cyBhIHJlY3Rhbm5nbGUgb24gdGhlIGdpdmVuIGltYWdlIG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7Y3YuTWF0fSBtYXQgVGhlIHNvdXJjZSBpbWFnZVxuICogQHBhcmFtIHtSZWN0fSByZWdpb24gVGhlIHJlZ2lvbiB0byBoaWdobGlnaHRcbiAqXG4gKiBAcmV0dXJucyB7Y3YuTWF0fSBUaGUgc2FtZSBpbWFnZSB3aXRoIHRoZSByZWN0YW5nbGUgb24gaXRcbiAqL1xuZnVuY3Rpb24gaGlnaGxpZ2h0UmVnaW9uIChtYXQsIHJlZ2lvbikge1xuICBpZiAocmVnaW9uLndpZHRoIDw9IDAgfHwgcmVnaW9uLmhlaWdodCA8PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gaGlnaGxpZ2h0IGluIHJlZFxuICBjb25zdCBjb2xvciA9IG5ldyBjdi5WZWMoMCwgMCwgMjU1KTtcbiAgY29uc3QgdGhpY2tuZXNzID0gMjtcbiAgbWF0LmRyYXdSZWN0YW5nbGUobmV3IGN2LlJlY3QocmVnaW9uLngsIHJlZ2lvbi55LCByZWdpb24ud2lkdGgsIHJlZ2lvbi5oZWlnaHQpLCBjb2xvciwgdGhpY2tuZXNzLCBjdi5MSU5FXzgpO1xuICByZXR1cm4gbWF0O1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1hdGNoaW5nT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBkZXRlY3Rvck5hbWUgWydPUkInXSBPbmUgb2YgcG9zc2libGUgT3BlbkNWIGZlYXR1cmUgZGV0ZWN0b3IgbmFtZXNcbiAqIGZyb20gYEFWQUlMQUJMRV9ERVRFQ1RPUlNgIGFycmF5LlxuICogU29tZSBvZiB0aGVzZSBtZXRob2RzIChGQVNULCBBR0FTVCwgR0ZUVCwgRkFTVCwgU0lGVCBhbmQgTVNFUikgYXJlIG5vdCBhdmFpbGFibGVcbiAqIGluIHRoZSBkZWZhdWx0IE9wZW5DViBpbnN0YWxsYXRpb24gYW5kIGhhdmUgdG8gYmUgZW5hYmxlZCBtYW51YWxseSBiZWZvcmVcbiAqIGxpYnJhcnkgY29tcGlsYXRpb24uXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG1hdGNoRnVuYyBbJ0JydXRlRm9yY2UnXSBUaGUgbmFtZSBvZiB0aGUgbWF0Y2hpbmcgZnVuY3Rpb24uXG4gKiBTaG91bGQgYmUgb25lIG9mIGBBVkFJTEFCTEVfTUFUQ0hJTkdfRlVOQ1RJT05TYCBhcnJheS5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcnxGdW5jdGlvbn0gZ29vZE1hdGNoZXNGYWN0b3IgVGhlIG1heGltdW0gY291bnQgb2YgXCJnb29kXCIgbWF0Y2hlc1xuICogKGUuIGcuIHdpdGggbWluaW1hbCBkaXN0YW5jZXMpIG9yIGEgZnVuY3Rpb24sIHdoaWNoIGFjY2VwdHMgMyBhcmd1bWVudHM6IHRoZSBjdXJyZW50IGRpc3RhbmNlLFxuICogbWluaW1hbCBkaXN0YW5jZSwgbWF4aW11bSBkaXN0YW5jZSBhbmQgcmV0dXJucyB0cnVlIG9yIGZhbHNlIHRvIGluY2x1ZGUgb3IgZXhjbHVkZSB0aGUgbWF0Y2guXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSB2aXN1YWxpemUgW2ZhbHNlXSBXaGV0aGVyIHRvIHJldHVybiB0aGUgcmVzdWx0aW5nIHZpc2FsaXphdGlvblxuICogYXMgYW4gaW1hZ2UgKHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzKVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWF0Y2hpbmdSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjb3VudCBUaGUgY291bnQgb2YgbWF0Y2hlZCBlZGdlcyBvbiBib3RoIGltYWdlcy5cbiAqIFRoZSBtb3JlIG1hdGNoaW5nIGVkZ2VzIHRoZXJlIGFyZSBubyBib3RoIGltYWdlcyB0aGUgbW9yZSBzaW1pbGFyIHRoZXkgYXJlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRvdGFsQ291bnQgVGhlIHRvdGFsIGNvdW50IG9mIG1hdGNoZWQgZWRnZXMgb24gYm90aCBpbWFnZXMuXG4gKiBJdCBpcyBlcXVhbCB0byBgY291bnRgIGlmIGBnb29kTWF0Y2hlc0ZhY3RvcmAgZG9lcyBub3QgbGltaXQgdGhlIG1hdGNoZXMsXG4gKiBvdGhlcndpc2UgaXQgY29udGFpbnMgdGhlIHRvdGFsIGNvdW50IG9mIG1hdGNoZXMgYmVmb3JlIGBnb29kTWF0Y2hlc0ZhY3RvcmAgaXNcbiAqIGFwcGxpZWQuXG4gKiBAcHJvcGVydHkgez9CdWZmZXJ9IHZpc3VhbGl6YXRpb24gVGhlIHZpc3VhbGl6YXRpb24gb2YgdGhlIG1hdGNoaW5nIHJlc3VsdFxuICogcmVwcmVzZW50ZWQgYXMgUE5HIGltYWdlIGJ1ZmZlci4gVGhpcyB2aXN1YWxpemF0aW9uIGxvb2tzIGxpa2VcbiAqIGh0dHBzOi8vdXNlci1pbWFnZXMuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzMxMTI1NTIxLzI5NzAyNzMxLWM3OWUzMTQyLTg5NzItMTFlNy05NDdlLWRiMTA5ZDQxNTQ2OS5qcGdcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8UG9pbnQ+fSBwb2ludHMxIFRoZSBhcnJheSBvZiBtYXRjaGluZyBwb2ludHMgb24gdGhlIGZpcnN0IGltYWdlXG4gKiBAcHJvcGVydHkge1JlY3R9IHJlY3QxIFRoZSBib3VuZGluZyByZWN0IGZvciB0aGUgYG1hdGNoZWRQb2ludHMxYCBzZXQgb3IgYSB6ZXJvIHJlY3RcbiAqIGlmIG5vdCBlbm91Z2ggbWF0Y2hpbmcgcG9pbnRzIGFyZSBmb3VuZFxuICogQHByb3BlcnR5IHtBcnJheTxQb2ludD59IHBvaW50czIgVGhlIGFycmF5IG9mIG1hdGNoaW5nIHBvaW50cyBvbiB0aGUgc2Vjb25kIGltYWdlXG4gKiBAcHJvcGVydHkge1JlY3R9IHJlY3QyIFRoZSBib3VuZGluZyByZWN0IGZvciB0aGUgYG1hdGNoZWRQb2ludHMyYCBzZXQgb3IgYSB6ZXJvIHJlY3RcbiAqIGlmIG5vdCBlbm91Z2ggbWF0Y2hpbmcgcG9pbnRzIGFyZSBmb3VuZFxuICovXG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgY291bnQgb2YgY29tbW9uIGVkZ2VzIGJldHdlZW4gdHdvIGltYWdlcy5cbiAqIFRoZSBpbWFnZXMgbWlnaHQgYmUgcm90YXRlZCBvciByZXNpemVkIHJlbGF0aXZlbHkgdG8gZWFjaCBvdGhlci5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gaW1nMURhdGEgVGhlIGRhdGEgb2YgdGhlIGZpcnN0IGltYWdlIHBhY2tlZCBpbnRvIGEgTm9kZUpTIGJ1ZmZlclxuICogQHBhcmFtIHtCdWZmZXJ9IGltZzJEYXRhIFRoZSBkYXRhIG9mIHRoZSBzZWNvbmQgaW1hZ2UgcGFja2VkIGludG8gYSBOb2RlSlMgYnVmZmVyXG4gKiBAcGFyYW0gez9NYXRjaGluZ09wdGlvbnN9IG9wdGlvbnMgW3t9XSBTZXQgb2YgbWF0Y2hpbmcgb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIHtNYXRjaGluZ1Jlc3VsdH0gTWFjaGluZyByZXN1bHRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBgZGV0ZWN0b3JOYW1lYCB2YWx1ZSBpcyB1bmtub3duLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRJbWFnZXNNYXRjaGVzIChpbWcxRGF0YSwgaW1nMkRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICBhd2FpdCBpbml0T3BlbkNWKCk7XG5cbiAgY29uc3Qge2RldGVjdG9yTmFtZSA9ICdPUkInLCB2aXN1YWxpemUgPSBmYWxzZSxcbiAgICAgICAgIGdvb2RNYXRjaGVzRmFjdG9yLCBtYXRjaEZ1bmMgPSAnQnJ1dGVGb3JjZSd9ID0gb3B0aW9ucztcbiAgaWYgKCFfLmluY2x1ZGVzKEFWQUlMQUJMRV9ERVRFQ1RPUlMsIGRldGVjdG9yTmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2RldGVjdG9yTmFtZX0nIGRldGVjdG9yIGlzIHVua25vd24uIGAgK1xuICAgICAgICAgICAgICAgICAgICBgT25seSAke0pTT04uc3RyaW5naWZ5KEFWQUlMQUJMRV9ERVRFQ1RPUlMpfSBkZXRlY3RvcnMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgfVxuICBpZiAoIV8uaW5jbHVkZXMoQVZBSUxBQkxFX01BVENISU5HX0ZVTkNUSU9OUywgbWF0Y2hGdW5jKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7bWF0Y2hGdW5jfScgbWF0Y2hpbmcgZnVuY3Rpb24gaXMgdW5rbm93bi4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBPbmx5ICR7SlNPTi5zdHJpbmdpZnkoQVZBSUxBQkxFX01BVENISU5HX0ZVTkNUSU9OUyl9IG1hdGNoaW5nIGZ1bmN0aW9ucyBhcmUgc3VwcG9ydGVkLmApO1xuICB9XG5cbiAgY29uc3QgZGV0ZWN0b3IgPSBuZXcgY3ZbYCR7ZGV0ZWN0b3JOYW1lfURldGVjdG9yYF0oKTtcbiAgY29uc3QgW2ltZzEsIGltZzJdID0gYXdhaXQgQi5hbGwoW1xuICAgIGN2LmltZGVjb2RlQXN5bmMoaW1nMURhdGEpLFxuICAgIGN2LmltZGVjb2RlQXN5bmMoaW1nMkRhdGEpXG4gIF0pO1xuICBjb25zdCBbcmVzdWx0MSwgcmVzdWx0Ml0gPSBhd2FpdCBCLmFsbChbXG4gICAgZGV0ZWN0QW5kQ29tcHV0ZShpbWcxLCBkZXRlY3RvciksXG4gICAgZGV0ZWN0QW5kQ29tcHV0ZShpbWcyLCBkZXRlY3RvcilcbiAgXSk7XG4gIGxldCBtYXRjaGVzID0gW107XG4gIHRyeSB7XG4gICAgbWF0Y2hlcyA9IGF3YWl0IGN2W2BtYXRjaCR7bWF0Y2hGdW5jfUFzeW5jYF0ocmVzdWx0MS5kZXNjcmlwdG9yLCByZXN1bHQyLmRlc2NyaXB0b3IpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBhbnkgbWF0Y2hlcyBiZXR3ZWVuIHRoZSBnaXZlbiBpbWFnZXMuIFRyeSBhbm90aGVyIGRldGVjdGlvbiBhbGdvcml0aG0uIGAgK1xuICAgICAgICAgICAgICAgICAgICBgIE9yaWdpbmFsIGVycm9yOiAke2V9YCk7XG4gIH1cbiAgY29uc3QgdG90YWxDb3VudCA9IG1hdGNoZXMubGVuZ3RoO1xuICBpZiAoaGFzVmFsdWUoZ29vZE1hdGNoZXNGYWN0b3IpKSB7XG4gICAgaWYgKF8uaXNGdW5jdGlvbihnb29kTWF0Y2hlc0ZhY3RvcikpIHtcbiAgICAgIGNvbnN0IGRpc3RhbmNlcyA9IG1hdGNoZXMubWFwKChtYXRjaCkgPT4gbWF0Y2guZGlzdGFuY2UpO1xuICAgICAgY29uc3QgbWluRGlzdGFuY2UgPSBfLm1pbihkaXN0YW5jZXMpO1xuICAgICAgY29uc3QgbWF4RGlzdGFuY2UgPSBfLm1heChkaXN0YW5jZXMpO1xuICAgICAgbWF0Y2hlcyA9IG1hdGNoZXNcbiAgICAgICAgLmZpbHRlcigobWF0Y2gpID0+IGdvb2RNYXRjaGVzRmFjdG9yKG1hdGNoLmRpc3RhbmNlLCBtaW5EaXN0YW5jZSwgbWF4RGlzdGFuY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gZ29vZE1hdGNoZXNGYWN0b3IpIHtcbiAgICAgICAgbWF0Y2hlcyA9IG1hdGNoZXNcbiAgICAgICAgICAuc29ydCgobWF0Y2gxLCBtYXRjaDIpID0+IG1hdGNoMS5kaXN0YW5jZSAtIG1hdGNoMi5kaXN0YW5jZSlcbiAgICAgICAgICAuc2xpY2UoMCwgZ29vZE1hdGNoZXNGYWN0b3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGV4dHJhY3RQb2ludCA9IChrZXlQb2ludHMsIGluZGV4UHJvcGVydHlOYW1lKSA9PiAobWF0Y2gpID0+IHtcbiAgICBjb25zdCB7cHQsIHBvaW50fSA9IGtleVBvaW50c1ttYXRjaFtpbmRleFByb3BlcnR5TmFtZV1dO1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qdXN0YWR1ZGV3aG9oYWNrcy9vcGVuY3Y0bm9kZWpzL2lzc3Vlcy81ODRcbiAgICByZXR1cm4gKHB0IHx8IHBvaW50KTtcbiAgfTtcbiAgY29uc3QgcG9pbnRzMSA9IG1hdGNoZXMubWFwKGV4dHJhY3RQb2ludChyZXN1bHQxLmtleVBvaW50cywgJ3F1ZXJ5SWR4JykpO1xuICBjb25zdCByZWN0MSA9IGNhbGN1bGF0ZU1hdGNoZWRSZWN0KHBvaW50czEpO1xuICBjb25zdCBwb2ludHMyID0gbWF0Y2hlcy5tYXAoZXh0cmFjdFBvaW50KHJlc3VsdDIua2V5UG9pbnRzLCAndHJhaW5JZHgnKSk7XG4gIGNvbnN0IHJlY3QyID0gY2FsY3VsYXRlTWF0Y2hlZFJlY3QocG9pbnRzMik7XG5cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIHBvaW50czEsXG4gICAgcmVjdDEsXG4gICAgcG9pbnRzMixcbiAgICByZWN0MixcbiAgICB0b3RhbENvdW50LFxuICAgIGNvdW50OiBtYXRjaGVzLmxlbmd0aCxcbiAgfTtcbiAgaWYgKHZpc3VhbGl6ZSkge1xuICAgIGNvbnN0IHZpc3VhbGl6YXRpb24gPSBjdi5kcmF3TWF0Y2hlcyhpbWcxLCBpbWcyLCByZXN1bHQxLmtleVBvaW50cywgcmVzdWx0Mi5rZXlQb2ludHMsIG1hdGNoZXMpO1xuICAgIGhpZ2hsaWdodFJlZ2lvbih2aXN1YWxpemF0aW9uLCByZWN0MSk7XG4gICAgaGlnaGxpZ2h0UmVnaW9uKHZpc3VhbGl6YXRpb24sIHtcbiAgICAgIHg6IGltZzEuY29scyArIHJlY3QyLngsXG4gICAgICB5OiByZWN0Mi55LFxuICAgICAgd2lkdGg6IHJlY3QyLndpZHRoLFxuICAgICAgaGVpZ2h0OiByZWN0Mi5oZWlnaHRcbiAgICB9KTtcbiAgICByZXN1bHQudmlzdWFsaXphdGlvbiA9IGF3YWl0IGN2LmltZW5jb2RlQXN5bmMoJy5wbmcnLCB2aXN1YWxpemF0aW9uKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNpbWlsYXJpdHlPcHRpb25zXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSB2aXN1YWxpemUgW2ZhbHNlXSBXaGV0aGVyIHRvIHJldHVybiB0aGUgcmVzdWx0aW5nIHZpc2FsaXphdGlvblxuICogYXMgYW4gaW1hZ2UgKHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1ldGhvZCBbVE1fQ0NPRUZGX05PUk1FRF0gVGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIG1hdGNoaW5nIG1ldGhvZC5cbiAqIEFjY2VwdGFibGUgdmFsdWVzIGFyZTpcbiAqIC0gVE1fQ0NPRUZGXG4gKiAtIFRNX0NDT0VGRl9OT1JNRUQgKGRlZmF1bHQpXG4gKiAtIFRNX0NDT1JSXG4gKiAtIFRNX0NDT1JSX05PUk1FRFxuICogLSBUTV9TUURJRkZcbiAqIC0gVE1fU1FESUZGX05PUk1FRFxuICogUmVhZCBodHRwczovL2RvY3Mub3BlbmN2Lm9yZy8zLjAtYmV0YS9kb2MvcHlfdHV0b3JpYWxzL3B5X2ltZ3Byb2MvcHlfdGVtcGxhdGVfbWF0Y2hpbmcvcHlfdGVtcGxhdGVfbWF0Y2hpbmcuaHRtbFxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNpbWlsYXJpdHlSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY29yZSBUaGUgc2ltaWxhcml0eSBzY29yZSBhcyBhIGZsb2F0IG51bWJlciBpbiByYW5nZSBbMC4wLCAxLjBdLlxuICogMS4wIGlzIHRoZSBoaWdoZXN0IHNjb3JlIChtZWFucyBib3RoIGltYWdlcyBhcmUgdG90YWxseSBlcXVhbCkuXG4gKiBAcHJvcGVydHkgez9CdWZmZXJ9IHZpc3VhbGl6YXRpb24gVGhlIHZpc3VhbGl6YXRpb24gb2YgdGhlIG1hdGNoaW5nIHJlc3VsdFxuICogcmVwcmVzZW50ZWQgYXMgUE5HIGltYWdlIGJ1ZmZlci4gVGhpcyBpbWFnZSBpbmNsdWRlcyBib3RoIGlucHV0IHBpY3R1cmVzIHdoZXJlXG4gKiBkaWZmZXJlbmNlIHJlZ2lvbnMgYXJlIGhpZ2hsaWdodGVkIHdpdGggcmVjdGFuZ2xlcy5cbiAqL1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNpbWlsYXJpdHkgc2NvcmUgYmV0d2VlbiB0d28gaW1hZ2VzLlxuICogSXQgaXMgZXhwZWN0ZWQsIHRoYXQgYm90aCBpbWFnZXMgaGF2ZSB0aGUgc2FtZSByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBpbWcxRGF0YSBUaGUgZGF0YSBvZiB0aGUgZmlyc3QgaW1hZ2UgcGFja2VkIGludG8gYSBOb2RlSlMgYnVmZmVyXG4gKiBAcGFyYW0ge0J1ZmZlcn0gaW1nMkRhdGEgVGhlIGRhdGEgb2YgdGhlIHNlY29uZCBpbWFnZSBwYWNrZWQgaW50byBhIE5vZGVKUyBidWZmZXJcbiAqIEBwYXJhbSB7P1NpbWlsYXJpdHlPcHRpb25zfSBvcHRpb25zIFt7fV0gU2V0IG9mIHNpbWlsYXJpdHkgY2FsY3VsYXRpb24gb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIHtTaW1pbGFyaXR5UmVzdWx0fSBUaGUgY2FsY3VsYXRpb24gcmVzdWx0XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIGltYWdlcyBoYXZlIGRpZmZlcmVudCByZXNvbHV0aW9uLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRJbWFnZXNTaW1pbGFyaXR5IChpbWcxRGF0YSwgaW1nMkRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICBhd2FpdCBpbml0T3BlbkNWKCk7XG5cbiAgY29uc3Qge1xuICAgIG1ldGhvZCA9IERFRkFVTFRfTUFUQ0hJTkdfTUVUSE9ELFxuICAgIHZpc3VhbGl6ZSA9IGZhbHNlLFxuICB9ID0gb3B0aW9ucztcbiAgbGV0IFt0ZW1wbGF0ZSwgcmVmZXJlbmNlXSA9IGF3YWl0IEIuYWxsKFtcbiAgICBjdi5pbWRlY29kZUFzeW5jKGltZzFEYXRhKSxcbiAgICBjdi5pbWRlY29kZUFzeW5jKGltZzJEYXRhKVxuICBdKTtcbiAgaWYgKHRlbXBsYXRlLnJvd3MgIT09IHJlZmVyZW5jZS5yb3dzIHx8IHRlbXBsYXRlLmNvbHMgIT09IHJlZmVyZW5jZS5jb2xzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdCb3RoIGltYWdlcyBhcmUgZXhwZWN0ZWQgdG8gaGF2ZSB0aGUgc2FtZSBzaXplIGluIG9yZGVyIHRvICcgK1xuICAgICAgICAgICAgICAgICAgICAnY2FsY3VsYXRlIHRoZSBzaW1pbGFyaXR5IHNjb3JlLicpO1xuICB9XG4gIFt0ZW1wbGF0ZSwgcmVmZXJlbmNlXSA9IGF3YWl0IEIuYWxsKFtcbiAgICB0ZW1wbGF0ZS5jb252ZXJ0VG9Bc3luYyhjdi5DVl84VUMzKSxcbiAgICByZWZlcmVuY2UuY29udmVydFRvQXN5bmMoY3YuQ1ZfOFVDMylcbiAgXSk7XG5cbiAgbGV0IG1hdGNoZWQ7XG4gIHRyeSB7XG4gICAgbWF0Y2hlZCA9IGF3YWl0IHJlZmVyZW5jZS5tYXRjaFRlbXBsYXRlQXN5bmModGVtcGxhdGUsIHRvTWF0Y2hpbmdNZXRob2QobWV0aG9kKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByZWZlcmVuY2UgaW1hZ2UgZGlkIG5vdCBtYXRjaCB0byB0aGUgdGVtcGxhdGUgb25lLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbiAgY29uc3QgbWluTWF4ID0gYXdhaXQgbWF0Y2hlZC5taW5NYXhMb2NBc3luYygpO1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgc2NvcmU6IG1pbk1heC5tYXhWYWxcbiAgfTtcbiAgaWYgKHZpc3VhbGl6ZSkge1xuICAgIGNvbnN0IHJlc3VsdE1hdCA9IG5ldyBjdi5NYXQodGVtcGxhdGUucm93cywgdGVtcGxhdGUuY29scyAqIDIsIGN2LkNWXzhVQzMpO1xuICAgIGF3YWl0IEIuYWxsKFtcbiAgICAgIHJlZmVyZW5jZS5jb3B5VG9Bc3luYyhcbiAgICAgICAgcmVzdWx0TWF0LmdldFJlZ2lvbihuZXcgY3YuUmVjdCgwLCAwLCByZWZlcmVuY2UuY29scywgcmVmZXJlbmNlLnJvd3MpKSksXG4gICAgICB0ZW1wbGF0ZS5jb3B5VG9Bc3luYyhcbiAgICAgICAgcmVzdWx0TWF0LmdldFJlZ2lvbihuZXcgY3YuUmVjdChyZWZlcmVuY2UuY29scywgMCwgdGVtcGxhdGUuY29scywgdGVtcGxhdGUucm93cykpKVxuICAgIF0pO1xuICAgIGxldCBtYXNrID0gcmVmZXJlbmNlLmFic2RpZmYodGVtcGxhdGUpO1xuICAgIG1hc2sgPSBhd2FpdCBtYXNrLmN2dENvbG9yQXN5bmMoY3YuQ09MT1JfQkdSMkdSQVkpO1xuICAgIGxldCBjb250b3VycyA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBtYXNrID0gYXdhaXQgbWFzay50aHJlc2hvbGRBc3luYygxMjgsIDI1NSwgY3YuVEhSRVNIX0JJTkFSWSB8IGN2LlRIUkVTSF9PVFNVKTtcbiAgICAgIGNvbnRvdXJzID0gYXdhaXQgbWFzay5maW5kQ29udG91cnNBc3luYyhjdi5SRVRSX0VYVEVSTkFMLCBjdi5DSEFJTl9BUFBST1hfU0lNUExFKTtcbiAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgIC8vIE5vIGNvbnRvdXJzIGNhbiBiZSBmb3VuZCwgd2hpY2ggbWVhbnMsIG1vc3QgbGlrZWx5LCB0aGF0IGltYWdlcyBhcmUgZXF1YWxcbiAgICB9XG4gICAgZm9yIChjb25zdCBjb250b3VyIG9mIGNvbnRvdXJzKSB7XG4gICAgICBjb25zdCBib3VuZGluZ1JlY3QgPSBjb250b3VyLmJvdW5kaW5nUmVjdCgpO1xuICAgICAgaGlnaGxpZ2h0UmVnaW9uKHJlc3VsdE1hdCwgYm91bmRpbmdSZWN0KTtcbiAgICAgIGhpZ2hsaWdodFJlZ2lvbihyZXN1bHRNYXQsIHtcbiAgICAgICAgeDogcmVmZXJlbmNlLmNvbHMgKyBib3VuZGluZ1JlY3QueCxcbiAgICAgICAgeTogYm91bmRpbmdSZWN0LnksXG4gICAgICAgIHdpZHRoOiBib3VuZGluZ1JlY3Qud2lkdGgsXG4gICAgICAgIGhlaWdodDogYm91bmRpbmdSZWN0LmhlaWdodFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJlc3VsdC52aXN1YWxpemF0aW9uID0gYXdhaXQgY3YuaW1lbmNvZGVBc3luYygnLnBuZycsIHJlc3VsdE1hdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBPY2N1cnJlbmNlT3B0aW9uc1xuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gdmlzdWFsaXplIFtmYWxzZV0gV2hldGhlciB0byByZXR1cm4gdGhlIHJlc3VsdGluZyB2aXNhbGl6YXRpb25cbiAqIGFzIGFuIGltYWdlICh1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcylcbiAqIEBwcm9wZXJ0eSB7P2Zsb2F0fSB0aHJlc2hvbGQgWzAuNV0gQXQgd2hhdCBub3JtYWxpemVkIHRocmVzaG9sZCB0byByZWplY3RcbiAqIGEgbWF0Y2hcbiAqIEBwcm9wZXJ0eSB7P2Zsb2F0fSBtdWx0aXBsZSBbZmFsc2VdIGZpbmQgbXVsdGlwbGUgbWF0Y2hlcyBpbiB0aGUgaW1hZ2VcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gbWF0Y2hOZWlnaGJvdXJUaHJlc2hvbGQgWzEwXSBUaGUgcGl4ZWwgZGlzdGFuY2UgYmV0d2VlbiBtYXRjaGVzIHdlIGNvbnNpZGVyXG4gKiB0byBiZSBwYXJ0IG9mIHRoZSBzYW1lIHRlbXBsYXRlIG1hdGNoXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBPY2N1cnJlbmNlUmVzdWx0XG4gKiBAcHJvcGVydHkge1JlY3R9IHJlY3QgVGhlIHJlZ2lvbiBvZiB0aGUgcGFydGlhbCBpbWFnZSBvY2N1cmVuY2VcbiAqIG9uIHRoZSBmdWxsIGltYWdlXG4gKiBAcHJvcGVydHkgez9CdWZmZXJ9IHZpc3VhbGl6YXRpb24gVGhlIHZpc3VhbGl6YXRpb24gb2YgdGhlIG1hdGNoaW5nIHJlc3VsdFxuICogcmVwcmVzZW50ZWQgYXMgUE5HIGltYWdlIGJ1ZmZlci4gT24gdGhpcyBpbWFnZSB0aGUgbWF0Y2hpbmdcbiAqIHJlZ2lvbiBpcyBoaWdobGlnaHRlZCB3aXRoIGEgcmVjdGFuZ2xlLiBJZiB0aGUgbXVsdGlwbGUgb3B0aW9uIGlzIHBhc3NlZCxcbiAqIGFsbCByZXN1bHRzIGFyZSBoaWdobGlnaHRlZCBoZXJlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNjb3JlIFRoZSBzaW1pbGFyaXR5IHNjb3JlIGFzIGEgZmxvYXQgbnVtYmVyIGluIHJhbmdlIFswLjAsIDEuMF0uXG4gKiAxLjAgaXMgdGhlIGhpZ2hlc3Qgc2NvcmUgKG1lYW5zIGJvdGggaW1hZ2VzIGFyZSB0b3RhbGx5IGVxdWFsKS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8T2NjdXJyZW5jZVJlc3VsdD59IG11bHRpcGxlIFRoZSBhcnJheSBvZiBtYXRjaGluZyBPY2N1cmVuY2VSZXN1bHRzXG4gKiAtIG9ubHkgd2hlbiBtdWx0aXBsZSBvcHRpb24gaXMgcGFzc2VkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWV0aG9kIFtUTV9DQ09FRkZfTk9STUVEXSBUaGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgbWF0Y2hpbmcgbWV0aG9kLlxuICogQWNjZXB0YWJsZSB2YWx1ZXMgYXJlOlxuICogLSBUTV9DQ09FRkZcbiAqIC0gVE1fQ0NPRUZGX05PUk1FRCAoZGVmYXVsdClcbiAqIC0gVE1fQ0NPUlJcbiAqIC0gVE1fQ0NPUlJfTk9STUVEXG4gKiAtIFRNX1NRRElGRlxuICogLSBUTV9TUURJRkZfTk9STUVEXG4gKiBSZWFkIGh0dHBzOi8vZG9jcy5vcGVuY3Yub3JnLzMuMC1iZXRhL2RvYy9weV90dXRvcmlhbHMvcHlfaW1ncHJvYy9weV90ZW1wbGF0ZV9tYXRjaGluZy9weV90ZW1wbGF0ZV9tYXRjaGluZy5odG1sXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgb2NjdXJyZW5jZSBwb3NpdGlvbiBvZiBhIHBhcnRpYWwgaW1hZ2UgaW4gdGhlIGZ1bGxcbiAqIGltYWdlLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBmdWxsSW1nRGF0YSBUaGUgZGF0YSBvZiB0aGUgZnVsbCBpbWFnZSBwYWNrZWQgaW50byBhIE5vZGVKUyBidWZmZXJcbiAqIEBwYXJhbSB7QnVmZmVyfSBwYXJ0aWFsSW1nRGF0YSBUaGUgZGF0YSBvZiB0aGUgcGFydGlhbCBpbWFnZSBwYWNrZWQgaW50byBhIE5vZGVKUyBidWZmZXJcbiAqIEBwYXJhbSB7P09jY3VycmVuY2VPcHRpb25zfSBvcHRpb25zIFt7fV0gU2V0IG9mIG9jY3VycmVuY2UgY2FsY3VsYXRpb24gb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIHtPY2N1cnJlbmNlUmVzdWx0fVxuICogQHRocm93cyB7RXJyb3J9IElmIG5vIG9jY3VycmVuY2VzIG9mIHRoZSBwYXJ0aWFsIGltYWdlIGNhbiBiZSBmb3VuZCBpbiB0aGUgZnVsbCBpbWFnZVxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRJbWFnZU9jY3VycmVuY2UgKGZ1bGxJbWdEYXRhLCBwYXJ0aWFsSW1nRGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gIGF3YWl0IGluaXRPcGVuQ1YoKTtcblxuICBjb25zdCB7XG4gICAgdmlzdWFsaXplID0gZmFsc2UsXG4gICAgdGhyZXNob2xkID0gREVGQVVMVF9NQVRDSF9USFJFU0hPTEQsXG4gICAgbXVsdGlwbGUgPSBmYWxzZSxcbiAgICBtYXRjaE5laWdoYm91clRocmVzaG9sZCA9IE1BVENIX05FSUdIQk9VUl9USFJFU0hPTEQsXG4gICAgbWV0aG9kID0gREVGQVVMVF9NQVRDSElOR19NRVRIT0QsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IFtmdWxsSW1nLCBwYXJ0aWFsSW1nXSA9IGF3YWl0IEIuYWxsKFtcbiAgICBjdi5pbWRlY29kZUFzeW5jKGZ1bGxJbWdEYXRhKSxcbiAgICBjdi5pbWRlY29kZUFzeW5jKHBhcnRpYWxJbWdEYXRhKVxuICBdKTtcbiAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICBsZXQgdmlzdWFsaXphdGlvbiA9IG51bGw7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBtYXRjaGVkID0gYXdhaXQgZnVsbEltZy5tYXRjaFRlbXBsYXRlQXN5bmMocGFydGlhbEltZywgdG9NYXRjaGluZ01ldGhvZChtZXRob2QpKTtcbiAgICBjb25zdCBtaW5NYXggPSBhd2FpdCBtYXRjaGVkLm1pbk1heExvY0FzeW5jKCk7XG5cbiAgICBpZiAobXVsdGlwbGUpIHtcbiAgICAgIGNvbnN0IG5vblplcm9NYXRjaFJlc3VsdHMgPSBtYXRjaGVkLnRocmVzaG9sZCh0aHJlc2hvbGQsIDEsIGN2LlRIUkVTSF9CSU5BUlkpXG4gICAgICAgIC5jb252ZXJ0VG8oY3YuQ1ZfOFUpXG4gICAgICAgIC5maW5kTm9uWmVybygpO1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGZpbHRlck5lYXJNYXRjaGVzKG5vblplcm9NYXRjaFJlc3VsdHMsIG1hdGNoTmVpZ2hib3VyVGhyZXNob2xkKTtcblxuICAgICAgZm9yIChjb25zdCB7eCwgeX0gb2YgbWF0Y2hlcykge1xuICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgIHNjb3JlOiBtYXRjaGVkLmF0KHksIHgpLFxuICAgICAgICAgIHJlY3Q6IHtcbiAgICAgICAgICAgIHgsIHksXG4gICAgICAgICAgICB3aWR0aDogcGFydGlhbEltZy5jb2xzLFxuICAgICAgICAgICAgaGVpZ2h0OiBwYXJ0aWFsSW1nLnJvd3NcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobWluTWF4Lm1heFZhbCA+PSB0aHJlc2hvbGQpIHtcbiAgICAgIGNvbnN0IHt4LCB5fSA9IG1ldGhvZC5pbmNsdWRlcygnU1FESUZGJykgPyBtaW5NYXgubWluTG9jIDogbWluTWF4Lm1heExvYztcbiAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgIHNjb3JlOiBtaW5NYXgubWF4VmFsLFxuICAgICAgICByZWN0OiB7XG4gICAgICAgICAgeCwgeSxcbiAgICAgICAgICB3aWR0aDogcGFydGlhbEltZy5jb2xzLFxuICAgICAgICAgIGhlaWdodDogcGFydGlhbEltZy5yb3dzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChfLmlzRW1wdHkocmVzdWx0cykpIHtcbiAgICAgIC8vIEJlbG93IGVycm9yIG1lc3NhZ2UsIGBDYW5ub3QgZmluZCBhbnkgb2NjdXJyZW5jZXNgIGlzIHJlZmVyZW5jZWQgaW4gZmluZCBieSBpbWFnZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNYXRjaCB0aHJlc2hvbGQ6ICR7dGhyZXNob2xkfS4gSGlnaGVzdCBtYXRjaCB2YWx1ZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgZm91bmQgd2FzICR7bWluTWF4Lm1heFZhbH1gKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBCZWxvdyBlcnJvciBtZXNzYWdlLCBgQ2Fubm90IGZpbmQgYW55IG9jY3VycmVuY2VzYCBpcyByZWZlcmVuY2VkIGluIGZpbmQgYnkgaW1hZ2VcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgcGFydGlhbCBpbWFnZSBpbiB0aGUgZnVsbCBpbWFnZS4gYCArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG5cbiAgaWYgKHZpc3VhbGl6ZSkge1xuICAgIGNvbnN0IGZ1bGxIaWdobGlnaHRlZEltYWdlID0gZnVsbEltZy5jb3B5KCk7XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICBjb25zdCBzaW5nbGVIaWdobGlnaHRlZEltYWdlID0gZnVsbEltZy5jb3B5KCk7XG5cbiAgICAgIGhpZ2hsaWdodFJlZ2lvbihzaW5nbGVIaWdobGlnaHRlZEltYWdlLCByZXN1bHQucmVjdCk7XG4gICAgICBoaWdobGlnaHRSZWdpb24oZnVsbEhpZ2hsaWdodGVkSW1hZ2UsIHJlc3VsdC5yZWN0KTtcbiAgICAgIHJlc3VsdC52aXN1YWxpemF0aW9uID0gYXdhaXQgY3YuaW1lbmNvZGVBc3luYygnLnBuZycsIHNpbmdsZUhpZ2hsaWdodGVkSW1hZ2UpO1xuICAgIH1cbiAgICB2aXN1YWxpemF0aW9uID0gYXdhaXQgY3YuaW1lbmNvZGVBc3luYygnLnBuZycsIGZ1bGxIaWdobGlnaHRlZEltYWdlKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVjdDogcmVzdWx0c1swXS5yZWN0LFxuICAgIHNjb3JlOiByZXN1bHRzWzBdLnNjb3JlLFxuICAgIHZpc3VhbGl6YXRpb24sXG4gICAgbXVsdGlwbGU6IHJlc3VsdHNcbiAgfTtcbn1cblxuLyoqXG4gKiBGaWx0ZXIgb3V0IG1hdGNoIHJlc3VsdHMgd2hpY2ggaGF2ZSBhIG1hdGNoZWQgbmVpZ2hib3VyXG4gKlxuICogQHBhcmFtIHtBcnJheTxQb2ludD59IG5vblplcm9NYXRjaFJlc3VsdHMgbWF0cml4IG9mIGltYWdlIG1hdGNoIHJlc3VsdHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXRjaE5laWdoYm91clRocmVzaG9sZCBUaGUgcGl4ZWwgZGlzdGFuY2Ugd2l0aGluIHdoaWNoIHdlXG4gKiBjb25zaWRlciBhbiBlbGVtZW50IGJlaW5nIGEgbmVpZ2hib3VyIG9mIGFuIGV4aXN0aW5nIG1hdGNoXG4gKiBAcmV0dXJuIHtBcnJheTxQb2ludD59IHRoZSBmaWx0ZXJlZCBhcnJheSBvZiBtYXRjaGVkIHBvaW50c1xuICovXG5mdW5jdGlvbiBmaWx0ZXJOZWFyTWF0Y2hlcyAobm9uWmVyb01hdGNoUmVzdWx0cywgbWF0Y2hOZWlnaGJvdXJUaHJlc2hvbGQpIHtcbiAgcmV0dXJuIG5vblplcm9NYXRjaFJlc3VsdHMucmVkdWNlKChhY2MsIGVsZW1lbnQpID0+IHtcbiAgICBpZiAoIWFjYy5zb21lKChtYXRjaCkgPT4gZGlzdGFuY2UobWF0Y2gsIGVsZW1lbnQpIDw9IG1hdGNoTmVpZ2hib3VyVGhyZXNob2xkKSkge1xuICAgICAgYWNjLnB1c2goZWxlbWVudCk7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIFtdKTtcbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHNcbiAqXG4gKiBAcGFyYW0ge1BvaW50fSBwb2ludDEgVGhlIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0ge1BvaW50fSBwb2ludDIgVGhlIHNlY29uZCBwb2ludFxuICogQHJldHVybiB7bnVtYmVyfSB0aGUgZGlzdGFuY2VcbiAqL1xuZnVuY3Rpb24gZGlzdGFuY2UgKHBvaW50MSwgcG9pbnQyKSB7XG4gIGNvbnN0IGEyID0gTWF0aC5wb3coKHBvaW50MS54IC0gcG9pbnQyLngpLCAyKTtcbiAgY29uc3QgYjIgPSBNYXRoLnBvdygocG9pbnQxLnkgLSBwb2ludDIueSksIDIpO1xuICByZXR1cm4gTWF0aC5zcXJ0KGEyICsgYjIpO1xufVxuXG4vKipcbiAqIENyb3AgdGhlIGltYWdlIGJ5IGdpdmVuIHJlY3RhbmdsZSAodXNlIGJhc2U2NCBzdHJpbmcgYXMgaW5wdXQgYW5kIG91dHB1dClcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZTY0SW1hZ2UgVGhlIHN0cmluZyB3aXRoIGJhc2U2NCBlbmNvZGVkIGltYWdlXG4gKiBAcGFyYW0ge1JlZ2lvbn0gcmVjdCBUaGUgc2VsZWN0ZWQgcmVnaW9uIG9mIGltYWdlXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGJhc2U2NCBlbmNvZGVkIHN0cmluZyBvZiBjcm9wcGVkIGltYWdlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyb3BCYXNlNjRJbWFnZSAoYmFzZTY0SW1hZ2UsIHJlY3QpIHtcbiAgY29uc3QgaW1hZ2UgPSBhd2FpdCBiYXNlNjRUb0ltYWdlKGJhc2U2NEltYWdlKTtcbiAgY3JvcEltYWdlKGltYWdlLCByZWN0KTtcbiAgcmV0dXJuIGF3YWl0IGltYWdlVG9CYXNlNjQoaW1hZ2UpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHBuZ2pzIGltYWdlIGZyb20gZ2l2ZW4gYmFzZTY0IGltYWdlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2U2NEltYWdlIFRoZSBzdHJpbmcgd2l0aCBiYXNlNjQgZW5jb2RlZCBpbWFnZVxuICogQHJldHVybiB7UE5HfSBUaGUgaW1hZ2Ugb2JqZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJhc2U2NFRvSW1hZ2UgKGJhc2U2NEltYWdlKSB7XG4gIGNvbnN0IGltYWdlQnVmZmVyID0gQnVmZmVyLmZyb20oYmFzZTY0SW1hZ2UsICdiYXNlNjQnKTtcbiAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBpbWFnZSA9IG5ldyBQTkcoe2ZpbHRlclR5cGU6IFNDQU5MSU5FX0ZJTFRFUl9NRVRIT0R9KTtcbiAgICBpbWFnZS5wYXJzZShpbWFnZUJ1ZmZlciwgKGVyciwgaW1hZ2UpID0+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by1jYWxsYmFja3NcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShpbWFnZSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGJhc2U2NCBzdHJpbmcgZm9yIGdpdmVuIGltYWdlIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7UE5HfSBpbWFnZSBUaGUgaW1hZ2Ugb2JqZWN0XG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdHJpbmcgd2l0aCBiYXNlNjQgZW5jb2RlZCBpbWFnZVxuICovXG5hc3luYyBmdW5jdGlvbiBpbWFnZVRvQmFzZTY0IChpbWFnZSkge1xuICByZXR1cm4gYXdhaXQgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgIGltYWdlLnBhY2soKVxuICAgIC5vbignZGF0YScsIChjaHVuaykgPT4gY2h1bmtzLnB1c2goY2h1bmspKS5vbignZW5kJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZShCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoJ2Jhc2U2NCcpKTtcbiAgICB9KVxuICAgIC5vbignZXJyb3InLCAoZXJyKSA9PiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tY2FsbGJhY2tzXG4gICAgICByZWplY3QoZXJyKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JvcCB0aGUgaW1hZ2UgYnkgZ2l2ZW4gcmVjdGFuZ2xlXG4gKlxuICogQHBhcmFtIHtQTkd9IGltYWdlIFRoZSBpbWFnZSB0byBtdXRhdGUgYnkgY3JvcHBpbmdcbiAqIEBwYXJhbSB7UmVnaW9ufSByZWN0IFRoZSBzZWxlY3RlZCByZWdpb24gb2YgaW1hZ2VcbiAqL1xuZnVuY3Rpb24gY3JvcEltYWdlIChpbWFnZSwgcmVjdCkge1xuICBjb25zdCBpbWFnZVJlY3QgPSB7d2lkdGg6IGltYWdlLndpZHRoLCBoZWlnaHQ6IGltYWdlLmhlaWdodH07XG4gIGNvbnN0IGludGVyUmVjdCA9IGdldFJlY3RJbnRlcnNlY3Rpb24ocmVjdCwgaW1hZ2VSZWN0KTtcbiAgaWYgKGludGVyUmVjdC53aWR0aCA8IHJlY3Qud2lkdGggfHwgaW50ZXJSZWN0LmhlaWdodCA8IHJlY3QuaGVpZ2h0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY3JvcCAke0pTT04uc3RyaW5naWZ5KHJlY3QpfSBmcm9tICR7SlNPTi5zdHJpbmdpZnkoaW1hZ2VSZWN0KX0gYmVjYXVzZSB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlbSB3YXMgbm90IHRoZSBzaXplIG9mIHRoZSByZWN0YCk7XG4gIH1cblxuICBjb25zdCBmaXJzdFZlcnRpY2FsUGl4ZWwgPSBpbnRlclJlY3QudG9wO1xuICBjb25zdCBsYXN0VmVydGljYWxQaXhlbCA9IGludGVyUmVjdC50b3AgKyBpbnRlclJlY3QuaGVpZ2h0O1xuXG4gIGNvbnN0IGZpcnN0SG9yaXpvbnRhbFBpeGVsID0gaW50ZXJSZWN0LmxlZnQ7XG4gIGNvbnN0IGxhc3RIb3Jpem9udGFsUGl4ZWwgPSBpbnRlclJlY3QubGVmdCArIGludGVyUmVjdC53aWR0aDtcblxuICBjb25zdCBjcm9wcGVkQXJyYXkgPSBbXTtcbiAgZm9yIChsZXQgeSA9IGZpcnN0VmVydGljYWxQaXhlbDsgeSA8IGxhc3RWZXJ0aWNhbFBpeGVsOyB5KyspIHtcbiAgICBmb3IgKGxldCB4ID0gZmlyc3RIb3Jpem9udGFsUGl4ZWw7IHggPCBsYXN0SG9yaXpvbnRhbFBpeGVsOyB4KyspIHtcbiAgICAgIGNvbnN0IGZpcnN0Qnl0ZUlkeEluUGl4ZWxCbG9jayA9IChpbWFnZVJlY3Qud2lkdGggKiB5ICsgeCkgPDwgMjtcbiAgICAgIGZvciAobGV0IGJ5dGVJZHggPSAwOyBieXRlSWR4IDwgQllURVNfSU5fUElYRUxfQkxPQ0s7IGJ5dGVJZHgrKykge1xuICAgICAgICBjcm9wcGVkQXJyYXkucHVzaChpbWFnZS5kYXRhW2ZpcnN0Qnl0ZUlkeEluUGl4ZWxCbG9jayArIGJ5dGVJZHhdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpbWFnZS5kYXRhID0gQnVmZmVyLmZyb20oY3JvcHBlZEFycmF5KTtcbiAgaW1hZ2Uud2lkdGggPSBpbnRlclJlY3Qud2lkdGg7XG4gIGltYWdlLmhlaWdodCA9IGludGVyUmVjdC5oZWlnaHQ7XG4gIHJldHVybiBpbWFnZTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVjdEludGVyc2VjdGlvbiAocmVjdCwgaW1hZ2VTaXplKSB7XG4gIGNvbnN0IGxlZnQgPSByZWN0LmxlZnQgPj0gaW1hZ2VTaXplLndpZHRoID8gaW1hZ2VTaXplLndpZHRoIDogcmVjdC5sZWZ0O1xuICBjb25zdCB0b3AgPSByZWN0LnRvcCA+PSBpbWFnZVNpemUuaGVpZ2h0ID8gaW1hZ2VTaXplLmhlaWdodCA6IHJlY3QudG9wO1xuICBjb25zdCB3aWR0aCA9IGltYWdlU2l6ZS53aWR0aCA+PSAobGVmdCArIHJlY3Qud2lkdGgpID8gcmVjdC53aWR0aCA6IChpbWFnZVNpemUud2lkdGggLSBsZWZ0KTtcbiAgY29uc3QgaGVpZ2h0ID0gaW1hZ2VTaXplLmhlaWdodCA+PSAodG9wICsgcmVjdC5oZWlnaHQpID8gcmVjdC5oZWlnaHQgOiAoaW1hZ2VTaXplLmhlaWdodCAtIHRvcCk7XG4gIHJldHVybiB7bGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0fTtcbn1cblxuZXhwb3J0IHtcbiAgY3JvcEJhc2U2NEltYWdlLCBiYXNlNjRUb0ltYWdlLCBpbWFnZVRvQmFzZTY0LCBjcm9wSW1hZ2UsIGdldEltYWdlc01hdGNoZXMsXG4gIGdldEltYWdlc1NpbWlsYXJpdHksIGdldEltYWdlT2NjdXJyZW5jZSwgZ2V0SmltcEltYWdlLCBNSU1FX0pQRUcsIE1JTUVfUE5HLFxuICBNSU1FX0JNUCxcbn07XG4iXSwiZmlsZSI6ImxpYi9pbWFnZS11dGlsLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|
|
147
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9pbWFnZS11dGlsLmpzIl0sIm5hbWVzIjpbIkJZVEVTX0lOX1BJWEVMX0JMT0NLIiwiU0NBTkxJTkVfRklMVEVSX01FVEhPRCIsIk1JTUVfSlBFRyIsIk1JTUVfUE5HIiwiTUlNRV9CTVAiLCJKaW1wIiwiZ2V0SmltcEltYWdlIiwiZGF0YSIsIkIiLCJyZXNvbHZlIiwicmVqZWN0IiwiXyIsImlzU3RyaW5nIiwiaXNCdWZmZXIiLCJFcnJvciIsIkJ1ZmZlciIsImZyb20iLCJlcnIiLCJpbWdPYmoiLCJfZ2V0QnVmZmVyIiwiZ2V0QnVmZmVyIiwiYmluZCIsInByb21pc2lmeSIsImNvbnRleHQiLCJjcm9wQmFzZTY0SW1hZ2UiLCJiYXNlNjRJbWFnZSIsInJlY3QiLCJpbWFnZSIsImJhc2U2NFRvSW1hZ2UiLCJjcm9wSW1hZ2UiLCJpbWFnZVRvQmFzZTY0IiwiaW1hZ2VCdWZmZXIiLCJQTkciLCJmaWx0ZXJUeXBlIiwicGFyc2UiLCJjaHVua3MiLCJwYWNrIiwib24iLCJjaHVuayIsInB1c2giLCJjb25jYXQiLCJ0b1N0cmluZyIsImltYWdlUmVjdCIsIndpZHRoIiwiaGVpZ2h0IiwiaW50ZXJSZWN0IiwiZ2V0UmVjdEludGVyc2VjdGlvbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJmaXJzdFZlcnRpY2FsUGl4ZWwiLCJ0b3AiLCJsYXN0VmVydGljYWxQaXhlbCIsImZpcnN0SG9yaXpvbnRhbFBpeGVsIiwibGVmdCIsImxhc3RIb3Jpem9udGFsUGl4ZWwiLCJjcm9wcGVkQXJyYXkiLCJ5IiwieCIsImZpcnN0Qnl0ZUlkeEluUGl4ZWxCbG9jayIsImJ5dGVJZHgiLCJpbWFnZVNpemUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxvQkFBb0IsR0FBRyxDQUE3QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLENBQS9CO0FBQ0EsTUFBTTtBQUFFQyxFQUFBQSxTQUFGO0FBQWFDLEVB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SUFBb0JVLElBQUksR0FBRzNCLElBQUksQ0FBQ2lCLEtBQWhDLEdBQXlDakIsSUFBSSxDQUFDaUIsS0FBOUMsR0FBdURpQixTQUFTLENBQUNqQixLQUFWLEdBQWtCVSxJQUF2RjtBQUNBLFFBQU1ULE1BQU0sR0FBR2dCLFNBQVMsQ0FBQ2hCLE1BQVYsSUFBcUJNLEdBQUcsR0FBR3hCLElBQUksQ0FBQ2tCLE1BQWhDLEdBQTBDbEIsSUFBSSxDQUFDa0IsTUFBL0MsR0FBeURnQixTQUFTLENBQUNoQixNQUFWLEdBQW1CTSxHQUEzRjtBQUNBLFNBQU87QUFBQ0csSUFBQUEsSUFBRDtBQUFPSCxJQUFBQSxHQUFQO0FBQVlQLElBQUFBLEtBQVo7QUFBbUJDLElBQUFBO0FBQW5CLEdBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgSmltcCBmcm9tICdqaW1wJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyBQTkcgfSBmcm9tICdwbmdqcyc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5cbmNvbnN0IEJZVEVTX0lOX1BJWEVMX0JMT0NLID0gNDtcbmNvbnN0IFNDQU5MSU5FX0ZJTFRFUl9NRVRIT0QgPSA0O1xuY29uc3QgeyBNSU1FX0pQRUcsIE1JTUVfUE5HLCBNSU1FX0JNUCB9ID0gSmltcDtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdldCBhIEppbXAgaW1hZ2Ugb2JqZWN0IGZyb20gYnVmZmVyIG9yIGJhc2U2NCBkYXRhLiBKaW1wXG4gKiBpcyBhIGdyZWF0IGxpYnJhcnkgaG93ZXZlciBpdCBkb2VzIElPIGluIHRoZSBjb25zdHJ1Y3RvciBzbyBpdCdzIG5vdFxuICogY29udmVuaWVudCBmb3Igb3VyIGFzeW5jL2F3YWl0IG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfHN0cmluZ30gZGF0YSAtIGJpbmFyeSBpbWFnZSBidWZmZXIgb3IgYmFzZTY0LWVuY29kZWQgaW1hZ2VcbiAqIHN0cmluZ1xuICogQHJldHVybnMge0ppbXB9IC0gdGhlIGppbXAgaW1hZ2Ugb2JqZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEppbXBJbWFnZSAoZGF0YSkge1xuICByZXR1cm4gYXdhaXQgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGlmICghXy5pc1N0cmluZyhkYXRhKSAmJiAhXy5pc0J1ZmZlcihkYXRhKSkge1xuICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ011c3QgaW5pdGlhbGl6ZSBqaW1wIG9iamVjdCB3aXRoIHN0cmluZyBvciBidWZmZXInKSk7XG4gICAgfVxuICAgIC8vIGlmIGRhdGEgaXMgYSBzdHJpbmcsIGFzc3VtZSBpdCBpcyBhIGJhc2U2NC1lbmNvZGVkIGltYWdlXG4gICAgaWYgKF8uaXNTdHJpbmcoZGF0YSkpIHtcbiAgICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhLCAnYmFzZTY0Jyk7XG4gICAgfVxuICAgIG5ldyBKaW1wKGRhdGEsIChlcnIsIGltZ09iaikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICB9XG4gICAgICBpZiAoIWltZ09iaikge1xuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignQ291bGQgbm90IGNyZWF0ZSBqaW1wIGltYWdlIGZyb20gdGhhdCBkYXRhJykpO1xuICAgICAgfVxuICAgICAgaW1nT2JqLl9nZXRCdWZmZXIgPSBpbWdPYmouZ2V0QnVmZmVyLmJpbmQoaW1nT2JqKTtcbiAgICAgIGltZ09iai5nZXRCdWZmZXIgPSBCLnByb21pc2lmeShpbWdPYmouX2dldEJ1ZmZlciwge2NvbnRleHQ6IGltZ09ian0pO1xuICAgICAgcmVzb2x2ZShpbWdPYmopO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcm9wIHRoZSBpbWFnZSBieSBnaXZlbiByZWN0YW5nbGUgKHVzZSBiYXNlNjQgc3RyaW5nIGFzIGlucHV0IGFuZCBvdXRwdXQpXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2U2NEltYWdlIFRoZSBzdHJpbmcgd2l0aCBiYXNlNjQgZW5jb2RlZCBpbWFnZVxuICogQHBhcmFtIHtSZWdpb259IHJlY3QgVGhlIHNlbGVjdGVkIHJlZ2lvbiBvZiBpbWFnZVxuICogQHJldHVybiB7c3RyaW5nfSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgb2YgY3JvcHBlZCBpbWFnZVxuICovXG5hc3luYyBmdW5jdGlvbiBjcm9wQmFzZTY0SW1hZ2UgKGJhc2U2NEltYWdlLCByZWN0KSB7XG4gIGNvbnN0IGltYWdlID0gYXdhaXQgYmFzZTY0VG9JbWFnZShiYXNlNjRJbWFnZSk7XG4gIGNyb3BJbWFnZShpbWFnZSwgcmVjdCk7XG4gIHJldHVybiBhd2FpdCBpbWFnZVRvQmFzZTY0KGltYWdlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBwbmdqcyBpbWFnZSBmcm9tIGdpdmVuIGJhc2U2NCBpbWFnZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlNjRJbWFnZSBUaGUgc3RyaW5nIHdpdGggYmFzZTY0IGVuY29kZWQgaW1hZ2VcbiAqIEByZXR1cm4ge1BOR30gVGhlIGltYWdlIG9iamVjdFxuICovXG5hc3luYyBmdW5jdGlvbiBiYXNlNjRUb0ltYWdlIChiYXNlNjRJbWFnZSkge1xuICBjb25zdCBpbWFnZUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJhc2U2NEltYWdlLCAnYmFzZTY0Jyk7XG4gIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgaW1hZ2UgPSBuZXcgUE5HKHtmaWx0ZXJUeXBlOiBTQ0FOTElORV9GSUxURVJfTUVUSE9EfSk7XG4gICAgaW1hZ2UucGFyc2UoaW1hZ2VCdWZmZXIsIChlcnIsIGltYWdlKSA9PiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tY2FsbGJhY2tzXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoaW1hZ2UpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBiYXNlNjQgc3RyaW5nIGZvciBnaXZlbiBpbWFnZSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge1BOR30gaW1hZ2UgVGhlIGltYWdlIG9iamVjdFxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgc3RyaW5nIHdpdGggYmFzZTY0IGVuY29kZWQgaW1hZ2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW1hZ2VUb0Jhc2U2NCAoaW1hZ2UpIHtcbiAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICBpbWFnZS5wYWNrKClcbiAgICAub24oJ2RhdGEnLCAoY2h1bmspID0+IGNodW5rcy5wdXNoKGNodW5rKSkub24oJ2VuZCcsICgpID0+IHtcbiAgICAgIHJlc29sdmUoQnVmZmVyLmNvbmNhdChjaHVua3MpLnRvU3RyaW5nKCdiYXNlNjQnKSk7XG4gICAgfSlcbiAgICAub24oJ2Vycm9yJywgKGVycikgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLWNhbGxiYWNrc1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENyb3AgdGhlIGltYWdlIGJ5IGdpdmVuIHJlY3RhbmdsZVxuICpcbiAqIEBwYXJhbSB7UE5HfSBpbWFnZSBUaGUgaW1hZ2UgdG8gbXV0YXRlIGJ5IGNyb3BwaW5nXG4gKiBAcGFyYW0ge1JlZ2lvbn0gcmVjdCBUaGUgc2VsZWN0ZWQgcmVnaW9uIG9mIGltYWdlXG4gKi9cbmZ1bmN0aW9uIGNyb3BJbWFnZSAoaW1hZ2UsIHJlY3QpIHtcbiAgY29uc3QgaW1hZ2VSZWN0ID0ge3dpZHRoOiBpbWFnZS53aWR0aCwgaGVpZ2h0OiBpbWFnZS5oZWlnaHR9O1xuICBjb25zdCBpbnRlclJlY3QgPSBnZXRSZWN0SW50ZXJzZWN0aW9uKHJlY3QsIGltYWdlUmVjdCk7XG4gIGlmIChpbnRlclJlY3Qud2lkdGggPCByZWN0LndpZHRoIHx8IGludGVyUmVjdC5oZWlnaHQgPCByZWN0LmhlaWdodCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNyb3AgJHtKU09OLnN0cmluZ2lmeShyZWN0KX0gZnJvbSAke0pTT04uc3RyaW5naWZ5KGltYWdlUmVjdCl9IGJlY2F1c2UgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIHRoZW0gd2FzIG5vdCB0aGUgc2l6ZSBvZiB0aGUgcmVjdGApO1xuICB9XG5cbiAgY29uc3QgZmlyc3RWZXJ0aWNhbFBpeGVsID0gaW50ZXJSZWN0LnRvcDtcbiAgY29uc3QgbGFzdFZlcnRpY2FsUGl4ZWwgPSBpbnRlclJlY3QudG9wICsgaW50ZXJSZWN0LmhlaWdodDtcblxuICBjb25zdCBmaXJzdEhvcml6b250YWxQaXhlbCA9IGludGVyUmVjdC5sZWZ0O1xuICBjb25zdCBsYXN0SG9yaXpvbnRhbFBpeGVsID0gaW50ZXJSZWN0LmxlZnQgKyBpbnRlclJlY3Qud2lkdGg7XG5cbiAgY29uc3QgY3JvcHBlZEFycmF5ID0gW107XG4gIGZvciAobGV0IHkgPSBmaXJzdFZlcnRpY2FsUGl4ZWw7IHkgPCBsYXN0VmVydGljYWxQaXhlbDsgeSsrKSB7XG4gICAgZm9yIChsZXQgeCA9IGZpcnN0SG9yaXpvbnRhbFBpeGVsOyB4IDwgbGFzdEhvcml6b250YWxQaXhlbDsgeCsrKSB7XG4gICAgICBjb25zdCBmaXJzdEJ5dGVJZHhJblBpeGVsQmxvY2sgPSAoaW1hZ2VSZWN0LndpZHRoICogeSArIHgpIDw8IDI7XG4gICAgICBmb3IgKGxldCBieXRlSWR4ID0gMDsgYnl0ZUlkeCA8IEJZVEVTX0lOX1BJWEVMX0JMT0NLOyBieXRlSWR4KyspIHtcbiAgICAgICAgY3JvcHBlZEFycmF5LnB1c2goaW1hZ2UuZGF0YVtmaXJzdEJ5dGVJZHhJblBpeGVsQmxvY2sgKyBieXRlSWR4XSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaW1hZ2UuZGF0YSA9IEJ1ZmZlci5mcm9tKGNyb3BwZWRBcnJheSk7XG4gIGltYWdlLndpZHRoID0gaW50ZXJSZWN0LndpZHRoO1xuICBpbWFnZS5oZWlnaHQgPSBpbnRlclJlY3QuaGVpZ2h0O1xuICByZXR1cm4gaW1hZ2U7XG59XG5cbmZ1bmN0aW9uIGdldFJlY3RJbnRlcnNlY3Rpb24gKHJlY3QsIGltYWdlU2l6ZSkge1xuICBjb25zdCBsZWZ0ID0gcmVjdC5sZWZ0ID49IGltYWdlU2l6ZS53aWR0aCA/IGltYWdlU2l6ZS53aWR0aCA6IHJlY3QubGVmdDtcbiAgY29uc3QgdG9wID0gcmVjdC50b3AgPj0gaW1hZ2VTaXplLmhlaWdodCA/IGltYWdlU2l6ZS5oZWlnaHQgOiByZWN0LnRvcDtcbiAgY29uc3Qgd2lkdGggPSBpbWFnZVNpemUud2lkdGggPj0gKGxlZnQgKyByZWN0LndpZHRoKSA/IHJlY3Qud2lkdGggOiAoaW1hZ2VTaXplLndpZHRoIC0gbGVmdCk7XG4gIGNvbnN0IGhlaWdodCA9IGltYWdlU2l6ZS5oZWlnaHQgPj0gKHRvcCArIHJlY3QuaGVpZ2h0KSA/IHJlY3QuaGVpZ2h0IDogKGltYWdlU2l6ZS5oZWlnaHQgLSB0b3ApO1xuICByZXR1cm4ge2xlZnQsIHRvcCwgd2lkdGgsIGhlaWdodH07XG59XG5cbmV4cG9ydCB7XG4gIGNyb3BCYXNlNjRJbWFnZSwgYmFzZTY0VG9JbWFnZSwgaW1hZ2VUb0Jhc2U2NCwgY3JvcEltYWdlLFxuICBnZXRKaW1wSW1hZ2UsIE1JTUVfSlBFRywgTUlNRV9QTkcsIE1JTUVfQk1QXG59O1xuIl0sImZpbGUiOiJsaWIvaW1hZ2UtdXRpbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.zip = exports.util = exports.timing = exports.tempDir = exports.system = exports.process = exports.plist = exports.node = exports.net = exports.mkdirp = exports.mjpeg = exports.logger = exports.imageUtil = exports.fs = exports.default = exports.cancellableDelay = void 0;
|
|
7
|
+
|
|
8
|
+
require("source-map-support/register");
|
|
9
|
+
|
|
10
|
+
var tempDir = _interopRequireWildcard(require("./tempdir"));
|
|
11
|
+
|
|
12
|
+
exports.tempDir = tempDir;
|
|
13
|
+
|
|
14
|
+
var system = _interopRequireWildcard(require("./system"));
|
|
15
|
+
|
|
16
|
+
exports.system = system;
|
|
17
|
+
|
|
18
|
+
var util = _interopRequireWildcard(require("./util"));
|
|
19
|
+
|
|
20
|
+
exports.util = util;
|
|
21
|
+
|
|
22
|
+
var fsIndex = _interopRequireWildcard(require("./fs"));
|
|
23
|
+
|
|
24
|
+
var net = _interopRequireWildcard(require("./net"));
|
|
25
|
+
|
|
26
|
+
exports.net = net;
|
|
27
|
+
|
|
28
|
+
var plist = _interopRequireWildcard(require("./plist"));
|
|
29
|
+
|
|
30
|
+
exports.plist = plist;
|
|
31
|
+
|
|
32
|
+
var mkdirpIndex = _interopRequireWildcard(require("./mkdirp"));
|
|
33
|
+
|
|
34
|
+
var logger = _interopRequireWildcard(require("./logging"));
|
|
35
|
+
|
|
36
|
+
exports.logger = logger;
|
|
37
|
+
|
|
38
|
+
var process = _interopRequireWildcard(require("./process"));
|
|
39
|
+
|
|
40
|
+
exports.process = process;
|
|
41
|
+
|
|
42
|
+
var zip = _interopRequireWildcard(require("./zip"));
|
|
43
|
+
|
|
44
|
+
exports.zip = zip;
|
|
45
|
+
|
|
46
|
+
var imageUtil = _interopRequireWildcard(require("./image-util"));
|
|
47
|
+
|
|
48
|
+
exports.imageUtil = imageUtil;
|
|
49
|
+
|
|
50
|
+
var mjpeg = _interopRequireWildcard(require("./mjpeg"));
|
|
51
|
+
|
|
52
|
+
exports.mjpeg = mjpeg;
|
|
53
|
+
|
|
54
|
+
var node = _interopRequireWildcard(require("./node"));
|
|
55
|
+
|
|
56
|
+
exports.node = node;
|
|
57
|
+
|
|
58
|
+
var timing = _interopRequireWildcard(require("./timing"));
|
|
59
|
+
|
|
60
|
+
exports.timing = timing;
|
|
61
|
+
|
|
62
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
63
|
+
|
|
64
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
65
|
+
|
|
66
|
+
const {
|
|
67
|
+
fs
|
|
68
|
+
} = fsIndex;
|
|
69
|
+
exports.fs = fs;
|
|
70
|
+
const {
|
|
71
|
+
cancellableDelay
|
|
72
|
+
} = util;
|
|
73
|
+
exports.cancellableDelay = cancellableDelay;
|
|
74
|
+
const {
|
|
75
|
+
mkdirp
|
|
76
|
+
} = mkdirpIndex;
|
|
77
|
+
exports.mkdirp = mkdirp;
|
|
78
|
+
var _default = {
|
|
79
|
+
tempDir,
|
|
80
|
+
system,
|
|
81
|
+
util,
|
|
82
|
+
fs,
|
|
83
|
+
cancellableDelay,
|
|
84
|
+
plist,
|
|
85
|
+
mkdirp,
|
|
86
|
+
logger,
|
|
87
|
+
process,
|
|
88
|
+
zip,
|
|
89
|
+
imageUtil,
|
|
90
|
+
net,
|
|
91
|
+
mjpeg,
|
|
92
|
+
node,
|
|
93
|
+
timing
|
|
94
|
+
};
|
|
95
|
+
exports.default = _default;require('source-map-support').install();
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9pbmRleC5qcyJdLCJuYW1lcyI6WyJmcyIsImZzSW5kZXgiLCJjYW5jZWxsYWJsZURlbGF5IiwidXRpbCIsIm1rZGlycCIsIm1rZGlycEluZGV4IiwidGVtcERpciIsInN5c3RlbSIsInBsaXN0IiwibG9nZ2VyIiwicHJvY2VzcyIsInppcCIsImltYWdlVXRpbCIsIm5ldCIsIm1qcGVnIiwibm9kZSIsInRpbWluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7OztBQUdBLE1BQU07QUFBRUEsRUFBQUE7QUFBRixJQUFTQyxPQUFmOztBQUNBLE1BQU07QUFBRUMsRUFBQUE7QUFBRixJQUF1QkMsSUFBN0I7O0FBQ0EsTUFBTTtBQUFFQyxFQUFBQTtBQUFGLElBQWFDLFdBQW5COztlQU1lO0FBQ2JDLEVBQUFBLE9BRGE7QUFDSkMsRUFBQUEsTUFESTtBQUNJSixFQUFBQSxJQURKO0FBQ1VILEVBQUFBLEVBRFY7QUFDY0UsRUFBQUEsZ0JBRGQ7QUFDZ0NNLEVBQUFBLEtBRGhDO0FBQ3VDSixFQUFBQSxNQUR2QztBQUMrQ0ssRUFBQUEsTUFEL0M7QUFDdURDLEVBQUFBLE9BRHZEO0FBRWJDLEVBQUFBLEdBRmE7QUFFUkMsRUFBQUEsU0FGUTtBQUVHQyxFQUFBQSxHQUZIO0FBRVFDLEVBQUFBLEtBRlI7QUFFZUMsRUFBQUEsSUFGZjtBQUVxQkMsRUFBQUE7QUFGckIsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHRlbXBEaXIgZnJvbSAnLi90ZW1wZGlyJztcbmltcG9ydCAqIGFzIHN5c3RlbSBmcm9tICcuL3N5c3RlbSc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgKiBhcyBmc0luZGV4IGZyb20gJy4vZnMnO1xuaW1wb3J0ICogYXMgbmV0IGZyb20gJy4vbmV0JztcbmltcG9ydCAqIGFzIHBsaXN0IGZyb20gJy4vcGxpc3QnO1xuaW1wb3J0ICogYXMgbWtkaXJwSW5kZXggZnJvbSAnLi9ta2RpcnAnO1xuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nZ2luZyc7XG5pbXBvcnQgKiBhcyBwcm9jZXNzIGZyb20gJy4vcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyB6aXAgZnJvbSAnLi96aXAnO1xuaW1wb3J0ICogYXMgaW1hZ2VVdGlsIGZyb20gJy4vaW1hZ2UtdXRpbCc7XG5pbXBvcnQgKiBhcyBtanBlZyBmcm9tICcuL21qcGVnJztcbmltcG9ydCAqIGFzIG5vZGUgZnJvbSAnLi9ub2RlJztcbmltcG9ydCAqIGFzIHRpbWluZyBmcm9tICcuL3RpbWluZyc7XG5cblxuY29uc3QgeyBmcyB9ID0gZnNJbmRleDtcbmNvbnN0IHsgY2FuY2VsbGFibGVEZWxheSB9ID0gdXRpbDtcbmNvbnN0IHsgbWtkaXJwIH0gPSBta2RpcnBJbmRleDtcblxuZXhwb3J0IHtcbiAgdGVtcERpciwgc3lzdGVtLCB1dGlsLCBmcywgY2FuY2VsbGFibGVEZWxheSwgcGxpc3QsIG1rZGlycCwgbG9nZ2VyLCBwcm9jZXNzLFxuICB6aXAsIGltYWdlVXRpbCwgbmV0LCBtanBlZywgbm9kZSwgdGltaW5nLFxufTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgdGVtcERpciwgc3lzdGVtLCB1dGlsLCBmcywgY2FuY2VsbGFibGVEZWxheSwgcGxpc3QsIG1rZGlycCwgbG9nZ2VyLCBwcm9jZXNzLFxuICB6aXAsIGltYWdlVXRpbCwgbmV0LCBtanBlZywgbm9kZSwgdGltaW5nLFxufTtcbiJdLCJmaWxlIjoibGliL2luZGV4LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|