stream-chat-angular 4.58.1 → 4.58.2

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.
@@ -380,7 +380,7 @@ export class ChannelService {
380
380
  return __awaiter(this, void 0, void 0, function* () {
381
381
  const channel = this.activeChannelSubject.getValue();
382
382
  channel.state.addMessageSorted(Object.assign(Object.assign({}, message), { errorStatusCode: undefined, status: 'sending' }), true);
383
- yield this.sendMessageRequest(message);
383
+ return this.sendMessageRequest(message, undefined, true);
384
384
  });
385
385
  }
386
386
  /**
@@ -573,8 +573,8 @@ export class ChannelService {
573
573
  this.watchForChannelEvents(channel);
574
574
  }
575
575
  }
576
- sendMessageRequest(preview, customData) {
577
- var _a;
576
+ sendMessageRequest(preview, customData, isResend = false) {
577
+ var _a, _b, _c, _d;
578
578
  return __awaiter(this, void 0, void 0, function* () {
579
579
  const channel = this.activeChannelSubject.getValue();
580
580
  const isThreadReply = !!preview.parent_id;
@@ -600,10 +600,18 @@ export class ChannelService {
600
600
  }
601
601
  catch (error) {
602
602
  const stringError = JSON.stringify(error);
603
- const parsedError = stringError
604
- ? JSON.parse(stringError)
605
- : {};
606
- channel.state.addMessageSorted(Object.assign(Object.assign({}, preview), { errorStatusCode: parsedError.status || undefined, status: 'failed' }), true);
603
+ const parsedError = stringError ? JSON.parse(stringError) : {};
604
+ let isAlreadyExists = false;
605
+ if (isResend) {
606
+ if (parsedError.status === 400 &&
607
+ parsedError.code === 4 &&
608
+ ((_d = (_c = (_b = parsedError === null || parsedError === void 0 ? void 0 : parsedError.response) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.message) === null || _d === void 0 ? void 0 : _d.includes('already exists'))) {
609
+ isAlreadyExists = true;
610
+ }
611
+ }
612
+ channel.state.addMessageSorted(Object.assign(Object.assign({}, preview), { errorStatusCode: isAlreadyExists
613
+ ? undefined
614
+ : parsedError.status || undefined, status: isAlreadyExists ? 'received' : 'failed' }), true);
607
615
  isThreadReply
608
616
  ? this.activeThreadMessagesSubject.next([
609
617
  ...channel.state.threads[preview.parent_id],
@@ -1400,4 +1408,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
1400
1408
  providedIn: 'root',
1401
1409
  }]
1402
1410
  }], ctorParameters: function () { return [{ type: i1.ChatClientService }, { type: i0.NgZone }, { type: i2.NotificationService }]; } });
1403
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL2NoYW5uZWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFFYixhQUFhLEdBRWQsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFtQi9ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXpELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7Ozs7QUFZdEM7O0dBRUc7QUFJSCxNQUFNLE9BQU8sY0FBYztJQXlWekIsWUFDVSxpQkFBdUMsRUFDdkMsTUFBYyxFQUNkLG1CQUF3QztRQUZ4QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQXNCO1FBQ3ZDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBdEYxQyxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUMzQyxTQUFTLENBQ1YsQ0FBQztRQUNNLHlCQUFvQixHQUFHLElBQUksZUFBZSxDQUNoRCxTQUFTLENBQ1YsQ0FBQztRQUNNLGlDQUE0QixHQUFHLElBQUksZUFBZSxDQUV4RCxFQUFFLENBQUMsQ0FBQztRQUNFLHVDQUFrQyxHQUFHLElBQUksZUFBZSxDQUU5RCxFQUFFLENBQUMsQ0FBQztRQUNFLDJCQUFzQixHQUFHLElBQUksYUFBYSxDQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELCtCQUEwQixHQUFrQyxFQUFFLENB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QyxFQUFFLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU8sUUFBUSxDQUFDLE9BQW1CO1FBQ2xDLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyw2QkFBNkIsRUFBRTtZQUNoRSxLQUFLLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxrQkFBZ0M7O1FBQy9ELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ3ZFO2FBQU07WUFDTCxJQUFJLENBQUMscUJBQXFCLEdBQUc7Z0JBQzNCLElBQUksRUFBRSxRQUFRO2dCQUNkLE1BQU0sRUFDSixDQUFDLENBQUEsTUFBQSxJQUFJLENBQUMscUJBQXFCLDBDQUFFLElBQUksTUFBSyxRQUFRO29CQUM1QyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU07b0JBQ25DLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNO2FBQ3JDLENBQUM7U0FDSDtJQUNILENBQUM7O0FBanNERDs7R0FFRztBQUNhLDZDQUE4QixHQUFHLElBQUksQ0FBQzsyR0FyUTNDLGNBQWM7K0dBQWQsY0FBYyxjQUZiLE1BQU07MkZBRVAsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgT2JzZXJ2YWJsZSxcbiAgUmVwbGF5U3ViamVjdCxcbiAgU3Vic2NyaXB0aW9uLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpcnN0LCBtYXAsIHNoYXJlUmVwbGF5LCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgQXR0YWNobWVudCxcbiAgQ2hhbm5lbCxcbiAgQ2hhbm5lbEZpbHRlcnMsXG4gIENoYW5uZWxPcHRpb25zLFxuICBDaGFubmVsUmVzcG9uc2UsXG4gIENoYW5uZWxTb3J0LFxuICBFdmVudCxcbiAgRXZlbnRUeXBlcyxcbiAgRm9ybWF0TWVzc2FnZVJlc3BvbnNlLFxuICBNZXNzYWdlLFxuICBNZXNzYWdlUmVzcG9uc2UsXG4gIFJlYWN0aW9uUmVzcG9uc2UsXG4gIFVwZGF0ZWRNZXNzYWdlLFxuICBVc2VyRmlsdGVycyxcbiAgVXNlclJlc3BvbnNlLFxufSBmcm9tICdzdHJlYW0tY2hhdCc7XG5pbXBvcnQgeyBDaGF0Q2xpZW50U2VydmljZSwgQ2xpZW50RXZlbnQgfSBmcm9tICcuL2NoYXQtY2xpZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0TWVzc2FnZVRyYW5zbGF0aW9uIH0gZnJvbSAnLi9nZXQtbWVzc2FnZS10cmFuc2xhdGlvbic7XG5pbXBvcnQgeyBjcmVhdGVNZXNzYWdlUHJldmlldyB9IGZyb20gJy4vbWVzc2FnZS1wcmV2aWV3JztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuL25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IGdldFJlYWRCeSB9IGZyb20gJy4vcmVhZC1ieSc7XG5pbXBvcnQge1xuICBBdHRhY2htZW50VXBsb2FkLFxuICBBdHRhY2htZW50VXBsb2FkRXJyb3JSZWFzb24sXG4gIENoYW5uZWxRdWVyeVN0YXRlLFxuICBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzLFxuICBNZXNzYWdlSW5wdXQsXG4gIE1lc3NhZ2VSZWFjdGlvblR5cGUsXG4gIE5leHRQYWdlQ29uZmlndXJhdGlvbixcbiAgU3RyZWFtTWVzc2FnZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGBDaGFubmVsU2VydmljZWAgcHJvdmlkZXMgZGF0YSBhbmQgaW50ZXJhY3Rpb24gZm9yIHRoZSBjaGFubmVsIGxpc3QgYW5kIG1lc3NhZ2UgbGlzdC5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIENoYW5uZWxTZXJ2aWNlPFxuICBUIGV4dGVuZHMgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyA9IERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3Ncbj4ge1xuICAvKipcbiAgICogRW1pdHMgYGZhbHNlYCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBwYWdlcyBvZiBjaGFubmVscyB0aGF0IGNhbiBiZSBsb2FkZWQuXG4gICAqL1xuICBoYXNNb3JlQ2hhbm5lbHMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGN1cnJlbnRseSBsb2FkZWQgYW5kIFt3YXRjaGVkXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC93YXRjaF9jaGFubmVsLz9sYW5ndWFnZT1qYXZhc2NyaXB0KSBjaGFubmVsIGxpc3QuXG4gICAqXG4gICAqIDo6OmltcG9ydGFudFxuICAgKiBJZiB5b3Ugd2FudCB0byBzdWJzY3JpYmUgdG8gY2hhbm5lbCBldmVudHMsIHlvdSBuZWVkIHRvIG1hbnVhbGx5IHJlZW50ZXIgQW5ndWxhcidzIGNoYW5nZSBkZXRlY3Rpb24gem9uZSwgb3VyIFtDaGFuZ2UgZGV0ZWN0aW9uIGd1aWRlXSguLi9jb25jZXB0cy9jaGFuZ2UtZGV0ZWN0aW9uLm1keCkgZXhwbGFpbnMgdGhpcyBpbiBkZXRhaWwuXG4gICAqIDo6OlxuICAgKlxuICAgKiAgQXBhcnQgZnJvbSBwYWdpbmF0aW9uLCB0aGUgY2hhbm5lbCBsaXN0IGlzIGFsc28gdXBkYXRlZCBvbiB0aGUgZm9sbG93aW5nIGV2ZW50czpcbiAgICpcbiAgICogIHwgRXZlbnQgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZWZhdWx0IGJlaGF2aW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDdXN0b20gaGFuZGxlciB0byBvdmVycmlkZSAgICAgICAgICAgICAgICAgICAgfFxuICAgKiAgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gICAqICB8IGBjaGFubmVsLmRlbGV0ZWRgICAgICAgICAgICAgICAgICAgIHwgUmVtb3ZlIGNoYW5uZWwgZnJvbSB0aGUgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGN1c3RvbUNoYW5uZWxEZWxldGVkSGFuZGxlcmAgICAgICAgICAgICAgICAgIHxcbiAgICogIHwgYGNoYW5uZWwuaGlkZGVuYCAgICAgICAgICAgICAgICAgICAgfCBSZW1vdmUgY2hhbm5lbCBmcm9tIHRoZSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgY3VzdG9tQ2hhbm5lbEhpZGRlbkhhbmRsZXJgICAgICAgICAgICAgICAgICAgfFxuICAgKiAgfCBgY2hhbm5lbC50cnVuY2F0ZWRgICAgICAgICAgICAgICAgICB8IFVwZGF0ZXMgdGhlIGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBjdXN0b21DaGFubmVsVHJ1bmNhdGVkSGFuZGxlcmAgICAgICAgICAgICAgICB8XG4gICAqICB8IGBjaGFubmVsLnVwZGF0ZWRgICAgICAgICAgICAgICAgICAgIHwgVXBkYXRlcyB0aGUgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGN1c3RvbUNoYW5uZWxVcGRhdGVkSGFuZGxlcmAgICAgICAgICAgICAgICAgIHxcbiAgICogIHwgYGNoYW5uZWwudmlzaWJsZWAgICAgICAgICAgICAgICAgICAgfCBBZGRzIHRoZSBjaGFubmVsIHRvIHRoZSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgY3VzdG9tQ2hhbm5lbFZpc2libGVIYW5kbGVyYCAgICAgICAgICAgICAgICAgfFxuICAgKiAgfCBgbWVzc2FnZS5uZXdgICAgICAgICAgICAgICAgICAgICAgICB8IE1vdmVzIHRoZSBjaGFubmVsIHRvIHRvcCBvZiB0aGUgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBjdXN0b21OZXdNZXNzYWdlSGFuZGxlcmAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqICB8IGBub3RpZmljYXRpb24uYWRkZWRfdG9fY2hhbm5lbGAgICAgIHwgQWRkcyB0aGUgbmV3IGNoYW5uZWwgdG8gdGhlIHRvcCBvZiB0aGUgbGlzdCBhbmQgc3RhcnRzIHdhdGNoaW5nIGl0IHwgYGN1c3RvbUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcmAgICAgIHxcbiAgICogIHwgYG5vdGlmaWNhdGlvbi5tZXNzYWdlX25ld2AgICAgICAgICAgfCBBZGRzIHRoZSBuZXcgY2hhbm5lbCB0byB0aGUgdG9wIG9mIHRoZSBsaXN0IGFuZCBzdGFydHMgd2F0Y2hpbmcgaXQgfCBgY3VzdG9tTmV3TWVzc2FnZU5vdGlmaWNhdGlvbkhhbmRsZXJgICAgICAgICAgfFxuICAgKiAgfCBgbm90aWZpY2F0aW9uLnJlbW92ZWRfZnJvbV9jaGFubmVsYCB8IFJlbW92ZXMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBjdXN0b21SZW1vdmVkRnJvbUNoYW5uZWxOb3RpZmljYXRpb25IYW5kbGVyYCB8XG4gICAqXG4gICAqICBJdCdzIGltcG9ydGFudCB0byBub3RlIHRoYXQgZmlsdGVycyBkb24ndCBhcHBseSB0byB1cGRhdGVzIHRvIHRoZSBsaXN0IGZyb20gZXZlbnRzLlxuICAgKlxuICAgKiAgT3VyIHBsYXRmb3JtIGRvY3VtZW50YXRpb24gY292ZXJzIHRoZSB0b3BpYyBvZiBbY2hhbm5lbCBldmVudHNdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L2V2ZW50X29iamVjdC8/bGFuZ3VhZ2U9amF2YXNjcmlwdCNldmVudHMpIGluIGRlcHRoLlxuICAgKlxuICAgKiAgQnkgZGVmYXVsdCBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGNoYW5uZWwgbG9hZCwgdGhlIE9ic2VydmFibGUgd2lsbCBlbWl0IGFuIGVycm9yLCB3aGljaCB3aWxsIGNsb3NlIHRoZSBzdHJlYW0uIFVzZXJzIHdpbGwgaGF2ZSB0byByZWxvYWQgdGhlIHBhZ2UgdG8gYmUgYWJsZSB0byByZWluaXRpYWxpemUgdGhlIGBDaGFubmVsU2VydmljZWAuIElmIHlvdSBkb24ndCB3YW50IHRoZSBzdHJlYW1zIHRvIGJlIGNsb3NlZCwgeW91IGNhbiBwYXNzIGBvcHRpb25zLmtlZXBBbGl2ZUNoYW5uZWxzJE9uRXJyb3IgPSB0cnVlYCB0byB0aGUgYGluaXRgIG1ldGhvZC4gSW4gdGhhdCBjYXNlIHRoZSBgY2hhbm5lbFF1ZXJ5U3RhdGUkYCBzdHJlYW0gd2lsbCBlbWl0IHRoZSBzdGF0dXMgb2YgdGhlIGxhdGVzdCBjaGFubmVsIGxvYWQgcmVxdWVzdC5cbiAgICovXG4gIGNoYW5uZWxzJDogT2JzZXJ2YWJsZTxDaGFubmVsPFQ+W10gfCB1bmRlZmluZWQ+O1xuICAvKipcbiAgICogVGhlIHJlc3VsdCBvZiB0aGUgbGF0ZXN0IGNoYW5uZWwgcXVlcnkgcmVxdWVzdC5cbiAgICovXG4gIGNoYW5uZWxRdWVyeVN0YXRlJDogT2JzZXJ2YWJsZTxDaGFubmVsUXVlcnlTdGF0ZSB8IHVuZGVmaW5lZD47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgY3VycmVudGx5IGFjdGl2ZSBjaGFubmVsLlxuICAgKlxuICAgKiA6OjppbXBvcnRhbnRcbiAgICogSWYgeW91IHdhbnQgdG8gc3Vic2NyaWJlIHRvIGNoYW5uZWwgZXZlbnRzLCB5b3UgbmVlZCB0byBtYW51YWxseSByZWVudGVyIEFuZ3VsYXIncyBjaGFuZ2UgZGV0ZWN0aW9uIHpvbmUsIG91ciBbQ2hhbmdlIGRldGVjdGlvbiBndWlkZV0oLi4vY29uY2VwdHMvY2hhbmdlLWRldGVjdGlvbi5tZHgpIGV4cGxhaW5zIHRoaXMgaW4gZGV0YWlsLlxuICAgKiA6OjpcbiAgICpcbiAgICogVGhlIGFjdGl2ZSBjaGFubmVsIHdpbGwgYWx3YXlzIGJlIG1hcmtlZCBhcyByZWFkIHdoZW4gYSBuZXcgbWVzc2FnZSBpcyByZWNlaXZlZFxuICAgKi9cbiAgYWN0aXZlQ2hhbm5lbCQ6IE9ic2VydmFibGU8Q2hhbm5lbDxUPiB8IHVuZGVmaW5lZD47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgbGlzdCBvZiBjdXJyZW50bHkgbG9hZGVkIG1lc3NhZ2VzIG9mIHRoZSBhY3RpdmUgY2hhbm5lbC5cbiAgICovXG4gIGFjdGl2ZUNoYW5uZWxNZXNzYWdlcyQ6IE9ic2VydmFibGU8U3RyZWFtTWVzc2FnZTxUPltdPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBsaXN0IG9mIHBpbm5lZCBtZXNzYWdlcyBvZiB0aGUgYWN0aXZlIGNoYW5uZWwuXG4gICAqL1xuICBhY3RpdmVDaGFubmVsUGlubmVkTWVzc2FnZXMkOiBPYnNlcnZhYmxlPFN0cmVhbU1lc3NhZ2U8VD5bXT47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgaWQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYXJlbnQgbWVzc2FnZS4gSWYgbm8gbWVzc2FnZSBpcyBzZWxlY3RlZCwgaXQgZW1pdHMgdW5kZWZpbmVkLlxuICAgKi9cbiAgYWN0aXZlUGFyZW50TWVzc2FnZUlkJDogT2JzZXJ2YWJsZTxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGxpc3Qgb2YgY3VycmVudGx5IGxvYWRlZCB0aHJlYWQgcmVwbGllcyBiZWxvbmdpbmcgdG8gdGhlIHNlbGVjdGVkIHBhcmVudCBtZXNzYWdlLiBJZiB0aGVyZSBpcyBubyBjdXJyZW50bHkgYWN0aXZlIHRocmVhZCBpdCBlbWl0cyBhbiBlbXB0eSBhcnJheS5cbiAgICovXG4gIGFjdGl2ZVRocmVhZE1lc3NhZ2VzJDogT2JzZXJ2YWJsZTxTdHJlYW1NZXNzYWdlPFQ+W10+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYXJlbnQgbWVzc2FnZS4gSWYgbm8gbWVzc2FnZSBpcyBzZWxlY3RlZCwgaXQgZW1pdHMgdW5kZWZpbmVkLlxuICAgKi9cbiAgYWN0aXZlUGFyZW50TWVzc2FnZSQ6IE9ic2VydmFibGU8U3RyZWFtTWVzc2FnZTxUPiB8IHVuZGVmaW5lZD47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1lc3NhZ2UgdG8gcXVvdGVcbiAgICovXG4gIG1lc3NhZ2VUb1F1b3RlJDogT2JzZXJ2YWJsZTxTdHJlYW1NZXNzYWdlPFQ+IHwgdW5kZWZpbmVkPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0aGUgbWVzc2FnZSBsaXN0IHNob3VsZCBqdW1wIHRvIChjYW4gYmUgYSBjaGFubmVsIG1lc3NhZ2Ugb3IgdGhyZWFkIG1lc3NhZ2UpXG4gICAqL1xuICBqdW1wVG9NZXNzYWdlJDogT2JzZXJ2YWJsZTx7IGlkPzogc3RyaW5nOyBwYXJlbnRJZD86IHN0cmluZyB9PjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBsaXN0IG9mIHVzZXJzIHRoYXQgYXJlIGN1cnJlbnRseSB0eXBpbmcgaW4gdGhlIGNoYW5uZWwgKGN1cnJlbnQgdXNlciBpcyBub3QgaW5jbHVkZWQpXG4gICAqL1xuICB1c2Vyc1R5cGluZ0luQ2hhbm5lbCQ6IE9ic2VydmFibGU8VXNlclJlc3BvbnNlPFQ+W10+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGxpc3Qgb2YgdXNlcnMgdGhhdCBhcmUgY3VycmVudGx5IHR5cGluZyBpbiB0aGUgYWN0aXZlIHRocmVhZCAoY3VycmVudCB1c2VyIGlzIG5vdCBpbmNsdWRlZClcbiAgICovXG4gIHVzZXJzVHlwaW5nSW5UaHJlYWQkOiBPYnNlcnZhYmxlPFVzZXJSZXNwb25zZTxUPltdPjtcbiAgLyoqXG4gICAqIEVtaXRzIGEgbWFwIHRoYXQgY29udGFpbnMgdGhlIGRhdGUgb2YgdGhlIGxhdGVzdCBtZXNzYWdlIHNlbnQgYnkgdGhlIGN1cnJlbnQgdXNlciBieSBjaGFubmVscyAodGhpcyBpcyB1c2VkIHRvIGRldGVjdCBpZiBzbG93IG1vZGUgY291bnRkb3duIHNob3VsZCBiZSBzdGFydGVkKVxuICAgKi9cbiAgbGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzJDogT2JzZXJ2YWJsZTx7IFtrZXk6IHN0cmluZ106IERhdGUgfT47XG4gIC8qKlxuICAgKiBUaGUgbGFzdCByZWFkIG1lc3NhZ2UgaWQgb2YgdGhlIGFjdGl2ZSBjaGFubmVsLCBpdCdzIG9ubHkgc2V0IG9uY2UsIHdoZW4gYSBuZXcgYWN0aXZlIGNoYW5uZWwgaXMgc2V0LiBJdCdzIHVzZWQgYnkgdGhlIG1lc3NhZ2UgbGlzdCB0byBqdW1wIHRvIHRoZSBsYXRlc3QgcmVhZCBtZXNzYWdlXG4gICAqL1xuICBhY3RpdmVDaGFubmVsTGFzdFJlYWRNZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIGlmIGEgbmV3IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBhIGNoYW5uZWwgdGhhdCBpcyBub3QgYmVpbmcgd2F0Y2hlZCwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC4vQ2hhbm5lbFNlcnZpY2UubWR4LyNjaGFubmVscylcbiAgICovXG4gIGN1c3RvbU5ld01lc3NhZ2VOb3RpZmljYXRpb25IYW5kbGVyPzogKFxuICAgIGNsaWVudEV2ZW50OiBDbGllbnRFdmVudCxcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKFxuICAgICAgY2hhbm5lbHM6IChDaGFubmVsPFQ+IHwgQ2hhbm5lbFJlc3BvbnNlPFQ+KVtdLFxuICAgICAgc2hvdWxkU3RvcFdhdGNoaW5nUmVtb3ZlZENoYW5uZWxzPzogYm9vbGVhblxuICAgICkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIHdoZW4gdGhlIHVzZXIgaXMgYWRkZWQgdG8gYSBjaGFubmVsLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oLi9DaGFubmVsU2VydmljZS5tZHgvI2NoYW5uZWxzKVxuICAgKi9cbiAgY3VzdG9tQWRkZWRUb0NoYW5uZWxOb3RpZmljYXRpb25IYW5kbGVyPzogKFxuICAgIGNsaWVudEV2ZW50OiBDbGllbnRFdmVudCxcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKFxuICAgICAgY2hhbm5lbHM6IChDaGFubmVsPFQ+IHwgQ2hhbm5lbFJlc3BvbnNlPFQ+KVtdLFxuICAgICAgc2hvdWxkU3RvcFdhdGNoaW5nUmVtb3ZlZENoYW5uZWxzPzogYm9vbGVhblxuICAgICkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIHdoZW4gdGhlIHVzZXIgaXMgcmVtb3ZlZCBmcm9tIGEgY2hhbm5lbCwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC4vQ2hhbm5lbFNlcnZpY2UubWR4LyNjaGFubmVscylcbiAgICovXG4gIGN1c3RvbVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXI/OiAoXG4gICAgY2xpZW50RXZlbnQ6IENsaWVudEV2ZW50LFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoXG4gICAgICBjaGFubmVsczogKENoYW5uZWw8VD4gfCBDaGFubmVsUmVzcG9uc2U8VD4pW10sXG4gICAgICBzaG91bGRTdG9wV2F0Y2hpbmdSZW1vdmVkQ2hhbm5lbHM/OiBib29sZWFuXG4gICAgKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgd2hlbiBhIGNoYW5uZWwgaXMgZGVsZXRlZCwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC4vQ2hhbm5lbFNlcnZpY2UubWR4LyNjaGFubmVscylcbiAgICovXG4gIGN1c3RvbUNoYW5uZWxEZWxldGVkSGFuZGxlcj86IChcbiAgICBldmVudDogRXZlbnQsXG4gICAgY2hhbm5lbDogQ2hhbm5lbDxUPixcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKFxuICAgICAgY2hhbm5lbHM6IChDaGFubmVsPFQ+IHwgQ2hhbm5lbFJlc3BvbnNlPFQ+KVtdLFxuICAgICAgc2hvdWxkU3RvcFdhdGNoaW5nUmVtb3ZlZENoYW5uZWxzPzogYm9vbGVhblxuICAgICkgPT4gdm9pZCxcbiAgICBtZXNzYWdlTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlPFQ+W10pID0+IHZvaWQsXG4gICAgdGhyZWFkTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlPFQ+W10pID0+IHZvaWQsXG4gICAgcGFyZW50TWVzc2FnZVNldHRlcjogKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U8VD4gfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIGEgY2hhbm5lbCBpcyB1cGRhdGVkLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oLi9DaGFubmVsU2VydmljZS5tZHgvI2NoYW5uZWxzKVxuICAgKi9cbiAgY3VzdG9tQ2hhbm5lbFVwZGF0ZWRIYW5kbGVyPzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBjaGFubmVsOiBDaGFubmVsPFQ+LFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoXG4gICAgICBjaGFubmVsczogKENoYW5uZWw8VD4gfCBDaGFubmVsUmVzcG9uc2U8VD4pW10sXG4gICAgICBzaG91bGRTdG9wV2F0Y2hpbmdSZW1vdmVkQ2hhbm5lbHM/OiBib29sZWFuXG4gICAgKSA9PiB2b2lkLFxuICAgIG1lc3NhZ2VMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4gdm9pZCxcbiAgICB0aHJlYWRMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4gdm9pZCxcbiAgICBwYXJlbnRNZXNzYWdlU2V0dGVyOiAobWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIHdoZW4gYSBjaGFubmVsIGlzIHRydW5jYXRlZCwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC4vQ2hhbm5lbFNlcnZpY2UubWR4LyNjaGFubmVscylcbiAgICovXG4gIGN1c3RvbUNoYW5uZWxUcnVuY2F0ZWRIYW5kbGVyPzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBjaGFubmVsOiBDaGFubmVsPFQ+LFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoXG4gICAgICBjaGFubmVsczogKENoYW5uZWw8VD4gfCBDaGFubmVsUmVzcG9uc2U8VD4pW10sXG4gICAgICBzaG91bGRTdG9wV2F0Y2hpbmdSZW1vdmVkQ2hhbm5lbHM/OiBib29sZWFuXG4gICAgKSA9PiB2b2lkLFxuICAgIG1lc3NhZ2VMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2U8VD5bXSkgPT4gdm9pZCxcbiAgICB0aHJlYWRMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2U8VD5bXSkgPT4gdm9pZCxcbiAgICBwYXJlbnRNZXNzYWdlU2V0dGVyOiAobWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPiB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIHdoZW4gYSBjaGFubmVsIGJlY29tZXMgaGlkZGVuLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oLi9DaGFubmVsU2VydmljZS5tZHgvI2NoYW5uZWxzKVxuICAgKi9cbiAgY3VzdG9tQ2hhbm5lbEhpZGRlbkhhbmRsZXI/OiAoXG4gICAgZXZlbnQ6IEV2ZW50LFxuICAgIGNoYW5uZWw6IENoYW5uZWw8VD4sXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChcbiAgICAgIGNoYW5uZWxzOiAoQ2hhbm5lbDxUPiB8IENoYW5uZWxSZXNwb25zZTxUPilbXSxcbiAgICAgIHNob3VsZFN0b3BXYXRjaGluZ1JlbW92ZWRDaGFubmVscz86IGJvb2xlYW5cbiAgICApID0+IHZvaWQsXG4gICAgbWVzc2FnZUxpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZTxUPltdKSA9PiB2b2lkLFxuICAgIHRocmVhZExpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZTxUPltdKSA9PiB2b2lkLFxuICAgIHBhcmVudE1lc3NhZ2VTZXR0ZXI6IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPFQ+IHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgd2hlbiBhIGNoYW5uZWwgYmVjb21lcyB2aXNpYmxlLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oLi9DaGFubmVsU2VydmljZS5tZHgvI2NoYW5uZWxzKVxuICAgKi9cbiAgY3VzdG9tQ2hhbm5lbFZpc2libGVIYW5kbGVyPzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBjaGFubmVsOiBDaGFubmVsPFQ+LFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoXG4gICAgICBjaGFubmVsczogKENoYW5uZWw8VD4gfCBDaGFubmVsUmVzcG9uc2U8VD4pW10sXG4gICAgICBzaG91bGRTdG9wV2F0Y2hpbmdSZW1vdmVkQ2hhbm5lbHM/OiBib29sZWFuXG4gICAgKSA9PiB2b2lkLFxuICAgIG1lc3NhZ2VMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2U8VD5bXSkgPT4gdm9pZCxcbiAgICB0aHJlYWRMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2U8VD5bXSkgPT4gdm9pZCxcbiAgICBwYXJlbnRNZXNzYWdlU2V0dGVyOiAobWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPiB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIGlmIGEgbmV3IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBhIGNoYW5uZWwgdGhhdCBpcyBiZWluZyB3YXRjaGVkLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oLi9DaGFubmVsU2VydmljZS5tZHgvI2NoYW5uZWxzKVxuICAgKi9cbiAgY3VzdG9tTmV3TWVzc2FnZUhhbmRsZXI/OiAoXG4gICAgZXZlbnQ6IEV2ZW50LFxuICAgIGNoYW5uZWw6IENoYW5uZWw8VD4sXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChcbiAgICAgIGNoYW5uZWxzOiAoQ2hhbm5lbDxUPiB8IENoYW5uZWxSZXNwb25zZTxUPilbXSxcbiAgICAgIHNob3VsZFN0b3BXYXRjaGluZ1JlbW92ZWRDaGFubmVscz86IGJvb2xlYW5cbiAgICApID0+IHZvaWQsXG4gICAgbWVzc2FnZUxpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZTxUPltdKSA9PiB2b2lkLFxuICAgIHRocmVhZExpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZTxUPltdKSA9PiB2b2lkLFxuICAgIHBhcmVudE1lc3NhZ2VTZXR0ZXI6IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPFQ+IHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZmlsZSB1cGxvYWQgcmVxdWVzdCAtIHlvdSBjYW4gdXNlIHRoaXMgdG8gdXBsb2FkIGZpbGVzIHRvIHlvdXIgb3duIENETlxuICAgKi9cbiAgY3VzdG9tRmlsZVVwbG9hZFJlcXVlc3Q/OiAoXG4gICAgZmlsZTogRmlsZSxcbiAgICBjaGFubmVsOiBDaGFubmVsPFQ+XG4gICkgPT4gUHJvbWlzZTx7IGZpbGU6IHN0cmluZyB9PjtcbiAgLyoqXG4gICAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaW1hZ2UgdXBsb2FkIHJlcXVlc3QgLSB5b3UgY2FuIHVzZSB0aGlzIHRvIHVwbG9hZCBpbWFnZXMgdG8geW91ciBvd24gQ0ROXG4gICAqL1xuICBjdXN0b21JbWFnZVVwbG9hZFJlcXVlc3Q/OiAoXG4gICAgZmlsZTogRmlsZSxcbiAgICBjaGFubmVsOiBDaGFubmVsPFQ+XG4gICkgPT4gUHJvbWlzZTx7IGZpbGU6IHN0cmluZyB9PjtcbiAgLyoqXG4gICAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZmlsZSBkZWxldGUgcmVxdWVzdCAtIG92ZXJyaWRlIHRoaXMgaWYgeW91IHVzZSB5b3VyIG93biBDRE5cbiAgICovXG4gIGN1c3RvbUZpbGVEZWxldGVSZXF1ZXN0PzogKHVybDogc3RyaW5nLCBjaGFubmVsOiBDaGFubmVsPFQ+KSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogWW91IGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCBpbWFnZSBkZWxldGUgcmVxdWVzdCAtIG92ZXJyaWRlIHRoaXMgaWYgeW91IHVzZSB5b3VyIG93biBDRE5cbiAgICovXG4gIGN1c3RvbUltYWdlRGVsZXRlUmVxdWVzdD86IChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBjaGFubmVsOiBDaGFubmVsPFQ+XG4gICkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBwcm92aWRlZCBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGRlbGV0aW5nIGEgbWVzc2FnZS4gSWYgdGhlIHJldHVybmVkIFByb21pc2UgcmVzb2x2ZXMgdG8gYHRydWVgIHRvIGRlbGV0aW9uIHdpbGwgZ28gYWhlYWQuIElmIGBmYWxzZWAgaXMgcmV0dXJuZWQsIHRoZSBtZXNzYWdlIHdvbid0IGJlIGRlbGV0ZWQuXG4gICAqL1xuICBtZXNzYWdlRGVsZXRlQ29uZmlybWF0aW9uSGFuZGxlcj86IChcbiAgICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPFQ+XG4gICkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgLyoqXG4gICAqIFRoZSBwcm92aWRlZCBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGEgbmV3IG1lc3NhZ2UgaXMgc2VudCB0byBTdHJlYW0ncyBBUEkuIFlvdSBjYW4gdXNlIHRoaXMgaG9vayB0byB0cmFuZnJvbSBvciBlbnJpY2ggdGhlIG1lc3NhZ2UgYmVpbmcgc2VudC5cbiAgICovXG4gIGJlZm9yZVNlbmRNZXNzYWdlPzogKFxuICAgIGlucHV0OiBNZXNzYWdlSW5wdXQ8VD5cbiAgKSA9PiBNZXNzYWdlSW5wdXQ8VD4gfCBQcm9taXNlPE1lc3NhZ2VJbnB1dDxUPj47XG4gIC8qKlxuICAgKiBUaGUgcHJvdmlkZWQgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBhIG1lc3NhZ2UgaXMgc2VudCB0byBTdHJlYW0ncyBBUEkgZm9yIHVwZGF0ZS4gWW91IGNhbiB1c2UgdGhpcyBob29rIHRvIHRyYW5mcm9tIG9yIGVucmljaCB0aGUgbWVzc2FnZSBiZWluZyB1cGRhdGVkLlxuICAgKi9cbiAgYmVmb3JlVXBkYXRlTWVzc2FnZT86IChcbiAgICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPFQ+XG4gICkgPT4gU3RyZWFtTWVzc2FnZTxUPiB8IFByb21pc2U8U3RyZWFtTWVzc2FnZTxUPj47XG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHRoZSBTREsgdXNlcyBhbiBvZmZzZXQgYmFzZWQgcGFnaW5hdGlvbiwgeW91IGNhbiBjaGFuZ2UvZXh0ZW5kIHRoaXMgYnkgcHJvdmlkaW5nIHlvdXIgb3duIGN1c3RvbSBwYWdpbmF0b3IgbWV0aG9kLlxuICAgKlxuICAgKiBUaGUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgbGF0ZXN0IGNoYW5uZWwgcXVlcnkuXG4gICAqXG4gICAqIFlvdSBjYW4gcmV0dXJuIGVpdGhlciBhbiBvZmZzZXQsIG9yIGEgZmlsdGVyIHVzaW5nIHRoZSBbYCRsdGVgL2AkZ3RlYCBvcGVyYXRvcl0oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvcXVlcnlfc3ludGF4X29wZXJhdG9ycy8pLiBJZiB5b3UgcmV0dXJuIGEgZmlsdGVyLCBpdCB3aWxsIGJlIG1lcmdlZCB3aXRoIHRoZSBmaWx0ZXIgcHJvdmlkZWQgZm9yIHRoZSBgaW5pdGAgbWV0aG9kLlxuICAgKi9cbiAgY3VzdG9tUGFnaW5hdG9yPzogKGNoYW5uZWxRdWVyeVJlc3VsdDogQ2hhbm5lbDxUPltdKSA9PiBOZXh0UGFnZUNvbmZpZ3VyYXRpb247XG4gIC8qKlxuICAgKiBpbnRlcm5hbFxuICAgKi9cbiAgc3RhdGljIHJlYWRvbmx5IE1BWF9NRVNTQUdFX1JFQUNUSU9OU19UT19GRVRDSCA9IDEyMDA7XG4gIHByaXZhdGUgY2hhbm5lbHNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGFubmVsPFQ+W10gfCB1bmRlZmluZWQ+KFxuICAgIHVuZGVmaW5lZFxuICApO1xuICBwcml2YXRlIGFjdGl2ZUNoYW5uZWxTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGFubmVsPFQ+IHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcbiAgcHJpdmF0ZSBhY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICAoU3RyZWFtTWVzc2FnZTxUPiB8IE1lc3NhZ2VSZXNwb25zZTxUPiB8IEZvcm1hdE1lc3NhZ2VSZXNwb25zZTxUPilbXVxuICA+KFtdKTtcbiAgcHJpdmF0ZSBhY3RpdmVDaGFubmVsUGlubmVkTWVzc2FnZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBTdHJlYW1NZXNzYWdlW11cbiAgPihbXSk7XG4gIHByaXZhdGUgaGFzTW9yZUNoYW5uZWxzU3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuICBwcml2YXRlIGFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zOiB7IHVuc3Vic2NyaWJlOiAoKSA9PiB2b2lkIH1bXSA9IFtdO1xuICBwcml2YXRlIGNoYW5uZWxTdWJzY3JpcHRpb25zOiB7IFtrZXk6IHN0cmluZ106ICgpID0+IHZvaWQgfSA9IHt9O1xuICBwcml2YXRlIGFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIHN0cmluZyB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICAoU3RyZWFtTWVzc2FnZTxUPiB8IE1lc3NhZ2VSZXNwb25zZTxUPiB8IEZvcm1hdE1lc3NhZ2VSZXNwb25zZTxUPilbXVxuICA+KFtdKTtcbiAgcHJpdmF0ZSBqdW1wVG9NZXNzYWdlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e1xuICAgIGlkPzogc3RyaW5nO1xuICAgIHBhcmVudElkPzogc3RyaW5nO1xuICB9Pih7IGlkOiB1bmRlZmluZWQsIHBhcmVudElkOiB1bmRlZmluZWQgfSk7XG4gIHByaXZhdGUgbGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e1xuICAgIFtrZXk6IHN0cmluZ106IERhdGU7XG4gIH0+KHt9KTtcbiAgcHJpdmF0ZSBmaWx0ZXJzOiBDaGFubmVsRmlsdGVyczxUPiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzb3J0OiBDaGFubmVsU29ydDxUPiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBvcHRpb25zOlxuICAgIHwgKENoYW5uZWxPcHRpb25zICYgeyBrZWVwQWxpdmVDaGFubmVscyRPbkVycm9yPzogYm9vbGVhbiB9KVxuICAgIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VQYWdlU2l6ZSA9IDI1O1xuICBwcml2YXRlIG1lc3NhZ2VUb1F1b3RlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgU3RyZWFtTWVzc2FnZTxUPiB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgdXNlcnNUeXBpbmdJbkNoYW5uZWxTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVc2VyUmVzcG9uc2U8VD5bXT4oXG4gICAgW11cbiAgKTtcbiAgcHJpdmF0ZSB1c2Vyc1R5cGluZ0luVGhyZWFkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXNlclJlc3BvbnNlPFQ+W10+KFxuICAgIFtdXG4gICk7XG4gIHByaXZhdGUgX3Nob3VsZE1hcmtBY3RpdmVDaGFubmVsQXNSZWFkID0gdHJ1ZTtcbiAgcHJpdmF0ZSBzaG91bGRTZXRBY3RpdmVDaGFubmVsOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGNsaWVudEV2ZW50c1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGlzU3RhdGVSZWNvdmVyeUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjaGFubmVsUXVlcnlTdGF0ZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIENoYW5uZWxRdWVyeVN0YXRlIHwgdW5kZWZpbmVkXG4gID4odW5kZWZpbmVkKTtcblxuICBwcml2YXRlIGNoYW5uZWxMaXN0U2V0dGVyID0gKFxuICAgIGNoYW5uZWxzOiAoQ2hhbm5lbDxUPiB8IENoYW5uZWxSZXNwb25zZTxUPilbXSxcbiAgICBzaG91bGRTdG9wV2F0Y2hpbmdSZW1vdmVkQ2hhbm5lbHMgPSB0cnVlXG4gICkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRDaGFubmVscyA9IHRoaXMuY2hhbm5lbHNTdWJqZWN0LmdldFZhbHVlKCkgfHwgW107XG4gICAgY29uc3QgbmV3Q2hhbm5lbHMgPSBjaGFubmVscy5maWx0ZXIoXG4gICAgICAoYykgPT4gIWN1cnJlbnRDaGFubmVscy5maW5kKChjaGFubmVsKSA9PiBjaGFubmVsLmNpZCA9PT0gYy5jaWQpXG4gICAgKTtcbiAgICBjb25zdCBkZWxldGVkQ2hhbm5lbHMgPSBjdXJyZW50Q2hhbm5lbHMuZmlsdGVyKFxuICAgICAgKGMpID0+ICFjaGFubmVscz8uZmluZCgoY2hhbm5lbCkgPT4gY2hhbm5lbC5jaWQgPT09IGMuY2lkKVxuICAgICk7XG4gICAgdm9pZCB0aGlzLmFkZENoYW5uZWxzRnJvbU5vdGlmaWNhdGlvbihuZXdDaGFubmVscyBhcyBDaGFubmVsUmVzcG9uc2U8VD5bXSk7XG4gICAgdGhpcy5yZW1vdmVDaGFubmVsc0Zyb21DaGFubmVsTGlzdChcbiAgICAgIGRlbGV0ZWRDaGFubmVscy5tYXAoKGMpID0+IGMuY2lkKSxcbiAgICAgIHNob3VsZFN0b3BXYXRjaGluZ1JlbW92ZWRDaGFubmVsc1xuICAgICk7XG4gIH07XG5cbiAgcHJpdmF0ZSBtZXNzYWdlTGlzdFNldHRlciA9IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZTxUPltdKSA9PiB7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQobWVzc2FnZXMpO1xuICB9O1xuXG4gIHByaXZhdGUgdGhyZWFkTGlzdFNldHRlciA9IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZTxUPltdKSA9PiB7XG4gICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChtZXNzYWdlcyk7XG4gIH07XG5cbiAgcHJpdmF0ZSBwYXJlbnRNZXNzYWdlU2V0dGVyID0gKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U8VD4gfCB1bmRlZmluZWQpID0+IHtcbiAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dChtZXNzYWdlPy5pZCk7XG4gIH07XG4gIHByaXZhdGUgZGlzbWlzc0Vycm9yTm90aWZpY2F0aW9uPzogRnVuY3Rpb247XG4gIHByaXZhdGUgbmV4dFBhZ2VDb25maWd1cmF0aW9uPzogTmV4dFBhZ2VDb25maWd1cmF0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhdENsaWVudFNlcnZpY2U6IENoYXRDbGllbnRTZXJ2aWNlPFQ+LFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuY2hhbm5lbHMkID0gdGhpcy5jaGFubmVsc1N1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsJCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3RcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJCA9IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5waXBlKFxuICAgICAgbWFwKChtZXNzYWdlcykgPT4ge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT5cbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybVRvU3RyZWFtTWVzc2FnZShtZXNzYWdlLCBjaGFubmVsKVxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBzaGFyZVJlcGxheSgxKVxuICAgICk7XG4gICAgdGhpcy5oYXNNb3JlQ2hhbm5lbHMkID0gdGhpcy5oYXNNb3JlQ2hhbm5lbHNTdWJqZWN0XG4gICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZCQgPSB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3RcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXMkID0gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QucGlwZShcbiAgICAgIG1hcCgobWVzc2FnZXMpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgICAgIHJldHVybiBtZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+XG4gICAgICAgICAgdGhpcy50cmFuc2Zvcm1Ub1N0cmVhbU1lc3NhZ2UobWVzc2FnZSwgY2hhbm5lbClcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZSQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJCxcbiAgICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkJCxcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKFxuICAgICAgICAoW21lc3NhZ2VzLCBwYXJlbnRNZXNzYWdlSWRdOiBbXG4gICAgICAgICAgU3RyZWFtTWVzc2FnZVtdLFxuICAgICAgICAgIHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICAgICBdKSA9PiB7XG4gICAgICAgICAgaWYgKCFwYXJlbnRNZXNzYWdlSWQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlcy5maW5kKChtKSA9PiBtLmlkID09PSBwYXJlbnRNZXNzYWdlSWQpO1xuICAgICAgICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgICAgICAgIHZvaWQgdGhpcy5zZXRBc0FjdGl2ZVBhcmVudE1lc3NhZ2UodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcbiAgICB0aGlzLm1lc3NhZ2VUb1F1b3RlJCA9IHRoaXMubWVzc2FnZVRvUXVvdGVTdWJqZWN0XG4gICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgICB0aGlzLmp1bXBUb01lc3NhZ2UkID0gdGhpcy5qdW1wVG9NZXNzYWdlU3ViamVjdFxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShzaGFyZVJlcGxheSgxKSk7XG5cbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsJCA9IHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWxTdWJqZWN0XG4gICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWQkID0gdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkU3ViamVjdFxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgdGhpcy5sYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHMkID1cbiAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzU3ViamVjdFxuICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFBpbm5lZE1lc3NhZ2VzJCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFBpbm5lZE1lc3NhZ2VzU3ViamVjdFxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgdGhpcy5jaGFubmVsUXVlcnlTdGF0ZSQgPSB0aGlzLmNoYW5uZWxRdWVyeVN0YXRlU3ViamVjdFxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgc2V0IHRvIGZhbHNlLCByZWFkIGV2ZW50cyB3b24ndCBiZSBzZW50IGFzIG5ldyBtZXNzYWdlcyBhcmUgcmVjZWl2ZWQuIElmIHNldCB0byB0cnVlIGFjdGl2ZSBjaGFubmVsIChpZiBhbnkpIHdpbGwgaW1tZWRpYXRlbHkgYmUgbWFya2VkIGFzIHJlYWQuXG4gICAqL1xuICBnZXQgc2hvdWxkTWFya0FjdGl2ZUNoYW5uZWxBc1JlYWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nob3VsZE1hcmtBY3RpdmVDaGFubmVsQXNSZWFkO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHNldCB0byBmYWxzZSwgcmVhZCBldmVudHMgd29uJ3QgYmUgc2VudCBhcyBuZXcgbWVzc2FnZXMgYXJlIHJlY2VpdmVkLiBJZiBzZXQgdG8gdHJ1ZSBhY3RpdmUgY2hhbm5lbCAoaWYgYW55KSB3aWxsIGltbWVkaWF0ZWx5IGJlIG1hcmtlZCBhcyByZWFkLlxuICAgKi9cbiAgc2V0IHNob3VsZE1hcmtBY3RpdmVDaGFubmVsQXNSZWFkKHNob3VsZE1hcmtBY3RpdmVDaGFubmVsQXNSZWFkOiBib29sZWFuKSB7XG4gICAgaWYgKCF0aGlzLl9zaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZCAmJiBzaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZCkge1xuICAgICAgY29uc3QgYWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgIGlmIChhY3RpdmVDaGFubmVsICYmIHRoaXMuY2FuU2VuZFJlYWRFdmVudHMpIHtcbiAgICAgICAgdm9pZCBhY3RpdmVDaGFubmVsLm1hcmtSZWFkKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3Nob3VsZE1hcmtBY3RpdmVDaGFubmVsQXNSZWFkID0gc2hvdWxkTWFya0FjdGl2ZUNoYW5uZWxBc1JlYWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZ2l2ZW4gYGNoYW5uZWxgIGFzIGFjdGl2ZSBhbmQgbWFya3MgaXQgYXMgcmVhZC5cbiAgICogSWYgdGhlIGNoYW5uZWwgd2Fzbid0IHByZXZpb3VzbHkgcGFydCBvZiB0aGUgY2hhbm5lbCwgaXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbFxuICAgKi9cbiAgc2V0QXNBY3RpdmVDaGFubmVsKGNoYW5uZWw6IENoYW5uZWw8VD4pIHtcbiAgICBjb25zdCBwcmV2QWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAocHJldkFjdGl2ZUNoYW5uZWw/LmNpZCA9PT0gY2hhbm5lbC5jaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdG9wV2F0Y2hGb3JBY3RpdmVDaGFubmVsRXZlbnRzKHByZXZBY3RpdmVDaGFubmVsKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxMYXN0UmVhZE1lc3NhZ2VJZCA9XG4gICAgICBjaGFubmVsLnN0YXRlLnJlYWRbXG4gICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyPy5pZCB8fCAnJ1xuICAgICAgXT8ubGFzdF9yZWFkX21lc3NhZ2VfaWQ7XG4gICAgaWYgKFxuICAgICAgY2hhbm5lbC5zdGF0ZS5sYXRlc3RNZXNzYWdlc1tjaGFubmVsLnN0YXRlLmxhdGVzdE1lc3NhZ2VzLmxlbmd0aCAtIDFdXG4gICAgICAgID8uaWQgPT09IHRoaXMuYWN0aXZlQ2hhbm5lbExhc3RSZWFkTWVzc2FnZUlkXG4gICAgKSB7XG4gICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxMYXN0UmVhZE1lc3NhZ2VJZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy53YXRjaEZvckFjdGl2ZUNoYW5uZWxFdmVudHMoY2hhbm5lbCk7XG4gICAgdGhpcy5hZGRDaGFubmVsKGNoYW5uZWwpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dChjaGFubmVsKTtcbiAgICBjb25zdCBjaGFubmVsU3RhdGVMZW5ndGggPSBjaGFubmVsLnN0YXRlLmxhdGVzdE1lc3NhZ2VzLmxlbmd0aDtcbiAgICBpZiAoY2hhbm5lbFN0YXRlTGVuZ3RoID4gMiAqIHRoaXMubWVzc2FnZVBhZ2VTaXplKSB7XG4gICAgICBjaGFubmVsLnN0YXRlLmxhdGVzdE1lc3NhZ2VzID0gY2hhbm5lbC5zdGF0ZS5sYXRlc3RNZXNzYWdlcy5zbGljZShcbiAgICAgICAgY2hhbm5lbFN0YXRlTGVuZ3RoIC0gMiAqIHRoaXMubWVzc2FnZVBhZ2VTaXplXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnNldENoYW5uZWxTdGF0ZShjaGFubmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlbGVjdHMgdGhlIGN1cnJlbnRseSBhY3RpdmUgKGlmIGFueSkgY2hhbm5lbFxuICAgKi9cbiAgZGVzZWxlY3RBY3RpdmVDaGFubmVsKCkge1xuICAgIGNvbnN0IGFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgaWYgKCFhY3RpdmVDaGFubmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RvcFdhdGNoRm9yQWN0aXZlQ2hhbm5lbEV2ZW50cyhhY3RpdmVDaGFubmVsKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbXSk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtdKTtcbiAgICB0aGlzLmxhdGVzdE1lc3NhZ2VEYXRlQnlVc2VyQnlDaGFubmVsc1N1YmplY3QubmV4dCh7fSk7XG4gICAgdGhpcy5zZWxlY3RNZXNzYWdlVG9RdW90ZSh1bmRlZmluZWQpO1xuICAgIHRoaXMuanVtcFRvTWVzc2FnZVN1YmplY3QubmV4dCh7IGlkOiB1bmRlZmluZWQsIHBhcmVudElkOiB1bmRlZmluZWQgfSk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsUGlubmVkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgIHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWxTdWJqZWN0Lm5leHQoW10pO1xuICAgIHRoaXMudXNlcnNUeXBpbmdJblRocmVhZFN1YmplY3QubmV4dChbXSk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsTGFzdFJlYWRNZXNzYWdlSWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZ2l2ZW4gYG1lc3NhZ2VgIGFzIGFuIGFjdGl2ZSBwYXJlbnQgbWVzc2FnZS4gSWYgYHVuZGVmaW5lZGAgaXMgcHJvdmlkZWQsIGl0IHdpbGwgZGVsZXNlbGVjdCB0aGUgY3VycmVudCBwYXJlbnQgbWVzc2FnZS5cbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICogQHBhcmFtIGxvYWRNZXNzYWdlc0Zvcm1cbiAgICovXG4gIGFzeW5jIHNldEFzQWN0aXZlUGFyZW50TWVzc2FnZShcbiAgICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPFQ+IHwgdW5kZWZpbmVkLFxuICAgIGxvYWRNZXNzYWdlc0Zvcm06ICdyZXF1ZXN0JyB8ICdzdGF0ZScgPSAncmVxdWVzdCdcbiAgKSB7XG4gICAgY29uc3QgbWVzc2FnZVRvUXVvdGUgPSB0aGlzLm1lc3NhZ2VUb1F1b3RlU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGlmIChtZXNzYWdlVG9RdW90ZSAmJiAhIW1lc3NhZ2VUb1F1b3RlLnBhcmVudF9pZCkge1xuICAgICAgdGhpcy5tZXNzYWdlVG9RdW90ZVN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtdKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VUb0p1bXBUbyA9IHRoaXMuanVtcFRvTWVzc2FnZVN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgIGlmIChtZXNzYWdlVG9KdW1wVG8gJiYgISFtZXNzYWdlVG9KdW1wVG8ucGFyZW50SWQpIHtcbiAgICAgICAgdGhpcy5qdW1wVG9NZXNzYWdlU3ViamVjdC5uZXh0KHsgaWQ6IHVuZGVmaW5lZCwgcGFyZW50SWQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0Lm5leHQobWVzc2FnZS5pZCk7XG4gICAgICBjb25zdCBhY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgaWYgKGxvYWRNZXNzYWdlc0Zvcm0gPT09ICdyZXF1ZXN0Jykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhY3RpdmVDaGFubmVsPy5nZXRSZXBsaWVzKG1lc3NhZ2UuaWQsIHtcbiAgICAgICAgICBsaW1pdDogdGhpcy5vcHRpb25zPy5tZXNzYWdlX2xpbWl0LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChyZXN1bHQ/Lm1lc3NhZ2VzIHx8IFtdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoXG4gICAgICAgICAgYWN0aXZlQ2hhbm5lbD8uc3RhdGUudGhyZWFkc1ttZXNzYWdlLmlkXSB8fCBbXVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgbmV4dCBwYWdlIG9mIG1lc3NhZ2VzIG9mIHRoZSBhY3RpdmUgY2hhbm5lbC4gVGhlIHBhZ2Ugc2l6ZSBjYW4gYmUgc2V0IGluIHRoZSBbcXVlcnkgb3B0aW9uXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9xdWVyeV9jaGFubmVscy8/bGFuZ3VhZ2U9amF2YXNjcmlwdCNxdWVyeS1vcHRpb25zKSBvYmplY3QuXG4gICAqIEBwYXJhbSBkaXJlY3Rpb25cbiAgICovXG4gIGxvYWRNb3JlTWVzc2FnZXMoZGlyZWN0aW9uOiAnb2xkZXInIHwgJ25ld2VyJyA9ICdvbGRlcicpIHtcbiAgICBjb25zdCBhY3RpdmVDaG5hbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBtZXNzYWdlcyA9IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IGxhc3RNZXNzYWdlSWQgPVxuICAgICAgbWVzc2FnZXNbZGlyZWN0aW9uID09PSAnb2xkZXInID8gMCA6IG1lc3NhZ2VzLmxlbmd0aCAtIDFdPy5pZDtcbiAgICBpZiAoXG4gICAgICBkaXJlY3Rpb24gPT09ICduZXdlcicgJiZcbiAgICAgIGFjdGl2ZUNobmFubmVsPy5zdGF0ZT8ubGF0ZXN0TWVzc2FnZXMgPT09IGFjdGl2ZUNobmFubmVsPy5zdGF0ZT8ubWVzc2FnZXNcbiAgICApIHtcbiAgICAgIC8vIElmIHdlIGFyZSBvbiBsYXRlc3QgbWVzc2FnZSBzZXQsIGFjdGl2ZUNoYW5uZWxNZXNzYWdlcyQgd2lsbCBiZSByZWZyZXNoZWQgYnkgV1MgZXZlbnRzLCBubyBuZWVkIGZvciBhIHJlcXVlc3RcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGFjdGl2ZUNobmFubmVsXG4gICAgICA/LnF1ZXJ5KHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICBsaW1pdDogdGhpcy5vcHRpb25zPy5tZXNzYWdlX2xpbWl0LFxuICAgICAgICAgIFtkaXJlY3Rpb24gPT09ICdvbGRlcicgPyAnaWRfbHQnIDogJ2lkX2d0J106IGxhc3RNZXNzYWdlSWQsXG4gICAgICAgIH0sXG4gICAgICAgIG1lbWJlcnM6IHsgbGltaXQ6IDAgfSxcbiAgICAgICAgd2F0Y2hlcnM6IHsgbGltaXQ6IDAgfSxcbiAgICAgIH0pXG4gICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBhY3RpdmVDaG5hbm5lbD8uZGF0YT8uaWQgPT09XG4gICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpPy5kYXRhPy5pZFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgICAgICAuLi5hY3RpdmVDaG5hbm5lbC5zdGF0ZS5tZXNzYWdlcyxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgbmV4dCBwYWdlIG9mIG1lc3NhZ2VzIG9mIHRoZSBhY3RpdmUgdGhyZWFkLiBUaGUgcGFnZSBzaXplIGNhbiBiZSBzZXQgaW4gdGhlIFtxdWVyeSBvcHRpb25dKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X2NoYW5uZWxzLz9sYW5ndWFnZT1qYXZhc2NyaXB0I3F1ZXJ5LW9wdGlvbnMpIG9iamVjdC5cbiAgICogQHBhcmFtIGRpcmVjdGlvblxuICAgKi9cbiAgYXN5bmMgbG9hZE1vcmVUaHJlYWRSZXBsaWVzKGRpcmVjdGlvbjogJ29sZGVyJyB8ICduZXdlcicgPSAnb2xkZXInKSB7XG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJ25ld2VyJykge1xuICAgICAgLy8gVGhyZWFkIHJlcGxpZXMgYXJlbid0IGJyb2tlIGludG8gZGlmZmVyZW50IG1lc3NhZ2Ugc2V0cywgYWN0aXZlVGhyZWFkTWVzc2FnZXMkIHdpbGwgYmUgcmVmcmVzaGVkIGJ5IFdTIGV2ZW50cywgbm8gbmVlZCBmb3IgYSByZXF1ZXN0XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFjdGl2ZUNobmFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHBhcmVudE1lc3NhZ2VJZCA9IHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGlmICghcGFyZW50TWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRocmVhZE1lc3NhZ2VzID0gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBsYXN0TWVzc2FnZUlkID1cbiAgICAgIHRocmVhZE1lc3NhZ2VzW2RpcmVjdGlvbiA9PT0gJ29sZGVyJyA/IDAgOiB0aHJlYWRNZXNzYWdlcy5sZW5ndGggLSAxXT8uaWQ7XG4gICAgYXdhaXQgYWN0aXZlQ2huYW5uZWw/LmdldFJlcGxpZXMocGFyZW50TWVzc2FnZUlkLCB7XG4gICAgICBsaW1pdDogdGhpcy5vcHRpb25zPy5tZXNzYWdlX2xpbWl0LFxuICAgICAgW2RpcmVjdGlvbiA9PT0gJ29sZGVyJyA/ICdpZF9sdCcgOiAnaWRfZ3QnXTogbGFzdE1lc3NhZ2VJZCxcbiAgICB9KTtcbiAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFxuICAgICAgYWN0aXZlQ2huYW5uZWw/LnN0YXRlLnRocmVhZHNbcGFyZW50TWVzc2FnZUlkXSB8fCBbXVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUXVlcmllcyB0aGUgY2hhbm5lbHMgd2l0aCB0aGUgZ2l2ZW4gZmlsdGVycywgc29ydHMgYW5kIG9wdGlvbnMuIE1vcmUgaW5mbyBhYm91dCBbY2hhbm5lbCBxdWVyeWluZ10oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvcXVlcnlfY2hhbm5lbHMvP2xhbmd1YWdlPWphdmFzY3JpcHQpIGNhbiBiZSBmb3VuZCBpbiB0aGUgcGxhdGZvcm0gZG9jdW1lbnRhdGlvbi4gQnkgZGVmYXVsdCB0aGUgZmlyc3QgY2hhbm5lbCBpbiB0aGUgbGlzdCB3aWxsIGJlIHNldCBhcyBhY3RpdmUgY2hhbm5lbCBhbmQgd2lsbCBiZSBtYXJrZWQgYXMgcmVhZC5cbiAgICogQHBhcmFtIGZpbHRlcnNcbiAgICogQHBhcmFtIHNvcnRcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHBhcmFtIHNob3VsZFNldEFjdGl2ZUNoYW5uZWwgRGVjaWRlcyBpZiB0aGUgZmlyc3QgY2hhbm5lbCBpbiB0aGUgcmVzdWx0IHNob3VsZCBiZSBtYWRlIGFzIGFuIGFjdGl2ZSBjaGFubmVsLCBvciBubyBjaGFubmVsIHNob3VsZCBiZSBtYXJrZWQgYXMgYWN0aXZlXG4gICAqIEByZXR1cm5zIHRoZSBsaXN0IG9mIGNoYW5uZWxzIGZvdW5kIGJ5IHRoZSBxdWVyeVxuICAgKi9cbiAgYXN5bmMgaW5pdChcbiAgICBmaWx0ZXJzOiBDaGFubmVsRmlsdGVyczxUPixcbiAgICBzb3J0PzogQ2hhbm5lbFNvcnQ8VD4sXG4gICAgb3B0aW9ucz86IENoYW5uZWxPcHRpb25zICYgeyBrZWVwQWxpdmVDaGFubmVscyRPbkVycm9yPzogYm9vbGVhbiB9LFxuICAgIHNob3VsZFNldEFjdGl2ZUNoYW5uZWw6IGJvb2xlYW4gPSB0cnVlXG4gICkge1xuICAgIHRoaXMuZmlsdGVycyA9IGZpbHRlcnM7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgbGltaXQ6IDI1LFxuICAgICAgc3RhdGU6IHRydWUsXG4gICAgICBwcmVzZW5jZTogdHJ1ZSxcbiAgICAgIHdhdGNoOiB0cnVlLFxuICAgICAgbWVzc2FnZV9saW1pdDogdGhpcy5tZXNzYWdlUGFnZVNpemUsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG4gICAgdGhpcy5zb3J0ID0gc29ydCB8fCB7IGxhc3RfbWVzc2FnZV9hdDogLTEgfTtcbiAgICB0aGlzLnNob3VsZFNldEFjdGl2ZUNoYW5uZWwgPSBzaG91bGRTZXRBY3RpdmVDaGFubmVsO1xuICAgIHRoaXMuY2xpZW50RXZlbnRzU3Vic2NyaXB0aW9uID0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5ldmVudHMkLnN1YnNjcmliZShcbiAgICAgIChub3RpZmljYXRpb24pID0+IHZvaWQgdGhpcy5oYW5kbGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucXVlcnlDaGFubmVscyh0aGlzLnNob3VsZFNldEFjdGl2ZUNoYW5uZWwpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5kaXNtaXNzRXJyb3JOb3RpZmljYXRpb24gPVxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkUGVybWFuZW50Tm90aWZpY2F0aW9uKFxuICAgICAgICAgICdzdHJlYW1DaGF0LkVycm9yIGxvYWRpbmcgY2hhbm5lbHMnLFxuICAgICAgICAgICdlcnJvcidcbiAgICAgICAgKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGBhY3RpdmVDaGFubmVsJGAsIGBjaGFubmVscyRgIGFuZCBgYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJGAgT2JzZXJ2YWJsZXMuIFVzZWZ1bCB3aGVuIGRpc2Nvbm5lY3RpbmcgYSBjaGF0IHVzZXIsIHVzZSBpbiBjb21iaW5hdGlvbiB3aXRoIFtgZGlzY29ubmVjdFVzZXJgXSguL0NoYXRDbGllbnRTZXJ2aWNlLm1keC8jZGlzY29ubmVjdHVzZXIpLlxuICAgKi9cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5kZXNlbGVjdEFjdGl2ZUNoYW5uZWwoKTtcbiAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5jaGFubmVsUXVlcnlTdGF0ZVN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMuY2xpZW50RXZlbnRzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzbWlzc0Vycm9yTm90aWZpY2F0aW9uPy4oKTtcbiAgICB0aGlzLmRpc21pc3NFcnJvck5vdGlmaWNhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICBPYmplY3Qua2V5cyh0aGlzLmNoYW5uZWxTdWJzY3JpcHRpb25zKS5mb3JFYWNoKChjaWQpID0+IHtcbiAgICAgIHRoaXMuY2hhbm5lbFN1YnNjcmlwdGlvbnNbY2lkXSgpO1xuICAgIH0pO1xuICAgIHRoaXMuY2hhbm5lbFN1YnNjcmlwdGlvbnMgPSB7fTtcbiAgICB0aGlzLm5leHRQYWdlQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgbmV4dCBwYWdlIG9mIGNoYW5uZWxzLiBUaGUgcGFnZSBzaXplIGNhbiBiZSBzZXQgaW4gdGhlIFtxdWVyeSBvcHRpb25dKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X2NoYW5uZWxzLz9sYW5ndWFnZT1qYXZhc2NyaXB0I3F1ZXJ5LW9wdGlvbnMpIG9iamVjdC5cbiAgICovXG4gIGFzeW5jIGxvYWRNb3JlQ2hhbm5lbHMoKSB7XG4gICAgYXdhaXQgdGhpcy5xdWVyeUNoYW5uZWxzKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVhY3Rpb24gdG8gYSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIFRoZSBpZCBvZiB0aGUgbWVzc2FnZSB0byBhZGQgdGhlIHJlYWN0aW9uIHRvXG4gICAqIEBwYXJhbSByZWFjdGlvblR5cGUgVGhlIHR5cGUgb2YgdGhlIHJlYWN0aW9uXG4gICAqIEBwYXJhbSBjdXN0b21EYXRhXG4gICAqL1xuICBhc3luYyBhZGRSZWFjdGlvbihcbiAgICBtZXNzYWdlSWQ6IHN0cmluZyxcbiAgICByZWFjdGlvblR5cGU6IE1lc3NhZ2VSZWFjdGlvblR5cGUsXG4gICAgY3VzdG9tRGF0YT86IFRbJ3JlYWN0aW9uVHlwZSddXG4gICkge1xuICAgIGF3YWl0IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKT8uc2VuZFJlYWN0aW9uKG1lc3NhZ2VJZCwge1xuICAgICAgdHlwZTogcmVhY3Rpb25UeXBlLFxuICAgICAgLi4uY3VzdG9tRGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgcmVhY3Rpb24gZnJvbSBhIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgVGhlIGlkIG9mIHRoZSBtZXNzYWdlIHRvIHJlbW92ZSB0aGUgcmVhY3Rpb24gZnJvbVxuICAgKiBAcGFyYW0gcmVhY3Rpb25UeXBlIFRociB0eXBlIG9mIHJlYWN0aW9uIHRvIHJlbW92ZVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlUmVhY3Rpb24obWVzc2FnZUlkOiBzdHJpbmcsIHJlYWN0aW9uVHlwZTogTWVzc2FnZVJlYWN0aW9uVHlwZSkge1xuICAgIGF3YWl0IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3RcbiAgICAgIC5nZXRWYWx1ZSgpXG4gICAgICA/LmRlbGV0ZVJlYWN0aW9uKG1lc3NhZ2VJZCwgcmVhY3Rpb25UeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIGFjdGl2ZSBjaGFubmVsLiBUaGUgbWVzc2FnZSBpcyBpbW1lZGlhdGVseSBhZGRlZCB0byB0aGUgbWVzc2FnZSBsaXN0LCBpZiBhbiBlcnJvciBvY2N1cnMgYW5kIHRoZSBtZXNzYWdlIGNhbid0IGJlIHNlbnQsIHRoZSBlcnJvciBpcyBpbmRpY2F0ZWQgaW4gYHN0YXRlYCBvZiB0aGUgbWVzc2FnZS5cbiAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgb2YgdGhlIG1lc3NhZ2VcbiAgICogQHBhcmFtIGF0dGFjaG1lbnRzIFRoZSBhdHRhY2htZW50c1xuICAgKiBAcGFyYW0gbWVudGlvbmVkVXNlcnMgTWVudGlvbmVkIHVzZXJzXG4gICAqIEBwYXJhbSBwYXJlbnRJZCBJZCBvZiB0aGUgcGFyZW50IG1lc3NhZ2UgKGlmIHNlbmRpbmcgYSB0aHJlYWQgcmVwbHkpXG4gICAqIEBwYXJhbSBxdW90ZWRNZXNzYWdlSWQgSWQgb2YgdGhlIG1lc3NhZ2UgdG8gcXVvdGUgKGlmIHNlbmRpbmcgYSBxdW90ZSByZXBseSlcbiAgICogQHBhcmFtIGN1c3RvbURhdGFcbiAgICovXG4gIGFzeW5jIHNlbmRNZXNzYWdlKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBhdHRhY2htZW50czogQXR0YWNobWVudDxUPltdID0gW10sXG4gICAgbWVudGlvbmVkVXNlcnM6IFVzZXJSZXNwb25zZTxUPltdID0gW10sXG4gICAgcGFyZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICBxdW90ZWRNZXNzYWdlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICBjdXN0b21EYXRhOiB1bmRlZmluZWQgfCBQYXJ0aWFsPFRbJ21lc3NhZ2VUeXBlJ10+ID0gdW5kZWZpbmVkXG4gICkge1xuICAgIGxldCBpbnB1dDogTWVzc2FnZUlucHV0PFQ+ID0ge1xuICAgICAgdGV4dCxcbiAgICAgIGF0dGFjaG1lbnRzLFxuICAgICAgbWVudGlvbmVkVXNlcnMsXG4gICAgICBwYXJlbnRJZCxcbiAgICAgIHF1b3RlZE1lc3NhZ2VJZCxcbiAgICAgIGN1c3RvbURhdGEsXG4gICAgfTtcbiAgICBpZiAodGhpcy5iZWZvcmVTZW5kTWVzc2FnZSkge1xuICAgICAgaW5wdXQgPSBhd2FpdCB0aGlzLmJlZm9yZVNlbmRNZXNzYWdlKGlucHV0KTtcbiAgICB9XG4gICAgY29uc3QgcHJldmlldyA9IGNyZWF0ZU1lc3NhZ2VQcmV2aWV3KFxuICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXIhLFxuICAgICAgaW5wdXQudGV4dCxcbiAgICAgIGlucHV0LmF0dGFjaG1lbnRzLFxuICAgICAgaW5wdXQubWVudGlvbmVkVXNlcnMsXG4gICAgICBpbnB1dC5wYXJlbnRJZCxcbiAgICAgIGlucHV0LnF1b3RlZE1lc3NhZ2VJZCxcbiAgICAgIGlucHV0LmN1c3RvbURhdGFcbiAgICApO1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgIHByZXZpZXcucmVhZEJ5ID0gW107XG4gICAgY2hhbm5lbC5zdGF0ZS5hZGRNZXNzYWdlU29ydGVkKHByZXZpZXcsIHRydWUpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kTWVzc2FnZVJlcXVlc3QocHJldmlldywgaW5wdXQuY3VzdG9tRGF0YSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2VuZHMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gdGhlIGFjdGl2ZSBjaGFubmVsXG4gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHJlc2VuZFxuICAgKi9cbiAgYXN5bmMgcmVzZW5kTWVzc2FnZShtZXNzYWdlOiBTdHJlYW1NZXNzYWdlKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgY2hhbm5lbC5zdGF0ZS5hZGRNZXNzYWdlU29ydGVkKFxuICAgICAge1xuICAgICAgICAuLi4obWVzc2FnZSBhcyBhbnkgYXMgTWVzc2FnZVJlc3BvbnNlPFQ+KSxcbiAgICAgICAgZXJyb3JTdGF0dXNDb2RlOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogJ3NlbmRpbmcnLFxuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2VSZXF1ZXN0KG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIG1lc3NhZ2UgaW4gdGhlIGFjdGl2ZSBjaGFubmVsXG4gICAqIEBwYXJhbSBtZXNzYWdlIE1lc2FnZSB0byBiZSB1cGRhdGVkXG4gICAqL1xuICBhc3luYyB1cGRhdGVNZXNzYWdlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U8VD4pIHtcbiAgICBsZXQgbWVzc2FnZVRvVXBkYXRlID0geyAuLi5tZXNzYWdlIH07XG4gICAgZGVsZXRlIG1lc3NhZ2VUb1VwZGF0ZS5pMThuO1xuICAgIGlmICh0aGlzLmJlZm9yZVVwZGF0ZU1lc3NhZ2UpIHtcbiAgICAgIG1lc3NhZ2VUb1VwZGF0ZSA9IGF3YWl0IHRoaXMuYmVmb3JlVXBkYXRlTWVzc2FnZShtZXNzYWdlVG9VcGRhdGUpO1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51cGRhdGVNZXNzYWdlKFxuICAgICAgbWVzc2FnZVRvVXBkYXRlIGFzIGFueSBhcyBVcGRhdGVkTWVzc2FnZTxUPlxuICAgICk7XG5cbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5jaGFubmVsc1N1YmplY3RcbiAgICAgIC5nZXRWYWx1ZSgpXG4gICAgICA/LmZpbmQoKGMpID0+IGMuY2lkID09PSBtZXNzYWdlLmNpZCk7XG5cbiAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1Ub1N0cmVhbU1lc3NhZ2UocmVzcG9uc2UubWVzc2FnZSwgY2hhbm5lbCk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgbWVzc2FnZSBmcm9tIHRoZSBhY3RpdmUgY2hhbm5lbFxuICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIHRvIGJlIGRlbGV0ZWRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZU1lc3NhZ2UobWVzc2FnZTogU3RyZWFtTWVzc2FnZSkge1xuICAgIGlmICh0aGlzLm1lc3NhZ2VEZWxldGVDb25maXJtYXRpb25IYW5kbGVyKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm1lc3NhZ2VEZWxldGVDb25maXJtYXRpb25IYW5kbGVyKG1lc3NhZ2UpO1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBhd2FpdCB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQuZGVsZXRlTWVzc2FnZShtZXNzYWdlLmlkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LmRlbGV0ZU1lc3NhZ2UobWVzc2FnZS5pZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgZmlsZXMgdG8gdGhlIGNoYW5uZWwuIElmIHlvdSB3YW50IHRvIGtub3cgbW9yZSBhYm91dCBbZmlsZSB1cGxvYWRzXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9maWxlX3VwbG9hZHMvP2xhbmd1YWdlPWphdmFzY3JpcHQpIGNoZWNrIG91dCB0aGUgcGxhdGZvcm0gZG9jdW1lbnRhdGlvbi5cbiAgICogQHBhcmFtIHVwbG9hZHMgdGhlIGF0dGFjaG1lbnRzIHRvIHVwbG9hZCAob3V0cHV0IG9mIHRoZSBbYEF0dGFjaG1lbnRTZXJ2aWNlYF0oLi9BdHRhY2htZW50U2VydmljZS5tZHgpKVxuICAgKiBAcmV0dXJucyB0aGUgcmVzdWx0IG9mIGZpbGUgdXBsb2FkIHJlcXVlc3RzXG4gICAqL1xuICBhc3luYyB1cGxvYWRBdHRhY2htZW50cyhcbiAgICB1cGxvYWRzOiBBdHRhY2htZW50VXBsb2FkW11cbiAgKTogUHJvbWlzZTxBdHRhY2htZW50VXBsb2FkW10+IHtcbiAgICBjb25zdCByZXN1bHQ6IEF0dGFjaG1lbnRVcGxvYWRbXSA9IFtdO1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgIGNvbnN0IHVwbG9hZFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICB1cGxvYWRzLm1hcCgodXBsb2FkKSA9PlxuICAgICAgICB1cGxvYWQudHlwZSA9PT0gJ2ltYWdlJ1xuICAgICAgICAgID8gdGhpcy5jdXN0b21JbWFnZVVwbG9hZFJlcXVlc3RcbiAgICAgICAgICAgID8gdGhpcy5jdXN0b21JbWFnZVVwbG9hZFJlcXVlc3QodXBsb2FkLmZpbGUsIGNoYW5uZWwpXG4gICAgICAgICAgICA6IGNoYW5uZWwuc2VuZEltYWdlKHVwbG9hZC5maWxlLCB1cGxvYWQuZmlsZS5uYW1lLCB1cGxvYWQuZmlsZS50eXBlKVxuICAgICAgICAgIDogdGhpcy5jdXN0b21GaWxlVXBsb2FkUmVxdWVzdFxuICAgICAgICAgID8gdGhpcy5jdXN0b21GaWxlVXBsb2FkUmVxdWVzdCh1cGxvYWQuZmlsZSwgY2hhbm5lbClcbiAgICAgICAgICA6IGNoYW5uZWwuc2VuZEZpbGUodXBsb2FkLmZpbGUsIHVwbG9hZC5maWxlLm5hbWUsIHVwbG9hZC5maWxlLnR5cGUpXG4gICAgICApXG4gICAgKTtcbiAgICB1cGxvYWRSZXN1bHRzLmZvckVhY2goKHVwbG9hZFJlc3VsdCwgaSkgPT4ge1xuICAgICAgY29uc3QgZmlsZSA9IHVwbG9hZHNbaV0uZmlsZTtcbiAgICAgIGNvbnN0IHR5cGUgPSB1cGxvYWRzW2ldLnR5cGU7XG4gICAgICBpZiAodXBsb2FkUmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBzdGF0ZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgIHVybDogdXBsb2FkUmVzdWx0LnZhbHVlLmZpbGUsXG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4gICAgICAgICAgdGh1bWJfdXJsOiAodXBsb2FkUmVzdWx0LnZhbHVlIGFzIGFueSkudGh1bWJfdXJsLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCByZWFzb246IEF0dGFjaG1lbnRVcGxvYWRFcnJvclJlYXNvbiA9ICd1bmtub3duJztcbiAgICAgICAgbGV0IGV4dHJhRGF0YTogeyBwYXJhbTogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQgKi9cbiAgICAgICAgY29uc3QgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4gICAgICAgICAgdXBsb2FkUmVzdWx0LnJlYXNvbi5yZXNwb25zZT8uZGF0YT8ubWVzc2FnZTtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudCAqL1xuICAgICAgICBjb25zdCBjb2RlOiBudW1iZXIgfCB1bmRlZmluZWQgPVxuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cbiAgICAgICAgICB1cGxvYWRSZXN1bHQucmVhc29uLnJlc3BvbnNlPy5kYXRhPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gMjIpIHtcbiAgICAgICAgICByZWFzb24gPSAnZmlsZS1zaXplJztcbiAgICAgICAgICBleHRyYURhdGEgPSB7IHBhcmFtOiAvXFxkK01CLy5leGVjKG1lc3NhZ2UgfHwgJycpPy5bMF0gfHwgJzEwME1CJyB9O1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGNvZGUgPT09IDQgJiZcbiAgICAgICAgICBtZXNzYWdlPy50b0xvd2VyQ2FzZSgpPy5pbmNsdWRlcygnZmlsZSBleHRlbnNpb24nKVxuICAgICAgICApIHtcbiAgICAgICAgICByZWFzb24gPSAnZmlsZS1leHRlbnNpb24nO1xuICAgICAgICAgIGV4dHJhRGF0YSA9IHsgcGFyYW06IC9cXC5cXHcrLy5leGVjKG1lc3NhZ2UpPy5bMF0gfHwgJycgfTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgZmlsZSxcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIHN0YXRlOiAnZXJyb3InLFxuICAgICAgICAgIGVycm9yUmVhc29uOiByZWFzb24sXG4gICAgICAgICAgZXJyb3JFeHRyYUluZm86IGV4dHJhRGF0YSA/IFtleHRyYURhdGFdIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhbiB1cGxvYWRlZCBmaWxlIGJ5IFVSTC4gSWYgeW91IHdhbnQgdG8ga25vdyBtb3JlIGFib3V0IFtmaWxlIHVwbG9hZHNdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L2ZpbGVfdXBsb2Fkcy8/bGFuZ3VhZ2U9amF2YXNjcmlwdCkgY2hlY2sgb3V0IHRoZSBwbGF0Zm9ybSBkb2N1bWVudGF0aW9uXG4gICAqIEBwYXJhbSBhdHRhY2htZW50VXBsb2FkIEF0dGFjaG1lbnQgdG8gYmUgZGVsZXRlZCAob3V0cHV0IG9mIHRoZSBbYEF0dGFjaG1lbnRTZXJ2aWNlYF0oLi9BdHRhY2htZW50U2VydmljZS5tZHgpKVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlQXR0YWNobWVudChhdHRhY2htZW50VXBsb2FkOiBBdHRhY2htZW50VXBsb2FkKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgYXdhaXQgKGF0dGFjaG1lbnRVcGxvYWQudHlwZSA9PT0gJ2ltYWdlJ1xuICAgICAgPyB0aGlzLmN1c3RvbUltYWdlRGVsZXRlUmVxdWVzdFxuICAgICAgICA/IHRoaXMuY3VzdG9tSW1hZ2VEZWxldGVSZXF1ZXN0KGF0dGFjaG1lbnRVcGxvYWQudXJsISwgY2hhbm5lbClcbiAgICAgICAgOiBjaGFubmVsLmRlbGV0ZUltYWdlKGF0dGFjaG1lbnRVcGxvYWQudXJsISlcbiAgICAgIDogdGhpcy5jdXN0b21GaWxlRGVsZXRlUmVxdWVzdFxuICAgICAgPyB0aGlzLmN1c3RvbUZpbGVEZWxldGVSZXF1ZXN0KGF0dGFjaG1lbnRVcGxvYWQudXJsISwgY2hhbm5lbClcbiAgICAgIDogY2hhbm5lbC5kZWxldGVGaWxlKGF0dGFjaG1lbnRVcGxvYWQudXJsISkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGF1dG9jb21wbGV0ZSBvcHRpb25zIGZvciBjdXJyZW50IGNoYW5uZWwgbWVtYmVycy4gSWYgdGhlIGNoYW5uZWwgaGFzIGxlc3MgdGhhbiAxMDAgbWVtYmVycywgaXQgcmV0dXJucyB0aGUgY2hhbm5lbCBtZW1iZXJzLCBvdGhlcndpc2Ugc2VuZHMgYSBbc2VhcmNoIHJlcXVlc3RdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X21lbWJlcnMvP2xhbmd1YWdlPWphdmFzY3JpcHQjcGFnaW5hdGlvbi1hbmQtb3JkZXJpbmcpIHdpdGggdGhlIGdpdmVuIHNlYXJjaCB0ZXJtLlxuICAgKiBAcGFyYW0gc2VhcmNoVGVybSBUZXh0IHRvIHNlYXJjaCBmb3IgaW4gdGhlIG5hbWVzIG9mIG1lbWJlcnNcbiAgICogQHJldHVybnMgVGhlIGxpc3Qgb2YgbWVtYmVycyBtYXRjaGluZyB0aGUgc2VhcmNoIGZpbHRlclxuICAgKi9cbiAgYXN5bmMgYXV0b2NvbXBsZXRlTWVtYmVycyhzZWFyY2hUZXJtOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGlmICghYWN0aXZlQ2hhbm5lbCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMoYWN0aXZlQ2hhbm5lbC5zdGF0ZS5tZW1iZXJzKS5sZW5ndGggPCAxMDApIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGFjdGl2ZUNoYW5uZWwuc3RhdGUubWVtYmVycykuZmlsdGVyKFxuICAgICAgICAobSkgPT4gbS51c2VyPy5pZCAhPT0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXJJRCFcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghc2VhcmNoVGVybSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhY3RpdmVDaGFubmVsLnF1ZXJ5TWVtYmVycyh7XG4gICAgICAgIG5hbWU6IHsgJGF1dG9jb21wbGV0ZTogc2VhcmNoVGVybSB9LFxuICAgICAgICBpZDogeyAkbmU6IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VySUQhIH0sXG4gICAgICB9IGFzIFVzZXJGaWx0ZXJzPFQ+KTsgLy8gVE9ETzogZmluZCBvdXQgd2h5IHdlIG5lZWQgdHlwZWNhc3QgaGVyZVxuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMocmVzdWx0Lm1lbWJlcnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBbUnVucyBhIG1lc3NhZ2UgYWN0aW9uXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvcmVzdC8jbWVzc2FnZXMtcnVubWVzc2FnZWFjdGlvbikgaW4gdGhlIGN1cnJlbnQgY2hhbm5lbC4gVXBkYXRlcyB0aGUgbWVzc2FnZSBsaXN0IGJhc2VkIG9uIHRoZSBhY3Rpb24gcmVzdWx0IChpZiBubyBtZXNzYWdlIGlzIHJldHVybmVkLCB0aGUgbWVzc2FnZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbWVzc2FnZSBsaXN0KS5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZFxuICAgKiBAcGFyYW0gZm9ybURhdGFcbiAgICogQHBhcmFtIHBhcmVudE1lc3NhZ2VJZFxuICAgKi9cbiAgYXN5bmMgc2VuZEFjdGlvbihcbiAgICBtZXNzYWdlSWQ6IHN0cmluZyxcbiAgICBmb3JtRGF0YTogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBwYXJlbnRNZXNzYWdlSWQ/OiBzdHJpbmdcbiAgKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjaGFubmVsLnNlbmRBY3Rpb24obWVzc2FnZUlkLCBmb3JtRGF0YSk7XG4gICAgaWYgKHJlc3BvbnNlPy5tZXNzYWdlKSB7XG4gICAgICBjaGFubmVsLnN0YXRlLmFkZE1lc3NhZ2VTb3J0ZWQoe1xuICAgICAgICAuLi5yZXNwb25zZS5tZXNzYWdlLFxuICAgICAgICBzdGF0dXM6ICdyZWNlaXZlZCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGlzVGhyZWFkUmVwbHkgPSAhIXJlc3BvbnNlLm1lc3NhZ2UucGFyZW50X2lkO1xuICAgICAgaXNUaHJlYWRSZXBseVxuICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS50aHJlYWRzW3Jlc3BvbnNlLm1lc3NhZ2UucGFyZW50X2lkIV0sXG4gICAgICAgICAgXSlcbiAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlc10pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFubmVsLnN0YXRlLnJlbW92ZU1lc3NhZ2Uoe1xuICAgICAgICBpZDogbWVzc2FnZUlkLFxuICAgICAgICBwYXJlbnRfaWQ6IHBhcmVudE1lc3NhZ2VJZCxcbiAgICAgIH0pO1xuICAgICAgaWYgKHBhcmVudE1lc3NhZ2VJZCkge1xuICAgICAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFxuICAgICAgICAgIGNoYW5uZWwuc3RhdGUudGhyZWFkc1t0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QuZ2V0VmFsdWUoKSFdXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlc10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIG9yIGRlc2VsZWN0cyB0aGUgY3VycmVudCBtZXNzYWdlIHRvIHF1b3RlIHJlcGx5IHRvXG4gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHNlbGVjdCwgaWYgY2FsbGVkIHdpdGggYHVuZGVmaW5lZGAsIGl0IGRlc2VsZWN0cyB0aGUgbWVzc2FnZVxuICAgKi9cbiAgc2VsZWN0TWVzc2FnZVRvUXVvdGUobWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMubWVzc2FnZVRvUXVvdGVTdWJqZWN0Lm5leHQobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IGNoYW5uZWwgdG8gdGhlIGNoYW5uZWwgbGlzdFxuICAgKiBUaGUgY2hhbm5lbCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNoYW5uZWwgbGlzdFxuICAgKiBAcGFyYW0gY2hhbm5lbFxuICAgKi9cbiAgYWRkQ2hhbm5lbChjaGFubmVsOiBDaGFubmVsPFQ+KSB7XG4gICAgaWYgKCF0aGlzLmNoYW5uZWxzLmZpbmQoKGMpID0+IGMuY2lkID09PSBjaGFubmVsLmNpZCkpIHtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoW2NoYW5uZWwsIC4uLnRoaXMuY2hhbm5lbHNdKTtcbiAgICAgIHRoaXMud2F0Y2hGb3JDaGFubmVsRXZlbnRzKGNoYW5uZWwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VuZE1lc3NhZ2VSZXF1ZXN0KFxuICAgIHByZXZpZXc6IE1lc3NhZ2VSZXNwb25zZTxUPiB8IFN0cmVhbU1lc3NhZ2U8VD4sXG4gICAgY3VzdG9tRGF0YT86IFBhcnRpYWw8VFsnbWVzc2FnZVR5cGUnXT5cbiAgKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgY29uc3QgaXNUaHJlYWRSZXBseSA9ICEhcHJldmlldy5wYXJlbnRfaWQ7XG4gICAgaXNUaHJlYWRSZXBseVxuICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAuLi5jaGFubmVsLnN0YXRlLnRocmVhZHNbcHJldmlldy5wYXJlbnRfaWQhXSxcbiAgICAgICAgXSlcbiAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLmNoYW5uZWwuc3RhdGUubWVzc2FnZXNdKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjaGFubmVsLnNlbmRNZXNzYWdlKHtcbiAgICAgICAgaWQ6IHByZXZpZXcuaWQsXG4gICAgICAgIHRleHQ6IHByZXZpZXcudGV4dCxcbiAgICAgICAgYXR0YWNobWVudHM6IHByZXZpZXcuYXR0YWNobWVudHMsXG4gICAgICAgIG1lbnRpb25lZF91c2VyczogcHJldmlldy5tZW50aW9uZWRfdXNlcnM/Lm1hcCgodSkgPT4gdS5pZCksXG4gICAgICAgIHBhcmVudF9pZDogcHJldmlldy5wYXJlbnRfaWQsXG4gICAgICAgIHF1b3RlZF9tZXNzYWdlX2lkOiBwcmV2aWV3LnF1b3RlZF9tZXNzYWdlX2lkLFxuICAgICAgICAuLi5jdXN0b21EYXRhLFxuICAgICAgfSBhcyBNZXNzYWdlPFQ+KTsgLy8gVE9ETzogZmluZCBvdXQgd2h5IHdlIG5lZWQgdHlwZWNhc3QgaGVyZVxuICAgICAgY2hhbm5lbC5zdGF0ZS5hZGRNZXNzYWdlU29ydGVkKFxuICAgICAgICB7XG4gICAgICAgICAgLi4ucmVzcG9uc2UubWVzc2FnZSxcbiAgICAgICAgICBzdGF0dXM6ICdyZWNlaXZlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgICBpc1RocmVhZFJlcGx5XG4gICAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgICAgICAuLi5jaGFubmVsLnN0YXRlLnRocmVhZHNbcHJldmlldy5wYXJlbnRfaWQhXSxcbiAgICAgICAgICBdKVxuICAgICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5jaGFubmVsLnN0YXRlLm1lc3NhZ2VzXSk7XG4gICAgICBsZXQgbWVzc2FnZXMhOiBTdHJlYW1NZXNzYWdlPFQ+W107XG4gICAgICAoaXNUaHJlYWRSZXBseSA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXMkIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXMkKVxuICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKChtKSA9PiAobWVzc2FnZXMgPSBtKSk7XG4gICAgICBjb25zdCBuZXdNZXNzYWdlID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV0hO1xuICAgICAgcmV0dXJuIG5ld01lc3NhZ2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHN0cmluZ0Vycm9yID0gSlNPTi5zdHJpbmdpZnkoZXJyb3IpO1xuICAgICAgY29uc3QgcGFyc2VkRXJyb3I6IHsgc3RhdHVzPzogbnVtYmVyIH0gPSBzdHJpbmdFcnJvclxuICAgICAgICA/IChKU09OLnBhcnNlKHN0cmluZ0Vycm9yKSBhcyB7IHN0YXR1cz86IG51bWJlciB9KVxuICAgICAgICA6IHt9O1xuXG4gICAgICBjaGFubmVsLnN0YXRlLmFkZE1lc3NhZ2VTb3J0ZWQoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi4ocHJldmlldyBhcyBNZXNzYWdlUmVzcG9uc2U8VD4pLFxuICAgICAgICAgIGVycm9yU3RhdHVzQ29kZTogcGFyc2VkRXJyb3Iuc3RhdHVzIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICBzdGF0dXM6ICdmYWlsZWQnLFxuICAgICAgICB9LFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgaXNUaHJlYWRSZXBseVxuICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS50aHJlYWRzW3ByZXZpZXcucGFyZW50X2lkIV0sXG4gICAgICAgICAgXSlcbiAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlc10pO1xuICAgICAgbGV0IG1lc3NhZ2VzITogU3RyZWFtTWVzc2FnZTxUPltdO1xuICAgICAgKGlzVGhyZWFkUmVwbHkgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzJCA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJClcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgobSkgPT4gKG1lc3NhZ2VzID0gbSkpO1xuICAgICAgY29uc3QgbmV3TWVzc2FnZSA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdITtcbiAgICAgIHJldHVybiBuZXdNZXNzYWdlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBKdW1wcyB0byB0aGUgc2VsZWN0ZWQgbWVzc2FnZSBpbnNpZGUgdGhlIG1lc3NhZ2UgbGlzdCwgaWYgdGhlIG1lc3NhZ2UgaXMgbm90IHlldCBsb2FkZWQsIGl0J2xsIGxvYWQgdGhlIG1lc3NhZ2UgKGFuZCBpdCdzIHN1cnJvdW5kaW5ncykgZnJvbSB0aGUgQVBJLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBiZSBsb2FkZWQsICdsYXRlc3QnIG1lYW5zIGp1bXAgdG8gdGhlIGxhdGVzdCBtZXNzYWdlc1xuICAgKiBAcGFyYW0gcGFyZW50TWVzc2FnZUlkIFRoZSBJRCBvZiB0aGUgcGFyZW50IG1lc3NhZ2UgaWYgd2Ugd2FudCB0byBsb2FkIGEgdGhyZWFkIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIGp1bXBUb01lc3NhZ2UobWVzc2FnZUlkOiBzdHJpbmcsIHBhcmVudE1lc3NhZ2VJZD86IHN0cmluZykge1xuICAgIGNvbnN0IGFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFjdGl2ZUNoYW5uZWw/LnN0YXRlLmxvYWRNZXNzYWdlSW50b1N0YXRlKFxuICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgIHBhcmVudE1lc3NhZ2VJZFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VzID0gYWN0aXZlQ2hhbm5lbD8uc3RhdGUubWVzc2FnZXMgfHwgW107XG4gICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4ubWVzc2FnZXNdKTtcbiAgICAgIGlmIChwYXJlbnRNZXNzYWdlSWQpIHtcbiAgICAgICAgY29uc3QgcGFyZW50TWVzc2FnZSA9IG1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uaWQgPT09IHBhcmVudE1lc3NhZ2VJZCk7XG4gICAgICAgIHZvaWQgdGhpcy5zZXRBc0FjdGl2ZVBhcmVudE1lc3NhZ2UocGFyZW50TWVzc2FnZSwgJ3N0YXRlJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmp1bXBUb01lc3NhZ2VTdWJqZWN0Lm5leHQoe1xuICAgICAgICBpZDogbWVzc2FnZUlkLFxuICAgICAgICBwYXJlbnRJZDogcGFyZW50TWVzc2FnZUlkLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGRUZW1wb3JhcnlOb3RpZmljYXRpb24oJ01lc3NhZ2Ugbm90IGZvdW5kJyk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGlucyB0aGUgZ2l2ZW4gbWVzc2FnZSBpbiB0aGUgY2hhbm5lbFxuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgcGluTWVzc2FnZShtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+KSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ucGluTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGRUZW1wb3JhcnlOb3RpZmljYXRpb24oXG4gICAgICAgICdNZXNzYWdlIHBpbm5lZCcsXG4gICAgICAgICdzdWNjZXNzJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZFRlbXBvcmFyeU5vdGlmaWNhdGlvbihcbiAgICAgICAgJ0Vycm9yIHBpbm5pbmcgbWVzc2FnZSdcbiAgICAgICk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gbWVzc2FnZSBmcm9tIHBpbm5lZCBtZXNzYWdlc1xuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgdW5waW5NZXNzYWdlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz4pIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py51bnBpbk1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkVGVtcG9yYXJ5Tm90aWZpY2F0aW9uKFxuICAgICAgICAnTWVzc2FnZSB1bnBpbm5lZCcsXG4gICAgICAgICdzdWNjZXNzJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZFRlbXBvcmFyeU5vdGlmaWNhdGlvbihcbiAgICAgICAgJ0Vycm9yIHJlbW92aW5nIG1lc3NhZ2UgcGluJ1xuICAgICAgKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50OiBDbGllbnRFdmVudDxUPikge1xuICAgIHN3aXRjaCAoY2xpZW50RXZlbnQuZXZlbnRUeXBlKSB7XG4gICAgICBjYXNlICdjb25uZWN0aW9uLnJlY292ZXJlZCc6IHtcbiAgICAgICAgdm9pZCB0aGlzLm5nWm9uZS5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzU3RhdGVSZWNvdmVyeUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pc1N0YXRlUmVjb3ZlcnlJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5uZXh0UGFnZUNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBJZiBjaGFubmVsIGxpc3QgaXMgbm90IGluaXRlZCwgd2Ugc2V0IHRoZSBhY3RpdmUgY2hhbm5lbFxuICAgICAgICAgICAgY29uc3Qgc2hvdWxTZXRBY3RpdmVDaGFubmVsID1cbiAgICAgICAgICAgICAgdGhpcy5zaG91bGRTZXRBY3RpdmVDaGFubmVsICYmXG4gICAgICAgICAgICAgICF0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2hhbm5lbHMoc2hvdWxTZXRBY3RpdmVDaGFubmVsIHx8IGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgLy8gVGhyZWFkIG1lc3NhZ2VzIGFyZSBub3QgcmVmZXRjaGVkIHNvIGFjdGl2ZSB0aHJlYWQgZ2V0cyBkZXNlbGVjdGVkIHRvIGF2b2lkIGRpc3BsYXlpbmcgc3RhbGUgbWVzc2FnZXNcbiAgICAgICAgICAgICAgdm9pZCB0aGlzLnNldEFzQWN0aXZlUGFyZW50TWVzc2FnZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAvLyBVcGRhdGUgYW5kIHJlc2VsZWN0IG1lc3NhZ2UgdG8gcXVvdGVcbiAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVRvUXVvdGUgPSB0aGlzLm1lc3NhZ2VUb1F1b3RlU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICB0aGlzLnNldENoYW5uZWxTdGF0ZSh0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhKTtcbiAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VzITogU3RyZWFtTWVzc2FnZTxUPltdO1xuICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlcyRcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKG0pID0+IChtZXNzYWdlcyA9IG0pKTtcbiAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZE1lc3NhZ2VUb1F1b3RlID0gbWVzc2FnZXMuZmluZChcbiAgICAgICAgICAgICAgICAobSkgPT4gbS5pZCA9PT0gbWVzc2FnZVRvUXVvdGU/LmlkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmICh1cGRhdGVkTWVzc2FnZVRvUXVvdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdE1lc3NhZ2VUb1F1b3RlKHVwZGF0ZWRNZXNzYWdlVG9RdW90ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXNTdGF0ZVJlY292ZXJ5SW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgdGhpcy5pc1N0YXRlUmVjb3ZlcnlJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdub3RpZmljYXRpb24ubWVzc2FnZV9uZXcnOiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY3VzdG9tTmV3TWVzc2FnZU5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tTmV3TWVzc2FnZU5vdGlmaWNhdGlvbkhhbmRsZXIoXG4gICAgICAgICAgICAgIGNsaWVudEV2ZW50LFxuICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU5ld01lc3NhZ2VOb3RpZmljYXRpb24oY2xpZW50RXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbm90aWZpY2F0aW9uLmFkZGVkX3RvX2NoYW5uZWwnOiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY3VzdG9tQWRkZWRUb0NoYW5uZWxOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcihcbiAgICAgICAgICAgICAgY2xpZW50RXZlbnQsXG4gICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQWRkZWRUb0NoYW5uZWxOb3RpZmljYXRpb24oY2xpZW50RXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbm90aWZpY2F0aW9uLnJlbW92ZWRfZnJvbV9jaGFubmVsJzoge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmN1c3RvbVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tUmVtb3ZlZEZyb21DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcihcbiAgICAgICAgICAgICAgY2xpZW50RXZlbnQsXG4gICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUmVtb3ZlZEZyb21DaGFubmVsTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VzZXIudXBkYXRlZCc6IHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkQ2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzU3ViamVjdC5nZXRWYWx1ZSgpPy5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQuYWN0aXZlQ2hhbm5lbHNbYy5jaWRdKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQuYWN0aXZlQ2hhbm5lbHNbYy5jaWRdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dCh1cGRhdGVkQ2hhbm5lbHMpO1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgICAgaWYgKGFjdGl2ZUNoYW5uZWwpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dChcbiAgICAgICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LmFjdGl2ZUNoYW5uZWxzW1xuICAgICAgICAgICAgICAgIGFjdGl2ZUNoYW5uZWwuY2lkXG4gICAgICAgICAgICAgIF0gfHwgYWN0aXZlQ2hhbm5lbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFxuICAgICAgICAgICAgICBhY3RpdmVDaGFubmVsLnN0YXRlLm1lc3NhZ2VzLm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgICAgIG0ucmVhZEJ5ID0gZ2V0UmVhZEJ5KG0sIGFjdGl2ZUNoYW5uZWwpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLm0gfTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBhY3RpdmVQYXJlbnRNZXNzYWdlID1cbiAgICAgICAgICAgICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICBpZiAoYWN0aXZlUGFyZW50TWVzc2FnZSkge1xuICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGFjdGl2ZUNoYW5uZWwuc3RhdGUudGhyZWFkc1thY3RpdmVQYXJlbnRNZXNzYWdlXTtcbiAgICAgICAgICAgICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbLi4ubWVzc2FnZXNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFBpbm5lZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAgICAgLi4uYWN0aXZlQ2hhbm5lbC5zdGF0ZS5waW5uZWRNZXNzYWdlcyxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUmVtb3ZlZEZyb21DaGFubmVsTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50OiBDbGllbnRFdmVudDxUPikge1xuICAgIGNvbnN0IGNoYW5uZWxJZFRvQmVSZW1vdmVkID0gY2xpZW50RXZlbnQuZXZlbnQuY2hhbm5lbCEuY2lkO1xuICAgIHRoaXMucmVtb3ZlQ2hhbm5lbHNGcm9tQ2hhbm5lbExpc3QoW2NoYW5uZWxJZFRvQmVSZW1vdmVkXSwgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU5ld01lc3NhZ2VOb3RpZmljYXRpb24oY2xpZW50RXZlbnQ6IENsaWVudEV2ZW50PFQ+KSB7XG4gICAgaWYgKGNsaWVudEV2ZW50LmV2ZW50LmNoYW5uZWwpIHtcbiAgICAgIHZvaWQgdGhpcy5hZGRDaGFubmVsc0Zyb21Ob3RpZmljYXRpb24oW2NsaWVudEV2ZW50LmV2ZW50LmNoYW5uZWxdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50OiBDbGllbnRFdmVudDxUPikge1xuICAgIGlmIChjbGllbnRFdmVudC5ldmVudC5jaGFubmVsKSB7XG4gICAgICB2b2lkIHRoaXMuYWRkQ2hhbm5lbHNGcm9tTm90aWZpY2F0aW9uKFtjbGllbnRFdmVudC5ldmVudC5jaGFubmVsXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRDaGFubmVsc0Zyb21Ob3RpZmljYXRpb24oXG4gICAgY2hhbm5lbFJlc3BvbnNlczogQ2hhbm5lbFJlc3BvbnNlPFQ+W11cbiAgKSB7XG4gICAgbGV0IG5ld0NoYW5uZWxzOiBDaGFubmVsPFQ+W10gPSBbXTtcbiAgICBjb25zdCB3YXRjaFJlcXVlc3RzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuICAgIGNoYW5uZWxSZXNwb25zZXMuZm9yRWFjaCgoY2hhbm5lbFJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LmNoYW5uZWwoXG4gICAgICAgIGNoYW5uZWxSZXNwb25zZS50eXBlLFxuICAgICAgICBjaGFubmVsUmVzcG9uc2UuaWRcbiAgICAgICk7XG4gICAgICB3YXRjaFJlcXVlc3RzLnB1c2goY2hhbm5lbC53YXRjaCgpKTtcbiAgICAgIG5ld0NoYW5uZWxzLnB1c2goY2hhbm5lbCk7XG4gICAgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwod2F0Y2hSZXF1ZXN0cyk7XG4gICAgY29uc3QgY3VycmVudENoYW5uZWxzID0gdGhpcy5jaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKSB8fCBbXTtcbiAgICBuZXdDaGFubmVscyA9IG5ld0NoYW5uZWxzLmZpbHRlcihcbiAgICAgIChuZXdDaGFubmVsKSA9PiAhY3VycmVudENoYW5uZWxzLmZpbmQoKGMpID0+IGMuY2lkID09PSBuZXdDaGFubmVsLmNpZClcbiAgICApO1xuICAgIGlmIChuZXdDaGFubmVscy5sZW5ndGggPiAwKSB7XG4gICAgICBuZXdDaGFubmVscy5mb3JFYWNoKChjKSA9PiB0aGlzLndhdGNoRm9yQ2hhbm5lbEV2ZW50cyhjKSk7XG4gICAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5uZXh0KFsuLi5uZXdDaGFubmVscywgLi4uY3VycmVudENoYW5uZWxzXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVDaGFubmVsc0Zyb21DaGFubmVsTGlzdChcbiAgICBjaWRzOiBzdHJpbmdbXSxcbiAgICBzaG91bGRTdG9wV2F0Y2hpbmc6IGJvb2xlYW5cbiAgKSB7XG4gICAgY29uc3QgY2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzLmZpbHRlcigoYykgPT4gIWNpZHMuaW5jbHVkZXMoYy5jaWQgfHwgJycpKTtcbiAgICBpZiAoc2hvdWxkU3RvcFdhdGNoaW5nKSB7XG4gICAgICBjaWRzLmZvckVhY2goKGNpZCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGFubmVsU3Vic2NyaXB0aW9uc1tjaWRdKSB7XG4gICAgICAgICAgdGhpcy5jaGFubmVsU3Vic2NyaXB0aW9uc1tjaWRdKCk7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuY2hhbm5lbFN1YnNjcmlwdGlvbnMuY2lkO1xuICAgICAgICB9XG4gICAgICAgIHZvaWQgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LmFjdGl2ZUNoYW5uZWxzW1xuICAgICAgICAgIGNpZFxuICAgICAgICBdPy5zdG9wV2F0Y2hpbmcoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoY2hhbm5lbHMubGVuZ3RoIDwgdGhpcy5jaGFubmVscy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoY2hhbm5lbHMpO1xuICAgICAgaWYgKGNpZHMuaW5jbHVkZXModGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpPy5jaWQgfHwgJycpKSB7XG4gICAgICAgIGlmIChjaGFubmVscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5zZXRBc0FjdGl2ZUNoYW5uZWwoY2hhbm5lbHNbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaEZvckFjdGl2ZUNoYW5uZWxFdmVudHMoY2hhbm5lbDogQ2hhbm5lbDxUPikge1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ21lc3NhZ2UubmV3JywgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgZXZlbnQubWVzc2FnZSAmJiBldmVudC5tZXNzYWdlLnBhcmVudF9pZFxuICAgICAgICAgICAgPyBldmVudC5tZXNzYWdlLnBhcmVudF9pZCA9PT1cbiAgICAgICAgICAgICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0LmdldFZhbHVlKClcbiAgICAgICAgICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAgICAgICAgIC4uLmNoYW5uZWwuc3RhdGUudGhyZWFkc1tldmVudC5tZXNzYWdlLnBhcmVudF9pZF0sXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAgICAgICAuLi5jaGFubmVsLnN0YXRlLm1lc3NhZ2VzLFxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWwkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKChjKSA9PiB7XG4gICAgICAgICAgICBpZiAoYykge1xuICAgICAgICAgICAgICB0aGlzLm1hcmtSZWFkKGMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMudXBkYXRlTGF0ZXN0TWVzc2FnZXMoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCdtZXNzYWdlLnVwZGF0ZWQnLCAoZXZlbnQpID0+IHRoaXMubWVzc2FnZVVwZGF0ZWQoZXZlbnQpKVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgY2hhbm5lbC5vbignbWVzc2FnZS5kZWxldGVkJywgKGV2ZW50KSA9PiB0aGlzLm1lc3NhZ2VVcGRhdGVkKGV2ZW50KSlcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ3JlYWN0aW9uLm5ldycsIChlKSA9PiB0aGlzLm1lc3NhZ2VSZWFjdGlvbkV2ZW50UmVjZWl2ZWQoZSkpXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCdyZWFjdGlvbi5kZWxldGVkJywgKGUpID0+XG4gICAgICAgIHRoaXMubWVzc2FnZVJlYWN0aW9uRXZlbnRSZWNlaXZlZChlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgY2hhbm5lbC5vbigncmVhY3Rpb24udXBkYXRlZCcsIChlKSA9PlxuICAgICAgICB0aGlzLm1lc3NhZ2VSZWFjdGlvbkV2ZW50UmVjZWl2ZWQoZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ21lc3NhZ2UucmVhZCcsIChlKSA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgbGV0IGxhdGVzdE1lc3NhZ2UhOiBTdHJlYW1NZXNzYWdlO1xuICAgICAgICAgIGxldCBtZXNzYWdlcyE6IFN0cmVhbU1lc3NhZ2VbXTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlcyQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKG0pID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2VzID0gbTtcbiAgICAgICAgICAgIGxhdGVzdE1lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIWxhdGVzdE1lc3NhZ2UgfHwgIWUudXNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobGF0ZXN0TWVzc2FnZS5yZWFkQnkpIHtcbiAgICAgICAgICAgIGxhdGVzdE1lc3NhZ2UucmVhZEJ5LnNwbGljZSgwLCBsYXRlc3RNZXNzYWdlLnJlYWRCeS5sZW5ndGgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYXRlc3RNZXNzYWdlLnJlYWRCeSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsYXRlc3RNZXNzYWdlLnJlYWRCeS5wdXNoKC4uLmdldFJlYWRCeShsYXRlc3RNZXNzYWdlLCBjaGFubmVsKSk7XG4gICAgICAgICAgbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV0gPSB7IC4uLmxhdGVzdE1lc3NhZ2UgfTtcblxuICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5tZXNzYWdlc10pO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCd0eXBpbmcuc3RhcnQnLCAoZSkgPT5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuaGFuZGxlVHlwaW5nU3RhcnRFdmVudChlKSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ3R5cGluZy5zdG9wJywgKGUpID0+XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLmhhbmRsZVR5cGluZ1N0b3BFdmVudChlKSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgaWYgdXNlciBzdGFydGVkIHR5cGluZyBpbiB0aGUgYWN0aXZlIGNoYW5uZWxcbiAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lc3NhZ2UsIGlmIHVzZXIgaXMgdHlwaW5nIGluIGEgdGhyZWFkXG4gICAqL1xuICBhc3luYyB0eXBpbmdTdGFydGVkKHBhcmVudElkPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBhd2FpdCBhY3RpdmVDaGFubmVsPy5rZXlzdHJva2UocGFyZW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgaWYgdXNlciBzdG9wcGVkIHR5cGluZyBpbiB0aGUgYWN0aXZlIGNoYW5uZWxcbiAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lc3NhZ2UsIGlmIHVzZXIgd2VyZSB0eXBpbmcgaW4gYSB0aHJlYWRcbiAgICovXG4gIGFzeW5jIHR5cGluZ1N0b3BwZWQocGFyZW50SWQ/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGF3YWl0IGFjdGl2ZUNoYW5uZWw/LnN0b3BUeXBpbmcocGFyZW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGxpc3Qgb2YgY2hhbm5lbHNcbiAgICovXG4gIGdldCBjaGFubmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5jaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBhY3RpdmUgY2hhbm5lbFxuICAgKi9cbiAgZ2V0IGFjdGl2ZUNoYW5uZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgYWN0aXZlIGNoYW5uZWwgbWVzc2FnZXNcbiAgICovXG4gIGdldCBhY3RpdmVDaGFubmVsTWVzc2FnZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5nZXRWYWx1ZSgpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGFzdCAxMjAwIHJlYWN0aW9ucyBvZiBhIG1lc3NhZ2UgaW4gdGhlIGN1cnJlbnQgYWN0aXZlIGNoYW5uZWwuIElmIHlvdSBuZWVkIHRvIGZldGNoIG1vcmUgcmVhY3Rpb25zIHBsZWFzZSB1c2UgdGhlIFtmb2xsb3dpbmcgZW5kcG9pbnRdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3NlbmRfcmVhY3Rpb24vP2xhbmd1YWdlPWphdmFzY3JpcHQjcGFnaW5hdGluZy1yZWFjdGlvbnMpLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkXG4gICAqIEByZXR1cm5zIGFsbCByZWFjdGlvbnMgb2YgYSBtZXNzYWdlXG4gICAqL1xuICBhc3luYyBnZXRNZXNzYWdlUmVhY3Rpb25zKG1lc3NhZ2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVhY3Rpb25zOiBSZWFjdGlvblJlc3BvbnNlPFQ+W10gPSBbXTtcbiAgICBjb25zdCBsaW1pdCA9IDMwMDtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBjb25zdCByZWFjdGlvbnNMaW1pdCA9IENoYW5uZWxTZXJ2aWNlLk1BWF9NRVNTQUdFX1JFQUNUSU9OU19UT19GRVRDSDtcbiAgICBsZXQgbGFzdFBhZ2VTaXplID0gbGltaXQ7XG5cbiAgICB3aGlsZSAobGFzdFBhZ2VTaXplID09PSBsaW1pdCAmJiByZWFjdGlvbnMubGVuZ3RoIDwgcmVhY3Rpb25zTGltaXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hY3RpdmVDaGFubmVsPy5nZXRSZWFjdGlvbnMobWVzc2FnZUlkLCB7XG4gICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgIGxpbWl0LFxuICAgICAgICB9KTtcbiAgICAgICAgbGFzdFBhZ2VTaXplID0gcmVzcG9uc2U/LnJlYWN0aW9ucz8ubGVuZ3RoIHx8IDA7XG4gICAgICAgIGlmIChsYXN0UGFnZVNpemUgPiAwKSB7XG4gICAgICAgICAgcmVhY3Rpb25zLnB1c2goLi4ucmVzcG9uc2UhLnJlYWN0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0ICs9IGxhc3RQYWdlU2l6ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZFRlbXBvcmFyeU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAnRXJyb3IgbG9hZGluZyByZWFjdGlvbnMnXG4gICAgICAgICk7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZWFjdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIG1lc3NhZ2VVcGRhdGVkKGV2ZW50OiBFdmVudDxUPikge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICBjb25zdCBpc1RocmVhZFJlcGx5ID0gZXZlbnQubWVzc2FnZSAmJiBldmVudC5tZXNzYWdlLnBhcmVudF9pZDtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICBpZiAoIWNoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gR2V0IG1lc3NhZ2VzIGZyb20gc3RhdGUgYXMgbWVzc2FnZSBvcmRlciBjb3VsZCBjaGFuZ2UsIGFuZCBtZXNzYWdlIGNvdWxkJ3ZlIGJlZW4gZGVsZXRlZFxuICAgICAgY29uc3QgbWVzc2FnZXM6IEZvcm1hdE1lc3NhZ2VSZXNwb25zZTxUPltdID0gaXNUaHJlYWRSZXBseVxuICAgICAgICA/IGNoYW5uZWwuc3RhdGUudGhyZWFkc1tldmVudD8ubWVzc2FnZT8ucGFyZW50X2lkIHx8ICcnXVxuICAgICAgICA6IGNoYW5uZWwuc3RhdGUubWVzc2FnZXM7XG4gICAgICBpZiAoIW1lc3NhZ2VzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1lc3NhZ2VJbmRleCA9IG1lc3NhZ2VzLmZpbmRJbmRleChcbiAgICAgICAgKG0pID0+IG0uaWQgPT09IGV2ZW50Py5tZXNzYWdlPy5pZFxuICAgICAgKTtcbiAgICAgIGlmIChtZXNzYWdlSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGlzVGhyZWFkUmVwbHlcbiAgICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLm1lc3NhZ2VzXSlcbiAgICAgICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5tZXNzYWdlc10pO1xuICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxQaW5uZWRNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS5waW5uZWRNZXNzYWdlcyxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1lc3NhZ2VSZWFjdGlvbkV2ZW50UmVjZWl2ZWQoZTogRXZlbnQ8VD4pIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgY29uc3QgaXNUaHJlYWRNZXNzYWdlID0gZS5tZXNzYWdlICYmIGUubWVzc2FnZS5wYXJlbnRfaWQ7XG4gICAgICBsZXQgbWVzc2FnZXMhOiBTdHJlYW1NZXNzYWdlW107XG4gICAgICAoaXNUaHJlYWRNZXNzYWdlXG4gICAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlcyRcbiAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlcyRcbiAgICAgIClcbiAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgLnN1YnNjcmliZSgobSkgPT4gKG1lc3NhZ2VzID0gbSkpO1xuICAgICAgY29uc3QgbWVzc2FnZUluZGV4ID0gbWVzc2FnZXMuZmluZEluZGV4KChtKSA9PiBtLmlkID09PSBlPy5tZXNzYWdlPy5pZCk7XG4gICAgICBpZiAobWVzc2FnZUluZGV4ID09PSAtMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbbWVzc2FnZUluZGV4XTtcbiAgICAgIG1lc3NhZ2UucmVhY3Rpb25fY291bnRzID0geyAuLi5lLm1lc3NhZ2U/LnJlYWN0aW9uX2NvdW50cyB9O1xuICAgICAgbWVzc2FnZS5yZWFjdGlvbl9zY29yZXMgPSB7IC4uLmUubWVzc2FnZT8ucmVhY3Rpb25fc2NvcmVzIH07XG4gICAgICBtZXNzYWdlLmxhdGVzdF9yZWFjdGlvbnMgPSBbLi4uKGUubWVzc2FnZT8ubGF0ZXN0X3JlYWN0aW9ucyB8fCBbXSldO1xuICAgICAgbWVzc2FnZS5vd25fcmVhY3Rpb25zID0gWy4uLihlLm1lc3NhZ2U/Lm93bl9yZWFjdGlvbnMgfHwgW10pXTtcblxuICAgICAgbWVzc2FnZXNbbWVzc2FnZUluZGV4XSA9IHsgLi4ubWVzc2FnZSB9O1xuICAgICAgaXNUaHJlYWRNZXNzYWdlXG4gICAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbLi4ubWVzc2FnZXNdKVxuICAgICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5tZXNzYWdlc10pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRNZXNzYWdlKG1lc3NhZ2U6IE1lc3NhZ2VSZXNwb25zZTxUPikge1xuICAgIGNvbnN0IG0gPSBtZXNzYWdlIGFzIGFueSBhcyBGb3JtYXRNZXNzYWdlUmVzcG9uc2U8VD47XG4gICAgbS5waW5uZWRfYXQgPSBtZXNzYWdlLnBpbm5lZF9hdCA/IG5ldyBEYXRlKG1lc3NhZ2UucGlubmVkX2F0KSA6IG51bGw7XG4gICAgbS5jcmVhdGVkX2F0ID0gbWVzc2FnZS5jcmVhdGVkX2F0XG4gICAgICA/IG5ldyBEYXRlKG1lc3NhZ2UuY3JlYXRlZF9hdClcbiAgICAgIDogbmV3IERhdGUoKTtcbiAgICBtLnVwZGF0ZWRfYXQgPSBtZXNzYWdlLnVwZGF0ZWRfYXRcbiAgICAgID8gbmV3IERhdGUobWVzc2FnZS51cGRhdGVkX2F0KVxuICAgICAgOiBuZXcgRGF0ZSgpO1xuICAgIG1lc3NhZ2Uuc3RhdHVzID0gbWVzc2FnZS5zdGF0dXMgfHwgJ3JlY2VpdmVkJztcblxuICAgIHJldHVybiBtO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1N0cmVhbU1lc3NhZ2UoXG4gICAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IEZvcm1hdE1lc3NhZ2VSZXNwb25zZSB8IE1lc3NhZ2VSZXNwb25zZVxuICApOiBtZXNzYWdlIGlzIFN0cmVhbU1lc3NhZ2Uge1xuICAgIHJldHVybiAhIW1lc3NhZ2UucmVhZEJ5O1xuICB9XG5cbiAgcHJpdmF0ZSBpc0Zvcm1hdE1lc3NhZ2VSZXNwb25zZShcbiAgICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgRm9ybWF0TWVzc2FnZVJlc3BvbnNlIHwgTWVzc2FnZVJlc3BvbnNlXG4gICk6IG1lc3NhZ2UgaXMgRm9ybWF0TWVzc2FnZVJlc3BvbnNlIHtcbiAgICByZXR1cm4gbWVzc2FnZS5jcmVhdGVkX2F0IGluc3RhbmNlb2YgRGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcFdhdGNoRm9yQWN0aXZlQ2hhbm5lbEV2ZW50cyhjaGFubmVsOiBDaGFubmVsPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFjaGFubmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMuZm9yRWFjaCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zID0gW107XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHF1ZXJ5Q2hhbm5lbHMoXG4gICAgc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbDogYm9vbGVhbixcbiAgICByZWNvdmVyU3RhdGUgPSBmYWxzZVxuICApIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5jaGFubmVsUXVlcnlTdGF0ZVN1YmplY3QubmV4dCh7IHN0YXRlOiAnaW4tcHJvZ3Jlc3MnIH0pO1xuICAgICAgbGV0IGZpbHRlcnM6IENoYW5uZWxGaWx0ZXJzPFQ+O1xuICAgICAgbGV0IG9wdGlvbnM6IENoYW5uZWxPcHRpb25zO1xuICAgICAgaWYgKHRoaXMubmV4dFBhZ2VDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLm5leHRQYWdlQ29uZmlndXJhdGlvbi50eXBlID09PSAnZmlsdGVyJykge1xuICAgICAgICAgIGZpbHRlcnMgPSB7XG4gICAgICAgICAgICAuLi50aGlzLmZpbHRlcnMhLFxuICAgICAgICAgICAgLi4udGhpcy5uZXh0UGFnZUNvbmZpZ3VyYXRpb24ucGFnaW5hdGlvbkZpbHRlcixcbiAgICAgICAgICB9O1xuICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgYXMgQ2hhbm5lbE9wdGlvbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgIG9mZnNldDogdGhpcy5uZXh0UGFnZUNvbmZpZ3VyYXRpb24ub2Zmc2V0LFxuICAgICAgICAgIH07XG4gICAgICAgICAgZmlsdGVycyA9IHRoaXMuZmlsdGVycyE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbHRlcnMgPSB0aGlzLmZpbHRlcnMhO1xuICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zIGFzIENoYW5uZWxPcHRpb25zO1xuICAgICAgfVxuICAgICAgY29uc3QgY2hhbm5lbHMgPSBhd2FpdCB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQucXVlcnlDaGFubmVscyhcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgdGhpcy5zb3J0IHx8IHt9LFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgICAgdGhpcy5zZXROZXh0UGFnZUNvbmZpZ3VyYXRpb24oY2hhbm5lbHMpO1xuICAgICAgY2hhbm5lbHMuZm9yRWFjaCgoYykgPT4gdGhpcy53YXRjaEZvckNoYW5uZWxFdmVudHMoYykpO1xuICAgICAgY29uc3QgcHJldkNoYW5uZWxzID0gcmVjb3ZlclN0YXRlXG4gICAgICAgID8gW11cbiAgICAgICAgOiB0aGlzLmNoYW5uZWxzU3ViamVjdC5nZXRWYWx1ZSgpIHx8IFtdO1xuICAgICAgY29uc3QgZmlsdGVyZWRDaGFubmVscyA9IGNoYW5uZWxzLmZpbHRlcihcbiAgICAgICAgKGNoYW5uZWwpID0+XG4gICAgICAgICAgIXByZXZDaGFubmVscy5maW5kKFxuICAgICAgICAgICAgKGV4aXN0aW5nQ2hhbm5lbCkgPT4gZXhpc3RpbmdDaGFubmVsLmNpZCA9PT0gY2hhbm5lbC5jaWRcbiAgICAgICAgICApXG4gICAgICApO1xuICAgICAgbGV0IGN1cnJlbnRBY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgbGV0IGlzQ3VycmVudEFjdGl2ZUNoYW5uZWxEZXNlbGVjdGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBuZXh0Q2hhbm5lbHMgPSBbLi4ucHJldkNoYW5uZWxzLCAuLi5maWx0ZXJlZENoYW5uZWxzXTtcbiAgICAgIGlmIChcbiAgICAgICAgcmVjb3ZlclN0YXRlICYmXG4gICAgICAgIGN1cnJlbnRBY3RpdmVDaGFubmVsICYmXG4gICAgICAgICFmaWx0ZXJlZENoYW5uZWxzLmZpbmQoKGMpID0+IGMuY2lkID09PSBjdXJyZW50QWN0aXZlQ2hhbm5lbD8uY2lkKVxuICAgICAgKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY3VycmVudEFjdGl2ZUNoYW5uZWwud2F0Y2goKTtcbiAgICAgICAgICBuZXh0Q2hhbm5lbHMudW5zaGlmdChjdXJyZW50QWN0aXZlQ2hhbm5lbCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpc0N1cnJlbnRBY3RpdmVDaGFubmVsRGVzZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQobmV4dENoYW5uZWxzKTtcbiAgICAgIGlmIChpc0N1cnJlbnRBY3RpdmVDaGFubmVsRGVzZWxlY3RlZCkge1xuICAgICAgICB0aGlzLmRlc2VsZWN0QWN0aXZlQ2hhbm5lbCgpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBmaWx0ZXJlZENoYW5uZWxzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgIWN1cnJlbnRBY3RpdmVDaGFubmVsICYmXG4gICAgICAgIHNob3VsZFNldEFjdGl2ZUNoYW5uZWxcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNldEFzQWN0aXZlQ2hhbm5lbChmaWx0ZXJlZENoYW5uZWxzWzBdKTtcbiAgICAgICAgY3VycmVudEFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmhhc01vcmVDaGFubmVsc1N1YmplY3QubmV4dChjaGFubmVscy5sZW5ndGggPj0gdGhpcy5vcHRpb25zIS5saW1pdCEpO1xuICAgICAgdGhpcy5jaGFubmVsUXVlcnlTdGF0ZVN1YmplY3QubmV4dCh7IHN0YXRlOiAnc3VjY2VzcycgfSk7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMub3B0aW9ucz8ua2VlcEFsaXZlQ2hhbm5lbHMkT25FcnJvciAmJlxuICAgICAgICB0aGlzLmRpc21pc3NFcnJvck5vdGlmaWNhdGlvblxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZGlzbWlzc0Vycm9yTm90aWZpY2F0aW9uKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hhbm5lbHM7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zPy5rZWVwQWxpdmVDaGFubmVscyRPbkVycm9yKSB7XG4gICAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0LmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hhbm5lbFF1ZXJ5U3RhdGVTdWJqZWN0Lm5leHQoe1xuICAgICAgICBzdGF0ZTogJ2Vycm9yJyxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudFxuICAgICAgICBlcnJvcixcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaEZvckNoYW5uZWxFdmVudHMoY2hhbm5lbDogQ2hhbm5lbDxUPikge1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gY2hhbm5lbC5vbigoZXZlbnQ6IEV2ZW50PFQ+KSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICBjb25zdCB0eXBlID0gZXZlbnQudHlwZSBhcyBFdmVudFR5cGVzIHwgJ2NhcGFiaWxpdGllcy5jaGFuZ2VkJztcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdtZXNzYWdlLm5ldyc6IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VzdG9tTmV3TWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21OZXdNZXNzYWdlSGFuZGxlcihcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlU2V0dGVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZU5ld01lc3NhZ2UoZXZlbnQsIGNoYW5uZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NoYW5uZWwuaGlkZGVuJzoge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21DaGFubmVsSGlkZGVuSGFuZGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNoYW5uZWxIaWRkZW5IYW5kbGVyKFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMudGhyZWFkTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2VTZXR0ZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbm5lbEhpZGRlbihldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY2hhbm5lbC5kZWxldGVkJzoge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21DaGFubmVsRGVsZXRlZEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21DaGFubmVsRGVsZXRlZEhhbmRsZXIoXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUxpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy50aHJlYWRMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZVNldHRlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGFubmVsRGVsZXRlZChldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY2hhbm5lbC52aXNpYmxlJzoge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21DaGFubmVsVmlzaWJsZUhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21DaGFubmVsVmlzaWJsZUhhbmRsZXIoXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUxpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy50aHJlYWRMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZVNldHRlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGFubmVsVmlzaWJsZShldmVudCwgY2hhbm5lbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY2hhbm5lbC51cGRhdGVkJzoge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21DaGFubmVsVXBkYXRlZEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21DaGFubmVsVXBkYXRlZEhhbmRsZXIoXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUxpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy50aHJlYWRMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZVNldHRlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGFubmVsVXBkYXRlKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGFubmVsLnRydW5jYXRlZCc6IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VzdG9tQ2hhbm5lbFRydW5jYXRlZEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21DaGFubmVsVHJ1bmNhdGVkSGFuZGxlcihcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlU2V0dGVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5uZWxUcnVuY2F0ZShldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY2FwYWJpbGl0aWVzLmNoYW5nZWQnOiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNpZCA9IGV2ZW50LmNpZDtcbiAgICAgICAgICAgIGlmIChjaWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudENoYW5uZWxzID0gdGhpcy5jaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjdXJyZW50Q2hhbm5lbHM/LmZpbmRJbmRleCgoYykgPT4gYy5jaWQgPT09IGNpZCk7XG4gICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEgJiYgaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoWy4uLmN1cnJlbnRDaGFubmVscyFdKTtcbiAgICAgICAgICAgICAgICBpZiAoY2lkID09PSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk/LmNpZCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5uZXh0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKClcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNoYW5uZWxTdWJzY3JpcHRpb25zW2NoYW5uZWwuY2lkXSA9IHVuc3Vic2NyaWJlLnVuc3Vic2NyaWJlO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVOZXdNZXNzYWdlKF86IEV2ZW50LCBjaGFubmVsOiBDaGFubmVsPFQ+KSB7XG4gICAgY29uc3QgY2hhbm5lbEluZGV4ID0gdGhpcy5jaGFubmVscy5maW5kSW5kZXgoKGMpID0+IGMuY2lkID09PSBjaGFubmVsLmNpZCk7XG4gICAgdGhpcy5jaGFubmVscy5zcGxpY2UoY2hhbm5lbEluZGV4LCAxKTtcbiAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5uZXh0KFtjaGFubmVsLCAuLi50aGlzLmNoYW5uZWxzXSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNoYW5uZWxIaWRkZW4oZXZlbnQ6IEV2ZW50KSB7XG4gICAgdGhpcy5yZW1vdmVDaGFubmVsc0Zyb21DaGFubmVsTGlzdChbZXZlbnQuY2hhbm5lbCEuY2lkXSwgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDaGFubmVsRGVsZXRlZChldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLnJlbW92ZUNoYW5uZWxzRnJvbUNoYW5uZWxMaXN0KFtldmVudC5jaGFubmVsIS5jaWRdLCBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNoYW5uZWxWaXNpYmxlKGV2ZW50OiBFdmVudCwgY2hhbm5lbDogQ2hhbm5lbDxUPikge1xuICAgIGlmICghdGhpcy5jaGFubmVscy5maW5kKChjKSA9PiBjLmNpZCA9PT0gZXZlbnQuY2lkKSkge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+XG4gICAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMuY2hhbm5lbHMsIGNoYW5uZWxdKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNoYW5uZWxVcGRhdGUoZXZlbnQ6IEV2ZW50PFQ+KSB7XG4gICAgY29uc3QgY2hhbm5lbEluZGV4ID0gdGhpcy5jaGFubmVscy5maW5kSW5kZXgoXG4gICAgICAoYykgPT4gYy5jaWQgPT09IGV2ZW50LmNoYW5uZWwhLmNpZFxuICAgICk7XG4gICAgaWYgKGNoYW5uZWxJbmRleCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzW2NoYW5uZWxJbmRleF07XG4gICAgICBjb25zdCBub3RJbmNsdWRlZFByb3BlcmllcyA9IHtcbiAgICAgICAgaGlkZGVuOiBjaGFubmVsLmRhdGE/LmhpZGRlbiB8fCBmYWxzZSxcbiAgICAgICAgb3duX2NhcGFiaWxpdGllczogY2hhbm5lbC5kYXRhPy5vd25fY2FwYWJpbGl0aWVzIHx8IFtdLFxuICAgICAgfTtcbiAgICAgIGNoYW5uZWwuZGF0YSA9IHtcbiAgICAgICAgLi4uZXZlbnQuY2hhbm5lbCEsXG4gICAgICAgIC4uLm5vdEluY2x1ZGVkUHJvcGVyaWVzLFxuICAgICAgfTtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMuY2hhbm5lbHNdKTtcbiAgICAgIGlmIChldmVudC5jaGFubmVsPy5jaWQgPT09IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKT8uY2lkKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dChjaGFubmVsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNoYW5uZWxUcnVuY2F0ZShldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBjaGFubmVsSW5kZXggPSB0aGlzLmNoYW5uZWxzLmZpbmRJbmRleChcbiAgICAgIChjKSA9PiBjLmNpZCA9PT0gZXZlbnQuY2hhbm5lbCEuY2lkXG4gICAgKTtcbiAgICBpZiAoY2hhbm5lbEluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5jaGFubmVsc1tjaGFubmVsSW5kZXhdLnN0YXRlLm1lc3NhZ2VzID0gW107XG4gICAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5uZXh0KFsuLi50aGlzLmNoYW5uZWxzXSk7XG4gICAgICBpZiAoZXZlbnQuY2hhbm5lbD8uY2lkID09PSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk/LmNpZCkge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICAgICAgY2hhbm5lbC5zdGF0ZS5tZXNzYWdlcyA9IFtdO1xuICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0Lm5leHQoY2hhbm5lbCk7XG4gICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtdKTtcbiAgICAgICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY2FuU2VuZFJlYWRFdmVudHMoKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAoIWNoYW5uZWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY2FwYWJpbGl0ZXMgPSBjaGFubmVsLmRhdGE/Lm93bl9jYXBhYmlsaXRpZXMgYXMgc3RyaW5nW107XG4gICAgcmV0dXJuIGNhcGFiaWxpdGVzLmluZGV4T2YoJ3JlYWQtZXZlbnRzJykgIT09IC0xO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1Ub1N0cmVhbU1lc3NhZ2UoXG4gICAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPiB8IE1lc3NhZ2VSZXNwb25zZTxUPiB8IEZvcm1hdE1lc3NhZ2VSZXNwb25zZTxUPixcbiAgICBjaGFubmVsPzogQ2hhbm5lbDxUPlxuICApIHtcbiAgICBjb25zdCBpc1RocmVhZE1lc3NhZ2UgPSAhIW1lc3NhZ2UucGFyZW50X2lkO1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNTdHJlYW1NZXNzYWdlKG1lc3NhZ2UpICYmXG4gICAgICB0aGlzLmlzRm9ybWF0TWVzc2FnZVJlc3BvbnNlKG1lc3NhZ2UpXG4gICAgKSB7XG4gICAgICBpZiAobWVzc2FnZS5xdW90ZWRfbWVzc2FnZSkge1xuICAgICAgICBtZXNzYWdlLnF1b3RlZF9tZXNzYWdlLnRyYW5zbGF0aW9uID0gZ2V0TWVzc2FnZVRyYW5zbGF0aW9uKFxuICAgICAgICAgIG1lc3NhZ2UucXVvdGVkX21lc3NhZ2UsXG4gICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlclxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbWVzc2FnZS50cmFuc2xhdGlvbiA9IGdldE1lc3NhZ2VUcmFuc2xhdGlvbihcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXJcbiAgICAgICk7XG4gICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG1lc3NhZ2UucXVvdGVkX21lc3NhZ2UpIHtcbiAgICAgICAgbWVzc2FnZS5xdW90ZWRfbWVzc2FnZS50cmFuc2xhdGlvbiA9IGdldE1lc3NhZ2VUcmFuc2xhdGlvbihcbiAgICAgICAgICBtZXNzYWdlLnF1b3RlZF9tZXNzYWdlLFxuICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzRm9ybWF0TWVzc2FnZVJlc3BvbnNlKG1lc3NhZ2UpKSB7XG4gICAgICAgIG1lc3NhZ2UucmVhZEJ5ID0gaXNUaHJlYWRNZXNzYWdlXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogY2hhbm5lbFxuICAgICAgICAgID8gZ2V0UmVhZEJ5KG1lc3NhZ2UsIGNoYW5uZWwpXG4gICAgICAgICAgOiBbXTtcbiAgICAgICAgbWVzc2FnZS50cmFuc2xhdGlvbiA9IGdldE1lc3NhZ2VUcmFuc2xhdGlvbihcbiAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXJcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lc3NhZ2UgPSB0aGlzLmZvcm1hdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgIG1lc3NhZ2UucmVhZEJ5ID0gaXNUaHJlYWRNZXNzYWdlXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogY2hhbm5lbFxuICAgICAgICAgID8gZ2V0UmVhZEJ5KG1lc3NhZ2UsIGNoYW5uZWwpXG4gICAgICAgICAgOiBbXTtcbiAgICAgICAgbWVzc2FnZS50cmFuc2xhdGlvbiA9IGdldE1lc3NhZ2VUcmFuc2xhdGlvbihcbiAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXJcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUeXBpbmdTdGFydEV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGlmIChldmVudC51c2VyPy5pZCA9PT0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXI/LmlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlzVHlwaW5nSW5UaHJlYWQgPSAhIWV2ZW50LnBhcmVudF9pZDtcbiAgICBpZiAoXG4gICAgICBpc1R5cGluZ0luVGhyZWFkICYmXG4gICAgICBldmVudC5wYXJlbnRfaWQgIT09IHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5nZXRWYWx1ZSgpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN1YmplY3QgPSBpc1R5cGluZ0luVGhyZWFkXG4gICAgICA/IHRoaXMudXNlcnNUeXBpbmdJblRocmVhZFN1YmplY3RcbiAgICAgIDogdGhpcy51c2Vyc1R5cGluZ0luQ2hhbm5lbFN1YmplY3Q7XG4gICAgY29uc3QgdXNlcnM6IFVzZXJSZXNwb25zZVtdID0gc3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHVzZXIgPSBldmVudC51c2VyO1xuICAgIGlmICh1c2VyICYmICF1c2Vycy5maW5kKCh1KSA9PiB1LmlkID09PSB1c2VyLmlkKSkge1xuICAgICAgdXNlcnMucHVzaCh1c2VyKTtcbiAgICAgIHN1YmplY3QubmV4dChbLi4udXNlcnNdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVR5cGluZ1N0b3BFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCB1c2Vyc1R5cGluZ0luQ2hhbm5lbCA9IHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgY29uc3QgdXNlcnNUeXBpbmdJblRocmVhZCA9IHRoaXMudXNlcnNUeXBpbmdJblRocmVhZFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCB1c2VyID0gZXZlbnQudXNlcjtcbiAgICBpZiAodXNlciAmJiB1c2Vyc1R5cGluZ0luQ2hhbm5lbC5maW5kKCh1KSA9PiB1LmlkID09PSB1c2VyLmlkKSkge1xuICAgICAgdXNlcnNUeXBpbmdJbkNoYW5uZWwuc3BsaWNlKFxuICAgICAgICB1c2Vyc1R5cGluZ0luQ2hhbm5lbC5maW5kSW5kZXgoKHUpID0+IHUuaWQgPT09IHVzZXIuaWQpLFxuICAgICAgICAxXG4gICAgICApO1xuICAgICAgdGhpcy51c2Vyc1R5cGluZ0luQ2hhbm5lbFN1YmplY3QubmV4dChbLi4udXNlcnNUeXBpbmdJbkNoYW5uZWxdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHVzZXIgJiYgdXNlcnNUeXBpbmdJblRocmVhZC5maW5kKCh1KSA9PiB1LmlkID09PSB1c2VyLmlkKSkge1xuICAgICAgdXNlcnNUeXBpbmdJblRocmVhZC5zcGxpY2UoXG4gICAgICAgIHVzZXJzVHlwaW5nSW5UaHJlYWQuZmluZEluZGV4KCh1KSA9PiB1LmlkID09PSB1c2VyLmlkKSxcbiAgICAgICAgMVxuICAgICAgKTtcbiAgICAgIHRoaXMudXNlcnNUeXBpbmdJblRocmVhZFN1YmplY3QubmV4dChbLi4udXNlcnNUeXBpbmdJblRocmVhZF0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTGF0ZXN0TWVzc2FnZXMoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKFxuICAgICAgZXZlbnQubWVzc2FnZT8udXNlcj8uaWQgIT09IHRoaXMuY2hhdENsaWVudFNlcnZpY2U/LmNoYXRDbGllbnQudXNlcj8uaWRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGF0ZXN0TWVzc2FnZXMgPVxuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHNTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgaWYgKCFldmVudC5tZXNzYWdlPy5jcmVhdGVkX2F0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNoYW5uZWxJZCA9IGV2ZW50Py5tZXNzYWdlPy5jaWQ7XG4gICAgaWYgKCFjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZURhdGUgPSBuZXcgRGF0ZShldmVudC5tZXNzYWdlLmNyZWF0ZWRfYXQpO1xuICAgIGlmIChcbiAgICAgICFsYXRlc3RNZXNzYWdlc1tjaGFubmVsSWRdIHx8XG4gICAgICBsYXRlc3RNZXNzYWdlc1tjaGFubmVsSWRdPy5nZXRUaW1lKCkgPCBtZXNzYWdlRGF0ZS5nZXRUaW1lKClcbiAgICApIHtcbiAgICAgIGxhdGVzdE1lc3NhZ2VzW2NoYW5uZWxJZF0gPSBtZXNzYWdlRGF0ZTtcbiAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzU3ViamVjdC5uZXh0KHtcbiAgICAgICAgLi4ubGF0ZXN0TWVzc2FnZXMsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldENoYW5uZWxTdGF0ZShjaGFubmVsOiBDaGFubmVsPFQ+KSB7XG4gICAgY2hhbm5lbC5zdGF0ZS5tZXNzYWdlcy5mb3JFYWNoKChtKSA9PiB7XG4gICAgICBtLnJlYWRCeSA9IGdldFJlYWRCeShtLCBjaGFubmVsKTtcbiAgICAgIG0udHJhbnNsYXRpb24gPSBnZXRNZXNzYWdlVHJhbnNsYXRpb24oXG4gICAgICAgIG0sXG4gICAgICAgIGNoYW5uZWwsXG4gICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyXG4gICAgICApO1xuICAgICAgaWYgKG0ucXVvdGVkX21lc3NhZ2UpIHtcbiAgICAgICAgbS5xdW90ZWRfbWVzc2FnZS50cmFuc2xhdGlvbiA9IGdldE1lc3NhZ2VUcmFuc2xhdGlvbihcbiAgICAgICAgICBtLnF1b3RlZF9tZXNzYWdlLFxuICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm1hcmtSZWFkKGNoYW5uZWwpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5jaGFubmVsLnN0YXRlLm1lc3NhZ2VzXSk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsUGlubmVkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgLi4uY2hhbm5lbC5zdGF0ZS5waW5uZWRNZXNzYWdlcyxcbiAgICBdKTtcbiAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgIHRoaXMubWVzc2FnZVRvUXVvdGVTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdC5uZXh0KFtdKTtcbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWRTdWJqZWN0Lm5leHQoW10pO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrUmVhZChjaGFubmVsOiBDaGFubmVsPFQ+KSB7XG4gICAgaWYgKHRoaXMuY2FuU2VuZFJlYWRFdmVudHMgJiYgdGhpcy5zaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZCkge1xuICAgICAgdm9pZCBjaGFubmVsLm1hcmtSZWFkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXROZXh0UGFnZUNvbmZpZ3VyYXRpb24oY2hhbm5lbFF1ZXJ5UmVzdWx0OiBDaGFubmVsPFQ+W10pIHtcbiAgICBpZiAodGhpcy5jdXN0b21QYWdpbmF0b3IpIHtcbiAgICAgIHRoaXMubmV4dFBhZ2VDb25maWd1cmF0aW9uID0gdGhpcy5jdXN0b21QYWdpbmF0b3IoY2hhbm5lbFF1ZXJ5UmVzdWx0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uZXh0UGFnZUNvbmZpZ3VyYXRpb24gPSB7XG4gICAgICAgIHR5cGU6ICdvZmZzZXQnLFxuICAgICAgICBvZmZzZXQ6XG4gICAgICAgICAgKHRoaXMubmV4dFBhZ2VDb25maWd1cmF0aW9uPy50eXBlID09PSAnb2Zmc2V0J1xuICAgICAgICAgICAgPyB0aGlzLm5leHRQYWdlQ29uZmlndXJhdGlvbi5vZmZzZXRcbiAgICAgICAgICAgIDogMCkgKyBjaGFubmVsUXVlcnlSZXN1bHQubGVuZ3RoLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
1411
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL2NoYW5uZWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFFYixhQUFhLEdBRWQsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFtQi9ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXpELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7Ozs7QUFZdEM7O0dBRUc7QUFJSCxNQUFNLE9BQU8sY0FBYztJQXlWekIsWUFDVSxpQkFBdUMsRUFDdkMsTUFBYyxFQUNkLG1CQUF3QztRQUZ4QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQXNCO1FBQ3ZDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBdEYxQyxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUMzQyxTQUFTLENBQ1YsQ0FBQztRQUNNLHlCQUFvQixHQUFHLElBQUksZUFBZSxDQUNoRCxTQUFTLENBQ1YsQ0FBQztRQUNNLGlDQUE0QixHQUFHLElBQUksZUFBZSxDQUV4RCxFQUFFLENBQUMsQ0FBQztRQUNFLHVDQUFrQyxHQUFHLElBQUksZUFBZSxDQUU5RCxFQUFFLENBQUMsQ0FBQztRQUNFLDJCQUFzQixHQUFHLElBQUksYUFBYSxDQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELCtCQUEwQixHQUFrQyxFQUFFLENB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QUNyQyxDQUFDO1NBQ0g7SUFDSCxDQUFDOztBQWp0REQ7O0dBRUc7QUFDYSw2Q0FBOEIsR0FBRyxJQUFJLENBQUM7MkdBclEzQyxjQUFjOytHQUFkLGNBQWMsY0FGYixNQUFNOzJGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIE9ic2VydmFibGUsXG4gIFJlcGxheVN1YmplY3QsXG4gIFN1YnNjcmlwdGlvbixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaXJzdCwgbWFwLCBzaGFyZVJlcGxheSwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnQsXG4gIENoYW5uZWwsXG4gIENoYW5uZWxGaWx0ZXJzLFxuICBDaGFubmVsT3B0aW9ucyxcbiAgQ2hhbm5lbFJlc3BvbnNlLFxuICBDaGFubmVsU29ydCxcbiAgRXZlbnQsXG4gIEV2ZW50VHlwZXMsXG4gIEZvcm1hdE1lc3NhZ2VSZXNwb25zZSxcbiAgTWVzc2FnZSxcbiAgTWVzc2FnZVJlc3BvbnNlLFxuICBSZWFjdGlvblJlc3BvbnNlLFxuICBVcGRhdGVkTWVzc2FnZSxcbiAgVXNlckZpbHRlcnMsXG4gIFVzZXJSZXNwb25zZSxcbn0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgQ2hhdENsaWVudFNlcnZpY2UsIENsaWVudEV2ZW50IH0gZnJvbSAnLi9jaGF0LWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IGdldE1lc3NhZ2VUcmFuc2xhdGlvbiB9IGZyb20gJy4vZ2V0LW1lc3NhZ2UtdHJhbnNsYXRpb24nO1xuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZVByZXZpZXcgfSBmcm9tICcuL21lc3NhZ2UtcHJldmlldyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9ub3RpZmljYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBnZXRSZWFkQnkgfSBmcm9tICcuL3JlYWQtYnknO1xuaW1wb3J0IHtcbiAgQXR0YWNobWVudFVwbG9hZCxcbiAgQXR0YWNobWVudFVwbG9hZEVycm9yUmVhc29uLFxuICBDaGFubmVsUXVlcnlTdGF0ZSxcbiAgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyxcbiAgTWVzc2FnZUlucHV0LFxuICBNZXNzYWdlUmVhY3Rpb25UeXBlLFxuICBOZXh0UGFnZUNvbmZpZ3VyYXRpb24sXG4gIFN0cmVhbU1lc3NhZ2UsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFRoZSBgQ2hhbm5lbFNlcnZpY2VgIHByb3ZpZGVzIGRhdGEgYW5kIGludGVyYWN0aW9uIGZvciB0aGUgY2hhbm5lbCBsaXN0IGFuZCBtZXNzYWdlIGxpc3QuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFubmVsU2VydmljZTxcbiAgVCBleHRlbmRzIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzXG4+IHtcbiAgLyoqXG4gICAqIEVtaXRzIGBmYWxzZWAgaWYgdGhlcmUgYXJlIG5vIG1vcmUgcGFnZXMgb2YgY2hhbm5lbHMgdGhhdCBjYW4gYmUgbG9hZGVkLlxuICAgKi9cbiAgaGFzTW9yZUNoYW5uZWxzJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBjdXJyZW50bHkgbG9hZGVkIGFuZCBbd2F0Y2hlZF0oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvd2F0Y2hfY2hhbm5lbC8/bGFuZ3VhZ2U9amF2YXNjcmlwdCkgY2hhbm5lbCBsaXN0LlxuICAgKlxuICAgKiA6OjppbXBvcnRhbnRcbiAgICogSWYgeW91IHdhbnQgdG8gc3Vic2NyaWJlIHRvIGNoYW5uZWwgZXZlbnRzLCB5b3UgbmVlZCB0byBtYW51YWxseSByZWVudGVyIEFuZ3VsYXIncyBjaGFuZ2UgZGV0ZWN0aW9uIHpvbmUsIG91ciBbQ2hhbmdlIGRldGVjdGlvbiBndWlkZV0oLi4vY29uY2VwdHMvY2hhbmdlLWRldGVjdGlvbi5tZHgpIGV4cGxhaW5zIHRoaXMgaW4gZGV0YWlsLlxuICAgKiA6OjpcbiAgICpcbiAgICogIEFwYXJ0IGZyb20gcGFnaW5hdGlvbiwgdGhlIGNoYW5uZWwgbGlzdCBpcyBhbHNvIHVwZGF0ZWQgb24gdGhlIGZvbGxvd2luZyBldmVudHM6XG4gICAqXG4gICAqICB8IEV2ZW50IHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVmYXVsdCBiZWhhdmlvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ3VzdG9tIGhhbmRsZXIgdG8gb3ZlcnJpZGUgICAgICAgICAgICAgICAgICAgIHxcbiAgICogIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICAgKiAgfCBgY2hhbm5lbC5kZWxldGVkYCAgICAgICAgICAgICAgICAgICB8IFJlbW92ZSBjaGFubmVsIGZyb20gdGhlIGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBjdXN0b21DaGFubmVsRGVsZXRlZEhhbmRsZXJgICAgICAgICAgICAgICAgICB8XG4gICAqICB8IGBjaGFubmVsLmhpZGRlbmAgICAgICAgICAgICAgICAgICAgIHwgUmVtb3ZlIGNoYW5uZWwgZnJvbSB0aGUgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGN1c3RvbUNoYW5uZWxIaWRkZW5IYW5kbGVyYCAgICAgICAgICAgICAgICAgIHxcbiAgICogIHwgYGNoYW5uZWwudHJ1bmNhdGVkYCAgICAgICAgICAgICAgICAgfCBVcGRhdGVzIHRoZSBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgY3VzdG9tQ2hhbm5lbFRydW5jYXRlZEhhbmRsZXJgICAgICAgICAgICAgICAgfFxuICAgKiAgfCBgY2hhbm5lbC51cGRhdGVkYCAgICAgICAgICAgICAgICAgICB8IFVwZGF0ZXMgdGhlIGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBjdXN0b21DaGFubmVsVXBkYXRlZEhhbmRsZXJgICAgICAgICAgICAgICAgICB8XG4gICAqICB8IGBjaGFubmVsLnZpc2libGVgICAgICAgICAgICAgICAgICAgIHwgQWRkcyB0aGUgY2hhbm5lbCB0byB0aGUgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGN1c3RvbUNoYW5uZWxWaXNpYmxlSGFuZGxlcmAgICAgICAgICAgICAgICAgIHxcbiAgICogIHwgYG1lc3NhZ2UubmV3YCAgICAgICAgICAgICAgICAgICAgICAgfCBNb3ZlcyB0aGUgY2hhbm5lbCB0byB0b3Agb2YgdGhlIGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgY3VzdG9tTmV3TWVzc2FnZUhhbmRsZXJgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiAgfCBgbm90aWZpY2F0aW9uLmFkZGVkX3RvX2NoYW5uZWxgICAgICB8IEFkZHMgdGhlIG5ldyBjaGFubmVsIHRvIHRoZSB0b3Agb2YgdGhlIGxpc3QgYW5kIHN0YXJ0cyB3YXRjaGluZyBpdCB8IGBjdXN0b21BZGRlZFRvQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXJgICAgICB8XG4gICAqICB8IGBub3RpZmljYXRpb24ubWVzc2FnZV9uZXdgICAgICAgICAgIHwgQWRkcyB0aGUgbmV3IGNoYW5uZWwgdG8gdGhlIHRvcCBvZiB0aGUgbGlzdCBhbmQgc3RhcnRzIHdhdGNoaW5nIGl0IHwgYGN1c3RvbU5ld01lc3NhZ2VOb3RpZmljYXRpb25IYW5kbGVyYCAgICAgICAgIHxcbiAgICogIHwgYG5vdGlmaWNhdGlvbi5yZW1vdmVkX2Zyb21fY2hhbm5lbGAgfCBSZW1vdmVzIHRoZSBjaGFubmVsIGZyb20gdGhlIGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgY3VzdG9tUmVtb3ZlZEZyb21DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcmAgfFxuICAgKlxuICAgKiAgSXQncyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IGZpbHRlcnMgZG9uJ3QgYXBwbHkgdG8gdXBkYXRlcyB0byB0aGUgbGlzdCBmcm9tIGV2ZW50cy5cbiAgICpcbiAgICogIE91ciBwbGF0Zm9ybSBkb2N1bWVudGF0aW9uIGNvdmVycyB0aGUgdG9waWMgb2YgW2NoYW5uZWwgZXZlbnRzXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9ldmVudF9vYmplY3QvP2xhbmd1YWdlPWphdmFzY3JpcHQjZXZlbnRzKSBpbiBkZXB0aC5cbiAgICpcbiAgICogIEJ5IGRlZmF1bHQgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBjaGFubmVsIGxvYWQsIHRoZSBPYnNlcnZhYmxlIHdpbGwgZW1pdCBhbiBlcnJvciwgd2hpY2ggd2lsbCBjbG9zZSB0aGUgc3RyZWFtLiBVc2VycyB3aWxsIGhhdmUgdG8gcmVsb2FkIHRoZSBwYWdlIHRvIGJlIGFibGUgdG8gcmVpbml0aWFsaXplIHRoZSBgQ2hhbm5lbFNlcnZpY2VgLiBJZiB5b3UgZG9uJ3Qgd2FudCB0aGUgc3RyZWFtcyB0byBiZSBjbG9zZWQsIHlvdSBjYW4gcGFzcyBgb3B0aW9ucy5rZWVwQWxpdmVDaGFubmVscyRPbkVycm9yID0gdHJ1ZWAgdG8gdGhlIGBpbml0YCBtZXRob2QuIEluIHRoYXQgY2FzZSB0aGUgYGNoYW5uZWxRdWVyeVN0YXRlJGAgc3RyZWFtIHdpbGwgZW1pdCB0aGUgc3RhdHVzIG9mIHRoZSBsYXRlc3QgY2hhbm5lbCBsb2FkIHJlcXVlc3QuXG4gICAqL1xuICBjaGFubmVscyQ6IE9ic2VydmFibGU8Q2hhbm5lbDxUPltdIHwgdW5kZWZpbmVkPjtcbiAgLyoqXG4gICAqIFRoZSByZXN1bHQgb2YgdGhlIGxhdGVzdCBjaGFubmVsIHF1ZXJ5IHJlcXVlc3QuXG4gICAqL1xuICBjaGFubmVsUXVlcnlTdGF0ZSQ6IE9ic2VydmFibGU8Q2hhbm5lbFF1ZXJ5U3RhdGUgfCB1bmRlZmluZWQ+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2hhbm5lbC5cbiAgICpcbiAgICogOjo6aW1wb3J0YW50XG4gICAqIElmIHlvdSB3YW50IHRvIHN1YnNjcmliZSB0byBjaGFubmVsIGV2ZW50cywgeW91IG5lZWQgdG8gbWFudWFsbHkgcmVlbnRlciBBbmd1bGFyJ3MgY2hhbmdlIGRldGVjdGlvbiB6b25lLCBvdXIgW0NoYW5nZSBkZXRlY3Rpb24gZ3VpZGVdKC4uL2NvbmNlcHRzL2NoYW5nZS1kZXRlY3Rpb24ubWR4KSBleHBsYWlucyB0aGlzIGluIGRldGFpbC5cbiAgICogOjo6XG4gICAqXG4gICAqIFRoZSBhY3RpdmUgY2hhbm5lbCB3aWxsIGFsd2F5cyBiZSBtYXJrZWQgYXMgcmVhZCB3aGVuIGEgbmV3IG1lc3NhZ2UgaXMgcmVjZWl2ZWRcbiAgICovXG4gIGFjdGl2ZUNoYW5uZWwkOiBPYnNlcnZhYmxlPENoYW5uZWw8VD4gfCB1bmRlZmluZWQ+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGxpc3Qgb2YgY3VycmVudGx5IGxvYWRlZCBtZXNzYWdlcyBvZiB0aGUgYWN0aXZlIGNoYW5uZWwuXG4gICAqL1xuICBhY3RpdmVDaGFubmVsTWVzc2FnZXMkOiBPYnNlcnZhYmxlPFN0cmVhbU1lc3NhZ2U8VD5bXT47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgbGlzdCBvZiBwaW5uZWQgbWVzc2FnZXMgb2YgdGhlIGFjdGl2ZSBjaGFubmVsLlxuICAgKi9cbiAgYWN0aXZlQ2hhbm5lbFBpbm5lZE1lc3NhZ2VzJDogT2JzZXJ2YWJsZTxTdHJlYW1NZXNzYWdlPFQ+W10+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGlkIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFyZW50IG1lc3NhZ2UuIElmIG5vIG1lc3NhZ2UgaXMgc2VsZWN0ZWQsIGl0IGVtaXRzIHVuZGVmaW5lZC5cbiAgICovXG4gIGFjdGl2ZVBhcmVudE1lc3NhZ2VJZCQ6IE9ic2VydmFibGU8c3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBsaXN0IG9mIGN1cnJlbnRseSBsb2FkZWQgdGhyZWFkIHJlcGxpZXMgYmVsb25naW5nIHRvIHRoZSBzZWxlY3RlZCBwYXJlbnQgbWVzc2FnZS4gSWYgdGhlcmUgaXMgbm8gY3VycmVudGx5IGFjdGl2ZSB0aHJlYWQgaXQgZW1pdHMgYW4gZW1wdHkgYXJyYXkuXG4gICAqL1xuICBhY3RpdmVUaHJlYWRNZXNzYWdlcyQ6IE9ic2VydmFibGU8U3RyZWFtTWVzc2FnZTxUPltdPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFyZW50IG1lc3NhZ2UuIElmIG5vIG1lc3NhZ2UgaXMgc2VsZWN0ZWQsIGl0IGVtaXRzIHVuZGVmaW5lZC5cbiAgICovXG4gIGFjdGl2ZVBhcmVudE1lc3NhZ2UkOiBPYnNlcnZhYmxlPFN0cmVhbU1lc3NhZ2U8VD4gfCB1bmRlZmluZWQ+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtZXNzYWdlIHRvIHF1b3RlXG4gICAqL1xuICBtZXNzYWdlVG9RdW90ZSQ6IE9ic2VydmFibGU8U3RyZWFtTWVzc2FnZTxUPiB8IHVuZGVmaW5lZD47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgSUQgb2YgdGhlIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgbGlzdCBzaG91bGQganVtcCB0byAoY2FuIGJlIGEgY2hhbm5lbCBtZXNzYWdlIG9yIHRocmVhZCBtZXNzYWdlKVxuICAgKi9cbiAganVtcFRvTWVzc2FnZSQ6IE9ic2VydmFibGU8eyBpZD86IHN0cmluZzsgcGFyZW50SWQ/OiBzdHJpbmcgfT47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgbGlzdCBvZiB1c2VycyB0aGF0IGFyZSBjdXJyZW50bHkgdHlwaW5nIGluIHRoZSBjaGFubmVsIChjdXJyZW50IHVzZXIgaXMgbm90IGluY2x1ZGVkKVxuICAgKi9cbiAgdXNlcnNUeXBpbmdJbkNoYW5uZWwkOiBPYnNlcnZhYmxlPFVzZXJSZXNwb25zZTxUPltdPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBsaXN0IG9mIHVzZXJzIHRoYXQgYXJlIGN1cnJlbnRseSB0eXBpbmcgaW4gdGhlIGFjdGl2ZSB0aHJlYWQgKGN1cnJlbnQgdXNlciBpcyBub3QgaW5jbHVkZWQpXG4gICAqL1xuICB1c2Vyc1R5cGluZ0luVGhyZWFkJDogT2JzZXJ2YWJsZTxVc2VyUmVzcG9uc2U8VD5bXT47XG4gIC8qKlxuICAgKiBFbWl0cyBhIG1hcCB0aGF0IGNvbnRhaW5zIHRoZSBkYXRlIG9mIHRoZSBsYXRlc3QgbWVzc2FnZSBzZW50IGJ5IHRoZSBjdXJyZW50IHVzZXIgYnkgY2hhbm5lbHMgKHRoaXMgaXMgdXNlZCB0byBkZXRlY3QgaWYgc2xvdyBtb2RlIGNvdW50ZG93biBzaG91bGQgYmUgc3RhcnRlZClcbiAgICovXG4gIGxhdGVzdE1lc3NhZ2VEYXRlQnlVc2VyQnlDaGFubmVscyQ6IE9ic2VydmFibGU8eyBba2V5OiBzdHJpbmddOiBEYXRlIH0+O1xuICAvKipcbiAgICogVGhlIGxhc3QgcmVhZCBtZXNzYWdlIGlkIG9mIHRoZSBhY3RpdmUgY2hhbm5lbCwgaXQncyBvbmx5IHNldCBvbmNlLCB3aGVuIGEgbmV3IGFjdGl2ZSBjaGFubmVsIGlzIHNldC4gSXQncyB1c2VkIGJ5IHRoZSBtZXNzYWdlIGxpc3QgdG8ganVtcCB0byB0aGUgbGF0ZXN0IHJlYWQgbWVzc2FnZVxuICAgKi9cbiAgYWN0aXZlQ2hhbm5lbExhc3RSZWFkTWVzc2FnZUlkPzogc3RyaW5nO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCBpZiBhIG5ldyBtZXNzYWdlIHJlY2VpdmVkIGZyb20gYSBjaGFubmVsIHRoYXQgaXMgbm90IGJlaW5nIHdhdGNoZWQsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSguL0NoYW5uZWxTZXJ2aWNlLm1keC8jY2hhbm5lbHMpXG4gICAqL1xuICBjdXN0b21OZXdNZXNzYWdlTm90aWZpY2F0aW9uSGFuZGxlcj86IChcbiAgICBjbGllbnRFdmVudDogQ2xpZW50RXZlbnQsXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChcbiAgICAgIGNoYW5uZWxzOiAoQ2hhbm5lbDxUPiB8IENoYW5uZWxSZXNwb25zZTxUPilbXSxcbiAgICAgIHNob3VsZFN0b3BXYXRjaGluZ1JlbW92ZWRDaGFubmVscz86IGJvb2xlYW5cbiAgICApID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIHRoZSB1c2VyIGlzIGFkZGVkIHRvIGEgY2hhbm5lbCwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC4vQ2hhbm5lbFNlcnZpY2UubWR4LyNjaGFubmVscylcbiAgICovXG4gIGN1c3RvbUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcj86IChcbiAgICBjbGllbnRFdmVudDogQ2xpZW50RXZlbnQsXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChcbiAgICAgIGNoYW5uZWxzOiAoQ2hhbm5lbDxUPiB8IENoYW5uZWxSZXNwb25zZTxUPilbXSxcbiAgICAgIHNob3VsZFN0b3BXYXRjaGluZ1JlbW92ZWRDaGFubmVscz86IGJvb2xlYW5cbiAgICApID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIHRoZSB1c2VyIGlzIHJlbW92ZWQgZnJvbSBhIGNoYW5uZWwsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSguL0NoYW5uZWxTZXJ2aWNlLm1keC8jY2hhbm5lbHMpXG4gICAqL1xuICBjdXN0b21SZW1vdmVkRnJvbUNoYW5uZWxOb3RpZmljYXRpb25IYW5kbGVyPzogKFxuICAgIGNsaWVudEV2ZW50OiBDbGllbnRFdmVudCxcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKFxuICAgICAgY2hhbm5lbHM6IChDaGFubmVsPFQ+IHwgQ2hhbm5lbFJlc3BvbnNlPFQ+KVtdLFxuICAgICAgc2hvdWxkU3RvcFdhdGNoaW5nUmVtb3ZlZENoYW5uZWxzPzogYm9vbGVhblxuICAgICkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIHdoZW4gYSBjaGFubmVsIGlzIGRlbGV0ZWQsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSguL0NoYW5uZWxTZXJ2aWNlLm1keC8jY2hhbm5lbHMpXG4gICAqL1xuICBjdXN0b21DaGFubmVsRGVsZXRlZEhhbmRsZXI/OiAoXG4gICAgZXZlbnQ6IEV2ZW50LFxuICAgIGNoYW5uZWw6IENoYW5uZWw8VD4sXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChcbiAgICAgIGNoYW5uZWxzOiAoQ2hhbm5lbDxUPiB8IENoYW5uZWxSZXNwb25zZTxUPilbXSxcbiAgICAgIHNob3VsZFN0b3BXYXRjaGluZ1JlbW92ZWRDaGFubmVscz86IGJvb2xlYW5cbiAgICApID0+IHZvaWQsXG4gICAgbWVzc2FnZUxpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZTxUPltdKSA9PiB2b2lkLFxuICAgIHRocmVhZExpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZTxUPltdKSA9PiB2b2lkLFxuICAgIHBhcmVudE1lc3NhZ2VTZXR0ZXI6IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPFQ+IHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgd2hlbiBhIGNoYW5uZWwgaXMgdXBkYXRlZCwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC4vQ2hhbm5lbFNlcnZpY2UubWR4LyNjaGFubmVscylcbiAgICovXG4gIGN1c3RvbUNoYW5uZWxVcGRhdGVkSGFuZGxlcj86IChcbiAgICBldmVudDogRXZlbnQsXG4gICAgY2hhbm5lbDogQ2hhbm5lbDxUPixcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKFxuICAgICAgY2hhbm5lbHM6IChDaGFubmVsPFQ+IHwgQ2hhbm5lbFJlc3BvbnNlPFQ+KVtdLFxuICAgICAgc2hvdWxkU3RvcFdhdGNoaW5nUmVtb3ZlZENoYW5uZWxzPzogYm9vbGVhblxuICAgICkgPT4gdm9pZCxcbiAgICBtZXNzYWdlTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgdGhyZWFkTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgcGFyZW50TWVzc2FnZVNldHRlcjogKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIGEgY2hhbm5lbCBpcyB0cnVuY2F0ZWQsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSguL0NoYW5uZWxTZXJ2aWNlLm1keC8jY2hhbm5lbHMpXG4gICAqL1xuICBjdXN0b21DaGFubmVsVHJ1bmNhdGVkSGFuZGxlcj86IChcbiAgICBldmVudDogRXZlbnQsXG4gICAgY2hhbm5lbDogQ2hhbm5lbDxUPixcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKFxuICAgICAgY2hhbm5lbHM6IChDaGFubmVsPFQ+IHwgQ2hhbm5lbFJlc3BvbnNlPFQ+KVtdLFxuICAgICAgc2hvdWxkU3RvcFdhdGNoaW5nUmVtb3ZlZENoYW5uZWxzPzogYm9vbGVhblxuICAgICkgPT4gdm9pZCxcbiAgICBtZXNzYWdlTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlPFQ+W10pID0+IHZvaWQsXG4gICAgdGhyZWFkTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlPFQ+W10pID0+IHZvaWQsXG4gICAgcGFyZW50TWVzc2FnZVNldHRlcjogKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U8VD4gfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIGEgY2hhbm5lbCBiZWNvbWVzIGhpZGRlbiwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC4vQ2hhbm5lbFNlcnZpY2UubWR4LyNjaGFubmVscylcbiAgICovXG4gIGN1c3RvbUNoYW5uZWxIaWRkZW5IYW5kbGVyPzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBjaGFubmVsOiBDaGFubmVsPFQ+LFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoXG4gICAgICBjaGFubmVsczogKENoYW5uZWw8VD4gfCBDaGFubmVsUmVzcG9uc2U8VD4pW10sXG4gICAgICBzaG91bGRTdG9wV2F0Y2hpbmdSZW1vdmVkQ2hhbm5lbHM/OiBib29sZWFuXG4gICAgKSA9PiB2b2lkLFxuICAgIG1lc3NhZ2VMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2U8VD5bXSkgPT4gdm9pZCxcbiAgICB0aHJlYWRMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2U8VD5bXSkgPT4gdm9pZCxcbiAgICBwYXJlbnRNZXNzYWdlU2V0dGVyOiAobWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPiB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIHdoZW4gYSBjaGFubmVsIGJlY29tZXMgdmlzaWJsZSwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC4vQ2hhbm5lbFNlcnZpY2UubWR4LyNjaGFubmVscylcbiAgICovXG4gIGN1c3RvbUNoYW5uZWxWaXNpYmxlSGFuZGxlcj86IChcbiAgICBldmVudDogRXZlbnQsXG4gICAgY2hhbm5lbDogQ2hhbm5lbDxUPixcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKFxuICAgICAgY2hhbm5lbHM6IChDaGFubmVsPFQ+IHwgQ2hhbm5lbFJlc3BvbnNlPFQ+KVtdLFxuICAgICAgc2hvdWxkU3RvcFdhdGNoaW5nUmVtb3ZlZENoYW5uZWxzPzogYm9vbGVhblxuICAgICkgPT4gdm9pZCxcbiAgICBtZXNzYWdlTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlPFQ+W10pID0+IHZvaWQsXG4gICAgdGhyZWFkTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlPFQ+W10pID0+IHZvaWQsXG4gICAgcGFyZW50TWVzc2FnZVNldHRlcjogKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U8VD4gfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCBpZiBhIG5ldyBtZXNzYWdlIHJlY2VpdmVkIGZyb20gYSBjaGFubmVsIHRoYXQgaXMgYmVpbmcgd2F0Y2hlZCwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC4vQ2hhbm5lbFNlcnZpY2UubWR4LyNjaGFubmVscylcbiAgICovXG4gIGN1c3RvbU5ld01lc3NhZ2VIYW5kbGVyPzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBjaGFubmVsOiBDaGFubmVsPFQ+LFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoXG4gICAgICBjaGFubmVsczogKENoYW5uZWw8VD4gfCBDaGFubmVsUmVzcG9uc2U8VD4pW10sXG4gICAgICBzaG91bGRTdG9wV2F0Y2hpbmdSZW1vdmVkQ2hhbm5lbHM/OiBib29sZWFuXG4gICAgKSA9PiB2b2lkLFxuICAgIG1lc3NhZ2VMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2U8VD5bXSkgPT4gdm9pZCxcbiAgICB0aHJlYWRMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2U8VD5bXSkgPT4gdm9pZCxcbiAgICBwYXJlbnRNZXNzYWdlU2V0dGVyOiAobWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPiB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGZpbGUgdXBsb2FkIHJlcXVlc3QgLSB5b3UgY2FuIHVzZSB0aGlzIHRvIHVwbG9hZCBmaWxlcyB0byB5b3VyIG93biBDRE5cbiAgICovXG4gIGN1c3RvbUZpbGVVcGxvYWRSZXF1ZXN0PzogKFxuICAgIGZpbGU6IEZpbGUsXG4gICAgY2hhbm5lbDogQ2hhbm5lbDxUPlxuICApID0+IFByb21pc2U8eyBmaWxlOiBzdHJpbmcgfT47XG4gIC8qKlxuICAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGltYWdlIHVwbG9hZCByZXF1ZXN0IC0geW91IGNhbiB1c2UgdGhpcyB0byB1cGxvYWQgaW1hZ2VzIHRvIHlvdXIgb3duIENETlxuICAgKi9cbiAgY3VzdG9tSW1hZ2VVcGxvYWRSZXF1ZXN0PzogKFxuICAgIGZpbGU6IEZpbGUsXG4gICAgY2hhbm5lbDogQ2hhbm5lbDxUPlxuICApID0+IFByb21pc2U8eyBmaWxlOiBzdHJpbmcgfT47XG4gIC8qKlxuICAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGZpbGUgZGVsZXRlIHJlcXVlc3QgLSBvdmVycmlkZSB0aGlzIGlmIHlvdSB1c2UgeW91ciBvd24gQ0ROXG4gICAqL1xuICBjdXN0b21GaWxlRGVsZXRlUmVxdWVzdD86ICh1cmw6IHN0cmluZywgY2hhbm5lbDogQ2hhbm5lbDxUPikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaW1hZ2UgZGVsZXRlIHJlcXVlc3QgLSBvdmVycmlkZSB0aGlzIGlmIHlvdSB1c2UgeW91ciBvd24gQ0ROXG4gICAqL1xuICBjdXN0b21JbWFnZURlbGV0ZVJlcXVlc3Q/OiAoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgY2hhbm5lbDogQ2hhbm5lbDxUPlxuICApID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgcHJvdmlkZWQgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBkZWxldGluZyBhIG1lc3NhZ2UuIElmIHRoZSByZXR1cm5lZCBQcm9taXNlIHJlc29sdmVzIHRvIGB0cnVlYCB0byBkZWxldGlvbiB3aWxsIGdvIGFoZWFkLiBJZiBgZmFsc2VgIGlzIHJldHVybmVkLCB0aGUgbWVzc2FnZSB3b24ndCBiZSBkZWxldGVkLlxuICAgKi9cbiAgbWVzc2FnZURlbGV0ZUNvbmZpcm1hdGlvbkhhbmRsZXI/OiAoXG4gICAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPlxuICApID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIC8qKlxuICAgKiBUaGUgcHJvdmlkZWQgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBhIG5ldyBtZXNzYWdlIGlzIHNlbnQgdG8gU3RyZWFtJ3MgQVBJLiBZb3UgY2FuIHVzZSB0aGlzIGhvb2sgdG8gdHJhbmZyb20gb3IgZW5yaWNoIHRoZSBtZXNzYWdlIGJlaW5nIHNlbnQuXG4gICAqL1xuICBiZWZvcmVTZW5kTWVzc2FnZT86IChcbiAgICBpbnB1dDogTWVzc2FnZUlucHV0PFQ+XG4gICkgPT4gTWVzc2FnZUlucHV0PFQ+IHwgUHJvbWlzZTxNZXNzYWdlSW5wdXQ8VD4+O1xuICAvKipcbiAgICogVGhlIHByb3ZpZGVkIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgYSBtZXNzYWdlIGlzIHNlbnQgdG8gU3RyZWFtJ3MgQVBJIGZvciB1cGRhdGUuIFlvdSBjYW4gdXNlIHRoaXMgaG9vayB0byB0cmFuZnJvbSBvciBlbnJpY2ggdGhlIG1lc3NhZ2UgYmVpbmcgdXBkYXRlZC5cbiAgICovXG4gIGJlZm9yZVVwZGF0ZU1lc3NhZ2U/OiAoXG4gICAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPlxuICApID0+IFN0cmVhbU1lc3NhZ2U8VD4gfCBQcm9taXNlPFN0cmVhbU1lc3NhZ2U8VD4+O1xuICAvKipcbiAgICogQnkgZGVmYXVsdCB0aGUgU0RLIHVzZXMgYW4gb2Zmc2V0IGJhc2VkIHBhZ2luYXRpb24sIHlvdSBjYW4gY2hhbmdlL2V4dGVuZCB0aGlzIGJ5IHByb3ZpZGluZyB5b3VyIG93biBjdXN0b20gcGFnaW5hdG9yIG1ldGhvZC5cbiAgICpcbiAgICogVGhlIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGxhdGVzdCBjaGFubmVsIHF1ZXJ5LlxuICAgKlxuICAgKiBZb3UgY2FuIHJldHVybiBlaXRoZXIgYW4gb2Zmc2V0LCBvciBhIGZpbHRlciB1c2luZyB0aGUgW2AkbHRlYC9gJGd0ZWAgb3BlcmF0b3JdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X3N5bnRheF9vcGVyYXRvcnMvKS4gSWYgeW91IHJldHVybiBhIGZpbHRlciwgaXQgd2lsbCBiZSBtZXJnZWQgd2l0aCB0aGUgZmlsdGVyIHByb3ZpZGVkIGZvciB0aGUgYGluaXRgIG1ldGhvZC5cbiAgICovXG4gIGN1c3RvbVBhZ2luYXRvcj86IChjaGFubmVsUXVlcnlSZXN1bHQ6IENoYW5uZWw8VD5bXSkgPT4gTmV4dFBhZ2VDb25maWd1cmF0aW9uO1xuICAvKipcbiAgICogaW50ZXJuYWxcbiAgICovXG4gIHN0YXRpYyByZWFkb25seSBNQVhfTUVTU0FHRV9SRUFDVElPTlNfVE9fRkVUQ0ggPSAxMjAwO1xuICBwcml2YXRlIGNoYW5uZWxzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2hhbm5lbDxUPltdIHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcbiAgcHJpdmF0ZSBhY3RpdmVDaGFubmVsU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2hhbm5lbDxUPiB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG4gIHByaXZhdGUgYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgKFN0cmVhbU1lc3NhZ2U8VD4gfCBNZXNzYWdlUmVzcG9uc2U8VD4gfCBGb3JtYXRNZXNzYWdlUmVzcG9uc2U8VD4pW11cbiAgPihbXSk7XG4gIHByaXZhdGUgYWN0aXZlQ2hhbm5lbFBpbm5lZE1lc3NhZ2VzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgU3RyZWFtTWVzc2FnZVtdXG4gID4oW10pO1xuICBwcml2YXRlIGhhc01vcmVDaGFubmVsc1N1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxib29sZWFuPigxKTtcbiAgcHJpdmF0ZSBhY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9uczogeyB1bnN1YnNjcmliZTogKCkgPT4gdm9pZCB9W10gPSBbXTtcbiAgcHJpdmF0ZSBjaGFubmVsU3Vic2NyaXB0aW9uczogeyBba2V5OiBzdHJpbmddOiAoKSA9PiB2b2lkIH0gPSB7fTtcbiAgcHJpdmF0ZSBhY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBzdHJpbmcgfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgKFN0cmVhbU1lc3NhZ2U8VD4gfCBNZXNzYWdlUmVzcG9uc2U8VD4gfCBGb3JtYXRNZXNzYWdlUmVzcG9uc2U8VD4pW11cbiAgPihbXSk7XG4gIHByaXZhdGUganVtcFRvTWVzc2FnZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHtcbiAgICBpZD86IHN0cmluZztcbiAgICBwYXJlbnRJZD86IHN0cmluZztcbiAgfT4oeyBpZDogdW5kZWZpbmVkLCBwYXJlbnRJZDogdW5kZWZpbmVkIH0pO1xuICBwcml2YXRlIGxhdGVzdE1lc3NhZ2VEYXRlQnlVc2VyQnlDaGFubmVsc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHtcbiAgICBba2V5OiBzdHJpbmddOiBEYXRlO1xuICB9Pih7fSk7XG4gIHByaXZhdGUgZmlsdGVyczogQ2hhbm5lbEZpbHRlcnM8VD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc29ydDogQ2hhbm5lbFNvcnQ8VD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgb3B0aW9uczpcbiAgICB8IChDaGFubmVsT3B0aW9ucyAmIHsga2VlcEFsaXZlQ2hhbm5lbHMkT25FcnJvcj86IGJvb2xlYW4gfSlcbiAgICB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlUGFnZVNpemUgPSAyNTtcbiAgcHJpdmF0ZSBtZXNzYWdlVG9RdW90ZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIFN0cmVhbU1lc3NhZ2U8VD4gfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXNlclJlc3BvbnNlPFQ+W10+KFxuICAgIFtdXG4gICk7XG4gIHByaXZhdGUgdXNlcnNUeXBpbmdJblRocmVhZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFVzZXJSZXNwb25zZTxUPltdPihcbiAgICBbXVxuICApO1xuICBwcml2YXRlIF9zaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZCA9IHRydWU7XG4gIHByaXZhdGUgc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBjbGllbnRFdmVudHNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBpc1N0YXRlUmVjb3ZlcnlJblByb2dyZXNzID0gZmFsc2U7XG4gIHByaXZhdGUgY2hhbm5lbFF1ZXJ5U3RhdGVTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBDaGFubmVsUXVlcnlTdGF0ZSB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZCk7XG5cbiAgcHJpdmF0ZSBjaGFubmVsTGlzdFNldHRlciA9IChcbiAgICBjaGFubmVsczogKENoYW5uZWw8VD4gfCBDaGFubmVsUmVzcG9uc2U8VD4pW10sXG4gICAgc2hvdWxkU3RvcFdhdGNoaW5nUmVtb3ZlZENoYW5uZWxzID0gdHJ1ZVxuICApID0+IHtcbiAgICBjb25zdCBjdXJyZW50Q2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzU3ViamVjdC5nZXRWYWx1ZSgpIHx8IFtdO1xuICAgIGNvbnN0IG5ld0NoYW5uZWxzID0gY2hhbm5lbHMuZmlsdGVyKFxuICAgICAgKGMpID0+ICFjdXJyZW50Q2hhbm5lbHMuZmluZCgoY2hhbm5lbCkgPT4gY2hhbm5lbC5jaWQgPT09IGMuY2lkKVxuICAgICk7XG4gICAgY29uc3QgZGVsZXRlZENoYW5uZWxzID0gY3VycmVudENoYW5uZWxzLmZpbHRlcihcbiAgICAgIChjKSA9PiAhY2hhbm5lbHM/LmZpbmQoKGNoYW5uZWwpID0+IGNoYW5uZWwuY2lkID09PSBjLmNpZClcbiAgICApO1xuICAgIHZvaWQgdGhpcy5hZGRDaGFubmVsc0Zyb21Ob3RpZmljYXRpb24obmV3Q2hhbm5lbHMgYXMgQ2hhbm5lbFJlc3BvbnNlPFQ+W10pO1xuICAgIHRoaXMucmVtb3ZlQ2hhbm5lbHNGcm9tQ2hhbm5lbExpc3QoXG4gICAgICBkZWxldGVkQ2hhbm5lbHMubWFwKChjKSA9PiBjLmNpZCksXG4gICAgICBzaG91bGRTdG9wV2F0Y2hpbmdSZW1vdmVkQ2hhbm5lbHNcbiAgICApO1xuICB9O1xuXG4gIHByaXZhdGUgbWVzc2FnZUxpc3RTZXR0ZXIgPSAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2U8VD5bXSkgPT4ge1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KG1lc3NhZ2VzKTtcbiAgfTtcblxuICBwcml2YXRlIHRocmVhZExpc3RTZXR0ZXIgPSAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2U8VD5bXSkgPT4ge1xuICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQobWVzc2FnZXMpO1xuICB9O1xuXG4gIHByaXZhdGUgcGFyZW50TWVzc2FnZVNldHRlciA9IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPFQ+IHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0Lm5leHQobWVzc2FnZT8uaWQpO1xuICB9O1xuICBwcml2YXRlIGRpc21pc3NFcnJvck5vdGlmaWNhdGlvbj86IEZ1bmN0aW9uO1xuICBwcml2YXRlIG5leHRQYWdlQ29uZmlndXJhdGlvbj86IE5leHRQYWdlQ29uZmlndXJhdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYXRDbGllbnRTZXJ2aWNlOiBDaGF0Q2xpZW50U2VydmljZTxUPixcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZVxuICApIHtcbiAgICB0aGlzLmNoYW5uZWxzJCA9IHRoaXMuY2hhbm5lbHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbCQgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0XG4gICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlcyQgPSB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QucGlwZShcbiAgICAgIG1hcCgobWVzc2FnZXMpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgICAgIHJldHVybiBtZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+XG4gICAgICAgICAgdGhpcy50cmFuc2Zvcm1Ub1N0cmVhbU1lc3NhZ2UobWVzc2FnZSwgY2hhbm5lbClcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuICAgIHRoaXMuaGFzTW9yZUNoYW5uZWxzJCA9IHRoaXMuaGFzTW9yZUNoYW5uZWxzU3ViamVjdFxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWQkID0gdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0XG4gICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzJCA9IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0LnBpcGUoXG4gICAgICBtYXAoKG1lc3NhZ2VzKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgICAgICByZXR1cm4gbWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PlxuICAgICAgICAgIHRoaXMudHJhbnNmb3JtVG9TdHJlYW1NZXNzYWdlKG1lc3NhZ2UsIGNoYW5uZWwpXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2UkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlcyQsXG4gICAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZCQsXG4gICAgXSkucGlwZShcbiAgICAgIG1hcChcbiAgICAgICAgKFttZXNzYWdlcywgcGFyZW50TWVzc2FnZUlkXTogW1xuICAgICAgICAgIFN0cmVhbU1lc3NhZ2VbXSxcbiAgICAgICAgICBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAgICAgXSkgPT4ge1xuICAgICAgICAgIGlmICghcGFyZW50TWVzc2FnZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXMuZmluZCgobSkgPT4gbS5pZCA9PT0gcGFyZW50TWVzc2FnZUlkKTtcbiAgICAgICAgICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgICAgICAgICB2b2lkIHRoaXMuc2V0QXNBY3RpdmVQYXJlbnRNZXNzYWdlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBzaGFyZVJlcGxheSgxKVxuICAgICk7XG4gICAgdGhpcy5tZXNzYWdlVG9RdW90ZSQgPSB0aGlzLm1lc3NhZ2VUb1F1b3RlU3ViamVjdFxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgdGhpcy5qdW1wVG9NZXNzYWdlJCA9IHRoaXMuanVtcFRvTWVzc2FnZVN1YmplY3RcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuXG4gICAgdGhpcy51c2Vyc1R5cGluZ0luQ2hhbm5lbCQgPSB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdFxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkJCA9IHRoaXMudXNlcnNUeXBpbmdJblRocmVhZFN1YmplY3RcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICAgIHRoaXMubGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzJCA9XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2VEYXRlQnlVc2VyQnlDaGFubmVsc1N1YmplY3RcbiAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgIC5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxQaW5uZWRNZXNzYWdlcyQgPSB0aGlzLmFjdGl2ZUNoYW5uZWxQaW5uZWRNZXNzYWdlc1N1YmplY3RcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICAgIHRoaXMuY2hhbm5lbFF1ZXJ5U3RhdGUkID0gdGhpcy5jaGFubmVsUXVlcnlTdGF0ZVN1YmplY3RcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHNldCB0byBmYWxzZSwgcmVhZCBldmVudHMgd29uJ3QgYmUgc2VudCBhcyBuZXcgbWVzc2FnZXMgYXJlIHJlY2VpdmVkLiBJZiBzZXQgdG8gdHJ1ZSBhY3RpdmUgY2hhbm5lbCAoaWYgYW55KSB3aWxsIGltbWVkaWF0ZWx5IGJlIG1hcmtlZCBhcyByZWFkLlxuICAgKi9cbiAgZ2V0IHNob3VsZE1hcmtBY3RpdmVDaGFubmVsQXNSZWFkKCkge1xuICAgIHJldHVybiB0aGlzLl9zaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gZmFsc2UsIHJlYWQgZXZlbnRzIHdvbid0IGJlIHNlbnQgYXMgbmV3IG1lc3NhZ2VzIGFyZSByZWNlaXZlZC4gSWYgc2V0IHRvIHRydWUgYWN0aXZlIGNoYW5uZWwgKGlmIGFueSkgd2lsbCBpbW1lZGlhdGVseSBiZSBtYXJrZWQgYXMgcmVhZC5cbiAgICovXG4gIHNldCBzaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZChzaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5fc2hvdWxkTWFya0FjdGl2ZUNoYW5uZWxBc1JlYWQgJiYgc2hvdWxkTWFya0FjdGl2ZUNoYW5uZWxBc1JlYWQpIHtcbiAgICAgIGNvbnN0IGFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICBpZiAoYWN0aXZlQ2hhbm5lbCAmJiB0aGlzLmNhblNlbmRSZWFkRXZlbnRzKSB7XG4gICAgICAgIHZvaWQgYWN0aXZlQ2hhbm5lbC5tYXJrUmVhZCgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZCA9IHNob3VsZE1hcmtBY3RpdmVDaGFubmVsQXNSZWFkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGdpdmVuIGBjaGFubmVsYCBhcyBhY3RpdmUgYW5kIG1hcmtzIGl0IGFzIHJlYWQuXG4gICAqIElmIHRoZSBjaGFubmVsIHdhc24ndCBwcmV2aW91c2x5IHBhcnQgb2YgdGhlIGNoYW5uZWwsIGl0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxcbiAgICovXG4gIHNldEFzQWN0aXZlQ2hhbm5lbChjaGFubmVsOiBDaGFubmVsPFQ+KSB7XG4gICAgY29uc3QgcHJldkFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgaWYgKHByZXZBY3RpdmVDaGFubmVsPy5jaWQgPT09IGNoYW5uZWwuY2lkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RvcFdhdGNoRm9yQWN0aXZlQ2hhbm5lbEV2ZW50cyhwcmV2QWN0aXZlQ2hhbm5lbCk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsTGFzdFJlYWRNZXNzYWdlSWQgPVxuICAgICAgY2hhbm5lbC5zdGF0ZS5yZWFkW1xuICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlcj8uaWQgfHwgJydcbiAgICAgIF0/Lmxhc3RfcmVhZF9tZXNzYWdlX2lkO1xuICAgIGlmIChcbiAgICAgIGNoYW5uZWwuc3RhdGUubGF0ZXN0TWVzc2FnZXNbY2hhbm5lbC5zdGF0ZS5sYXRlc3RNZXNzYWdlcy5sZW5ndGggLSAxXVxuICAgICAgICA/LmlkID09PSB0aGlzLmFjdGl2ZUNoYW5uZWxMYXN0UmVhZE1lc3NhZ2VJZFxuICAgICkge1xuICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTGFzdFJlYWRNZXNzYWdlSWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMud2F0Y2hGb3JBY3RpdmVDaGFubmVsRXZlbnRzKGNoYW5uZWwpO1xuICAgIHRoaXMuYWRkQ2hhbm5lbChjaGFubmVsKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0Lm5leHQoY2hhbm5lbCk7XG4gICAgY29uc3QgY2hhbm5lbFN0YXRlTGVuZ3RoID0gY2hhbm5lbC5zdGF0ZS5sYXRlc3RNZXNzYWdlcy5sZW5ndGg7XG4gICAgaWYgKGNoYW5uZWxTdGF0ZUxlbmd0aCA+IDIgKiB0aGlzLm1lc3NhZ2VQYWdlU2l6ZSkge1xuICAgICAgY2hhbm5lbC5zdGF0ZS5sYXRlc3RNZXNzYWdlcyA9IGNoYW5uZWwuc3RhdGUubGF0ZXN0TWVzc2FnZXMuc2xpY2UoXG4gICAgICAgIGNoYW5uZWxTdGF0ZUxlbmd0aCAtIDIgKiB0aGlzLm1lc3NhZ2VQYWdlU2l6ZVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5zZXRDaGFubmVsU3RhdGUoY2hhbm5lbCk7XG4gIH1cblxuICAvKipcbiAgICogRGVzZWxlY3RzIHRoZSBjdXJyZW50bHkgYWN0aXZlIChpZiBhbnkpIGNoYW5uZWxcbiAgICovXG4gIGRlc2VsZWN0QWN0aXZlQ2hhbm5lbCgpIHtcbiAgICBjb25zdCBhY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGlmICghYWN0aXZlQ2hhbm5lbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0b3BXYXRjaEZvckFjdGl2ZUNoYW5uZWxFdmVudHMoYWN0aXZlQ2hhbm5lbCk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXSk7XG4gICAgdGhpcy5sYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHNTdWJqZWN0Lm5leHQoe30pO1xuICAgIHRoaXMuc2VsZWN0TWVzc2FnZVRvUXVvdGUodW5kZWZpbmVkKTtcbiAgICB0aGlzLmp1bXBUb01lc3NhZ2VTdWJqZWN0Lm5leHQoeyBpZDogdW5kZWZpbmVkLCBwYXJlbnRJZDogdW5kZWZpbmVkIH0pO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFBpbm5lZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtdKTtcbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdC5uZXh0KFtdKTtcbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWRTdWJqZWN0Lm5leHQoW10pO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbExhc3RSZWFkTWVzc2FnZUlkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGdpdmVuIGBtZXNzYWdlYCBhcyBhbiBhY3RpdmUgcGFyZW50IG1lc3NhZ2UuIElmIGB1bmRlZmluZWRgIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGRlbGVzZWxlY3QgdGhlIGN1cnJlbnQgcGFyZW50IG1lc3NhZ2UuXG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqIEBwYXJhbSBsb2FkTWVzc2FnZXNGb3JtXG4gICAqL1xuICBhc3luYyBzZXRBc0FjdGl2ZVBhcmVudE1lc3NhZ2UoXG4gICAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPiB8IHVuZGVmaW5lZCxcbiAgICBsb2FkTWVzc2FnZXNGb3JtOiAncmVxdWVzdCcgfCAnc3RhdGUnID0gJ3JlcXVlc3QnXG4gICkge1xuICAgIGNvbnN0IG1lc3NhZ2VUb1F1b3RlID0gdGhpcy5tZXNzYWdlVG9RdW90ZVN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAobWVzc2FnZVRvUXVvdGUgJiYgISFtZXNzYWdlVG9RdW90ZS5wYXJlbnRfaWQpIHtcbiAgICAgIHRoaXMubWVzc2FnZVRvUXVvdGVTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICB9XG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXSk7XG4gICAgICBjb25zdCBtZXNzYWdlVG9KdW1wVG8gPSB0aGlzLmp1bXBUb01lc3NhZ2VTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICBpZiAobWVzc2FnZVRvSnVtcFRvICYmICEhbWVzc2FnZVRvSnVtcFRvLnBhcmVudElkKSB7XG4gICAgICAgIHRoaXMuanVtcFRvTWVzc2FnZVN1YmplY3QubmV4dCh7IGlkOiB1bmRlZmluZWQsIHBhcmVudElkOiB1bmRlZmluZWQgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5uZXh0KG1lc3NhZ2UuaWQpO1xuICAgICAgY29uc3QgYWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgIGlmIChsb2FkTWVzc2FnZXNGb3JtID09PSAncmVxdWVzdCcpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYWN0aXZlQ2hhbm5lbD8uZ2V0UmVwbGllcyhtZXNzYWdlLmlkLCB7XG4gICAgICAgICAgbGltaXQ6IHRoaXMub3B0aW9ucz8ubWVzc2FnZV9saW1pdCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQocmVzdWx0Py5tZXNzYWdlcyB8fCBbXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFxuICAgICAgICAgIGFjdGl2ZUNoYW5uZWw/LnN0YXRlLnRocmVhZHNbbWVzc2FnZS5pZF0gfHwgW11cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIG5leHQgcGFnZSBvZiBtZXNzYWdlcyBvZiB0aGUgYWN0aXZlIGNoYW5uZWwuIFRoZSBwYWdlIHNpemUgY2FuIGJlIHNldCBpbiB0aGUgW3F1ZXJ5IG9wdGlvbl0oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvcXVlcnlfY2hhbm5lbHMvP2xhbmd1YWdlPWphdmFzY3JpcHQjcXVlcnktb3B0aW9ucykgb2JqZWN0LlxuICAgKiBAcGFyYW0gZGlyZWN0aW9uXG4gICAqL1xuICBsb2FkTW9yZU1lc3NhZ2VzKGRpcmVjdGlvbjogJ29sZGVyJyB8ICduZXdlcicgPSAnb2xkZXInKSB7XG4gICAgY29uc3QgYWN0aXZlQ2huYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgY29uc3QgbWVzc2FnZXMgPSB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBsYXN0TWVzc2FnZUlkID1cbiAgICAgIG1lc3NhZ2VzW2RpcmVjdGlvbiA9PT0gJ29sZGVyJyA/IDAgOiBtZXNzYWdlcy5sZW5ndGggLSAxXT8uaWQ7XG4gICAgaWYgKFxuICAgICAgZGlyZWN0aW9uID09PSAnbmV3ZXInICYmXG4gICAgICBhY3RpdmVDaG5hbm5lbD8uc3RhdGU/LmxhdGVzdE1lc3NhZ2VzID09PSBhY3RpdmVDaG5hbm5lbD8uc3RhdGU/Lm1lc3NhZ2VzXG4gICAgKSB7XG4gICAgICAvLyBJZiB3ZSBhcmUgb24gbGF0ZXN0IG1lc3NhZ2Ugc2V0LCBhY3RpdmVDaGFubmVsTWVzc2FnZXMkIHdpbGwgYmUgcmVmcmVzaGVkIGJ5IFdTIGV2ZW50cywgbm8gbmVlZCBmb3IgYSByZXF1ZXN0XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBhY3RpdmVDaG5hbm5lbFxuICAgICAgPy5xdWVyeSh7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgbGltaXQ6IHRoaXMub3B0aW9ucz8ubWVzc2FnZV9saW1pdCxcbiAgICAgICAgICBbZGlyZWN0aW9uID09PSAnb2xkZXInID8gJ2lkX2x0JyA6ICdpZF9ndCddOiBsYXN0TWVzc2FnZUlkLFxuICAgICAgICB9LFxuICAgICAgICBtZW1iZXJzOiB7IGxpbWl0OiAwIH0sXG4gICAgICAgIHdhdGNoZXJzOiB7IGxpbWl0OiAwIH0sXG4gICAgICB9KVxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgYWN0aXZlQ2huYW5uZWw/LmRhdGE/LmlkID09PVxuICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKT8uZGF0YT8uaWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgICAgICAgLi4uYWN0aXZlQ2huYW5uZWwuc3RhdGUubWVzc2FnZXMsXG4gICAgICAgICAgXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIG5leHQgcGFnZSBvZiBtZXNzYWdlcyBvZiB0aGUgYWN0aXZlIHRocmVhZC4gVGhlIHBhZ2Ugc2l6ZSBjYW4gYmUgc2V0IGluIHRoZSBbcXVlcnkgb3B0aW9uXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9xdWVyeV9jaGFubmVscy8/bGFuZ3VhZ2U9amF2YXNjcmlwdCNxdWVyeS1vcHRpb25zKSBvYmplY3QuXG4gICAqIEBwYXJhbSBkaXJlY3Rpb25cbiAgICovXG4gIGFzeW5jIGxvYWRNb3JlVGhyZWFkUmVwbGllcyhkaXJlY3Rpb246ICdvbGRlcicgfCAnbmV3ZXInID0gJ29sZGVyJykge1xuICAgIGlmIChkaXJlY3Rpb24gPT09ICduZXdlcicpIHtcbiAgICAgIC8vIFRocmVhZCByZXBsaWVzIGFyZW4ndCBicm9rZSBpbnRvIGRpZmZlcmVudCBtZXNzYWdlIHNldHMsIGFjdGl2ZVRocmVhZE1lc3NhZ2VzJCB3aWxsIGJlIHJlZnJlc2hlZCBieSBXUyBldmVudHMsIG5vIG5lZWQgZm9yIGEgcmVxdWVzdFxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhY3RpdmVDaG5hbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBwYXJlbnRNZXNzYWdlSWQgPSB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAoIXBhcmVudE1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0aHJlYWRNZXNzYWdlcyA9IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgY29uc3QgbGFzdE1lc3NhZ2VJZCA9XG4gICAgICB0aHJlYWRNZXNzYWdlc1tkaXJlY3Rpb24gPT09ICdvbGRlcicgPyAwIDogdGhyZWFkTWVzc2FnZXMubGVuZ3RoIC0gMV0/LmlkO1xuICAgIGF3YWl0IGFjdGl2ZUNobmFubmVsPy5nZXRSZXBsaWVzKHBhcmVudE1lc3NhZ2VJZCwge1xuICAgICAgbGltaXQ6IHRoaXMub3B0aW9ucz8ubWVzc2FnZV9saW1pdCxcbiAgICAgIFtkaXJlY3Rpb24gPT09ICdvbGRlcicgPyAnaWRfbHQnIDogJ2lkX2d0J106IGxhc3RNZXNzYWdlSWQsXG4gICAgfSk7XG4gICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChcbiAgICAgIGFjdGl2ZUNobmFubmVsPy5zdGF0ZS50aHJlYWRzW3BhcmVudE1lc3NhZ2VJZF0gfHwgW11cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXJpZXMgdGhlIGNoYW5uZWxzIHdpdGggdGhlIGdpdmVuIGZpbHRlcnMsIHNvcnRzIGFuZCBvcHRpb25zLiBNb3JlIGluZm8gYWJvdXQgW2NoYW5uZWwgcXVlcnlpbmddKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X2NoYW5uZWxzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KSBjYW4gYmUgZm91bmQgaW4gdGhlIHBsYXRmb3JtIGRvY3VtZW50YXRpb24uIEJ5IGRlZmF1bHQgdGhlIGZpcnN0IGNoYW5uZWwgaW4gdGhlIGxpc3Qgd2lsbCBiZSBzZXQgYXMgYWN0aXZlIGNoYW5uZWwgYW5kIHdpbGwgYmUgbWFya2VkIGFzIHJlYWQuXG4gICAqIEBwYXJhbSBmaWx0ZXJzXG4gICAqIEBwYXJhbSBzb3J0XG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEBwYXJhbSBzaG91bGRTZXRBY3RpdmVDaGFubmVsIERlY2lkZXMgaWYgdGhlIGZpcnN0IGNoYW5uZWwgaW4gdGhlIHJlc3VsdCBzaG91bGQgYmUgbWFkZSBhcyBhbiBhY3RpdmUgY2hhbm5lbCwgb3Igbm8gY2hhbm5lbCBzaG91bGQgYmUgbWFya2VkIGFzIGFjdGl2ZVxuICAgKiBAcmV0dXJucyB0aGUgbGlzdCBvZiBjaGFubmVscyBmb3VuZCBieSB0aGUgcXVlcnlcbiAgICovXG4gIGFzeW5jIGluaXQoXG4gICAgZmlsdGVyczogQ2hhbm5lbEZpbHRlcnM8VD4sXG4gICAgc29ydD86IENoYW5uZWxTb3J0PFQ+LFxuICAgIG9wdGlvbnM/OiBDaGFubmVsT3B0aW9ucyAmIHsga2VlcEFsaXZlQ2hhbm5lbHMkT25FcnJvcj86IGJvb2xlYW4gfSxcbiAgICBzaG91bGRTZXRBY3RpdmVDaGFubmVsOiBib29sZWFuID0gdHJ1ZVxuICApIHtcbiAgICB0aGlzLmZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGxpbWl0OiAyNSxcbiAgICAgIHN0YXRlOiB0cnVlLFxuICAgICAgcHJlc2VuY2U6IHRydWUsXG4gICAgICB3YXRjaDogdHJ1ZSxcbiAgICAgIG1lc3NhZ2VfbGltaXQ6IHRoaXMubWVzc2FnZVBhZ2VTaXplLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICAgIHRoaXMuc29ydCA9IHNvcnQgfHwgeyBsYXN0X21lc3NhZ2VfYXQ6IC0xIH07XG4gICAgdGhpcy5zaG91bGRTZXRBY3RpdmVDaGFubmVsID0gc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbDtcbiAgICB0aGlzLmNsaWVudEV2ZW50c1N1YnNjcmlwdGlvbiA9IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuZXZlbnRzJC5zdWJzY3JpYmUoXG4gICAgICAobm90aWZpY2F0aW9uKSA9PiB2b2lkIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbilcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnF1ZXJ5Q2hhbm5lbHModGhpcy5zaG91bGRTZXRBY3RpdmVDaGFubmVsKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZGlzbWlzc0Vycm9yTm90aWZpY2F0aW9uID1cbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZFBlcm1hbmVudE5vdGlmaWNhdGlvbihcbiAgICAgICAgICAnc3RyZWFtQ2hhdC5FcnJvciBsb2FkaW5nIGNoYW5uZWxzJyxcbiAgICAgICAgICAnZXJyb3InXG4gICAgICAgICk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBgYWN0aXZlQ2hhbm5lbCRgLCBgY2hhbm5lbHMkYCBhbmQgYGFjdGl2ZUNoYW5uZWxNZXNzYWdlcyRgIE9ic2VydmFibGVzLiBVc2VmdWwgd2hlbiBkaXNjb25uZWN0aW5nIGEgY2hhdCB1c2VyLCB1c2UgaW4gY29tYmluYXRpb24gd2l0aCBbYGRpc2Nvbm5lY3RVc2VyYF0oLi9DaGF0Q2xpZW50U2VydmljZS5tZHgvI2Rpc2Nvbm5lY3R1c2VyKS5cbiAgICovXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuZGVzZWxlY3RBY3RpdmVDaGFubmVsKCk7XG4gICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMuY2hhbm5lbFF1ZXJ5U3RhdGVTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICB0aGlzLmNsaWVudEV2ZW50c1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRpc21pc3NFcnJvck5vdGlmaWNhdGlvbj8uKCk7XG4gICAgdGhpcy5kaXNtaXNzRXJyb3JOb3RpZmljYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgT2JqZWN0LmtleXModGhpcy5jaGFubmVsU3Vic2NyaXB0aW9ucykuZm9yRWFjaCgoY2lkKSA9PiB7XG4gICAgICB0aGlzLmNoYW5uZWxTdWJzY3JpcHRpb25zW2NpZF0oKTtcbiAgICB9KTtcbiAgICB0aGlzLmNoYW5uZWxTdWJzY3JpcHRpb25zID0ge307XG4gICAgdGhpcy5uZXh0UGFnZUNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIG5leHQgcGFnZSBvZiBjaGFubmVscy4gVGhlIHBhZ2Ugc2l6ZSBjYW4gYmUgc2V0IGluIHRoZSBbcXVlcnkgb3B0aW9uXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9xdWVyeV9jaGFubmVscy8/bGFuZ3VhZ2U9amF2YXNjcmlwdCNxdWVyeS1vcHRpb25zKSBvYmplY3QuXG4gICAqL1xuICBhc3luYyBsb2FkTW9yZUNoYW5uZWxzKCkge1xuICAgIGF3YWl0IHRoaXMucXVlcnlDaGFubmVscyhmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlYWN0aW9uIHRvIGEgbWVzc2FnZS5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZCBUaGUgaWQgb2YgdGhlIG1lc3NhZ2UgdG8gYWRkIHRoZSByZWFjdGlvbiB0b1xuICAgKiBAcGFyYW0gcmVhY3Rpb25UeXBlIFRoZSB0eXBlIG9mIHRoZSByZWFjdGlvblxuICAgKiBAcGFyYW0gY3VzdG9tRGF0YVxuICAgKi9cbiAgYXN5bmMgYWRkUmVhY3Rpb24oXG4gICAgbWVzc2FnZUlkOiBzdHJpbmcsXG4gICAgcmVhY3Rpb25UeXBlOiBNZXNzYWdlUmVhY3Rpb25UeXBlLFxuICAgIGN1c3RvbURhdGE/OiBUWydyZWFjdGlvblR5cGUnXVxuICApIHtcbiAgICBhd2FpdCB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk/LnNlbmRSZWFjdGlvbihtZXNzYWdlSWQsIHtcbiAgICAgIHR5cGU6IHJlYWN0aW9uVHlwZSxcbiAgICAgIC4uLmN1c3RvbURhdGEsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIHJlYWN0aW9uIGZyb20gYSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIFRoZSBpZCBvZiB0aGUgbWVzc2FnZSB0byByZW1vdmUgdGhlIHJlYWN0aW9uIGZyb21cbiAgICogQHBhcmFtIHJlYWN0aW9uVHlwZSBUaHIgdHlwZSBvZiByZWFjdGlvbiB0byByZW1vdmVcbiAgICovXG4gIGFzeW5jIHJlbW92ZVJlYWN0aW9uKG1lc3NhZ2VJZDogc3RyaW5nLCByZWFjdGlvblR5cGU6IE1lc3NhZ2VSZWFjdGlvblR5cGUpIHtcbiAgICBhd2FpdCB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0XG4gICAgICAuZ2V0VmFsdWUoKVxuICAgICAgPy5kZWxldGVSZWFjdGlvbihtZXNzYWdlSWQsIHJlYWN0aW9uVHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBhY3RpdmUgY2hhbm5lbC4gVGhlIG1lc3NhZ2UgaXMgaW1tZWRpYXRlbHkgYWRkZWQgdG8gdGhlIG1lc3NhZ2UgbGlzdCwgaWYgYW4gZXJyb3Igb2NjdXJzIGFuZCB0aGUgbWVzc2FnZSBjYW4ndCBiZSBzZW50LCB0aGUgZXJyb3IgaXMgaW5kaWNhdGVkIGluIGBzdGF0ZWAgb2YgdGhlIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IG9mIHRoZSBtZXNzYWdlXG4gICAqIEBwYXJhbSBhdHRhY2htZW50cyBUaGUgYXR0YWNobWVudHNcbiAgICogQHBhcmFtIG1lbnRpb25lZFVzZXJzIE1lbnRpb25lZCB1c2Vyc1xuICAgKiBAcGFyYW0gcGFyZW50SWQgSWQgb2YgdGhlIHBhcmVudCBtZXNzYWdlIChpZiBzZW5kaW5nIGEgdGhyZWFkIHJlcGx5KVxuICAgKiBAcGFyYW0gcXVvdGVkTWVzc2FnZUlkIElkIG9mIHRoZSBtZXNzYWdlIHRvIHF1b3RlIChpZiBzZW5kaW5nIGEgcXVvdGUgcmVwbHkpXG4gICAqIEBwYXJhbSBjdXN0b21EYXRhXG4gICAqL1xuICBhc3luYyBzZW5kTWVzc2FnZShcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgYXR0YWNobWVudHM6IEF0dGFjaG1lbnQ8VD5bXSA9IFtdLFxuICAgIG1lbnRpb25lZFVzZXJzOiBVc2VyUmVzcG9uc2U8VD5bXSA9IFtdLFxuICAgIHBhcmVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gICAgcXVvdGVkTWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gICAgY3VzdG9tRGF0YTogdW5kZWZpbmVkIHwgUGFydGlhbDxUWydtZXNzYWdlVHlwZSddPiA9IHVuZGVmaW5lZFxuICApIHtcbiAgICBsZXQgaW5wdXQ6IE1lc3NhZ2VJbnB1dDxUPiA9IHtcbiAgICAgIHRleHQsXG4gICAgICBhdHRhY2htZW50cyxcbiAgICAgIG1lbnRpb25lZFVzZXJzLFxuICAgICAgcGFyZW50SWQsXG4gICAgICBxdW90ZWRNZXNzYWdlSWQsXG4gICAgICBjdXN0b21EYXRhLFxuICAgIH07XG4gICAgaWYgKHRoaXMuYmVmb3JlU2VuZE1lc3NhZ2UpIHtcbiAgICAgIGlucHV0ID0gYXdhaXQgdGhpcy5iZWZvcmVTZW5kTWVzc2FnZShpbnB1dCk7XG4gICAgfVxuICAgIGNvbnN0IHByZXZpZXcgPSBjcmVhdGVNZXNzYWdlUHJldmlldyhcbiAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyISxcbiAgICAgIGlucHV0LnRleHQsXG4gICAgICBpbnB1dC5hdHRhY2htZW50cyxcbiAgICAgIGlucHV0Lm1lbnRpb25lZFVzZXJzLFxuICAgICAgaW5wdXQucGFyZW50SWQsXG4gICAgICBpbnB1dC5xdW90ZWRNZXNzYWdlSWQsXG4gICAgICBpbnB1dC5jdXN0b21EYXRhXG4gICAgKTtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICBwcmV2aWV3LnJlYWRCeSA9IFtdO1xuICAgIGNoYW5uZWwuc3RhdGUuYWRkTWVzc2FnZVNvcnRlZChwcmV2aWV3LCB0cnVlKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2VSZXF1ZXN0KHByZXZpZXcsIGlucHV0LmN1c3RvbURhdGEpO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNlbmRzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIHRoZSBhY3RpdmUgY2hhbm5lbFxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byByZXNlbmRcbiAgICovXG4gIGFzeW5jIHJlc2VuZE1lc3NhZ2UobWVzc2FnZTogU3RyZWFtTWVzc2FnZSkge1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgIGNoYW5uZWwuc3RhdGUuYWRkTWVzc2FnZVNvcnRlZChcbiAgICAgIHtcbiAgICAgICAgLi4uKG1lc3NhZ2UgYXMgYW55IGFzIE1lc3NhZ2VSZXNwb25zZTxUPiksXG4gICAgICAgIGVycm9yU3RhdHVzQ29kZTogdW5kZWZpbmVkLFxuICAgICAgICBzdGF0dXM6ICdzZW5kaW5nJyxcbiAgICAgIH0sXG4gICAgICB0cnVlXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zZW5kTWVzc2FnZVJlcXVlc3QobWVzc2FnZSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBtZXNzYWdlIGluIHRoZSBhY3RpdmUgY2hhbm5lbFxuICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNhZ2UgdG8gYmUgdXBkYXRlZFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlTWVzc2FnZShtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPFQ+KSB7XG4gICAgbGV0IG1lc3NhZ2VUb1VwZGF0ZSA9IHsgLi4ubWVzc2FnZSB9O1xuICAgIGRlbGV0ZSBtZXNzYWdlVG9VcGRhdGUuaTE4bjtcbiAgICBpZiAodGhpcy5iZWZvcmVVcGRhdGVNZXNzYWdlKSB7XG4gICAgICBtZXNzYWdlVG9VcGRhdGUgPSBhd2FpdCB0aGlzLmJlZm9yZVVwZGF0ZU1lc3NhZ2UobWVzc2FnZVRvVXBkYXRlKTtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXBkYXRlTWVzc2FnZShcbiAgICAgIG1lc3NhZ2VUb1VwZGF0ZSBhcyBhbnkgYXMgVXBkYXRlZE1lc3NhZ2U8VD5cbiAgICApO1xuXG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHNTdWJqZWN0XG4gICAgICAuZ2V0VmFsdWUoKVxuICAgICAgPy5maW5kKChjKSA9PiBjLmNpZCA9PT0gbWVzc2FnZS5jaWQpO1xuXG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtVG9TdHJlYW1NZXNzYWdlKHJlc3BvbnNlLm1lc3NhZ2UsIGNoYW5uZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgYWN0aXZlIGNoYW5uZWxcbiAgICogQHBhcmFtIG1lc3NhZ2UgTWVzc2FnZSB0byBiZSBkZWxldGVkXG4gICAqL1xuICBhc3luYyBkZWxldGVNZXNzYWdlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy5tZXNzYWdlRGVsZXRlQ29uZmlybWF0aW9uSGFuZGxlcikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5tZXNzYWdlRGVsZXRlQ29uZmlybWF0aW9uSGFuZGxlcihtZXNzYWdlKTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LmRlbGV0ZU1lc3NhZ2UobWVzc2FnZS5pZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC5kZWxldGVNZXNzYWdlKG1lc3NhZ2UuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWRzIGZpbGVzIHRvIHRoZSBjaGFubmVsLiBJZiB5b3Ugd2FudCB0byBrbm93IG1vcmUgYWJvdXQgW2ZpbGUgdXBsb2Fkc10oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvZmlsZV91cGxvYWRzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KSBjaGVjayBvdXQgdGhlIHBsYXRmb3JtIGRvY3VtZW50YXRpb24uXG4gICAqIEBwYXJhbSB1cGxvYWRzIHRoZSBhdHRhY2htZW50cyB0byB1cGxvYWQgKG91dHB1dCBvZiB0aGUgW2BBdHRhY2htZW50U2VydmljZWBdKC4vQXR0YWNobWVudFNlcnZpY2UubWR4KSlcbiAgICogQHJldHVybnMgdGhlIHJlc3VsdCBvZiBmaWxlIHVwbG9hZCByZXF1ZXN0c1xuICAgKi9cbiAgYXN5bmMgdXBsb2FkQXR0YWNobWVudHMoXG4gICAgdXBsb2FkczogQXR0YWNobWVudFVwbG9hZFtdXG4gICk6IFByb21pc2U8QXR0YWNobWVudFVwbG9hZFtdPiB7XG4gICAgY29uc3QgcmVzdWx0OiBBdHRhY2htZW50VXBsb2FkW10gPSBbXTtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICBjb25zdCB1cGxvYWRSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgdXBsb2Fkcy5tYXAoKHVwbG9hZCkgPT5cbiAgICAgICAgdXBsb2FkLnR5cGUgPT09ICdpbWFnZSdcbiAgICAgICAgICA/IHRoaXMuY3VzdG9tSW1hZ2VVcGxvYWRSZXF1ZXN0XG4gICAgICAgICAgICA/IHRoaXMuY3VzdG9tSW1hZ2VVcGxvYWRSZXF1ZXN0KHVwbG9hZC5maWxlLCBjaGFubmVsKVxuICAgICAgICAgICAgOiBjaGFubmVsLnNlbmRJbWFnZSh1cGxvYWQuZmlsZSwgdXBsb2FkLmZpbGUubmFtZSwgdXBsb2FkLmZpbGUudHlwZSlcbiAgICAgICAgICA6IHRoaXMuY3VzdG9tRmlsZVVwbG9hZFJlcXVlc3RcbiAgICAgICAgICA/IHRoaXMuY3VzdG9tRmlsZVVwbG9hZFJlcXVlc3QodXBsb2FkLmZpbGUsIGNoYW5uZWwpXG4gICAgICAgICAgOiBjaGFubmVsLnNlbmRGaWxlKHVwbG9hZC5maWxlLCB1cGxvYWQuZmlsZS5uYW1lLCB1cGxvYWQuZmlsZS50eXBlKVxuICAgICAgKVxuICAgICk7XG4gICAgdXBsb2FkUmVzdWx0cy5mb3JFYWNoKCh1cGxvYWRSZXN1bHQsIGkpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSB1cGxvYWRzW2ldLmZpbGU7XG4gICAgICBjb25zdCB0eXBlID0gdXBsb2Fkc1tpXS50eXBlO1xuICAgICAgaWYgKHVwbG9hZFJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgc3RhdGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICB1cmw6IHVwbG9hZFJlc3VsdC52YWx1ZS5maWxlLFxuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuICAgICAgICAgIHRodW1iX3VybDogKHVwbG9hZFJlc3VsdC52YWx1ZSBhcyBhbnkpLnRodW1iX3VybCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcmVhc29uOiBBdHRhY2htZW50VXBsb2FkRXJyb3JSZWFzb24gPSAndW5rbm93bic7XG4gICAgICAgIGxldCBleHRyYURhdGE6IHsgcGFyYW06IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50ICovXG4gICAgICAgIGNvbnN0IG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCA9XG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuICAgICAgICAgIHVwbG9hZFJlc3VsdC5yZWFzb24ucmVzcG9uc2U/LmRhdGE/Lm1lc3NhZ2U7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQgKi9cbiAgICAgICAgY29uc3QgY29kZTogbnVtYmVyIHwgdW5kZWZpbmVkID1cbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4gICAgICAgICAgdXBsb2FkUmVzdWx0LnJlYXNvbi5yZXNwb25zZT8uZGF0YT8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IDIyKSB7XG4gICAgICAgICAgcmVhc29uID0gJ2ZpbGUtc2l6ZSc7XG4gICAgICAgICAgZXh0cmFEYXRhID0geyBwYXJhbTogL1xcZCtNQi8uZXhlYyhtZXNzYWdlIHx8ICcnKT8uWzBdIHx8ICcxMDBNQicgfTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBjb2RlID09PSA0ICYmXG4gICAgICAgICAgbWVzc2FnZT8udG9Mb3dlckNhc2UoKT8uaW5jbHVkZXMoJ2ZpbGUgZXh0ZW5zaW9uJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmVhc29uID0gJ2ZpbGUtZXh0ZW5zaW9uJztcbiAgICAgICAgICBleHRyYURhdGEgPSB7IHBhcmFtOiAvXFwuXFx3Ky8uZXhlYyhtZXNzYWdlKT8uWzBdIHx8ICcnIH07XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBzdGF0ZTogJ2Vycm9yJyxcbiAgICAgICAgICBlcnJvclJlYXNvbjogcmVhc29uLFxuICAgICAgICAgIGVycm9yRXh0cmFJbmZvOiBleHRyYURhdGEgPyBbZXh0cmFEYXRhXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYW4gdXBsb2FkZWQgZmlsZSBieSBVUkwuIElmIHlvdSB3YW50IHRvIGtub3cgbW9yZSBhYm91dCBbZmlsZSB1cGxvYWRzXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9maWxlX3VwbG9hZHMvP2xhbmd1YWdlPWphdmFzY3JpcHQpIGNoZWNrIG91dCB0aGUgcGxhdGZvcm0gZG9jdW1lbnRhdGlvblxuICAgKiBAcGFyYW0gYXR0YWNobWVudFVwbG9hZCBBdHRhY2htZW50IHRvIGJlIGRlbGV0ZWQgKG91dHB1dCBvZiB0aGUgW2BBdHRhY2htZW50U2VydmljZWBdKC4vQXR0YWNobWVudFNlcnZpY2UubWR4KSlcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUF0dGFjaG1lbnQoYXR0YWNobWVudFVwbG9hZDogQXR0YWNobWVudFVwbG9hZCkge1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgIGF3YWl0IChhdHRhY2htZW50VXBsb2FkLnR5cGUgPT09ICdpbWFnZSdcbiAgICAgID8gdGhpcy5jdXN0b21JbWFnZURlbGV0ZVJlcXVlc3RcbiAgICAgICAgPyB0aGlzLmN1c3RvbUltYWdlRGVsZXRlUmVxdWVzdChhdHRhY2htZW50VXBsb2FkLnVybCEsIGNoYW5uZWwpXG4gICAgICAgIDogY2hhbm5lbC5kZWxldGVJbWFnZShhdHRhY2htZW50VXBsb2FkLnVybCEpXG4gICAgICA6IHRoaXMuY3VzdG9tRmlsZURlbGV0ZVJlcXVlc3RcbiAgICAgID8gdGhpcy5jdXN0b21GaWxlRGVsZXRlUmVxdWVzdChhdHRhY2htZW50VXBsb2FkLnVybCEsIGNoYW5uZWwpXG4gICAgICA6IGNoYW5uZWwuZGVsZXRlRmlsZShhdHRhY2htZW50VXBsb2FkLnVybCEpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhdXRvY29tcGxldGUgb3B0aW9ucyBmb3IgY3VycmVudCBjaGFubmVsIG1lbWJlcnMuIElmIHRoZSBjaGFubmVsIGhhcyBsZXNzIHRoYW4gMTAwIG1lbWJlcnMsIGl0IHJldHVybnMgdGhlIGNoYW5uZWwgbWVtYmVycywgb3RoZXJ3aXNlIHNlbmRzIGEgW3NlYXJjaCByZXF1ZXN0XShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9xdWVyeV9tZW1iZXJzLz9sYW5ndWFnZT1qYXZhc2NyaXB0I3BhZ2luYXRpb24tYW5kLW9yZGVyaW5nKSB3aXRoIHRoZSBnaXZlbiBzZWFyY2ggdGVybS5cbiAgICogQHBhcmFtIHNlYXJjaFRlcm0gVGV4dCB0byBzZWFyY2ggZm9yIGluIHRoZSBuYW1lcyBvZiBtZW1iZXJzXG4gICAqIEByZXR1cm5zIFRoZSBsaXN0IG9mIG1lbWJlcnMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBmaWx0ZXJcbiAgICovXG4gIGFzeW5jIGF1dG9jb21wbGV0ZU1lbWJlcnMoc2VhcmNoVGVybTogc3RyaW5nKSB7XG4gICAgY29uc3QgYWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAoIWFjdGl2ZUNoYW5uZWwpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKGFjdGl2ZUNoYW5uZWwuc3RhdGUubWVtYmVycykubGVuZ3RoIDwgMTAwKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhhY3RpdmVDaGFubmVsLnN0YXRlLm1lbWJlcnMpLmZpbHRlcihcbiAgICAgICAgKG0pID0+IG0udXNlcj8uaWQgIT09IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VySUQhXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXNlYXJjaFRlcm0pIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYWN0aXZlQ2hhbm5lbC5xdWVyeU1lbWJlcnMoe1xuICAgICAgICBuYW1lOiB7ICRhdXRvY29tcGxldGU6IHNlYXJjaFRlcm0gfSxcbiAgICAgICAgaWQ6IHsgJG5lOiB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlcklEISB9LFxuICAgICAgfSBhcyBVc2VyRmlsdGVyczxUPik7IC8vIFRPRE86IGZpbmQgb3V0IHdoeSB3ZSBuZWVkIHR5cGVjYXN0IGhlcmVcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHJlc3VsdC5tZW1iZXJzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogW1J1bnMgYSBtZXNzYWdlIGFjdGlvbl0oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL3Jlc3QvI21lc3NhZ2VzLXJ1bm1lc3NhZ2VhY3Rpb24pIGluIHRoZSBjdXJyZW50IGNoYW5uZWwuIFVwZGF0ZXMgdGhlIG1lc3NhZ2UgbGlzdCBiYXNlZCBvbiB0aGUgYWN0aW9uIHJlc3VsdCAoaWYgbm8gbWVzc2FnZSBpcyByZXR1cm5lZCwgdGhlIG1lc3NhZ2Ugd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG1lc3NhZ2UgbGlzdCkuXG4gICAqIEBwYXJhbSBtZXNzYWdlSWRcbiAgICogQHBhcmFtIGZvcm1EYXRhXG4gICAqIEBwYXJhbSBwYXJlbnRNZXNzYWdlSWRcbiAgICovXG4gIGFzeW5jIHNlbmRBY3Rpb24oXG4gICAgbWVzc2FnZUlkOiBzdHJpbmcsXG4gICAgZm9ybURhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgcGFyZW50TWVzc2FnZUlkPzogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2hhbm5lbC5zZW5kQWN0aW9uKG1lc3NhZ2VJZCwgZm9ybURhdGEpO1xuICAgIGlmIChyZXNwb25zZT8ubWVzc2FnZSkge1xuICAgICAgY2hhbm5lbC5zdGF0ZS5hZGRNZXNzYWdlU29ydGVkKHtcbiAgICAgICAgLi4ucmVzcG9uc2UubWVzc2FnZSxcbiAgICAgICAgc3RhdHVzOiAncmVjZWl2ZWQnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBpc1RocmVhZFJlcGx5ID0gISFyZXNwb25zZS5tZXNzYWdlLnBhcmVudF9pZDtcbiAgICAgIGlzVGhyZWFkUmVwbHlcbiAgICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAgIC4uLmNoYW5uZWwuc3RhdGUudGhyZWFkc1tyZXNwb25zZS5tZXNzYWdlLnBhcmVudF9pZCFdLFxuICAgICAgICAgIF0pXG4gICAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLmNoYW5uZWwuc3RhdGUubWVzc2FnZXNdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hhbm5lbC5zdGF0ZS5yZW1vdmVNZXNzYWdlKHtcbiAgICAgICAgaWQ6IG1lc3NhZ2VJZCxcbiAgICAgICAgcGFyZW50X2lkOiBwYXJlbnRNZXNzYWdlSWQsXG4gICAgICB9KTtcbiAgICAgIGlmIChwYXJlbnRNZXNzYWdlSWQpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChcbiAgICAgICAgICBjaGFubmVsLnN0YXRlLnRocmVhZHNbdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0LmdldFZhbHVlKCkhXVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLmNoYW5uZWwuc3RhdGUubWVzc2FnZXNdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBvciBkZXNlbGVjdHMgdGhlIGN1cnJlbnQgbWVzc2FnZSB0byBxdW90ZSByZXBseSB0b1xuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzZWxlY3QsIGlmIGNhbGxlZCB3aXRoIGB1bmRlZmluZWRgLCBpdCBkZXNlbGVjdHMgdGhlIG1lc3NhZ2VcbiAgICovXG4gIHNlbGVjdE1lc3NhZ2VUb1F1b3RlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLm1lc3NhZ2VUb1F1b3RlU3ViamVjdC5uZXh0KG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBjaGFubmVsIHRvIHRoZSBjaGFubmVsIGxpc3RcbiAgICogVGhlIGNoYW5uZWwgd2lsbCBiZSBhZGRlZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjaGFubmVsIGxpc3RcbiAgICogQHBhcmFtIGNoYW5uZWxcbiAgICovXG4gIGFkZENoYW5uZWwoY2hhbm5lbDogQ2hhbm5lbDxUPikge1xuICAgIGlmICghdGhpcy5jaGFubmVscy5maW5kKChjKSA9PiBjLmNpZCA9PT0gY2hhbm5lbC5jaWQpKSB7XG4gICAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5uZXh0KFtjaGFubmVsLCAuLi50aGlzLmNoYW5uZWxzXSk7XG4gICAgICB0aGlzLndhdGNoRm9yQ2hhbm5lbEV2ZW50cyhjaGFubmVsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRNZXNzYWdlUmVxdWVzdChcbiAgICBwcmV2aWV3OiBNZXNzYWdlUmVzcG9uc2U8VD4gfCBTdHJlYW1NZXNzYWdlPFQ+LFxuICAgIGN1c3RvbURhdGE/OiBQYXJ0aWFsPFRbJ21lc3NhZ2VUeXBlJ10+LFxuICAgIGlzUmVzZW5kID0gZmFsc2VcbiAgKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgY29uc3QgaXNUaHJlYWRSZXBseSA9ICEhcHJldmlldy5wYXJlbnRfaWQ7XG4gICAgaXNUaHJlYWRSZXBseVxuICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAuLi5jaGFubmVsLnN0YXRlLnRocmVhZHNbcHJldmlldy5wYXJlbnRfaWQhXSxcbiAgICAgICAgXSlcbiAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLmNoYW5uZWwuc3RhdGUubWVzc2FnZXNdKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjaGFubmVsLnNlbmRNZXNzYWdlKHtcbiAgICAgICAgaWQ6IHByZXZpZXcuaWQsXG4gICAgICAgIHRleHQ6IHByZXZpZXcudGV4dCxcbiAgICAgICAgYXR0YWNobWVudHM6IHByZXZpZXcuYXR0YWNobWVudHMsXG4gICAgICAgIG1lbnRpb25lZF91c2VyczogcHJldmlldy5tZW50aW9uZWRfdXNlcnM/Lm1hcCgodSkgPT4gdS5pZCksXG4gICAgICAgIHBhcmVudF9pZDogcHJldmlldy5wYXJlbnRfaWQsXG4gICAgICAgIHF1b3RlZF9tZXNzYWdlX2lkOiBwcmV2aWV3LnF1b3RlZF9tZXNzYWdlX2lkLFxuICAgICAgICAuLi5jdXN0b21EYXRhLFxuICAgICAgfSBhcyBNZXNzYWdlPFQ+KTsgLy8gVE9ETzogZmluZCBvdXQgd2h5IHdlIG5lZWQgdHlwZWNhc3QgaGVyZVxuICAgICAgY2hhbm5lbC5zdGF0ZS5hZGRNZXNzYWdlU29ydGVkKFxuICAgICAgICB7XG4gICAgICAgICAgLi4ucmVzcG9uc2UubWVzc2FnZSxcbiAgICAgICAgICBzdGF0dXM6ICdyZWNlaXZlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgICBpc1RocmVhZFJlcGx5XG4gICAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgICAgICAuLi5jaGFubmVsLnN0YXRlLnRocmVhZHNbcHJldmlldy5wYXJlbnRfaWQhXSxcbiAgICAgICAgICBdKVxuICAgICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5jaGFubmVsLnN0YXRlLm1lc3NhZ2VzXSk7XG4gICAgICBsZXQgbWVzc2FnZXMhOiBTdHJlYW1NZXNzYWdlPFQ+W107XG4gICAgICAoaXNUaHJlYWRSZXBseSA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXMkIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXMkKVxuICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKChtKSA9PiAobWVzc2FnZXMgPSBtKSk7XG4gICAgICBjb25zdCBuZXdNZXNzYWdlID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV0hO1xuICAgICAgcmV0dXJuIG5ld01lc3NhZ2U7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc3Qgc3RyaW5nRXJyb3IgPSBKU09OLnN0cmluZ2lmeShlcnJvcik7XG4gICAgICBjb25zdCBwYXJzZWRFcnJvcjoge1xuICAgICAgICBzdGF0dXM/OiBudW1iZXI7XG4gICAgICAgIGNvZGU/OiBudW1iZXI7XG4gICAgICAgIHJlc3BvbnNlPzogeyBkYXRhPzogeyBtZXNzYWdlPzogc3RyaW5nIH0gfTtcbiAgICAgIH0gPSBzdHJpbmdFcnJvciA/IChKU09OLnBhcnNlKHN0cmluZ0Vycm9yKSBhcyB7IHN0YXR1cz86IG51bWJlciB9KSA6IHt9O1xuXG4gICAgICBsZXQgaXNBbHJlYWR5RXhpc3RzID0gZmFsc2U7XG4gICAgICBpZiAoaXNSZXNlbmQpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHBhcnNlZEVycm9yLnN0YXR1cyA9PT0gNDAwICYmXG4gICAgICAgICAgcGFyc2VkRXJyb3IuY29kZSA9PT0gNCAmJlxuICAgICAgICAgIHBhcnNlZEVycm9yPy5yZXNwb25zZT8uZGF0YT8ubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgaXNBbHJlYWR5RXhpc3RzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjaGFubmVsLnN0YXRlLmFkZE1lc3NhZ2VTb3J0ZWQoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi4ocHJldmlldyBhcyBNZXNzYWdlUmVzcG9uc2U8VD4pLFxuICAgICAgICAgIGVycm9yU3RhdHVzQ29kZTogaXNBbHJlYWR5RXhpc3RzXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBwYXJzZWRFcnJvci5zdGF0dXMgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHN0YXR1czogaXNBbHJlYWR5RXhpc3RzID8gJ3JlY2VpdmVkJyA6ICdmYWlsZWQnLFxuICAgICAgICB9LFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgaXNUaHJlYWRSZXBseVxuICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS50aHJlYWRzW3ByZXZpZXcucGFyZW50X2lkIV0sXG4gICAgICAgICAgXSlcbiAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlc10pO1xuICAgICAgbGV0IG1lc3NhZ2VzITogU3RyZWFtTWVzc2FnZTxUPltdO1xuICAgICAgKGlzVGhyZWFkUmVwbHkgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzJCA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJClcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgobSkgPT4gKG1lc3NhZ2VzID0gbSkpO1xuICAgICAgY29uc3QgbmV3TWVzc2FnZSA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdITtcbiAgICAgIHJldHVybiBuZXdNZXNzYWdlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBKdW1wcyB0byB0aGUgc2VsZWN0ZWQgbWVzc2FnZSBpbnNpZGUgdGhlIG1lc3NhZ2UgbGlzdCwgaWYgdGhlIG1lc3NhZ2UgaXMgbm90IHlldCBsb2FkZWQsIGl0J2xsIGxvYWQgdGhlIG1lc3NhZ2UgKGFuZCBpdCdzIHN1cnJvdW5kaW5ncykgZnJvbSB0aGUgQVBJLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBiZSBsb2FkZWQsICdsYXRlc3QnIG1lYW5zIGp1bXAgdG8gdGhlIGxhdGVzdCBtZXNzYWdlc1xuICAgKiBAcGFyYW0gcGFyZW50TWVzc2FnZUlkIFRoZSBJRCBvZiB0aGUgcGFyZW50IG1lc3NhZ2UgaWYgd2Ugd2FudCB0byBsb2FkIGEgdGhyZWFkIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIGp1bXBUb01lc3NhZ2UobWVzc2FnZUlkOiBzdHJpbmcsIHBhcmVudE1lc3NhZ2VJZD86IHN0cmluZykge1xuICAgIGNvbnN0IGFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFjdGl2ZUNoYW5uZWw/LnN0YXRlLmxvYWRNZXNzYWdlSW50b1N0YXRlKFxuICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgIHBhcmVudE1lc3NhZ2VJZFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VzID0gYWN0aXZlQ2hhbm5lbD8uc3RhdGUubWVzc2FnZXMgfHwgW107XG4gICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4ubWVzc2FnZXNdKTtcbiAgICAgIGlmIChwYXJlbnRNZXNzYWdlSWQpIHtcbiAgICAgICAgY29uc3QgcGFyZW50TWVzc2FnZSA9IG1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uaWQgPT09IHBhcmVudE1lc3NhZ2VJZCk7XG4gICAgICAgIHZvaWQgdGhpcy5zZXRBc0FjdGl2ZVBhcmVudE1lc3NhZ2UocGFyZW50TWVzc2FnZSwgJ3N0YXRlJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmp1bXBUb01lc3NhZ2VTdWJqZWN0Lm5leHQoe1xuICAgICAgICBpZDogbWVzc2FnZUlkLFxuICAgICAgICBwYXJlbnRJZDogcGFyZW50TWVzc2FnZUlkLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGRUZW1wb3JhcnlOb3RpZmljYXRpb24oJ01lc3NhZ2Ugbm90IGZvdW5kJyk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGlucyB0aGUgZ2l2ZW4gbWVzc2FnZSBpbiB0aGUgY2hhbm5lbFxuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgcGluTWVzc2FnZShtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+KSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ucGluTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGRUZW1wb3JhcnlOb3RpZmljYXRpb24oXG4gICAgICAgICdNZXNzYWdlIHBpbm5lZCcsXG4gICAgICAgICdzdWNjZXNzJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZFRlbXBvcmFyeU5vdGlmaWNhdGlvbihcbiAgICAgICAgJ0Vycm9yIHBpbm5pbmcgbWVzc2FnZSdcbiAgICAgICk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gbWVzc2FnZSBmcm9tIHBpbm5lZCBtZXNzYWdlc1xuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgdW5waW5NZXNzYWdlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz4pIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py51bnBpbk1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkVGVtcG9yYXJ5Tm90aWZpY2F0aW9uKFxuICAgICAgICAnTWVzc2FnZSB1bnBpbm5lZCcsXG4gICAgICAgICdzdWNjZXNzJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZFRlbXBvcmFyeU5vdGlmaWNhdGlvbihcbiAgICAgICAgJ0Vycm9yIHJlbW92aW5nIG1lc3NhZ2UgcGluJ1xuICAgICAgKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50OiBDbGllbnRFdmVudDxUPikge1xuICAgIHN3aXRjaCAoY2xpZW50RXZlbnQuZXZlbnRUeXBlKSB7XG4gICAgICBjYXNlICdjb25uZWN0aW9uLnJlY292ZXJlZCc6IHtcbiAgICAgICAgdm9pZCB0aGlzLm5nWm9uZS5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzU3RhdGVSZWNvdmVyeUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pc1N0YXRlUmVjb3ZlcnlJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5uZXh0UGFnZUNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBJZiBjaGFubmVsIGxpc3QgaXMgbm90IGluaXRlZCwgd2Ugc2V0IHRoZSBhY3RpdmUgY2hhbm5lbFxuICAgICAgICAgICAgY29uc3Qgc2hvdWxTZXRBY3RpdmVDaGFubmVsID1cbiAgICAgICAgICAgICAgdGhpcy5zaG91bGRTZXRBY3RpdmVDaGFubmVsICYmXG4gICAgICAgICAgICAgICF0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2hhbm5lbHMoc2hvdWxTZXRBY3RpdmVDaGFubmVsIHx8IGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgLy8gVGhyZWFkIG1lc3NhZ2VzIGFyZSBub3QgcmVmZXRjaGVkIHNvIGFjdGl2ZSB0aHJlYWQgZ2V0cyBkZXNlbGVjdGVkIHRvIGF2b2lkIGRpc3BsYXlpbmcgc3RhbGUgbWVzc2FnZXNcbiAgICAgICAgICAgICAgdm9pZCB0aGlzLnNldEFzQWN0aXZlUGFyZW50TWVzc2FnZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAvLyBVcGRhdGUgYW5kIHJlc2VsZWN0IG1lc3NhZ2UgdG8gcXVvdGVcbiAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVRvUXVvdGUgPSB0aGlzLm1lc3NhZ2VUb1F1b3RlU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICB0aGlzLnNldENoYW5uZWxTdGF0ZSh0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhKTtcbiAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VzITogU3RyZWFtTWVzc2FnZTxUPltdO1xuICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlcyRcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKG0pID0+IChtZXNzYWdlcyA9IG0pKTtcbiAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZE1lc3NhZ2VUb1F1b3RlID0gbWVzc2FnZXMuZmluZChcbiAgICAgICAgICAgICAgICAobSkgPT4gbS5pZCA9PT0gbWVzc2FnZVRvUXVvdGU/LmlkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmICh1cGRhdGVkTWVzc2FnZVRvUXVvdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdE1lc3NhZ2VUb1F1b3RlKHVwZGF0ZWRNZXNzYWdlVG9RdW90ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXNTdGF0ZVJlY292ZXJ5SW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgdGhpcy5pc1N0YXRlUmVjb3ZlcnlJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdub3RpZmljYXRpb24ubWVzc2FnZV9uZXcnOiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY3VzdG9tTmV3TWVzc2FnZU5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tTmV3TWVzc2FnZU5vdGlmaWNhdGlvbkhhbmRsZXIoXG4gICAgICAgICAgICAgIGNsaWVudEV2ZW50LFxuICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU5ld01lc3NhZ2VOb3RpZmljYXRpb24oY2xpZW50RXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbm90aWZpY2F0aW9uLmFkZGVkX3RvX2NoYW5uZWwnOiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY3VzdG9tQWRkZWRUb0NoYW5uZWxOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcihcbiAgICAgICAgICAgICAgY2xpZW50RXZlbnQsXG4gICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQWRkZWRUb0NoYW5uZWxOb3RpZmljYXRpb24oY2xpZW50RXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbm90aWZpY2F0aW9uLnJlbW92ZWRfZnJvbV9jaGFubmVsJzoge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmN1c3RvbVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tUmVtb3ZlZEZyb21DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcihcbiAgICAgICAgICAgICAgY2xpZW50RXZlbnQsXG4gICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUmVtb3ZlZEZyb21DaGFubmVsTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VzZXIudXBkYXRlZCc6IHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkQ2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzU3ViamVjdC5nZXRWYWx1ZSgpPy5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQuYWN0aXZlQ2hhbm5lbHNbYy5jaWRdKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQuYWN0aXZlQ2hhbm5lbHNbYy5jaWRdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dCh1cGRhdGVkQ2hhbm5lbHMpO1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgICAgaWYgKGFjdGl2ZUNoYW5uZWwpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dChcbiAgICAgICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LmFjdGl2ZUNoYW5uZWxzW1xuICAgICAgICAgICAgICAgIGFjdGl2ZUNoYW5uZWwuY2lkXG4gICAgICAgICAgICAgIF0gfHwgYWN0aXZlQ2hhbm5lbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFxuICAgICAgICAgICAgICBhY3RpdmVDaGFubmVsLnN0YXRlLm1lc3NhZ2VzLm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgICAgIG0ucmVhZEJ5ID0gZ2V0UmVhZEJ5KG0sIGFjdGl2ZUNoYW5uZWwpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLm0gfTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBhY3RpdmVQYXJlbnRNZXNzYWdlID1cbiAgICAgICAgICAgICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICBpZiAoYWN0aXZlUGFyZW50TWVzc2FnZSkge1xuICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGFjdGl2ZUNoYW5uZWwuc3RhdGUudGhyZWFkc1thY3RpdmVQYXJlbnRNZXNzYWdlXTtcbiAgICAgICAgICAgICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbLi4ubWVzc2FnZXNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFBpbm5lZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAgICAgLi4uYWN0aXZlQ2hhbm5lbC5zdGF0ZS5waW5uZWRNZXNzYWdlcyxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUmVtb3ZlZEZyb21DaGFubmVsTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50OiBDbGllbnRFdmVudDxUPikge1xuICAgIGNvbnN0IGNoYW5uZWxJZFRvQmVSZW1vdmVkID0gY2xpZW50RXZlbnQuZXZlbnQuY2hhbm5lbCEuY2lkO1xuICAgIHRoaXMucmVtb3ZlQ2hhbm5lbHNGcm9tQ2hhbm5lbExpc3QoW2NoYW5uZWxJZFRvQmVSZW1vdmVkXSwgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU5ld01lc3NhZ2VOb3RpZmljYXRpb24oY2xpZW50RXZlbnQ6IENsaWVudEV2ZW50PFQ+KSB7XG4gICAgaWYgKGNsaWVudEV2ZW50LmV2ZW50LmNoYW5uZWwpIHtcbiAgICAgIHZvaWQgdGhpcy5hZGRDaGFubmVsc0Zyb21Ob3RpZmljYXRpb24oW2NsaWVudEV2ZW50LmV2ZW50LmNoYW5uZWxdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50OiBDbGllbnRFdmVudDxUPikge1xuICAgIGlmIChjbGllbnRFdmVudC5ldmVudC5jaGFubmVsKSB7XG4gICAgICB2b2lkIHRoaXMuYWRkQ2hhbm5lbHNGcm9tTm90aWZpY2F0aW9uKFtjbGllbnRFdmVudC5ldmVudC5jaGFubmVsXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRDaGFubmVsc0Zyb21Ob3RpZmljYXRpb24oXG4gICAgY2hhbm5lbFJlc3BvbnNlczogQ2hhbm5lbFJlc3BvbnNlPFQ+W11cbiAgKSB7XG4gICAgbGV0IG5ld0NoYW5uZWxzOiBDaGFubmVsPFQ+W10gPSBbXTtcbiAgICBjb25zdCB3YXRjaFJlcXVlc3RzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuICAgIGNoYW5uZWxSZXNwb25zZXMuZm9yRWFjaCgoY2hhbm5lbFJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LmNoYW5uZWwoXG4gICAgICAgIGNoYW5uZWxSZXNwb25zZS50eXBlLFxuICAgICAgICBjaGFubmVsUmVzcG9uc2UuaWRcbiAgICAgICk7XG4gICAgICB3YXRjaFJlcXVlc3RzLnB1c2goY2hhbm5lbC53YXRjaCgpKTtcbiAgICAgIG5ld0NoYW5uZWxzLnB1c2goY2hhbm5lbCk7XG4gICAgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwod2F0Y2hSZXF1ZXN0cyk7XG4gICAgY29uc3QgY3VycmVudENoYW5uZWxzID0gdGhpcy5jaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKSB8fCBbXTtcbiAgICBuZXdDaGFubmVscyA9IG5ld0NoYW5uZWxzLmZpbHRlcihcbiAgICAgIChuZXdDaGFubmVsKSA9PiAhY3VycmVudENoYW5uZWxzLmZpbmQoKGMpID0+IGMuY2lkID09PSBuZXdDaGFubmVsLmNpZClcbiAgICApO1xuICAgIGlmIChuZXdDaGFubmVscy5sZW5ndGggPiAwKSB7XG4gICAgICBuZXdDaGFubmVscy5mb3JFYWNoKChjKSA9PiB0aGlzLndhdGNoRm9yQ2hhbm5lbEV2ZW50cyhjKSk7XG4gICAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5uZXh0KFsuLi5uZXdDaGFubmVscywgLi4uY3VycmVudENoYW5uZWxzXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVDaGFubmVsc0Zyb21DaGFubmVsTGlzdChcbiAgICBjaWRzOiBzdHJpbmdbXSxcbiAgICBzaG91bGRTdG9wV2F0Y2hpbmc6IGJvb2xlYW5cbiAgKSB7XG4gICAgY29uc3QgY2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzLmZpbHRlcigoYykgPT4gIWNpZHMuaW5jbHVkZXMoYy5jaWQgfHwgJycpKTtcbiAgICBpZiAoc2hvdWxkU3RvcFdhdGNoaW5nKSB7XG4gICAgICBjaWRzLmZvckVhY2goKGNpZCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGFubmVsU3Vic2NyaXB0aW9uc1tjaWRdKSB7XG4gICAgICAgICAgdGhpcy5jaGFubmVsU3Vic2NyaXB0aW9uc1tjaWRdKCk7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuY2hhbm5lbFN1YnNjcmlwdGlvbnMuY2lkO1xuICAgICAgICB9XG4gICAgICAgIHZvaWQgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LmFjdGl2ZUNoYW5uZWxzW1xuICAgICAgICAgIGNpZFxuICAgICAgICBdPy5zdG9wV2F0Y2hpbmcoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoY2hhbm5lbHMubGVuZ3RoIDwgdGhpcy5jaGFubmVscy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoY2hhbm5lbHMpO1xuICAgICAgaWYgKGNpZHMuaW5jbHVkZXModGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpPy5jaWQgfHwgJycpKSB7XG4gICAgICAgIGlmIChjaGFubmVscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5zZXRBc0FjdGl2ZUNoYW5uZWwoY2hhbm5lbHNbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaEZvckFjdGl2ZUNoYW5uZWxFdmVudHMoY2hhbm5lbDogQ2hhbm5lbDxUPikge1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ21lc3NhZ2UubmV3JywgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgZXZlbnQubWVzc2FnZSAmJiBldmVudC5tZXNzYWdlLnBhcmVudF9pZFxuICAgICAgICAgICAgPyBldmVudC5tZXNzYWdlLnBhcmVudF9pZCA9PT1cbiAgICAgICAgICAgICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0LmdldFZhbHVlKClcbiAgICAgICAgICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAgICAgICAgIC4uLmNoYW5uZWwuc3RhdGUudGhyZWFkc1tldmVudC5tZXNzYWdlLnBhcmVudF9pZF0sXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAgICAgICAuLi5jaGFubmVsLnN0YXRlLm1lc3NhZ2VzLFxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWwkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKChjKSA9PiB7XG4gICAgICAgICAgICBpZiAoYykge1xuICAgICAgICAgICAgICB0aGlzLm1hcmtSZWFkKGMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMudXBkYXRlTGF0ZXN0TWVzc2FnZXMoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCdtZXNzYWdlLnVwZGF0ZWQnLCAoZXZlbnQpID0+IHRoaXMubWVzc2FnZVVwZGF0ZWQoZXZlbnQpKVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgY2hhbm5lbC5vbignbWVzc2FnZS5kZWxldGVkJywgKGV2ZW50KSA9PiB0aGlzLm1lc3NhZ2VVcGRhdGVkKGV2ZW50KSlcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ3JlYWN0aW9uLm5ldycsIChlKSA9PiB0aGlzLm1lc3NhZ2VSZWFjdGlvbkV2ZW50UmVjZWl2ZWQoZSkpXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCdyZWFjdGlvbi5kZWxldGVkJywgKGUpID0+XG4gICAgICAgIHRoaXMubWVzc2FnZVJlYWN0aW9uRXZlbnRSZWNlaXZlZChlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgY2hhbm5lbC5vbigncmVhY3Rpb24udXBkYXRlZCcsIChlKSA9PlxuICAgICAgICB0aGlzLm1lc3NhZ2VSZWFjdGlvbkV2ZW50UmVjZWl2ZWQoZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ21lc3NhZ2UucmVhZCcsIChlKSA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgbGV0IGxhdGVzdE1lc3NhZ2UhOiBTdHJlYW1NZXNzYWdlO1xuICAgICAgICAgIGxldCBtZXNzYWdlcyE6IFN0cmVhbU1lc3NhZ2VbXTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlcyQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKG0pID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2VzID0gbTtcbiAgICAgICAgICAgIGxhdGVzdE1lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIWxhdGVzdE1lc3NhZ2UgfHwgIWUudXNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobGF0ZXN0TWVzc2FnZS5yZWFkQnkpIHtcbiAgICAgICAgICAgIGxhdGVzdE1lc3NhZ2UucmVhZEJ5LnNwbGljZSgwLCBsYXRlc3RNZXNzYWdlLnJlYWRCeS5sZW5ndGgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYXRlc3RNZXNzYWdlLnJlYWRCeSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsYXRlc3RNZXNzYWdlLnJlYWRCeS5wdXNoKC4uLmdldFJlYWRCeShsYXRlc3RNZXNzYWdlLCBjaGFubmVsKSk7XG4gICAgICAgICAgbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV0gPSB7IC4uLmxhdGVzdE1lc3NhZ2UgfTtcblxuICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5tZXNzYWdlc10pO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCd0eXBpbmcuc3RhcnQnLCAoZSkgPT5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuaGFuZGxlVHlwaW5nU3RhcnRFdmVudChlKSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ3R5cGluZy5zdG9wJywgKGUpID0+XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLmhhbmRsZVR5cGluZ1N0b3BFdmVudChlKSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgaWYgdXNlciBzdGFydGVkIHR5cGluZyBpbiB0aGUgYWN0aXZlIGNoYW5uZWxcbiAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lc3NhZ2UsIGlmIHVzZXIgaXMgdHlwaW5nIGluIGEgdGhyZWFkXG4gICAqL1xuICBhc3luYyB0eXBpbmdTdGFydGVkKHBhcmVudElkPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBhd2FpdCBhY3RpdmVDaGFubmVsPy5rZXlzdHJva2UocGFyZW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgaWYgdXNlciBzdG9wcGVkIHR5cGluZyBpbiB0aGUgYWN0aXZlIGNoYW5uZWxcbiAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lc3NhZ2UsIGlmIHVzZXIgd2VyZSB0eXBpbmcgaW4gYSB0aHJlYWRcbiAgICovXG4gIGFzeW5jIHR5cGluZ1N0b3BwZWQocGFyZW50SWQ/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGF3YWl0IGFjdGl2ZUNoYW5uZWw/LnN0b3BUeXBpbmcocGFyZW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGxpc3Qgb2YgY2hhbm5lbHNcbiAgICovXG4gIGdldCBjaGFubmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5jaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBhY3RpdmUgY2hhbm5lbFxuICAgKi9cbiAgZ2V0IGFjdGl2ZUNoYW5uZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgYWN0aXZlIGNoYW5uZWwgbWVzc2FnZXNcbiAgICovXG4gIGdldCBhY3RpdmVDaGFubmVsTWVzc2FnZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5nZXRWYWx1ZSgpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGFzdCAxMjAwIHJlYWN0aW9ucyBvZiBhIG1lc3NhZ2UgaW4gdGhlIGN1cnJlbnQgYWN0aXZlIGNoYW5uZWwuIElmIHlvdSBuZWVkIHRvIGZldGNoIG1vcmUgcmVhY3Rpb25zIHBsZWFzZSB1c2UgdGhlIFtmb2xsb3dpbmcgZW5kcG9pbnRdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3NlbmRfcmVhY3Rpb24vP2xhbmd1YWdlPWphdmFzY3JpcHQjcGFnaW5hdGluZy1yZWFjdGlvbnMpLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkXG4gICAqIEByZXR1cm5zIGFsbCByZWFjdGlvbnMgb2YgYSBtZXNzYWdlXG4gICAqL1xuICBhc3luYyBnZXRNZXNzYWdlUmVhY3Rpb25zKG1lc3NhZ2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVhY3Rpb25zOiBSZWFjdGlvblJlc3BvbnNlPFQ+W10gPSBbXTtcbiAgICBjb25zdCBsaW1pdCA9IDMwMDtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBjb25zdCByZWFjdGlvbnNMaW1pdCA9IENoYW5uZWxTZXJ2aWNlLk1BWF9NRVNTQUdFX1JFQUNUSU9OU19UT19GRVRDSDtcbiAgICBsZXQgbGFzdFBhZ2VTaXplID0gbGltaXQ7XG5cbiAgICB3aGlsZSAobGFzdFBhZ2VTaXplID09PSBsaW1pdCAmJiByZWFjdGlvbnMubGVuZ3RoIDwgcmVhY3Rpb25zTGltaXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hY3RpdmVDaGFubmVsPy5nZXRSZWFjdGlvbnMobWVzc2FnZUlkLCB7XG4gICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgIGxpbWl0LFxuICAgICAgICB9KTtcbiAgICAgICAgbGFzdFBhZ2VTaXplID0gcmVzcG9uc2U/LnJlYWN0aW9ucz8ubGVuZ3RoIHx8IDA7XG4gICAgICAgIGlmIChsYXN0UGFnZVNpemUgPiAwKSB7XG4gICAgICAgICAgcmVhY3Rpb25zLnB1c2goLi4ucmVzcG9uc2UhLnJlYWN0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0ICs9IGxhc3RQYWdlU2l6ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZFRlbXBvcmFyeU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAnRXJyb3IgbG9hZGluZyByZWFjdGlvbnMnXG4gICAgICAgICk7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZWFjdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIG1lc3NhZ2VVcGRhdGVkKGV2ZW50OiBFdmVudDxUPikge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICBjb25zdCBpc1RocmVhZFJlcGx5ID0gZXZlbnQubWVzc2FnZSAmJiBldmVudC5tZXNzYWdlLnBhcmVudF9pZDtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICBpZiAoIWNoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gR2V0IG1lc3NhZ2VzIGZyb20gc3RhdGUgYXMgbWVzc2FnZSBvcmRlciBjb3VsZCBjaGFuZ2UsIGFuZCBtZXNzYWdlIGNvdWxkJ3ZlIGJlZW4gZGVsZXRlZFxuICAgICAgY29uc3QgbWVzc2FnZXM6IEZvcm1hdE1lc3NhZ2VSZXNwb25zZTxUPltdID0gaXNUaHJlYWRSZXBseVxuICAgICAgICA/IGNoYW5uZWwuc3RhdGUudGhyZWFkc1tldmVudD8ubWVzc2FnZT8ucGFyZW50X2lkIHx8ICcnXVxuICAgICAgICA6IGNoYW5uZWwuc3RhdGUubWVzc2FnZXM7XG4gICAgICBpZiAoIW1lc3NhZ2VzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1lc3NhZ2VJbmRleCA9IG1lc3NhZ2VzLmZpbmRJbmRleChcbiAgICAgICAgKG0pID0+IG0uaWQgPT09IGV2ZW50Py5tZXNzYWdlPy5pZFxuICAgICAgKTtcbiAgICAgIGlmIChtZXNzYWdlSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGlzVGhyZWFkUmVwbHlcbiAgICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLm1lc3NhZ2VzXSlcbiAgICAgICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5tZXNzYWdlc10pO1xuICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxQaW5uZWRNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS5waW5uZWRNZXNzYWdlcyxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1lc3NhZ2VSZWFjdGlvbkV2ZW50UmVjZWl2ZWQoZTogRXZlbnQ8VD4pIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgY29uc3QgaXNUaHJlYWRNZXNzYWdlID0gZS5tZXNzYWdlICYmIGUubWVzc2FnZS5wYXJlbnRfaWQ7XG4gICAgICBsZXQgbWVzc2FnZXMhOiBTdHJlYW1NZXNzYWdlW107XG4gICAgICAoaXNUaHJlYWRNZXNzYWdlXG4gICAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlcyRcbiAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlcyRcbiAgICAgIClcbiAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgLnN1YnNjcmliZSgobSkgPT4gKG1lc3NhZ2VzID0gbSkpO1xuICAgICAgY29uc3QgbWVzc2FnZUluZGV4ID0gbWVzc2FnZXMuZmluZEluZGV4KChtKSA9PiBtLmlkID09PSBlPy5tZXNzYWdlPy5pZCk7XG4gICAgICBpZiAobWVzc2FnZUluZGV4ID09PSAtMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbbWVzc2FnZUluZGV4XTtcbiAgICAgIG1lc3NhZ2UucmVhY3Rpb25fY291bnRzID0geyAuLi5lLm1lc3NhZ2U/LnJlYWN0aW9uX2NvdW50cyB9O1xuICAgICAgbWVzc2FnZS5yZWFjdGlvbl9zY29yZXMgPSB7IC4uLmUubWVzc2FnZT8ucmVhY3Rpb25fc2NvcmVzIH07XG4gICAgICBtZXNzYWdlLmxhdGVzdF9yZWFjdGlvbnMgPSBbLi4uKGUubWVzc2FnZT8ubGF0ZXN0X3JlYWN0aW9ucyB8fCBbXSldO1xuICAgICAgbWVzc2FnZS5vd25fcmVhY3Rpb25zID0gWy4uLihlLm1lc3NhZ2U/Lm93bl9yZWFjdGlvbnMgfHwgW10pXTtcblxuICAgICAgbWVzc2FnZXNbbWVzc2FnZUluZGV4XSA9IHsgLi4ubWVzc2FnZSB9O1xuICAgICAgaXNUaHJlYWRNZXNzYWdlXG4gICAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbLi4ubWVzc2FnZXNdKVxuICAgICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5tZXNzYWdlc10pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRNZXNzYWdlKG1lc3NhZ2U6IE1lc3NhZ2VSZXNwb25zZTxUPikge1xuICAgIGNvbnN0IG0gPSBtZXNzYWdlIGFzIGFueSBhcyBGb3JtYXRNZXNzYWdlUmVzcG9uc2U8VD47XG4gICAgbS5waW5uZWRfYXQgPSBtZXNzYWdlLnBpbm5lZF9hdCA/IG5ldyBEYXRlKG1lc3NhZ2UucGlubmVkX2F0KSA6IG51bGw7XG4gICAgbS5jcmVhdGVkX2F0ID0gbWVzc2FnZS5jcmVhdGVkX2F0XG4gICAgICA/IG5ldyBEYXRlKG1lc3NhZ2UuY3JlYXRlZF9hdClcbiAgICAgIDogbmV3IERhdGUoKTtcbiAgICBtLnVwZGF0ZWRfYXQgPSBtZXNzYWdlLnVwZGF0ZWRfYXRcbiAgICAgID8gbmV3IERhdGUobWVzc2FnZS51cGRhdGVkX2F0KVxuICAgICAgOiBuZXcgRGF0ZSgpO1xuICAgIG1lc3NhZ2Uuc3RhdHVzID0gbWVzc2FnZS5zdGF0dXMgfHwgJ3JlY2VpdmVkJztcblxuICAgIHJldHVybiBtO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1N0cmVhbU1lc3NhZ2UoXG4gICAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IEZvcm1hdE1lc3NhZ2VSZXNwb25zZSB8IE1lc3NhZ2VSZXNwb25zZVxuICApOiBtZXNzYWdlIGlzIFN0cmVhbU1lc3NhZ2Uge1xuICAgIHJldHVybiAhIW1lc3NhZ2UucmVhZEJ5O1xuICB9XG5cbiAgcHJpdmF0ZSBpc0Zvcm1hdE1lc3NhZ2VSZXNwb25zZShcbiAgICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgRm9ybWF0TWVzc2FnZVJlc3BvbnNlIHwgTWVzc2FnZVJlc3BvbnNlXG4gICk6IG1lc3NhZ2UgaXMgRm9ybWF0TWVzc2FnZVJlc3BvbnNlIHtcbiAgICByZXR1cm4gbWVzc2FnZS5jcmVhdGVkX2F0IGluc3RhbmNlb2YgRGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcFdhdGNoRm9yQWN0aXZlQ2hhbm5lbEV2ZW50cyhjaGFubmVsOiBDaGFubmVsPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFjaGFubmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMuZm9yRWFjaCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zID0gW107XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHF1ZXJ5Q2hhbm5lbHMoXG4gICAgc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbDogYm9vbGVhbixcbiAgICByZWNvdmVyU3RhdGUgPSBmYWxzZVxuICApIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5jaGFubmVsUXVlcnlTdGF0ZVN1YmplY3QubmV4dCh7IHN0YXRlOiAnaW4tcHJvZ3Jlc3MnIH0pO1xuICAgICAgbGV0IGZpbHRlcnM6IENoYW5uZWxGaWx0ZXJzPFQ+O1xuICAgICAgbGV0IG9wdGlvbnM6IENoYW5uZWxPcHRpb25zO1xuICAgICAgaWYgKHRoaXMubmV4dFBhZ2VDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLm5leHRQYWdlQ29uZmlndXJhdGlvbi50eXBlID09PSAnZmlsdGVyJykge1xuICAgICAgICAgIGZpbHRlcnMgPSB7XG4gICAgICAgICAgICAuLi50aGlzLmZpbHRlcnMhLFxuICAgICAgICAgICAgLi4udGhpcy5uZXh0UGFnZUNvbmZpZ3VyYXRpb24ucGFnaW5hdGlvbkZpbHRlcixcbiAgICAgICAgICB9O1xuICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgYXMgQ2hhbm5lbE9wdGlvbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgIG9mZnNldDogdGhpcy5uZXh0UGFnZUNvbmZpZ3VyYXRpb24ub2Zmc2V0LFxuICAgICAgICAgIH07XG4gICAgICAgICAgZmlsdGVycyA9IHRoaXMuZmlsdGVycyE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbHRlcnMgPSB0aGlzLmZpbHRlcnMhO1xuICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zIGFzIENoYW5uZWxPcHRpb25zO1xuICAgICAgfVxuICAgICAgY29uc3QgY2hhbm5lbHMgPSBhd2FpdCB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQucXVlcnlDaGFubmVscyhcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgdGhpcy5zb3J0IHx8IHt9LFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgICAgdGhpcy5zZXROZXh0UGFnZUNvbmZpZ3VyYXRpb24oY2hhbm5lbHMpO1xuICAgICAgY2hhbm5lbHMuZm9yRWFjaCgoYykgPT4gdGhpcy53YXRjaEZvckNoYW5uZWxFdmVudHMoYykpO1xuICAgICAgY29uc3QgcHJldkNoYW5uZWxzID0gcmVjb3ZlclN0YXRlXG4gICAgICAgID8gW11cbiAgICAgICAgOiB0aGlzLmNoYW5uZWxzU3ViamVjdC5nZXRWYWx1ZSgpIHx8IFtdO1xuICAgICAgY29uc3QgZmlsdGVyZWRDaGFubmVscyA9IGNoYW5uZWxzLmZpbHRlcihcbiAgICAgICAgKGNoYW5uZWwpID0+XG4gICAgICAgICAgIXByZXZDaGFubmVscy5maW5kKFxuICAgICAgICAgICAgKGV4aXN0aW5nQ2hhbm5lbCkgPT4gZXhpc3RpbmdDaGFubmVsLmNpZCA9PT0gY2hhbm5lbC5jaWRcbiAgICAgICAgICApXG4gICAgICApO1xuICAgICAgbGV0IGN1cnJlbnRBY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgbGV0IGlzQ3VycmVudEFjdGl2ZUNoYW5uZWxEZXNlbGVjdGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBuZXh0Q2hhbm5lbHMgPSBbLi4ucHJldkNoYW5uZWxzLCAuLi5maWx0ZXJlZENoYW5uZWxzXTtcbiAgICAgIGlmIChcbiAgICAgICAgcmVjb3ZlclN0YXRlICYmXG4gICAgICAgIGN1cnJlbnRBY3RpdmVDaGFubmVsICYmXG4gICAgICAgICFmaWx0ZXJlZENoYW5uZWxzLmZpbmQoKGMpID0+IGMuY2lkID09PSBjdXJyZW50QWN0aXZlQ2hhbm5lbD8uY2lkKVxuICAgICAgKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY3VycmVudEFjdGl2ZUNoYW5uZWwud2F0Y2goKTtcbiAgICAgICAgICBuZXh0Q2hhbm5lbHMudW5zaGlmdChjdXJyZW50QWN0aXZlQ2hhbm5lbCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpc0N1cnJlbnRBY3RpdmVDaGFubmVsRGVzZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQobmV4dENoYW5uZWxzKTtcbiAgICAgIGlmIChpc0N1cnJlbnRBY3RpdmVDaGFubmVsRGVzZWxlY3RlZCkge1xuICAgICAgICB0aGlzLmRlc2VsZWN0QWN0aXZlQ2hhbm5lbCgpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBmaWx0ZXJlZENoYW5uZWxzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgIWN1cnJlbnRBY3RpdmVDaGFubmVsICYmXG4gICAgICAgIHNob3VsZFNldEFjdGl2ZUNoYW5uZWxcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNldEFzQWN0aXZlQ2hhbm5lbChmaWx0ZXJlZENoYW5uZWxzWzBdKTtcbiAgICAgICAgY3VycmVudEFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmhhc01vcmVDaGFubmVsc1N1YmplY3QubmV4dChjaGFubmVscy5sZW5ndGggPj0gdGhpcy5vcHRpb25zIS5saW1pdCEpO1xuICAgICAgdGhpcy5jaGFubmVsUXVlcnlTdGF0ZVN1YmplY3QubmV4dCh7IHN0YXRlOiAnc3VjY2VzcycgfSk7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMub3B0aW9ucz8ua2VlcEFsaXZlQ2hhbm5lbHMkT25FcnJvciAmJlxuICAgICAgICB0aGlzLmRpc21pc3NFcnJvck5vdGlmaWNhdGlvblxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZGlzbWlzc0Vycm9yTm90aWZpY2F0aW9uKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hhbm5lbHM7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zPy5rZWVwQWxpdmVDaGFubmVscyRPbkVycm9yKSB7XG4gICAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0LmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hhbm5lbFF1ZXJ5U3RhdGVTdWJqZWN0Lm5leHQoe1xuICAgICAgICBzdGF0ZTogJ2Vycm9yJyxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudFxuICAgICAgICBlcnJvcixcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaEZvckNoYW5uZWxFdmVudHMoY2hhbm5lbDogQ2hhbm5lbDxUPikge1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gY2hhbm5lbC5vbigoZXZlbnQ6IEV2ZW50PFQ+KSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICBjb25zdCB0eXBlID0gZXZlbnQudHlwZSBhcyBFdmVudFR5cGVzIHwgJ2NhcGFiaWxpdGllcy5jaGFuZ2VkJztcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdtZXNzYWdlLm5ldyc6IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VzdG9tTmV3TWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21OZXdNZXNzYWdlSGFuZGxlcihcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlU2V0dGVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZU5ld01lc3NhZ2UoZXZlbnQsIGNoYW5uZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NoYW5uZWwuaGlkZGVuJzoge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21DaGFubmVsSGlkZGVuSGFuZGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNoYW5uZWxIaWRkZW5IYW5kbGVyKFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMudGhyZWFkTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2VTZXR0ZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbm5lbEhpZGRlbihldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY2hhbm5lbC5kZWxldGVkJzoge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21DaGFubmVsRGVsZXRlZEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21DaGFubmVsRGVsZXRlZEhhbmRsZXIoXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUxpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy50aHJlYWRMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZVNldHRlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGFubmVsRGVsZXRlZChldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY2hhbm5lbC52aXNpYmxlJzoge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21DaGFubmVsVmlzaWJsZUhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21DaGFubmVsVmlzaWJsZUhhbmRsZXIoXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUxpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy50aHJlYWRMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZVNldHRlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGFubmVsVmlzaWJsZShldmVudCwgY2hhbm5lbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY2hhbm5lbC51cGRhdGVkJzoge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21DaGFubmVsVXBkYXRlZEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21DaGFubmVsVXBkYXRlZEhhbmRsZXIoXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUxpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy50aHJlYWRMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZVNldHRlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGFubmVsVXBkYXRlKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGFubmVsLnRydW5jYXRlZCc6IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VzdG9tQ2hhbm5lbFRydW5jYXRlZEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21DaGFubmVsVHJ1bmNhdGVkSGFuZGxlcihcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlU2V0dGVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5uZWxUcnVuY2F0ZShldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY2FwYWJpbGl0aWVzLmNoYW5nZWQnOiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNpZCA9IGV2ZW50LmNpZDtcbiAgICAgICAgICAgIGlmIChjaWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudENoYW5uZWxzID0gdGhpcy5jaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjdXJyZW50Q2hhbm5lbHM/LmZpbmRJbmRleCgoYykgPT4gYy5jaWQgPT09IGNpZCk7XG4gICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEgJiYgaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoWy4uLmN1cnJlbnRDaGFubmVscyFdKTtcbiAgICAgICAgICAgICAgICBpZiAoY2lkID09PSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk/LmNpZCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5uZXh0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKClcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNoYW5uZWxTdWJzY3JpcHRpb25zW2NoYW5uZWwuY2lkXSA9IHVuc3Vic2NyaWJlLnVuc3Vic2NyaWJlO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVOZXdNZXNzYWdlKF86IEV2ZW50LCBjaGFubmVsOiBDaGFubmVsPFQ+KSB7XG4gICAgY29uc3QgY2hhbm5lbEluZGV4ID0gdGhpcy5jaGFubmVscy5maW5kSW5kZXgoKGMpID0+IGMuY2lkID09PSBjaGFubmVsLmNpZCk7XG4gICAgdGhpcy5jaGFubmVscy5zcGxpY2UoY2hhbm5lbEluZGV4LCAxKTtcbiAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5uZXh0KFtjaGFubmVsLCAuLi50aGlzLmNoYW5uZWxzXSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNoYW5uZWxIaWRkZW4oZXZlbnQ6IEV2ZW50KSB7XG4gICAgdGhpcy5yZW1vdmVDaGFubmVsc0Zyb21DaGFubmVsTGlzdChbZXZlbnQuY2hhbm5lbCEuY2lkXSwgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDaGFubmVsRGVsZXRlZChldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLnJlbW92ZUNoYW5uZWxzRnJvbUNoYW5uZWxMaXN0KFtldmVudC5jaGFubmVsIS5jaWRdLCBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNoYW5uZWxWaXNpYmxlKGV2ZW50OiBFdmVudCwgY2hhbm5lbDogQ2hhbm5lbDxUPikge1xuICAgIGlmICghdGhpcy5jaGFubmVscy5maW5kKChjKSA9PiBjLmNpZCA9PT0gZXZlbnQuY2lkKSkge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+XG4gICAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMuY2hhbm5lbHMsIGNoYW5uZWxdKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNoYW5uZWxVcGRhdGUoZXZlbnQ6IEV2ZW50PFQ+KSB7XG4gICAgY29uc3QgY2hhbm5lbEluZGV4ID0gdGhpcy5jaGFubmVscy5maW5kSW5kZXgoXG4gICAgICAoYykgPT4gYy5jaWQgPT09IGV2ZW50LmNoYW5uZWwhLmNpZFxuICAgICk7XG4gICAgaWYgKGNoYW5uZWxJbmRleCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzW2NoYW5uZWxJbmRleF07XG4gICAgICBjb25zdCBub3RJbmNsdWRlZFByb3BlcmllcyA9IHtcbiAgICAgICAgaGlkZGVuOiBjaGFubmVsLmRhdGE/LmhpZGRlbiB8fCBmYWxzZSxcbiAgICAgICAgb3duX2NhcGFiaWxpdGllczogY2hhbm5lbC5kYXRhPy5vd25fY2FwYWJpbGl0aWVzIHx8IFtdLFxuICAgICAgfTtcbiAgICAgIGNoYW5uZWwuZGF0YSA9IHtcbiAgICAgICAgLi4uZXZlbnQuY2hhbm5lbCEsXG4gICAgICAgIC4uLm5vdEluY2x1ZGVkUHJvcGVyaWVzLFxuICAgICAgfTtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMuY2hhbm5lbHNdKTtcbiAgICAgIGlmIChldmVudC5jaGFubmVsPy5jaWQgPT09IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKT8uY2lkKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dChjaGFubmVsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNoYW5uZWxUcnVuY2F0ZShldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBjaGFubmVsSW5kZXggPSB0aGlzLmNoYW5uZWxzLmZpbmRJbmRleChcbiAgICAgIChjKSA9PiBjLmNpZCA9PT0gZXZlbnQuY2hhbm5lbCEuY2lkXG4gICAgKTtcbiAgICBpZiAoY2hhbm5lbEluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5jaGFubmVsc1tjaGFubmVsSW5kZXhdLnN0YXRlLm1lc3NhZ2VzID0gW107XG4gICAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5uZXh0KFsuLi50aGlzLmNoYW5uZWxzXSk7XG4gICAgICBpZiAoZXZlbnQuY2hhbm5lbD8uY2lkID09PSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk/LmNpZCkge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICAgICAgY2hhbm5lbC5zdGF0ZS5tZXNzYWdlcyA9IFtdO1xuICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0Lm5leHQoY2hhbm5lbCk7XG4gICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtdKTtcbiAgICAgICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY2FuU2VuZFJlYWRFdmVudHMoKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAoIWNoYW5uZWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY2FwYWJpbGl0ZXMgPSBjaGFubmVsLmRhdGE/Lm93bl9jYXBhYmlsaXRpZXMgYXMgc3RyaW5nW107XG4gICAgcmV0dXJuIGNhcGFiaWxpdGVzLmluZGV4T2YoJ3JlYWQtZXZlbnRzJykgIT09IC0xO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1Ub1N0cmVhbU1lc3NhZ2UoXG4gICAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPiB8IE1lc3NhZ2VSZXNwb25zZTxUPiB8IEZvcm1hdE1lc3NhZ2VSZXNwb25zZTxUPixcbiAgICBjaGFubmVsPzogQ2hhbm5lbDxUPlxuICApIHtcbiAgICBjb25zdCBpc1RocmVhZE1lc3NhZ2UgPSAhIW1lc3NhZ2UucGFyZW50X2lkO1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNTdHJlYW1NZXNzYWdlKG1lc3NhZ2UpICYmXG4gICAgICB0aGlzLmlzRm9ybWF0TWVzc2FnZVJlc3BvbnNlKG1lc3NhZ2UpXG4gICAgKSB7XG4gICAgICBpZiAobWVzc2FnZS5xdW90ZWRfbWVzc2FnZSkge1xuICAgICAgICBtZXNzYWdlLnF1b3RlZF9tZXNzYWdlLnRyYW5zbGF0aW9uID0gZ2V0TWVzc2FnZVRyYW5zbGF0aW9uKFxuICAgICAgICAgIG1lc3NhZ2UucXVvdGVkX21lc3NhZ2UsXG4gICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlclxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbWVzc2FnZS50cmFuc2xhdGlvbiA9IGdldE1lc3NhZ2VUcmFuc2xhdGlvbihcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXJcbiAgICAgICk7XG4gICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG1lc3NhZ2UucXVvdGVkX21lc3NhZ2UpIHtcbiAgICAgICAgbWVzc2FnZS5xdW90ZWRfbWVzc2FnZS50cmFuc2xhdGlvbiA9IGdldE1lc3NhZ2VUcmFuc2xhdGlvbihcbiAgICAgICAgICBtZXNzYWdlLnF1b3RlZF9tZXNzYWdlLFxuICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzRm9ybWF0TWVzc2FnZVJlc3BvbnNlKG1lc3NhZ2UpKSB7XG4gICAgICAgIG1lc3NhZ2UucmVhZEJ5ID0gaXNUaHJlYWRNZXNzYWdlXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogY2hhbm5lbFxuICAgICAgICAgID8gZ2V0UmVhZEJ5KG1lc3NhZ2UsIGNoYW5uZWwpXG4gICAgICAgICAgOiBbXTtcbiAgICAgICAgbWVzc2FnZS50cmFuc2xhdGlvbiA9IGdldE1lc3NhZ2VUcmFuc2xhdGlvbihcbiAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXJcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lc3NhZ2UgPSB0aGlzLmZvcm1hdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgIG1lc3NhZ2UucmVhZEJ5ID0gaXNUaHJlYWRNZXNzYWdlXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogY2hhbm5lbFxuICAgICAgICAgID8gZ2V0UmVhZEJ5KG1lc3NhZ2UsIGNoYW5uZWwpXG4gICAgICAgICAgOiBbXTtcbiAgICAgICAgbWVzc2FnZS50cmFuc2xhdGlvbiA9IGdldE1lc3NhZ2VUcmFuc2xhdGlvbihcbiAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXJcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUeXBpbmdTdGFydEV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGlmIChldmVudC51c2VyPy5pZCA9PT0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXI/LmlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlzVHlwaW5nSW5UaHJlYWQgPSAhIWV2ZW50LnBhcmVudF9pZDtcbiAgICBpZiAoXG4gICAgICBpc1R5cGluZ0luVGhyZWFkICYmXG4gICAgICBldmVudC5wYXJlbnRfaWQgIT09IHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5nZXRWYWx1ZSgpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN1YmplY3QgPSBpc1R5cGluZ0luVGhyZWFkXG4gICAgICA/IHRoaXMudXNlcnNUeXBpbmdJblRocmVhZFN1YmplY3RcbiAgICAgIDogdGhpcy51c2Vyc1R5cGluZ0luQ2hhbm5lbFN1YmplY3Q7XG4gICAgY29uc3QgdXNlcnM6IFVzZXJSZXNwb25zZVtdID0gc3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHVzZXIgPSBldmVudC51c2VyO1xuICAgIGlmICh1c2VyICYmICF1c2Vycy5maW5kKCh1KSA9PiB1LmlkID09PSB1c2VyLmlkKSkge1xuICAgICAgdXNlcnMucHVzaCh1c2VyKTtcbiAgICAgIHN1YmplY3QubmV4dChbLi4udXNlcnNdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVR5cGluZ1N0b3BFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCB1c2Vyc1R5cGluZ0luQ2hhbm5lbCA9IHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgY29uc3QgdXNlcnNUeXBpbmdJblRocmVhZCA9IHRoaXMudXNlcnNUeXBpbmdJblRocmVhZFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCB1c2VyID0gZXZlbnQudXNlcjtcbiAgICBpZiAodXNlciAmJiB1c2Vyc1R5cGluZ0luQ2hhbm5lbC5maW5kKCh1KSA9PiB1LmlkID09PSB1c2VyLmlkKSkge1xuICAgICAgdXNlcnNUeXBpbmdJbkNoYW5uZWwuc3BsaWNlKFxuICAgICAgICB1c2Vyc1R5cGluZ0luQ2hhbm5lbC5maW5kSW5kZXgoKHUpID0+IHUuaWQgPT09IHVzZXIuaWQpLFxuICAgICAgICAxXG4gICAgICApO1xuICAgICAgdGhpcy51c2Vyc1R5cGluZ0luQ2hhbm5lbFN1YmplY3QubmV4dChbLi4udXNlcnNUeXBpbmdJbkNoYW5uZWxdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHVzZXIgJiYgdXNlcnNUeXBpbmdJblRocmVhZC5maW5kKCh1KSA9PiB1LmlkID09PSB1c2VyLmlkKSkge1xuICAgICAgdXNlcnNUeXBpbmdJblRocmVhZC5zcGxpY2UoXG4gICAgICAgIHVzZXJzVHlwaW5nSW5UaHJlYWQuZmluZEluZGV4KCh1KSA9PiB1LmlkID09PSB1c2VyLmlkKSxcbiAgICAgICAgMVxuICAgICAgKTtcbiAgICAgIHRoaXMudXNlcnNUeXBpbmdJblRocmVhZFN1YmplY3QubmV4dChbLi4udXNlcnNUeXBpbmdJblRocmVhZF0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTGF0ZXN0TWVzc2FnZXMoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKFxuICAgICAgZXZlbnQubWVzc2FnZT8udXNlcj8uaWQgIT09IHRoaXMuY2hhdENsaWVudFNlcnZpY2U/LmNoYXRDbGllbnQudXNlcj8uaWRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGF0ZXN0TWVzc2FnZXMgPVxuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHNTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgaWYgKCFldmVudC5tZXNzYWdlPy5jcmVhdGVkX2F0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNoYW5uZWxJZCA9IGV2ZW50Py5tZXNzYWdlPy5jaWQ7XG4gICAgaWYgKCFjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZURhdGUgPSBuZXcgRGF0ZShldmVudC5tZXNzYWdlLmNyZWF0ZWRfYXQpO1xuICAgIGlmIChcbiAgICAgICFsYXRlc3RNZXNzYWdlc1tjaGFubmVsSWRdIHx8XG4gICAgICBsYXRlc3RNZXNzYWdlc1tjaGFubmVsSWRdPy5nZXRUaW1lKCkgPCBtZXNzYWdlRGF0ZS5nZXRUaW1lKClcbiAgICApIHtcbiAgICAgIGxhdGVzdE1lc3NhZ2VzW2NoYW5uZWxJZF0gPSBtZXNzYWdlRGF0ZTtcbiAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzU3ViamVjdC5uZXh0KHtcbiAgICAgICAgLi4ubGF0ZXN0TWVzc2FnZXMsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldENoYW5uZWxTdGF0ZShjaGFubmVsOiBDaGFubmVsPFQ+KSB7XG4gICAgY2hhbm5lbC5zdGF0ZS5tZXNzYWdlcy5mb3JFYWNoKChtKSA9PiB7XG4gICAgICBtLnJlYWRCeSA9IGdldFJlYWRCeShtLCBjaGFubmVsKTtcbiAgICAgIG0udHJhbnNsYXRpb24gPSBnZXRNZXNzYWdlVHJhbnNsYXRpb24oXG4gICAgICAgIG0sXG4gICAgICAgIGNoYW5uZWwsXG4gICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyXG4gICAgICApO1xuICAgICAgaWYgKG0ucXVvdGVkX21lc3NhZ2UpIHtcbiAgICAgICAgbS5xdW90ZWRfbWVzc2FnZS50cmFuc2xhdGlvbiA9IGdldE1lc3NhZ2VUcmFuc2xhdGlvbihcbiAgICAgICAgICBtLnF1b3RlZF9tZXNzYWdlLFxuICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm1hcmtSZWFkKGNoYW5uZWwpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5jaGFubmVsLnN0YXRlLm1lc3NhZ2VzXSk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsUGlubmVkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgLi4uY2hhbm5lbC5zdGF0ZS5waW5uZWRNZXNzYWdlcyxcbiAgICBdKTtcbiAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgIHRoaXMubWVzc2FnZVRvUXVvdGVTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdC5uZXh0KFtdKTtcbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWRTdWJqZWN0Lm5leHQoW10pO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrUmVhZChjaGFubmVsOiBDaGFubmVsPFQ+KSB7XG4gICAgaWYgKHRoaXMuY2FuU2VuZFJlYWRFdmVudHMgJiYgdGhpcy5zaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZCkge1xuICAgICAgdm9pZCBjaGFubmVsLm1hcmtSZWFkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXROZXh0UGFnZUNvbmZpZ3VyYXRpb24oY2hhbm5lbFF1ZXJ5UmVzdWx0OiBDaGFubmVsPFQ+W10pIHtcbiAgICBpZiAodGhpcy5jdXN0b21QYWdpbmF0b3IpIHtcbiAgICAgIHRoaXMubmV4dFBhZ2VDb25maWd1cmF0aW9uID0gdGhpcy5jdXN0b21QYWdpbmF0b3IoY2hhbm5lbFF1ZXJ5UmVzdWx0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uZXh0UGFnZUNvbmZpZ3VyYXRpb24gPSB7XG4gICAgICAgIHR5cGU6ICdvZmZzZXQnLFxuICAgICAgICBvZmZzZXQ6XG4gICAgICAgICAgKHRoaXMubmV4dFBhZ2VDb25maWd1cmF0aW9uPy50eXBlID09PSAnb2Zmc2V0J1xuICAgICAgICAgICAgPyB0aGlzLm5leHRQYWdlQ29uZmlndXJhdGlvbi5vZmZzZXRcbiAgICAgICAgICAgIDogMCkgKyBjaGFubmVsUXVlcnlSZXN1bHQubGVuZ3RoLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==