@smarterplan/ngx-smarterplan-core 1.4.17 → 1.4.19
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/README.md +24 -24
- package/esm2022/lib/components/csv-export/csv-export.component.mjs +3 -3
- package/esm2022/lib/components/loader/loader.component.mjs +3 -3
- package/esm2022/lib/components/menu-bar/avatar/avatar.component.mjs +1 -1
- package/esm2022/lib/components/menu-bar/menu-bar.component.mjs +3 -3
- package/esm2022/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +3 -3
- package/esm2022/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +3 -3
- package/esm2022/lib/components/search-bar/search-bar.component.mjs +3 -3
- package/esm2022/lib/components/support-modal/support-modal.component.mjs +3 -3
- package/esm2022/lib/config.mjs +1 -1
- package/esm2022/lib/helpers.service.mjs +1 -1
- package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasImage.mjs +1 -1
- package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +1 -1
- package/esm2022/lib/matterport-extensions/nest-thermostat/NestThermostat.mjs +1 -1
- package/esm2022/lib/matterport-extensions/nest-thermostat/PlaneRenderer.mjs +1 -1
- package/esm2022/lib/matterport-extensions/scene-component/SceneComponent.mjs +1 -1
- package/esm2022/lib/matterport-extensions/security-camera/SecurityCamera.mjs +22 -22
- package/esm2022/lib/matterport-extensions/tv-player/TvPlayer.mjs +1 -1
- package/esm2022/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +22 -22
- package/esm2022/lib/mattertagData.mjs +10 -1
- package/esm2022/lib/ngx-smarterplan-core.module.mjs +1 -1
- package/esm2022/lib/ngx-smarterplan-core.service.mjs +1 -1
- package/esm2022/lib/pipes/duration-to-string.pipe.mjs +1 -1
- package/esm2022/lib/pipes/format-date-number-to-digits.pipe.mjs +1 -1
- package/esm2022/lib/pipes/hashtag-from-id.pipe.mjs +1 -1
- package/esm2022/lib/pipes/safe-url.pipe.mjs +1 -1
- package/esm2022/lib/pipes/time-date-to-local-string.pipe.mjs +1 -1
- package/esm2022/lib/pipes/username-from-id.pipe.mjs +1 -1
- package/esm2022/lib/services/amplify-cache.service.mjs +1 -1
- package/esm2022/lib/services/base-tab.service.mjs +1 -1
- package/esm2022/lib/services/baseVisibility.service.mjs +1 -1
- package/esm2022/lib/services/content.service.mjs +1 -1
- package/esm2022/lib/services/filter.service.mjs +1 -1
- package/esm2022/lib/services/intervention.service.mjs +1 -1
- package/esm2022/lib/services/locale.service.mjs +1 -1
- package/esm2022/lib/services/matterport-import.service.mjs +10 -3
- package/esm2022/lib/services/matterport-measurement.service.mjs +1 -1
- package/esm2022/lib/services/matterport-navigation.service.mjs +18 -1
- package/esm2022/lib/services/matterport-object3d.service.mjs +1 -1
- package/esm2022/lib/services/matterport-pointer.service.mjs +6 -6
- package/esm2022/lib/services/matterport-tag-copy.service.mjs +455 -9
- package/esm2022/lib/services/matterport-tag.service.mjs +99 -10
- package/esm2022/lib/services/matterport.service.mjs +87 -48
- package/esm2022/lib/services/models/affectation.service.mjs +1 -1
- package/esm2022/lib/services/models/base-object.service.mjs +1 -1
- package/esm2022/lib/services/models/capture.service.mjs +1 -1
- package/esm2022/lib/services/models/comment.service.mjs +1 -1
- package/esm2022/lib/services/models/domain.service.mjs +1 -1
- package/esm2022/lib/services/models/equipment.service.mjs +1 -1
- package/esm2022/lib/services/models/event.service.mjs +1 -1
- package/esm2022/lib/services/models/feature.service.mjs +1 -1
- package/esm2022/lib/services/models/hashtag.service.mjs +1 -1
- package/esm2022/lib/services/models/layer.service.mjs +1 -1
- package/esm2022/lib/services/models/measurement.service.mjs +1 -1
- package/esm2022/lib/services/models/mission.service.mjs +1 -1
- package/esm2022/lib/services/models/navigation.service.mjs +1 -1
- package/esm2022/lib/services/models/node.service.mjs +1 -1
- package/esm2022/lib/services/models/object3D.service.mjs +1 -1
- package/esm2022/lib/services/models/operation.service.mjs +1 -1
- package/esm2022/lib/services/models/organisation.service.mjs +1 -1
- package/esm2022/lib/services/models/plan.service.mjs +1 -1
- package/esm2022/lib/services/models/poi.service.mjs +62 -50
- package/esm2022/lib/services/models/profile.service.mjs +1 -1
- package/esm2022/lib/services/models/property.service.mjs +1 -1
- package/esm2022/lib/services/models/space.service.mjs +1 -1
- package/esm2022/lib/services/models/template.service.mjs +1 -1
- package/esm2022/lib/services/models/ticket.service.mjs +1 -1
- package/esm2022/lib/services/models/visit.service.mjs +1 -1
- package/esm2022/lib/services/models/zone.service.mjs +9 -5
- package/esm2022/lib/services/navigator.service.mjs +1 -1
- package/esm2022/lib/services/s3.service.mjs +1 -1
- package/esm2022/lib/services/search.service.mjs +1 -1
- package/esm2022/lib/services/support.service.mjs +1 -1
- package/esm2022/lib/services/tag.service.mjs +16 -16
- package/esm2022/lib/services/threejs-import.service.mjs +1 -1
- package/esm2022/lib/services/threejs.service.mjs +1 -1
- package/esm2022/lib/services/user.service.mjs +1 -1
- package/esm2022/lib/services/utils/matterport-transform.util.mjs +1 -1
- package/esm2022/lib/services/validators.service.mjs +1 -1
- package/esm2022/lib/services/viewer.service.mjs +1 -1
- package/esm2022/lib/services/zone-drawer.service.mjs +1 -1
- package/esm2022/lib/services/zoneChange.service.mjs +1 -1
- package/esm2022/lib/tokens/matterport-sdk-key.token.mjs +1 -1
- package/esm2022/lib/types.service.mjs +1 -1
- package/esm2022/lib/validators/email.directive.mjs +1 -1
- package/esm2022/lib/validators/no-empty.directive.mjs +1 -1
- package/esm2022/lib/validators/number.directive.mjs +1 -1
- package/esm2022/lib/validators/text.directive.mjs +1 -1
- package/esm2022/public-api.mjs +1 -1
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +814 -193
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/lib/mattertagData.d.ts +4 -0
- package/lib/services/matterport-navigation.service.d.ts +9 -0
- package/lib/services/matterport-tag-copy.service.d.ts +128 -2
- package/lib/services/matterport-tag.service.d.ts +24 -1
- package/lib/services/matterport.service.d.ts +12 -3
- package/lib/services/models/poi.service.d.ts +1 -0
- package/package.json +1 -1
- package/src/assets/vs-app.json +67 -67
|
@@ -19,6 +19,13 @@ export class MatterportTagService {
|
|
|
19
19
|
tagService = null;
|
|
20
20
|
tagsCurrentOpacity = new Map();
|
|
21
21
|
tagsCurrentEnabled = new Map();
|
|
22
|
+
/** tagId -> icon name last applied, so an unchanged icon is not re-applied. */
|
|
23
|
+
tagsCurrentIcon = new Map();
|
|
24
|
+
/** Ids of the global SDK Tag collection, and the tags waiting to appear in it, see waitForTagInSdk(). */
|
|
25
|
+
sdkTagIds = new Set();
|
|
26
|
+
sdkTagWaiters = new Map();
|
|
27
|
+
sdkTagSubscription = null;
|
|
28
|
+
sdkTagSubscriptionSdk = null;
|
|
22
29
|
/**
|
|
23
30
|
* Single layer holding every Smarterplan tag, added to every view of the space so a
|
|
24
31
|
* tag stays in place — same sid, same content — when the user switches between the
|
|
@@ -62,11 +69,92 @@ export class MatterportTagService {
|
|
|
62
69
|
* A layer-scoped Tag module only exposes the *replayable* mutations, meant to build
|
|
63
70
|
* the layer's own content; applying them to an already-created tag silently does
|
|
64
71
|
* nothing — which is what left every pin white instead of carrying its icon. Only
|
|
65
|
-
* `add` has to go through the layer, see getTagCreationModule().
|
|
72
|
+
* `add` has to go through the layer, see getTagCreationModule(). The global module
|
|
73
|
+
* only knows a layer-created pin once it is rendered: see waitForTagInSdk().
|
|
66
74
|
*/
|
|
67
75
|
getTagModule(sdk, tagId) {
|
|
68
76
|
return sdk?.Tag;
|
|
69
77
|
}
|
|
78
|
+
/** Icon name last applied to a tag, if any. */
|
|
79
|
+
getCachedTagIcon(tagId) {
|
|
80
|
+
return this.tagsCurrentIcon.get(tagId);
|
|
81
|
+
}
|
|
82
|
+
/** Applies an icon to a tag through its own module and remembers it on success. */
|
|
83
|
+
async editTagIcon(sdk, tagId, iconName) {
|
|
84
|
+
await this.getTagModule(sdk, tagId).editIcon(tagId, iconName);
|
|
85
|
+
this.tagsCurrentIcon.set(tagId, iconName);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Resolves once the global SDK Tag collection — the one edits go through — contains the
|
|
89
|
+
* tag, so edits do not hit a pin that is not rendered yet ("setPinRenderOverrides on a pin
|
|
90
|
+
* that doesn't exist"). Gives up after `timeoutMs` and resolves anyway; falls back to a
|
|
91
|
+
* short wait when the collection cannot be observed. One subscription is shared by every
|
|
92
|
+
* waiting tag: a space loads hundreds of them.
|
|
93
|
+
*/
|
|
94
|
+
waitForTagInSdk(sdk, tagId, timeoutMs = 1500) {
|
|
95
|
+
if (!tagId || !this.observeSdkTags(sdk))
|
|
96
|
+
return wait(100);
|
|
97
|
+
if (this.sdkTagIds.has(tagId))
|
|
98
|
+
return Promise.resolve();
|
|
99
|
+
return new Promise((resolve) => {
|
|
100
|
+
const waiters = this.sdkTagWaiters.get(tagId) || [];
|
|
101
|
+
const timer = setTimeout(() => {
|
|
102
|
+
const remaining = (this.sdkTagWaiters.get(tagId) || []).filter(waiter => waiter !== done);
|
|
103
|
+
if (remaining.length)
|
|
104
|
+
this.sdkTagWaiters.set(tagId, remaining);
|
|
105
|
+
else
|
|
106
|
+
this.sdkTagWaiters.delete(tagId);
|
|
107
|
+
resolve();
|
|
108
|
+
}, timeoutMs);
|
|
109
|
+
const done = () => { clearTimeout(timer); resolve(); };
|
|
110
|
+
waiters.push(done);
|
|
111
|
+
this.sdkTagWaiters.set(tagId, waiters);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/** Keeps sdkTagIds in sync with the global SDK Tag collection; false when it cannot be observed. */
|
|
115
|
+
observeSdkTags(sdk) {
|
|
116
|
+
if (this.sdkTagSubscription && this.sdkTagSubscriptionSdk === sdk)
|
|
117
|
+
return true;
|
|
118
|
+
const data = sdk?.Tag?.data;
|
|
119
|
+
if (typeof data?.subscribe !== 'function')
|
|
120
|
+
return false;
|
|
121
|
+
this.stopObservingSdkTags();
|
|
122
|
+
const markPresent = (id) => {
|
|
123
|
+
this.sdkTagIds.add(id);
|
|
124
|
+
const waiters = this.sdkTagWaiters.get(id);
|
|
125
|
+
if (waiters) {
|
|
126
|
+
this.sdkTagWaiters.delete(id);
|
|
127
|
+
waiters.forEach(waiter => waiter());
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
try {
|
|
131
|
+
this.sdkTagSubscriptionSdk = sdk;
|
|
132
|
+
this.sdkTagSubscription = data.subscribe({
|
|
133
|
+
onAdded: (id) => markPresent(id),
|
|
134
|
+
onRemoved: (id) => this.sdkTagIds.delete(id),
|
|
135
|
+
onCollectionUpdated: (collection) => {
|
|
136
|
+
const ids = typeof collection?.keys === 'function'
|
|
137
|
+
? Array.from(collection.keys()) : Object.keys(collection || {});
|
|
138
|
+
this.sdkTagIds = new Set(ids);
|
|
139
|
+
ids.forEach(id => this.sdkTagWaiters.has(id) && markPresent(id));
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
this.sdkTagSubscriptionSdk = null;
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
stopObservingSdkTags() {
|
|
150
|
+
try {
|
|
151
|
+
this.sdkTagSubscription?.cancel?.();
|
|
152
|
+
}
|
|
153
|
+
catch { }
|
|
154
|
+
this.sdkTagSubscription = null;
|
|
155
|
+
this.sdkTagSubscriptionSdk = null;
|
|
156
|
+
this.sdkTagIds.clear();
|
|
157
|
+
}
|
|
70
158
|
/**
|
|
71
159
|
* Returns the Tag module every new tag must be created through: the shared layer
|
|
72
160
|
* when the View API is available, the global sdk.Tag otherwise.
|
|
@@ -221,7 +309,7 @@ export class MatterportTagService {
|
|
|
221
309
|
const [createdSid] = await tagModule.add(...descriptor);
|
|
222
310
|
this.mattertagIDs.push(createdSid);
|
|
223
311
|
this.dictionnaryTags.set(createdSid, mattertagData);
|
|
224
|
-
await
|
|
312
|
+
await this.waitForTagInSdk(sdk, createdSid);
|
|
225
313
|
await setTagIconAndOpacity(createdSid, mattertagData);
|
|
226
314
|
injectHtmlInTag(mattertagData.getType(), mattertagData.getObject(), createdSid).catch(err => {
|
|
227
315
|
if (isDevMode())
|
|
@@ -342,6 +430,7 @@ export class MatterportTagService {
|
|
|
342
430
|
resetVisibilityCache() {
|
|
343
431
|
this.tagsCurrentOpacity.clear();
|
|
344
432
|
this.tagsCurrentEnabled.clear();
|
|
433
|
+
this.tagsCurrentIcon.clear();
|
|
345
434
|
}
|
|
346
435
|
/** Removes a specific tag from the viewer and local dictionaries. */
|
|
347
436
|
async deleteMattertagFromId(sdk, mattertagID) {
|
|
@@ -349,6 +438,9 @@ export class MatterportTagService {
|
|
|
349
438
|
if (sdk)
|
|
350
439
|
await this.getTagModule(sdk, mattertagID).remove(mattertagID);
|
|
351
440
|
this.dictionnaryTags.delete(mattertagID);
|
|
441
|
+
this.tagsCurrentIcon.delete(mattertagID);
|
|
442
|
+
this.tagsCurrentOpacity.delete(mattertagID);
|
|
443
|
+
this.tagsCurrentEnabled.delete(mattertagID);
|
|
352
444
|
const index = this.mattertagIDs.indexOf(mattertagID);
|
|
353
445
|
if (index > -1)
|
|
354
446
|
this.mattertagIDs.splice(index, 1);
|
|
@@ -410,14 +502,8 @@ export class MatterportTagService {
|
|
|
410
502
|
}
|
|
411
503
|
mattertagData.setPoi(poi);
|
|
412
504
|
const createdTagID = await this.addMattertagToViewer(sdk, mattertagData);
|
|
413
|
-
console.log('---------------');
|
|
414
|
-
console.log('element id ' + mattertagData.elementID);
|
|
415
|
-
console.log('position: ', mattertagData.getPosition());
|
|
416
|
-
console.log('rotation: ', mattertagData.getRotation());
|
|
417
|
-
console.log('sweep id: ', mattertagData.getSweepID());
|
|
418
|
-
console.log('---------------');
|
|
419
505
|
if (createdTagID && sdk) {
|
|
420
|
-
await
|
|
506
|
+
await this.waitForTagInSdk(sdk, createdTagID);
|
|
421
507
|
await setTagIconAndOpacity(createdTagID, mattertagData);
|
|
422
508
|
injectHtmlInTag(tagType, object, createdTagID).catch(err => {
|
|
423
509
|
if (isDevMode())
|
|
@@ -446,6 +532,7 @@ export class MatterportTagService {
|
|
|
446
532
|
const tagModule = this.getTagModule(sdk, mattertagID);
|
|
447
533
|
await sdk.Asset.registerTexture(iconName, iconPath);
|
|
448
534
|
await tagModule.editIcon(mattertagID, iconName);
|
|
535
|
+
this.tagsCurrentIcon.set(mattertagID, iconName);
|
|
449
536
|
if (applyOpacity) {
|
|
450
537
|
await tagModule.editOpacity(mattertagID, opacity);
|
|
451
538
|
}
|
|
@@ -575,6 +662,8 @@ export class MatterportTagService {
|
|
|
575
662
|
this.dictionnaryTags.clear();
|
|
576
663
|
this.tagsCurrentOpacity.clear();
|
|
577
664
|
this.tagsCurrentEnabled.clear();
|
|
665
|
+
this.tagsCurrentIcon.clear();
|
|
666
|
+
this.stopObservingSdkTags();
|
|
578
667
|
this.tagAddQueue = Promise.resolve();
|
|
579
668
|
this.mattertagToFollow = null;
|
|
580
669
|
this.mattertagIDs = [];
|
|
@@ -591,4 +680,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
591
680
|
providedIn: 'root',
|
|
592
681
|
}]
|
|
593
682
|
}], ctorParameters: () => [{ type: i1.MatterportNavigationService }] });
|
|
594
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC10YWcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvc2VydmljZXMvbWF0dGVycG9ydC10YWcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQWtELFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQU0xQyxNQUFNLE9BQU8sb0JBQW9CO0lBZ0NyQjtJQS9CVixvRUFBb0U7SUFDNUQsTUFBTSxDQUFVLHFCQUFxQixHQUFHLHlCQUF5QixDQUFDO0lBRW5FLGVBQWUsR0FBK0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN4RCxXQUFXLEdBQWlCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM5QyxpQkFBaUIsR0FBa0IsSUFBSSxDQUFDO0lBQ3hDLFNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO0lBQ2xDLFlBQVksR0FBa0IsRUFBRSxDQUFDO0lBQ2pDLGVBQWUsR0FBVyxFQUFFLENBQUM7SUFDN0IsY0FBYyxHQUFZLEtBQUssQ0FBQztJQUNoQyxVQUFVLEdBQTBCLElBQUksQ0FBQztJQUN4QyxrQkFBa0IsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNwRCxrQkFBa0IsR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUM3RDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ssY0FBYyxHQUFRLElBQUksQ0FBQztJQUMzQixxQkFBcUIsR0FBd0Is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Q0FBQyxDQUFDO29CQUVILDRCQUE0QjtvQkFDNUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRzt3QkFDNUIsWUFBWTt3QkFDWixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssSUFBSSxPQUFPO3dCQUM5QixXQUFXLEVBQUUsY0FBYyxJQUFJLEVBQUU7d0JBQ2pDLFFBQVEsRUFBRSxPQUFPLENBQUMsWUFBWTt3QkFDOUIsU0FBUztxQkFDVixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLGtEQUFrRCxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNFLENBQUM7SUFDSCxDQUFDO0lBRUQsK0RBQStEO0lBQy9ELEtBQUs7UUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QiwyRUFBMkU7UUFDM0UsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztJQUNwQyxDQUFDO3dHQW5vQlUsb0JBQW9COzRHQUFwQixvQkFBb0IsY0FGbkIsTUFBTTs7NEZBRVAsb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRGV2TW9kZSwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTWF0dGVydGFnRGF0YSB9IGZyb20gJy4uL21hdHRlcnRhZ0RhdGEnO1xuaW1wb3J0IHsgUG9pVHlwZSwgRGJPYmplY3RUeXBlLCBQT0ksIFZpZXdlckludGVyYWN0aW9ucywgVGFnQWN0aW9uLCBDYW1lcmFNb2RlIH0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XG5pbXBvcnQgeyBNYXR0ZXJwb3J0TmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuL21hdHRlcnBvcnQtbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IHdhaXQgfSBmcm9tICcuLi9oZWxwZXJzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmFzZVRhZ1NlcnZpY2UgfSBmcm9tICcuL3RhZy5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIE1hdHRlcnBvcnRUYWdTZXJ2aWNlIHtcbiAgLyoqIE5hbWUgb2YgdGhlIGNvbW1vbiBsYXllciBldmVyeSBTbWFydGVycGxhbiB0YWcgaXMgY3JlYXRlZCBpbi4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU0hBUkVEX1RBR19MQVlFUl9OQU1FID0gJ3NtYXJ0ZXJwbGFuLXNoYXJlZC10YWdzJztcblxuICBwdWJsaWMgZGljdGlvbm5hcnlUYWdzOiBNYXA8c3RyaW5nLCBNYXR0ZXJ0YWdEYXRhPiA9IG5ldyBNYXAoKTtcbiAgcHVibGljIHRhZ0FkZFF1ZXVlOiBQcm9taXNlPGFueT4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgcHVibGljIG1hdHRlcnRhZ1RvRm9sbG93OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIG9uR29Ub1RhZyA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgcHVibGljIG1hdHRlcnRhZ0lEczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBwdWJsaWMgdGFnc0F0dGFjaG1lbnRzOiBPYmplY3QgPSB7fTtcbiAgcHVibGljIHRhZ01lc3Nlbmdlck9uOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyB0YWdTZXJ2aWNlOiBCYXNlVGFnU2VydmljZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRhZ3NDdXJyZW50T3BhY2l0eTogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSB0YWdzQ3VycmVudEVuYWJsZWQ6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xuICAvKipcbiAgICogU2luZ2xlIGxheWVyIGhvbGRpbmcgZXZlcnkgU21hcnRlcnBsYW4gdGFnLCBhZGRlZCB0byBldmVyeSB2aWV3IG9mIHRoZSBzcGFjZSBzbyBhXG4gICAqIHRhZyBzdGF5cyBpbiBwbGFjZSDigJQgc2FtZSBzaWQsIHNhbWUgY29udGVudCDigJQgd2hlbiB0aGUgdXNlciBzd2l0Y2hlcyBiZXR3ZWVuIHRoZVxuICAgKiBmdXJuaXNoZWQgYW5kIHRoZSBEZWZ1cm5pc2hlZCB2aWV3LiBUYWdzIGFkZGVkIHRvIHRoZSBnbG9iYWwgc2RrLlRhZyAob3IgdG8gYVxuICAgKiB2aWV3J3Mgb3duIGxheWVyKSBiZWxvbmcgdG8gdGhhdCB2aWV3IG9ubHksIHdoaWNoIGlzIHdoYXQgbWFkZSB0aGVtIHBvcCBpbiBhbmQgb3V0XG4gICAqIG9uIGV2ZXJ5IHZpZXcgY2hhbmdlLlxuICAgKlxuICAgKiBEZWxpYmVyYXRlbHkgTk9UIGNyZWF0ZWQgd2l0aCBgeyBjb21tb246IHRydWUgfWA6IGluIFNESyAyNi43LjUgYSBjb21tb24gbGF5ZXIgaXNcbiAgICogcHVzaGVkIGludG8gYGdldE9yZGVyZWRNb2RlbFZpZXdzKClgIGF0IGNyZWF0aW9uIHRpbWUsIGFuZCB0aGF0IGNhbGwgZGVmYXVsdHMgdG9cbiAgICogYGluY2x1ZGVEZWZ1cm5pc2g6IGZhbHNlYCwgc28gdGhlIERlZnVybmlzaGVkIHZpZXcgbmV2ZXIgcmVjZWl2ZXMgaXQg4oCUIHdoaWxlXG4gICAqIGBWaWV3LmFkZExheWVyKClgIHJlZnVzZXMgdG8gcmVwYWlyIGl0IChcIkxheWVyIGlzIGNvbW1vbi4gTm8gbmVlZCB0byBhZGQuXCIpLiBBXG4gICAqIHBsYWluIGxheWVyIHdlIGF0dGFjaCB0byBlYWNoIHZpZXcgb3Vyc2VsdmVzIHJlYWNoZXMgZXZlcnkgdmlldywgRGVmdXJuaXNoZWRcbiAgICogaW5jbHVkZWQuIFNlZSBhdHRhY2hTaGFyZWRUYWdMYXllclRvVmlld3MoKS5cbiAgICovXG4gIHByaXZhdGUgc2hhcmVkVGFnTGF5ZXI6IGFueSA9IG51bGw7XG4gIHByaXZhdGUgc2hhcmVkVGFnTGF5ZXJQcm9taXNlOiBQcm9taXNlPGFueT4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5hdmlnYXRpb25TZXJ2aWNlOiBNYXR0ZXJwb3J0TmF2aWdhdGlvblNlcnZpY2VcbiAgKSB7IH1cblxuICBzZXRUYWdTZXJ2aWNlKHNlcnZpY2U6IEJhc2VUYWdTZXJ2aWNlKTogdm9pZCB7XG4gICAgdGhpcy50YWdTZXJ2aWNlID0gc2VydmljZTtcbiAgfVxuXG4gIC8qKiBPcGVucyBhIHNwZWNpZmljIHRhZyBpbiB0aGUgTWF0dGVycG9ydCB2aWV3ZXIgYnkgaXRzIElELiAqL1xuICBhc3luYyBnb1RvVGFnKHNkazogYW55LCBzaWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFzZGspIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vbkdvVG9UYWcubmV4dChzaWQpO1xuICAgICAgLy8gYG9wZW5gIG9ubHkgZXhpc3RzIG9uIHRoZSBnbG9iYWwgVGFnIG1vZHVsZSwgbmV2ZXIgb24gYSBsYXllci1zY29wZWQgb25lLlxuICAgICAgYXdhaXQgc2RrLlRhZy5vcGVuKHNpZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Nhbm5vdCBvcGVuIHRhZycsIHNpZCwgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFNESyBUYWcgbW9kdWxlIHRvIHVzZSBmb3IgYW4gb3BlcmF0aW9uIGFkZHJlc3NpbmcgYW4gZXhpc3RpbmcgdGFnIGJ5IElEXG4gICAqIChpY29uLCBvcGFjaXR5LCBwb3NpdGlvbiwgYXR0YWNobWVudHMsIHJlbW92YWwuLi4pOiBhbHdheXMgdGhlIGdsb2JhbCBzZGsuVGFnLlxuICAgKlxuICAgKiBBIGxheWVyLXNjb3BlZCBUYWcgbW9kdWxlIG9ubHkgZXhwb3NlcyB0aGUgKnJlcGxheWFibGUqIG11dGF0aW9ucywgbWVhbnQgdG8gYnVpbGRcbiAgICogdGhlIGxheWVyJ3Mgb3duIGNvbnRlbnQ7IGFwcGx5aW5nIHRoZW0gdG8gYW4gYWxyZWFkeS1jcmVhdGVkIHRhZyBzaWxlbnRseSBkb2VzXG4gICAqIG5vdGhpbmcg4oCUIHdoaWNoIGlzIHdoYXQgbGVmdCBldmVyeSBwaW4gd2hpdGUgaW5zdGVhZCBvZiBjYXJyeWluZyBpdHMgaWNvbi4gT25seVxuICAgKiBgYWRkYCBoYXMgdG8gZ28gdGhyb3VnaCB0aGUgbGF5ZXIsIHNlZSBnZXRUYWdDcmVhdGlvbk1vZHVsZSgpLlxuICAgKi9cbiAgZ2V0VGFnTW9kdWxlKHNkazogYW55LCB0YWdJZDogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gc2RrPy5UYWc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgVGFnIG1vZHVsZSBldmVyeSBuZXcgdGFnIG11c3QgYmUgY3JlYXRlZCB0aHJvdWdoOiB0aGUgc2hhcmVkIGxheWVyXG4gICAqIHdoZW4gdGhlIFZpZXcgQVBJIGlzIGF2YWlsYWJsZSwgdGhlIGdsb2JhbCBzZGsuVGFnIG90aGVyd2lzZS5cbiAgICovXG4gIGFzeW5jIGdldFRhZ0NyZWF0aW9uTW9kdWxlKHNkazogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBsYXllciA9IGF3YWl0IHRoaXMuZW5zdXJlU2hhcmVkVGFnTGF5ZXIoc2RrKTtcbiAgICByZXR1cm4gbGF5ZXI/LlRhZyB8fCBzZGs/LlRhZztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIChvbmNlIHBlciBTREsgc2Vzc2lvbikgYW5kIHJldHVybnMgdGhlIHNoYXJlZCB0YWcgbGF5ZXIuXG4gICAqIFJlc29sdmVzIHRvIG51bGwgd2hlbiB0aGUgVmlldyBBUEkgaXMgdW5hdmFpbGFibGUsIHNvIGNhbGxlcnMgdHJhbnNwYXJlbnRseSBmYWxsXG4gICAqIGJhY2sgdG8gdGhlIGdsb2JhbCBzZGsuVGFnLlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlU2hhcmVkVGFnTGF5ZXIoc2RrOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLnNoYXJlZFRhZ0xheWVyKSByZXR1cm4gdGhpcy5zaGFyZWRUYWdMYXllcjtcbiAgICBpZiAoIXNkaz8uVmlldz8uY3JlYXRlTGF5ZXIpIHJldHVybiBudWxsO1xuXG4gICAgaWYgKCF0aGlzLnNoYXJlZFRhZ0xheWVyUHJvbWlzZSkge1xuICAgICAgdGhpcy5zaGFyZWRUYWdMYXllclByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgIHNkay5WaWV3LmNyZWF0ZUxheWVyKE1hdHRlcnBvcnRUYWdTZXJ2aWNlLlNIQVJFRF9UQUdfTEFZRVJfTkFNRSlcbiAgICAgIClcbiAgICAgICAgLnRoZW4oYXN5bmMgKGxheWVyOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnNoYXJlZFRhZ0xheWVyID0gbGF5ZXI7XG4gICAgICAgICAgLy8gQSBmcmVzaGx5IGNyZWF0ZWQgbGF5ZXIgY2FuIGNvbWUgYmFjayB0b2dnbGVkIG9mZiwgd2hpY2ggaGlkZXMgaXRzIHRhZ3MuXG4gICAgICAgICAgaWYgKGxheWVyICYmIGxheWVyLnRvZ2dsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBhd2FpdCBsYXllci50b2dnbGUodHJ1ZSkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGxheWVyO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGU6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIEFsbG93IGEgbGF0ZXIgcmV0cnkgKGUuZy4gdGhlIFNESyB3YXMgbm90IGZ1bGx5IHJlYWR5IHlldCkuXG4gICAgICAgICAgdGhpcy5zaGFyZWRUYWdMYXllclByb21pc2UgPSBudWxsO1xuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIENvdWxkIG5vdCBjcmVhdGUgdGhlIHNoYXJlZCB0YWcgbGF5ZXInLCBlKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkVGFnTGF5ZXJQcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIHN1cmUgdGhlIHNoYXJlZCBsYXllciBpcyBwYXJ0IG9mIGV2ZXJ5IHZpZXcgb2YgdGhlIHNwYWNlLCBEZWZ1cm5pc2hlZFxuICAgKiBpbmNsdWRlZC4gVGhpcyBpcyB3aGF0IGFjdHVhbGx5IHNoYXJlcyB0aGUgdGFncyBhY3Jvc3Mgdmlld3MsIGFuZCB0aGUgcmVhc29uIHRoZVxuICAgKiBsYXllciBtdXN0IG5vdCBiZSBhIGNvbW1vbiBvbmU6IHRoZSBTREsgb25seSBwZXJmb3JtcyB0aGUgYXR0YWNobWVudCBmb3JcbiAgICogbm9uLWNvbW1vbiBsYXllcnMuIElkZW1wb3RlbnQsIHNvIGl0IGNhbiBydW4gb24gZXZlcnkgdmlldyBjb2xsZWN0aW9uIHVwZGF0ZS5cbiAgICovXG4gIGFzeW5jIGF0dGFjaFNoYXJlZFRhZ0xheWVyVG9WaWV3cyhzZGs6IGFueSwgdmlld3M6IEl0ZXJhYmxlPGFueT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsYXllciA9IGF3YWl0IHRoaXMuZW5zdXJlU2hhcmVkVGFnTGF5ZXIoc2RrKTtcbiAgICBpZiAoIWxheWVyKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IHZpZXcgb2Ygdmlld3MpIHtcbiAgICAgIGlmICghdmlldz8uYWRkTGF5ZXIgfHwgdmlldy5oYXNMYXllcj8uKGxheWVyKSkgY29udGludWU7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB2aWV3LmFkZExheWVyKGxheWVyKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0VGFnU2VydmljZV0gQ2Fubm90IGFkZCB0aGUgc2hhcmVkIHRhZyBsYXllciB0byB2aWV3Jywgdmlldz8uaWQsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgdGFnIHRocm91Z2ggdGhlIHNoYXJlZCBsYXllciBzbyBpdCBleGlzdHMgaW4gZXZlcnkgdmlldy4gRmFsbHMgYmFja1xuICAgKiB0byB0aGUgZ2xvYmFsIHNkay5UYWcgd2hlbiB0aGUgVmlldyBBUEkgaXMgdW5hdmFpbGFibGU7IHRoYXQgY2FsbCBpcyByYWNlZCBhZ2FpbnN0XG4gICAqIGEgdGltZW91dCBhcyBhIHNhZmV0eSBuZXQsIHNpbmNlIGl0IG5ldmVyIHJlc29sdmVzIHdoaWxlIGEgRGVmdXJuaXNoZWQgdmlldyBpc1xuICAgKiBhY3RpdmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFkZFRhZ1RvU2RrKHNkazogYW55LCBkZXNjcmlwdG9yOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgY29uc3Qgc2hhcmVkVGFnTW9kdWxlID0gYXdhaXQgdGhpcy5nZXRUYWdDcmVhdGlvbk1vZHVsZShzZGspO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZExpc3QgPSAoYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgc2hhcmVkVGFnTW9kdWxlLmFkZChkZXNjcmlwdG9yKSxcbiAgICAgICAgbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKCdUYWcuYWRkIHRpbWVkIG91dCcpKSwgNDAwMClcbiAgICAgICAgKSxcbiAgICAgIF0pKSBhcyBzdHJpbmdbXTtcbiAgICAgIGlmIChzaWRMaXN0Py5sZW5ndGgpIHJldHVybiBzaWRMaXN0WzBdO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmIChlcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgaW4gdXNlJykpIHRocm93IGVycm9yO1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0VGFnU2VydmljZV0gVGFnLmFkZCBmYWlsZWQvdGltZWQgb3V0JywgZXJyb3I/Lm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIE9wZW5zIHRoZSBtb3N0IHJlY2VudGx5IGNyZWF0ZWQgdGFnIGluIHRoZSB2aWV3ZXIuICovXG4gIGFzeW5jIGdvVG9MYXN0VGFnKHNkazogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXNkayB8fCB0aGlzLm1hdHRlcnRhZ0lEcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBsYXN0U2lkID0gdGhpcy5tYXR0ZXJ0YWdJRHNbdGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIHRoaXMuZ29Ub1RhZyhzZGssIGxhc3RTaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBNYXR0ZXJ0YWcgdG8gdGhlIHZpZXdlciwgc2VyaWFsaXppbmcgY2FsbHMgdG8gcHJldmVudCBTREsgcmFjZSBjb25kaXRpb25zLlxuICAgKiBSZXVzZXMgZXhpc3RpbmcgSURzIGlmIHRoZSB0YWcgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBzZXNzaW9uLlxuICAgKi9cbiAgYXN5bmMgYWRkTWF0dGVydGFnVG9WaWV3ZXIoc2RrOiBhbnksIG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBpZiAoIXNkaykgcmV0dXJuIG51bGw7XG5cbiAgICB0aGlzLnRhZ0FkZFF1ZXVlID0gdGhpcy50YWdBZGRRdWV1ZVxuICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gbWF0dGVydGFnRGF0YS5nZXRNYXR0ZXJ0YWdEZXNjcmlwdG9yKClbMF07XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSWQgPSBkZXNjcmlwdG9yPy5pZCB8fCBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc2lkID0gYXdhaXQgdGhpcy5hZGRUYWdUb1NkayhzZGssIGRlc2NyaXB0b3IpO1xuICAgICAgICAgIGlmIChzaWQpIHtcbiAgICAgICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0TWF0dGVycG9ydFNpZChzaWQpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1hdHRlcnRhZ0lEcy5pbmNsdWRlcyhzaWQpKSB7XG4gICAgICAgICAgICAgIHRoaXMubWF0dGVydGFnSURzLnB1c2goc2lkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldChzaWQsIG1hdHRlcnRhZ0RhdGEpO1xuICAgICAgICAgICAgcmV0dXJuIHNpZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0VGFnU2VydmljZV0gVGFnLmFkZCByZXR1cm5lZCBubyBzaWQnLCBkZXNjcmlwdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIGlmIChlcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgaW4gdXNlJykgJiYgZXhpc3RpbmdJZCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRpY3Rpb25uYXJ5VGFncy5oYXMoZXhpc3RpbmdJZCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5tYXR0ZXJ0YWdJRHMucHVzaChleGlzdGluZ0lkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldChleGlzdGluZ0lkLCBtYXR0ZXJ0YWdEYXRhKTtcbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0lkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRUYWdTZXJ2aWNlXSBhZGRNYXR0ZXJ0YWdUb1ZpZXdlciBmYWlsZWQnLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIHRhZ0FkZFF1ZXVlIHJlamVjdGVkJywgZSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy50YWdBZGRRdWV1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWRkIGFuZCBjb25maWd1cmUgYSBNYXR0ZXJ0YWcgd2l0aCBpY29uLCBvcGFjaXR5LCBhbmQgSFRNTCBjb250ZW50LlxuICAgKiBIYW5kbGVzIGV4aXN0aW5nIHRhZ3MgZ3JhY2VmdWxseSBhbmQgcXVldWVzIG9wZXJhdGlvbnMgdG8gYXZvaWQgU0RLIGNvbmZsaWN0cy5cbiAgICovXG4gIGFzeW5jIF9kb0FkZE1hdHRlcnRhZyhcbiAgICBzZGs6IGFueSxcbiAgICBtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhLFxuICAgIHNldFRhZ0ljb25BbmRPcGFjaXR5OiAoc2lkOiBzdHJpbmcsIG10OiBNYXR0ZXJ0YWdEYXRhKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGluamVjdEh0bWxJblRhZzogKHR5cGU6IFBvaVR5cGUsIG9iajogRGJPYmplY3RUeXBlLCBzaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBtYXR0ZXJ0YWdEYXRhLmdldE1hdHRlcnRhZ0Rlc2NyaXB0b3IoKTtcbiAgICAvL2NvbnNvbGUubG9nKCdkZXNjcmlwdG9yJywgZGVzY3JpcHRvcik7XG4gICAgY29uc3Qgc2lkID0gZGVzY3JpcHRvclswXVsnaWQnXTtcblxuICAgIGlmIChzaWQgJiYgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuaGFzKHNpZCkpIHtcbiAgICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KHNpZCwgbWF0dGVydGFnRGF0YSk7XG4gICAgICBhd2FpdCBpbmplY3RIdG1sSW5UYWcobWF0dGVydGFnRGF0YS5nZXRUeXBlKCksIG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCksIHNpZCk7XG4gICAgICByZXR1cm4gc2lkO1xuICAgIH1cblxuICAgIHRoaXMudGFnQWRkUXVldWUgPSB0aGlzLnRhZ0FkZFF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGFnTW9kdWxlID0gYXdhaXQgdGhpcy5nZXRUYWdDcmVhdGlvbk1vZHVsZShzZGspO1xuICAgICAgICBjb25zdCBbY3JlYXRlZFNpZF0gPSBhd2FpdCB0YWdNb2R1bGUuYWRkKC4uLmRlc2NyaXB0b3IpO1xuXG4gICAgICAgIHRoaXMubWF0dGVydGFnSURzLnB1c2goY3JlYXRlZFNpZCk7XG4gICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldChjcmVhdGVkU2lkLCBtYXR0ZXJ0YWdEYXRhKTtcblxuICAgICAgICBhd2FpdCB3YWl0KDEwMCk7XG4gICAgICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KGNyZWF0ZWRTaWQsIG1hdHRlcnRhZ0RhdGEpO1xuXG4gICAgICAgIGluamVjdEh0bWxJblRhZyhtYXR0ZXJ0YWdEYXRhLmdldFR5cGUoKSwgbWF0dGVydGFnRGF0YS5nZXRPYmplY3QoKSwgY3JlYXRlZFNpZCkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignSFRNTCBpbmplY3Rpb24gZmFpbGVkIGZvcicsIGNyZWF0ZWRTaWQsIGVycik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVkU2lkO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGlmIChlPy5tZXNzYWdlPy5pbmNsdWRlcygnYWxyZWFkeSBpbiB1c2UnKSAmJiBzaWQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuZGljdGlvbm5hcnlUYWdzLmhhcyhzaWQpKSB7XG4gICAgICAgICAgICB0aGlzLm1hdHRlcnRhZ0lEcy5wdXNoKHNpZCk7XG4gICAgICAgICAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5zZXQoc2lkLCBtYXR0ZXJ0YWdEYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgc2V0VGFnSWNvbkFuZE9wYWNpdHkoc2lkLCBtYXR0ZXJ0YWdEYXRhKTtcbiAgICAgICAgICBhd2FpdCBpbmplY3RIdG1sSW5UYWcobWF0dGVydGFnRGF0YS5nZXRUeXBlKCksIG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCksIHNpZCk7XG4gICAgICAgICAgcmV0dXJuIHNpZDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMudGFnQWRkUXVldWU7XG4gIH1cblxuICBnZXREaXN0YW5jZShwMTogYW55LCBwMjogYW55KTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHAyLnggLSBwMS54LCAyKSArIE1hdGgucG93KHAyLnkgLSBwMS55LCAyKSArIE1hdGgucG93KHAyLnogLSBwMS56LCAyKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgdGFnIGlzIHdpdGhpbiB0aGUgYm91bmRpbmcgYm94IG9mIGFueSBhY3RpdmUgcm9vbSAoYWRkaW5nIGEgc2xpZ2h0IG1hcmdpbiB0byBhY2NvdW50IGZvciB3YWxsLW1vdW50ZWQgdGFncykuXG4gICAqIElmIHRoZXJlIGFyZSBubyBhY3RpdmUgcm9vbXMgKGUuZy4sIGhhbGx3YXkpLCBmYWxscyBiYWNrIHRvIHJldHVybmluZyB0cnVlLlxuICAgKi9cbiAgaXNUYWdJblJvb21zKG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEsIHJvb21zOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIGlmICghcm9vbXMgfHwgcm9vbXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCB0YWdQb3MgPSBtYXR0ZXJ0YWdEYXRhLmdldFBvc2l0aW9uKCk7XG4gICAgY29uc3QgbWFyZ2luID0gMS41O1xuXG4gICAgcmV0dXJuIHJvb21zLnNvbWUoKHJvb20pID0+IHtcbiAgICAgIGlmICghcm9vbS5ib3VuZHMpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHsgbWluLCBtYXggfSA9IHJvb20uYm91bmRzO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICB0YWdQb3MueCA+PSBtaW4ueCAtIG1hcmdpbiAmJiB0YWdQb3MueCA8PSBtYXgueCArIG1hcmdpbiAmJlxuICAgICAgICB0YWdQb3MueSA+PSBtaW4ueSAtIG1hcmdpbiAmJiB0YWdQb3MueSA8PSBtYXgueSArIG1hcmdpbiAmJlxuICAgICAgICB0YWdQb3MueiA+PSBtaW4ueiAtIG1hcmdpbiAmJiB0YWdQb3MueiA8PSBtYXgueiArIG1hcmdpblxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCB0YWcuICovXG4gIGdldExhc3RUYWcoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMubWF0dGVydGFnSURzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMubWF0dGVydGFnSURzW3RoaXMubWF0dGVydGFnSURzLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHZpc2liaWxpdHkgKG9wYWNpdHkpIG9mIGFsbCB0YWdzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNhbWVyYSBtb2RlLFxuICAgKiBmbG9vciBhbmQgcm9vbSBjb250ZXh0LiBNdXN0IGJlIGNhbGxlZCBhZnRlciBlYWNoIHN3ZWVwLCBmbG9vciBvciBtb2RlIGNoYW5nZS5cbiAgICpcbiAgICogUnVsZXM6XG4gICAqICAtIERPTExIT1VTRSAvIEZMT09SUExBTiDihpIgYWxsIHRhZ3MgaGlkZGVuIChvcGFjaXR5IDApLlxuICAgKiAgLSBJTlNJREUg4oaSIG9ubHkgdGFncyB3aG9zZSBzd2VlcCBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IGZsb29yIGFyZSBzaG93bjtcbiAgICogICAgcHJveGltaXR5LWJhc2VkIG9wYWNpdHkgaXMgYXBwbGllZCB2aWEgY29tcHV0ZVRhZ09wYWNpdHkoKS5cbiAgICogICAgVGFncyBvbiBvdGhlciBmbG9vcnMgYXJlIGhpZGRlbiAob3BhY2l0eSAwKS5cbiAgICogIC0gVFJBTlNJVElPTklORyDihpIgbm8gY2hhbmdlIChza2lwIHVwZGF0ZSB0byBhdm9pZCBmbGlja2VyaW5nKS5cbiAgICpcbiAgICogQHBhcmFtIHNkayAgICAgICAgICBNYXR0ZXJwb3J0IFNESyBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBvc2VDYW1lcmEgICBDdXJyZW50IGNhbWVyYSBwb3NlLlxuICAgKiBAcGFyYW0gc3dlZXBDb2xsZWN0aW9uICBGdWxsIGNvbGxlY3Rpb24gb2Ygc3dlZXBzLlxuICAgKiBAcGFyYW0gY3VycmVudENhbWVyYU1vZGUgIEN1cnJlbnQgY2FtZXJhIG1vZGUuXG4gICAqIEBwYXJhbSBtYXR0ZXJ0YWdUb0ZvbGxvdyAgSUQgb2YgdGhlIGN1cnNvciB0YWcgKG5ldmVyIHRvdWNoZWQpLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0KFxuICAgIHNkazogYW55LFxuICAgIHN3ZWVwQ29sbGVjdGlvbjogYW55LFxuICAgIGN1cnJlbnRDYW1lcmFNb2RlOiBDYW1lcmFNb2RlLFxuICAgIG1hdHRlcnRhZ1RvRm9sbG93OiBzdHJpbmcgfCBudWxsLFxuICAgIGN1cnJlbnRGbG9vclNlcXVlbmNlOiBudW1iZXIgfCBudWxsID0gbnVsbCxcbiAgICBjdXJyZW50Um9vbXM6IGFueVtdID0gW11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFzZGsgfHwgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaXNJbnRlcmlvck1vZGUgPSBjdXJyZW50Q2FtZXJhTW9kZSA9PT0gQ2FtZXJhTW9kZS5JTlNJREU7XG4gICAgY29uc3QgY3VycmVudEZsb29ySWQgPSBjdXJyZW50Rmxvb3JTZXF1ZW5jZSAhPT0gbnVsbCA/IGN1cnJlbnRGbG9vclNlcXVlbmNlLnRvU3RyaW5nKCkgOiBudWxsO1xuICAgIGNvbnN0IHByb21pc2VzID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFt0YWdJZCwgbWF0dGVydGFnRGF0YV0gb2YgdGhpcy5kaWN0aW9ubmFyeVRhZ3MpIHtcbiAgICAgIGlmICh0YWdJZCA9PT0gbWF0dGVydGFnVG9Gb2xsb3cpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCB0YWdGbG9vcklkID0gdGhpcy5nZXRGbG9vcklkRm9yVGFnKG1hdHRlcnRhZ0RhdGEsIHN3ZWVwQ29sbGVjdGlvbik7XG4gICAgICBjb25zdCBpc09uQ3VycmVudEZsb29yID0gIXRhZ0Zsb29ySWQgfHwgIWN1cnJlbnRGbG9vcklkIHx8IHRhZ0Zsb29ySWQgPT09IGN1cnJlbnRGbG9vcklkO1xuXG4gICAgICBsZXQgdGFyZ2V0T3BhY2l0eSA9IDA7XG4gICAgICBsZXQgc2hvdWxkQmVFbmFibGVkID0gZmFsc2U7XG5cbiAgICAgIC8vIENhbGN1bGF0aW9uIG9mIG9wYWNpdHkgYW5kIGVuYWJsZSBzdGF0dXNcbiAgICAgIGlmIChpc09uQ3VycmVudEZsb29yKSB7XG4gICAgICAgIGlmICghaXNJbnRlcmlvck1vZGUpIHtcbiAgICAgICAgICB0YXJnZXRPcGFjaXR5ID0gMTtcbiAgICAgICAgICBzaG91bGRCZUVuYWJsZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldE9wYWNpdHkgPSAwLjk7XG4gICAgICAgICAgc2hvdWxkQmVFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQXBwbHkgY2hhbmdlc1xuXG4gICAgICAvLyBUb29sdGlwIGFuZCBjbGljayBtYW5hZ2VtZW50XG4gICAgICBjb25zdCB0YWdNb2R1bGUgPSB0aGlzLmdldFRhZ01vZHVsZShzZGssIHRhZ0lkKTtcbiAgICAgIGNvbnN0IGxhc3RFbmFibGVkID0gdGhpcy50YWdzQ3VycmVudEVuYWJsZWQuZ2V0KHRhZ0lkKTtcbiAgICAgIGlmIChsYXN0RW5hYmxlZCAhPT0gc2hvdWxkQmVFbmFibGVkKSB7XG4gICAgICAgIHRoaXMudGFnc0N1cnJlbnRFbmFibGVkLnNldCh0YWdJZCwgc2hvdWxkQmVFbmFibGVkKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaCh0YWdNb2R1bGUuYWxsb3dBY3Rpb24odGFnSWQsIHtcbiAgICAgICAgICBvcGVuaW5nOiBzaG91bGRCZUVuYWJsZWQsXG4gICAgICAgICAgbmF2aWdhdGluZzogc2hvdWxkQmVFbmFibGVkLFxuICAgICAgICAgIGRvY2tpbmc6IGZhbHNlXG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHsgfSkpO1xuICAgICAgfVxuICAgICAgLy8gT3BhY2l0eSBtYW5hZ2VtZW50XG4gICAgICBjb25zdCBsYXN0T3BhY2l0eSA9IHRoaXMudGFnc0N1cnJlbnRPcGFjaXR5LmdldCh0YWdJZCkgPz8gLTE7XG4gICAgICBpZiAoTWF0aC5hYnMobGFzdE9wYWNpdHkgLSB0YXJnZXRPcGFjaXR5KSA+IDAuMDUpIHtcbiAgICAgICAgdGhpcy50YWdzQ3VycmVudE9wYWNpdHkuc2V0KHRhZ0lkLCB0YXJnZXRPcGFjaXR5KTtcbiAgICAgICAgcHJvbWlzZXMucHVzaCh0YWdNb2R1bGUuZWRpdE9wYWNpdHkodGFnSWQsIHRhcmdldE9wYWNpdHkpLmNhdGNoKCgpID0+IHsgfSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wcyB0aGUgbWVtb2l6ZWQgb3BhY2l0eS9lbmFibGVkIHN0YXRlIHNvIHRoZSBuZXh0IHZpc2liaWxpdHkgcGFzcyByZS1hcHBsaWVzIGl0XG4gICAqIHRvIGV2ZXJ5IHRhZy4gTmVlZGVkIGFmdGVyIGEgdmlldyBzd2l0Y2ggKGZ1cm5pc2hlZCA8LT4gZGVmdXJuaXNoZWQpOiB0aGUgU0RLXG4gICAqIHJlLXJlbmRlcnMgdGhlIHNoYXJlZCBsYXllcidzIHRhZ3MgYW5kIHRoZSBjYWNoZWQgdmFsdWVzIHdvdWxkIG90aGVyd2lzZSBtYWtlXG4gICAqIHVwZGF0ZVRhZ3NWaXNpYmlsaXR5Rm9yQ29udGV4dCgpIHNraXAgdGhlbSwgbGVhdmluZyB0YWdzIHN0dWNrIGludmlzaWJsZS5cbiAgICovXG4gIHJlc2V0VmlzaWJpbGl0eUNhY2hlKCk6IHZvaWQge1xuICAgIHRoaXMudGFnc0N1cnJlbnRPcGFjaXR5LmNsZWFyKCk7XG4gICAgdGhpcy50YWdzQ3VycmVudEVuYWJsZWQuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmVzIGEgc3BlY2lmaWMgdGFnIGZyb20gdGhlIHZpZXdlciBhbmQgbG9jYWwgZGljdGlvbmFyaWVzLiAqL1xuICBhc3luYyBkZWxldGVNYXR0ZXJ0YWdGcm9tSWQoc2RrOiBhbnksIG1hdHRlcnRhZ0lEOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHNkaykgYXdhaXQgdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCBtYXR0ZXJ0YWdJRCkucmVtb3ZlKG1hdHRlcnRhZ0lEKTtcbiAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLmRlbGV0ZShtYXR0ZXJ0YWdJRCk7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubWF0dGVydGFnSURzLmluZGV4T2YobWF0dGVydGFnSUQpO1xuICAgICAgaWYgKGluZGV4ID4gLTEpIHRoaXMubWF0dGVydGFnSURzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignQ2Fubm90IGRlbGV0ZSB0YWcnLCBtYXR0ZXJ0YWdJRCwgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlbW92ZXMgdGhlIGxhc3QgYWRkZWQgdGFnIGZyb20gdGhlIHZpZXdlci4gKi9cbiAgYXN5bmMgZGVsZXRlTGFzdE1hdHRlcnRhZyhzZGs6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxhc3RTaWQgPSB0aGlzLmdldExhc3RUYWcoKTtcbiAgICBpZiAobGFzdFNpZCkgYXdhaXQgdGhpcy5kZWxldGVNYXR0ZXJ0YWdGcm9tSWQoc2RrLCBsYXN0U2lkKTtcbiAgfVxuXG4gIC8qKiBDbGVhcnMgYWxsIHRhZ3MgZnJvbSB0aGUgdmlld2VyIGFuZCByZXNldHMgbG9jYWwgc3RhdGUuICovXG4gIGFzeW5jIGFjdGlvbl9kZWxldGVfYWxsX21hdHRlcnRhZ3Moc2RrOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoc2RrKSB7XG4gICAgICBjb25zdCBzaWRzVG9SZW1vdmUgPSBbLi4udGhpcy5tYXR0ZXJ0YWdJRHNdO1xuICAgICAgZm9yIChjb25zdCBzaWQgb2Ygc2lkc1RvUmVtb3ZlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCBzaWQpLnJlbW92ZShzaWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7IH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIGNvbmZpZ3VyZXMgYSBNYXR0ZXJ0YWcgZnJvbSBhIFBPSSwgaGFuZGxpbmcgY29vcmRpbmF0ZXMsIG5vcm1hbHMsIGFuZCBzd2VlcCBJRC5cbiAgICogU2tpcHMgY3JlYXRpb24gaWYgYSB0YWcgZm9yIHRoZSBvYmplY3QgYWxyZWFkeSBleGlzdHMuXG4gICAqL1xuICBhc3luYyBjcmVhdGVNYXR0ZXJ0YWdGcm9tUE9JKFxuICAgIHNkazogYW55LFxuICAgIHRhZ1R5cGU6IFBvaVR5cGUsXG4gICAgb2JqZWN0OiBEYk9iamVjdFR5cGUsXG4gICAgcG9pOiBQT0ksXG4gICAgZ2V0VGFnRnJvbUVsZW1lbnRJZDogKGlkOiBzdHJpbmcpID0+IHsgdGFnOiBzdHJpbmc7IHN3ZWVwOiBzdHJpbmcgfSxcbiAgICBzZXRUYWdJY29uQW5kT3BhY2l0eTogKHNpZDogc3RyaW5nLCBtdDogTWF0dGVydGFnRGF0YSkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBpbmplY3RIdG1sSW5UYWc6ICh0eXBlOiBQb2lUeXBlLCBvYmo6IERiT2JqZWN0VHlwZSwgc2lkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB7IHRhZyB9ID0gZ2V0VGFnRnJvbUVsZW1lbnRJZChvYmplY3QuaWQpO1xuICAgIGlmICh0YWcpIHJldHVybjtcblxuICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEgPSBuZXcgTWF0dGVydGFnRGF0YSh0YWdUeXBlKTtcbiAgICBtYXR0ZXJ0YWdEYXRhLnNldE9iamVjdChvYmplY3QsIHRhZ1R5cGUpO1xuXG4gICAgaWYgKHBvaS5jb29yZGluYXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBtYXR0ZXJ0YWdEYXRhLnNldFBvc2l0aW9uKEpTT04ucGFyc2UocG9pLmNvb3JkaW5hdGUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Vycm9yIHBhcnNpbmcgUE9JIGNvb3JkaW5hdGVzJywgcG9pLmNvb3JkaW5hdGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwb2kubWV0YWRhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRhZ01ldGFkYXRhID0gSlNPTi5wYXJzZShwb2kubWV0YWRhdGEpO1xuICAgICAgICBtYXR0ZXJ0YWdEYXRhLnNldE5vcm1hbCh0YWdNZXRhZGF0YS5ub3JtYWwgfHwgeyB4OiAwLCB5OiAtMC4xNSwgejogMCB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXROb3JtYWwoeyB4OiAwLCB5OiAtMC4xNSwgejogMCB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocG9pLm1hdHRlcnBvcnRTd2VlcElEKSB7XG4gICAgICBtYXR0ZXJ0YWdEYXRhLnNldFN3ZWVwSUQocG9pLm1hdHRlcnBvcnRTd2VlcElEKTtcbiAgICB9XG4gICAgbWF0dGVydGFnRGF0YS5zZXRQb2kocG9pKTtcblxuICAgIGNvbnN0IGNyZWF0ZWRUYWdJRCA9IGF3YWl0IHRoaXMuYWRkTWF0dGVydGFnVG9WaWV3ZXIoc2RrLCBtYXR0ZXJ0YWdEYXRhKTtcblxuICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0nKTtcbiAgICBjb25zb2xlLmxvZygnZWxlbWVudCBpZCAnICsgbWF0dGVydGFnRGF0YS5lbGVtZW50SUQpO1xuICAgIGNvbnNvbGUubG9nKCdwb3NpdGlvbjogJywgbWF0dGVydGFnRGF0YS5nZXRQb3NpdGlvbigpKTtcbiAgICBjb25zb2xlLmxvZygncm90YXRpb246ICcsIG1hdHRlcnRhZ0RhdGEuZ2V0Um90YXRpb24oKSk7XG4gICAgY29uc29sZS5sb2coJ3N3ZWVwIGlkOiAnLCBtYXR0ZXJ0YWdEYXRhLmdldFN3ZWVwSUQoKSk7XG4gICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLScpO1xuXG5cbiAgICBpZiAoY3JlYXRlZFRhZ0lEICYmIHNkaykge1xuICAgICAgYXdhaXQgd2FpdCgxMDApO1xuICAgICAgYXdhaXQgc2V0VGFnSWNvbkFuZE9wYWNpdHkoY3JlYXRlZFRhZ0lELCBtYXR0ZXJ0YWdEYXRhKTtcbiAgICAgIGluamVjdEh0bWxJblRhZyh0YWdUeXBlLCBvYmplY3QsIGNyZWF0ZWRUYWdJRCkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0hUTUwgaW5qZWN0aW9uIGZhaWxlZCBmb3InLCBjcmVhdGVkVGFnSUQsIGVycik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlZFRhZ0lEO1xuICB9XG5cbiAgLyoqIFVwZGF0ZXMgdGhlIGljb24sIG9wYWNpdHksIGFuZCBIVE1MIGNvbnRlbnQgb2YgYW4gZXhpc3RpbmcgdGFnLiAqL1xuICBhc3luYyB1cGRhdGVNYXR0ZXJUYWdDb250ZW50Rm9yVGFnSUQoXG4gICAgc2RrOiBhbnksXG4gICAgbWF0dGVydGFnSUQ6IHN0cmluZyxcbiAgICBvYmplY3Q6IERiT2JqZWN0VHlwZSxcbiAgICBwb2lUeXBlOiBQb2lUeXBlLFxuICAgIHNldFRhZ0ljb25BbmRPcGFjaXR5OiAoc2lkOiBzdHJpbmcsIG10OiBNYXR0ZXJ0YWdEYXRhKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGluamVjdEh0bWxJblRhZzogKHR5cGU6IFBvaVR5cGUsIG9iajogRGJPYmplY3RUeXBlLCBzaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobWF0dGVydGFnSUQpO1xuICAgIGlmICghbWF0dGVydGFnRGF0YSkgcmV0dXJuO1xuXG4gICAgaWYgKG9iamVjdCkge1xuICAgICAgbWF0dGVydGFnRGF0YS5zZXRPYmplY3Qob2JqZWN0LCBwb2lUeXBlKTtcbiAgICB9XG5cbiAgICBhd2FpdCBzZXRUYWdJY29uQW5kT3BhY2l0eShtYXR0ZXJ0YWdJRCwgbWF0dGVydGFnRGF0YSk7XG4gICAgYXdhaXQgaW5qZWN0SHRtbEluVGFnKHBvaVR5cGUsIG9iamVjdCwgbWF0dGVydGFnSUQpO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVycyBhIGN1c3RvbSB0ZXh0dXJlIGFuZCBhcHBsaWVzIGl0IHRvIGEgdGFnLCBvcHRpb25hbGx5IGFkanVzdGluZyBvcGFjaXR5LiAqL1xuICBhc3luYyBhZGROZXdJY29uQW5kU2V0Rm9yVGFnKFxuICAgIHNkazogYW55LFxuICAgIG1hdHRlcnRhZ0lEOiBzdHJpbmcsXG4gICAgaWNvblBhdGg6IHN0cmluZyxcbiAgICBhcHBseU9wYWNpdHk6IGJvb2xlYW4sXG4gICAgb3BhY2l0eTogbnVtYmVyXG4gICkge1xuICAgIGlmICghc2RrKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGljb25OYW1lID0gYGN1c3RvbS1pY29uLSR7bWF0dGVydGFnSUR9YDtcbiAgICAgIGNvbnN0IHRhZ01vZHVsZSA9IHRoaXMuZ2V0VGFnTW9kdWxlKHNkaywgbWF0dGVydGFnSUQpO1xuICAgICAgYXdhaXQgc2RrLkFzc2V0LnJlZ2lzdGVyVGV4dHVyZShpY29uTmFtZSwgaWNvblBhdGgpO1xuICAgICAgYXdhaXQgdGFnTW9kdWxlLmVkaXRJY29uKG1hdHRlcnRhZ0lELCBpY29uTmFtZSk7XG5cbiAgICAgIGlmIChhcHBseU9wYWNpdHkpIHtcbiAgICAgICAgYXdhaXQgdGFnTW9kdWxlLmVkaXRPcGFjaXR5KG1hdHRlcnRhZ0lELCBvcGFjaXR5KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Vycm9yIHNldHRpbmcgY3VzdG9tIGljb24gb3Igb3BhY2l0eScsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKiogRmluZHMgdGhlIHRhZyBJRCBhbmQgc3dlZXAgSUQgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgZWxlbWVudCBJRC4gKi9cbiAgZ2V0VGFnRnJvbUVsZW1lbnRJZChlbGVtZW50SUQ6IHN0cmluZywgc3dlZXBzOiBzdHJpbmdbXSB8IG51bGwpOiB7IHRhZzogc3RyaW5nIHwgbnVsbDsgc3dlZXA6IHN0cmluZyB8IG51bGwgfSB7XG4gICAgbGV0IHRhZ0lEID0gbnVsbDtcbiAgICBsZXQgc3dlZXBJRCA9IG51bGw7XG4gICAgZm9yIChsZXQgW21hdHRlcnRhZ0lELCBtYXR0ZXJ0YWdEYXRhXSBvZiB0aGlzLmRpY3Rpb25uYXJ5VGFncykge1xuICAgICAgaWYgKG1hdHRlcnRhZ0RhdGEuZWxlbWVudElEID09PSBlbGVtZW50SUQpIHtcbiAgICAgICAgdGFnSUQgPSBtYXR0ZXJ0YWdJRDtcbiAgICAgICAgY29uc3Qgc3dlZXAgPSBtYXR0ZXJ0YWdEYXRhLmdldFN3ZWVwSUQoKTtcbiAgICAgICAgaWYgKHN3ZWVwICYmIHN3ZWVwcykge1xuICAgICAgICAgIC8vIHN3ZWVwIGlzIGEgdXVpZDsgc3dlZXBzIGFycmF5IGNvbnRhaW5zIHNpZHMg4oCTIGNoZWNrIGJvdGggZm9ybWF0c1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkU2lkID0gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZXNvbHZlU3dlZXBTaWQoc3dlZXApO1xuICAgICAgICAgIGlmIChzd2VlcHMuaW5jbHVkZXMoc3dlZXApIHx8IHN3ZWVwcy5pbmNsdWRlcyhyZXNvbHZlZFNpZCkpIHtcbiAgICAgICAgICAgIHN3ZWVwSUQgPSBzd2VlcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgdGFnOiB0YWdJRCwgc3dlZXA6IHN3ZWVwSUQgfTtcbiAgfVxuXG4gIC8qKiBSZXRyaWV2ZXMgdGhlIGZsb29yIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIGEgdGFnIGJhc2VkIG9uIGl0cyBzd2VlcCBkYXRhLlxuICAgKiAgSGFuZGxlcyBib3RoIHRoZSBvYmplY3QgZm9ybSAoeyBmbG9vckluZm86IHsgaWQsIHNlcXVlbmNlIH0sIGZsb29yOiB7IGlkIH0gfSlcbiAgICogIGFuZCB0aGUgcHJpbWl0aXZlIGZvcm0gKGZsb29yOiBudW1iZXIpIHVzZWQgYnkgTWF0dGVycG9ydCBTREsgdjMuXG4gICAqL1xuICBnZXRGbG9vcklkRm9yVGFnKG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEsIHN3ZWVwQ29sbGVjdGlvbjogYW55KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3Qgc3dlZXBJZCA9IG1hdHRlcnRhZ0RhdGEuZ2V0U3dlZXBJRCgpO1xuICAgIGlmICghc3dlZXBJZCB8fCAhc3dlZXBDb2xsZWN0aW9uKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHN3ZWVwRGF0YSA9IHN3ZWVwQ29sbGVjdGlvbltzd2VlcElkXTtcbiAgICBpZiAoIXN3ZWVwRGF0YSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBTREsgdjM6IHN3ZWVwLmZsb29yIGlzIGEgcHJpbWl0aXZlIG51bWJlciAodGhlIHNlcXVlbmNlIGluZGV4KVxuICAgIGlmICh0eXBlb2Ygc3dlZXBEYXRhLmZsb29yID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHN3ZWVwRGF0YS5mbG9vci50b1N0cmluZygpO1xuICAgIH1cblxuICAgIC8vIE9sZGVyIC8gZXh0ZW5kZWQgZm9ybWF0c1xuICAgIHJldHVybiBzd2VlcERhdGE/LmZsb29ySW5mbz8uaWRcbiAgICAgID8/IHN3ZWVwRGF0YT8uZmxvb3JJbmZvPy5zZXF1ZW5jZT8udG9TdHJpbmcoKVxuICAgICAgPz8gc3dlZXBEYXRhPy5mbG9vcklkXG4gICAgICA/PyBzd2VlcERhdGE/LmZsb29yPy5pZFxuICAgICAgPz8gc3dlZXBEYXRhPy5mbG9vcj8uc2VxdWVuY2U/LnRvU3RyaW5nKClcbiAgICAgID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogSW5qZWN0cyBjdXN0b20gSFRNTCBvciBmYWxsYmFjayBiaWxsYm9hcmQgbWVkaWEgaW50byBhIE1hdHRlcnRhZyBzYW5kYm94LlxuICAgKiBBdHRhY2hlcyBldmVudCBsaXN0ZW5lcnMgZm9yIGludGVyYWN0aXZlIGVsZW1lbnRzIHdpdGhpbiB0aGUgdGFnLlxuICAgKi9cbiAgYXN5bmMgaW5qZWN0SHRtbEluVGFnKHNkazogYW55LCB0YWdUeXBlOiBQb2lUeXBlLCBvYmplY3Q6IERiT2JqZWN0VHlwZSwgdGFnSUQ6IHN0cmluZykge1xuICAgIGlmICghdGhpcy50YWdTZXJ2aWNlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIHRhZ1NlcnZpY2UgaXMgbm90IGluaXRpYWxpemVkLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgbGV0IGh0bWwgPSBhd2FpdCB0aGlzLnRhZ1NlcnZpY2UuZ2V0SHRtbFRvSW5qZWN0KHRhZ1R5cGUsIG9iamVjdCk7XG5cbiAgICAgIGlmIChodG1sICYmIGh0bWwudHJpbSgpLmxlbmd0aCA+IDAgJiYgc2RrKSB7XG4gICAgICAgIGNvbnN0IHNjcmlwdFRhZyA9IHRoaXMudGFnU2VydmljZS5nZXRTY3JpcHRGb3JUYWcob2JqZWN0LCB0YWdUeXBlKTtcbiAgICAgICAgaHRtbCArPSBgJHtzY3JpcHRUYWd9YDtcblxuICAgICAgICBjb25zdCB0YWdNb2R1bGUgPSB0aGlzLmdldFRhZ01vZHVsZShzZGssIHRhZ0lEKTtcbiAgICAgICAgY29uc3QgW3NhbmRib3hJZCwgbWVzc2VuZ2VyXSA9IGF3YWl0IHNkay5UYWcucmVnaXN0ZXJTYW5kYm94KGh0bWwpO1xuXG4gICAgICAgIGNvbnN0IGF0dGFjaG1lbnRJRCA9IHRoaXMudGFnc0F0dGFjaG1lbnRzW3RhZ0lEXTtcbiAgICAgICAgaWYgKGF0dGFjaG1lbnRJRCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0YWdNb2R1bGUuZGV0YWNoKHRhZ0lELCBhdHRhY2htZW50SUQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50YWdzQXR0YWNobWVudHNbdGFnSURdID0gc2FuZGJveElkO1xuICAgICAgICBhd2FpdCB0YWdNb2R1bGUuYXR0YWNoKHRhZ0lELCBzYW5kYm94SWQpO1xuXG4gICAgICAgIC8vIEF0dGFjaCB0aGUgXCJWaWV3IGluZm9ybWF0aW9uc1wiIGhhbmRsZXIgaW4gdG9vbHRpcFxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLkRFVEFJTF9DTElDSywgdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uRGV0YWlsQ2xpY2suYmluZCh0aGlzLnRhZ1NlcnZpY2UpKTtcbiAgICAgICAgbWVzc2VuZ2VyLm9uKFRhZ0FjdGlvbi5USUNLRVRfQ0xJQ0ssIHRoaXMudGFnU2VydmljZS5vbkFjdGlvbkRldGFpbENsaWNrLmJpbmQodGhpcy50YWdTZXJ2aWNlKSk7XG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uQVVESU9fQ0xJQ0ssIChhdWRpb0NvbW1lbnRJRDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25BdWRpb0NsaWNrKGF1ZGlvQ29tbWVudElEKSk7XG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uVklERU9fQ0xJQ0ssICh2aWRlb1VybDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25WaWRlb0NsaWNrKHZpZGVvVXJsKSk7XG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uSU1BR0VfQ0xJQ0ssIChpbWFnZUNvbW1lbnRJRDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25JbWFnZUNsaWNrKGltYWdlQ29tbWVudElEKSk7XG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uRE9DX0NMSUNLLCAoZG9jVXJsOiBzdHJpbmcpID0+IHRoaXMudGFnU2VydmljZS5vbkFjdGlvbkRvY0NsaWNrKGRvY1VybCkpO1xuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLllPVVRVQkVfQ0xJQ0ssICh5b3V0dWJlVXJsOiBzdHJpbmcpID0+IHRoaXMudGFnU2VydmljZS5vbkFjdGlvbllvdXR1YmVDbGljayh5b3V0dWJlVXJsKSk7XG4gICAgICB9IGVsc2UgaWYgKHNkaykge1xuICAgICAgICBjb25zdCB7IGNvbW1lbnQsIHRhZ0Rlc2NyaXB0aW9uIH0gPSB0aGlzLnRhZ1NlcnZpY2UuZ2V0QmlsbGJvYXJkTWVkaWFUb0VtYmVkKG9iamVjdCk7XG5cbiAgICAgICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgICAgICBjb25zdCB0YWdNb2R1bGUgPSB0aGlzLmdldFRhZ01vZHVsZShzZGssIHRhZ0lEKTtcbiAgICAgICAgICAvLyAxKSBSZWdpc3RlciB0aGUgbWVkaWEgYXR0YWNobWVudCBieSBwYXNzaW5nIHRoZSBVUkwgc3RyaW5nKHMpLlxuICAgICAgICAgIC8vICAgIHJlZ2lzdGVyQXR0YWNobWVudCByZXR1cm5zIGFuIGFycmF5IG9mIGF0dGFjaG1lbnQgSURzLlxuICAgICAgICAgIGNvbnN0IFthdHRhY2htZW50SURdID0gYXdhaXQgc2RrLlRhZy5yZWdpc3RlckF0dGFjaG1lbnQoY29tbWVudC5leHRlcm5hbExpbmspO1xuXG4gICAgICAgICAgLy8gMikgQXR0YWNoIHRoZSByZWdpc3RlcmVkIG1lZGlhIHRvIHRoZSB0YWcuXG4gICAgICAgICAgYXdhaXQgdGFnTW9kdWxlLmF0dGFjaCh0YWdJRCwgYXR0YWNobWVudElEKTtcblxuICAgICAgICAgIC8vIDMpIERldGVybWluZSBtZWRpYSB0eXBlIGZvciB0aGUgYmlsbGJvYXJkIChQSE9UTyBvciBWSURFTykuXG4gICAgICAgICAgLy8gICAgVXNlIGEgc2ltcGxlIGhldXJpc3RpYzogWW91VHViZS9WaW1lbyAtPiBWSURFTywgb3RoZXJ3aXNlIFBIT1RPLlxuICAgICAgICAgIC8vICAgIFRoZSBTREsgZXhwb3NlcyBNZWRpYVR5cGUgb24gdGhlIFRhZyBuYW1lc3BhY2UuXG4gICAgICAgICAgY29uc3QgaXNWaWRlbyA9IC95b3V0dWJlXFwuY29tfHlvdXR1XFwuYmV8dmltZW9cXC5jb20vaS50ZXN0KGNvbW1lbnQuZXh0ZXJuYWxMaW5rKTtcbiAgICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSBpc1ZpZGVvID8gc2RrLk1hdHRlcnRhZy5NZWRpYVR5cGUuVklERU8gOiBzZGsuTWF0dGVydGFnLk1lZGlhVHlwZS5QSE9UTztcblxuICAgICAgICAgIC8vIDQpIFVwZGF0ZSB0aGUgYmlsbGJvYXJkIHRleHQgYW5kIG1lZGlhIHVzaW5nIGVkaXRCaWxsYm9hcmQuXG4gICAgICAgICAgLy8gICAgZWRpdEJpbGxib2FyZCBhY2NlcHRzIFBhcnRpYWw8VGFnLkVkaXRhYmxlUHJvcGVydGllcz4gc3VjaCBhcyBsYWJlbCwgZGVzY3JpcHRpb24sIG1lZGlhLlxuICAgICAgICAgIGF3YWl0IHRhZ01vZHVsZS5lZGl0QmlsbGJvYXJkKHRhZ0lELCB7XG4gICAgICAgICAgICBsYWJlbDogb2JqZWN0LnRpdGxlIHx8ICdNZWRpYScsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGFnRGVzY3JpcHRpb24gfHwgJycsXG4gICAgICAgICAgICBtZWRpYToge1xuICAgICAgICAgICAgICB0eXBlOiBtZWRpYVR5cGUsXG4gICAgICAgICAgICAgIHNyYzogY29tbWVudC5leHRlcm5hbExpbmssXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gNSkgS2VlcCBhIGxvY2FsIHJlZmVyZW5jZVxuICAgICAgICAgIHRoaXMudGFnc0F0dGFjaG1lbnRzW3RhZ0lEXSA9IHtcbiAgICAgICAgICAgIGF0dGFjaG1lbnRJRCxcbiAgICAgICAgICAgIHRpdGxlOiBvYmplY3QudGl0bGUgfHwgJ01lZGlhJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0YWdEZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgICAgICAgIG1lZGlhU3JjOiBjb21tZW50LmV4dGVybmFsTGluayxcbiAgICAgICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tNYXR0ZXJwb3J0VGFnU2VydmljZV0gRXJyb3IgaW4gaW5qZWN0SHRtbEluVGFnOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2xlYXJzIGFsbCBsb2NhbCB0YWcgZGF0YSBhbmQgcmVzZXRzIHRoZSBhZGRpdGlvbiBxdWV1ZS4gKi9cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuY2xlYXIoKTtcbiAgICB0aGlzLnRhZ3NDdXJyZW50T3BhY2l0eS5jbGVhcigpO1xuICAgIHRoaXMudGFnc0N1cnJlbnRFbmFibGVkLmNsZWFyKCk7XG4gICAgdGhpcy50YWdBZGRRdWV1ZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHRoaXMubWF0dGVydGFnVG9Gb2xsb3cgPSBudWxsO1xuICAgIHRoaXMubWF0dGVydGFnSURzID0gW107XG4gICAgLy8gQSBuZXcgc3BhY2UgbWVhbnMgYSBuZXcgU0RLIHNlc3Npb24sIGhlbmNlIGEgbmV3IHNoYXJlZCBsYXllciB0byBjcmVhdGUuXG4gICAgdGhpcy5zaGFyZWRUYWdMYXllciA9IG51bGw7XG4gICAgdGhpcy5zaGFyZWRUYWdMYXllclByb21pc2UgPSBudWxsO1xuICB9XG59XG4iXX0=
|
|
683
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC10YWcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvc2VydmljZXMvbWF0dGVycG9ydC10YWcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQWtELFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQU0xQyxNQUFNLE9BQU8sb0JBQW9CO0lBdUNyQjtJQXRDVixvRUFBb0U7SUFDNUQsTUFBTSxDQUFVLHFCQUFxQixHQUFHLHlCQUF5QixDQUFDO0lBRW5FLGVBQWUsR0FBK0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN4RCxXQUFXLEdBQWlCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM5QyxpQkFBaUIsR0FBa0IsSUFBSSxDQUFDO0lBQ3hDLFNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO0lBQ2xDLFlBQVksR0FBa0IsRUFBRSxDQUFDO0lBQ2pDLGVBQWUsR0FBVyxFQUFFLENBQUM7SUFDN0IsY0FBYyxHQUFZLEtBQUssQ0FBQztJQUNoQyxVQUFVLEdBQTBCLElBQUksQ0FBQztJQUN4QyxrQkFBa0IsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNwRCxrQkFBa0IsR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUM3RCwrRUFBK0U7SUFDdkUsZUFBZSxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3pELHlHQUF5RztJQUNq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b0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLDJFQUEyRTtRQUMzRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO0lBQ3BDLENBQUM7d0dBdnRCVSxvQkFBb0I7NEdBQXBCLG9CQUFvQixjQUZuQixNQUFNOzs0RkFFUCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNEZXZNb2RlLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTWF0dGVydGFnRGF0YSB9IGZyb20gJy4uL21hdHRlcnRhZ0RhdGEnO1xyXG5pbXBvcnQgeyBQb2lUeXBlLCBEYk9iamVjdFR5cGUsIFBPSSwgVmlld2VySW50ZXJhY3Rpb25zLCBUYWdBY3Rpb24sIENhbWVyYU1vZGUgfSBmcm9tICcuLi90eXBlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWF0dGVycG9ydE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9tYXR0ZXJwb3J0LW5hdmlnYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IHdhaXQgfSBmcm9tICcuLi9oZWxwZXJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlVGFnU2VydmljZSB9IGZyb20gJy4vdGFnLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIE1hdHRlcnBvcnRUYWdTZXJ2aWNlIHtcclxuICAvKiogTmFtZSBvZiB0aGUgY29tbW9uIGxheWVyIGV2ZXJ5IFNtYXJ0ZXJwbGFuIHRhZyBpcyBjcmVhdGVkIGluLiAqL1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNIQVJFRF9UQUdfTEFZRVJfTkFNRSA9ICdzbWFydGVycGxhbi1zaGFyZWQtdGFncyc7XHJcblxyXG4gIHB1YmxpYyBkaWN0aW9ubmFyeVRhZ3M6IE1hcDxzdHJpbmcsIE1hdHRlcnRhZ0RhdGE+ID0gbmV3IE1hcCgpO1xyXG4gIHB1YmxpYyB0YWdBZGRRdWV1ZTogUHJvbWlzZTxhbnk+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgcHVibGljIG1hdHRlcnRhZ1RvRm9sbG93OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBwdWJsaWMgb25Hb1RvVGFnID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xyXG4gIHB1YmxpYyBtYXR0ZXJ0YWdJRHM6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuICBwdWJsaWMgdGFnc0F0dGFjaG1lbnRzOiBPYmplY3QgPSB7fTtcclxuICBwdWJsaWMgdGFnTWVzc2VuZ2VyT246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgdGFnU2VydmljZTogQmFzZVRhZ1NlcnZpY2UgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHRhZ3NDdXJyZW50T3BhY2l0eTogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcclxuICBwcml2YXRlIHRhZ3NDdXJyZW50RW5hYmxlZDogTWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKCk7XHJcbiAgLyoqIHRhZ0lkIC0+IGljb24gbmFtZSBsYXN0IGFwcGxpZWQsIHNvIGFuIHVuY2hhbmdlZCBpY29uIGlzIG5vdCByZS1hcHBsaWVkLiAqL1xyXG4gIHByaXZhdGUgdGFnc0N1cnJlbnRJY29uOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xyXG4gIC8qKiBJZHMgb2YgdGhlIGdsb2JhbCBTREsgVGFnIGNvbGxlY3Rpb24sIGFuZCB0aGUgdGFncyB3YWl0aW5nIHRvIGFwcGVhciBpbiBpdCwgc2VlIHdhaXRGb3JUYWdJblNkaygpLiAqL1xyXG4gIHByaXZhdGUgc2RrVGFnSWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcclxuICBwcml2YXRlIHNka1RhZ1dhaXRlcnM6IE1hcDxzdHJpbmcsIEFycmF5PCgpID0+IHZvaWQ+PiA9IG5ldyBNYXAoKTtcclxuICBwcml2YXRlIHNka1RhZ1N1YnNjcmlwdGlvbjogYW55ID0gbnVsbDtcclxuICBwcml2YXRlIHNka1RhZ1N1YnNjcmlwdGlvblNkazogYW55ID0gbnVsbDtcclxuICAvKipcclxuICAgKiBTaW5nbGUgbGF5ZXIgaG9sZGluZyBldmVyeSBTbWFydGVycGxhbiB0YWcsIGFkZGVkIHRvIGV2ZXJ5IHZpZXcgb2YgdGhlIHNwYWNlIHNvIGFcclxuICAgKiB0YWcgc3RheXMgaW4gcGxhY2Ug4oCUIHNhbWUgc2lkLCBzYW1lIGNvbnRlbnQg4oCUIHdoZW4gdGhlIHVzZXIgc3dpdGNoZXMgYmV0d2VlbiB0aGVcclxuICAgKiBmdXJuaXNoZWQgYW5kIHRoZSBEZWZ1cm5pc2hlZCB2aWV3LiBUYWdzIGFkZGVkIHRvIHRoZSBnbG9iYWwgc2RrLlRhZyAob3IgdG8gYVxyXG4gICAqIHZpZXcncyBvd24gbGF5ZXIpIGJlbG9uZyB0byB0aGF0IHZpZXcgb25seSwgd2hpY2ggaXMgd2hhdCBtYWRlIHRoZW0gcG9wIGluIGFuZCBvdXRcclxuICAgKiBvbiBldmVyeSB2aWV3IGNoYW5nZS5cclxuICAgKlxyXG4gICAqIERlbGliZXJhdGVseSBOT1QgY3JlYXRlZCB3aXRoIGB7IGNvbW1vbjogdHJ1ZSB9YDogaW4gU0RLIDI2LjcuNSBhIGNvbW1vbiBsYXllciBpc1xyXG4gICAqIHB1c2hlZCBpbnRvIGBnZXRPcmRlcmVkTW9kZWxWaWV3cygpYCBhdCBjcmVhdGlvbiB0aW1lLCBhbmQgdGhhdCBjYWxsIGRlZmF1bHRzIHRvXHJcbiAgICogYGluY2x1ZGVEZWZ1cm5pc2g6IGZhbHNlYCwgc28gdGhlIERlZnVybmlzaGVkIHZpZXcgbmV2ZXIgcmVjZWl2ZXMgaXQg4oCUIHdoaWxlXHJcbiAgICogYFZpZXcuYWRkTGF5ZXIoKWAgcmVmdXNlcyB0byByZXBhaXIgaXQgKFwiTGF5ZXIgaXMgY29tbW9uLiBObyBuZWVkIHRvIGFkZC5cIikuIEFcclxuICAgKiBwbGFpbiBsYXllciB3ZSBhdHRhY2ggdG8gZWFjaCB2aWV3IG91cnNlbHZlcyByZWFjaGVzIGV2ZXJ5IHZpZXcsIERlZnVybmlzaGVkXHJcbiAgICogaW5jbHVkZWQuIFNlZSBhdHRhY2hTaGFyZWRUYWdMYXllclRvVmlld3MoKS5cclxuICAgKi9cclxuICBwcml2YXRlIHNoYXJlZFRhZ0xheWVyOiBhbnkgPSBudWxsO1xyXG4gIHByaXZhdGUgc2hhcmVkVGFnTGF5ZXJQcm9taXNlOiBQcm9taXNlPGFueT4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG5hdmlnYXRpb25TZXJ2aWNlOiBNYXR0ZXJwb3J0TmF2aWdhdGlvblNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBzZXRUYWdTZXJ2aWNlKHNlcnZpY2U6IEJhc2VUYWdTZXJ2aWNlKTogdm9pZCB7XHJcbiAgICB0aGlzLnRhZ1NlcnZpY2UgPSBzZXJ2aWNlO1xyXG4gIH1cclxuXHJcbiAgLyoqIE9wZW5zIGEgc3BlY2lmaWMgdGFnIGluIHRoZSBNYXR0ZXJwb3J0IHZpZXdlciBieSBpdHMgSUQuICovXHJcbiAgYXN5bmMgZ29Ub1RhZyhzZGs6IGFueSwgc2lkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgaWYgKCFzZGspIHJldHVybjtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMub25Hb1RvVGFnLm5leHQoc2lkKTtcclxuICAgICAgLy8gYG9wZW5gIG9ubHkgZXhpc3RzIG9uIHRoZSBnbG9iYWwgVGFnIG1vZHVsZSwgbmV2ZXIgb24gYSBsYXllci1zY29wZWQgb25lLlxyXG4gICAgICBhd2FpdCBzZGsuVGFnLm9wZW4oc2lkKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Nhbm5vdCBvcGVuIHRhZycsIHNpZCwgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBTREsgVGFnIG1vZHVsZSB0byB1c2UgZm9yIGFuIG9wZXJhdGlvbiBhZGRyZXNzaW5nIGFuIGV4aXN0aW5nIHRhZyBieSBJRFxyXG4gICAqIChpY29uLCBvcGFjaXR5LCBwb3NpdGlvbiwgYXR0YWNobWVudHMsIHJlbW92YWwuLi4pOiBhbHdheXMgdGhlIGdsb2JhbCBzZGsuVGFnLlxyXG4gICAqXHJcbiAgICogQSBsYXllci1zY29wZWQgVGFnIG1vZHVsZSBvbmx5IGV4cG9zZXMgdGhlICpyZXBsYXlhYmxlKiBtdXRhdGlvbnMsIG1lYW50IHRvIGJ1aWxkXHJcbiAgICogdGhlIGxheWVyJ3Mgb3duIGNvbnRlbnQ7IGFwcGx5aW5nIHRoZW0gdG8gYW4gYWxyZWFkeS1jcmVhdGVkIHRhZyBzaWxlbnRseSBkb2VzXHJcbiAgICogbm90aGluZyDigJQgd2hpY2ggaXMgd2hhdCBsZWZ0IGV2ZXJ5IHBpbiB3aGl0ZSBpbnN0ZWFkIG9mIGNhcnJ5aW5nIGl0cyBpY29uLiBPbmx5XHJcbiAgICogYGFkZGAgaGFzIHRvIGdvIHRocm91Z2ggdGhlIGxheWVyLCBzZWUgZ2V0VGFnQ3JlYXRpb25Nb2R1bGUoKS4gVGhlIGdsb2JhbCBtb2R1bGVcclxuICAgKiBvbmx5IGtub3dzIGEgbGF5ZXItY3JlYXRlZCBwaW4gb25jZSBpdCBpcyByZW5kZXJlZDogc2VlIHdhaXRGb3JUYWdJblNkaygpLlxyXG4gICAqL1xyXG4gIGdldFRhZ01vZHVsZShzZGs6IGFueSwgdGFnSWQ6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gc2RrPy5UYWc7XHJcbiAgfVxyXG5cclxuICAvKiogSWNvbiBuYW1lIGxhc3QgYXBwbGllZCB0byBhIHRhZywgaWYgYW55LiAqL1xyXG4gIGdldENhY2hlZFRhZ0ljb24odGFnSWQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy50YWdzQ3VycmVudEljb24uZ2V0KHRhZ0lkKTtcclxuICB9XHJcblxyXG4gIC8qKiBBcHBsaWVzIGFuIGljb24gdG8gYSB0YWcgdGhyb3VnaCBpdHMgb3duIG1vZHVsZSBhbmQgcmVtZW1iZXJzIGl0IG9uIHN1Y2Nlc3MuICovXHJcbiAgYXN5bmMgZWRpdFRhZ0ljb24oc2RrOiBhbnksIHRhZ0lkOiBzdHJpbmcsIGljb25OYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuZ2V0VGFnTW9kdWxlKHNkaywgdGFnSWQpLmVkaXRJY29uKHRhZ0lkLCBpY29uTmFtZSk7XHJcbiAgICB0aGlzLnRhZ3NDdXJyZW50SWNvbi5zZXQodGFnSWQsIGljb25OYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc29sdmVzIG9uY2UgdGhlIGdsb2JhbCBTREsgVGFnIGNvbGxlY3Rpb24g4oCUIHRoZSBvbmUgZWRpdHMgZ28gdGhyb3VnaCDigJQgY29udGFpbnMgdGhlXHJcbiAgICogdGFnLCBzbyBlZGl0cyBkbyBub3QgaGl0IGEgcGluIHRoYXQgaXMgbm90IHJlbmRlcmVkIHlldCAoXCJzZXRQaW5SZW5kZXJPdmVycmlkZXMgb24gYSBwaW5cclxuICAgKiB0aGF0IGRvZXNuJ3QgZXhpc3RcIikuIEdpdmVzIHVwIGFmdGVyIGB0aW1lb3V0TXNgIGFuZCByZXNvbHZlcyBhbnl3YXk7IGZhbGxzIGJhY2sgdG8gYVxyXG4gICAqIHNob3J0IHdhaXQgd2hlbiB0aGUgY29sbGVjdGlvbiBjYW5ub3QgYmUgb2JzZXJ2ZWQuIE9uZSBzdWJzY3JpcHRpb24gaXMgc2hhcmVkIGJ5IGV2ZXJ5XHJcbiAgICogd2FpdGluZyB0YWc6IGEgc3BhY2UgbG9hZHMgaHVuZHJlZHMgb2YgdGhlbS5cclxuICAgKi9cclxuICBwcml2YXRlIHdhaXRGb3JUYWdJblNkayhzZGs6IGFueSwgdGFnSWQ6IHN0cmluZywgdGltZW91dE1zID0gMTUwMCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0YWdJZCB8fCAhdGhpcy5vYnNlcnZlU2RrVGFncyhzZGspKSByZXR1cm4gd2FpdCgxMDApO1xyXG4gICAgaWYgKHRoaXMuc2RrVGFnSWRzLmhhcyh0YWdJZCkpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcclxuICAgICAgY29uc3Qgd2FpdGVycyA9IHRoaXMuc2RrVGFnV2FpdGVycy5nZXQodGFnSWQpIHx8IFtdO1xyXG4gICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlbWFpbmluZyA9ICh0aGlzLnNka1RhZ1dhaXRlcnMuZ2V0KHRhZ0lkKSB8fCBbXSkuZmlsdGVyKHdhaXRlciA9PiB3YWl0ZXIgIT09IGRvbmUpO1xyXG4gICAgICAgIGlmIChyZW1haW5pbmcubGVuZ3RoKSB0aGlzLnNka1RhZ1dhaXRlcnMuc2V0KHRhZ0lkLCByZW1haW5pbmcpO1xyXG4gICAgICAgIGVsc2UgdGhpcy5zZGtUYWdXYWl0ZXJzLmRlbGV0ZSh0YWdJZCk7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9LCB0aW1lb3V0TXMpO1xyXG4gICAgICBjb25zdCBkb25lID0gKCkgPT4geyBjbGVhclRpbWVvdXQodGltZXIpOyByZXNvbHZlKCk7IH07XHJcbiAgICAgIHdhaXRlcnMucHVzaChkb25lKTtcclxuICAgICAgdGhpcy5zZGtUYWdXYWl0ZXJzLnNldCh0YWdJZCwgd2FpdGVycyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBLZWVwcyBzZGtUYWdJZHMgaW4gc3luYyB3aXRoIHRoZSBnbG9iYWwgU0RLIFRhZyBjb2xsZWN0aW9uOyBmYWxzZSB3aGVuIGl0IGNhbm5vdCBiZSBvYnNlcnZlZC4gKi9cclxuICBwcml2YXRlIG9ic2VydmVTZGtUYWdzKHNkazogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5zZGtUYWdTdWJzY3JpcHRpb24gJiYgdGhpcy5zZGtUYWdTdWJzY3JpcHRpb25TZGsgPT09IHNkaykgcmV0dXJuIHRydWU7XHJcbiAgICBjb25zdCBkYXRhID0gc2RrPy5UYWc/LmRhdGE7XHJcbiAgICBpZiAodHlwZW9mIGRhdGE/LnN1YnNjcmliZSAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHRoaXMuc3RvcE9ic2VydmluZ1Nka1RhZ3MoKTtcclxuICAgIGNvbnN0IG1hcmtQcmVzZW50ID0gKGlkOiBzdHJpbmcpID0+IHtcclxuICAgICAgdGhpcy5zZGtUYWdJZHMuYWRkKGlkKTtcclxuICAgICAgY29uc3Qgd2FpdGVycyA9IHRoaXMuc2RrVGFnV2FpdGVycy5nZXQoaWQpO1xyXG4gICAgICBpZiAod2FpdGVycykge1xyXG4gICAgICAgIHRoaXMuc2RrVGFnV2FpdGVycy5kZWxldGUoaWQpO1xyXG4gICAgICAgIHdhaXRlcnMuZm9yRWFjaCh3YWl0ZXIgPT4gd2FpdGVyKCkpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5zZGtUYWdTdWJzY3JpcHRpb25TZGsgPSBzZGs7XHJcbiAgICAgIHRoaXMuc2RrVGFnU3Vic2NyaXB0aW9uID0gZGF0YS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG9uQWRkZWQ6IChpZDogc3RyaW5nKSA9PiBtYXJrUHJlc2VudChpZCksXHJcbiAgICAgICAgb25SZW1vdmVkOiAoaWQ6IHN0cmluZykgPT4gdGhpcy5zZGtUYWdJZHMuZGVsZXRlKGlkKSxcclxuICAgICAgICBvbkNvbGxlY3Rpb25VcGRhdGVkOiAoY29sbGVjdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpZHM6IHN0cmluZ1tdID0gdHlwZW9mIGNvbGxlY3Rpb24/LmtleXMgPT09ICdmdW5jdGlvbidcclxuICAgICAgICAgICAgPyBBcnJheS5mcm9tKGNvbGxlY3Rpb24ua2V5cygpKSA6IE9iamVjdC5rZXlzKGNvbGxlY3Rpb24gfHwge30pO1xyXG4gICAgICAgICAgdGhpcy5zZGtUYWdJZHMgPSBuZXcgU2V0KGlkcyk7XHJcbiAgICAgICAgICBpZHMuZm9yRWFjaChpZCA9PiB0aGlzLnNka1RhZ1dhaXRlcnMuaGFzKGlkKSAmJiBtYXJrUHJlc2VudChpZCkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICB0aGlzLnNka1RhZ1N1YnNjcmlwdGlvblNkayA9IG51bGw7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RvcE9ic2VydmluZ1Nka1RhZ3MoKTogdm9pZCB7XHJcbiAgICB0cnkgeyB0aGlzLnNka1RhZ1N1YnNjcmlwdGlvbj8uY2FuY2VsPy4oKTsgfSBjYXRjaCB7IH1cclxuICAgIHRoaXMuc2RrVGFnU3Vic2NyaXB0aW9uID0gbnVsbDtcclxuICAgIHRoaXMuc2RrVGFnU3Vic2NyaXB0aW9uU2RrID0gbnVsbDtcclxuICAgIHRoaXMuc2RrVGFnSWRzLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBUYWcgbW9kdWxlIGV2ZXJ5IG5ldyB0YWcgbXVzdCBiZSBjcmVhdGVkIHRocm91Z2g6IHRoZSBzaGFyZWQgbGF5ZXJcclxuICAgKiB3aGVuIHRoZSBWaWV3IEFQSSBpcyBhdmFpbGFibGUsIHRoZSBnbG9iYWwgc2RrLlRhZyBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0VGFnQ3JlYXRpb25Nb2R1bGUoc2RrOiBhbnkpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgbGF5ZXIgPSBhd2FpdCB0aGlzLmVuc3VyZVNoYXJlZFRhZ0xheWVyKHNkayk7XHJcbiAgICByZXR1cm4gbGF5ZXI/LlRhZyB8fCBzZGs/LlRhZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgKG9uY2UgcGVyIFNESyBzZXNzaW9uKSBhbmQgcmV0dXJucyB0aGUgc2hhcmVkIHRhZyBsYXllci5cclxuICAgKiBSZXNvbHZlcyB0byBudWxsIHdoZW4gdGhlIFZpZXcgQVBJIGlzIHVuYXZhaWxhYmxlLCBzbyBjYWxsZXJzIHRyYW5zcGFyZW50bHkgZmFsbFxyXG4gICAqIGJhY2sgdG8gdGhlIGdsb2JhbCBzZGsuVGFnLlxyXG4gICAqL1xyXG4gIGFzeW5jIGVuc3VyZVNoYXJlZFRhZ0xheWVyKHNkazogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICh0aGlzLnNoYXJlZFRhZ0xheWVyKSByZXR1cm4gdGhpcy5zaGFyZWRUYWdMYXllcjtcclxuICAgIGlmICghc2RrPy5WaWV3Py5jcmVhdGVMYXllcikgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgaWYgKCF0aGlzLnNoYXJlZFRhZ0xheWVyUHJvbWlzZSkge1xyXG4gICAgICB0aGlzLnNoYXJlZFRhZ0xheWVyUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShcclxuICAgICAgICBzZGsuVmlldy5jcmVhdGVMYXllcihNYXR0ZXJwb3J0VGFnU2VydmljZS5TSEFSRURfVEFHX0xBWUVSX05BTUUpXHJcbiAgICAgIClcclxuICAgICAgICAudGhlbihhc3luYyAobGF5ZXI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaGFyZWRUYWdMYXllciA9IGxheWVyO1xyXG4gICAgICAgICAgLy8gQSBmcmVzaGx5IGNyZWF0ZWQgbGF5ZXIgY2FuIGNvbWUgYmFjayB0b2dnbGVkIG9mZiwgd2hpY2ggaGlkZXMgaXRzIHRhZ3MuXHJcbiAgICAgICAgICBpZiAobGF5ZXIgJiYgbGF5ZXIudG9nZ2xlZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgYXdhaXQgbGF5ZXIudG9nZ2xlKHRydWUpLmNhdGNoKCgpID0+IHsgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gbGF5ZXI7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goKGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgLy8gQWxsb3cgYSBsYXRlciByZXRyeSAoZS5nLiB0aGUgU0RLIHdhcyBub3QgZnVsbHkgcmVhZHkgeWV0KS5cclxuICAgICAgICAgIHRoaXMuc2hhcmVkVGFnTGF5ZXJQcm9taXNlID0gbnVsbDtcclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIENvdWxkIG5vdCBjcmVhdGUgdGhlIHNoYXJlZCB0YWcgbGF5ZXInLCBlKTtcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnNoYXJlZFRhZ0xheWVyUHJvbWlzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ha2VzIHN1cmUgdGhlIHNoYXJlZCBsYXllciBpcyBwYXJ0IG9mIGV2ZXJ5IHZpZXcgb2YgdGhlIHNwYWNlLCBEZWZ1cm5pc2hlZFxyXG4gICAqIGluY2x1ZGVkLiBUaGlzIGlzIHdoYXQgYWN0dWFsbHkgc2hhcmVzIHRoZSB0YWdzIGFjcm9zcyB2aWV3cywgYW5kIHRoZSByZWFzb24gdGhlXHJcbiAgICogbGF5ZXIgbXVzdCBub3QgYmUgYSBjb21tb24gb25lOiB0aGUgU0RLIG9ubHkgcGVyZm9ybXMgdGhlIGF0dGFjaG1lbnQgZm9yXHJcbiAgICogbm9uLWNvbW1vbiBsYXllcnMuIElkZW1wb3RlbnQsIHNvIGl0IGNhbiBydW4gb24gZXZlcnkgdmlldyBjb2xsZWN0aW9uIHVwZGF0ZS5cclxuICAgKi9cclxuICBhc3luYyBhdHRhY2hTaGFyZWRUYWdMYXllclRvVmlld3Moc2RrOiBhbnksIHZpZXdzOiBJdGVyYWJsZTxhbnk+KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBsYXllciA9IGF3YWl0IHRoaXMuZW5zdXJlU2hhcmVkVGFnTGF5ZXIoc2RrKTtcclxuICAgIGlmICghbGF5ZXIpIHJldHVybjtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHZpZXcgb2Ygdmlld3MpIHtcclxuICAgICAgaWYgKCF2aWV3Py5hZGRMYXllciB8fCB2aWV3Lmhhc0xheWVyPy4obGF5ZXIpKSBjb250aW51ZTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCB2aWV3LmFkZExheWVyKGxheWVyKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIENhbm5vdCBhZGQgdGhlIHNoYXJlZCB0YWcgbGF5ZXIgdG8gdmlldycsIHZpZXc/LmlkLCBlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBhIHRhZyB0aHJvdWdoIHRoZSBzaGFyZWQgbGF5ZXIgc28gaXQgZXhpc3RzIGluIGV2ZXJ5IHZpZXcuIEZhbGxzIGJhY2tcclxuICAgKiB0byB0aGUgZ2xvYmFsIHNkay5UYWcgd2hlbiB0aGUgVmlldyBBUEkgaXMgdW5hdmFpbGFibGU7IHRoYXQgY2FsbCBpcyByYWNlZCBhZ2FpbnN0XHJcbiAgICogYSB0aW1lb3V0IGFzIGEgc2FmZXR5IG5ldCwgc2luY2UgaXQgbmV2ZXIgcmVzb2x2ZXMgd2hpbGUgYSBEZWZ1cm5pc2hlZCB2aWV3IGlzXHJcbiAgICogYWN0aXZlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgYWRkVGFnVG9TZGsoc2RrOiBhbnksIGRlc2NyaXB0b3I6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcclxuICAgIGNvbnN0IHNoYXJlZFRhZ01vZHVsZSA9IGF3YWl0IHRoaXMuZ2V0VGFnQ3JlYXRpb25Nb2R1bGUoc2RrKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBzaWRMaXN0ID0gKGF3YWl0IFByb21pc2UucmFjZShbXHJcbiAgICAgICAgc2hhcmVkVGFnTW9kdWxlLmFkZChkZXNjcmlwdG9yKSxcclxuICAgICAgICBuZXcgUHJvbWlzZTxuZXZlcj4oKF8sIHJlamVjdCkgPT5cclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignVGFnLmFkZCB0aW1lZCBvdXQnKSksIDQwMDApXHJcbiAgICAgICAgKSxcclxuICAgICAgXSkpIGFzIHN0cmluZ1tdO1xyXG4gICAgICBpZiAoc2lkTGlzdD8ubGVuZ3RoKSByZXR1cm4gc2lkTGlzdFswXTtcclxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgaWYgKGVycm9yPy5tZXNzYWdlPy5pbmNsdWRlcygnYWxyZWFkeSBpbiB1c2UnKSkgdGhyb3cgZXJyb3I7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIFRhZy5hZGQgZmFpbGVkL3RpbWVkIG91dCcsIGVycm9yPy5tZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKiBPcGVucyB0aGUgbW9zdCByZWNlbnRseSBjcmVhdGVkIHRhZyBpbiB0aGUgdmlld2VyLiAqL1xyXG4gIGFzeW5jIGdvVG9MYXN0VGFnKHNkazogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICghc2RrIHx8IHRoaXMubWF0dGVydGFnSURzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgY29uc3QgbGFzdFNpZCA9IHRoaXMubWF0dGVydGFnSURzW3RoaXMubWF0dGVydGFnSURzLmxlbmd0aCAtIDFdO1xyXG4gICAgcmV0dXJuIHRoaXMuZ29Ub1RhZyhzZGssIGxhc3RTaWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBhIE1hdHRlcnRhZyB0byB0aGUgdmlld2VyLCBzZXJpYWxpemluZyBjYWxscyB0byBwcmV2ZW50IFNESyByYWNlIGNvbmRpdGlvbnMuXHJcbiAgICogUmV1c2VzIGV4aXN0aW5nIElEcyBpZiB0aGUgdGFnIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgc2Vzc2lvbi5cclxuICAgKi9cclxuICBhc3luYyBhZGRNYXR0ZXJ0YWdUb1ZpZXdlcihzZGs6IGFueSwgbWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xyXG4gICAgaWYgKCFzZGspIHJldHVybiBudWxsO1xyXG5cclxuICAgIHRoaXMudGFnQWRkUXVldWUgPSB0aGlzLnRhZ0FkZFF1ZXVlXHJcbiAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gbWF0dGVydGFnRGF0YS5nZXRNYXR0ZXJ0YWdEZXNjcmlwdG9yKClbMF07XHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IGRlc2NyaXB0b3I/LmlkIHx8IG51bGw7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBzaWQgPSBhd2FpdCB0aGlzLmFkZFRhZ1RvU2RrKHNkaywgZGVzY3JpcHRvcik7XHJcbiAgICAgICAgICBpZiAoc2lkKSB7XHJcbiAgICAgICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0TWF0dGVycG9ydFNpZChzaWQpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMubWF0dGVydGFnSURzLmluY2x1ZGVzKHNpZCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLm1hdHRlcnRhZ0lEcy5wdXNoKHNpZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2V0KHNpZCwgbWF0dGVydGFnRGF0YSk7XHJcbiAgICAgICAgICAgIHJldHVybiBzaWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRUYWdTZXJ2aWNlXSBUYWcuYWRkIHJldHVybmVkIG5vIHNpZCcsIGRlc2NyaXB0b3IpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgICAgIGlmIChlcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgaW4gdXNlJykgJiYgZXhpc3RpbmdJZCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZGljdGlvbm5hcnlUYWdzLmhhcyhleGlzdGluZ0lkKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMubWF0dGVydGFnSURzLnB1c2goZXhpc3RpbmdJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2V0KGV4aXN0aW5nSWQsIG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdJZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIGFkZE1hdHRlcnRhZ1RvVmlld2VyIGZhaWxlZCcsIGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIHRhZ0FkZFF1ZXVlIHJlamVjdGVkJywgZSk7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnRhZ0FkZFF1ZXVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGFkZCBhbmQgY29uZmlndXJlIGEgTWF0dGVydGFnIHdpdGggaWNvbiwgb3BhY2l0eSwgYW5kIEhUTUwgY29udGVudC5cclxuICAgKiBIYW5kbGVzIGV4aXN0aW5nIHRhZ3MgZ3JhY2VmdWxseSBhbmQgcXVldWVzIG9wZXJhdGlvbnMgdG8gYXZvaWQgU0RLIGNvbmZsaWN0cy5cclxuICAgKi9cclxuICBhc3luYyBfZG9BZGRNYXR0ZXJ0YWcoXHJcbiAgICBzZGs6IGFueSxcclxuICAgIG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEsXHJcbiAgICBzZXRUYWdJY29uQW5kT3BhY2l0eTogKHNpZDogc3RyaW5nLCBtdDogTWF0dGVydGFnRGF0YSkgPT4gUHJvbWlzZTx2b2lkPixcclxuICAgIGluamVjdEh0bWxJblRhZzogKHR5cGU6IFBvaVR5cGUsIG9iajogRGJPYmplY3RUeXBlLCBzaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxyXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gbWF0dGVydGFnRGF0YS5nZXRNYXR0ZXJ0YWdEZXNjcmlwdG9yKCk7XHJcbiAgICAvL2NvbnNvbGUubG9nKCdkZXNjcmlwdG9yJywgZGVzY3JpcHRvcik7XHJcbiAgICBjb25zdCBzaWQgPSBkZXNjcmlwdG9yWzBdWydpZCddO1xyXG5cclxuICAgIGlmIChzaWQgJiYgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuaGFzKHNpZCkpIHtcclxuICAgICAgYXdhaXQgc2V0VGFnSWNvbkFuZE9wYWNpdHkoc2lkLCBtYXR0ZXJ0YWdEYXRhKTtcclxuICAgICAgYXdhaXQgaW5qZWN0SHRtbEluVGFnKG1hdHRlcnRhZ0RhdGEuZ2V0VHlwZSgpLCBtYXR0ZXJ0YWdEYXRhLmdldE9iamVjdCgpLCBzaWQpO1xyXG4gICAgICByZXR1cm4gc2lkO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGFnQWRkUXVldWUgPSB0aGlzLnRhZ0FkZFF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHRhZ01vZHVsZSA9IGF3YWl0IHRoaXMuZ2V0VGFnQ3JlYXRpb25Nb2R1bGUoc2RrKTtcclxuICAgICAgICBjb25zdCBbY3JlYXRlZFNpZF0gPSBhd2FpdCB0YWdNb2R1bGUuYWRkKC4uLmRlc2NyaXB0b3IpO1xyXG5cclxuICAgICAgICB0aGlzLm1hdHRlcnRhZ0lEcy5wdXNoKGNyZWF0ZWRTaWQpO1xyXG4gICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldChjcmVhdGVkU2lkLCBtYXR0ZXJ0YWdEYXRhKTtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yVGFnSW5TZGsoc2RrLCBjcmVhdGVkU2lkKTtcclxuICAgICAgICBhd2FpdCBzZXRUYWdJY29uQW5kT3BhY2l0eShjcmVhdGVkU2lkLCBtYXR0ZXJ0YWdEYXRhKTtcclxuXHJcbiAgICAgICAgaW5qZWN0SHRtbEluVGFnKG1hdHRlcnRhZ0RhdGEuZ2V0VHlwZSgpLCBtYXR0ZXJ0YWdEYXRhLmdldE9iamVjdCgpLCBjcmVhdGVkU2lkKS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0hUTUwgaW5qZWN0aW9uIGZhaWxlZCBmb3InLCBjcmVhdGVkU2lkLCBlcnIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gY3JlYXRlZFNpZDtcclxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgaWYgKGU/Lm1lc3NhZ2U/LmluY2x1ZGVzKCdhbHJlYWR5IGluIHVzZScpICYmIHNpZCkge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmRpY3Rpb25uYXJ5VGFncy5oYXMoc2lkKSkge1xyXG4gICAgICAgICAgICB0aGlzLm1hdHRlcnRhZ0lEcy5wdXNoKHNpZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldChzaWQsIG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYXdhaXQgc2V0VGFnSWNvbkFuZE9wYWNpdHkoc2lkLCBtYXR0ZXJ0YWdEYXRhKTtcclxuICAgICAgICAgIGF3YWl0IGluamVjdEh0bWxJblRhZyhtYXR0ZXJ0YWdEYXRhLmdldFR5cGUoKSwgbWF0dGVydGFnRGF0YS5nZXRPYmplY3QoKSwgc2lkKTtcclxuICAgICAgICAgIHJldHVybiBzaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IGU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnRhZ0FkZFF1ZXVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGlzdGFuY2UocDE6IGFueSwgcDI6IGFueSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHAyLnggLSBwMS54LCAyKSArIE1hdGgucG93KHAyLnkgLSBwMS55LCAyKSArIE1hdGgucG93KHAyLnogLSBwMS56LCAyKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVja3MgaWYgYSB0YWcgaXMgd2l0aGluIHRoZSBib3VuZGluZyBib3ggb2YgYW55IGFjdGl2ZSByb29tIChhZGRpbmcgYSBzbGlnaHQgbWFyZ2luIHRvIGFjY291bnQgZm9yIHdhbGwtbW91bnRlZCB0YWdzKS5cclxuICAgKiBJZiB0aGVyZSBhcmUgbm8gYWN0aXZlIHJvb21zIChlLmcuLCBoYWxsd2F5KSwgZmFsbHMgYmFjayB0byByZXR1cm5pbmcgdHJ1ZS5cclxuICAgKi9cclxuICBpc1RhZ0luUm9vbXMobWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YSwgcm9vbXM6IGFueVtdKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXJvb21zIHx8IHJvb21zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IHRhZ1BvcyA9IG1hdHRlcnRhZ0RhdGEuZ2V0UG9zaXRpb24oKTtcclxuICAgIGNvbnN0IG1hcmdpbiA9IDEuNTtcclxuXHJcbiAgICByZXR1cm4gcm9vbXMuc29tZSgocm9vbSkgPT4ge1xyXG4gICAgICBpZiAoIXJvb20uYm91bmRzKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGNvbnN0IHsgbWluLCBtYXggfSA9IHJvb20uYm91bmRzO1xyXG5cclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICB0YWdQb3MueCA+PSBtaW4ueCAtIG1hcmdpbiAmJiB0YWdQb3MueCA8PSBtYXgueCArIG1hcmdpbiAmJlxyXG4gICAgICAgIHRhZ1Bvcy55ID49IG1pbi55IC0gbWFyZ2luICYmIHRhZ1Bvcy55IDw9IG1heC55ICsgbWFyZ2luICYmXHJcbiAgICAgICAgdGFnUG9zLnogPj0gbWluLnogLSBtYXJnaW4gJiYgdGFnUG9zLnogPD0gbWF4LnogKyBtYXJnaW5cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJldHVybnMgdGhlIElEIG9mIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIHRhZy4gKi9cclxuICBnZXRMYXN0VGFnKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgaWYgKHRoaXMubWF0dGVydGFnSURzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJ0YWdJRHNbdGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoIC0gMV07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIHRoZSB2aXNpYmlsaXR5IChvcGFjaXR5KSBvZiBhbGwgdGFncyBiYXNlZCBvbiB0aGUgY3VycmVudCBjYW1lcmEgbW9kZSxcclxuICAgKiBmbG9vciBhbmQgcm9vbSBjb250ZXh0LiBNdXN0IGJlIGNhbGxlZCBhZnRlciBlYWNoIHN3ZWVwLCBmbG9vciBvciBtb2RlIGNoYW5nZS5cclxuICAgKlxyXG4gICAqIFJ1bGVzOlxyXG4gICAqICAtIERPTExIT1VTRSAvIEZMT09SUExBTiDihpIgYWxsIHRhZ3MgaGlkZGVuIChvcGFjaXR5IDApLlxyXG4gICAqICAtIElOU0lERSDihpIgb25seSB0YWdzIHdob3NlIHN3ZWVwIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgZmxvb3IgYXJlIHNob3duO1xyXG4gICAqICAgIHByb3hpbWl0eS1iYXNlZCBvcGFjaXR5IGlzIGFwcGxpZWQgdmlhIGNvbXB1dGVUYWdPcGFjaXR5KCkuXHJcbiAgICogICAgVGFncyBvbiBvdGhlciBmbG9vcnMgYXJlIGhpZGRlbiAob3BhY2l0eSAwKS5cclxuICAgKiAgLSBUUkFOU0lUSU9OSU5HIOKGkiBubyBjaGFuZ2UgKHNraXAgdXBkYXRlIHRvIGF2b2lkIGZsaWNrZXJpbmcpLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHNkayAgICAgICAgICBNYXR0ZXJwb3J0IFNESyBpbnN0YW5jZS5cclxuICAgKiBAcGFyYW0gcG9zZUNhbWVyYSAgIEN1cnJlbnQgY2FtZXJhIHBvc2UuXHJcbiAgICogQHBhcmFtIHN3ZWVwQ29sbGVjdGlvbiAgRnVsbCBjb2xsZWN0aW9uIG9mIHN3ZWVwcy5cclxuICAgKiBAcGFyYW0gY3VycmVudENhbWVyYU1vZGUgIEN1cnJlbnQgY2FtZXJhIG1vZGUuXHJcbiAgICogQHBhcmFtIG1hdHRlcnRhZ1RvRm9sbG93ICBJRCBvZiB0aGUgY3Vyc29yIHRhZyAobmV2ZXIgdG91Y2hlZCkuXHJcbiAgICovXHJcbiAgYXN5bmMgdXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0KFxyXG4gICAgc2RrOiBhbnksXHJcbiAgICBzd2VlcENvbGxlY3Rpb246IGFueSxcclxuICAgIGN1cnJlbnRDYW1lcmFNb2RlOiBDYW1lcmFNb2RlLFxyXG4gICAgbWF0dGVydGFnVG9Gb2xsb3c6IHN0cmluZyB8IG51bGwsXHJcbiAgICBjdXJyZW50Rmxvb3JTZXF1ZW5jZTogbnVtYmVyIHwgbnVsbCA9IG51bGwsXHJcbiAgICBjdXJyZW50Um9vbXM6IGFueVtdID0gW11cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghc2RrIHx8IHRoaXMuZGljdGlvbm5hcnlUYWdzLnNpemUgPT09IDApIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBpc0ludGVyaW9yTW9kZSA9IGN1cnJlbnRDYW1lcmFNb2RlID09PSBDYW1lcmFNb2RlLklOU0lERTtcclxuICAgIGNvbnN0IGN1cnJlbnRGbG9vcklkID0gY3VycmVudEZsb29yU2VxdWVuY2UgIT09IG51bGwgPyBjdXJyZW50Rmxvb3JTZXF1ZW5jZS50b1N0cmluZygpIDogbnVsbDtcclxuICAgIGNvbnN0IHByb21pc2VzID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBbdGFnSWQsIG1hdHRlcnRhZ0RhdGFdIG9mIHRoaXMuZGljdGlvbm5hcnlUYWdzKSB7XHJcbiAgICAgIGlmICh0YWdJZCA9PT0gbWF0dGVydGFnVG9Gb2xsb3cpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgY29uc3QgdGFnRmxvb3JJZCA9IHRoaXMuZ2V0Rmxvb3JJZEZvclRhZyhtYXR0ZXJ0YWdEYXRhLCBzd2VlcENvbGxlY3Rpb24pO1xyXG4gICAgICBjb25zdCBpc09uQ3VycmVudEZsb29yID0gIXRhZ0Zsb29ySWQgfHwgIWN1cnJlbnRGbG9vcklkIHx8IHRhZ0Zsb29ySWQgPT09IGN1cnJlbnRGbG9vcklkO1xyXG5cclxuICAgICAgbGV0IHRhcmdldE9wYWNpdHkgPSAwO1xyXG4gICAgICBsZXQgc2hvdWxkQmVFbmFibGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAvLyBDYWxjdWxhdGlvbiBvZiBvcGFjaXR5IGFuZCBlbmFibGUgc3RhdHVzXHJcbiAgICAgIGlmIChpc09uQ3VycmVudEZsb29yKSB7XHJcbiAgICAgICAgaWYgKCFpc0ludGVyaW9yTW9kZSkge1xyXG4gICAgICAgICAgdGFyZ2V0T3BhY2l0eSA9IDE7XHJcbiAgICAgICAgICBzaG91bGRCZUVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0YXJnZXRPcGFjaXR5ID0gMC45O1xyXG4gICAgICAgICAgc2hvdWxkQmVFbmFibGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gQXBwbHkgY2hhbmdlc1xyXG5cclxuICAgICAgLy8gVG9vbHRpcCBhbmQgY2xpY2sgbWFuYWdlbWVudFxyXG4gICAgICBjb25zdCB0YWdNb2R1bGUgPSB0aGlzLmdldFRhZ01vZHVsZShzZGssIHRhZ0lkKTtcclxuICAgICAgY29uc3QgbGFzdEVuYWJsZWQgPSB0aGlzLnRhZ3NDdXJyZW50RW5hYmxlZC5nZXQodGFnSWQpO1xyXG4gICAgICBpZiAobGFzdEVuYWJsZWQgIT09IHNob3VsZEJlRW5hYmxlZCkge1xyXG4gICAgICAgIHRoaXMudGFnc0N1cnJlbnRFbmFibGVkLnNldCh0YWdJZCwgc2hvdWxkQmVFbmFibGVkKTtcclxuICAgICAgICBwcm9taXNlcy5wdXNoKHRhZ01vZHVsZS5hbGxvd0FjdGlvbih0YWdJZCwge1xyXG4gICAgICAgICAgb3BlbmluZzogc2hvdWxkQmVFbmFibGVkLFxyXG4gICAgICAgICAgbmF2aWdhdGluZzogc2hvdWxkQmVFbmFibGVkLFxyXG4gICAgICAgICAgZG9ja2luZzogZmFsc2VcclxuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7IH0pKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBPcGFjaXR5IG1hbmFnZW1lbnRcclxuICAgICAgY29uc3QgbGFzdE9wYWNpdHkgPSB0aGlzLnRhZ3NDdXJyZW50T3BhY2l0eS5nZXQodGFnSWQpID8/IC0xO1xyXG4gICAgICBpZiAoTWF0aC5hYnMobGFzdE9wYWNpdHkgLSB0YXJnZXRPcGFjaXR5KSA+IDAuMDUpIHtcclxuICAgICAgICB0aGlzLnRhZ3NDdXJyZW50T3BhY2l0eS5zZXQodGFnSWQsIHRhcmdldE9wYWNpdHkpO1xyXG4gICAgICAgIHByb21pc2VzLnB1c2godGFnTW9kdWxlLmVkaXRPcGFjaXR5KHRhZ0lkLCB0YXJnZXRPcGFjaXR5KS5jYXRjaCgoKSA9PiB7IH0pKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERyb3BzIHRoZSBtZW1vaXplZCBvcGFjaXR5L2VuYWJsZWQgc3RhdGUgc28gdGhlIG5leHQgdmlzaWJpbGl0eSBwYXNzIHJlLWFwcGxpZXMgaXRcclxuICAgKiB0byBldmVyeSB0YWcuIE5lZWRlZCBhZnRlciBhIHZpZXcgc3dpdGNoIChmdXJuaXNoZWQgPC0+IGRlZnVybmlzaGVkKTogdGhlIFNES1xyXG4gICAqIHJlLXJlbmRlcnMgdGhlIHNoYXJlZCBsYXllcidzIHRhZ3MgYW5kIHRoZSBjYWNoZWQgdmFsdWVzIHdvdWxkIG90aGVyd2lzZSBtYWtlXHJcbiAgICogdXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0KCkgc2tpcCB0aGVtLCBsZWF2aW5nIHRhZ3Mgc3R1Y2sgaW52aXNpYmxlLlxyXG4gICAqL1xyXG4gIHJlc2V0VmlzaWJpbGl0eUNhY2hlKCk6IHZvaWQge1xyXG4gICAgdGhpcy50YWdzQ3VycmVudE9wYWNpdHkuY2xlYXIoKTtcclxuICAgIHRoaXMudGFnc0N1cnJlbnRFbmFibGVkLmNsZWFyKCk7XHJcbiAgICB0aGlzLnRhZ3NDdXJyZW50SWNvbi5jbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlbW92ZXMgYSBzcGVjaWZpYyB0YWcgZnJvbSB0aGUgdmlld2VyIGFuZCBsb2NhbCBkaWN0aW9uYXJpZXMuICovXHJcbiAgYXN5bmMgZGVsZXRlTWF0dGVydGFnRnJvbUlkKHNkazogYW55LCBtYXR0ZXJ0YWdJRDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoc2RrKSBhd2FpdCB0aGlzLmdldFRhZ01vZHVsZShzZGssIG1hdHRlcnRhZ0lEKS5yZW1vdmUobWF0dGVydGFnSUQpO1xyXG4gICAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5kZWxldGUobWF0dGVydGFnSUQpO1xyXG4gICAgICB0aGlzLnRhZ3NDdXJyZW50SWNvbi5kZWxldGUobWF0dGVydGFnSUQpO1xyXG4gICAgICB0aGlzLnRhZ3NDdXJyZW50T3BhY2l0eS5kZWxldGUobWF0dGVydGFnSUQpO1xyXG4gICAgICB0aGlzLnRhZ3NDdXJyZW50RW5hYmxlZC5kZWxldGUobWF0dGVydGFnSUQpO1xyXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubWF0dGVydGFnSURzLmluZGV4T2YobWF0dGVydGFnSUQpO1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkgdGhpcy5tYXR0ZXJ0YWdJRHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignQ2Fubm90IGRlbGV0ZSB0YWcnLCBtYXR0ZXJ0YWdJRCwgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogUmVtb3ZlcyB0aGUgbGFzdCBhZGRlZCB0YWcgZnJvbSB0aGUgdmlld2VyLiAqL1xyXG4gIGFzeW5jIGRlbGV0ZUxhc3RNYXR0ZXJ0YWcoc2RrOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGxhc3RTaWQgPSB0aGlzLmdldExhc3RUYWcoKTtcclxuICAgIGlmIChsYXN0U2lkKSBhd2FpdCB0aGlzLmRlbGV0ZU1hdHRlcnRhZ0Zyb21JZChzZGssIGxhc3RTaWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqIENsZWFycyBhbGwgdGFncyBmcm9tIHRoZSB2aWV3ZXIgYW5kIHJlc2V0cyBsb2NhbCBzdGF0ZS4gKi9cclxuICBhc3luYyBhY3Rpb25fZGVsZXRlX2FsbF9tYXR0ZXJ0YWdzKHNkazogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoc2RrKSB7XHJcbiAgICAgIGNvbnN0IHNpZHNUb1JlbW92ZSA9IFsuLi50aGlzLm1hdHRlcnRhZ0lEc107XHJcbiAgICAgIGZvciAoY29uc3Qgc2lkIG9mIHNpZHNUb1JlbW92ZSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldFRhZ01vZHVsZShzZGssIHNpZCkucmVtb3ZlKHNpZCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYW5kIGNvbmZpZ3VyZXMgYSBNYXR0ZXJ0YWcgZnJvbSBhIFBPSSwgaGFuZGxpbmcgY29vcmRpbmF0ZXMsIG5vcm1hbHMsIGFuZCBzd2VlcCBJRC5cclxuICAgKiBTa2lwcyBjcmVhdGlvbiBpZiBhIHRhZyBmb3IgdGhlIG9iamVjdCBhbHJlYWR5IGV4aXN0cy5cclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVNYXR0ZXJ0YWdGcm9tUE9JKFxyXG4gICAgc2RrOiBhbnksXHJcbiAgICB0YWdUeXBlOiBQb2lUeXBlLFxyXG4gICAgb2JqZWN0OiBEYk9iamVjdFR5cGUsXHJcbiAgICBwb2k6IFBPSSxcclxuICAgIGdldFRhZ0Zyb21FbGVtZW50SWQ6IChpZDogc3RyaW5nKSA9PiB7IHRhZzogc3RyaW5nOyBzd2VlcDogc3RyaW5nIH0sXHJcbiAgICBzZXRUYWdJY29uQW5kT3BhY2l0eTogKHNpZDogc3RyaW5nLCBtdDogTWF0dGVydGFnRGF0YSkgPT4gUHJvbWlzZTx2b2lkPixcclxuICAgIGluamVjdEh0bWxJblRhZzogKHR5cGU6IFBvaVR5cGUsIG9iajogRGJPYmplY3RUeXBlLCBzaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxyXG4gICk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCB7IHRhZyB9ID0gZ2V0VGFnRnJvbUVsZW1lbnRJZChvYmplY3QuaWQpO1xyXG4gICAgaWYgKHRhZykgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEgPSBuZXcgTWF0dGVydGFnRGF0YSh0YWdUeXBlKTtcclxuICAgIG1hdHRlcnRhZ0RhdGEuc2V0T2JqZWN0KG9iamVjdCwgdGFnVHlwZSk7XHJcblxyXG4gICAgaWYgKHBvaS5jb29yZGluYXRlKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXRQb3NpdGlvbihKU09OLnBhcnNlKHBvaS5jb29yZGluYXRlKSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignRXJyb3IgcGFyc2luZyBQT0kgY29vcmRpbmF0ZXMnLCBwb2kuY29vcmRpbmF0ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAocG9pLm1ldGFkYXRhKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgdGFnTWV0YWRhdGEgPSBKU09OLnBhcnNlKHBvaS5tZXRhZGF0YSk7XHJcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXROb3JtYWwodGFnTWV0YWRhdGEubm9ybWFsIHx8IHsgeDogMCwgeTogLTAuMTUsIHo6IDAgfSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBtYXR0ZXJ0YWdEYXRhLnNldE5vcm1hbCh7IHg6IDAsIHk6IC0wLjE1LCB6OiAwIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHBvaS5tYXR0ZXJwb3J0U3dlZXBJRCkge1xyXG4gICAgICBtYXR0ZXJ0YWdEYXRhLnNldFN3ZWVwSUQocG9pLm1hdHRlcnBvcnRTd2VlcElEKTtcclxuICAgIH1cclxuICAgIG1hdHRlcnRhZ0RhdGEuc2V0UG9pKHBvaSk7XHJcblxyXG4gICAgY29uc3QgY3JlYXRlZFRhZ0lEID0gYXdhaXQgdGhpcy5hZGRNYXR0ZXJ0YWdUb1ZpZXdlcihzZGssIG1hdHRlcnRhZ0RhdGEpO1xyXG5cclxuICAgIGlmIChjcmVhdGVkVGFnSUQgJiYgc2RrKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvclRhZ0luU2RrKHNkaywgY3JlYXRlZFRhZ0lEKTtcclxuICAgICAgYXdhaXQgc2V0VGFnSWNvbkFuZE9wYWNpdHkoY3JlYXRlZFRhZ0lELCBtYXR0ZXJ0YWdEYXRhKTtcclxuICAgICAgaW5qZWN0SHRtbEluVGFnKHRhZ1R5cGUsIG9iamVjdCwgY3JlYXRlZFRhZ0lEKS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdIVE1MIGluamVjdGlvbiBmYWlsZWQgZm9yJywgY3JlYXRlZFRhZ0lELCBlcnIpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3JlYXRlZFRhZ0lEO1xyXG4gIH1cclxuXHJcbiAgLyoqIFVwZGF0ZXMgdGhlIGljb24sIG9wYWNpdHksIGFuZCBIVE1MIGNvbnRlbnQgb2YgYW4gZXhpc3RpbmcgdGFnLiAqL1xyXG4gIGFzeW5jIHVwZGF0ZU1hdHRlclRhZ0NvbnRlbnRGb3JUYWdJRChcclxuICAgIHNkazogYW55LFxyXG4gICAgbWF0dGVydGFnSUQ6IHN0cmluZyxcclxuICAgIG9iamVjdDogRGJPYmplY3RUeXBlLFxyXG4gICAgcG9pVHlwZTogUG9pVHlwZSxcclxuICAgIHNldFRhZ0ljb25BbmRPcGFjaXR5OiAoc2lkOiBzdHJpbmcsIG10OiBNYXR0ZXJ0YWdEYXRhKSA9PiBQcm9taXNlPHZvaWQ+LFxyXG4gICAgaW5qZWN0SHRtbEluVGFnOiAodHlwZTogUG9pVHlwZSwgb2JqOiBEYk9iamVjdFR5cGUsIHNpZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XHJcbiAgKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobWF0dGVydGFnSUQpO1xyXG4gICAgaWYgKCFtYXR0ZXJ0YWdEYXRhKSByZXR1cm47XHJcblxyXG4gICAgaWYgKG9iamVjdCkge1xyXG4gICAgICBtYXR0ZXJ0YWdEYXRhLnNldE9iamVjdChvYmplY3QsIHBvaVR5cGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KG1hdHRlcnRhZ0lELCBtYXR0ZXJ0YWdEYXRhKTtcclxuICAgIGF3YWl0IGluamVjdEh0bWxJblRhZyhwb2lUeXBlLCBvYmplY3QsIG1hdHRlcnRhZ0lEKTtcclxuICB9XHJcblxyXG4gIC8qKiBSZWdpc3RlcnMgYSBjdXN0b20gdGV4dHVyZSBhbmQgYXBwbGllcyBpdCB0byBhIHRhZywgb3B0aW9uYWxseSBhZGp1c3Rpbmcgb3BhY2l0eS4gKi9cclxuICBhc3luYyBhZGROZXdJY29uQW5kU2V0Rm9yVGFnKFxyXG4gICAgc2RrOiBhbnksXHJcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxyXG4gICAgaWNvblBhdGg6IHN0cmluZyxcclxuICAgIGFwcGx5T3BhY2l0eTogYm9vbGVhbixcclxuICAgIG9wYWNpdHk6IG51bWJlclxyXG4gICkge1xyXG4gICAgaWYgKCFzZGspIHJldHVybjtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGljb25OYW1lID0gYGN1c3RvbS1pY29uLSR7bWF0dGVydGFnSUR9YDtcclxuICAgICAgY29uc3QgdGFnTW9kdWxlID0gdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCBtYXR0ZXJ0YWdJRCk7XHJcbiAgICAgIGF3YWl0IHNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoaWNvbk5hbWUsIGljb25QYXRoKTtcclxuICAgICAgYXdhaXQgdGFnTW9kdWxlLmVkaXRJY29uKG1hdHRlcnRhZ0lELCBpY29uTmFtZSk7XHJcbiAgICAgIHRoaXMudGFnc0N1cnJlbnRJY29uLnNldChtYXR0ZXJ0YWdJRCwgaWNvbk5hbWUpO1xyXG5cclxuICAgICAgaWYgKGFwcGx5T3BhY2l0eSkge1xyXG4gICAgICAgIGF3YWl0IHRhZ01vZHVsZS5lZGl0T3BhY2l0eShtYXR0ZXJ0YWdJRCwgb3BhY2l0eSk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdFcnJvciBzZXR0aW5nIGN1c3RvbSBpY29uIG9yIG9wYWNpdHknLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogRmluZHMgdGhlIHRhZyBJRCBhbmQgc3dlZXAgSUQgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgZWxlbWVudCBJRC4gKi9cclxuICBnZXRUYWdGcm9tRWxlbWVudElkKGVsZW1lbnRJRDogc3RyaW5nLCBzd2VlcHM6IHN0cmluZ1tdIHwgbnVsbCk6IHsgdGFnOiBzdHJpbmcgfCBudWxsOyBzd2VlcDogc3RyaW5nIHwgbnVsbCB9IHtcclxuICAgIGxldCB0YWdJRCA9IG51bGw7XHJcbiAgICBsZXQgc3dlZXBJRCA9IG51bGw7XHJcbiAgICBmb3IgKGxldCBbbWF0dGVydGFnSUQsIG1hdHRlcnRhZ0RhdGFdIG9mIHRoaXMuZGljdGlvbm5hcnlUYWdzKSB7XHJcbiAgICAgIGlmIChtYXR0ZXJ0YWdEYXRhLmVsZW1lbnRJRCA9PT0gZWxlbWVudElEKSB7XHJcbiAgICAgICAgdGFnSUQgPSBtYXR0ZXJ0YWdJRDtcclxuICAgICAgICBjb25zdCBzd2VlcCA9IG1hdHRlcnRhZ0RhdGEuZ2V0U3dlZXBJRCgpO1xyXG4gICAgICAgIGlmIChzd2VlcCAmJiBzd2VlcHMpIHtcclxuICAgICAgICAgIC8vIHN3ZWVwIGlzIGEgdXVpZDsgc3dlZXBzIGFycmF5IGNvbnRhaW5zIHNpZHMg4oCTIGNoZWNrIGJvdGggZm9ybWF0c1xyXG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRTaWQgPSB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnJlc29sdmVTd2VlcFNpZChzd2VlcCk7XHJcbiAgICAgICAgICBpZiAoc3dlZXBzLmluY2x1ZGVzKHN3ZWVwKSB8fCBzd2VlcHMuaW5jbHVkZXMocmVzb2x2ZWRTaWQpKSB7XHJcbiAgICAgICAgICAgIHN3ZWVwSUQgPSBzd2VlcDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7IHRhZzogdGFnSUQsIHN3ZWVwOiBzd2VlcElEIH07XHJcbiAgfVxyXG5cclxuICAvKiogUmV0cmlldmVzIHRoZSBmbG9vciBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHRhZyBiYXNlZCBvbiBpdHMgc3dlZXAgZGF0YS5cclxuICAgKiAgSGFuZGxlcyBib3RoIHRoZSBvYmplY3QgZm9ybSAoeyBmbG9vckluZm86IHsgaWQsIHNlcXVlbmNlIH0sIGZsb29yOiB7IGlkIH0gfSlcclxuICAgKiAgYW5kIHRoZSBwcmltaXRpdmUgZm9ybSAoZmxvb3I6IG51bWJlcikgdXNlZCBieSBNYXR0ZXJwb3J0IFNESyB2My5cclxuICAgKi9cclxuICBnZXRGbG9vcklkRm9yVGFnKG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEsIHN3ZWVwQ29sbGVjdGlvbjogYW55KTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBjb25zdCBzd2VlcElkID0gbWF0dGVydGFnRGF0YS5nZXRTd2VlcElEKCk7XHJcbiAgICBpZiAoIXN3ZWVwSWQgfHwgIXN3ZWVwQ29sbGVjdGlvbikgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgY29uc3Qgc3dlZXBEYXRhID0gc3dlZXBDb2xsZWN0aW9uW3N3ZWVwSWRdO1xyXG4gICAgaWYgKCFzd2VlcERhdGEpIHJldHVybiBudWxsO1xyXG5cclxuICAgIC8vIFNESyB2Mzogc3dlZXAuZmxvb3IgaXMgYSBwcmltaXRpdmUgbnVtYmVyICh0aGUgc2VxdWVuY2UgaW5kZXgpXHJcbiAgICBpZiAodHlwZW9mIHN3ZWVwRGF0YS5mbG9vciA9PT0gJ251bWJlcicpIHtcclxuICAgICAgcmV0dXJuIHN3ZWVwRGF0YS5mbG9vci50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE9sZGVyIC8gZXh0ZW5kZWQgZm9ybWF0c1xyXG4gICAgcmV0dXJuIHN3ZWVwRGF0YT8uZmxvb3JJbmZvPy5pZFxyXG4gICAgICA/PyBzd2VlcERhdGE/LmZsb29ySW5mbz8uc2VxdWVuY2U/LnRvU3RyaW5nKClcclxuICAgICAgPz8gc3dlZXBEYXRhPy5mbG9vcklkXHJcbiAgICAgID8/IHN3ZWVwRGF0YT8uZmxvb3I/LmlkXHJcbiAgICAgID8/IHN3ZWVwRGF0YT8uZmxvb3I/LnNlcXVlbmNlPy50b1N0cmluZygpXHJcbiAgICAgID8/IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbmplY3RzIGN1c3RvbSBIVE1MIG9yIGZhbGxiYWNrIGJpbGxib2FyZCBtZWRpYSBpbnRvIGEgTWF0dGVydGFnIHNhbmRib3guXHJcbiAgICogQXR0YWNoZXMgZXZlbnQgbGlzdGVuZXJzIGZvciBpbnRlcmFjdGl2ZSBlbGVtZW50cyB3aXRoaW4gdGhlIHRhZy5cclxuICAgKi9cclxuICBhc3luYyBpbmplY3RIdG1sSW5UYWcoc2RrOiBhbnksIHRhZ1R5cGU6IFBvaVR5cGUsIG9iamVjdDogRGJPYmplY3RUeXBlLCB0YWdJRDogc3RyaW5nKSB7XHJcbiAgICBpZiAoIXRoaXMudGFnU2VydmljZSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIHRhZ1NlcnZpY2UgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgaHRtbCA9IGF3YWl0IHRoaXMudGFnU2VydmljZS5nZXRIdG1sVG9JbmplY3QodGFnVHlwZSwgb2JqZWN0KTtcclxuXHJcbiAgICAgIGlmIChodG1sICYmIGh0bWwudHJpbSgpLmxlbmd0aCA+IDAgJiYgc2RrKSB7XHJcbiAgICAgICAgY29uc3Qgc2NyaXB0VGFnID0gdGhpcy50YWdTZXJ2aWNlLmdldFNjcmlwdEZvclRhZyhvYmplY3QsIHRhZ1R5cGUpO1xyXG4gICAgICAgIGh0bWwgKz0gYCR7c2NyaXB0VGFnfWA7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhZ01vZHVsZSA9IHRoaXMuZ2V0VGFnTW9kdWxlKHNkaywgdGFnSUQpO1xyXG4gICAgICAgIGNvbnN0IFtzYW5kYm94SWQsIG1lc3Nlbmdlcl0gPSBhd2FpdCBzZGsuVGFnLnJlZ2lzdGVyU2FuZGJveChodG1sKTtcclxuXHJcbiAgICAgICAgY29uc3QgYXR0YWNobWVudElEID0gdGhpcy50YWdzQXR0YWNobWVudHNbdGFnSURdO1xyXG4gICAgICAgIGlmIChhdHRhY2htZW50SUQpIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhZ01vZHVsZS5kZXRhY2godGFnSUQsIGF0dGFjaG1lbnRJRCk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7IH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudGFnc0F0dGFjaG1lbnRzW3RhZ0lEXSA9IHNhbmRib3hJZDtcclxuICAgICAgICBhd2FpdCB0YWdNb2R1bGUuYXR0YWNoKHRhZ0lELCBzYW5kYm94SWQpO1xyXG5cclxuICAgICAgICAvLyBBdHRhY2ggdGhlIFwiVmlldyBpbmZvcm1hdGlvbnNcIiBoYW5kbGVyIGluIHRvb2x0aXBcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLkRFVEFJTF9DTElDSywgdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uRGV0YWlsQ2xpY2suYmluZCh0aGlzLnRhZ1NlcnZpY2UpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLlRJQ0tFVF9DTElDSywgdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uRGV0YWlsQ2xpY2suYmluZCh0aGlzLnRhZ1NlcnZpY2UpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLkFVRElPX0NMSUNLLCAoYXVkaW9Db21tZW50SUQ6IHN0cmluZykgPT4gdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uQXVkaW9DbGljayhhdWRpb0NvbW1lbnRJRCkpO1xyXG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uVklERU9fQ0xJQ0ssICh2aWRlb1VybDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25WaWRlb0NsaWNrKHZpZGVvVXJsKSk7XHJcbiAgICAgICAgbWVzc2VuZ2VyLm9uKFRhZ0FjdGlvbi5JTUFHRV9DTElDSywgKGltYWdlQ29tbWVudElEOiBzdHJpbmcpID0+IHRoaXMudGFnU2VydmljZS5vbkFjdGlvbkltYWdlQ2xpY2soaW1hZ2VDb21tZW50SUQpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLkRPQ19DTElDSywgKGRvY1VybDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25Eb2NDbGljayhkb2NVcmwpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLllPVVRVQkVfQ0xJQ0ssICh5b3V0dWJlVXJsOiBzdHJpbmcpID0+IHRoaXMudGFnU2VydmljZS5vbkFjdGlvbllvdXR1YmVDbGljayh5b3V0dWJlVXJsKSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoc2RrKSB7XHJcbiAgICAgICAgY29uc3QgeyBjb21tZW50LCB0YWdEZXNjcmlwdGlvbiB9ID0gdGhpcy50YWdTZXJ2aWNlLmdldEJpbGxib2FyZE1lZGlhVG9FbWJlZChvYmplY3QpO1xyXG5cclxuICAgICAgICBpZiAoY29tbWVudCkge1xyXG4gICAgICAgICAgY29uc3QgdGFnTW9kdWxlID0gdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCB0YWdJRCk7XHJcbiAgICAgICAgICAvLyAxKSBSZWdpc3RlciB0aGUgbWVkaWEgYXR0YWNobWVudCBieSBwYXNzaW5nIHRoZSBVUkwgc3RyaW5nKHMpLlxyXG4gICAgICAgICAgLy8gICAgcmVnaXN0ZXJBdHRhY2htZW50IHJldHVybnMgYW4gYXJyYXkgb2YgYXR0YWNobWVudCBJRHMuXHJcbiAgICAgICAgICBjb25zdCBbYXR0YWNobWVudElEXSA9IGF3YWl0IHNkay5UYWcucmVnaXN0ZXJBdHRhY2htZW50KGNvbW1lbnQuZXh0ZXJuYWxMaW5rKTtcclxuXHJcbiAgICAgICAgICAvLyAyKSBBdHRhY2ggdGhlIHJlZ2lzdGVyZWQgbWVkaWEgdG8gdGhlIHRhZy5cclxuICAgICAgICAgIGF3YWl0IHRhZ01vZHVsZS5hdHRhY2godGFnSUQsIGF0dGFjaG1lbnRJRCk7XHJcblxyXG4gICAgICAgICAgLy8gMykgRGV0ZXJtaW5lIG1lZGlhIHR5cGUgZm9yIHRoZSBiaWxsYm9hcmQgKFBIT1RPIG9yIFZJREVPKS5cclxuICAgICAgICAgIC8vICAgIFVzZSBhIHNpbXBsZSBoZXVyaXN0aWM6IFlvdVR1YmUvVmltZW8gLT4gVklERU8sIG90aGVyd2lzZSBQSE9UTy5cclxuICAgICAgICAgIC8vICAgIFRoZSBTREsgZXhwb3NlcyBNZWRpYVR5cGUgb24gdGhlIFRhZyBuYW1lc3BhY2UuXHJcbiAgICAgICAgICBjb25zdCBpc1ZpZGVvID0gL3lvdXR1YmVcXC5jb218eW91dHVcXC5iZXx2aW1lb1xcLmNvbS9pLnRlc3QoY29tbWVudC5leHRlcm5hbExpbmspO1xyXG4gICAgICAgICAgY29uc3QgbWVkaWFUeXBlID0gaXNWaWRlbyA/IHNkay5NYXR0ZXJ0YWcuTWVkaWFUeXBlLlZJREVPIDogc2RrLk1hdHRlcnRhZy5NZWRpYVR5cGUuUEhPVE87XHJcblxyXG4gICAgICAgICAgLy8gNCkgVXBkYXRlIHRoZSBiaWxsYm9hcmQgdGV4dCBhbmQgbWVkaWEgdXNpbmcgZWRpdEJpbGxib2FyZC5cclxuICAgICAgICAgIC8vICAgIGVkaXRCaWxsYm9hcmQgYWNjZXB0cyBQYXJ0aWFsPFRhZy5FZGl0YWJsZVByb3BlcnRpZXM+IHN1Y2ggYXMgbGFiZWwsIGRlc2NyaXB0aW9uLCBtZWRpYS5cclxuICAgICAgICAgIGF3YWl0IHRhZ01vZHVsZS5lZGl0QmlsbGJvYXJkKHRhZ0lELCB7XHJcbiAgICAgICAgICAgIGxhYmVsOiBvYmplY3QudGl0bGUgfHwgJ01lZGlhJyxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRhZ0Rlc2NyaXB0aW9uIHx8ICcnLFxyXG4gICAgICAgICAgICBtZWRpYToge1xyXG4gICAgICAgICAgICAgIHR5cGU6IG1lZGlhVHlwZSxcclxuICAgICAgICAgICAgICBzcmM6IGNvbW1lbnQuZXh0ZXJuYWxMaW5rLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgLy8gNSkgS2VlcCBhIGxvY2FsIHJlZmVyZW5jZVxyXG4gICAgICAgICAgdGhpcy50YWdzQXR0YWNobWVudHNbdGFnSURdID0ge1xyXG4gICAgICAgICAgICBhdHRhY2htZW50SUQsXHJcbiAgICAgICAgICAgIHRpdGxlOiBvYmplY3QudGl0bGUgfHwgJ01lZGlhJyxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRhZ0Rlc2NyaXB0aW9uIHx8ICcnLFxyXG4gICAgICAgICAgICBtZWRpYVNyYzogY29tbWVudC5leHRlcm5hbExpbmssXHJcbiAgICAgICAgICAgIG1lZGlhVHlwZSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIEVycm9yIGluIGluamVjdEh0bWxJblRhZzonLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQ2xlYXJzIGFsbCBsb2NhbCB0YWcgZGF0YSBhbmQgcmVzZXRzIHRoZSBhZGRpdGlvbiBxdWV1ZS4gKi9cclxuICBjbGVhcigpIHtcclxuICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLmNsZWFyKCk7XHJcbiAgICB0aGlzLnRhZ3NDdXJyZW50T3BhY2l0eS5jbGVhcigpO1xyXG4gICAgdGhpcy50YWdzQ3VycmVudEVuYWJsZWQuY2xlYXIoKTtcclxuICAgIHRoaXMudGFnc0N1cnJlbnRJY29uLmNsZWFyKCk7XHJcbiAgICB0aGlzLnN0b3BPYnNlcnZpbmdTZGtUYWdzKCk7XHJcbiAgICB0aGlzLnRhZ0FkZFF1ZXVlID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93ID0gbnVsbDtcclxuICAgIHRoaXMubWF0dGVydGFnSURzID0gW107XHJcbiAgICAvLyBBIG5ldyBzcGFjZSBtZWFucyBhIG5ldyBTREsgc2Vzc2lvbiwgaGVuY2UgYSBuZXcgc2hhcmVkIGxheWVyIHRvIGNyZWF0ZS5cclxuICAgIHRoaXMuc2hhcmVkVGFnTGF5ZXIgPSBudWxsO1xyXG4gICAgdGhpcy5zaGFyZWRUYWdMYXllclByb21pc2UgPSBudWxsO1xyXG4gIH1cclxufVxyXG4iXX0=
|