@workflow/core 5.0.0-beta.44 → 5.0.0-beta.46
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/dist/attribute-changes.d.ts +3 -5
- package/dist/attribute-changes.d.ts.map +1 -1
- package/dist/attribute-changes.js +2 -2
- package/dist/capabilities.d.ts +2 -2
- package/dist/capabilities.js +4 -4
- package/dist/events-consumer.d.ts +1 -1
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +3 -2
- package/dist/flushable-stream.js +2 -2
- package/dist/global.d.ts +3 -1
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +8 -5
- package/dist/private.d.ts +9 -7
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +11 -1
- package/dist/runtime/helpers.d.ts +3 -3
- package/dist/runtime/helpers.js +1 -1
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
- package/dist/runtime/quickjs-entrypoint.js +8 -1
- package/dist/runtime/quickjs-runtime.js +7 -1
- package/dist/runtime/resume-hook.d.ts +27 -12
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +182 -182
- package/dist/runtime/resume-latency.d.ts +16 -6
- package/dist/runtime/resume-latency.d.ts.map +1 -1
- package/dist/runtime/resume-latency.js +4 -2
- package/dist/runtime/run.d.ts +1 -1
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +3 -2
- package/dist/runtime/start.js +3 -3
- package/dist/runtime/step-latency.d.ts +31 -14
- package/dist/runtime/step-latency.d.ts.map +1 -1
- package/dist/runtime/step-latency.js +19 -13
- package/dist/runtime/suspension-handler.d.ts +9 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +41 -41
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +133 -66
- package/dist/serialization/hardened.d.ts +5 -4
- package/dist/serialization/hardened.d.ts.map +1 -1
- package/dist/serialization/hardened.js +7 -1
- package/dist/serialization-format.js +2 -2
- package/dist/serialization.d.ts +5 -6
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +19 -12
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +3 -11
- package/dist/telemetry/semantic-conventions.d.ts +14 -5
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +13 -4
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/workflow/attribute-dispatcher.d.ts.map +1 -1
- package/dist/workflow/attribute-dispatcher.js +3 -6
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +6 -15
- package/dist/workflow.js +7 -8
- package/package.json +4 -4
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { ReplayDivergenceError } from '@workflow/errors';
|
|
2
2
|
import { withResolvers } from '@workflow/utils';
|
|
3
3
|
import { EventConsumerResult } from '../events-consumer.js';
|
|
4
|
-
import {
|
|
5
|
-
import { scheduleWhenIdle, } from '../private.js';
|
|
4
|
+
import { scheduleWorkflowSuspension, } from '../private.js';
|
|
6
5
|
export function createSetAttributes(ctx) {
|
|
7
6
|
return async function setAttributes(changes, options = {}) {
|
|
8
7
|
const { promise, resolve } = withResolvers();
|
|
@@ -18,9 +17,7 @@ export function createSetAttributes(ctx) {
|
|
|
18
17
|
ctx.invocationsQueue.set(correlationId, queueItem);
|
|
19
18
|
ctx.eventsConsumer.subscribe((event) => {
|
|
20
19
|
if (!event) {
|
|
21
|
-
|
|
22
|
-
ctx.onWorkflowError(new WorkflowSuspension(ctx.invocationsQueue, ctx.globalThis));
|
|
23
|
-
});
|
|
20
|
+
scheduleWorkflowSuspension(ctx);
|
|
24
21
|
return EventConsumerResult.NotConsumed;
|
|
25
22
|
}
|
|
26
23
|
if (event.correlationId !== correlationId) {
|
|
@@ -45,4 +42,4 @@ export function createSetAttributes(ctx) {
|
|
|
45
42
|
return promise;
|
|
46
43
|
};
|
|
47
44
|
}
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLWRpc3BhdGNoZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvYXR0cmlidXRlLWRpc3BhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTVELE9BQU8sRUFDTCwwQkFBMEIsR0FFM0IsTUFBTSxlQUFlLENBQUM7QUFFdkIsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEdBQWdDO0lBQ2xFLE9BQU8sS0FBSyxVQUFVLGFBQWEsQ0FDakMsT0FBMEIsRUFDMUIsVUFBaUQsRUFBRTtRQUVuRCxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLGFBQWEsRUFBUSxDQUFDO1FBQ25ELE1BQU0sYUFBYSxHQUFHLFFBQVEsR0FBRyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7UUFDbkQsTUFBTSxTQUFTLEdBQWlDO1lBQzlDLElBQUksRUFBRSxXQUFXO1lBQ2pCLGFBQWE7WUFDYixPQUFPO1lBQ1AsR0FBRyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsS0FBSyxJQUFJO2dCQUMxQyxDQUFDLENBQUMsRUFBRSx1QkFBdUIsRUFBRSxJQUFJLEVBQUU7Z0JBQ25DLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDUixDQUFDO1FBQ0YsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFbkQsR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1gsMEJBQTBCLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hDLE9BQU8sbUJBQW1CLENBQUMsV0FBVyxDQUFDO1lBQ3pDLENBQUM7WUFFRCxJQUFJLEtBQUssQ0FBQyxhQUFhLEtBQUssYUFBYSxFQUFFLENBQUM7Z0JBQzFDLE9BQU8sbUJBQW1CLENBQUMsV0FBVyxDQUFDO1lBQ3pDLENBQUM7WUFFRCxJQUNFLEtBQUssQ0FBQyxTQUFTLEtBQUssVUFBVTtnQkFDOUIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFVBQVU7Z0JBQzFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztnQkFDbkUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLHVCQUF1QixLQUFLLElBQUksQ0FBQztvQkFDaEQsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEtBQUssSUFBSSxDQUFDLEVBQzVDLENBQUM7Z0JBQ0QsR0FBRyxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7b0JBQzVDLEdBQUcsQ0FBQyxlQUFlLENBQ2pCLElBQUkscUJBQXFCLENBQ3ZCLHFEQUFxRCxhQUFhLEVBQUUsRUFDcEUsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUMzQixDQUNGLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxtQkFBbUIsQ0FBQyxRQUFRLENBQUM7WUFDdEMsQ0FBQztZQUVELEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDM0MsR0FBRyxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQzVDLE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXBsYXlEaXZlcmdlbmNlRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHdpdGhSZXNvbHZlcnMgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBBdHRyaWJ1dGVDaGFuZ2UgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCB9IGZyb20gJy4uL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgdHlwZSB7IEF0dHJpYnV0ZUludm9jYXRpb25RdWV1ZUl0ZW0gfSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHtcbiAgc2NoZWR1bGVXb3JrZmxvd1N1c3BlbnNpb24sXG4gIHR5cGUgV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxufSBmcm9tICcuLi9wcml2YXRlLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNldEF0dHJpYnV0ZXMoY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQpIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHNldEF0dHJpYnV0ZXMoXG4gICAgY2hhbmdlczogQXR0cmlidXRlQ2hhbmdlW10sXG4gICAgb3B0aW9uczogeyBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcz86IGJvb2xlYW4gfSA9IHt9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZSwgcmVzb2x2ZSB9ID0gd2l0aFJlc29sdmVyczx2b2lkPigpO1xuICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSBgYXR0cl8ke2N0eC5nZW5lcmF0ZVVsaWQoKX1gO1xuICAgIGNvbnN0IHF1ZXVlSXRlbTogQXR0cmlidXRlSW52b2NhdGlvblF1ZXVlSXRlbSA9IHtcbiAgICAgIHR5cGU6ICdhdHRyaWJ1dGUnLFxuICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgIGNoYW5nZXMsXG4gICAgICAuLi4ob3B0aW9ucy5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZVxuICAgICAgICA/IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHRydWUgfVxuICAgICAgICA6IHt9KSxcbiAgICB9O1xuICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLnNldChjb3JyZWxhdGlvbklkLCBxdWV1ZUl0ZW0pO1xuXG4gICAgY3R4LmV2ZW50c0NvbnN1bWVyLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgc2NoZWR1bGVXb3JrZmxvd1N1c3BlbnNpb24oY3R4KTtcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5jb3JyZWxhdGlvbklkICE9PSBjb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGV2ZW50LmV2ZW50VHlwZSAhPT0gJ2F0dHJfc2V0JyB8fFxuICAgICAgICBldmVudC5ldmVudERhdGEud3JpdGVyLnR5cGUgIT09ICd3b3JrZmxvdycgfHxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZXZlbnQuZXZlbnREYXRhLmNoYW5nZXMpICE9PSBKU09OLnN0cmluZ2lmeShjaGFuZ2VzKSB8fFxuICAgICAgICAoZXZlbnQuZXZlbnREYXRhLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID09PSB0cnVlKSAhPT1cbiAgICAgICAgICAob3B0aW9ucy5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZSlcbiAgICAgICkge1xuICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICBjdHgub25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICAgICAgbmV3IFJlcGxheURpdmVyZ2VuY2VFcnJvcihcbiAgICAgICAgICAgICAgYFJlcGxheSBkaXZlcmdlbmNlOiBVbmV4cGVjdGVkIGF0dHJpYnV0ZSBldmVudCBmb3IgJHtjb3JyZWxhdGlvbklkfWAsXG4gICAgICAgICAgICAgIHsgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgICAgfVxuXG4gICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5kZWxldGUoY29ycmVsYXRpb25JZCk7XG4gICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICB9KTtcblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9O1xufVxuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/workflow/hook.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/workflow/hook.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG3D,OAAO,EAIL,KAAK,2BAA2B,EACjC,MAAM,eAAe,CAAC;AA2CvB,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,2BAA2B,IAChC,CAAC,GAAG,GAAG,EAAE,UAAS,WAAgB,KAAG,IAAI,CAAC,CAAC,CAAC,CAqiB5E"}
|
package/dist/workflow/hook.js
CHANGED
|
@@ -3,9 +3,8 @@ import { WORKFLOW_DESERIALIZE } from '@workflow/serde';
|
|
|
3
3
|
import { parseDurationToDate, withResolvers, } from '@workflow/utils';
|
|
4
4
|
import { getSerializationClass, RUN_CLASS_ID } from '../class-serialization.js';
|
|
5
5
|
import { EventConsumerResult } from '../events-consumer.js';
|
|
6
|
-
import { WorkflowSuspension } from '../global.js';
|
|
7
6
|
import { webhookLogger } from '../logger.js';
|
|
8
|
-
import { awaitEarlierDeliveries, registerDeliveryBarrier,
|
|
7
|
+
import { awaitEarlierDeliveries, registerDeliveryBarrier, scheduleWorkflowSuspension, } from '../private.js';
|
|
9
8
|
import { hydrateStepReturnValue } from '../serialization.js';
|
|
10
9
|
/**
|
|
11
10
|
* Constructs a `Run` handle for the run that owns a conflicting hook
|
|
@@ -125,9 +124,7 @@ export function createCreateHook(ctx) {
|
|
|
125
124
|
eventLogEmpty = true;
|
|
126
125
|
if ((promises.length > 0 && payloadsQueue.length === 0) ||
|
|
127
126
|
(getConflictPromises.length > 0 && !hasCreated && !hasConflict)) {
|
|
128
|
-
|
|
129
|
-
ctx.onWorkflowError(new WorkflowSuspension(ctx.invocationsQueue, ctx.globalThis));
|
|
130
|
-
});
|
|
127
|
+
scheduleWorkflowSuspension(ctx);
|
|
131
128
|
}
|
|
132
129
|
return EventConsumerResult.NotConsumed;
|
|
133
130
|
}
|
|
@@ -381,9 +378,7 @@ export function createCreateHook(ctx) {
|
|
|
381
378
|
}
|
|
382
379
|
}
|
|
383
380
|
if (eventLogEmpty) {
|
|
384
|
-
|
|
385
|
-
ctx.onWorkflowError(new WorkflowSuspension(ctx.invocationsQueue, ctx.globalThis));
|
|
386
|
-
});
|
|
381
|
+
scheduleWorkflowSuspension(ctx);
|
|
387
382
|
}
|
|
388
383
|
promises.push(resolvers);
|
|
389
384
|
return resolvers.promise;
|
|
@@ -417,9 +412,7 @@ export function createCreateHook(ctx) {
|
|
|
417
412
|
queueItem.hasConflictAwaiter = true;
|
|
418
413
|
}
|
|
419
414
|
if (eventLogEmpty) {
|
|
420
|
-
|
|
421
|
-
ctx.onWorkflowError(new WorkflowSuspension(ctx.invocationsQueue, ctx.globalThis));
|
|
422
|
-
});
|
|
415
|
+
scheduleWorkflowSuspension(ctx);
|
|
423
416
|
}
|
|
424
417
|
getConflictPromises.push(resolvers);
|
|
425
418
|
return resolvers.promise;
|
|
@@ -445,9 +438,7 @@ export function createCreateHook(ctx) {
|
|
|
445
438
|
// never deliver another hook_received after disposal.
|
|
446
439
|
if (promises.length > 0) {
|
|
447
440
|
promises.length = 0;
|
|
448
|
-
|
|
449
|
-
ctx.onWorkflowError(new WorkflowSuspension(ctx.invocationsQueue, ctx.globalThis));
|
|
450
|
-
});
|
|
441
|
+
scheduleWorkflowSuspension(ctx);
|
|
451
442
|
}
|
|
452
443
|
webhookLogger.debug('Hook disposed', { correlationId, token });
|
|
453
444
|
}
|
|
@@ -479,4 +470,4 @@ export function createCreateHook(ctx) {
|
|
|
479
470
|
return hook;
|
|
480
471
|
};
|
|
481
472
|
}
|
|
482
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JrZmxvdy9ob29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsaUJBQWlCLEVBQ2pCLHFCQUFxQixHQUN0QixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFFTCxtQkFBbUIsRUFDbkIsYUFBYSxHQUNkLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWhGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLGdCQUFnQixHQUVqQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILFNBQVMsb0JBQW9CLENBQzNCLEdBQWdDLEVBQ2hDLGdCQUFvQztJQUVwQyxJQUFJLE9BQU8sZ0JBQWdCLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQUcscUJBQXFCLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBSXRELENBQUM7SUFDZCxNQUFNLFdBQVcsR0FBSSxRQUFnQixFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUM5RCxJQUFJLE9BQU8sV0FBVyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sSUFB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ICBSZXBsYXlEaXZlcmdlbmNlRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgV09SS0ZMT1dfREVTRVJJQUxJWkUgfSBmcm9tICdAd29ya2Zsb3cvc2VyZGUnO1xuaW1wb3J0IHtcbiAgdHlwZSBQcm9taXNlV2l0aFJlc29sdmVycyxcbiAgcGFyc2VEdXJhdGlvblRvRGF0ZSxcbiAgd2l0aFJlc29sdmVycyxcbn0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB0eXBlIHsgSG9va0NvbmZsaWN0RXZlbnQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgZ2V0U2VyaWFsaXphdGlvbkNsYXNzLCBSVU5fQ0xBU1NfSUQgfSBmcm9tICcuLi9jbGFzcy1zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va09wdGlvbnMgfSBmcm9tICcuLi9jcmVhdGUtaG9vay5qcyc7XG5pbXBvcnQgeyBFdmVudENvbnN1bWVyUmVzdWx0IH0gZnJvbSAnLi4vZXZlbnRzLWNvbnN1bWVyLmpzJztcbmltcG9ydCB7IFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4uL2dsb2JhbC5qcyc7XG5pbXBvcnQgeyB3ZWJob29rTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7XG4gIGF3YWl0RWFybGllckRlbGl2ZXJpZXMsXG4gIHJlZ2lzdGVyRGVsaXZlcnlCYXJyaWVyLFxuICBzY2hlZHVsZVdoZW5JZGxlLFxuICB0eXBlIFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCxcbn0gZnJvbSAnLi4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJ1biB9IGZyb20gJy4uL3J1bnRpbWUvcnVuLmpzJztcbmltcG9ydCB7IGh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgYFJ1bmAgaGFuZGxlIGZvciB0aGUgcnVuIHRoYXQgb3ducyBhIGNvbmZsaWN0aW5nIGhvb2tcbiAqIHRva2VuLCBmb3IgcmVzb2x1dGlvbiB0aHJvdWdoIGBob29rLmdldENvbmZsaWN0KClgLlxuICpcbiAqIFRoZSBpbnN0YW5jZSBpcyBjcmVhdGVkIHRocm91Z2ggdGhlIHNlcmlhbGl6YXRpb24gY2xhc3MgcmVnaXN0cnkgb25cbiAqIHRoZSBWTSdzIGdsb2JhbFRoaXMsIHRoZSBzYW1lIGNoYW5uZWwgdGhhdCByZXZpdmVzIHNlcmlhbGl6ZWQgYFJ1bmBcbiAqIGluc3RhbmNlcyAoZS5nLiBgc3RhcnQoKWAgcmV0dXJuIHZhbHVlcyBjcm9zc2luZyBmcm9tIGEgc3RlcCBpbnRvIHRoZVxuICogd29ya2Zsb3cpLiBUaGUgcmVnaXN0ZXJlZCBjbGFzcyBpcyB0aGUgVk0gYnVuZGxlJ3MgcGx1Z2luLWNvbXBpbGVkXG4gKiBgUnVuYCwgd2hvc2UgbWV0aG9kcyBhcmUgZHVyYWJsZSBzdGVwIHByb3hpZXMgKHNhZmUgdG8gY2FsbCBmcm9tXG4gKiB3b3JrZmxvdyBjb2RlKSwgYW5kIGNvbnN0cnVjdGlvbiBnb2VzIHRocm91Z2ggaXRzXG4gKiBgV09SS0ZMT1dfREVTRVJJQUxJWkVgIGhvb2ssIGV4YWN0bHkgYXMgdGhlIGBJbnN0YW5jZWAgcmV2aXZlciB3b3VsZC5cbiAqXG4gKiBSZXR1cm5zIGBudWxsYCB3aGVuIGEgcmVhbCBgUnVuYCBjYW5ub3QgYmUgY29uc3RydWN0ZWQ6IHRoZSBjb25mbGljdFxuICogZXZlbnQgbGFja3MgYGNvbmZsaWN0aW5nUnVuSWRgICh3cml0dGVuIGJ5IGFuIG9sZCB3b3JsZCksIG9yIHRoZSBWTSdzXG4gKiByZWdpc3RyeSBoYXMgbm8gYFJ1bmAgKGEgY29udGV4dCB0aGF0IG5ldmVyIGV2YWx1YXRlZCB0aGVcbiAqIHdvcmtmbG93LW1vZGUgYGNyZWF0ZS1ob29rYCBtb2R1bGUsIHdoaWNoIGFsaWFzZXMgaXQgdW5kZXJcbiAqIGBSVU5fQ0xBU1NfSURgKS4gYGdldENvbmZsaWN0YCBhd2FpdGVycyB0aGVuIHJlamVjdCB3aXRoXG4gKiBgSG9va0NvbmZsaWN0RXJyb3JgIGluc3RlYWQgb2YgcmVzb2x2aW5nIHdpdGggYSB2YWx1ZSB0aGF0IGRvZXNuJ3RcbiAqIGhvbm9yIHRoZSBgUnVuYCBjb250cmFjdC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29uZmxpY3RpbmdSdW4oXG4gIGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxuICBjb25mbGljdGluZ1J1bklkOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFJ1bjx1bmtub3duPiB8IG51bGwge1xuICBpZiAodHlwZW9mIGNvbmZsaWN0aW5nUnVuSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgUnVuQ2xhc3MgPSBnZXRTZXJpYWxpemF0aW9uQ2xhc3MoUlVOX0NMQVNTX0lELCBjdHguZ2xvYmFsVGhpcykgYXNcbiAgICB8IChhYnN0cmFjdCBuZXcgKFxuICAgICAgICAuLi5hcmdzOiBuZXZlclxuICAgICAgKSA9PiBSdW48dW5rbm93bj4pXG4gICAgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGRlc2VyaWFsaXplID0gKFJ1bkNsYXNzIGFzIGFueSk/LltXT1JLRkxPV19ERVNFUklBTElaRV07XG4gIGlmICh0eXBlb2YgZGVzZXJpYWxpemUgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gZGVzZXJpYWxpemUuY2FsbChSdW5DbGFzcywgeyBydW5JZDogY29uZmxpY3RpbmdSdW5JZCB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNyZWF0ZUhvb2soY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZUhvb2tJbXBsPFQgPSBhbnk+KG9wdGlvbnM6IEhvb2tPcHRpb25zID0ge30pOiBIb29rPFQ+IHtcbiAgICAvLyBSZWplY3QgYW4gZXhwbGljaXQgZW1wdHktc3RyaW5nIHRva2VuLiBBIHRva2VuIG11c3QgZWl0aGVyIGJlIG9taXR0ZWRcbiAgICAvLyAob3IgYHVuZGVmaW5lZGAvYG51bGxgKSB0byBnZXQgYSBnZW5lcmF0ZWQgb25lLCBvciBiZSBhblxuICAgIC8vIGV4cGxpY2l0IG5vbi1lbXB0eSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyBhbG1vc3QgYWx3YXlzIGFuXG4gICAgLy8gYWNjaWRlbnRhbCB2YWx1ZSAoZS5nLiBhbiB1bnNldCB2YXJpYWJsZSkgYW5kIHdvdWxkIG90aGVyd2lzZSBzbGlwXG4gICAgLy8gdGhyb3VnaCB0aGUgYD8/YCBiZWxvdyAod2hpY2ggb25seSBmYWxscyBiYWNrIGZvciBudWxsaXNoIHZhbHVlcykgYW5kXG4gICAgLy8gYmUgdXNlZCBhcyBhIG1lYW5pbmdsZXNzLCBub24tZGV0ZXJtaW5pc3RpYyB0b2tlbi5cbiAgICBpZiAob3B0aW9ucy50b2tlbiA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2BjcmVhdGVIb29rKClgIHdhcyBjYWxsZWQgd2l0aCBhbiBlbXB0eSBzdHJpbmcgdG9rZW4uIFBhc3MgYSBub24tZW1wdHkgdG9rZW4sIG9yIG9taXQgdGhlIGB0b2tlbmAgb3B0aW9uIHRvIHVzZSBhIGdlbmVyYXRlZCBvbmUuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBvcHRpb25zLmlzV2ViaG9vayA9PT0gdHJ1ZSAmJlxuICAgICAgb3B0aW9ucy5leHBlcmltZW50YWxfbWluUmV0ZW50aW9uICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1dlYmhvb2sgaG9va3MgZG8gbm90IHN1cHBvcnQgYGV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb25gLiBVc2UgYSBub24td2ViaG9vayBgY3JlYXRlSG9vaygpYCB3aXRoIGByZXN1bWVIb29rKClgLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgb3B0aW9ucy5leHBlcmltZW50YWxfbWluUmV0ZW50aW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGN0eC53b3JsZENhcGFiaWxpdGllcz8uaG9va1JldGVudGlvbj8uYWN0aXZlICE9PSB0cnVlXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRmF0YWxFcnJvcihcbiAgICAgICAgJ1RoZSBjb25maWd1cmVkIFdvcmxkIGRvZXMgbm90IHN1cHBvcnQgYGV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb25gIGZvciBIb29rcy4nXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIGhvb2sgSUQgYW5kIHRva2VuXG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IGBob29rXyR7Y3R4LmdlbmVyYXRlVWxpZCgpfWA7XG4gICAgY29uc3QgdG9rZW4gPSBvcHRpb25zLnRva2VuID8/IGN0eC5nZW5lcmF0ZU5hbm9pZCgpO1xuICAgIGNvbnN0IHRva2VuUmV0ZW50aW9uVW50aWwgPVxuICAgICAgb3B0aW9ucy5leHBlcmltZW50YWxfbWluUmV0ZW50aW9uID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBwYXJzZUR1cmF0aW9uVG9EYXRlKG9wdGlvbnMuZXhwZXJpbWVudGFsX21pblJldGVudGlvbik7XG5cbiAgICAvLyBBZGQgaG9vayBjcmVhdGlvbiB0byBpbnZvY2F0aW9ucyBxdWV1ZSAodXNpbmcgTWFwIGZvciBPKDEpIG9wZXJhdGlvbnMpXG4gICAgY29uc3QgaXNXZWJob29rID0gb3B0aW9ucy5pc1dlYmhvb2sgPz8gZmFsc2U7XG5cbiAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5zZXQoY29ycmVsYXRpb25JZCwge1xuICAgICAgdHlwZTogJ2hvb2snLFxuICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgIHRva2VuLFxuICAgICAgdG9rZW5SZXRlbnRpb25VbnRpbCxcbiAgICAgIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLFxuICAgICAgaXNXZWJob29rLFxuICAgIH0pO1xuXG4gICAgLy8gUXVldWUgb2YgYnVmZmVyZWQgaG9vayBwYXlsb2FkcyAocmVjZWl2ZWQgYmVmb3JlIHRoZSB3b3JrZmxvdyBhd2FpdGVkXG4gICAgLy8gdGhlIGhvb2spLiBFYWNoIGVudHJ5J3MgYGNsYWltKClgIGJ1aWxkcyB0aGUgY29uc3VtZXItZmFjaW5nIHByb21pc2VcbiAgICAvLyBmcm9tIHRoZSBjYXB0dXJlZCBoeWRyYXRpb24gb3V0Y29tZSBhbmQgb3JkZXJzIGl0IGRldGVybWluaXN0aWNhbGx5IGJ5XG4gICAgLy8gZXZlbnQtbG9nIHBvc2l0aW9uIGFnYWluc3QgYW55IGNvbmN1cnJlbnQgYnJhbmNoLWRlY2lkaW5nIHJlc29sdXRpb25cbiAgICAvLyAoc2VlIGBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnNgKS5cbiAgICBjb25zdCBwYXlsb2Fkc1F1ZXVlOiB7IGNsYWltOiAoKSA9PiBQcm9taXNlPFQ+IH1bXSA9IFtdO1xuXG4gICAgLy8gUXVldWUgb2YgcHJvbWlzZXMgdGhhdCByZXNvbHZlIHRvIHRoZSBuZXh0IGhvb2sgcGF5bG9hZFxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPltdID0gW107XG5cbiAgICAvLyBRdWV1ZSBvZiBwcm9taXNlcyB0aGF0IHJlc29sdmUgb25jZSBob29rIHJlZ2lzdHJhdGlvbiBpcyBjb25maXJtZWRcbiAgICAvLyAod2l0aCBgbnVsbGApIG9yIGEgdG9rZW4gY29uZmxpY3QgaXMgZGV0ZWN0ZWQgKHdpdGggdGhlIGNvbmZsaWN0aW5nXG4gICAgLy8gYFJ1bmApLiBUaGVzZSBiYWNrIHRoZSBgaG9vay5nZXRDb25mbGljdCgpYCBnZXR0ZXIuXG4gICAgY29uc3QgZ2V0Q29uZmxpY3RQcm9taXNlczogUHJvbWlzZVdpdGhSZXNvbHZlcnM8UnVuPHVua25vd24+IHwgbnVsbD5bXSA9IFtdO1xuXG4gICAgbGV0IGV2ZW50TG9nRW1wdHkgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIHRoZSBldmVudCBsb2cgY29uZmlybXMgaG9vayBjcmVhdGlvbiBoYXBwZW5lZFxuICAgIGxldCBoYXNDcmVhdGVkID0gZmFsc2U7XG5cbiAgICAvLyBUcmFjayBpZiB0aGUgZXZlbnQgbG9nIGNvbmZpcm1zIGRpc3Bvc2FsIGhhcHBlbmVkIChyZXBsYXkgbm8tb3ApXG4gICAgbGV0IGhhc0Rpc3Bvc2VkRXZlbnQgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIHdlIGhhdmUgYSBjb25mbGljdCBzbyB3ZSBjYW4gcmVqZWN0IGZ1dHVyZSBhd2FpdHNcbiAgICBsZXQgaGFzQ29uZmxpY3QgPSBmYWxzZTtcbiAgICBsZXQgY29uZmxpY3RFcnJvclJlZjogSG9va0NvbmZsaWN0RXJyb3IgfCBudWxsID0gbnVsbDtcbiAgICAvLyBUaGUgY29uZmxpY3RpbmcgcnVuIGhhbmRsZSwgc2hhcmVkIGJ5IGV2ZXJ5IGBnZXRDb25mbGljdGAgYXdhaXQgc29cbiAgICAvLyByZXBlYXRlZCBhd2FpdHMgb2JzZXJ2ZSB0aGUgc2FtZSBpbnN0YW5jZSBkZXRlcm1pbmlzdGljYWxseS5cbiAgICBsZXQgY29uZmxpY3RSdW5SZWY6IFJ1bjx1bmtub3duPiB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gTGF6eS1yZXN1bWUgZGVkdXA6IGByZXN1bWVIb29rKClgIG1pbnRzIGEgYHJlc3VtZUlkYCBwZXIgcmVzdW1lXG4gICAgLy8gYXR0ZW1wdCBhbmQgc3RhbXBzIGl0IG9uIHRoZSBgaG9va19yZWNlaXZlZGAgZXZlbnQuIFdoZW4gdGhlIGRpcmVjdFxuICAgIC8vIGV2ZW50IHdyaXRlIGZhaWxzIHRyYW5zaWVudGx5LCB0aGUgcnVudGltZSBtYXRlcmlhbGl6ZXMgdGhlIGV2ZW50IGZyb21cbiAgICAvLyB0aGUgcXVldWUgcGF5bG9hZCBpbnN0ZWFkLCBhbmQgYmVjYXVzZSBgaG9va19yZWNlaXZlZGAgaGFzIG5vXG4gICAgLy8gc3RvcmFnZS1sZXZlbCB1bmlxdWVuZXNzIGNvbnN0cmFpbnQsIGNvbmN1cnJlbnQgcmVkZWxpdmVyeSBvZiB0aGUgc2FtZVxuICAgIC8vIHF1ZXVlIG1lc3NhZ2UgY2FuIGNvbW1pdCB0aGF0IG1hdGVyaWFsaXphdGlvbiB0d2ljZS4gVHdvIHJvd3MgZm9yIE9ORVxuICAgIC8vIHJlc3VtZSBhdHRlbXB0IHRoZW4gc2hhcmUgYSBgcmVzdW1lSWRgIChkaXN0aW5jdCByZXN1bWUgYXR0ZW1wdHMgbmV2ZXJcbiAgICAvLyBkbyksIHNvIHJlcGxheSBkZWxpdmVycyBvbmx5IHRoZSBmaXJzdC1pbi1sb2cgb2NjdXJyZW5jZS4gVGhpcyBpcyBhXG4gICAgLy8gcHVyZSBmdW5jdGlvbiBvZiB0aGUgcGVyc2lzdGVkIGV2ZW50IGxvZywga2VlcGluZyByZXBsYXkgZGV0ZXJtaW5pc3RpYy5cbiAgICAvL1xuICAgIC8vIFNjb3BlOiB0aGlzIGlzIGRlZmVuc2UtaW4tZGVwdGggb3ZlciB0aGUgcGVyc2lzdGVkIGxvZywgbm90IGFcbiAgICAvLyBjcm9zcy1pbnZvY2F0aW9uIGV4YWN0bHktb25jZSBndWFyYW50ZWU6IGFuIGludm9jYXRpb24gcmVwbGF5aW5nIGFcbiAgICAvLyBzbmFwc2hvdCB0YWtlbiBiZWZvcmUgdGhlIGR1cGxpY2F0ZSByb3cgY29tbWl0dGVkIG9ubHkgc2VlcyBvbmUgcm93LFxuICAgIC8vIHNvIHR3byBDT05DVVJSRU5UIGludm9jYXRpb25zIGNhbiBlYWNoIGRlbGl2ZXIgZnJvbSB0aGVpciBvd25cbiAgICAvLyBzbmFwc2hvdC4gRXZlcnkgcmVwbGF5IGZyb20gYSBsb2cgY29udGFpbmluZyBib3RoIHJvd3MgKGkuZS4gYWxsXG4gICAgLy8gc3Vic2VxdWVudCBkZWxpdmVyaWVzKSBkZWR1cHMuIFRoZSBjb3JyZWN0bmVzcyBib3VuZGFyeSB0aGF0IGNsb3Nlc1xuICAgIC8vIHRoZSBjb25jdXJyZW50IHdpbmRvdyBpcyB0aGUgc3RvcmFnZS1sZXZlbCAocnVuSWQsIHJlc3VtZUlkKVxuICAgIC8vIGNvbnN0cmFpbnQgYXJyaXZpbmcgd2l0aCB0aGUgcGFyYWxsZWwtcmVzdW1lIHN1Y2Nlc3NvciB3b3JrOyB0aGlzIHNldFxuICAgIC8vIHN0YXlzIHVzZWZ1bCBhZnRlciB0aGF0IGxhbmRzLCBmb3IgbG9ncyB3cml0dGVuIGJlZm9yZSBpdCBkZXBsb3llZC5cbiAgICBjb25zdCBzZWVuUmVzdW1lSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICB3ZWJob29rTG9nZ2VyLmRlYnVnKCdIb29rIGNvbnN1bWVyIHNldHVwJywgeyBjb3JyZWxhdGlvbklkLCB0b2tlbiB9KTtcbiAgICBjdHguZXZlbnRzQ29uc3VtZXIuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGV2ZW50cyBhbmQgdGhlcmUgYXJlIHByb21pc2VzIHdhaXRpbmcsXG4gICAgICAvLyBpdCBtZWFucyB0aGUgaG9vayBoYXMgYmVlbiBhd2FpdGVkLCBidXQgYW4gaW5jb21pbmcgcGF5bG9hZCBoYXMgbm90IHlldCBiZWVuIHJlY2VpdmVkLlxuICAgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgd29ya2Zsb3cgc2hvdWxkIGJlIHN1c3BlbmRlZCB1bnRpbCB0aGUgaG9vayBpcyByZXN1bWVkLlxuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICBldmVudExvZ0VtcHR5ID0gdHJ1ZTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgKHByb21pc2VzLmxlbmd0aCA+IDAgJiYgcGF5bG9hZHNRdWV1ZS5sZW5ndGggPT09IDApIHx8XG4gICAgICAgICAgKGdldENvbmZsaWN0UHJvbWlzZXMubGVuZ3RoID4gMCAmJiAhaGFzQ3JlYXRlZCAmJiAhaGFzQ29uZmxpY3QpXG4gICAgICAgICkge1xuICAgICAgICAgIHNjaGVkdWxlV2hlbklkbGUoY3R4LCAoKSA9PiB7XG4gICAgICAgICAgICBjdHgub25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICAgICAgICBuZXcgV29ya2Zsb3dTdXNwZW5zaW9uKGN0eC5pbnZvY2F0aW9uc1F1ZXVlLCBjdHguZ2xvYmFsVGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5jb3JyZWxhdGlvbklkICE9PSBjb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIC8vIFdlJ3JlIG5vdCBpbnRlcmVzdGVkIGluIHRoaXMgZXZlbnQgLSB0aGUgY29ycmVsYXRpb25JZCBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IGVudGl0eVxuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXZlbnRUb2tlbiA9XG4gICAgICAgICdldmVudERhdGEnIGluIGV2ZW50ICYmIGV2ZW50LmV2ZW50RGF0YSAmJiAndG9rZW4nIGluIGV2ZW50LmV2ZW50RGF0YVxuICAgICAgICAgID8gZXZlbnQuZXZlbnREYXRhLnRva2VuXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh0eXBlb2YgZXZlbnRUb2tlbiA9PT0gJ3N0cmluZycgJiYgZXZlbnRUb2tlbiAhPT0gdG9rZW4pIHtcbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgIG5ldyBSZXBsYXlEaXZlcmdlbmNlRXJyb3IoXG4gICAgICAgICAgICAgIGBSZXBsYXkgZGl2ZXJnZW5jZTogaG9vayBldmVudCAke2V2ZW50LmV2ZW50VHlwZX0gZm9yICR7Y29ycmVsYXRpb25JZH0gYmVsb25ncyB0byB0b2tlbiBcIiR7ZXZlbnRUb2tlbn1cIiwgYnV0IHRoZSBjdXJyZW50IGhvb2sgY29uc3VtZXIgZXhwZWN0cyBcIiR7dG9rZW59XCJgLFxuICAgICAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgZm9yIGhvb2tfY3JlYXRlZCBldmVudCB0byBtYXJrIHRoaXMgaG9vayBhcyBhbHJlYWR5IGNyZWF0ZWRcbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlSXRlbSA9IGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmdldChjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgaWYgKHF1ZXVlSXRlbSAmJiBxdWV1ZUl0ZW0udHlwZSA9PT0gJ2hvb2snKSB7XG4gICAgICAgICAgcXVldWVJdGVtLmhhc0NyZWF0ZWRFdmVudCA9IHRydWU7XG4gICAgICAgICAgcXVldWVJdGVtLnRva2VuUmV0ZW50aW9uVW50aWwgPSBldmVudC5ldmVudERhdGEudG9rZW5SZXRlbnRpb25VbnRpbDtcbiAgICAgICAgfVxuICAgICAgICBoYXNDcmVhdGVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBwZW5kaW5nR2V0Q29uZmxpY3RQcm9taXNlcyA9IGdldENvbmZsaWN0UHJvbWlzZXMuc2xpY2UoKTtcbiAgICAgICAgZ2V0Q29uZmxpY3RQcm9taXNlcy5sZW5ndGggPSAwO1xuICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJlc29sdmVyIG9mIHBlbmRpbmdHZXRDb25mbGljdFByb21pc2VzKSB7XG4gICAgICAgICAgICByZXNvbHZlci5yZXNvbHZlKG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBob29rX2NvbmZsaWN0IGV2ZW50IC0gYW5vdGhlciB3b3JrZmxvdyBpcyB1c2luZyB0aGlzIHRva2VuXG4gICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19jb25mbGljdCcpIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRoaXMgaG9vayBmcm9tIHRoZSBpbnZvY2F0aW9ucyBxdWV1ZVxuICAgICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5kZWxldGUoY29ycmVsYXRpb25JZCk7XG5cbiAgICAgICAgLy8gU3RvcmUgdGhlIGNvbmZsaWN0IGV2ZW50IHNvIHdlIGNhbiByZWplY3QgYW55IGF3YWl0ZWQgcHJvbWlzZXMuXG4gICAgICAgIC8vIENoYWluIHRocm91Z2ggcHJvbWlzZVF1ZXVlIHRvIGVuc3VyZSBkZXRlcm1pbmlzdGljIG9yZGVyaW5nLlxuICAgICAgICBjb25zdCBjb25mbGljdEV2ZW50ID0gZXZlbnQgYXMgSG9va0NvbmZsaWN0RXZlbnQ7XG4gICAgICAgIGNvbnN0IGNvbmZsaWN0RXJyb3IgPSBuZXcgSG9va0NvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgY29uZmxpY3RFdmVudC5ldmVudERhdGEudG9rZW4sXG4gICAgICAgICAgY29uZmxpY3RFdmVudC5ldmVudERhdGEuY29uZmxpY3RpbmdSdW5JZFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIE1hcmsgdGhhdCB3ZSBoYXZlIGEgY29uZmxpY3Qgc28gZnV0dXJlIGF3YWl0cyBhbHNvIHJlamVjdFxuICAgICAgICBoYXNDb25mbGljdCA9IHRydWU7XG4gICAgICAgIGNvbmZsaWN0RXJyb3JSZWYgPSBjb25mbGljdEVycm9yO1xuICAgICAgICBjb25mbGljdFJ1blJlZiA9IGNyZWF0ZUNvbmZsaWN0aW5nUnVuKFxuICAgICAgICAgIGN0eCxcbiAgICAgICAgICBjb25mbGljdEV2ZW50LmV2ZW50RGF0YS5jb25mbGljdGluZ1J1bklkXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQ2FwdHVyZSBhbmQgZHJhaW4gcGVuZGluZyBwcm9taXNlcyBzeW5jaHJvbm91c2x5IHNvIHRoZSBudWxsIGV2ZW50XG4gICAgICAgIC8vIGhhbmRsZXIgd29uJ3Qgc2VlIHRoZW0gYW5kIHRyaWdnZXIgYSBzcHVyaW91cyBXb3JrZmxvd1N1c3BlbnNpb24uXG4gICAgICAgIC8vIFRoZSBhY3R1YWwgc2V0dGxlbWVudHMgYXJlIGRlZmVycmVkIHRocm91Z2ggcHJvbWlzZVF1ZXVlIGZvclxuICAgICAgICAvLyBvcmRlcmluZy4gUGF5bG9hZCBhd2FpdGVycyByZWplY3Qgd2l0aCBIb29rQ29uZmxpY3RFcnJvciwgd2hpbGVcbiAgICAgICAgLy8gYGdldENvbmZsaWN0YCBhd2FpdGVycyByZXNvbHZlIHdpdGggdGhlIGNvbmZsaWN0aW5nIHJ1biBzbyB0aGVcbiAgICAgICAgLy8gd29ya2Zsb3cgY2FuIGJyYW5jaCBvbiB0aGUgY29uZmxpY3Qgd2l0aG91dCB0aHJvd2luZy4gV2hlbiBub1xuICAgICAgICAvLyByZWFsIGBSdW5gIGNhbiBiZSBjb25zdHJ1Y3RlZCAoc2VlIGBjcmVhdGVDb25mbGljdGluZ1J1bmApLFxuICAgICAgICAvLyBgZ2V0Q29uZmxpY3RgIGF3YWl0ZXJzIHJlamVjdCB3aXRoIHRoZSBIb29rQ29uZmxpY3RFcnJvciBpbnN0ZWFkXG4gICAgICAgIC8vIG9mIHJlc29sdmluZyB3aXRoIGEgdmFsdWUgdGhhdCBkb2Vzbid0IGhvbm9yIHRoZSBgUnVuYCBjb250cmFjdC5cbiAgICAgICAgY29uc3QgcGVuZGluZ1Byb21pc2VzID0gcHJvbWlzZXMuc2xpY2UoKTtcbiAgICAgICAgcHJvbWlzZXMubGVuZ3RoID0gMDtcbiAgICAgICAgY29uc3QgcGVuZGluZ0dldENvbmZsaWN0UHJvbWlzZXMgPSBnZXRDb25mbGljdFByb21pc2VzLnNsaWNlKCk7XG4gICAgICAgIGdldENvbmZsaWN0UHJvbWlzZXMubGVuZ3RoID0gMDtcblxuICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJlc29sdmVyIG9mIHBlbmRpbmdQcm9taXNlcykge1xuICAgICAgICAgICAgcmVzb2x2ZXIucmVqZWN0KGNvbmZsaWN0RXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IHJlc29sdmVyIG9mIHBlbmRpbmdHZXRDb25mbGljdFByb21pc2VzKSB7XG4gICAgICAgICAgICBpZiAoY29uZmxpY3RSdW5SZWYpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZXIucmVzb2x2ZShjb25mbGljdFJ1blJlZik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlci5yZWplY3QoY29uZmxpY3RFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnKSB7XG4gICAgICAgIC8vIERyb3AgZHVwbGljYXRlIGRlbGl2ZXJpZXMgb2YgdGhlIHNhbWUgcmVzdW1lIGF0dGVtcHQgKHNhbWVcbiAgICAgICAgLy8gYHJlc3VtZUlkYDsgc2VlIGBzZWVuUmVzdW1lSWRzYCBhYm92ZSkuIEV2ZW50cyB3aXRob3V0IGFcbiAgICAgICAgLy8gYHJlc3VtZUlkYCAob2xkZXIgU0RLcywgbGVnYWN5IHNwZWMgdmVyc2lvbnMpIGFyZSBuZXZlciBkZWR1cGVkLlxuICAgICAgICAvL1xuICAgICAgICAvLyBEZWR1cCBvZmYgdGhlIHRvcC1sZXZlbCBgcmVzdW1lSWRgIHRoZSBiYWNrZW5kIGhvaXN0cyBvbnRvIHRoZSBldmVudFxuICAgICAgICAvLyBhcyBhIGZpcnN0LWNsYXNzIGNvbHVtbi4gQW4gZWFybGllciB1bnJlbGVhc2VkIGJ1aWxkIGFkZGl0aW9uYWxseVxuICAgICAgICAvLyB3cm90ZSBpdCBuZXN0ZWQgdW5kZXIgYGV2ZW50RGF0YWAsIGJ1dCB0aGF0IGZvcm0gbmV2ZXIgc2hpcHBlZCBhbmQgaXNcbiAgICAgICAgLy8gc3RyaXBwZWQgYnkgYEV2ZW50U2NoZW1hYCBwYXJzaW5nICh0aGUgYGhvb2tfcmVjZWl2ZWRgIGV2ZW50RGF0YVxuICAgICAgICAvLyBzY2hlbWEgZG9lcyBub3QgZGVjbGFyZSBpdCksIHNvIHRoZXJlIGlzIG5vIHBlcnNpc3RlZCBuZXN0ZWQgZm9ybSB0b1xuICAgICAgICAvLyBmYWxsIGJhY2sgdG8uXG4gICAgICAgIGNvbnN0IHJlc3VtZUlkID0gZXZlbnQucmVzdW1lSWQ7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdW1lSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaWYgKHNlZW5SZXN1bWVJZHMuaGFzKHJlc3VtZUlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlZW5SZXN1bWVJZHMuYWRkKHJlc3VtZUlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlZ2lzdGVyIGEgJ2hvb2snIGRlbGl2ZXJ5IGJhcnJpZXIgYXQgdGhpcyBldmVudCdzIGxvZyBpbmRleCBzbyBhXG4gICAgICAgIC8vIGxhdGVyLWluLWxvZyBgd2FpdF9jb21wbGV0ZWRgIG9yIHN0ZXAgcmVzdWx0IGlzIGRlbGl2ZXJlZCBvbmx5IGFmdGVyXG4gICAgICAgIC8vIHRoaXMgaG9vaywgYW5kIHNvIHRoaXMgaG9vayBpcyBkZWxpdmVyZWQgb25seSBhZnRlciBldmVyeVxuICAgICAgICAvLyBlYXJsaWVyLWluLWxvZyBgd2FpdF9jb21wbGV0ZWRgIGFuZCBzdGVwIHJlc3VsdCwga2VlcGluZyBhbnlcbiAgICAgICAgLy8gYFByb21pc2UucmFjZWAgKG9yIGNvbmN1cnJlbnQtYnJhbmNoIFVMSUQgYWxsb2NhdGlvbikgZGV0ZXJtaW5pc3RpY1xuICAgICAgICAvLyBhbmQgYWxpZ25lZCB3aXRoIHRoZSBjb21taXR0ZWQgZXZlbnQgbG9nLCByZWdhcmRsZXNzIG9mXG4gICAgICAgIC8vIG1pY3JvdGFzay1ob3AgY291bnQsIGh5ZHJhdGlvbiB0aW1lLCBvciByYWNlLWFyZ3VtZW50IG9yZGVyLlxuICAgICAgICAvLyBTZWUgYGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVyc2AuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoZSBiYXJyaWVyIGlzIHJlZ2lzdGVyZWQgQVJNRUQgb25seSB3aGVuIGEgY29uc3VtZXIgaXMgYWxyZWFkeVxuICAgICAgICAvLyBhd2FpdGluZywgc28gdGhpcyBwYXlsb2FkIGlzIGNvbW1pdHRlZCB0byByZWFjaGluZyB0aGUgd29ya2Zsb3cuIEFcbiAgICAgICAgLy8gYnVmZmVyZWQgcGF5bG9hZCBpcyByZWdpc3RlcmVkIHVuYXJtZWQgYW5kIGFybWVkIGJ5IGBjbGFpbSgpYDogdW50aWxcbiAgICAgICAgLy8gYSBjb25zdW1lciB0YWtlcyBpdCwgYSBsYXRlciBzdGVwIHJlc3VsdCBtdXN0IG5vdCBiZSBvcmRlcmVkIGJlaGluZFxuICAgICAgICAvLyBpdCAoc2VlIGBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzYCkuXG4gICAgICAgIGNvbnN0IGV2ZW50SW5kZXggPSBjdHguZXZlbnRzQ29uc3VtZXIuZXZlbnRJbmRleDtcbiAgICAgICAgY29uc3QgaGFzV2FpdGluZ0NvbnN1bWVyID0gcHJvbWlzZXMubGVuZ3RoID4gMDtcbiAgICAgICAgY29uc3QgYmFycmllciA9IHJlZ2lzdGVyRGVsaXZlcnlCYXJyaWVyKGN0eCwgZXZlbnRJbmRleCwgJ2hvb2snLCB7XG4gICAgICAgICAgYXJtZWQ6IGhhc1dhaXRpbmdDb25zdW1lcixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGhhc1dhaXRpbmdDb25zdW1lcikge1xuICAgICAgICAgIC8vIEEgY29uc3VtZXIgaXMgYWxyZWFkeSBhd2FpdGluZywgc28gdGhpcyBwYXlsb2FkJ3MgZGVsaXZlcnkgaXNcbiAgICAgICAgICAvLyBwaW5uZWQgdG8gdGhpcyBsb2cgcG9zaXRpb246IGNhcHR1cmUgdGhlIGRlZmVycmFsIEhFUkUsIHdoaWxlXG4gICAgICAgICAgLy8gY29uc3VtaW5nIHRoZSBldmVudCwgbm90IGF0IHRoZSBlbmQgb2YgdGhlIGh5ZHJhdGlvbiBzbG90IGJlbG93OlxuICAgICAgICAgIC8vIHNhbWUgcmVhc29uaW5nIGFzIHN0ZXAudHMuIEFuIGVhcmxpZXIgc3RlcCBvciBob29rIHdob3NlIHNsb3QgcnVuc1xuICAgICAgICAgIC8vIGZpcnN0IG9uIHRoaXMgc2VyaWFsIHF1ZXVlIGhhcyB1c3VhbGx5IGRlbGl2ZXJlZCwgYW5kIHNvXG4gICAgICAgICAgLy8gZGVyZWdpc3RlcmVkIGl0cyBiYXJyaWVyLCBiZWZvcmUgdGhpcyBzbG90IGVuZHMuIFJlYWQgdGhlbiwgaXRcbiAgICAgICAgICAvLyB3b3VsZCBiZSBpbnZpc2libGUgYW5kIHRoaXMgcGF5bG9hZCB3b3VsZCBza2lwIGJvdGggdGhlIGdhdGUgQU5EXG4gICAgICAgICAgLy8gYGF3YWl0RWFybGllckRlbGl2ZXJpZXNgJyBtYWNyb3Rhc2sgeWllbGQsIGxldHRpbmcgaXQgb3ZlcnRha2UgdGhlXG4gICAgICAgICAgLy8gYnJhbmNoIHRoYXQgZWFybGllciBkZWxpdmVyeSBqdXN0IHdva2UuIEV2ZXJ5IGV2ZW50IGluIG9uZSBkcmFpblxuICAgICAgICAgIC8vIHdpbmRvdyBpcyBjb25zdW1lZCBiZWZvcmUgYW55IHNsb3QgcnVucywgc28gY2FwdHVyaW5nIGF0XG4gICAgICAgICAgLy8gY29uc3VtcHRpb24gdGltZSBzZWVzIGFsbCBvZiB0aGVtLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gVGhlIEJVRkZFUkVEIGJyYW5jaCBiZWxvdyBkZWxpYmVyYXRlbHkgZG9lcyBOT1QgZG8gdGhpczsgc2VlIHRoZVxuICAgICAgICAgIC8vIGNvbW1lbnQgb24gYGNsYWltKClgLlxuICAgICAgICAgIGNvbnN0IGVhcmxpZXJEZWxpdmVyZWQgPSBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzKFxuICAgICAgICAgICAgY3R4LFxuICAgICAgICAgICAgZXZlbnRJbmRleCxcbiAgICAgICAgICAgICdob29rJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgbmV4dCA9IHByb21pc2VzLnNoaWZ0KCk7XG4gICAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICAgIC8vIEh5ZHJhdGUgdGhyb3VnaCBhIHByb21pc2VRdWV1ZSBzbG90IChzbyBhc3luYyBkZXNlcmlhbGl6YXRpb25cbiAgICAgICAgICAgIC8vIHN0YXlzIGluIGV2ZW50LWxvZyBvcmRlciksIHRoZW4gZGVmZXIgYmVoaW5kIGVhcmxpZXIgd2FpdHMgYW5kXG4gICAgICAgICAgICAvLyBzdGVwcyBiZWZvcmUgcmVzb2x2aW5nLiBUaGUgZGVmZXJyYWwgcnVucyBPRkYgdGhlIHNlcmlhbCBxdWV1ZVxuICAgICAgICAgICAgLy8gKGl0IG1heSB3YWl0IG9uIGFuIGVhcmxpZXIgd2FpdCBvciBzdGVwIGRlbGl2ZXJ5IGFuZCBibG9ja2luZyBhXG4gICAgICAgICAgICAvLyBxdWV1ZSBzbG90IG9uIHRoYXQgd291bGQgZGVhZGxvY2sgdGhlIHF1ZXVlKS5cbiAgICAgICAgICAgIGN0eC5wZW5kaW5nRGVsaXZlcmllcysrO1xuICAgICAgICAgICAgbGV0IGh5ZHJhdGVPdXRjb21lOlxuICAgICAgICAgICAgICB8IHsgb2s6IHRydWU7IHZhbHVlOiBUIH1cbiAgICAgICAgICAgICAgfCB7IG9rOiBmYWxzZTsgZXJyb3I6IHVua25vd24gfTtcbiAgICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXBhcmVkID1cbiAgICAgICAgICAgICAgICAgIGF3YWl0IGN0eC5yZXBsYXlQYXlsb2FkQ2FjaGUucHJlcGFyZUV2ZW50UGF5bG9hZChcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgJ3BheWxvYWQnLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5ldmVudERhdGEucGF5bG9hZFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgICAgICAgICAgICAgICAgIGV2ZW50LmV2ZW50RGF0YS5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgY3R4LnJ1bklkLFxuICAgICAgICAgICAgICAgICAgY3R4LmVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICBjdHguZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgcHJlcGFyZWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGh5ZHJhdGVPdXRjb21lID0geyBvazogdHJ1ZSwgdmFsdWU6IHBheWxvYWQgYXMgVCB9O1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGh5ZHJhdGVPdXRjb21lID0geyBvazogZmFsc2UsIGVycm9yIH07XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgY3R4LnBlbmRpbmdEZWxpdmVyaWVzLS07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdm9pZCBlYXJsaWVyRGVsaXZlcmVkLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGJhcnJpZXIubWFya0RlbGl2ZXJlZCgpO1xuICAgICAgICAgICAgICAgIGlmIChoeWRyYXRlT3V0Y29tZS5vaykge1xuICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKGh5ZHJhdGVPdXRjb21lLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoaHlkcmF0ZU91dGNvbWUuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm8gY29uc3VtZXIgaXMgYXdhaXRpbmcgeWV0LiBIeWRyYXRlIHRocm91Z2ggYSBwcm9taXNlUXVldWUgc2xvdFxuICAgICAgICAgIC8vIGF0IHRoaXMgbG9nIHBvc2l0aW9uIGFuZCBwYXJrIHRoZSBPVVRDT01FICh2YWx1ZSBvciBlcnJvcikgZm9yIGFcbiAgICAgICAgICAvLyBsYXRlciBgaXRlcmF0b3IubmV4dCgpYCAvIGBhd2FpdCBob29rYCBjbGFpbS4gV2UgY2FwdHVyZSB0aGVcbiAgICAgICAgICAvLyBvdXRjb21lIHJhdGhlciB0aGFuIGVhZ2VybHkgcmVzb2x2aW5nL3JlamVjdGluZyBhIHByb21pc2Ugbm9cbiAgICAgICAgICAvLyBjb25zdW1lciBoYXMgYXR0YWNoZWQgdG86IGEgcmVqZWN0ZWQgdW5jbGFpbWVkIHByb21pc2UgKGUuZy4gYVxuICAgICAgICAgIC8vIGJ1ZmZlcmVkIGVuY3J5cHRlZCBwYXlsb2FkIHdpdGggbm8ga2V5KSB3b3VsZCBvdGhlcndpc2Ugc3VyZmFjZVxuICAgICAgICAgIC8vIGFzIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gYW5kIGNyYXNoIHRoZSBwcm9jZXNzLiBgY2xhaW0oKWAgYnVpbGRzXG4gICAgICAgICAgLy8gdGhlIGNvbnN1bWVyLWZhY2luZyBwcm9taXNlIG9uIGRlbWFuZC5cbiAgICAgICAgICBsZXQgb3V0Y29tZTpcbiAgICAgICAgICAgIHwgeyBvazogdHJ1ZTsgdmFsdWU6IFQgfVxuICAgICAgICAgICAgfCB7IG9rOiBmYWxzZTsgZXJyb3I6IHVua25vd24gfVxuICAgICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgaHlkcmF0ZWQgPSB3aXRoUmVzb2x2ZXJzPHZvaWQ+KCk7XG5cbiAgICAgICAgICBjb25zdCBjbGFpbSA9ICgpOiBQcm9taXNlPFQ+ID0+IHtcbiAgICAgICAgICAgIC8vIEEgY29uc3VtZXIgaGFzIHRha2VuIHRoaXMgcGF5bG9hZCwgc28gaXRzIGRlbGl2ZXJ5IG5vIGxvbmdlclxuICAgICAgICAgICAgLy8gd2FpdHMgb24gd29ya2Zsb3cgY29kZTogbGF0ZXIgc3RlcCByZXN1bHRzIG1heSBub3cgYmUgb3JkZXJlZFxuICAgICAgICAgICAgLy8gYmVoaW5kIGl0LlxuICAgICAgICAgICAgYmFycmllci5hcm0oKTtcbiAgICAgICAgICAgIC8vIFVubGlrZSBldmVyeSBvdGhlciBkZWxpdmVyeSwgdGhlIGRlZmVycmFsIGlzIGV2YWx1YXRlZCBIRVJFLCBhdFxuICAgICAgICAgICAgLy8gY2xhaW0gdGltZSwgcmF0aGVyIHRoYW4gd2hlbiB0aGUgZXZlbnQgd2FzIGNvbnN1bWVkLiBBIGJ1ZmZlcmVkXG4gICAgICAgICAgICAvLyBwYXlsb2FkJ3MgZGVsaXZlcnkgZ2VudWluZWx5IGhhcHBlbnMgd2hlbiB0aGUgd29ya2Zsb3cgcmVhZHMgdGhlXG4gICAgICAgICAgICAvLyBob29rLCB3aGljaCBtYXkgYmUgbWFueSBkZWxpdmVyaWVzIGxhdGVyOyBhIGNvbnN1bXB0aW9uLXRpbWVcbiAgICAgICAgICAgIC8vIHNuYXBzaG90IHdvdWxkIG1ha2UgdGhlIGNsYWltIHdhaXQgb24gKGFuZCBwYXkgdGhlIG1hY3JvdGFza1xuICAgICAgICAgICAgLy8geWllbGQgZm9yKSBiYXJyaWVycyB0aGF0IHdlcmUgcmVsZXZhbnQgdG8gYSBtb21lbnQgdGhpcyBwYXlsb2FkXG4gICAgICAgICAgICAvLyBuZXZlciBwYXJ0aWNpcGF0ZWQgaW4uIFRoYXQgaXMgbm90IHRoZW9yZXRpY2FsOiBpdCBzdGFsbHMgdGhlXG4gICAgICAgICAgICAvLyBzZWNvbmQgcGF5bG9hZCBpbiB0aGUgZTJlIGBob29rV2l0aFNsZWVwV29ya2Zsb3dgIGxvbmcgZW5vdWdoXG4gICAgICAgICAgICAvLyBmb3IgdGhlIHJ1biB0byBzdXNwZW5kIGJlZm9yZSBkZWxpdmVyaW5nIGl0LlxuICAgICAgICAgICAgcmV0dXJuIGh5ZHJhdGVkLnByb21pc2VcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gYXdhaXRFYXJsaWVyRGVsaXZlcmllcyhjdHgsIGV2ZW50SW5kZXgsICdob29rJykpXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBiYXJyaWVyLm1hcmtEZWxpdmVyZWQoKTtcbiAgICAgICAgICAgICAgICBpZiAob3V0Y29tZSAmJiAhb3V0Y29tZS5vaykge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgb3V0Y29tZS5lcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIChvdXRjb21lIGFzIHsgb2s6IHRydWU7IHZhbHVlOiBUIH0pLnZhbHVlO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY3R4LnBlbmRpbmdEZWxpdmVyaWVzKys7XG4gICAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBwcmVwYXJlZCA9IGF3YWl0IGN0eC5yZXBsYXlQYXlsb2FkQ2FjaGUucHJlcGFyZUV2ZW50UGF5bG9hZChcbiAgICAgICAgICAgICAgICBldmVudC5ldmVudElkLFxuICAgICAgICAgICAgICAgICdwYXlsb2FkJyxcbiAgICAgICAgICAgICAgICBldmVudC5ldmVudERhdGEucGF5bG9hZFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgICAgICAgICAgICAgICBldmVudC5ldmVudERhdGEucGF5bG9hZCxcbiAgICAgICAgICAgICAgICBjdHgucnVuSWQsXG4gICAgICAgICAgICAgICAgY3R4LmVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgY3R4Lmdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgcHJlcGFyZWRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgb3V0Y29tZSA9IHsgb2s6IHRydWUsIHZhbHVlOiBwYXlsb2FkIGFzIFQgfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIG91dGNvbWUgPSB7IG9rOiBmYWxzZSwgZXJyb3IgfTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIGN0eC5wZW5kaW5nRGVsaXZlcmllcy0tO1xuICAgICAgICAgICAgICBoeWRyYXRlZC5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcGF5bG9hZHNRdWV1ZS5wdXNoKHsgY2xhaW0gfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnKSB7XG4gICAgICAgIC8vIFRlcm1pbmFsIHN0YXRlIC0gcmVtb3ZlIGZyb20gcXVldWUgKGxpa2Ugc3RlcF9jb21wbGV0ZWQvd2FpdF9jb21wbGV0ZWQpXG4gICAgICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmRlbGV0ZShjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgLy8gTWFyayB0aGF0IHRoZSBldmVudCBsb2cgY29uZmlybXMgZGlzcG9zYWwgaGFwcGVuZWRcbiAgICAgICAgaGFzRGlzcG9zZWRFdmVudCA9IHRydWU7XG4gICAgICAgIC8vIFdlJ3JlIGRvbmUgcHJvY2Vzc2luZyBhbnkgbW9yZSBldmVudHMgZm9yIHRoaXMgaG9va1xuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICAgIH1cblxuICAgICAgLy8gVGhpcyByZXBsYXkgaW5zdGFsbGVkIGEgZGlmZmVyZW50IGNvbnN1bWVyIHRoYW4gdGhlIHN0b3JlZCBldmVudCBuZWVkcy5cbiAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICBjdHgub25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICAgIG5ldyBSZXBsYXlEaXZlcmdlbmNlRXJyb3IoXG4gICAgICAgICAgICBgUmVwbGF5IGRpdmVyZ2VuY2U6IFVuZXhwZWN0ZWQgZXZlbnQgdHlwZSBmb3IgaG9vayAke2NvcnJlbGF0aW9uSWR9ICh0b2tlbjogJHt0b2tlbn0pIFwiJHtldmVudC5ldmVudFR5cGV9XCJgLFxuICAgICAgICAgICAgeyBldmVudElkOiBldmVudC5ldmVudElkIH1cbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgIH0pO1xuXG4gICAgLy8gVHJhY2sgaWYgdGhlIGhvb2sgaGFzIGJlZW4gZGlzcG9zZWRcbiAgICBsZXQgaXNEaXNwb3NlZCA9IGZhbHNlO1xuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBwcm9taXNlIHRoYXQgd2FpdHMgZm9yIHRoZSBuZXh0IGhvb2sgcGF5bG9hZFxuICAgIGZ1bmN0aW9uIGNyZWF0ZUhvb2tQcm9taXNlKCk6IFByb21pc2U8VD4ge1xuICAgICAgY29uc3QgcmVzb2x2ZXJzID0gd2l0aFJlc29sdmVyczxUPigpO1xuXG4gICAgICAvLyBJZiB3ZSBoYXZlIGEgY29uZmxpY3QsIHJlamVjdCB0aHJvdWdoIHRoZSBwcm9taXNlUXVldWUgdG8gbWFpbnRhaW5cbiAgICAgIC8vIGRldGVybWluaXN0aWMgb3JkZXJpbmcgd2l0aCBhbnkgcHJpb3IgcXVldWVkIHJlc29sdXRpb25zLlxuICAgICAgaWYgKGhhc0NvbmZsaWN0ICYmIGNvbmZsaWN0RXJyb3JSZWYpIHtcbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZXJzLnJlamVjdChjb25mbGljdEVycm9yUmVmKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcnMucHJvbWlzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBheWxvYWRzUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBuZXh0RGVsaXZlcnkgPSBwYXlsb2Fkc1F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIGlmIChuZXh0RGVsaXZlcnkpIHtcbiAgICAgICAgICAvLyBUaGUgcGF5bG9hZCB3YXMgaHlkcmF0ZWQgdGhyb3VnaCBhIHByb21pc2VRdWV1ZSBzbG90IGF0IGl0cyBsb2dcbiAgICAgICAgICAvLyBwb3NpdGlvbiAoYnVmZmVyaW5nIGJyYW5jaCBhYm92ZSkuIGBjbGFpbSgpYCBidWlsZHMgdGhlXG4gICAgICAgICAgLy8gY29uc3VtZXItZmFjaW5nIHByb21pc2UgZnJvbSB0aGF0IG91dGNvbWUsIGRlZmVycmluZyBiZWhpbmQgYW55XG4gICAgICAgICAgLy8gZWFybGllci1pbi1sb2cgd2FpdCBvciBzdGVwIGFuZCBtYXJraW5nIHRoaXMgaG9vayBkZWxpdmVyZWQsIHNvXG4gICAgICAgICAgLy8gcmVzb2x1dGlvbiBvcmRlciBzdGF5cyBhbmNob3JlZCB0byB0aGUgZXZlbnQgbG9nLCBub3QgdGhpcyBsYXRlclxuICAgICAgICAgIC8vIGNsYWltIHNpdGUuXG4gICAgICAgICAgcmV0dXJuIG5leHREZWxpdmVyeS5jbGFpbSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudExvZ0VtcHR5KSB7XG4gICAgICAgIHNjaGVkdWxlV2hlbklkbGUoY3R4LCAoKSA9PiB7XG4gICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgIG5ldyBXb3JrZmxvd1N1c3BlbnNpb24oY3R4Lmludm9jYXRpb25zUXVldWUsIGN0eC5nbG9iYWxUaGlzKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBwcm9taXNlcy5wdXNoKHJlc29sdmVycyk7XG5cbiAgICAgIHJldHVybiByZXNvbHZlcnMucHJvbWlzZTtcbiAgICB9XG5cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGhvb2snc1xuICAgIC8vIHJlZ2lzdHJhdGlvbiBvdXRjb21lOiB0aGUgY29uZmxpY3RpbmcgYFJ1bmAgd2hlbiB0aGUgdG9rZW4gaXMgb3duZWRcbiAgICAvLyBieSBhbm90aGVyIGFjdGl2ZSBob29rLCBgbnVsbGAgb25jZSB0aGlzIGhvb2sncyByZWdpc3RyYXRpb24gaXNcbiAgICAvLyBjb21taXR0ZWQuIEJvdGggZmFzdC1wYXRocyBzZXR0bGUgdGhyb3VnaCBgY3R4LnByb21pc2VRdWV1ZWAgc29cbiAgICAvLyByZXNvbHV0aW9uIG9yZGVyIGFsd2F5cyBtYXRjaGVzIGV2ZW50LWxvZyBvcmRlci5cbiAgICBmdW5jdGlvbiBjcmVhdGVHZXRDb25mbGljdFByb21pc2UoKTogUHJvbWlzZTxSdW48dW5rbm93bj4gfCBudWxsPiB7XG4gICAgICBjb25zdCByZXNvbHZlcnMgPSB3aXRoUmVzb2x2ZXJzPFJ1bjx1bmtub3duPiB8IG51bGw+KCk7XG5cbiAgICAgIGlmIChoYXNDcmVhdGVkKSB7XG4gICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmVycy5yZXNvbHZlKG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVycy5wcm9taXNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzQ29uZmxpY3QpIHtcbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgaWYgKGNvbmZsaWN0UnVuUmVmKSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShjb25mbGljdFJ1blJlZik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmVycy5yZWplY3QoY29uZmxpY3RFcnJvclJlZik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVycy5wcm9taXNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICBpZiAocXVldWVJdGVtICYmIHF1ZXVlSXRlbS50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgcXVldWVJdGVtLmhhc0NvbmZsaWN0QXdhaXRlciA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudExvZ0VtcHR5KSB7XG4gICAgICAgIHNjaGVkdWxlV2hlbklkbGUoY3R4LCAoKSA9PiB7XG4gICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgIG5ldyBXb3JrZmxvd1N1c3BlbnNpb24oY3R4Lmludm9jYXRpb25zUXVldWUsIGN0eC5nbG9iYWxUaGlzKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBnZXRDb25mbGljdFByb21pc2VzLnB1c2gocmVzb2x2ZXJzKTtcbiAgICAgIHJldHVybiByZXNvbHZlcnMucHJvbWlzZTtcbiAgICB9XG5cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZGlzcG9zZSB0aGUgaG9va1xuICAgIGZ1bmN0aW9uIGRpc3Bvc2VIb29rKCk6IHZvaWQge1xuICAgICAgaWYgKGlzRGlzcG9zZWQpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBBbHJlYWR5IGRpc3Bvc2VkLCBub3RoaW5nIHRvIGRvXG4gICAgICB9XG4gICAgICBpc0Rpc3Bvc2VkID0gdHJ1ZTtcblxuICAgICAgLy8gSWYgdGhlIGV2ZW50IGxvZyBhbHJlYWR5IGNvbnRhaW5zIGhvb2tfZGlzcG9zZWQsIHRoaXMgaXMgYSByZXBsYXk6IG5vLW9wXG4gICAgICBpZiAoaGFzRGlzcG9zZWRFdmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBkaXNwb3NlZCBmbGFnIG9uIHRoZSBleGlzdGluZyBxdWV1ZSBpdGVtXG4gICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICBpZiAocXVldWVJdGVtICYmIHF1ZXVlSXRlbS50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgcXVldWVJdGVtLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRHJhaW4gYW55IHBlbmRpbmcgcHJvbWlzZXMgdGhhdCBhcmUgd2FpdGluZyBmb3IgcGF5bG9hZHMuXG4gICAgICAvLyBXaXRob3V0IHRoaXMsIHByb21pc2VzIGNyZWF0ZWQgYnkgYGF3YWl0IGhvb2tgIG9yIHRoZSBhc3luYyBpdGVyYXRvcidzXG4gICAgICAvLyBgeWllbGQgYXdhaXQgdGhpc2Agd291bGQgaGFuZyBmb3JldmVyIHNpbmNlIHRoZSBldmVudCBjb25zdW1lciB3aWxsXG4gICAgICAvLyBuZXZlciBkZWxpdmVyIGFub3RoZXIgaG9va19yZWNlaXZlZCBhZnRlciBkaXNwb3NhbC5cbiAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHByb21pc2VzLmxlbmd0aCA9IDA7XG4gICAgICAgIHNjaGVkdWxlV2hlbklkbGUoY3R4LCAoKSA9PiB7XG4gICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgIG5ldyBXb3JrZmxvd1N1c3BlbnNpb24oY3R4Lmludm9jYXRpb25zUXVldWUsIGN0eC5nbG9iYWxUaGlzKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB3ZWJob29rTG9nZ2VyLmRlYnVnKCdIb29rIGRpc3Bvc2VkJywgeyBjb3JyZWxhdGlvbklkLCB0b2tlbiB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBob29rOiBIb29rPFQ+ID0ge1xuICAgICAgdG9rZW4sXG5cbiAgICAgIGdldENvbmZsaWN0KCk6IFByb21pc2U8UnVuPHVua25vd24+IHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gY3JlYXRlR2V0Q29uZmxpY3RQcm9taXNlKCk7XG4gICAgICB9LFxuXG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vVGhlblByb3BlcnR5OiBJbnRlbnRpb25hbGx5IHRoZW5hYmxlXG4gICAgICB0aGVuPFRSZXN1bHQxID0gVCwgVFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgICAgIG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgbnVsbCxcbiAgICAgICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGxcbiAgICAgICk6IFByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgICAgICByZXR1cm4gY3JlYXRlSG9va1Byb21pc2UoKS50aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIFN1cHBvcnQgYGZvciBhd2FpdCAoY29uc3QgcGF5bG9hZCBvZiBob29rKSB7IOKApiB9YCBzeW50YXhcbiAgICAgIGFzeW5jICpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICB3aGlsZSAoIWlzRGlzcG9zZWQpIHtcbiAgICAgICAgICB5aWVsZCBhd2FpdCB0aGlzO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBkaXNwb3NlOiBkaXNwb3NlSG9vayxcblxuICAgICAgW1N5bWJvbC5kaXNwb3NlXTogZGlzcG9zZUhvb2ssXG4gICAgfTtcblxuICAgIC8vIEFsc28gcmVnaXN0ZXIgd2l0aCB0aGUgVk0ncyBTeW1ib2wuZGlzcG9zZSBzbyBgdXNpbmdgIHdvcmtzIGluc2lkZVxuICAgIC8vIHRoZSB3b3JrZmxvdyBzYW5kYm94ICh0aGUgVk0gbWF5IGhhdmUgYSBwb2x5ZmlsbGVkIFN5bWJvbC5kaXNwb3NlXG4gICAgLy8gdGhhdCBkaWZmZXJzIGZyb20gdGhlIGhvc3QncykuXG4gICAgY29uc3Qgdm1EaXNwb3NlID0gY3R4Lmdsb2JhbFRoaXMuU3ltYm9sLmRpc3Bvc2U7XG4gICAgaWYgKHZtRGlzcG9zZSAmJiB2bURpc3Bvc2UgIT09IFN5bWJvbC5kaXNwb3NlKSB7XG4gICAgICAoaG9vayBhcyBhbnkpW3ZtRGlzcG9zZV0gPSBkaXNwb3NlSG9vaztcbiAgICB9XG5cbiAgICByZXR1cm4gaG9vaztcbiAgfTtcbn1cbiJdfQ==
|
|
473
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JrZmxvdy9ob29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsaUJBQWlCLEVBQ2pCLHFCQUFxQixHQUN0QixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFFTCxtQkFBbUIsRUFDbkIsYUFBYSxHQUNkLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWhGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUNMLHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIsMEJBQTBCLEdBRTNCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTdEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FDM0IsR0FBZ0MsRUFDaEMsZ0JBQW9DO0lBRXBDLElBQUksT0FBTyxnQkFBZ0IsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN6QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxxQkFBcUIsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FJdEQsQ0FBQztJQUNkLE1BQU0sV0FBVyxHQUFJLFFBQWdCLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQzlELElBQUksT0FBTyxXQUFXLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDdEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxXQUFXLENBQUMsSUFBSSxD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Q0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsV0FBVztTQUM5QixDQUFDO1FBRUYscUVBQXFFO1FBQ3JFLG9FQUFvRTtRQUNwRSxpQ0FBaUM7UUFDakMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ2hELElBQUksU0FBUyxJQUFJLFNBQVMsS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDN0MsSUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztRQUN6QyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRmF0YWxFcnJvcixcbiAgSG9va0NvbmZsaWN0RXJyb3IsXG4gIFJlcGxheURpdmVyZ2VuY2VFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBXT1JLRkxPV19ERVNFUklBTElaRSB9IGZyb20gJ0B3b3JrZmxvdy9zZXJkZSc7XG5pbXBvcnQge1xuICB0eXBlIFByb21pc2VXaXRoUmVzb2x2ZXJzLFxuICBwYXJzZUR1cmF0aW9uVG9EYXRlLFxuICB3aXRoUmVzb2x2ZXJzLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBIb29rQ29uZmxpY3RFdmVudCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBnZXRTZXJpYWxpemF0aW9uQ2xhc3MsIFJVTl9DTEFTU19JRCB9IGZyb20gJy4uL2NsYXNzLXNlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBIb29rLCBIb29rT3B0aW9ucyB9IGZyb20gJy4uL2NyZWF0ZS1ob29rLmpzJztcbmltcG9ydCB7IEV2ZW50Q29uc3VtZXJSZXN1bHQgfSBmcm9tICcuLi9ldmVudHMtY29uc3VtZXIuanMnO1xuaW1wb3J0IHsgd2ViaG9va0xvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzLFxuICByZWdpc3RlckRlbGl2ZXJ5QmFycmllcixcbiAgc2NoZWR1bGVXb3JrZmxvd1N1c3BlbnNpb24sXG4gIHR5cGUgV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxufSBmcm9tICcuLi9wcml2YXRlLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuIH0gZnJvbSAnLi4vcnVudGltZS9ydW4uanMnO1xuaW1wb3J0IHsgaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZSB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBgUnVuYCBoYW5kbGUgZm9yIHRoZSBydW4gdGhhdCBvd25zIGEgY29uZmxpY3RpbmcgaG9va1xuICogdG9rZW4sIGZvciByZXNvbHV0aW9uIHRocm91Z2ggYGhvb2suZ2V0Q29uZmxpY3QoKWAuXG4gKlxuICogVGhlIGluc3RhbmNlIGlzIGNyZWF0ZWQgdGhyb3VnaCB0aGUgc2VyaWFsaXphdGlvbiBjbGFzcyByZWdpc3RyeSBvblxuICogdGhlIFZNJ3MgZ2xvYmFsVGhpcywgdGhlIHNhbWUgY2hhbm5lbCB0aGF0IHJldml2ZXMgc2VyaWFsaXplZCBgUnVuYFxuICogaW5zdGFuY2VzIChlLmcuIGBzdGFydCgpYCByZXR1cm4gdmFsdWVzIGNyb3NzaW5nIGZyb20gYSBzdGVwIGludG8gdGhlXG4gKiB3b3JrZmxvdykuIFRoZSByZWdpc3RlcmVkIGNsYXNzIGlzIHRoZSBWTSBidW5kbGUncyBwbHVnaW4tY29tcGlsZWRcbiAqIGBSdW5gLCB3aG9zZSBtZXRob2RzIGFyZSBkdXJhYmxlIHN0ZXAgcHJveGllcyAoc2FmZSB0byBjYWxsIGZyb21cbiAqIHdvcmtmbG93IGNvZGUpLCBhbmQgY29uc3RydWN0aW9uIGdvZXMgdGhyb3VnaCBpdHNcbiAqIGBXT1JLRkxPV19ERVNFUklBTElaRWAgaG9vaywgZXhhY3RseSBhcyB0aGUgYEluc3RhbmNlYCByZXZpdmVyIHdvdWxkLlxuICpcbiAqIFJldHVybnMgYG51bGxgIHdoZW4gYSByZWFsIGBSdW5gIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZDogdGhlIGNvbmZsaWN0XG4gKiBldmVudCBsYWNrcyBgY29uZmxpY3RpbmdSdW5JZGAgKHdyaXR0ZW4gYnkgYW4gb2xkIHdvcmxkKSwgb3IgdGhlIFZNJ3NcbiAqIHJlZ2lzdHJ5IGhhcyBubyBgUnVuYCAoYSBjb250ZXh0IHRoYXQgbmV2ZXIgZXZhbHVhdGVkIHRoZVxuICogd29ya2Zsb3ctbW9kZSBgY3JlYXRlLWhvb2tgIG1vZHVsZSwgd2hpY2ggYWxpYXNlcyBpdCB1bmRlclxuICogYFJVTl9DTEFTU19JRGApLiBgZ2V0Q29uZmxpY3RgIGF3YWl0ZXJzIHRoZW4gcmVqZWN0IHdpdGhcbiAqIGBIb29rQ29uZmxpY3RFcnJvcmAgaW5zdGVhZCBvZiByZXNvbHZpbmcgd2l0aCBhIHZhbHVlIHRoYXQgZG9lc24ndFxuICogaG9ub3IgdGhlIGBSdW5gIGNvbnRyYWN0LlxuICovXG5mdW5jdGlvbiBjcmVhdGVDb25mbGljdGluZ1J1bihcbiAgY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG4gIGNvbmZsaWN0aW5nUnVuSWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUnVuPHVua25vd24+IHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgY29uZmxpY3RpbmdSdW5JZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBSdW5DbGFzcyA9IGdldFNlcmlhbGl6YXRpb25DbGFzcyhSVU5fQ0xBU1NfSUQsIGN0eC5nbG9iYWxUaGlzKSBhc1xuICAgIHwgKGFic3RyYWN0IG5ldyAoXG4gICAgICAgIC4uLmFyZ3M6IG5ldmVyXG4gICAgICApID0+IFJ1bjx1bmtub3duPilcbiAgICB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZGVzZXJpYWxpemUgPSAoUnVuQ2xhc3MgYXMgYW55KT8uW1dPUktGTE9XX0RFU0VSSUFMSVpFXTtcbiAgaWYgKHR5cGVvZiBkZXNlcmlhbGl6ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBkZXNlcmlhbGl6ZS5jYWxsKFJ1bkNsYXNzLCB7IHJ1bklkOiBjb25mbGljdGluZ1J1bklkIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ3JlYXRlSG9vayhjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCkge1xuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlSG9va0ltcGw8VCA9IGFueT4ob3B0aW9uczogSG9va09wdGlvbnMgPSB7fSk6IEhvb2s8VD4ge1xuICAgIC8vIFJlamVjdCBhbiBleHBsaWNpdCBlbXB0eS1zdHJpbmcgdG9rZW4uIEEgdG9rZW4gbXVzdCBlaXRoZXIgYmUgb21pdHRlZFxuICAgIC8vIChvciBgdW5kZWZpbmVkYC9gbnVsbGApIHRvIGdldCBhIGdlbmVyYXRlZCBvbmUsIG9yIGJlIGFuXG4gICAgLy8gZXhwbGljaXQgbm9uLWVtcHR5IHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIGFsbW9zdCBhbHdheXMgYW5cbiAgICAvLyBhY2NpZGVudGFsIHZhbHVlIChlLmcuIGFuIHVuc2V0IHZhcmlhYmxlKSBhbmQgd291bGQgb3RoZXJ3aXNlIHNsaXBcbiAgICAvLyB0aHJvdWdoIHRoZSBgPz9gIGJlbG93ICh3aGljaCBvbmx5IGZhbGxzIGJhY2sgZm9yIG51bGxpc2ggdmFsdWVzKSBhbmRcbiAgICAvLyBiZSB1c2VkIGFzIGEgbWVhbmluZ2xlc3MsIG5vbi1kZXRlcm1pbmlzdGljIHRva2VuLlxuICAgIGlmIChvcHRpb25zLnRva2VuID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnYGNyZWF0ZUhvb2soKWAgd2FzIGNhbGxlZCB3aXRoIGFuIGVtcHR5IHN0cmluZyB0b2tlbi4gUGFzcyBhIG5vbi1lbXB0eSB0b2tlbiwgb3Igb21pdCB0aGUgYHRva2VuYCBvcHRpb24gdG8gdXNlIGEgZ2VuZXJhdGVkIG9uZS4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIG9wdGlvbnMuaXNXZWJob29rID09PSB0cnVlICYmXG4gICAgICBvcHRpb25zLmV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb24gIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnV2ViaG9vayBob29rcyBkbyBub3Qgc3VwcG9ydCBgZXhwZXJpbWVudGFsX21pblJldGVudGlvbmAuIFVzZSBhIG5vbi13ZWJob29rIGBjcmVhdGVIb29rKClgIHdpdGggYHJlc3VtZUhvb2soKWAuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBvcHRpb25zLmV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgY3R4LndvcmxkQ2FwYWJpbGl0aWVzPy5ob29rUmV0ZW50aW9uPy5hY3RpdmUgIT09IHRydWVcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICAnVGhlIGNvbmZpZ3VyZWQgV29ybGQgZG9lcyBub3Qgc3VwcG9ydCBgZXhwZXJpbWVudGFsX21pblJldGVudGlvbmAgZm9yIEhvb2tzLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgaG9vayBJRCBhbmQgdG9rZW5cbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gYGhvb2tfJHtjdHguZ2VuZXJhdGVVbGlkKCl9YDtcbiAgICBjb25zdCB0b2tlbiA9IG9wdGlvbnMudG9rZW4gPz8gY3R4LmdlbmVyYXRlTmFub2lkKCk7XG4gICAgY29uc3QgdG9rZW5SZXRlbnRpb25VbnRpbCA9XG4gICAgICBvcHRpb25zLmV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb24gPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IHBhcnNlRHVyYXRpb25Ub0RhdGUob3B0aW9ucy5leHBlcmltZW50YWxfbWluUmV0ZW50aW9uKTtcblxuICAgIC8vIEFkZCBob29rIGNyZWF0aW9uIHRvIGludm9jYXRpb25zIHF1ZXVlICh1c2luZyBNYXAgZm9yIE8oMSkgb3BlcmF0aW9ucylcbiAgICBjb25zdCBpc1dlYmhvb2sgPSBvcHRpb25zLmlzV2ViaG9vayA/PyBmYWxzZTtcblxuICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLnNldChjb3JyZWxhdGlvbklkLCB7XG4gICAgICB0eXBlOiAnaG9vaycsXG4gICAgICBjb3JyZWxhdGlvbklkLFxuICAgICAgdG9rZW4sXG4gICAgICB0b2tlblJldGVudGlvblVudGlsLFxuICAgICAgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsXG4gICAgICBpc1dlYmhvb2ssXG4gICAgfSk7XG5cbiAgICAvLyBRdWV1ZSBvZiBidWZmZXJlZCBob29rIHBheWxvYWRzIChyZWNlaXZlZCBiZWZvcmUgdGhlIHdvcmtmbG93IGF3YWl0ZWRcbiAgICAvLyB0aGUgaG9vaykuIEVhY2ggZW50cnkncyBgY2xhaW0oKWAgYnVpbGRzIHRoZSBjb25zdW1lci1mYWNpbmcgcHJvbWlzZVxuICAgIC8vIGZyb20gdGhlIGNhcHR1cmVkIGh5ZHJhdGlvbiBvdXRjb21lIGFuZCBvcmRlcnMgaXQgZGV0ZXJtaW5pc3RpY2FsbHkgYnlcbiAgICAvLyBldmVudC1sb2cgcG9zaXRpb24gYWdhaW5zdCBhbnkgY29uY3VycmVudCBicmFuY2gtZGVjaWRpbmcgcmVzb2x1dGlvblxuICAgIC8vIChzZWUgYGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVyc2ApLlxuICAgIGNvbnN0IHBheWxvYWRzUXVldWU6IHsgY2xhaW06ICgpID0+IFByb21pc2U8VD4gfVtdID0gW107XG5cbiAgICAvLyBRdWV1ZSBvZiBwcm9taXNlcyB0aGF0IHJlc29sdmUgdG8gdGhlIG5leHQgaG9vayBwYXlsb2FkXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+W10gPSBbXTtcblxuICAgIC8vIFF1ZXVlIG9mIHByb21pc2VzIHRoYXQgcmVzb2x2ZSBvbmNlIGhvb2sgcmVnaXN0cmF0aW9uIGlzIGNvbmZpcm1lZFxuICAgIC8vICh3aXRoIGBudWxsYCkgb3IgYSB0b2tlbiBjb25mbGljdCBpcyBkZXRlY3RlZCAod2l0aCB0aGUgY29uZmxpY3RpbmdcbiAgICAvLyBgUnVuYCkuIFRoZXNlIGJhY2sgdGhlIGBob29rLmdldENvbmZsaWN0KClgIGdldHRlci5cbiAgICBjb25zdCBnZXRDb25mbGljdFByb21pc2VzOiBQcm9taXNlV2l0aFJlc29sdmVyczxSdW48dW5rbm93bj4gfCBudWxsPltdID0gW107XG5cbiAgICBsZXQgZXZlbnRMb2dFbXB0eSA9IGZhbHNlO1xuXG4gICAgLy8gVHJhY2sgaWYgdGhlIGV2ZW50IGxvZyBjb25maXJtcyBob29rIGNyZWF0aW9uIGhhcHBlbmVkXG4gICAgbGV0IGhhc0NyZWF0ZWQgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIHRoZSBldmVudCBsb2cgY29uZmlybXMgZGlzcG9zYWwgaGFwcGVuZWQgKHJlcGxheSBuby1vcClcbiAgICBsZXQgaGFzRGlzcG9zZWRFdmVudCA9IGZhbHNlO1xuXG4gICAgLy8gVHJhY2sgaWYgd2UgaGF2ZSBhIGNvbmZsaWN0IHNvIHdlIGNhbiByZWplY3QgZnV0dXJlIGF3YWl0c1xuICAgIGxldCBoYXNDb25mbGljdCA9IGZhbHNlO1xuICAgIGxldCBjb25mbGljdEVycm9yUmVmOiBIb29rQ29uZmxpY3RFcnJvciB8IG51bGwgPSBudWxsO1xuICAgIC8vIFRoZSBjb25mbGljdGluZyBydW4gaGFuZGxlLCBzaGFyZWQgYnkgZXZlcnkgYGdldENvbmZsaWN0YCBhd2FpdCBzb1xuICAgIC8vIHJlcGVhdGVkIGF3YWl0cyBvYnNlcnZlIHRoZSBzYW1lIGluc3RhbmNlIGRldGVybWluaXN0aWNhbGx5LlxuICAgIGxldCBjb25mbGljdFJ1blJlZjogUnVuPHVua25vd24+IHwgbnVsbCA9IG51bGw7XG5cbiAgICAvLyBMYXp5LXJlc3VtZSBkZWR1cDogYHJlc3VtZUhvb2soKWAgbWludHMgYSBgcmVzdW1lSWRgIHBlciByZXN1bWVcbiAgICAvLyBhdHRlbXB0IGFuZCBzdGFtcHMgaXQgb24gdGhlIGBob29rX3JlY2VpdmVkYCBldmVudC4gV2hlbiB0aGUgZGlyZWN0XG4gICAgLy8gZXZlbnQgd3JpdGUgZmFpbHMgdHJhbnNpZW50bHksIHRoZSBydW50aW1lIG1hdGVyaWFsaXplcyB0aGUgZXZlbnQgZnJvbVxuICAgIC8vIHRoZSBxdWV1ZSBwYXlsb2FkIGluc3RlYWQsIGFuZCBiZWNhdXNlIGBob29rX3JlY2VpdmVkYCBoYXMgbm9cbiAgICAvLyBzdG9yYWdlLWxldmVsIHVuaXF1ZW5lc3MgY29uc3RyYWludCwgY29uY3VycmVudCByZWRlbGl2ZXJ5IG9mIHRoZSBzYW1lXG4gICAgLy8gcXVldWUgbWVzc2FnZSBjYW4gY29tbWl0IHRoYXQgbWF0ZXJpYWxpemF0aW9uIHR3aWNlLiBUd28gcm93cyBmb3IgT05FXG4gICAgLy8gcmVzdW1lIGF0dGVtcHQgdGhlbiBzaGFyZSBhIGByZXN1bWVJZGAgKGRpc3RpbmN0IHJlc3VtZSBhdHRlbXB0cyBuZXZlclxuICAgIC8vIGRvKSwgc28gcmVwbGF5IGRlbGl2ZXJzIG9ubHkgdGhlIGZpcnN0LWluLWxvZyBvY2N1cnJlbmNlLiBUaGlzIGlzIGFcbiAgICAvLyBwdXJlIGZ1bmN0aW9uIG9mIHRoZSBwZXJzaXN0ZWQgZXZlbnQgbG9nLCBrZWVwaW5nIHJlcGxheSBkZXRlcm1pbmlzdGljLlxuICAgIC8vXG4gICAgLy8gU2NvcGU6IHRoaXMgaXMgZGVmZW5zZS1pbi1kZXB0aCBvdmVyIHRoZSBwZXJzaXN0ZWQgbG9nLCBub3QgYVxuICAgIC8vIGNyb3NzLWludm9jYXRpb24gZXhhY3RseS1vbmNlIGd1YXJhbnRlZTogYW4gaW52b2NhdGlvbiByZXBsYXlpbmcgYVxuICAgIC8vIHNuYXBzaG90IHRha2VuIGJlZm9yZSB0aGUgZHVwbGljYXRlIHJvdyBjb21taXR0ZWQgb25seSBzZWVzIG9uZSByb3csXG4gICAgLy8gc28gdHdvIENPTkNVUlJFTlQgaW52b2NhdGlvbnMgY2FuIGVhY2ggZGVsaXZlciBmcm9tIHRoZWlyIG93blxuICAgIC8vIHNuYXBzaG90LiBFdmVyeSByZXBsYXkgZnJvbSBhIGxvZyBjb250YWluaW5nIGJvdGggcm93cyAoaS5lLiBhbGxcbiAgICAvLyBzdWJzZXF1ZW50IGRlbGl2ZXJpZXMpIGRlZHVwcy4gVGhlIGNvcnJlY3RuZXNzIGJvdW5kYXJ5IHRoYXQgY2xvc2VzXG4gICAgLy8gdGhlIGNvbmN1cnJlbnQgd2luZG93IGlzIHRoZSBzdG9yYWdlLWxldmVsIChydW5JZCwgcmVzdW1lSWQpXG4gICAgLy8gY29uc3RyYWludCBhcnJpdmluZyB3aXRoIHRoZSBwYXJhbGxlbC1yZXN1bWUgc3VjY2Vzc29yIHdvcms7IHRoaXMgc2V0XG4gICAgLy8gc3RheXMgdXNlZnVsIGFmdGVyIHRoYXQgbGFuZHMsIGZvciBsb2dzIHdyaXR0ZW4gYmVmb3JlIGl0IGRlcGxveWVkLlxuICAgIGNvbnN0IHNlZW5SZXN1bWVJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHdlYmhvb2tMb2dnZXIuZGVidWcoJ0hvb2sgY29uc3VtZXIgc2V0dXAnLCB7IGNvcnJlbGF0aW9uSWQsIHRva2VuIH0pO1xuICAgIGN0eC5ldmVudHNDb25zdW1lci5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gZXZlbnRzIGFuZCB0aGVyZSBhcmUgcHJvbWlzZXMgd2FpdGluZyxcbiAgICAgIC8vIGl0IG1lYW5zIHRoZSBob29rIGhhcyBiZWVuIGF3YWl0ZWQsIGJ1dCBhbiBpbmNvbWluZyBwYXlsb2FkIGhhcyBub3QgeWV0IGJlZW4gcmVjZWl2ZWQuXG4gICAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSB3b3JrZmxvdyBzaG91bGQgYmUgc3VzcGVuZGVkIHVudGlsIHRoZSBob29rIGlzIHJlc3VtZWQuXG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIGV2ZW50TG9nRW1wdHkgPSB0cnVlO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAocHJvbWlzZXMubGVuZ3RoID4gMCAmJiBwYXlsb2Fkc1F1ZXVlLmxlbmd0aCA9PT0gMCkgfHxcbiAgICAgICAgICAoZ2V0Q29uZmxpY3RQcm9taXNlcy5sZW5ndGggPiAwICYmICFoYXNDcmVhdGVkICYmICFoYXNDb25mbGljdClcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2NoZWR1bGVXb3JrZmxvd1N1c3BlbnNpb24oY3R4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmNvcnJlbGF0aW9uSWQgIT09IGNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgLy8gV2UncmUgbm90IGludGVyZXN0ZWQgaW4gdGhpcyBldmVudCAtIHRoZSBjb3JyZWxhdGlvbklkIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgZW50aXR5XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBldmVudFRva2VuID1cbiAgICAgICAgJ2V2ZW50RGF0YScgaW4gZXZlbnQgJiYgZXZlbnQuZXZlbnREYXRhICYmICd0b2tlbicgaW4gZXZlbnQuZXZlbnREYXRhXG4gICAgICAgICAgPyBldmVudC5ldmVudERhdGEudG9rZW5cbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKHR5cGVvZiBldmVudFRva2VuID09PSAnc3RyaW5nJyAmJiBldmVudFRva2VuICE9PSB0b2tlbikge1xuICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICBjdHgub25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICAgICAgbmV3IFJlcGxheURpdmVyZ2VuY2VFcnJvcihcbiAgICAgICAgICAgICAgYFJlcGxheSBkaXZlcmdlbmNlOiBob29rIGV2ZW50ICR7ZXZlbnQuZXZlbnRUeXBlfSBmb3IgJHtjb3JyZWxhdGlvbklkfSBiZWxvbmdzIHRvIHRva2VuIFwiJHtldmVudFRva2VufVwiLCBidXQgdGhlIGN1cnJlbnQgaG9vayBjb25zdW1lciBleHBlY3RzIFwiJHt0b2tlbn1cImAsXG4gICAgICAgICAgICAgIHsgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3IgaG9va19jcmVhdGVkIGV2ZW50IHRvIG1hcmsgdGhpcyBob29rIGFzIGFscmVhZHkgY3JlYXRlZFxuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcpIHtcbiAgICAgICAgY29uc3QgcXVldWVJdGVtID0gY3R4Lmludm9jYXRpb25zUXVldWUuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBpZiAocXVldWVJdGVtICYmIHF1ZXVlSXRlbS50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgICBxdWV1ZUl0ZW0uaGFzQ3JlYXRlZEV2ZW50ID0gdHJ1ZTtcbiAgICAgICAgICBxdWV1ZUl0ZW0udG9rZW5SZXRlbnRpb25VbnRpbCA9IGV2ZW50LmV2ZW50RGF0YS50b2tlblJldGVudGlvblVudGlsO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NyZWF0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IHBlbmRpbmdHZXRDb25mbGljdFByb21pc2VzID0gZ2V0Q29uZmxpY3RQcm9taXNlcy5zbGljZSgpO1xuICAgICAgICBnZXRDb25mbGljdFByb21pc2VzLmxlbmd0aCA9IDA7XG4gICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3QgcmVzb2x2ZXIgb2YgcGVuZGluZ0dldENvbmZsaWN0UHJvbWlzZXMpIHtcbiAgICAgICAgICAgIHJlc29sdmVyLnJlc29sdmUobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGhvb2tfY29uZmxpY3QgZXZlbnQgLSBhbm90aGVyIHdvcmtmbG93IGlzIHVzaW5nIHRoaXMgdG9rZW5cbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX2NvbmZsaWN0Jykge1xuICAgICAgICAvLyBSZW1vdmUgdGhpcyBob29rIGZyb20gdGhlIGludm9jYXRpb25zIHF1ZXVlXG4gICAgICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmRlbGV0ZShjb3JyZWxhdGlvbklkKTtcblxuICAgICAgICAvLyBTdG9yZSB0aGUgY29uZmxpY3QgZXZlbnQgc28gd2UgY2FuIHJlamVjdCBhbnkgYXdhaXRlZCBwcm9taXNlcy5cbiAgICAgICAgLy8gQ2hhaW4gdGhyb3VnaCBwcm9taXNlUXVldWUgdG8gZW5zdXJlIGRldGVybWluaXN0aWMgb3JkZXJpbmcuXG4gICAgICAgIGNvbnN0IGNvbmZsaWN0RXZlbnQgPSBldmVudCBhcyBIb29rQ29uZmxpY3RFdmVudDtcbiAgICAgICAgY29uc3QgY29uZmxpY3RFcnJvciA9IG5ldyBIb29rQ29uZmxpY3RFcnJvcihcbiAgICAgICAgICBjb25mbGljdEV2ZW50LmV2ZW50RGF0YS50b2tlbixcbiAgICAgICAgICBjb25mbGljdEV2ZW50LmV2ZW50RGF0YS5jb25mbGljdGluZ1J1bklkXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gTWFyayB0aGF0IHdlIGhhdmUgYSBjb25mbGljdCBzbyBmdXR1cmUgYXdhaXRzIGFsc28gcmVqZWN0XG4gICAgICAgIGhhc0NvbmZsaWN0ID0gdHJ1ZTtcbiAgICAgICAgY29uZmxpY3RFcnJvclJlZiA9IGNvbmZsaWN0RXJyb3I7XG4gICAgICAgIGNvbmZsaWN0UnVuUmVmID0gY3JlYXRlQ29uZmxpY3RpbmdSdW4oXG4gICAgICAgICAgY3R4LFxuICAgICAgICAgIGNvbmZsaWN0RXZlbnQuZXZlbnREYXRhLmNvbmZsaWN0aW5nUnVuSWRcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBDYXB0dXJlIGFuZCBkcmFpbiBwZW5kaW5nIHByb21pc2VzIHN5bmNocm9ub3VzbHkgc28gdGhlIG51bGwgZXZlbnRcbiAgICAgICAgLy8gaGFuZGxlciB3b24ndCBzZWUgdGhlbSBhbmQgdHJpZ2dlciBhIHNwdXJpb3VzIFdvcmtmbG93U3VzcGVuc2lvbi5cbiAgICAgICAgLy8gVGhlIGFjdHVhbCBzZXR0bGVtZW50cyBhcmUgZGVmZXJyZWQgdGhyb3VnaCBwcm9taXNlUXVldWUgZm9yXG4gICAgICAgIC8vIG9yZGVyaW5nLiBQYXlsb2FkIGF3YWl0ZXJzIHJlamVjdCB3aXRoIEhvb2tDb25mbGljdEVycm9yLCB3aGlsZVxuICAgICAgICAvLyBgZ2V0Q29uZmxpY3RgIGF3YWl0ZXJzIHJlc29sdmUgd2l0aCB0aGUgY29uZmxpY3RpbmcgcnVuIHNvIHRoZVxuICAgICAgICAvLyB3b3JrZmxvdyBjYW4gYnJhbmNoIG9uIHRoZSBjb25mbGljdCB3aXRob3V0IHRocm93aW5nLiBXaGVuIG5vXG4gICAgICAgIC8vIHJlYWwgYFJ1bmAgY2FuIGJlIGNvbnN0cnVjdGVkIChzZWUgYGNyZWF0ZUNvbmZsaWN0aW5nUnVuYCksXG4gICAgICAgIC8vIGBnZXRDb25mbGljdGAgYXdhaXRlcnMgcmVqZWN0IHdpdGggdGhlIEhvb2tDb25mbGljdEVycm9yIGluc3RlYWRcbiAgICAgICAgLy8gb2YgcmVzb2x2aW5nIHdpdGggYSB2YWx1ZSB0aGF0IGRvZXNuJ3QgaG9ub3IgdGhlIGBSdW5gIGNvbnRyYWN0LlxuICAgICAgICBjb25zdCBwZW5kaW5nUHJvbWlzZXMgPSBwcm9taXNlcy5zbGljZSgpO1xuICAgICAgICBwcm9taXNlcy5sZW5ndGggPSAwO1xuICAgICAgICBjb25zdCBwZW5kaW5nR2V0Q29uZmxpY3RQcm9taXNlcyA9IGdldENvbmZsaWN0UHJvbWlzZXMuc2xpY2UoKTtcbiAgICAgICAgZ2V0Q29uZmxpY3RQcm9taXNlcy5sZW5ndGggPSAwO1xuXG4gICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3QgcmVzb2x2ZXIgb2YgcGVuZGluZ1Byb21pc2VzKSB7XG4gICAgICAgICAgICByZXNvbHZlci5yZWplY3QoY29uZmxpY3RFcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3QgcmVzb2x2ZXIgb2YgcGVuZGluZ0dldENvbmZsaWN0UHJvbWlzZXMpIHtcbiAgICAgICAgICAgIGlmIChjb25mbGljdFJ1blJlZikge1xuICAgICAgICAgICAgICByZXNvbHZlci5yZXNvbHZlKGNvbmZsaWN0UnVuUmVmKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmVyLnJlamVjdChjb25mbGljdEVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19yZWNlaXZlZCcpIHtcbiAgICAgICAgLy8gRHJvcCBkdXBsaWNhdGUgZGVsaXZlcmllcyBvZiB0aGUgc2FtZSByZXN1bWUgYXR0ZW1wdCAoc2FtZVxuICAgICAgICAvLyBgcmVzdW1lSWRgOyBzZWUgYHNlZW5SZXN1bWVJZHNgIGFib3ZlKS4gRXZlbnRzIHdpdGhvdXQgYVxuICAgICAgICAvLyBgcmVzdW1lSWRgIChvbGRlciBTREtzLCBsZWdhY3kgc3BlYyB2ZXJzaW9ucykgYXJlIG5ldmVyIGRlZHVwZWQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIERlZHVwIG9mZiB0aGUgdG9wLWxldmVsIGByZXN1bWVJZGAgdGhlIGJhY2tlbmQgaG9pc3RzIG9udG8gdGhlIGV2ZW50XG4gICAgICAgIC8vIGFzIGEgZmlyc3QtY2xhc3MgY29sdW1uLiBBbiBlYXJsaWVyIHVucmVsZWFzZWQgYnVpbGQgYWRkaXRpb25hbGx5XG4gICAgICAgIC8vIHdyb3RlIGl0IG5lc3RlZCB1bmRlciBgZXZlbnREYXRhYCwgYnV0IHRoYXQgZm9ybSBuZXZlciBzaGlwcGVkIGFuZCBpc1xuICAgICAgICAvLyBzdHJpcHBlZCBieSBgRXZlbnRTY2hlbWFgIHBhcnNpbmcgKHRoZSBgaG9va19yZWNlaXZlZGAgZXZlbnREYXRhXG4gICAgICAgIC8vIHNjaGVtYSBkb2VzIG5vdCBkZWNsYXJlIGl0KSwgc28gdGhlcmUgaXMgbm8gcGVyc2lzdGVkIG5lc3RlZCBmb3JtIHRvXG4gICAgICAgIC8vIGZhbGwgYmFjayB0by5cbiAgICAgICAgY29uc3QgcmVzdW1lSWQgPSBldmVudC5yZXN1bWVJZDtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bWVJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAoc2VlblJlc3VtZUlkcy5oYXMocmVzdW1lSWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VlblJlc3VtZUlkcy5hZGQocmVzdW1lSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgYSAnaG9vaycgZGVsaXZlcnkgYmFycmllciBhdCB0aGlzIGV2ZW50J3MgbG9nIGluZGV4IHNvIGFcbiAgICAgICAgLy8gbGF0ZXItaW4tbG9nIGB3YWl0X2NvbXBsZXRlZGAgb3Igc3RlcCByZXN1bHQgaXMgZGVsaXZlcmVkIG9ubHkgYWZ0ZXJcbiAgICAgICAgLy8gdGhpcyBob29rLCBhbmQgc28gdGhpcyBob29rIGlzIGRlbGl2ZXJlZCBvbmx5IGFmdGVyIGV2ZXJ5XG4gICAgICAgIC8vIGVhcmxpZXItaW4tbG9nIGB3YWl0X2NvbXBsZXRlZGAgYW5kIHN0ZXAgcmVzdWx0LCBrZWVwaW5nIGFueVxuICAgICAgICAvLyBgUHJvbWlzZS5yYWNlYCAob3IgY29uY3VycmVudC1icmFuY2ggVUxJRCBhbGxvY2F0aW9uKSBkZXRlcm1pbmlzdGljXG4gICAgICAgIC8vIGFuZCBhbGlnbmVkIHdpdGggdGhlIGNvbW1pdHRlZCBldmVudCBsb2csIHJlZ2FyZGxlc3Mgb2ZcbiAgICAgICAgLy8gbWljcm90YXNrLWhvcCBjb3VudCwgaHlkcmF0aW9uIHRpbWUsIG9yIHJhY2UtYXJndW1lbnQgb3JkZXIuXG4gICAgICAgIC8vIFNlZSBgY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzYC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlIGJhcnJpZXIgaXMgcmVnaXN0ZXJlZCBBUk1FRCBvbmx5IHdoZW4gYSBjb25zdW1lciBpcyBhbHJlYWR5XG4gICAgICAgIC8vIGF3YWl0aW5nLCBzbyB0aGlzIHBheWxvYWQgaXMgY29tbWl0dGVkIHRvIHJlYWNoaW5nIHRoZSB3b3JrZmxvdy4gQVxuICAgICAgICAvLyBidWZmZXJlZCBwYXlsb2FkIGlzIHJlZ2lzdGVyZWQgdW5hcm1lZCBhbmQgYXJtZWQgYnkgYGNsYWltKClgOiB1bnRpbFxuICAgICAgICAvLyBhIGNvbnN1bWVyIHRha2VzIGl0LCBhIGxhdGVyIHN0ZXAgcmVzdWx0IG11c3Qgbm90IGJlIG9yZGVyZWQgYmVoaW5kXG4gICAgICAgIC8vIGl0IChzZWUgYGF3YWl0RWFybGllckRlbGl2ZXJpZXNgKS5cbiAgICAgICAgY29uc3QgZXZlbnRJbmRleCA9IGN0eC5ldmVudHNDb25zdW1lci5ldmVudEluZGV4O1xuICAgICAgICBjb25zdCBoYXNXYWl0aW5nQ29uc3VtZXIgPSBwcm9taXNlcy5sZW5ndGggPiAwO1xuICAgICAgICBjb25zdCBiYXJyaWVyID0gcmVnaXN0ZXJEZWxpdmVyeUJhcnJpZXIoY3R4LCBldmVudEluZGV4LCAnaG9vaycsIHtcbiAgICAgICAgICBhcm1lZDogaGFzV2FpdGluZ0NvbnN1bWVyLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaGFzV2FpdGluZ0NvbnN1bWVyKSB7XG4gICAgICAgICAgLy8gQSBjb25zdW1lciBpcyBhbHJlYWR5IGF3YWl0aW5nLCBzbyB0aGlzIHBheWxvYWQncyBkZWxpdmVyeSBpc1xuICAgICAgICAgIC8vIHBpbm5lZCB0byB0aGlzIGxvZyBwb3NpdGlvbjogY2FwdHVyZSB0aGUgZGVmZXJyYWwgSEVSRSwgd2hpbGVcbiAgICAgICAgICAvLyBjb25zdW1pbmcgdGhlIGV2ZW50LCBub3QgYXQgdGhlIGVuZCBvZiB0aGUgaHlkcmF0aW9uIHNsb3QgYmVsb3c6XG4gICAgICAgICAgLy8gc2FtZSByZWFzb25pbmcgYXMgc3RlcC50cy4gQW4gZWFybGllciBzdGVwIG9yIGhvb2sgd2hvc2Ugc2xvdCBydW5zXG4gICAgICAgICAgLy8gZmlyc3Qgb24gdGhpcyBzZXJpYWwgcXVldWUgaGFzIHVzdWFsbHkgZGVsaXZlcmVkLCBhbmQgc29cbiAgICAgICAgICAvLyBkZXJlZ2lzdGVyZWQgaXRzIGJhcnJpZXIsIGJlZm9yZSB0aGlzIHNsb3QgZW5kcy4gUmVhZCB0aGVuLCBpdFxuICAgICAgICAgIC8vIHdvdWxkIGJlIGludmlzaWJsZSBhbmQgdGhpcyBwYXlsb2FkIHdvdWxkIHNraXAgYm90aCB0aGUgZ2F0ZSBBTkRcbiAgICAgICAgICAvLyBgYXdhaXRFYXJsaWVyRGVsaXZlcmllc2AnIG1hY3JvdGFzayB5aWVsZCwgbGV0dGluZyBpdCBvdmVydGFrZSB0aGVcbiAgICAgICAgICAvLyBicmFuY2ggdGhhdCBlYXJsaWVyIGRlbGl2ZXJ5IGp1c3Qgd29rZS4gRXZlcnkgZXZlbnQgaW4gb25lIGRyYWluXG4gICAgICAgICAgLy8gd2luZG93IGlzIGNvbnN1bWVkIGJlZm9yZSBhbnkgc2xvdCBydW5zLCBzbyBjYXB0dXJpbmcgYXRcbiAgICAgICAgICAvLyBjb25zdW1wdGlvbiB0aW1lIHNlZXMgYWxsIG9mIHRoZW0uXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGUgQlVGRkVSRUQgYnJhbmNoIGJlbG93IGRlbGliZXJhdGVseSBkb2VzIE5PVCBkbyB0aGlzOyBzZWUgdGhlXG4gICAgICAgICAgLy8gY29tbWVudCBvbiBgY2xhaW0oKWAuXG4gICAgICAgICAgY29uc3QgZWFybGllckRlbGl2ZXJlZCA9IGF3YWl0RWFybGllckRlbGl2ZXJpZXMoXG4gICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICBldmVudEluZGV4LFxuICAgICAgICAgICAgJ2hvb2snXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gcHJvbWlzZXMuc2hpZnQoKTtcbiAgICAgICAgICBpZiAobmV4dCkge1xuICAgICAgICAgICAgLy8gSHlkcmF0ZSB0aHJvdWdoIGEgcHJvbWlzZVF1ZXVlIHNsb3QgKHNvIGFzeW5jIGRlc2VyaWFsaXphdGlvblxuICAgICAgICAgICAgLy8gc3RheXMgaW4gZXZlbnQtbG9nIG9yZGVyKSwgdGhlbiBkZWZlciBiZWhpbmQgZWFybGllciB3YWl0cyBhbmRcbiAgICAgICAgICAgIC8vIHN0ZXBzIGJlZm9yZSByZXNvbHZpbmcuIFRoZSBkZWZlcnJhbCBydW5zIE9GRiB0aGUgc2VyaWFsIHF1ZXVlXG4gICAgICAgICAgICAvLyAoaXQgbWF5IHdhaXQgb24gYW4gZWFybGllciB3YWl0IG9yIHN0ZXAgZGVsaXZlcnkgYW5kIGJsb2NraW5nIGFcbiAgICAgICAgICAgIC8vIHF1ZXVlIHNsb3Qgb24gdGhhdCB3b3VsZCBkZWFkbG9jayB0aGUgcXVldWUpLlxuICAgICAgICAgICAgY3R4LnBlbmRpbmdEZWxpdmVyaWVzKys7XG4gICAgICAgICAgICBsZXQgaHlkcmF0ZU91dGNvbWU6XG4gICAgICAgICAgICAgIHwgeyBvazogdHJ1ZTsgdmFsdWU6IFQgfVxuICAgICAgICAgICAgICB8IHsgb2s6IGZhbHNlOyBlcnJvcjogdW5rbm93biB9O1xuICAgICAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJlcGFyZWQgPVxuICAgICAgICAgICAgICAgICAgYXdhaXQgY3R4LnJlcGxheVBheWxvYWRDYWNoZS5wcmVwYXJlRXZlbnRQYXlsb2FkKFxuICAgICAgICAgICAgICAgICAgICBldmVudC5ldmVudElkLFxuICAgICAgICAgICAgICAgICAgICAncGF5bG9hZCcsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LmV2ZW50RGF0YS5wYXlsb2FkXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICAgICAgICAgICAgICAgICAgZXZlbnQuZXZlbnREYXRhLnBheWxvYWQsXG4gICAgICAgICAgICAgICAgICBjdHgucnVuSWQsXG4gICAgICAgICAgICAgICAgICBjdHguZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgIGN0eC5nbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgICBwcmVwYXJlZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaHlkcmF0ZU91dGNvbWUgPSB7IG9rOiB0cnVlLCB2YWx1ZTogcGF5bG9hZCBhcyBUIH07XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaHlkcmF0ZU91dGNvbWUgPSB7IG9rOiBmYWxzZSwgZXJyb3IgfTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMtLTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2b2lkIGVhcmxpZXJEZWxpdmVyZWQudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgYmFycmllci5tYXJrRGVsaXZlcmVkKCk7XG4gICAgICAgICAgICAgICAgaWYgKGh5ZHJhdGVPdXRjb21lLm9rKSB7XG4gICAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUoaHlkcmF0ZU91dGNvbWUudmFsdWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBuZXh0LnJlamVjdChoeWRyYXRlT3V0Y29tZS5lcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBObyBjb25zdW1lciBpcyBhd2FpdGluZyB5ZXQuIEh5ZHJhdGUgdGhyb3VnaCBhIHByb21pc2VRdWV1ZSBzbG90XG4gICAgICAgICAgLy8gYXQgdGhpcyBsb2cgcG9zaXRpb24gYW5kIHBhcmsgdGhlIE9VVENPTUUgKHZhbHVlIG9yIGVycm9yKSBmb3IgYVxuICAgICAgICAgIC8vIGxhdGVyIGBpdGVyYXRvci5uZXh0KClgIC8gYGF3YWl0IGhvb2tgIGNsYWltLiBXZSBjYXB0dXJlIHRoZVxuICAgICAgICAgIC8vIG91dGNvbWUgcmF0aGVyIHRoYW4gZWFnZXJseSByZXNvbHZpbmcvcmVqZWN0aW5nIGEgcHJvbWlzZSBub1xuICAgICAgICAgIC8vIGNvbnN1bWVyIGhhcyBhdHRhY2hlZCB0bzogYSByZWplY3RlZCB1bmNsYWltZWQgcHJvbWlzZSAoZS5nLiBhXG4gICAgICAgICAgLy8gYnVmZmVyZWQgZW5jcnlwdGVkIHBheWxvYWQgd2l0aCBubyBrZXkpIHdvdWxkIG90aGVyd2lzZSBzdXJmYWNlXG4gICAgICAgICAgLy8gYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbiBhbmQgY3Jhc2ggdGhlIHByb2Nlc3MuIGBjbGFpbSgpYCBidWlsZHNcbiAgICAgICAgICAvLyB0aGUgY29uc3VtZXItZmFjaW5nIHByb21pc2Ugb24gZGVtYW5kLlxuICAgICAgICAgIGxldCBvdXRjb21lOlxuICAgICAgICAgICAgfCB7IG9rOiB0cnVlOyB2YWx1ZTogVCB9XG4gICAgICAgICAgICB8IHsgb2s6IGZhbHNlOyBlcnJvcjogdW5rbm93biB9XG4gICAgICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCBoeWRyYXRlZCA9IHdpdGhSZXNvbHZlcnM8dm9pZD4oKTtcblxuICAgICAgICAgIGNvbnN0IGNsYWltID0gKCk6IFByb21pc2U8VD4gPT4ge1xuICAgICAgICAgICAgLy8gQSBjb25zdW1lciBoYXMgdGFrZW4gdGhpcyBwYXlsb2FkLCBzbyBpdHMgZGVsaXZlcnkgbm8gbG9uZ2VyXG4gICAgICAgICAgICAvLyB3YWl0cyBvbiB3b3JrZmxvdyBjb2RlOiBsYXRlciBzdGVwIHJlc3VsdHMgbWF5IG5vdyBiZSBvcmRlcmVkXG4gICAgICAgICAgICAvLyBiZWhpbmQgaXQuXG4gICAgICAgICAgICBiYXJyaWVyLmFybSgpO1xuICAgICAgICAgICAgLy8gVW5saWtlIGV2ZXJ5IG90aGVyIGRlbGl2ZXJ5LCB0aGUgZGVmZXJyYWwgaXMgZXZhbHVhdGVkIEhFUkUsIGF0XG4gICAgICAgICAgICAvLyBjbGFpbSB0aW1lLCByYXRoZXIgdGhhbiB3aGVuIHRoZSBldmVudCB3YXMgY29uc3VtZWQuIEEgYnVmZmVyZWRcbiAgICAgICAgICAgIC8vIHBheWxvYWQncyBkZWxpdmVyeSBnZW51aW5lbHkgaGFwcGVucyB3aGVuIHRoZSB3b3JrZmxvdyByZWFkcyB0aGVcbiAgICAgICAgICAgIC8vIGhvb2ssIHdoaWNoIG1heSBiZSBtYW55IGRlbGl2ZXJpZXMgbGF0ZXI7IGEgY29uc3VtcHRpb24tdGltZVxuICAgICAgICAgICAgLy8gc25hcHNob3Qgd291bGQgbWFrZSB0aGUgY2xhaW0gd2FpdCBvbiAoYW5kIHBheSB0aGUgbWFjcm90YXNrXG4gICAgICAgICAgICAvLyB5aWVsZCBmb3IpIGJhcnJpZXJzIHRoYXQgd2VyZSByZWxldmFudCB0byBhIG1vbWVudCB0aGlzIHBheWxvYWRcbiAgICAgICAgICAgIC8vIG5ldmVyIHBhcnRpY2lwYXRlZCBpbi4gVGhhdCBpcyBub3QgdGhlb3JldGljYWw6IGl0IHN0YWxscyB0aGVcbiAgICAgICAgICAgIC8vIHNlY29uZCBwYXlsb2FkIGluIHRoZSBlMmUgYGhvb2tXaXRoU2xlZXBXb3JrZmxvd2AgbG9uZyBlbm91Z2hcbiAgICAgICAgICAgIC8vIGZvciB0aGUgcnVuIHRvIHN1c3BlbmQgYmVmb3JlIGRlbGl2ZXJpbmcgaXQuXG4gICAgICAgICAgICByZXR1cm4gaHlkcmF0ZWQucHJvbWlzZVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzKGN0eCwgZXZlbnRJbmRleCwgJ2hvb2snKSlcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGJhcnJpZXIubWFya0RlbGl2ZXJlZCgpO1xuICAgICAgICAgICAgICAgIGlmIChvdXRjb21lICYmICFvdXRjb21lLm9rKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBvdXRjb21lLmVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gKG91dGNvbWUgYXMgeyBvazogdHJ1ZTsgdmFsdWU6IFQgfSkudmFsdWU7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMrKztcbiAgICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHByZXBhcmVkID0gYXdhaXQgY3R4LnJlcGxheVBheWxvYWRDYWNoZS5wcmVwYXJlRXZlbnRQYXlsb2FkKFxuICAgICAgICAgICAgICAgIGV2ZW50LmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgJ3BheWxvYWQnLFxuICAgICAgICAgICAgICAgIGV2ZW50LmV2ZW50RGF0YS5wYXlsb2FkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICAgICAgICAgICAgICAgIGV2ZW50LmV2ZW50RGF0YS5wYXlsb2FkLFxuICAgICAgICAgICAgICAgIGN0eC5ydW5JZCxcbiAgICAgICAgICAgICAgICBjdHguZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICBjdHguZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICBwcmVwYXJlZFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBvdXRjb21lID0geyBvazogdHJ1ZSwgdmFsdWU6IHBheWxvYWQgYXMgVCB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgb3V0Y29tZSA9IHsgb2s6IGZhbHNlLCBlcnJvciB9O1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgY3R4LnBlbmRpbmdEZWxpdmVyaWVzLS07XG4gICAgICAgICAgICAgIGh5ZHJhdGVkLnJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwYXlsb2Fkc1F1ZXVlLnB1c2goeyBjbGFpbSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19kaXNwb3NlZCcpIHtcbiAgICAgICAgLy8gVGVybWluYWwgc3RhdGUgLSByZW1vdmUgZnJvbSBxdWV1ZSAobGlrZSBzdGVwX2NvbXBsZXRlZC93YWl0X2NvbXBsZXRlZClcbiAgICAgICAgY3R4Lmludm9jYXRpb25zUXVldWUuZGVsZXRlKGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAvLyBNYXJrIHRoYXQgdGhlIGV2ZW50IGxvZyBjb25maXJtcyBkaXNwb3NhbCBoYXBwZW5lZFxuICAgICAgICBoYXNEaXNwb3NlZEV2ZW50ID0gdHJ1ZTtcbiAgICAgICAgLy8gV2UncmUgZG9uZSBwcm9jZXNzaW5nIGFueSBtb3JlIGV2ZW50cyBmb3IgdGhpcyBob29rXG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIHJlcGxheSBpbnN0YWxsZWQgYSBkaWZmZXJlbnQgY29uc3VtZXIgdGhhbiB0aGUgc3RvcmVkIGV2ZW50IG5lZWRzLlxuICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgbmV3IFJlcGxheURpdmVyZ2VuY2VFcnJvcihcbiAgICAgICAgICAgIGBSZXBsYXkgZGl2ZXJnZW5jZTogVW5leHBlY3RlZCBldmVudCB0eXBlIGZvciBob29rICR7Y29ycmVsYXRpb25JZH0gKHRva2VuOiAke3Rva2VufSkgXCIke2V2ZW50LmV2ZW50VHlwZX1cImAsXG4gICAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgfSk7XG5cbiAgICAvLyBUcmFjayBpZiB0aGUgaG9vayBoYXMgYmVlbiBkaXNwb3NlZFxuICAgIGxldCBpc0Rpc3Bvc2VkID0gZmFsc2U7XG5cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IHByb21pc2UgdGhhdCB3YWl0cyBmb3IgdGhlIG5leHQgaG9vayBwYXlsb2FkXG4gICAgZnVuY3Rpb24gY3JlYXRlSG9va1Byb21pc2UoKTogUHJvbWlzZTxUPiB7XG4gICAgICBjb25zdCByZXNvbHZlcnMgPSB3aXRoUmVzb2x2ZXJzPFQ+KCk7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYSBjb25mbGljdCwgcmVqZWN0IHRocm91Z2ggdGhlIHByb21pc2VRdWV1ZSB0byBtYWludGFpblxuICAgICAgLy8gZGV0ZXJtaW5pc3RpYyBvcmRlcmluZyB3aXRoIGFueSBwcmlvciBxdWV1ZWQgcmVzb2x1dGlvbnMuXG4gICAgICBpZiAoaGFzQ29uZmxpY3QgJiYgY29uZmxpY3RFcnJvclJlZikge1xuICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KGNvbmZsaWN0RXJyb3JSZWYpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVycy5wcm9taXNlO1xuICAgICAgfVxuXG4gICAgICBpZiAocGF5bG9hZHNRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5leHREZWxpdmVyeSA9IHBheWxvYWRzUXVldWUuc2hpZnQoKTtcbiAgICAgICAgaWYgKG5leHREZWxpdmVyeSkge1xuICAgICAgICAgIC8vIFRoZSBwYXlsb2FkIHdhcyBoeWRyYXRlZCB0aHJvdWdoIGEgcHJvbWlzZVF1ZXVlIHNsb3QgYXQgaXRzIGxvZ1xuICAgICAgICAgIC8vIHBvc2l0aW9uIChidWZmZXJpbmcgYnJhbmNoIGFib3ZlKS4gYGNsYWltKClgIGJ1aWxkcyB0aGVcbiAgICAgICAgICAvLyBjb25zdW1lci1mYWNpbmcgcHJvbWlzZSBmcm9tIHRoYXQgb3V0Y29tZSwgZGVmZXJyaW5nIGJlaGluZCBhbnlcbiAgICAgICAgICAvLyBlYXJsaWVyLWluLWxvZyB3YWl0IG9yIHN0ZXAgYW5kIG1hcmtpbmcgdGhpcyBob29rIGRlbGl2ZXJlZCwgc29cbiAgICAgICAgICAvLyByZXNvbHV0aW9uIG9yZGVyIHN0YXlzIGFuY2hvcmVkIHRvIHRoZSBldmVudCBsb2csIG5vdCB0aGlzIGxhdGVyXG4gICAgICAgICAgLy8gY2xhaW0gc2l0ZS5cbiAgICAgICAgICByZXR1cm4gbmV4dERlbGl2ZXJ5LmNsYWltKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50TG9nRW1wdHkpIHtcbiAgICAgICAgc2NoZWR1bGVXb3JrZmxvd1N1c3BlbnNpb24oY3R4KTtcbiAgICAgIH1cblxuICAgICAgcHJvbWlzZXMucHVzaChyZXNvbHZlcnMpO1xuXG4gICAgICByZXR1cm4gcmVzb2x2ZXJzLnByb21pc2U7XG4gICAgfVxuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBob29rJ3NcbiAgICAvLyByZWdpc3RyYXRpb24gb3V0Y29tZTogdGhlIGNvbmZsaWN0aW5nIGBSdW5gIHdoZW4gdGhlIHRva2VuIGlzIG93bmVkXG4gICAgLy8gYnkgYW5vdGhlciBhY3RpdmUgaG9vaywgYG51bGxgIG9uY2UgdGhpcyBob29rJ3MgcmVnaXN0cmF0aW9uIGlzXG4gICAgLy8gY29tbWl0dGVkLiBCb3RoIGZhc3QtcGF0aHMgc2V0dGxlIHRocm91Z2ggYGN0eC5wcm9taXNlUXVldWVgIHNvXG4gICAgLy8gcmVzb2x1dGlvbiBvcmRlciBhbHdheXMgbWF0Y2hlcyBldmVudC1sb2cgb3JkZXIuXG4gICAgZnVuY3Rpb24gY3JlYXRlR2V0Q29uZmxpY3RQcm9taXNlKCk6IFByb21pc2U8UnVuPHVua25vd24+IHwgbnVsbD4ge1xuICAgICAgY29uc3QgcmVzb2x2ZXJzID0gd2l0aFJlc29sdmVyczxSdW48dW5rbm93bj4gfCBudWxsPigpO1xuXG4gICAgICBpZiAoaGFzQ3JlYXRlZCkge1xuICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcnMucHJvbWlzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0NvbmZsaWN0KSB7XG4gICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGlmIChjb25mbGljdFJ1blJlZikge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoY29uZmxpY3RSdW5SZWYpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KGNvbmZsaWN0RXJyb3JSZWYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcnMucHJvbWlzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVldWVJdGVtID0gY3R4Lmludm9jYXRpb25zUXVldWUuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICAgICAgaWYgKHF1ZXVlSXRlbSAmJiBxdWV1ZUl0ZW0udHlwZSA9PT0gJ2hvb2snKSB7XG4gICAgICAgIHF1ZXVlSXRlbS5oYXNDb25mbGljdEF3YWl0ZXIgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRMb2dFbXB0eSkge1xuICAgICAgICBzY2hlZHVsZVdvcmtmbG93U3VzcGVuc2lvbihjdHgpO1xuICAgICAgfVxuXG4gICAgICBnZXRDb25mbGljdFByb21pc2VzLnB1c2gocmVzb2x2ZXJzKTtcbiAgICAgIHJldHVybiByZXNvbHZlcnMucHJvbWlzZTtcbiAgICB9XG5cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZGlzcG9zZSB0aGUgaG9va1xuICAgIGZ1bmN0aW9uIGRpc3Bvc2VIb29rKCk6IHZvaWQge1xuICAgICAgaWYgKGlzRGlzcG9zZWQpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBBbHJlYWR5IGRpc3Bvc2VkLCBub3RoaW5nIHRvIGRvXG4gICAgICB9XG4gICAgICBpc0Rpc3Bvc2VkID0gdHJ1ZTtcblxuICAgICAgLy8gSWYgdGhlIGV2ZW50IGxvZyBhbHJlYWR5IGNvbnRhaW5zIGhvb2tfZGlzcG9zZWQsIHRoaXMgaXMgYSByZXBsYXk6IG5vLW9wXG4gICAgICBpZiAoaGFzRGlzcG9zZWRFdmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBkaXNwb3NlZCBmbGFnIG9uIHRoZSBleGlzdGluZyBxdWV1ZSBpdGVtXG4gICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICBpZiAocXVldWVJdGVtICYmIHF1ZXVlSXRlbS50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgcXVldWVJdGVtLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRHJhaW4gYW55IHBlbmRpbmcgcHJvbWlzZXMgdGhhdCBhcmUgd2FpdGluZyBmb3IgcGF5bG9hZHMuXG4gICAgICAvLyBXaXRob3V0IHRoaXMsIHByb21pc2VzIGNyZWF0ZWQgYnkgYGF3YWl0IGhvb2tgIG9yIHRoZSBhc3luYyBpdGVyYXRvcidzXG4gICAgICAvLyBgeWllbGQgYXdhaXQgdGhpc2Agd291bGQgaGFuZyBmb3JldmVyIHNpbmNlIHRoZSBldmVudCBjb25zdW1lciB3aWxsXG4gICAgICAvLyBuZXZlciBkZWxpdmVyIGFub3RoZXIgaG9va19yZWNlaXZlZCBhZnRlciBkaXNwb3NhbC5cbiAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHByb21pc2VzLmxlbmd0aCA9IDA7XG4gICAgICAgIHNjaGVkdWxlV29ya2Zsb3dTdXNwZW5zaW9uKGN0eCk7XG4gICAgICB9XG5cbiAgICAgIHdlYmhvb2tMb2dnZXIuZGVidWcoJ0hvb2sgZGlzcG9zZWQnLCB7IGNvcnJlbGF0aW9uSWQsIHRva2VuIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGhvb2s6IEhvb2s8VD4gPSB7XG4gICAgICB0b2tlbixcblxuICAgICAgZ2V0Q29uZmxpY3QoKTogUHJvbWlzZTxSdW48dW5rbm93bj4gfCBudWxsPiB7XG4gICAgICAgIHJldHVybiBjcmVhdGVHZXRDb25mbGljdFByb21pc2UoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9UaGVuUHJvcGVydHk6IEludGVudGlvbmFsbHkgdGhlbmFibGVcbiAgICAgIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihcbiAgICAgICAgb25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBUKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPikgfCBudWxsLFxuICAgICAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgbnVsbFxuICAgICAgKTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgICAgIHJldHVybiBjcmVhdGVIb29rUHJvbWlzZSgpLnRoZW4ob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpO1xuICAgICAgfSxcblxuICAgICAgLy8gU3VwcG9ydCBgZm9yIGF3YWl0IChjb25zdCBwYXlsb2FkIG9mIGhvb2spIHsg4oCmIH1gIHN5bnRheFxuICAgICAgYXN5bmMgKltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgIHdoaWxlICghaXNEaXNwb3NlZCkge1xuICAgICAgICAgIHlpZWxkIGF3YWl0IHRoaXM7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGRpc3Bvc2U6IGRpc3Bvc2VIb29rLFxuXG4gICAgICBbU3ltYm9sLmRpc3Bvc2VdOiBkaXNwb3NlSG9vayxcbiAgICB9O1xuXG4gICAgLy8gQWxzbyByZWdpc3RlciB3aXRoIHRoZSBWTSdzIFN5bWJvbC5kaXNwb3NlIHNvIGB1c2luZ2Agd29ya3MgaW5zaWRlXG4gICAgLy8gdGhlIHdvcmtmbG93IHNhbmRib3ggKHRoZSBWTSBtYXkgaGF2ZSBhIHBvbHlmaWxsZWQgU3ltYm9sLmRpc3Bvc2VcbiAgICAvLyB0aGF0IGRpZmZlcnMgZnJvbSB0aGUgaG9zdCdzKS5cbiAgICBjb25zdCB2bURpc3Bvc2UgPSBjdHguZ2xvYmFsVGhpcy5TeW1ib2wuZGlzcG9zZTtcbiAgICBpZiAodm1EaXNwb3NlICYmIHZtRGlzcG9zZSAhPT0gU3ltYm9sLmRpc3Bvc2UpIHtcbiAgICAgIChob29rIGFzIGFueSlbdm1EaXNwb3NlXSA9IGRpc3Bvc2VIb29rO1xuICAgIH1cblxuICAgIHJldHVybiBob29rO1xuICB9O1xufVxuIl19
|