@smarterplan/ngx-smarterplan-core 1.4.8 → 1.4.10
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/esm2022/lib/matterport-extensions/security-camera/SecurityCamera.mjs +10 -4
- package/esm2022/lib/services/filter.service.mjs +19 -16
- package/esm2022/lib/services/matterport-import.service.mjs +179 -13
- package/esm2022/lib/services/matterport-navigation.service.mjs +85 -6
- package/esm2022/lib/services/matterport-tag.service.mjs +32 -17
- package/esm2022/lib/services/matterport.service.mjs +15 -9
- package/esm2022/lib/services/models/comment.service.mjs +6 -3
- package/esm2022/lib/services/models/equipment.service.mjs +51 -59
- package/esm2022/lib/services/models/ticket.service.mjs +33 -33
- package/esm2022/lib/services/navigator.service.mjs +4 -5
- package/esm2022/lib/services/viewer.service.mjs +11 -2
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +431 -153
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/lib/services/matterport-import.service.d.ts +10 -0
- package/lib/services/matterport-navigation.service.d.ts +30 -0
- package/lib/services/matterport.service.d.ts +4 -0
- package/lib/services/models/ticket.service.d.ts +1 -1
- package/lib/services/viewer.service.d.ts +12 -1
- package/package.json +1 -1
|
@@ -57,7 +57,7 @@ export class MatterportImportService {
|
|
|
57
57
|
if (!iframe) {
|
|
58
58
|
throw new Error('Cannot create iframe');
|
|
59
59
|
}
|
|
60
|
-
this.viewerService.setTourUrl(modelID);
|
|
60
|
+
this.viewerService.setTourUrl({ model3d: modelID });
|
|
61
61
|
const url = this.viewerService.getTourUrl();
|
|
62
62
|
iframe.setAttribute('src', url);
|
|
63
63
|
iframe.allow = 'xr-spatial-tracking';
|
|
@@ -191,20 +191,47 @@ export class MatterportImportService {
|
|
|
191
191
|
const newLocal = await this.zoneService.create(zoneInput);
|
|
192
192
|
return newLocal;
|
|
193
193
|
}
|
|
194
|
+
// --- Main import function (complete) ---
|
|
194
195
|
async import360images(overrideExisting = true) {
|
|
195
196
|
console.log('Importing 360 images');
|
|
196
197
|
this.importingImages.next(true);
|
|
197
198
|
return new Promise(async (resolve) => {
|
|
198
199
|
const scans = Object.values(this.sweeps);
|
|
199
|
-
const nmbScans =
|
|
200
|
+
const nmbScans = scans.length;
|
|
200
201
|
this.totalSweepsCount.next(nmbScans);
|
|
201
202
|
const start = overrideExisting ? 0 : await this.getUploadedImageCount(this.modelID);
|
|
202
203
|
for (let index = start; index < nmbScans; index += 1) {
|
|
203
|
-
if (
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
204
|
+
if (this.stop) {
|
|
205
|
+
console.log('Abandoning import because it was cancelled');
|
|
206
|
+
resolve(false);
|
|
207
|
+
this.removeFrame();
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
const sweep = scans[index];
|
|
211
|
+
console.log('Moving to sweep:', sweep);
|
|
212
|
+
// Prefer legacy .id first, then uuid, then sid as last resort
|
|
213
|
+
const moveId = sweep.id || sweep.uuid || sweep.sid;
|
|
214
|
+
try {
|
|
215
|
+
// Move to sweep (use the best available id)
|
|
216
|
+
await this.sdk.Sweep.moveTo(moveId, {
|
|
217
|
+
rotation: { x: 0, y: 0 },
|
|
218
|
+
transition: this.sdk.Camera && this.sdk.Camera.TransitionType
|
|
219
|
+
? this.sdk.Camera.TransitionType.INSTANT
|
|
220
|
+
: undefined,
|
|
221
|
+
transitionTime: 0,
|
|
222
|
+
});
|
|
223
|
+
// Capture with automatic retry (ensures renderer readiness each attempt)
|
|
224
|
+
const img = await this.captureEquirectangularWithRetry({ width: 2048, height: 1024 }, { mattertags: false, sweeps: true }, {
|
|
225
|
+
maxAttempts: 3,
|
|
226
|
+
initialBackoffMs: 500,
|
|
227
|
+
perAttemptTimeoutMs: 8000,
|
|
228
|
+
sweepIdForReadyCheck: moveId,
|
|
229
|
+
waitForSweepTimeoutMs: 12000
|
|
230
|
+
});
|
|
231
|
+
// Upload asynchronously (do not await to keep throughput)
|
|
232
|
+
uploadBase64ImageWithRetry(img,
|
|
233
|
+
// prefer using uuid for storage name if available, else fallback to moveId
|
|
234
|
+
sweep.uuid || moveId, `visits/${this.modelID}/sweeps/`, 'sweep', 5).then(() => {
|
|
208
235
|
this.sweepProcessedCount.next(index);
|
|
209
236
|
if (index === nmbScans - 1) {
|
|
210
237
|
console.log('Import 360 done');
|
|
@@ -216,17 +243,156 @@ export class MatterportImportService {
|
|
|
216
243
|
console.log("Error uploading scan : ", e);
|
|
217
244
|
});
|
|
218
245
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
this.
|
|
223
|
-
|
|
246
|
+
catch (err) {
|
|
247
|
+
// capture failed after retries — log and continue to next sweep
|
|
248
|
+
console.error(`Failed to capture sweep ${moveId} after retries:`, err);
|
|
249
|
+
this.sweepProcessedCount.next(index);
|
|
250
|
+
// continue to next sweep (change to `throw err` if you want to abort on first failure)
|
|
251
|
+
continue;
|
|
224
252
|
}
|
|
225
253
|
}
|
|
254
|
+
// If loop finishes without hitting the final resolve in upload promise:
|
|
226
255
|
resolve(true);
|
|
227
256
|
this.removeFrame();
|
|
228
257
|
});
|
|
229
258
|
}
|
|
259
|
+
// --- capture with retry and backoff ---
|
|
260
|
+
// options: renderer size; renderOptions: renderer flags; cfg: retry config
|
|
261
|
+
async captureEquirectangularWithRetry(options, renderOptions, { maxAttempts = 3, initialBackoffMs = 500, perAttemptTimeoutMs = 8000, sweepIdForReadyCheck = null, waitForSweepTimeoutMs = 12000 } = {}) {
|
|
262
|
+
let attempt = 0;
|
|
263
|
+
let lastError = null;
|
|
264
|
+
while (attempt < maxAttempts) {
|
|
265
|
+
attempt += 1;
|
|
266
|
+
try {
|
|
267
|
+
// Ensure sweep is ready before each attempt if requested
|
|
268
|
+
if (sweepIdForReadyCheck) {
|
|
269
|
+
await this.waitForSweepReady(sweepIdForReadyCheck, waitForSweepTimeoutMs);
|
|
270
|
+
// small safety delay to let renderer finalize
|
|
271
|
+
await this.sleep(120);
|
|
272
|
+
}
|
|
273
|
+
// Race the takeEquirectangular call against a per-attempt timeout
|
|
274
|
+
const img = await Promise.race([
|
|
275
|
+
this.sdk.Renderer.takeEquirectangular(options, renderOptions),
|
|
276
|
+
this.timeoutPromise(perAttemptTimeoutMs, `takeEquirectangular timed out after ${perAttemptTimeoutMs}ms`)
|
|
277
|
+
]);
|
|
278
|
+
// success
|
|
279
|
+
return img;
|
|
280
|
+
}
|
|
281
|
+
catch (err) {
|
|
282
|
+
lastError = err;
|
|
283
|
+
console.warn(`takeEquirectangular attempt ${attempt} failed:`, err);
|
|
284
|
+
if (attempt >= maxAttempts) {
|
|
285
|
+
throw lastError;
|
|
286
|
+
}
|
|
287
|
+
// exponential backoff before next attempt
|
|
288
|
+
const backoff = initialBackoffMs * Math.pow(2, attempt - 1);
|
|
289
|
+
// add small jitter to reduce thundering herd
|
|
290
|
+
const jitter = Math.floor(Math.random() * 100);
|
|
291
|
+
await this.sleep(backoff + jitter);
|
|
292
|
+
// loop to next attempt
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
throw lastError || new Error('captureEquirectangularWithRetry failed without error');
|
|
296
|
+
}
|
|
297
|
+
// --- Wait until the SDK reports the target sweep as current ---
|
|
298
|
+
// Tries: sdk.Sweep.current.waitUntil -> sdk.Sweep.current.subscribe -> polling getCurrent/value
|
|
299
|
+
// This function matches targetId against multiple fields and prioritizes .id matching.
|
|
300
|
+
waitForSweepReady(targetId, timeoutMs = 10000) {
|
|
301
|
+
const sdk = this.sdk;
|
|
302
|
+
// helper to match multiple id fields, prioritizing id first
|
|
303
|
+
const matchesTarget = (data) => {
|
|
304
|
+
if (!data)
|
|
305
|
+
return false;
|
|
306
|
+
// check .id first (legacy), then uuid, sid, uid
|
|
307
|
+
const fields = [data.id, data.uuid, data.sid, data.uid];
|
|
308
|
+
return fields.some(f => !!f && String(f) === String(targetId));
|
|
309
|
+
};
|
|
310
|
+
// 1) prefer waitUntil if available on the observable
|
|
311
|
+
if (sdk.Sweep && sdk.Sweep.current && typeof sdk.Sweep.current.waitUntil === 'function') {
|
|
312
|
+
return Promise.race([
|
|
313
|
+
sdk.Sweep.current.waitUntil((data) => matchesTarget(data)),
|
|
314
|
+
this.timeoutPromise(timeoutMs, `Timeout waiting for sweep ${targetId}`)
|
|
315
|
+
]);
|
|
316
|
+
}
|
|
317
|
+
// 2) subscribe if available
|
|
318
|
+
if (sdk.Sweep && sdk.Sweep.current && typeof sdk.Sweep.current.subscribe === 'function') {
|
|
319
|
+
return new Promise((resolve, reject) => {
|
|
320
|
+
const timer = setTimeout(() => {
|
|
321
|
+
if (off)
|
|
322
|
+
off();
|
|
323
|
+
reject(new Error(`Timeout waiting for sweep ${targetId}`));
|
|
324
|
+
}, timeoutMs);
|
|
325
|
+
let off = null;
|
|
326
|
+
try {
|
|
327
|
+
// subscribe may return an unsubscribe function or an object with unsubscribe()
|
|
328
|
+
const subResult = sdk.Sweep.current.subscribe((data) => {
|
|
329
|
+
if (matchesTarget(data)) {
|
|
330
|
+
clearTimeout(timer);
|
|
331
|
+
try {
|
|
332
|
+
if (typeof subResult === 'function')
|
|
333
|
+
subResult();
|
|
334
|
+
else if (subResult && typeof subResult.unsubscribe === 'function')
|
|
335
|
+
subResult.unsubscribe();
|
|
336
|
+
}
|
|
337
|
+
catch (e) { /*ignore*/ }
|
|
338
|
+
resolve();
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
// if subscribe returned an unsubscribe function, keep it as off
|
|
342
|
+
if (typeof subResult === 'function')
|
|
343
|
+
off = subResult;
|
|
344
|
+
else if (subResult && typeof subResult.unsubscribe === 'function')
|
|
345
|
+
off = () => subResult.unsubscribe();
|
|
346
|
+
}
|
|
347
|
+
catch (e) {
|
|
348
|
+
clearTimeout(timer);
|
|
349
|
+
reject(new Error('sdk.Sweep.current.subscribe not usable'));
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
// 3) polling fallback: try getCurrent(), sdk.Sweep.current() function, or .value, else poll renderer readiness
|
|
354
|
+
return new Promise(async (resolve, reject) => {
|
|
355
|
+
const pollInterval = 200;
|
|
356
|
+
const timer = setTimeout(() => {
|
|
357
|
+
clearInterval(interval);
|
|
358
|
+
reject(new Error(`Timeout waiting for sweep ${targetId}`));
|
|
359
|
+
}, timeoutMs);
|
|
360
|
+
const checkNow = async () => {
|
|
361
|
+
try {
|
|
362
|
+
let current = null;
|
|
363
|
+
if (sdk.Sweep && typeof sdk.Sweep.getCurrent === 'function') {
|
|
364
|
+
current = await sdk.Sweep.getCurrent();
|
|
365
|
+
}
|
|
366
|
+
else if (sdk.Sweep && typeof sdk.Sweep.current === 'function') {
|
|
367
|
+
// some builds expose a function
|
|
368
|
+
current = await sdk.Sweep.current();
|
|
369
|
+
}
|
|
370
|
+
else if (sdk.Sweep && sdk.Sweep.current && sdk.Sweep.current.value) {
|
|
371
|
+
// some observables expose a .value
|
|
372
|
+
current = sdk.Sweep.current.value;
|
|
373
|
+
}
|
|
374
|
+
if (matchesTarget(current)) {
|
|
375
|
+
clearTimeout(timer);
|
|
376
|
+
clearInterval(interval);
|
|
377
|
+
resolve();
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
catch (e) {
|
|
381
|
+
// ignore and retry until timeout
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
// initial immediate check
|
|
385
|
+
await checkNow();
|
|
386
|
+
const interval = setInterval(checkNow, pollInterval);
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
// --- small helpers ---
|
|
390
|
+
sleep(ms) {
|
|
391
|
+
return new Promise(res => setTimeout(res, ms));
|
|
392
|
+
}
|
|
393
|
+
timeoutPromise(ms, message) {
|
|
394
|
+
return new Promise((_, reject) => setTimeout(() => reject(new Error(message)), ms));
|
|
395
|
+
}
|
|
230
396
|
async getUploadedImageCount(modelID) {
|
|
231
397
|
try {
|
|
232
398
|
const images = await listFilesInFolder(`visits/${modelID}/sweeps/`);
|
|
@@ -350,4 +516,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
350
516
|
providedIn: 'root',
|
|
351
517
|
}]
|
|
352
518
|
}], ctorParameters: () => [{ type: i1.NavigationService }, { type: i2.ZoneService }, { type: i3.ViewerService }, { type: i4.LayerService }, { type: i5.BaseUserService }, { type: i6.PlanService }] });
|
|
353
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC1pbXBvcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvc2VydmljZXMvbWF0dGVycG9ydC1pbXBvcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLHdCQUF3QixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQ0wsV0FBVyxHQU1aLE1BQU0sa0JBQWtCLENBQUM7QUFLMUIsT0FBTyxFQUNMLGNBQWMsRUFDZCxpQkFBaUIsRUFDakIsMEJBQTBCLEVBQzFCLGlCQUFpQixHQUNsQixNQUFNLGNBQWMsQ0FBQzs7Ozs7Ozs7QUFhdEIsTUFBTSxPQUFPLHVCQUF1QjtJQXlDeEI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBN0NGLFlBQVksQ0FBQztJQUVkLEdBQUcsQ0FBTTtJQUVSLE1BQU0sQ0FBUztJQUVoQixNQUFNLENBQVM7SUFFZCxZQUFZLENBQUM7SUFFYixRQUFRLENBQVM7SUFFakIsUUFBUSxDQUFTO0lBRXpCLElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQVcsT0FBTyxDQUFDLEtBQWE7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQVcsT0FBTyxDQUFDLEtBQWE7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVNLElB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QUVELE9BQU87UUFDTCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFHRCxLQUFLLENBQUMsY0FBYyxDQUFDLElBQVk7UUFDL0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7UUFDNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLDZCQUE2QixDQUNsRSxJQUFJLEVBQ0osWUFBWSxDQUNiLENBQUM7UUFDRixJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkIsQ0FBQztRQUNELGNBQWM7UUFDZCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsMEJBQTBCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzFFLENBQUM7d0dBNWJVLHVCQUF1Qjs0R0FBdkIsdUJBQXVCLGNBRnRCLE1BQU07OzRGQUVQLHVCQUF1QjtrQkFIbkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgcmVtb3ZlTnVsbEtleXNGcm9tT2JqZWN0LCB3YWl0LCB3YWl0VW50aWwgfSBmcm9tICcuLi9oZWxwZXJzLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIExldmVsU3RhdHVzLFxyXG4gIExheWVyLFxyXG4gIE5vZGUsXHJcbiAgWm9uZSxcclxuICBOYXZpZ2F0aW9uLFxyXG4gIFBsYW4sXHJcbn0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IExheWVyU2VydmljZSB9IGZyb20gJy4vbW9kZWxzL2xheWVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vbW9kZWxzL25hdmlnYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFBsYW5TZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvcGxhbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuL21vZGVscy96b25lLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIHVwbG9hZEpzb25Ub1MzLFxyXG4gIHVwbG9hZEJhc2U2NEltYWdlLFxyXG4gIHVwbG9hZEJhc2U2NEltYWdlV2l0aFJldHJ5LFxyXG4gIGxpc3RGaWxlc0luRm9sZGVyLFxyXG59IGZyb20gJy4vczMuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VVc2VyU2VydmljZSB9IGZyb20gJy4vdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVmlld2VyU2VydmljZSB9IGZyb20gJy4vdmlld2VyLnNlcnZpY2UnO1xyXG5cclxuZGVjbGFyZSBnbG9iYWwge1xyXG4gIGludGVyZmFjZSBXaW5kb3cge1xyXG4gICAgTVBfU0RLOiB7IGNvbm5lY3Q6IEZ1bmN0aW9uIH07XHJcbiAgfVxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTWF0dGVycG9ydEltcG9ydFNlcnZpY2Uge1xyXG4gIHByaXZhdGUgY3VycmVudEZyYW1lO1xyXG5cclxuICBwdWJsaWMgc2RrOiBhbnk7XHJcblxyXG4gIHByaXZhdGUgc3dlZXBzOiBPYmplY3Q7XHJcblxyXG4gIHB1YmxpYyBmbG9vcnM6IE9iamVjdDtcclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50Rmxvb3I7XHJcblxyXG4gIHByaXZhdGUgX21vZGVsSUQ6IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSBfc3BhY2VJRDogc3RyaW5nO1xyXG5cclxuICBwdWJsaWMgZ2V0IHNwYWNlSUQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9zcGFjZUlEO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBzcGFjZUlEKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3NwYWNlSUQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbW9kZWxJRCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX21vZGVsSUQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IG1vZGVsSUQodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fbW9kZWxJRCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0b3AgPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIGltcG9ydGluZ0ltYWdlczogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcblxyXG4gIHB1YmxpYyBzd2VlcFByb2Nlc3NlZENvdW50OiBTdWJqZWN0PG51bWJlcj4gPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XHJcblxyXG4gIHB1YmxpYyB0b3RhbFN3ZWVwc0NvdW50OiBTdWJqZWN0PG51bWJlcj4gPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XHJcblxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgbmF2aWdhdGlvblNlcnZpY2U6IE5hdmlnYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB6b25lU2VydmljZTogWm9uZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHZpZXdlclNlcnZpY2U6IFZpZXdlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGxheWVyU2VydmljZTogTGF5ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwbGFuU2VydmljZTogUGxhblNlcnZpY2VcclxuICApIHtcclxuICB9XHJcblxyXG4gIGFzeW5jIGluaXRTZGtGb3JNb2RlbChtb2RlbElEOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRoaXMuc3RvcCA9IGZhbHNlO1xyXG5cclxuICAgIC8vIExvYWQgU0RLXHJcbiAgICBjb25zb2xlLmxvZygnTG9hZGluZyBNYXR0ZXJwb3J0IFNESycpO1xyXG4gICAgdGhpcy5tb2RlbElEID0gbW9kZWxJRDtcclxuICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xyXG4gICAgaWYgKCFpZnJhbWUpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIGlmcmFtZScpO1xyXG4gICAgfVxyXG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnNldFRvdXJVcmwobW9kZWxJRCk7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLnZpZXdlclNlcnZpY2UuZ2V0VG91clVybCgpO1xyXG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnc3JjJywgdXJsKTtcclxuICAgIGlmcmFtZS5hbGxvdyA9ICd4ci1zcGF0aWFsLXRyYWNraW5nJztcclxuICAgIGlmcmFtZS5oZWlnaHQgPSAnMTAwJSc7XHJcbiAgICBpZnJhbWUud2lkdGggPSAnMTAwJSc7XHJcbiAgICBpZnJhbWUuaWQgPSAndmlld2VyLW1vZHVsZSc7XHJcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3ZpZXdlci1mcmFtZScpO1xyXG4gICAgZWxlbWVudC5hcHBlbmQoaWZyYW1lKTtcclxuICAgIHRoaXMuY3VycmVudEZyYW1lID0gaWZyYW1lO1xyXG4gICAgY29uc3Qgc2hvd2Nhc2VXaW5kb3cgPSBpZnJhbWUuY29udGVudFdpbmRvdztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcclxuICAgICAgaWZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgICAgJ2xvYWQnLFxyXG4gICAgICAgIGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2RrID0gYXdhaXQgc2hvd2Nhc2VXaW5kb3cuTVBfU0RLLmNvbm5lY3QoXHJcbiAgICAgICAgICAgICAgaWZyYW1lLFxyXG4gICAgICAgICAgICAgICdxbjl3c2FzdXk1aDJmenJicm4xbnpyMGlkJyxcclxuICAgICAgICAgICAgICAnJ1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gRmxvb3IgZGF0YVxyXG4gICAgICAgICAgICB0aGlzLnNkay5GbG9vci5kYXRhLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogZnVuY3Rpb24gdXBkKGNvbGxlY3Rpb246IGFueSkge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGbG9vcnNcIiwgY29sbGVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZsb29ycyA9IGNvbGxlY3Rpb247XHJcbiAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gU3Vic2NyaWJlIHRvIGN1cnJlbnQgRmxvb3JcclxuICAgICAgICAgICAgdGhpcy5zZGsuRmxvb3IuY3VycmVudC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgZnVuY3Rpb24gdXBkKGN1cnJlbnRGbG9vcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rmxvb3IgPSBjdXJyZW50Rmxvb3I7XHJcbiAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gU3dlZXAgZGF0YVxyXG4gICAgICAgICAgICB0aGlzLnNkay5Td2VlcC5kYXRhLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogZnVuY3Rpb24gdXBkKGNvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGUgZW50aXJlIHVwLXRvLWRhdGUgY29sbGVjdGlvbicsIGNvbGxlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zd2VlcHMgPSBjb2xsZWN0aW9uO1xyXG4gICAgICAgICAgICAgIH0uYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIHJlbW92ZSBsYWJlbHNcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZGsuU2V0dGluZ3MudXBkYXRlKCdsYWJlbHMnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGxldCB0aW1lb3V0RXhwaXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvLyBzdGFydCB0aW1lb3V0XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gKHRpbWVvdXRFeHBpcmVkID0gdHJ1ZSksIDcwMDApO1xyXG4gICAgICAgICAgICBhd2FpdCB3YWl0VW50aWwoXHJcbiAgICAgICAgICAgICAgKCkgPT5cclxuICAgICAgICAgICAgICAgICh0aGlzLnN3ZWVwcyAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZmxvb3JzICE9PSB1bmRlZmluZWQpIHx8XHJcbiAgICAgICAgICAgICAgICB0aW1lb3V0RXhwaXJlZCA9PT0gdHJ1ZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAodGltZW91dEV4cGlyZWQpIHtcclxuICAgICAgICAgICAgICAvLyB3ZSBhcmUgbGlrZWx5IGluIG1hdHRlcnBvcnQgZXJyb3IgY2FzZSAodGhhdCB3ZSBjYW5ub3QgY2F0Y2ghKVxyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aW1lb3V0IGludGl0aWFsaXNpbmcgTWF0dGVycG9ydCcpO1xyXG4gICAgICAgICAgICAgIHJldHVybiByZWoobmV3IEVycm9yKCdlcnJvciBpbml0IE1hdHRlcnBvcnQnKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ2luaXQgZG9uZScpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzKHRydWUpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgICByZWoobmV3IEVycm9yKCdlcnJvciBpbml0IE1hdHRlcnBvcnQnKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGltcG9ydERhdGEoXHJcbiAgICBzcGFjZUlEOiBzdHJpbmcsXHJcbiAgICBzdXJmYWNlOiBudW1iZXIsXHJcbiAgICByZWxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgIG5vZGU6IE5vZGUgPSBudWxsLFxyXG4gICAgb3ZlcnJpZGVFeGlzdGluZyA9IHRydWVcclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghdGhpcy5zd2VlcHMpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignbm8gc3dlZXBzIGluaXRpYWxpemVkJykpO1xyXG4gICAgfVxyXG4gICAgbGV0IGFwcElzTG9hZGVkID0gZmFsc2U7XHJcblxyXG5cclxuICAgIHRoaXMuc2RrLkFwcC5zdGF0ZS5zdWJzY3JpYmUoZnVuY3Rpb24gKGFwcFN0YXRlKSB7XHJcbiAgICAgIC8vIGFwcCBzdGF0ZSBoYXMgY2hhbmdlZFxyXG4gICAgICBjb25zb2xlLmxvZygnVGhlIGN1cnJlbnQgcGhhc2U6ICcsIGFwcFN0YXRlLnBoYXNlKTtcclxuICAgICAgaWYgKGFwcFN0YXRlLnBoYXNlID09PSAnYXBwcGhhc2UucGxheWluZycpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnVGhlIGFwcCBpcyBwbGF5aW5nJyk7XHJcbiAgICAgICAgYXBwSXNMb2FkZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBhd2FpdCB3YWl0VW50aWwoKCkgPT4gYXBwSXNMb2FkZWQgPT09IHRydWUpO1xyXG5cclxuICAgIGlmIChyZWxvYWRpbmcpIHtcclxuICAgICAgLy8gcGVyZm9ybSBvbmx5IDM2MCBpbXBvcnQgc2luY2Ugd2UgYXJlIHJlbG9hZGluZ1xyXG4gICAgICBhd2FpdCB0aGlzLmltcG9ydDM2MGltYWdlcyhvdmVycmlkZUV4aXN0aW5nKTtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNwYWNlSUQgPSBzcGFjZUlEO1xyXG4gICAgbGV0IGZsb29yWm9uZXM6IFpvbmVbXSA9IFtdO1xyXG4gICAgY29uc3Qgem9uZXMgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmVzQnlTcGFjZShzcGFjZUlEKTtcclxuICAgIGNvbnN0IG1haW5ab25lID0gem9uZXMuZmluZCgoeikgPT4gIXoucGFyZW50SUQpO1xyXG4gICAgaWYgKCFtYWluWm9uZSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdtaXNzaW5nIGRhdGEgKG5vIG1haW4gQnVpbGRpbmcgWm9uZSknKSk7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZygnaW1wb3J0aW5nIGRhdGEgZnJvbSBtYXR0ZXJwb3J0Jyk7XHJcbiAgICAvLyBzYXZlIHN3ZWVwcyBkYXRhIGFzIGpzb25cclxuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShPYmplY3QudmFsdWVzKHRoaXMuc3dlZXBzKSk7XHJcbiAgICBhd2FpdCB1cGxvYWRKc29uVG9TMyhcclxuICAgICAgYHZpc2l0cy8ke3RoaXMubW9kZWxJRH0vaW52ZW50b3J5L2AsXHJcbiAgICAgIGpzb24sXHJcbiAgICAgICdkYXRhLmpzb24nXHJcbiAgICApO1xyXG4gICAgLy8gY2hlY2sgbGF5ZXIgb2YgYnVpbGRpbmcgdHlwZVxyXG4gICAgY29uc3QgbGF5ZXJCdWlsZGluZyA9IGF3YWl0IHRoaXMuZ2V0TGF5ZXJCeU5hbWUoJ0JVSUxESU5HJyk7XHJcbiAgICBjb25zdCBjcmVhdGVkRGVmYXVsdFpvbmUgPSBhd2FpdCB0aGlzLmNyZWF0ZVpvbmUoXHJcbiAgICAgIG5vZGUubWV0YWRhdGEsXHJcbiAgICAgIGxheWVyQnVpbGRpbmcuaWQsXHJcbiAgICAgIHN1cmZhY2UsXHJcbiAgICAgIG1haW5ab25lLmlkLFxyXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnN3ZWVwcyksXHJcbiAgICAgIG5vZGVcclxuICAgICk7XHJcbiAgICBpZiAoIWNyZWF0ZWREZWZhdWx0Wm9uZSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZsb29ycykge1xyXG4gICAgICBmbG9vclpvbmVzID0gYXdhaXQgdGhpcy5pbXBvcnRGbG9vckRhdGEoY3JlYXRlZERlZmF1bHRab25lLmlkLCBub2RlKTtcclxuICAgIH1cclxuICAgIC8vIGNvbnNvbGUubG9nKGZsb29yWm9uZXMpO1xyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3dlZXBzKS5tYXAoYXN5bmMgKGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHN3ZWVwSW5mbyA9IHRoaXMuc3dlZXBzW2tleV07XHJcbiAgICAgICAgY29uc3QgbmF2aWdhdGlvbklucHV0ID0ge1xyXG4gICAgICAgICAgbWF0dGVycG9ydFN3ZWVwSUQ6IHN3ZWVwSW5mby51dWlkLFxyXG4gICAgICAgICAgcG9zaXRpb246IEpTT04uc3RyaW5naWZ5KHN3ZWVwSW5mby5wb3NpdGlvbiksXHJcbiAgICAgICAgICByb3RhdGlvbjogSlNPTi5zdHJpbmdpZnkoc3dlZXBJbmZvLnJvdGF0aW9uKSxcclxuICAgICAgICAgIGxldmVsOiBMZXZlbFN0YXR1cy5MT1csXHJcbiAgICAgICAgICBub2RlSUQ6IG5vZGUuaWQsXHJcbiAgICAgICAgICBzcGFjZUlELFxyXG4gICAgICAgIH0gYXMgTmF2aWdhdGlvbjtcclxuICAgICAgICBjb25zdCBuYXYgPSBhd2FpdCB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmNyZWF0ZU5hdmlnYXRpb24oXHJcbiAgICAgICAgICBuYXZpZ2F0aW9uSW5wdXRcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmICghbmF2KSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnY291bGQgY3JlYXRlIG5hdmlnYXRpb24nLCBuYXZpZ2F0aW9uSW5wdXQuaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICBhd2FpdCB0aGlzLmltcG9ydDM2MGltYWdlcyhvdmVycmlkZUV4aXN0aW5nKTtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjcmVhdGVab25lKFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgbGF5ZXJJRDogc3RyaW5nLFxyXG4gICAgc3VyZmFjZTogbnVtYmVyID0gbnVsbCxcclxuICAgIHBhcmVudElEOiBzdHJpbmcgPSBudWxsLFxyXG4gICAgc3dlZXBzOiBzdHJpbmdbXSA9IFtdLFxyXG4gICAgbm9kZTogTm9kZSA9IG51bGwsXHJcbiAgICBtZXRhZGF0YTogc3RyaW5nID0gbnVsbFxyXG4gICk6IFByb21pc2U8Wm9uZT4ge1xyXG4gICAgY29uc3Qgem9uZUlucHV0ID0ge1xyXG4gICAgICBuYW1lLFxyXG4gICAgICBzcGFjZUlEOiB0aGlzLnNwYWNlSUQsXHJcbiAgICAgIGxheWVySUQsXHJcbiAgICAgIHN3ZWVwSURzOiBzd2VlcHMsXHJcbiAgICAgIG5vZGVJRHM6IG5vZGUgPyBbbm9kZS5pZF0gOiBudWxsLFxyXG4gICAgfSBhcyBab25lO1xyXG4gICAgcmVtb3ZlTnVsbEtleXNGcm9tT2JqZWN0KHpvbmVJbnB1dCk7XHJcbiAgICBpZiAoc3VyZmFjZSkge1xyXG4gICAgICB6b25lSW5wdXQuc3VyZmFjZSA9IHN1cmZhY2U7XHJcbiAgICB9XHJcbiAgICBpZiAocGFyZW50SUQpIHtcclxuICAgICAgem9uZUlucHV0LnBhcmVudElEID0gcGFyZW50SUQ7XHJcbiAgICB9XHJcbiAgICBpZiAobWV0YWRhdGEpIHtcclxuICAgICAgem9uZUlucHV0Lm1ldGFkYXRhID0gbWV0YWRhdGE7XHJcbiAgICB9XHJcbiAgICBjb25zdCBuZXdMb2NhbCA9IGF3YWl0IHRoaXMuem9uZVNlcnZpY2UuY3JlYXRlKHpvbmVJbnB1dCk7XHJcbiAgICByZXR1cm4gbmV3TG9jYWw7XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbXBvcnQzNjBpbWFnZXMob3ZlcnJpZGVFeGlzdGluZyA9IHRydWUpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnNvbGUubG9nKCdJbXBvcnRpbmcgMzYwIGltYWdlcycpO1xyXG4gICAgdGhpcy5pbXBvcnRpbmdJbWFnZXMubmV4dCh0cnVlKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xyXG4gICAgICBjb25zdCBzY2FucyA9IE9iamVjdC52YWx1ZXModGhpcy5zd2VlcHMpO1xyXG4gICAgICBjb25zdCBubWJTY2FucyA9IE9iamVjdC5rZXlzKHNjYW5zKS5sZW5ndGg7XHJcblxyXG4gICAgICB0aGlzLnRvdGFsU3dlZXBzQ291bnQubmV4dChubWJTY2Fucyk7XHJcblxyXG4gICAgICBjb25zdCBzdGFydCA9IG92ZXJyaWRlRXhpc3RpbmcgPyAwIDogYXdhaXQgdGhpcy5nZXRVcGxvYWRlZEltYWdlQ291bnQodGhpcy5tb2RlbElEKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gc3RhcnQ7IGluZGV4IDwgbm1iU2NhbnM7IGluZGV4ICs9IDEpIHtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLnN0b3ApIHtcclxuXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnNkay5Td2VlcC5tb3ZlVG8oc2NhbnNbaW5kZXhdLnV1aWQsIHsgcm90YXRpb246IHsgeDogMCwgeTogMCB9LCB0cmFuc2l0aW9uOiB0aGlzLnNkay5DYW1lcmEuVHJhbnNpdGlvblR5cGUuSU5TVEFOVCwgdHJhbnNpdGlvblRpbWU6IDAgfSk7XHJcblxyXG4gICAgICAgICAgY29uc3QgaW1nID0gYXdhaXQgdGhpcy5zZGsuUmVuZGVyZXIudGFrZUVxdWlyZWN0YW5ndWxhcihcclxuICAgICAgICAgICAgeyB3aWR0aDogMjA0OCwgaGVpZ2h0OiAxMDI0IH0sXHJcbiAgICAgICAgICAgIHsgbWF0dGVydGFnczogZmFsc2UsIHN3ZWVwczogdHJ1ZSB9XHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIC8qKlVwbG9hZCBvbiBTMyBhcmUgYXN5bmNocm9ub3VzLCBpbiBvcmRlciB0byBubyBzbG93IGRvd24gdGhlIHByb2Nlc3MqL1xyXG4gICAgICAgICAgdXBsb2FkQmFzZTY0SW1hZ2VXaXRoUmV0cnkoXHJcbiAgICAgICAgICAgIGltZyxcclxuICAgICAgICAgICAgc2NhbnNbaW5kZXhdLnV1aWQsXHJcbiAgICAgICAgICAgIGB2aXNpdHMvJHt0aGlzLm1vZGVsSUR9L3N3ZWVwcy9gLFxyXG4gICAgICAgICAgICAnc3dlZXAnLFxyXG4gICAgICAgICAgICA1XHJcbiAgICAgICAgICApLnRoZW4oKHIpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zd2VlcFByb2Nlc3NlZENvdW50Lm5leHQoaW5kZXgpO1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IG5tYlNjYW5zIC0gMSkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdJbXBvcnQgMzYwIGRvbmUnKTtcclxuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlRnJhbWUoKTtcclxuICAgICAgICAgICAgICB0aGlzLnN0b3AgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIHVwbG9hZGluZyBzY2FuIDogXCIsIGUpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0FiYW5kb25pbmcgaW1wb3J0IGJlY2F1c2UgaXQgd2FzIGNhbmNlbGxlZCcpO1xyXG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZUZyYW1lKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgIHRoaXMucmVtb3ZlRnJhbWUoKTtcclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFVwbG9hZGVkSW1hZ2VDb3VudChtb2RlbElEKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBpbWFnZXMgPSBhd2FpdCBsaXN0RmlsZXNJbkZvbGRlcihgdmlzaXRzLyR7bW9kZWxJRH0vc3dlZXBzL2ApO1xyXG4gICAgICByZXR1cm4gaW1hZ2VzLmxlbmd0aDtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBtb3ZlVG9GbG9vcihmbG9vck5hbWU6IHN0cmluZywgbWF0dGVycG9ydEZsb29yU2VxdWVuY2U6IG51bWJlciA9IG51bGwpIHtcclxuICAgIGlmICghdGhpcy5mbG9vcnMpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0Zsb29yIGFyZSBub3QgbG9hZGVkIHlldCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBsb29rIHVwIGZvciBzZXF1ZW5jZSBudW1iZXIgKHRoZSBzYWZlc3QgbWV0aG9kKVxyXG4gICAgbGV0IGZsb29yTWF0dGVycG9ydCA9IE9iamVjdC52YWx1ZXModGhpcy5mbG9vcnMpLmZpbmQoXHJcbiAgICAgIChmbG9vcikgPT4gZmxvb3Iuc2VxdWVuY2UgPT09IG1hdHRlcnBvcnRGbG9vclNlcXVlbmNlXHJcbiAgICApO1xyXG4gICAgaWYgKCFmbG9vck1hdHRlcnBvcnQpIHtcclxuICAgICAgZmxvb3JNYXR0ZXJwb3J0ID0gT2JqZWN0LnZhbHVlcyh0aGlzLmZsb29ycykuZmluZChcclxuICAgICAgICAoZmxvb3IpID0+IGZsb29yTmFtZS5pbmNsdWRlcyhmbG9vci5uYW1lKSAmJiBmbG9vci5uYW1lICE9ICcnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWZsb29yTWF0dGVycG9ydCkge1xyXG4gICAgICBmbG9vck1hdHRlcnBvcnQgPSBPYmplY3QudmFsdWVzKHRoaXMuZmxvb3JzKS5maW5kKChmbG9vcikgPT5cclxuICAgICAgICBmbG9vck5hbWUuaW5jbHVkZXMoZmxvb3IuaWQpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICAvLyBjb25zb2xlLmxvZyhmbG9vck1hdHRlcnBvcnQpXHJcbiAgICBpZiAoZmxvb3JNYXR0ZXJwb3J0KSB7XHJcbiAgICAgIGxldCByZXRyeSA9IHRydWU7XHJcbiAgICAgIHdoaWxlIChyZXRyeSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBmbG9vckluZGV4ID0gYXdhaXQgdGhpcy5zZGsuRmxvb3IubW92ZVRvKFxyXG4gICAgICAgICAgICBmbG9vck1hdHRlcnBvcnQuc2VxdWVuY2VcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIm1vdmVkIHRvIGZsb29ySW5kZXhcIiwgZmxvb3JJbmRleCk7XHJcbiAgICAgICAgICByZXRyeSA9IGZhbHNlO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnQ2Fubm90IG1vdmUgdG8gRmxvb3InLCBlcnJvcik7XHJcbiAgICAgICAgICBhd2FpdCB3YWl0KDEwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ05vIG1hdHRlcnBvcnQgZmxvb3IgZm91bmQgdG8gbW92ZSB0bycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGltcG9ydEZsb29yRGF0YShcclxuICAgIGRlZmF1dFpvbmVJRDogc3RyaW5nLFxyXG4gICAgbm9kZTogTm9kZVxyXG4gICk6IFByb21pc2U8Wm9uZVtdPiB7XHJcbiAgICBjb25zdCB6b25lcyA9IFtdO1xyXG4gICAgYXdhaXQgdGhpcy5zZGsuTW9kZS5tb3ZlVG8odGhpcy5zZGsuTW9kZS5Nb2RlLkZMT09SUExBTik7XHJcbiAgICBjb25zdCBubWJGbG9vcnMgPSBPYmplY3Qua2V5cyh0aGlzLmZsb29ycykubGVuZ3RoO1xyXG4gICAgY29uc29sZS5sb2coJ1RvdGFsIG51bWJlciBvZiBmbG9vcnMnLCBubWJGbG9vcnMpO1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG5tYkZsb29yczsgaW5kZXggKz0gMSkge1xyXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxyXG4gICAgICBjb25zb2xlLmxvZygnSW1wb3J0aW5nIGZsb29yJywgaW5kZXgpO1xyXG4gICAgICBhd2FpdCB0aGlzLnNkay5GbG9vci5tb3ZlVG8oaW5kZXgpLnRoZW4oYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGF3YWl0IHdhaXQoNzAwKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFib3V0IHRvIHNhdmUgdGhlIGZsb29yXCIsIGluZGV4KTtcclxuICAgICAgICBjb25zdCB6b25lID0gYXdhaXQgdGhpcy5zYXZlRmxvb3IoZGVmYXV0Wm9uZUlELCBub2RlKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInJlY2VpdmVkIGZsb29yIHpvbmVcIiwgem9uZSk7XHJcbiAgICAgICAgem9uZXMucHVzaCh6b25lKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHpvbmVzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2F2ZUZsb29yKGRlZmF1dFpvbmVJRDogc3RyaW5nLCBub2RlOiBOb2RlKTogUHJvbWlzZTxab25lPiB7XHJcbiAgICBsZXQgbmFtZSA9IHRoaXMuY3VycmVudEZsb29yLmlkO1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEZsb29yLm5hbWUgIT09ICcnKSB7XHJcbiAgICAgIG5hbWUgPSB0aGlzLmN1cnJlbnRGbG9vci5uYW1lO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbGF5ZXJGbG9vciA9IGF3YWl0IHRoaXMuZ2V0TGF5ZXJCeU5hbWUoJ0ZMT09SJyk7XHJcbiAgICBjb25zdCBzd2VlcHNJbmZvID0gT2JqZWN0LnZhbHVlcyh0aGlzLnN3ZWVwcyk7XHJcbiAgICBjb25zdCBzd2VlcHNGb3JGbG9vciA9IHN3ZWVwc0luZm8uZmlsdGVyKFxyXG4gICAgICAoc3dlZXBJbmZvKSA9PiBzd2VlcEluZm8uZmxvb3JJbmZvLmlkID09PSB0aGlzLmN1cnJlbnRGbG9vci5pZFxyXG4gICAgKTtcclxuICAgIGNvbnNvbGUubG9nKCdjdXJyZW50IGZsb29yJywgdGhpcy5jdXJyZW50Rmxvb3IpO1xyXG4gICAgY29uc29sZS5sb2coJ3N3ZWVwcyBmb3IgZmxvb3InLCBzd2VlcHNGb3JGbG9vci5sZW5ndGgpO1xyXG4gICAgY29uc3Qgc3dlZXBJRHM6IHN0cmluZ1tdID0gc3dlZXBzRm9yRmxvb3IubWFwKChzd2VlcCkgPT4gc3dlZXAudXVpZCk7XHJcbiAgICBjb25zdCB6b25lID0gYXdhaXQgdGhpcy5jcmVhdGVab25lKFxyXG4gICAgICBgw4l0YWdlICR7bmFtZX0gLSAke25vZGUubWV0YWRhdGF9YCxcclxuICAgICAgbGF5ZXJGbG9vci5pZCxcclxuICAgICAgbnVsbCxcclxuICAgICAgZGVmYXV0Wm9uZUlELFxyXG4gICAgICBzd2VlcElEcyxcclxuICAgICAgbm9kZSxcclxuICAgICAgSlNPTi5zdHJpbmdpZnkoeyBtYXR0ZXJwb3J0Rmxvb3JTZXF1ZW5jZTogdGhpcy5jdXJyZW50Rmxvb3Iuc2VxdWVuY2UgfSlcclxuICAgICk7XHJcbiAgICAvLyBUT0RPIGxpbmsgdG8gc2NhbnNcclxuICAgIGNvbnN0IGJhc2U2NCA9IGF3YWl0IHRoaXMuc2RrLlJlbmRlcmVyLnRha2VTY3JlZW5TaG90KHtcclxuICAgICAgd2lkdGg6IDQwOTYsXHJcbiAgICAgIGhlaWdodDogMjA0OCxcclxuICAgIH0pO1xyXG4gICAgY29uc3Qgc3BhY2VJRHNob3J0ID0gdGhpcy5zcGFjZUlELnNsaWNlKDAsIDgpO1xyXG4gICAgYXdhaXQgdXBsb2FkQmFzZTY0SW1hZ2UoXHJcbiAgICAgIGJhc2U2NCxcclxuICAgICAgbnVsbCxcclxuICAgICAgYHZpc2l0cy8ke3RoaXMubW9kZWxJRH0vcGxhbnMvYCxcclxuICAgICAgYHBsYW5fZmxvb3JfJHt0aGlzLmN1cnJlbnRGbG9vci5pZH1fJHtzcGFjZUlEc2hvcnR9YFxyXG4gICAgKTtcclxuICAgIC8vIGNyZWF0ZSBQbGFuIG9iamVjdFxyXG4gICAgY29uc3QgcGxhbiA9IHtcclxuICAgICAgbmFtZTogYHBsYW5fZmxvb3JfJHt0aGlzLmN1cnJlbnRGbG9vci5pZH1gLFxyXG4gICAgICBhbm5leGU6IGB2aXNpdHMvJHt0aGlzLm1vZGVsSUR9L3BsYW5zL3BsYW5fZmxvb3JfJHt0aGlzLmN1cnJlbnRGbG9vci5pZH1fJHtzcGFjZUlEc2hvcnR9LmpwZWdgLFxyXG4gICAgICB6b25lSUQ6IHpvbmUuaWQsXHJcbiAgICAgIHNwYWNlSUQ6IHRoaXMuc3BhY2VJRCxcclxuICAgICAgaXNDdXJyZW50Rm9yWm9uZTogdHJ1ZSxcclxuICAgICAgaXNNb2RpZmllZDogZmFsc2UsXHJcbiAgICAgIGlzSW1wb3J0ZWRNYXR0ZXJwb3J0OiB0cnVlLFxyXG4gICAgfSBhcyBQbGFuO1xyXG4gICAgYXdhaXQgdGhpcy5wbGFuU2VydmljZS5jcmVhdGVQbGFuKHBsYW4pO1xyXG4gICAgLy8gY29uc29sZS5sb2coXCJmbG9vciBzYXZlZFwiKTtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoem9uZSk7XHJcbiAgfVxyXG5cclxuICBhYmFuZG9uKCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdhYmFuZG9ubmluZyBpbXBvcnQnKTtcclxuICAgICAgdGhpcy5zdG9wID0gdHJ1ZTtcclxuICAgICAgdGhpcy5yZW1vdmVGcmFtZSgpO1xyXG4gICAgfSwgNTAwKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUZyYW1lKCkge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEZyYW1lLnJlbW92ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGFzeW5jIGdldExheWVyQnlOYW1lKG5hbWU6IHN0cmluZyk6IFByb21pc2U8TGF5ZXI+IHtcclxuICAgIGNvbnN0IG1pc3Npb24gPSB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRNaXNzaW9uKHRoaXMuc3BhY2VJRCk7XHJcbiAgICBjb25zdCBjdXJyZW50T3JnSWQgPSBtaXNzaW9uLm9yZ2FuaXNhdGlvbklEO1xyXG4gICAgY29uc3QgbGF5ZXJzID0gYXdhaXQgdGhpcy5sYXllclNlcnZpY2UuZ2V0TGF5ZXJCeU5hbWVGb3JPcmdhbmlzYXRpb24oXHJcbiAgICAgIG5hbWUsXHJcbiAgICAgIGN1cnJlbnRPcmdJZFxyXG4gICAgKTtcclxuICAgIGlmIChsYXllcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gbGF5ZXJzWzBdO1xyXG4gICAgfVxyXG4gICAgLy8gY3JlYXRlIHRoZW5cclxuICAgIHJldHVybiB0aGlzLmxheWVyU2VydmljZS5jcmVhdGVMYXllckZvck9yZ2FuaXNhdGlvbihuYW1lLCBjdXJyZW50T3JnSWQpO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
519
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC1pbXBvcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvc2VydmljZXMvbWF0dGVycG9ydC1pbXBvcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLHdCQUF3QixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQ0wsV0FBVyxHQU1aLE1BQU0sa0JBQWtCLENBQUM7QUFLMUIsT0FBTyxFQUNMLGNBQWMsRUFDZCxpQkFBaUIsRUFDakIsMEJBQTBCLEVBQzFCLGlCQUFpQixHQUNsQixNQUFNLGNBQWMsQ0FBQzs7Ozs7Ozs7QUFhdEIsTUFBTSxPQUFPLHVCQUF1QjtJQXlDeEI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBN0NGLFlBQVksQ0FBQztJQUVkLEdBQUcsQ0FBTTtJQUVSLE1BQU0sQ0FBUztJQUVoQixNQUFNLENBQVM7SUFFZCxZQUFZLENBQUM7SUFFYixRQUFRLENBQVM7SUFFakIsUUFBUSxDQUFTO0lBRXpCLElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQVcsT0FBTyxDQUFDLEtBQWE7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQVcsT0FBTyxDQUFDLEtBQWE7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVNLElBQUksR0FBRyxLQUFLLENBQUM7SUFFYixlQUFlLEdBQXFCLElBQUksT0FBTyxFQUFXLENBQUM7SUFFM0QsbUJBQW1CLEdBQW9CLElBQUksT0FBTyxFQUFVLENBQUM7SUFFN0QsZ0JBQWdCLEdBQW9CLElBQUksT0FBTyxFQUFVLENBQUM7SUFHakUsWUFDVSxpQkFBb0MsRUFDcEMsV0FBd0IsRUFDeEIsYUFBNEIsRUFDNUIsWUFBMEIsRUFDMUIsV0FBNEIsRUFDNUIsV0FBd0I7UUFMeEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7SUFFbEMsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBZTtRQUNuQyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUVsQixXQUFXO1FBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDNUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEMsTUFBTSxDQUFDLEtBQUssR0FBRyxxQkFBcUIsQ0FBQztRQUNyQyxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN2QixNQUFNLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUN0QixNQUFNLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQztRQUM1QixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3hELE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7UUFDM0IsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztRQUM1QyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzlCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FDckIsTUFBTSxFQUNOLEtBQUssSUFBSSxFQUFFO2dCQUNULElBQUksQ0FBQztvQkFDSCxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQzVDLE1BQU0sRUFDTiwyQkFBMkIsRUFDM0IsRUFBRSxDQUNILENBQUM7b0JBQ0YsMEJBQTBCO29CQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO3dCQUM1QixtQkFBbUIsRUFBRSxTQUFTLEdBQUcsQ0FBQyxVQUFlOzRCQUMvQyxxQ0FBcUM7NEJBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDO3dCQUMzQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztxQkFDYixDQUFDLENBQUM7b0JBQ0gsNkJBQTZCO29CQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUM5QixTQUFTLEdBQUcsQ0FBQyxZQUFZO3dCQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztvQkFDbkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDYixDQUFDO29CQUVGLDBCQUEwQjtvQkFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzt3QkFDNUIsbUJBQW1CLEVBQUUsU0FBUyxHQUFHLENBQUMsVUFBVTs0QkFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsRUFBRSxVQUFVLENBQUMsQ0FBQzs0QkFDNUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7d0JBQzNCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO3FCQUNiLENBQUMsQ0FBQztvQkFDSCxnQkFBZ0I7b0JBQ2hCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDaEQsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO29CQUMzQixnQkFBZ0I7b0JBQ2hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDaEQsTUFBTSxTQUFTLENBQ2IsR0FBRyxFQUFFLENBQ0gsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQzt3QkFDeEQsY0FBYyxLQUFLLElBQUksQ0FDMUIsQ0FBQztvQkFDRixJQUFJLGNBQWMsRUFBRSxDQUFDO3dCQUNuQixpRUFBaUU7d0JBQ2pFLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLENBQUMsQ0FBQzt3QkFDaEQsT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO29CQUNqRCxDQUFDO29CQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ3pCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNuQixDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDakIsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQztnQkFDMUMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FDZCxPQUFlLEVBQ2YsT0FBZSxFQUNmLFlBQXFCLEtBQUssRUFDMUIsT0FBYSxJQUFJLEVBQ2pCLGdCQUFnQixHQUFHLElBQUk7UUFFdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFDRCxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFHeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLFFBQVE7WUFDN0Msd0JBQXdCO1lBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25ELElBQUksUUFBUSxDQUFDLEtBQUssS0FBSyxrQkFBa0IsRUFBRSxDQUFDO2dCQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBQ2xDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDckIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBRTVDLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxpREFBaUQ7WUFDakQsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDN0MsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLFVBQVUsR0FBVyxFQUFFLENBQUM7UUFDNUIsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5RCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDOUMsMkJBQTJCO1FBQzNCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN4RCxNQUFNLGNBQWMsQ0FDbEIsVUFBVSxJQUFJLENBQUMsT0FBTyxhQUFhLEVBQ25DLElBQUksRUFDSixXQUFXLENBQ1osQ0FBQztRQUNGLCtCQUErQjtRQUMvQixNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUQsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQzlDLElBQUksQ0FBQyxRQUFRLEVBQ2IsYUFBYSxDQUFDLEVBQUUsRUFDaEIsT0FBTyxFQUNQLFFBQVEsQ0FBQyxFQUFFLEVBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQ3hCLElBQUksQ0FDTCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDeEIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsMkJBQTJCO1FBQzNCLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3pDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkMsTUFBTSxlQUFlLEdBQUc7Z0JBQ3RCLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxJQUFJO2dCQUNqQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO2dCQUM1QyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO2dCQUM1QyxLQUFLLEVBQUUsV0FBVyxDQUFDLEdBQUc7Z0JBQ3RCLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDZixPQUFPO2FBQ00sQ0FBQztZQUNoQixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FDdkQsZUFBZSxDQUNoQixDQUFDO1lBQ0YsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUUsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0YsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDN0MsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUNkLElBQVksRUFDWixPQUFlLEVBQ2YsVUFBa0IsSUFBSSxFQUN0QixXQUFtQixJQUFJLEVBQ3ZCLFNBQW1CLEVBQUUsRUFDckIsT0FBYSxJQUFJLEVBQ2pCLFdBQW1CLElBQUk7UUFFdkIsTUFBTSxTQUFTLEdBQUc7WUFDaEIsSUFBSTtZQUNKLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixPQUFPO1lBQ1AsUUFBUSxFQUFFLE1BQU07WUFDaEIsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDekIsQ0FBQztRQUNWLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixTQUFTLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUM5QixDQUFDO1FBQ0QsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLFNBQVMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsU0FBUyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDaEMsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxLQUFLLENBQUMsZUFBZSxDQUFDLGdCQUFnQixHQUFHLElBQUk7UUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhDLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ25DLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFFOUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVyQyxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFcEYsS0FBSyxJQUFJLEtBQUssR0FBRyxLQUFLLEVBQUUsS0FBSyxHQUFHLFFBQVEsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBRXJELElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTRDLENBQUMsQ0FBQztvQkFDMUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNmLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDbkIsTUFBTTtnQkFDUixDQUFDO2dCQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFdkMsOERBQThEO2dCQUM5RCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQztnQkFFbkQsSUFBSSxDQUFDO29CQUNILDRDQUE0QztvQkFDNUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO3dCQUNsQyxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7d0JBQ3hCLFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjOzRCQUMzRCxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU87NEJBQ3hDLENBQUMsQ0FBQyxTQUFTO3dCQUNiLGNBQWMsRUFBRSxDQUFDO3FCQUNsQixDQUFDLENBQUM7b0JBRUgseUVBQXlFO29CQUN6RSxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQywrQkFBK0IsQ0FDcEQsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFDN0IsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFDbkM7d0JBQ0UsV0FBVyxFQUFFLENBQUM7d0JBQ2QsZ0JBQWdCLEVBQUUsR0FBRzt3QkFDckIsbUJBQW1CLEVBQUUsSUFBSTt3QkFDekIsb0JBQW9CLEVBQUUsTUFBTTt3QkFDNUIscUJBQXFCLEVBQUUsS0FBSztxQkFDN0IsQ0FDRixDQUFDO29CQUVGLDBEQUEwRDtvQkFDMUQsMEJBQTBCLENBQ3hCLEdBQUc7b0JBQ0gsMkVBQTJFO29CQUMzRSxLQUFLLENBQUMsSUFBSSxJQUFJLE1BQU0sRUFDcEIsVUFBVSxJQUFJLENBQUMsT0FBTyxVQUFVLEVBQ2hDLE9BQU8sRUFDUCxDQUFDLENBQ0YsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO3dCQUNWLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3JDLElBQUksS0FBSyxLQUFLLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQzs0QkFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDOzRCQUMvQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQ2QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOzRCQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQzt3QkFDbkIsQ0FBQztvQkFDSCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTt3QkFDYixPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUM1QyxDQUFDLENBQUMsQ0FBQztnQkFFTCxDQUFDO2dCQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7b0JBQ2IsZ0VBQWdFO29CQUNoRSxPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixNQUFNLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUN2RSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNyQyx1RkFBdUY7b0JBQ3ZGLFNBQVM7Z0JBQ1gsQ0FBQztZQUNILENBQUM7WUFFRCx3RUFBd0U7WUFDeEUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHlDQUF5QztJQUN6QywyRUFBMkU7SUFDM0UsS0FBSyxDQUFDLCtCQUErQixDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFDNUQsV0FBVyxHQUFHLENBQUMsRUFDZixnQkFBZ0IsR0FBRyxHQUFHLEVBQ3RCLG1CQUFtQixHQUFHLElBQUksRUFDMUIsb0JBQW9CLEdBQUcsSUFBSSxFQUMzQixxQkFBcUIsR0FBRyxLQUFLLEVBQzlCLEdBQUcsRUFBRTtRQUNKLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFFckIsT0FBTyxPQUFPLEdBQUcsV0FBVyxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUMsQ0FBQztZQUNiLElBQUksQ0FBQztnQkFDSCx5REFBeUQ7Z0JBQ3pELElBQUksb0JBQW9CLEVBQUUsQ0FBQztvQkFDekIsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLEVBQUUscUJBQXFCLENBQUMsQ0FBQztvQkFDMUUsOENBQThDO29CQUM5QyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3hCLENBQUM7Z0JBRUQsa0VBQWtFO2dCQUNsRSxNQUFNLEdBQUcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUM7b0JBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUM7b0JBQzdELElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLEVBQUUsdUNBQXVDLG1CQUFtQixJQUFJLENBQUM7aUJBQ3pHLENBQUMsQ0FBQztnQkFFSCxVQUFVO2dCQUNWLE9BQU8sR0FBRyxDQUFDO1lBQ2IsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsU0FBUyxHQUFHLEdBQUcsQ0FBQztnQkFDaEIsT0FBTyxDQUFDLElBQUksQ0FBQywrQkFBK0IsT0FBTyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBRXBFLElBQUksT0FBTyxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUMzQixNQUFNLFNBQVMsQ0FBQztnQkFDbEIsQ0FBQztnQkFFRCwwQ0FBMEM7Z0JBQzFDLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDNUQsNkNBQTZDO2dCQUM3QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDL0MsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQztnQkFDbkMsdUJBQXVCO1lBQ3pCLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxTQUFTLElBQUksSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsaUVBQWlFO0lBQ2pFLGdHQUFnRztJQUNoRyx1RkFBdUY7SUFDdkYsaUJBQWlCLENBQUMsUUFBZ0IsRUFBRSxTQUFTLEdBQUcsS0FBSztRQUNuRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBRXJCLDREQUE0RDtRQUM1RCxNQUFNLGFBQWEsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzdCLElBQUksQ0FBQyxJQUFJO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ3hCLGdEQUFnRDtZQUNoRCxNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUM7UUFFRixxREFBcUQ7UUFDckQsSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3hGLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDbEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFELElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLDZCQUE2QixRQUFRLEVBQUUsQ0FBQzthQUN4RSxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsNEJBQTRCO1FBQzVCLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN4RixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNyQyxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUM1QixJQUFJLEdBQUc7d0JBQUUsR0FBRyxFQUFFLENBQUM7b0JBQ2YsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLDZCQUE2QixRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzdELENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFFZCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUM7Z0JBQ2YsSUFBSSxDQUFDO29CQUNILCtFQUErRTtvQkFDL0UsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQ3JELElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7NEJBQ3hCLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDcEIsSUFBSSxDQUFDO2dDQUFDLElBQUksT0FBTyxTQUFTLEtBQUssVUFBVTtvQ0FBRSxTQUFTLEVBQUUsQ0FBQztxQ0FBTSxJQUFJLFNBQVMsSUFBSSxPQUFPLFNBQVMsQ0FBQyxXQUFXLEtBQUssVUFBVTtvQ0FBRSxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7NEJBQUMsQ0FBQzs0QkFBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUEsVUFBVSxDQUFDLENBQUM7NEJBQzdLLE9BQU8sRUFBRSxDQUFDO3dCQUNaLENBQUM7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsZ0VBQWdFO29CQUNoRSxJQUFJLE9BQU8sU0FBUyxLQUFLLFVBQVU7d0JBQUUsR0FBRyxHQUFHLFNBQVMsQ0FBQzt5QkFDaEQsSUFBSSxTQUFTLElBQUksT0FBTyxTQUFTLENBQUMsV0FBVyxLQUFLLFVBQVU7d0JBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDekcsQ0FBQztnQkFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUNYLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDcEIsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUMsQ0FBQztnQkFDOUQsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELCtHQUErRztRQUMvRyxPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDM0MsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDO1lBQ3pCLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQzVCLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDeEIsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLDZCQUE2QixRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0QsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBRWQsTUFBTSxRQUFRLEdBQUcsS0FBSyxJQUFJLEVBQUU7Z0JBQzFCLElBQUksQ0FBQztvQkFDSCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7b0JBQ25CLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxLQUFLLFVBQVUsRUFBRSxDQUFDO3dCQUM1RCxPQUFPLEdBQUcsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUN6QyxDQUFDO3lCQUFNLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO3dCQUNoRSxnQ0FBZ0M7d0JBQ2hDLE9BQU8sR0FBRyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3RDLENBQUM7eUJBQU0sSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNyRSxtQ0FBbUM7d0JBQ25DLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7b0JBQ3BDLENBQUM7b0JBRUQsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzt3QkFDM0IsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNwQixhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ3hCLE9BQU8sRUFBRSxDQUFDO29CQUNaLENBQUM7Z0JBQ0gsQ0FBQztnQkFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUNYLGlDQUFpQztnQkFDbkMsQ0FBQztZQUNILENBQUMsQ0FBQztZQUVGLDBCQUEwQjtZQUMxQixNQUFNLFFBQVEsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLEtBQUssQ0FBQyxFQUFVO1FBQ2QsT0FBTyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsY0FBYyxDQUFDLEVBQVUsRUFBRSxPQUFlO1FBQ3hDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBR0QsS0FBSyxDQUFDLHFCQUFxQixDQUFDLE9BQU87UUFDakMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxVQUFVLE9BQU8sVUFBVSxDQUFDLENBQUM7WUFDcEUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3ZCLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBaUIsRUFBRSwwQkFBa0MsSUFBSTtRQUN6RSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQztZQUN4QyxPQUFPO1FBQ1QsQ0FBQztRQUNELGtEQUFrRDtRQUNsRCxJQUFJLGVBQWUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ25ELENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxLQUFLLHVCQUF1QixDQUN0RCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLGVBQWUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQy9DLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FDOUQsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsZUFBZSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQzFELFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUM3QixDQUFDO1FBQ0osQ0FBQztRQUNELCtCQUErQjtRQUMvQixJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3BCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztZQUNqQixPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNiLElBQUksQ0FBQztvQkFDSCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FDNUMsZUFBZSxDQUFDLFFBQVEsQ0FDekIsQ0FBQztvQkFDRixrREFBa0Q7b0JBQ2xELEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ2hCLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZixPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUMzQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUN2RCxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxlQUFlLENBQzFCLFlBQW9CLEVBQ3BCLElBQVU7UUFFVixNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxTQUFTLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2xELDRDQUE0QztZQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDakQsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hCLGlEQUFpRDtnQkFDakQsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDdEQsNENBQTRDO2dCQUM1QyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxZQUFvQixFQUFFLElBQVU7UUFDdEQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDaEMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNsQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7UUFDaEMsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUN0QyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQy9ELENBQUM7UUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkQsTUFBTSxRQUFRLEdBQWEsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FDaEMsU0FBUyxJQUFJLE1BQU0sSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUNsQyxVQUFVLENBQUMsRUFBRSxFQUNiLElBQUksRUFDSixZQUFZLEVBQ1osUUFBUSxFQUNSLElBQUksRUFDSixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUN4RSxDQUFDO1FBQ0YscUJBQXFCO1FBQ3JCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO1lBQ3BELEtBQUssRUFBRSxJQUFJO1lBQ1gsTUFBTSxFQUFFLElBQUk7U0FDYixDQUFDLENBQUM7UUFDSCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUMsTUFBTSxpQkFBaUIsQ0FDckIsTUFBTSxFQUNOLElBQUksRUFDSixVQUFVLElBQUksQ0FBQyxPQUFPLFNBQVMsRUFDL0IsY0FBYyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsSUFBSSxZQUFZLEVBQUUsQ0FDckQsQ0FBQztRQUNGLHFCQUFxQjtRQUNyQixNQUFNLElBQUksR0FBRztZQUNYLElBQUksRUFBRSxjQUFjLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFO1lBQzFDLE1BQU0sRUFBRSxVQUFVLElBQUksQ0FBQyxPQUFPLHFCQUFxQixJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsSUFBSSxZQUFZLE9BQU87WUFDOUYsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsVUFBVSxFQUFFLEtBQUs7WUFDakIsb0JBQW9CLEVBQUUsSUFBSTtTQUNuQixDQUFDO1FBQ1YsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4Qyw4QkFBOEI7UUFDOUIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxPQUFPO1FBQ0wsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNqQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBR0QsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFZO1FBQy9CLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5RCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyw2QkFBNkIsQ0FDbEUsSUFBSSxFQUNKLFlBQVksQ0FDYixDQUFDO1FBQ0YsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLENBQUM7UUFDRCxjQUFjO1FBQ2QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLDBCQUEwQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztJQUMxRSxDQUFDO3dHQTdtQlUsdUJBQXVCOzRHQUF2Qix1QkFBdUIsY0FGdEIsTUFBTTs7NEZBRVAsdUJBQXVCO2tCQUhuQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyByZW1vdmVOdWxsS2V5c0Zyb21PYmplY3QsIHdhaXQsIHdhaXRVbnRpbCB9IGZyb20gJy4uL2hlbHBlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgTGV2ZWxTdGF0dXMsXHJcbiAgTGF5ZXIsXHJcbiAgTm9kZSxcclxuICBab25lLFxyXG4gIE5hdmlnYXRpb24sXHJcbiAgUGxhbixcclxufSBmcm9tICcuLi90eXBlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGF5ZXJTZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvbGF5ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvbmF2aWdhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUGxhblNlcnZpY2UgfSBmcm9tICcuL21vZGVscy9wbGFuLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBab25lU2VydmljZSB9IGZyb20gJy4vbW9kZWxzL3pvbmUuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgdXBsb2FkSnNvblRvUzMsXHJcbiAgdXBsb2FkQmFzZTY0SW1hZ2UsXHJcbiAgdXBsb2FkQmFzZTY0SW1hZ2VXaXRoUmV0cnksXHJcbiAgbGlzdEZpbGVzSW5Gb2xkZXIsXHJcbn0gZnJvbSAnLi9zMy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZVVzZXJTZXJ2aWNlIH0gZnJvbSAnLi91c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBWaWV3ZXJTZXJ2aWNlIH0gZnJvbSAnLi92aWV3ZXIuc2VydmljZSc7XHJcblxyXG5kZWNsYXJlIGdsb2JhbCB7XHJcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XHJcbiAgICBNUF9TREs6IHsgY29ubmVjdDogRnVuY3Rpb24gfTtcclxuICB9XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXR0ZXJwb3J0SW1wb3J0U2VydmljZSB7XHJcbiAgcHJpdmF0ZSBjdXJyZW50RnJhbWU7XHJcblxyXG4gIHB1YmxpYyBzZGs6IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBzd2VlcHM6IE9iamVjdDtcclxuXHJcbiAgcHVibGljIGZsb29yczogT2JqZWN0O1xyXG5cclxuICBwcml2YXRlIGN1cnJlbnRGbG9vcjtcclxuXHJcbiAgcHJpdmF0ZSBfbW9kZWxJRDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIF9zcGFjZUlEOiBzdHJpbmc7XHJcblxyXG4gIHB1YmxpYyBnZXQgc3BhY2VJRCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NwYWNlSUQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHNwYWNlSUQodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fc3BhY2VJRCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBtb2RlbElEKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fbW9kZWxJRDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgbW9kZWxJRCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9tb2RlbElEID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RvcCA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgaW1wb3J0aW5nSW1hZ2VzOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuXHJcbiAgcHVibGljIHN3ZWVwUHJvY2Vzc2VkQ291bnQ6IFN1YmplY3Q8bnVtYmVyPiA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcclxuXHJcbiAgcHVibGljIHRvdGFsU3dlZXBzQ291bnQ6IFN1YmplY3Q8bnVtYmVyPiA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBuYXZpZ2F0aW9uU2VydmljZTogTmF2aWdhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHpvbmVTZXJ2aWNlOiBab25lU2VydmljZSxcclxuICAgIHByaXZhdGUgdmlld2VyU2VydmljZTogVmlld2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgbGF5ZXJTZXJ2aWNlOiBMYXllclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBsYW5TZXJ2aWNlOiBQbGFuU2VydmljZVxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaW5pdFNka0Zvck1vZGVsKG1vZGVsSUQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgdGhpcy5zdG9wID0gZmFsc2U7XHJcblxyXG4gICAgLy8gTG9hZCBTREtcclxuICAgIGNvbnNvbGUubG9nKCdMb2FkaW5nIE1hdHRlcnBvcnQgU0RLJyk7XHJcbiAgICB0aGlzLm1vZGVsSUQgPSBtb2RlbElEO1xyXG4gICAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XHJcbiAgICBpZiAoIWlmcmFtZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgaWZyYW1lJyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnZpZXdlclNlcnZpY2Uuc2V0VG91clVybCh7IG1vZGVsM2Q6IG1vZGVsSUQgfSk7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLnZpZXdlclNlcnZpY2UuZ2V0VG91clVybCgpO1xyXG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnc3JjJywgdXJsKTtcclxuICAgIGlmcmFtZS5hbGxvdyA9ICd4ci1zcGF0aWFsLXRyYWNraW5nJztcclxuICAgIGlmcmFtZS5oZWlnaHQgPSAnMTAwJSc7XHJcbiAgICBpZnJhbWUud2lkdGggPSAnMTAwJSc7XHJcbiAgICBpZnJhbWUuaWQgPSAndmlld2VyLW1vZHVsZSc7XHJcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3ZpZXdlci1mcmFtZScpO1xyXG4gICAgZWxlbWVudC5hcHBlbmQoaWZyYW1lKTtcclxuICAgIHRoaXMuY3VycmVudEZyYW1lID0gaWZyYW1lO1xyXG4gICAgY29uc3Qgc2hvd2Nhc2VXaW5kb3cgPSBpZnJhbWUuY29udGVudFdpbmRvdztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcclxuICAgICAgaWZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgICAgJ2xvYWQnLFxyXG4gICAgICAgIGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2RrID0gYXdhaXQgc2hvd2Nhc2VXaW5kb3cuTVBfU0RLLmNvbm5lY3QoXHJcbiAgICAgICAgICAgICAgaWZyYW1lLFxyXG4gICAgICAgICAgICAgICdxbjl3c2FzdXk1aDJmenJicm4xbnpyMGlkJyxcclxuICAgICAgICAgICAgICAnJ1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gRmxvb3IgZGF0YVxyXG4gICAgICAgICAgICB0aGlzLnNkay5GbG9vci5kYXRhLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogZnVuY3Rpb24gdXBkKGNvbGxlY3Rpb246IGFueSkge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGbG9vcnNcIiwgY29sbGVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZsb29ycyA9IGNvbGxlY3Rpb247XHJcbiAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gU3Vic2NyaWJlIHRvIGN1cnJlbnQgRmxvb3JcclxuICAgICAgICAgICAgdGhpcy5zZGsuRmxvb3IuY3VycmVudC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgZnVuY3Rpb24gdXBkKGN1cnJlbnRGbG9vcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rmxvb3IgPSBjdXJyZW50Rmxvb3I7XHJcbiAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gU3dlZXAgZGF0YVxyXG4gICAgICAgICAgICB0aGlzLnNkay5Td2VlcC5kYXRhLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogZnVuY3Rpb24gdXBkKGNvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGUgZW50aXJlIHVwLXRvLWRhdGUgY29sbGVjdGlvbicsIGNvbGxlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zd2VlcHMgPSBjb2xsZWN0aW9uO1xyXG4gICAgICAgICAgICAgIH0uYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIHJlbW92ZSBsYWJlbHNcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZGsuU2V0dGluZ3MudXBkYXRlKCdsYWJlbHMnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGxldCB0aW1lb3V0RXhwaXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvLyBzdGFydCB0aW1lb3V0XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gKHRpbWVvdXRFeHBpcmVkID0gdHJ1ZSksIDcwMDApO1xyXG4gICAgICAgICAgICBhd2FpdCB3YWl0VW50aWwoXHJcbiAgICAgICAgICAgICAgKCkgPT5cclxuICAgICAgICAgICAgICAgICh0aGlzLnN3ZWVwcyAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZmxvb3JzICE9PSB1bmRlZmluZWQpIHx8XHJcbiAgICAgICAgICAgICAgICB0aW1lb3V0RXhwaXJlZCA9PT0gdHJ1ZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAodGltZW91dEV4cGlyZWQpIHtcclxuICAgICAgICAgICAgICAvLyB3ZSBhcmUgbGlrZWx5IGluIG1hdHRlcnBvcnQgZXJyb3IgY2FzZSAodGhhdCB3ZSBjYW5ub3QgY2F0Y2ghKVxyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aW1lb3V0IGludGl0aWFsaXNpbmcgTWF0dGVycG9ydCcpO1xyXG4gICAgICAgICAgICAgIHJldHVybiByZWoobmV3IEVycm9yKCdlcnJvciBpbml0IE1hdHRlcnBvcnQnKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ2luaXQgZG9uZScpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzKHRydWUpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgICByZWoobmV3IEVycm9yKCdlcnJvciBpbml0IE1hdHRlcnBvcnQnKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGltcG9ydERhdGEoXHJcbiAgICBzcGFjZUlEOiBzdHJpbmcsXHJcbiAgICBzdXJmYWNlOiBudW1iZXIsXHJcbiAgICByZWxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgIG5vZGU6IE5vZGUgPSBudWxsLFxyXG4gICAgb3ZlcnJpZGVFeGlzdGluZyA9IHRydWVcclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghdGhpcy5zd2VlcHMpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignbm8gc3dlZXBzIGluaXRpYWxpemVkJykpO1xyXG4gICAgfVxyXG4gICAgbGV0IGFwcElzTG9hZGVkID0gZmFsc2U7XHJcblxyXG5cclxuICAgIHRoaXMuc2RrLkFwcC5zdGF0ZS5zdWJzY3JpYmUoZnVuY3Rpb24gKGFwcFN0YXRlKSB7XHJcbiAgICAgIC8vIGFwcCBzdGF0ZSBoYXMgY2hhbmdlZFxyXG4gICAgICBjb25zb2xlLmxvZygnVGhlIGN1cnJlbnQgcGhhc2U6ICcsIGFwcFN0YXRlLnBoYXNlKTtcclxuICAgICAgaWYgKGFwcFN0YXRlLnBoYXNlID09PSAnYXBwcGhhc2UucGxheWluZycpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnVGhlIGFwcCBpcyBwbGF5aW5nJyk7XHJcbiAgICAgICAgYXBwSXNMb2FkZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBhd2FpdCB3YWl0VW50aWwoKCkgPT4gYXBwSXNMb2FkZWQgPT09IHRydWUpO1xyXG5cclxuICAgIGlmIChyZWxvYWRpbmcpIHtcclxuICAgICAgLy8gcGVyZm9ybSBvbmx5IDM2MCBpbXBvcnQgc2luY2Ugd2UgYXJlIHJlbG9hZGluZ1xyXG4gICAgICBhd2FpdCB0aGlzLmltcG9ydDM2MGltYWdlcyhvdmVycmlkZUV4aXN0aW5nKTtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNwYWNlSUQgPSBzcGFjZUlEO1xyXG4gICAgbGV0IGZsb29yWm9uZXM6IFpvbmVbXSA9IFtdO1xyXG4gICAgY29uc3Qgem9uZXMgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmVzQnlTcGFjZShzcGFjZUlEKTtcclxuICAgIGNvbnN0IG1haW5ab25lID0gem9uZXMuZmluZCgoeikgPT4gIXoucGFyZW50SUQpO1xyXG4gICAgaWYgKCFtYWluWm9uZSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdtaXNzaW5nIGRhdGEgKG5vIG1haW4gQnVpbGRpbmcgWm9uZSknKSk7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZygnaW1wb3J0aW5nIGRhdGEgZnJvbSBtYXR0ZXJwb3J0Jyk7XHJcbiAgICAvLyBzYXZlIHN3ZWVwcyBkYXRhIGFzIGpzb25cclxuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShPYmplY3QudmFsdWVzKHRoaXMuc3dlZXBzKSk7XHJcbiAgICBhd2FpdCB1cGxvYWRKc29uVG9TMyhcclxuICAgICAgYHZpc2l0cy8ke3RoaXMubW9kZWxJRH0vaW52ZW50b3J5L2AsXHJcbiAgICAgIGpzb24sXHJcbiAgICAgICdkYXRhLmpzb24nXHJcbiAgICApO1xyXG4gICAgLy8gY2hlY2sgbGF5ZXIgb2YgYnVpbGRpbmcgdHlwZVxyXG4gICAgY29uc3QgbGF5ZXJCdWlsZGluZyA9IGF3YWl0IHRoaXMuZ2V0TGF5ZXJCeU5hbWUoJ0JVSUxESU5HJyk7XHJcbiAgICBjb25zdCBjcmVhdGVkRGVmYXVsdFpvbmUgPSBhd2FpdCB0aGlzLmNyZWF0ZVpvbmUoXHJcbiAgICAgIG5vZGUubWV0YWRhdGEsXHJcbiAgICAgIGxheWVyQnVpbGRpbmcuaWQsXHJcbiAgICAgIHN1cmZhY2UsXHJcbiAgICAgIG1haW5ab25lLmlkLFxyXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnN3ZWVwcyksXHJcbiAgICAgIG5vZGVcclxuICAgICk7XHJcbiAgICBpZiAoIWNyZWF0ZWREZWZhdWx0Wm9uZSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZsb29ycykge1xyXG4gICAgICBmbG9vclpvbmVzID0gYXdhaXQgdGhpcy5pbXBvcnRGbG9vckRhdGEoY3JlYXRlZERlZmF1bHRab25lLmlkLCBub2RlKTtcclxuICAgIH1cclxuICAgIC8vIGNvbnNvbGUubG9nKGZsb29yWm9uZXMpO1xyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3dlZXBzKS5tYXAoYXN5bmMgKGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHN3ZWVwSW5mbyA9IHRoaXMuc3dlZXBzW2tleV07XHJcbiAgICAgICAgY29uc3QgbmF2aWdhdGlvbklucHV0ID0ge1xyXG4gICAgICAgICAgbWF0dGVycG9ydFN3ZWVwSUQ6IHN3ZWVwSW5mby51dWlkLFxyXG4gICAgICAgICAgcG9zaXRpb246IEpTT04uc3RyaW5naWZ5KHN3ZWVwSW5mby5wb3NpdGlvbiksXHJcbiAgICAgICAgICByb3RhdGlvbjogSlNPTi5zdHJpbmdpZnkoc3dlZXBJbmZvLnJvdGF0aW9uKSxcclxuICAgICAgICAgIGxldmVsOiBMZXZlbFN0YXR1cy5MT1csXHJcbiAgICAgICAgICBub2RlSUQ6IG5vZGUuaWQsXHJcbiAgICAgICAgICBzcGFjZUlELFxyXG4gICAgICAgIH0gYXMgTmF2aWdhdGlvbjtcclxuICAgICAgICBjb25zdCBuYXYgPSBhd2FpdCB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmNyZWF0ZU5hdmlnYXRpb24oXHJcbiAgICAgICAgICBuYXZpZ2F0aW9uSW5wdXRcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmICghbmF2KSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnY291bGQgY3JlYXRlIG5hdmlnYXRpb24nLCBuYXZpZ2F0aW9uSW5wdXQuaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICBhd2FpdCB0aGlzLmltcG9ydDM2MGltYWdlcyhvdmVycmlkZUV4aXN0aW5nKTtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjcmVhdGVab25lKFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgbGF5ZXJJRDogc3RyaW5nLFxyXG4gICAgc3VyZmFjZTogbnVtYmVyID0gbnVsbCxcclxuICAgIHBhcmVudElEOiBzdHJpbmcgPSBudWxsLFxyXG4gICAgc3dlZXBzOiBzdHJpbmdbXSA9IFtdLFxyXG4gICAgbm9kZTogTm9kZSA9IG51bGwsXHJcbiAgICBtZXRhZGF0YTogc3RyaW5nID0gbnVsbFxyXG4gICk6IFByb21pc2U8Wm9uZT4ge1xyXG4gICAgY29uc3Qgem9uZUlucHV0ID0ge1xyXG4gICAgICBuYW1lLFxyXG4gICAgICBzcGFjZUlEOiB0aGlzLnNwYWNlSUQsXHJcbiAgICAgIGxheWVySUQsXHJcbiAgICAgIHN3ZWVwSURzOiBzd2VlcHMsXHJcbiAgICAgIG5vZGVJRHM6IG5vZGUgPyBbbm9kZS5pZF0gOiBudWxsLFxyXG4gICAgfSBhcyBab25lO1xyXG4gICAgcmVtb3ZlTnVsbEtleXNGcm9tT2JqZWN0KHpvbmVJbnB1dCk7XHJcbiAgICBpZiAoc3VyZmFjZSkge1xyXG4gICAgICB6b25lSW5wdXQuc3VyZmFjZSA9IHN1cmZhY2U7XHJcbiAgICB9XHJcbiAgICBpZiAocGFyZW50SUQpIHtcclxuICAgICAgem9uZUlucHV0LnBhcmVudElEID0gcGFyZW50SUQ7XHJcbiAgICB9XHJcbiAgICBpZiAobWV0YWRhdGEpIHtcclxuICAgICAgem9uZUlucHV0Lm1ldGFkYXRhID0gbWV0YWRhdGE7XHJcbiAgICB9XHJcbiAgICBjb25zdCBuZXdMb2NhbCA9IGF3YWl0IHRoaXMuem9uZVNlcnZpY2UuY3JlYXRlKHpvbmVJbnB1dCk7XHJcbiAgICByZXR1cm4gbmV3TG9jYWw7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0gTWFpbiBpbXBvcnQgZnVuY3Rpb24gKGNvbXBsZXRlKSAtLS1cclxuICBhc3luYyBpbXBvcnQzNjBpbWFnZXMob3ZlcnJpZGVFeGlzdGluZyA9IHRydWUpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnNvbGUubG9nKCdJbXBvcnRpbmcgMzYwIGltYWdlcycpO1xyXG4gICAgdGhpcy5pbXBvcnRpbmdJbWFnZXMubmV4dCh0cnVlKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcclxuICAgICAgY29uc3Qgc2NhbnMgPSBPYmplY3QudmFsdWVzKHRoaXMuc3dlZXBzKTtcclxuICAgICAgY29uc3Qgbm1iU2NhbnMgPSBzY2Fucy5sZW5ndGg7XHJcblxyXG4gICAgICB0aGlzLnRvdGFsU3dlZXBzQ291bnQubmV4dChubWJTY2Fucyk7XHJcblxyXG4gICAgICBjb25zdCBzdGFydCA9IG92ZXJyaWRlRXhpc3RpbmcgPyAwIDogYXdhaXQgdGhpcy5nZXRVcGxvYWRlZEltYWdlQ291bnQodGhpcy5tb2RlbElEKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gc3RhcnQ7IGluZGV4IDwgbm1iU2NhbnM7IGluZGV4ICs9IDEpIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc3RvcCkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0FiYW5kb25pbmcgaW1wb3J0IGJlY2F1c2UgaXQgd2FzIGNhbmNlbGxlZCcpO1xyXG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZUZyYW1lKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHN3ZWVwID0gc2NhbnNbaW5kZXhdO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdNb3ZpbmcgdG8gc3dlZXA6Jywgc3dlZXApO1xyXG5cclxuICAgICAgICAvLyBQcmVmZXIgbGVnYWN5IC5pZCBmaXJzdCwgdGhlbiB1dWlkLCB0aGVuIHNpZCBhcyBsYXN0IHJlc29ydFxyXG4gICAgICAgIGNvbnN0IG1vdmVJZCA9IHN3ZWVwLmlkIHx8IHN3ZWVwLnV1aWQgfHwgc3dlZXAuc2lkO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgLy8gTW92ZSB0byBzd2VlcCAodXNlIHRoZSBiZXN0IGF2YWlsYWJsZSBpZClcclxuICAgICAgICAgIGF3YWl0IHRoaXMuc2RrLlN3ZWVwLm1vdmVUbyhtb3ZlSWQsIHtcclxuICAgICAgICAgICAgcm90YXRpb246IHsgeDogMCwgeTogMCB9LFxyXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiB0aGlzLnNkay5DYW1lcmEgJiYgdGhpcy5zZGsuQ2FtZXJhLlRyYW5zaXRpb25UeXBlXHJcbiAgICAgICAgICAgICAgPyB0aGlzLnNkay5DYW1lcmEuVHJhbnNpdGlvblR5cGUuSU5TVEFOVFxyXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB0cmFuc2l0aW9uVGltZTogMCxcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIC8vIENhcHR1cmUgd2l0aCBhdXRvbWF0aWMgcmV0cnkgKGVuc3VyZXMgcmVuZGVyZXIgcmVhZGluZXNzIGVhY2ggYXR0ZW1wdClcclxuICAgICAgICAgIGNvbnN0IGltZyA9IGF3YWl0IHRoaXMuY2FwdHVyZUVxdWlyZWN0YW5ndWxhcldpdGhSZXRyeShcclxuICAgICAgICAgICAgeyB3aWR0aDogMjA0OCwgaGVpZ2h0OiAxMDI0IH0sXHJcbiAgICAgICAgICAgIHsgbWF0dGVydGFnczogZmFsc2UsIHN3ZWVwczogdHJ1ZSB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgbWF4QXR0ZW1wdHM6IDMsXHJcbiAgICAgICAgICAgICAgaW5pdGlhbEJhY2tvZmZNczogNTAwLFxyXG4gICAgICAgICAgICAgIHBlckF0dGVtcHRUaW1lb3V0TXM6IDgwMDAsXHJcbiAgICAgICAgICAgICAgc3dlZXBJZEZvclJlYWR5Q2hlY2s6IG1vdmVJZCxcclxuICAgICAgICAgICAgICB3YWl0Rm9yU3dlZXBUaW1lb3V0TXM6IDEyMDAwXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgLy8gVXBsb2FkIGFzeW5jaHJvbm91c2x5IChkbyBub3QgYXdhaXQgdG8ga2VlcCB0aHJvdWdocHV0KVxyXG4gICAgICAgICAgdXBsb2FkQmFzZTY0SW1hZ2VXaXRoUmV0cnkoXHJcbiAgICAgICAgICAgIGltZyxcclxuICAgICAgICAgICAgLy8gcHJlZmVyIHVzaW5nIHV1aWQgZm9yIHN0b3JhZ2UgbmFtZSBpZiBhdmFpbGFibGUsIGVsc2UgZmFsbGJhY2sgdG8gbW92ZUlkXHJcbiAgICAgICAgICAgIHN3ZWVwLnV1aWQgfHwgbW92ZUlkLFxyXG4gICAgICAgICAgICBgdmlzaXRzLyR7dGhpcy5tb2RlbElEfS9zd2VlcHMvYCxcclxuICAgICAgICAgICAgJ3N3ZWVwJyxcclxuICAgICAgICAgICAgNVxyXG4gICAgICAgICAgKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zd2VlcFByb2Nlc3NlZENvdW50Lm5leHQoaW5kZXgpO1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IG5tYlNjYW5zIC0gMSkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdJbXBvcnQgMzYwIGRvbmUnKTtcclxuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlRnJhbWUoKTtcclxuICAgICAgICAgICAgICB0aGlzLnN0b3AgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIHVwbG9hZGluZyBzY2FuIDogXCIsIGUpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgLy8gY2FwdHVyZSBmYWlsZWQgYWZ0ZXIgcmV0cmllcyDigJQgbG9nIGFuZCBjb250aW51ZSB0byBuZXh0IHN3ZWVwXHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY2FwdHVyZSBzd2VlcCAke21vdmVJZH0gYWZ0ZXIgcmV0cmllczpgLCBlcnIpO1xyXG4gICAgICAgICAgdGhpcy5zd2VlcFByb2Nlc3NlZENvdW50Lm5leHQoaW5kZXgpO1xyXG4gICAgICAgICAgLy8gY29udGludWUgdG8gbmV4dCBzd2VlcCAoY2hhbmdlIHRvIGB0aHJvdyBlcnJgIGlmIHlvdSB3YW50IHRvIGFib3J0IG9uIGZpcnN0IGZhaWx1cmUpXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIElmIGxvb3AgZmluaXNoZXMgd2l0aG91dCBoaXR0aW5nIHRoZSBmaW5hbCByZXNvbHZlIGluIHVwbG9hZCBwcm9taXNlOlxyXG4gICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICB0aGlzLnJlbW92ZUZyYW1lKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIC0tLSBjYXB0dXJlIHdpdGggcmV0cnkgYW5kIGJhY2tvZmYgLS0tXHJcbiAgLy8gb3B0aW9uczogcmVuZGVyZXIgc2l6ZTsgcmVuZGVyT3B0aW9uczogcmVuZGVyZXIgZmxhZ3M7IGNmZzogcmV0cnkgY29uZmlnXHJcbiAgYXN5bmMgY2FwdHVyZUVxdWlyZWN0YW5ndWxhcldpdGhSZXRyeShvcHRpb25zLCByZW5kZXJPcHRpb25zLCB7XHJcbiAgICBtYXhBdHRlbXB0cyA9IDMsXHJcbiAgICBpbml0aWFsQmFja29mZk1zID0gNTAwLFxyXG4gICAgcGVyQXR0ZW1wdFRpbWVvdXRNcyA9IDgwMDAsXHJcbiAgICBzd2VlcElkRm9yUmVhZHlDaGVjayA9IG51bGwsXHJcbiAgICB3YWl0Rm9yU3dlZXBUaW1lb3V0TXMgPSAxMjAwMFxyXG4gIH0gPSB7fSkge1xyXG4gICAgbGV0IGF0dGVtcHQgPSAwO1xyXG4gICAgbGV0IGxhc3RFcnJvciA9IG51bGw7XHJcblxyXG4gICAgd2hpbGUgKGF0dGVtcHQgPCBtYXhBdHRlbXB0cykge1xyXG4gICAgICBhdHRlbXB0ICs9IDE7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gRW5zdXJlIHN3ZWVwIGlzIHJlYWR5IGJlZm9yZSBlYWNoIGF0dGVtcHQgaWYgcmVxdWVzdGVkXHJcbiAgICAgICAgaWYgKHN3ZWVwSWRGb3JSZWFkeUNoZWNrKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JTd2VlcFJlYWR5KHN3ZWVwSWRGb3JSZWFkeUNoZWNrLCB3YWl0Rm9yU3dlZXBUaW1lb3V0TXMpO1xyXG4gICAgICAgICAgLy8gc21hbGwgc2FmZXR5IGRlbGF5IHRvIGxldCByZW5kZXJlciBmaW5hbGl6ZVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zbGVlcCgxMjApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUmFjZSB0aGUgdGFrZUVxdWlyZWN0YW5ndWxhciBjYWxsIGFnYWluc3QgYSBwZXItYXR0ZW1wdCB0aW1lb3V0XHJcbiAgICAgICAgY29uc3QgaW1nID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcclxuICAgICAgICAgIHRoaXMuc2RrLlJlbmRlcmVyLnRha2VFcXVpcmVjdGFuZ3VsYXIob3B0aW9ucywgcmVuZGVyT3B0aW9ucyksXHJcbiAgICAgICAgICB0aGlzLnRpbWVvdXRQcm9taXNlKHBlckF0dGVtcHRUaW1lb3V0TXMsIGB0YWtlRXF1aXJlY3Rhbmd1bGFyIHRpbWVkIG91dCBhZnRlciAke3BlckF0dGVtcHRUaW1lb3V0TXN9bXNgKVxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICAvLyBzdWNjZXNzXHJcbiAgICAgICAgcmV0dXJuIGltZztcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgbGFzdEVycm9yID0gZXJyO1xyXG4gICAgICAgIGNvbnNvbGUud2FybihgdGFrZUVxdWlyZWN0YW5ndWxhciBhdHRlbXB0ICR7YXR0ZW1wdH0gZmFpbGVkOmAsIGVycik7XHJcblxyXG4gICAgICAgIGlmIChhdHRlbXB0ID49IG1heEF0dGVtcHRzKSB7XHJcbiAgICAgICAgICB0aHJvdyBsYXN0RXJyb3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBleHBvbmVudGlhbCBiYWNrb2ZmIGJlZm9yZSBuZXh0IGF0dGVtcHRcclxuICAgICAgICBjb25zdCBiYWNrb2ZmID0gaW5pdGlhbEJhY2tvZmZNcyAqIE1hdGgucG93KDIsIGF0dGVtcHQgLSAxKTtcclxuICAgICAgICAvLyBhZGQgc21hbGwgaml0dGVyIHRvIHJlZHVjZSB0aHVuZGVyaW5nIGhlcmRcclxuICAgICAgICBjb25zdCBqaXR0ZXIgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDApO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2xlZXAoYmFja29mZiArIGppdHRlcik7XHJcbiAgICAgICAgLy8gbG9vcCB0byBuZXh0IGF0dGVtcHRcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRocm93IGxhc3RFcnJvciB8fCBuZXcgRXJyb3IoJ2NhcHR1cmVFcXVpcmVjdGFuZ3VsYXJXaXRoUmV0cnkgZmFpbGVkIHdpdGhvdXQgZXJyb3InKTtcclxuICB9XHJcblxyXG4gIC8vIC0tLSBXYWl0IHVudGlsIHRoZSBTREsgcmVwb3J0cyB0aGUgdGFyZ2V0IHN3ZWVwIGFzIGN1cnJlbnQgLS0tXHJcbiAgLy8gVHJpZXM6IHNkay5Td2VlcC5jdXJyZW50LndhaXRVbnRpbCAtPiBzZGsuU3dlZXAuY3VycmVudC5zdWJzY3JpYmUgLT4gcG9sbGluZyBnZXRDdXJyZW50L3ZhbHVlXHJcbiAgLy8gVGhpcyBmdW5jdGlvbiBtYXRjaGVzIHRhcmdldElkIGFnYWluc3QgbXVsdGlwbGUgZmllbGRzIGFuZCBwcmlvcml0aXplcyAuaWQgbWF0Y2hpbmcuXHJcbiAgd2FpdEZvclN3ZWVwUmVhZHkodGFyZ2V0SWQ6IHN0cmluZywgdGltZW91dE1zID0gMTAwMDApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNkayA9IHRoaXMuc2RrO1xyXG5cclxuICAgIC8vIGhlbHBlciB0byBtYXRjaCBtdWx0aXBsZSBpZCBmaWVsZHMsIHByaW9yaXRpemluZyBpZCBmaXJzdFxyXG4gICAgY29uc3QgbWF0Y2hlc1RhcmdldCA9IChkYXRhKSA9PiB7XHJcbiAgICAgIGlmICghZGF0YSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAvLyBjaGVjayAuaWQgZmlyc3QgKGxlZ2FjeSksIHRoZW4gdXVpZCwgc2lkLCB1aWRcclxuICAgICAgY29uc3QgZmllbGRzID0gW2RhdGEuaWQsIGRhdGEudXVpZCwgZGF0YS5zaWQsIGRhdGEudWlkXTtcclxuICAgICAgcmV0dXJuIGZpZWxkcy5zb21lKGYgPT4gISFmICYmIFN0cmluZyhmKSA9PT0gU3RyaW5nKHRhcmdldElkKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIDEpIHByZWZlciB3YWl0VW50aWwgaWYgYXZhaWxhYmxlIG9uIHRoZSBvYnNlcnZhYmxlXHJcbiAgICBpZiAoc2RrLlN3ZWVwICYmIHNkay5Td2VlcC5jdXJyZW50ICYmIHR5cGVvZiBzZGsuU3dlZXAuY3VycmVudC53YWl0VW50aWwgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmFjZShbXHJcbiAgICAgICAgc2RrLlN3ZWVwLmN1cnJlbnQud2FpdFVudGlsKChkYXRhKSA9PiBtYXRjaGVzVGFyZ2V0KGRhdGEpKSxcclxuICAgICAgICB0aGlzLnRpbWVvdXRQcm9taXNlKHRpbWVvdXRNcywgYFRpbWVvdXQgd2FpdGluZyBmb3Igc3dlZXAgJHt0YXJnZXRJZH1gKVxyXG4gICAgICBdKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAyKSBzdWJzY3JpYmUgaWYgYXZhaWxhYmxlXHJcbiAgICBpZiAoc2RrLlN3ZWVwICYmIHNkay5Td2VlcC5jdXJyZW50ICYmIHR5cGVvZiBzZGsuU3dlZXAuY3VycmVudC5zdWJzY3JpYmUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKG9mZikgb2ZmKCk7XHJcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBUaW1lb3V0IHdhaXRpbmcgZm9yIHN3ZWVwICR7dGFyZ2V0SWR9YCkpO1xyXG4gICAgICAgIH0sIHRpbWVvdXRNcyk7XHJcblxyXG4gICAgICAgIGxldCBvZmYgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAvLyBzdWJzY3JpYmUgbWF5IHJldHVybiBhbiB1bnN1YnNjcmliZSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgd2l0aCB1bnN1YnNjcmliZSgpXHJcbiAgICAgICAgICBjb25zdCBzdWJSZXN1bHQgPSBzZGsuU3dlZXAuY3VycmVudC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgaWYgKG1hdGNoZXNUYXJnZXQoZGF0YSkpIHtcclxuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xyXG4gICAgICAgICAgICAgIHRyeSB7IGlmICh0eXBlb2Ygc3ViUmVzdWx0ID09PSAnZnVuY3Rpb24nKSBzdWJSZXN1bHQoKTsgZWxzZSBpZiAoc3ViUmVzdWx0ICYmIHR5cGVvZiBzdWJSZXN1bHQudW5zdWJzY3JpYmUgPT09ICdmdW5jdGlvbicpIHN1YlJlc3VsdC51bnN1YnNjcmliZSgpOyB9IGNhdGNoIChlKSB7LyppZ25vcmUqLyB9XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIC8vIGlmIHN1YnNjcmliZSByZXR1cm5lZCBhbiB1bnN1YnNjcmliZSBmdW5jdGlvbiwga2VlcCBpdCBhcyBvZmZcclxuICAgICAgICAgIGlmICh0eXBlb2Ygc3ViUmVzdWx0ID09PSAnZnVuY3Rpb24nKSBvZmYgPSBzdWJSZXN1bHQ7XHJcbiAgICAgICAgICBlbHNlIGlmIChzdWJSZXN1bHQgJiYgdHlwZW9mIHN1YlJlc3VsdC51bnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJykgb2ZmID0gKCkgPT4gc3ViUmVzdWx0LnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcclxuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ3Nkay5Td2VlcC5jdXJyZW50LnN1YnNjcmliZSBub3QgdXNhYmxlJykpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMykgcG9sbGluZyBmYWxsYmFjazogdHJ5IGdldEN1cnJlbnQoKSwgc2RrLlN3ZWVwLmN1cnJlbnQoKSBmdW5jdGlvbiwgb3IgLnZhbHVlLCBlbHNlIHBvbGwgcmVuZGVyZXIgcmVhZGluZXNzXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBwb2xsSW50ZXJ2YWwgPSAyMDA7XHJcbiAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVGltZW91dCB3YWl0aW5nIGZvciBzd2VlcCAke3RhcmdldElkfWApKTtcclxuICAgICAgfSwgdGltZW91dE1zKTtcclxuXHJcbiAgICAgIGNvbnN0IGNoZWNrTm93ID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBsZXQgY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICBpZiAoc2RrLlN3ZWVwICYmIHR5cGVvZiBzZGsuU3dlZXAuZ2V0Q3VycmVudCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBjdXJyZW50ID0gYXdhaXQgc2RrLlN3ZWVwLmdldEN1cnJlbnQoKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoc2RrLlN3ZWVwICYmIHR5cGVvZiBzZGsuU3dlZXAuY3VycmVudCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAvLyBzb21lIGJ1aWxkcyBleHBvc2UgYSBmdW5jdGlvblxyXG4gICAgICAgICAgICBjdXJyZW50ID0gYXdhaXQgc2RrLlN3ZWVwLmN1cnJlbnQoKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoc2RrLlN3ZWVwICYmIHNkay5Td2VlcC5jdXJyZW50ICYmIHNkay5Td2VlcC5jdXJyZW50LnZhbHVlKSB7XHJcbiAgICAgICAgICAgIC8vIHNvbWUgb2JzZXJ2YWJsZXMgZXhwb3NlIGEgLnZhbHVlXHJcbiAgICAgICAgICAgIGN1cnJlbnQgPSBzZGsuU3dlZXAuY3VycmVudC52YWx1ZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAobWF0Y2hlc1RhcmdldChjdXJyZW50KSkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xyXG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcclxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIC8vIGlnbm9yZSBhbmQgcmV0cnkgdW50aWwgdGltZW91dFxyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIGluaXRpYWwgaW1tZWRpYXRlIGNoZWNrXHJcbiAgICAgIGF3YWl0IGNoZWNrTm93KCk7XHJcbiAgICAgIGNvbnN0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoY2hlY2tOb3csIHBvbGxJbnRlcnZhbCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIC0tLSBzbWFsbCBoZWxwZXJzIC0tLVxyXG4gIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXMgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7XHJcbiAgfVxyXG5cclxuICB0aW1lb3V0UHJvbWlzZShtczogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPG5ldmVyPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4gc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKG1lc3NhZ2UpKSwgbXMpKTtcclxuICB9XHJcblxyXG5cclxuICBhc3luYyBnZXRVcGxvYWRlZEltYWdlQ291bnQobW9kZWxJRCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgaW1hZ2VzID0gYXdhaXQgbGlzdEZpbGVzSW5Gb2xkZXIoYHZpc2l0cy8ke21vZGVsSUR9L3N3ZWVwcy9gKTtcclxuICAgICAgcmV0dXJuIGltYWdlcy5sZW5ndGg7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgbW92ZVRvRmxvb3IoZmxvb3JOYW1lOiBzdHJpbmcsIG1hdHRlcnBvcnRGbG9vclNlcXVlbmNlOiBudW1iZXIgPSBudWxsKSB7XHJcbiAgICBpZiAoIXRoaXMuZmxvb3JzKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdGbG9vciBhcmUgbm90IGxvYWRlZCB5ZXQnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gbG9vayB1cCBmb3Igc2VxdWVuY2UgbnVtYmVyICh0aGUgc2FmZXN0IG1ldGhvZClcclxuICAgIGxldCBmbG9vck1hdHRlcnBvcnQgPSBPYmplY3QudmFsdWVzKHRoaXMuZmxvb3JzKS5maW5kKFxyXG4gICAgICAoZmxvb3IpID0+IGZsb29yLnNlcXVlbmNlID09PSBtYXR0ZXJwb3J0Rmxvb3JTZXF1ZW5jZVxyXG4gICAgKTtcclxuICAgIGlmICghZmxvb3JNYXR0ZXJwb3J0KSB7XHJcbiAgICAgIGZsb29yTWF0dGVycG9ydCA9IE9iamVjdC52YWx1ZXModGhpcy5mbG9vcnMpLmZpbmQoXHJcbiAgICAgICAgKGZsb29yKSA9PiBmbG9vck5hbWUuaW5jbHVkZXMoZmxvb3IubmFtZSkgJiYgZmxvb3IubmFtZSAhPSAnJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKCFmbG9vck1hdHRlcnBvcnQpIHtcclxuICAgICAgZmxvb3JNYXR0ZXJwb3J0ID0gT2JqZWN0LnZhbHVlcyh0aGlzLmZsb29ycykuZmluZCgoZmxvb3IpID0+XHJcbiAgICAgICAgZmxvb3JOYW1lLmluY2x1ZGVzKGZsb29yLmlkKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgLy8gY29uc29sZS5sb2coZmxvb3JNYXR0ZXJwb3J0KVxyXG4gICAgaWYgKGZsb29yTWF0dGVycG9ydCkge1xyXG4gICAgICBsZXQgcmV0cnkgPSB0cnVlO1xyXG4gICAgICB3aGlsZSAocmV0cnkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgZmxvb3JJbmRleCA9IGF3YWl0IHRoaXMuc2RrLkZsb29yLm1vdmVUbyhcclxuICAgICAgICAgICAgZmxvb3JNYXR0ZXJwb3J0LnNlcXVlbmNlXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJtb3ZlZCB0byBmbG9vckluZGV4XCIsIGZsb29ySW5kZXgpO1xyXG4gICAgICAgICAgcmV0cnkgPSBmYWxzZTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0Nhbm5vdCBtb3ZlIHRvIEZsb29yJywgZXJyb3IpO1xyXG4gICAgICAgICAgYXdhaXQgd2FpdCgxMDApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdObyBtYXR0ZXJwb3J0IGZsb29yIGZvdW5kIHRvIG1vdmUgdG8nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBpbXBvcnRGbG9vckRhdGEoXHJcbiAgICBkZWZhdXRab25lSUQ6IHN0cmluZyxcclxuICAgIG5vZGU6IE5vZGVcclxuICApOiBQcm9taXNlPFpvbmVbXT4ge1xyXG4gICAgY29uc3Qgem9uZXMgPSBbXTtcclxuICAgIGF3YWl0IHRoaXMuc2RrLk1vZGUubW92ZVRvKHRoaXMuc2RrLk1vZGUuTW9kZS5GTE9PUlBMQU4pO1xyXG4gICAgY29uc3Qgbm1iRmxvb3JzID0gT2JqZWN0LmtleXModGhpcy5mbG9vcnMpLmxlbmd0aDtcclxuICAgIGNvbnNvbGUubG9nKCdUb3RhbCBudW1iZXIgb2YgZmxvb3JzJywgbm1iRmxvb3JzKTtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBubWJGbG9vcnM7IGluZGV4ICs9IDEpIHtcclxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcclxuICAgICAgY29uc29sZS5sb2coJ0ltcG9ydGluZyBmbG9vcicsIGluZGV4KTtcclxuICAgICAgYXdhaXQgdGhpcy5zZGsuRmxvb3IubW92ZVRvKGluZGV4KS50aGVuKGFzeW5jICgpID0+IHtcclxuICAgICAgICBhd2FpdCB3YWl0KDcwMCk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJhYm91dCB0byBzYXZlIHRoZSBmbG9vclwiLCBpbmRleCk7XHJcbiAgICAgICAgY29uc3Qgem9uZSA9IGF3YWl0IHRoaXMuc2F2ZUZsb29yKGRlZmF1dFpvbmVJRCwgbm9kZSk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJyZWNlaXZlZCBmbG9vciB6b25lXCIsIHpvbmUpO1xyXG4gICAgICAgIHpvbmVzLnB1c2goem9uZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh6b25lcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNhdmVGbG9vcihkZWZhdXRab25lSUQ6IHN0cmluZywgbm9kZTogTm9kZSk6IFByb21pc2U8Wm9uZT4ge1xyXG4gICAgbGV0IG5hbWUgPSB0aGlzLmN1cnJlbnRGbG9vci5pZDtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRGbG9vci5uYW1lICE9PSAnJykge1xyXG4gICAgICBuYW1lID0gdGhpcy5jdXJyZW50Rmxvb3IubmFtZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGxheWVyRmxvb3IgPSBhd2FpdCB0aGlzLmdldExheWVyQnlOYW1lKCdGTE9PUicpO1xyXG4gICAgY29uc3Qgc3dlZXBzSW5mbyA9IE9iamVjdC52YWx1ZXModGhpcy5zd2VlcHMpO1xyXG4gICAgY29uc3Qgc3dlZXBzRm9yRmxvb3IgPSBzd2VlcHNJbmZvLmZpbHRlcihcclxuICAgICAgKHN3ZWVwSW5mbykgPT4gc3dlZXBJbmZvLmZsb29ySW5mby5pZCA9PT0gdGhpcy5jdXJyZW50Rmxvb3IuaWRcclxuICAgICk7XHJcbiAgICBjb25zb2xlLmxvZygnY3VycmVudCBmbG9vcicsIHRoaXMuY3VycmVudEZsb29yKTtcclxuICAgIGNvbnNvbGUubG9nKCdzd2VlcHMgZm9yIGZsb29yJywgc3dlZXBzRm9yRmxvb3IubGVuZ3RoKTtcclxuICAgIGNvbnN0IHN3ZWVwSURzOiBzdHJpbmdbXSA9IHN3ZWVwc0ZvckZsb29yLm1hcCgoc3dlZXApID0+IHN3ZWVwLnV1aWQpO1xyXG4gICAgY29uc3Qgem9uZSA9IGF3YWl0IHRoaXMuY3JlYXRlWm9uZShcclxuICAgICAgYMOJdGFnZSAke25hbWV9IC0gJHtub2RlLm1ldGFkYXRhfWAsXHJcbiAgICAgIGxheWVyRmxvb3IuaWQsXHJcbiAgICAgIG51bGwsXHJcbiAgICAgIGRlZmF1dFpvbmVJRCxcclxuICAgICAgc3dlZXBJRHMsXHJcbiAgICAgIG5vZGUsXHJcbiAgICAgIEpTT04uc3RyaW5naWZ5KHsgbWF0dGVycG9ydEZsb29yU2VxdWVuY2U6IHRoaXMuY3VycmVudEZsb29yLnNlcXVlbmNlIH0pXHJcbiAgICApO1xyXG4gICAgLy8gVE9ETyBsaW5rIHRvIHNjYW5zXHJcbiAgICBjb25zdCBiYXNlNjQgPSBhd2FpdCB0aGlzLnNkay5SZW5kZXJlci50YWtlU2NyZWVuU2hvdCh7XHJcbiAgICAgIHdpZHRoOiA0MDk2LFxyXG4gICAgICBoZWlnaHQ6IDIwNDgsXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHNwYWNlSURzaG9ydCA9IHRoaXMuc3BhY2VJRC5zbGljZSgwLCA4KTtcclxuICAgIGF3YWl0IHVwbG9hZEJhc2U2NEltYWdlKFxyXG4gICAgICBiYXNlNjQsXHJcbiAgICAgIG51bGwsXHJcbiAgICAgIGB2aXNpdHMvJHt0aGlzLm1vZGVsSUR9L3BsYW5zL2AsXHJcbiAgICAgIGBwbGFuX2Zsb29yXyR7dGhpcy5jdXJyZW50Rmxvb3IuaWR9XyR7c3BhY2VJRHNob3J0fWBcclxuICAgICk7XHJcbiAgICAvLyBjcmVhdGUgUGxhbiBvYmplY3RcclxuICAgIGNvbnN0IHBsYW4gPSB7XHJcbiAgICAgIG5hbWU6IGBwbGFuX2Zsb29yXyR7dGhpcy5jdXJyZW50Rmxvb3IuaWR9YCxcclxuICAgICAgYW5uZXhlOiBgdmlzaXRzLyR7dGhpcy5tb2RlbElEfS9wbGFucy9wbGFuX2Zsb29yXyR7dGhpcy5jdXJyZW50Rmxvb3IuaWR9XyR7c3BhY2VJRHNob3J0fS5qcGVnYCxcclxuICAgICAgem9uZUlEOiB6b25lLmlkLFxyXG4gICAgICBzcGFjZUlEOiB0aGlzLnNwYWNlSUQsXHJcbiAgICAgIGlzQ3VycmVudEZvclpvbmU6IHRydWUsXHJcbiAgICAgIGlzTW9kaWZpZWQ6IGZhbHNlLFxyXG4gICAgICBpc0ltcG9ydGVkTWF0dGVycG9ydDogdHJ1ZSxcclxuICAgIH0gYXMgUGxhbjtcclxuICAgIGF3YWl0IHRoaXMucGxhblNlcnZpY2UuY3JlYXRlUGxhbihwbGFuKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKFwiZmxvb3Igc2F2ZWRcIik7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHpvbmUpO1xyXG4gIH1cclxuXHJcbiAgYWJhbmRvbigpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygnYWJhbmRvbm5pbmcgaW1wb3J0Jyk7XHJcbiAgICAgIHRoaXMuc3RvcCA9IHRydWU7XHJcbiAgICAgIHRoaXMucmVtb3ZlRnJhbWUoKTtcclxuICAgIH0sIDUwMCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVGcmFtZSgpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRGcmFtZS5yZW1vdmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBhc3luYyBnZXRMYXllckJ5TmFtZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPExheWVyPiB7XHJcbiAgICBjb25zdCBtaXNzaW9uID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50TWlzc2lvbih0aGlzLnNwYWNlSUQpO1xyXG4gICAgY29uc3QgY3VycmVudE9yZ0lkID0gbWlzc2lvbi5vcmdhbmlzYXRpb25JRDtcclxuICAgIGNvbnN0IGxheWVycyA9IGF3YWl0IHRoaXMubGF5ZXJTZXJ2aWNlLmdldExheWVyQnlOYW1lRm9yT3JnYW5pc2F0aW9uKFxyXG4gICAgICBuYW1lLFxyXG4gICAgICBjdXJyZW50T3JnSWRcclxuICAgICk7XHJcbiAgICBpZiAobGF5ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIGxheWVyc1swXTtcclxuICAgIH1cclxuICAgIC8vIGNyZWF0ZSB0aGVuXHJcbiAgICByZXR1cm4gdGhpcy5sYXllclNlcnZpY2UuY3JlYXRlTGF5ZXJGb3JPcmdhbmlzYXRpb24obmFtZSwgY3VycmVudE9yZ0lkKTtcclxuICB9XHJcbn1cclxuIl19
|