stream-chat-angular 4.0.0-theming-v2.7 → 4.0.0-theming-v2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/version.d.ts +1 -1
- package/bundles/stream-chat-angular.umd.js +65 -37
- package/bundles/stream-chat-angular.umd.js.map +1 -1
- package/esm2015/assets/version.js +2 -2
- package/esm2015/lib/attachment-list/attachment-list.component.js +5 -3
- package/esm2015/lib/attachment.service.js +3 -3
- package/esm2015/lib/channel.service.js +24 -16
- package/esm2015/lib/chat-client.service.js +7 -3
- package/esm2015/lib/message/message.component.js +13 -3
- package/esm2015/lib/message-actions-box/message-actions-box.component.js +2 -3
- package/esm2015/lib/message-input/message-input.component.js +1 -1
- package/esm2015/lib/types.js +1 -1
- package/fesm2015/stream-chat-angular.js +50 -27
- package/fesm2015/stream-chat-angular.js.map +1 -1
- package/lib/attachment-list/attachment-list.component.d.ts +5 -1
- package/lib/channel.service.d.ts +2 -1
- package/lib/chat-client.service.d.ts +2 -2
- package/lib/message/message.component.d.ts +1 -0
- package/lib/types.d.ts +1 -0
- package/package.json +1 -1
- package/src/assets/version.ts +1 -1
|
@@ -402,8 +402,9 @@ export class ChannelService {
|
|
|
402
402
|
* [Runs a message action](https://getstream.io/chat/docs/rest/#messages-runmessageaction) in the current channel. Updates the message list based on the action result (if no message is returned, the message will be removed from the message list).
|
|
403
403
|
* @param messageId
|
|
404
404
|
* @param formData
|
|
405
|
+
* @param parentMessageId
|
|
405
406
|
*/
|
|
406
|
-
sendAction(messageId, formData) {
|
|
407
|
+
sendAction(messageId, formData, parentMessageId) {
|
|
407
408
|
return __awaiter(this, void 0, void 0, function* () {
|
|
408
409
|
const channel = this.activeChannelSubject.getValue();
|
|
409
410
|
const response = yield channel.sendAction(messageId, formData);
|
|
@@ -417,17 +418,16 @@ export class ChannelService {
|
|
|
417
418
|
: this.activeChannelMessagesSubject.next([...channel.state.messages]);
|
|
418
419
|
}
|
|
419
420
|
else {
|
|
420
|
-
channel.state.removeMessage({
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
}
|
|
426
|
-
else if (this.activeThreadMessagesSubject
|
|
427
|
-
.getValue()
|
|
428
|
-
.find((m) => m.id === messageId)) {
|
|
421
|
+
channel.state.removeMessage({
|
|
422
|
+
id: messageId,
|
|
423
|
+
parent_id: parentMessageId,
|
|
424
|
+
});
|
|
425
|
+
if (parentMessageId) {
|
|
429
426
|
this.activeThreadMessagesSubject.next(channel.state.threads[this.activeParentMessageIdSubject.getValue()]);
|
|
430
427
|
}
|
|
428
|
+
else {
|
|
429
|
+
this.activeChannelMessagesSubject.next([...channel.state.messages]);
|
|
430
|
+
}
|
|
431
431
|
}
|
|
432
432
|
});
|
|
433
433
|
}
|
|
@@ -629,13 +629,21 @@ export class ChannelService {
|
|
|
629
629
|
}
|
|
630
630
|
messageUpdated(event) {
|
|
631
631
|
this.ngZone.run(() => {
|
|
632
|
+
var _a;
|
|
632
633
|
const isThreadReply = event.message && event.message.parent_id;
|
|
634
|
+
const channel = this.activeChannelSubject.getValue();
|
|
635
|
+
if (!channel) {
|
|
636
|
+
return;
|
|
637
|
+
}
|
|
638
|
+
// Get messages from state as message order could change, and message could've been deleted
|
|
633
639
|
const messages = isThreadReply
|
|
634
|
-
?
|
|
635
|
-
:
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
640
|
+
? channel.state.threads[((_a = event === null || event === void 0 ? void 0 : event.message) === null || _a === void 0 ? void 0 : _a.parent_id) || '']
|
|
641
|
+
: channel.state.messages;
|
|
642
|
+
if (!messages) {
|
|
643
|
+
return;
|
|
644
|
+
}
|
|
645
|
+
const messageIndex = messages.findIndex((m) => { var _a; return m.id === ((_a = event === null || event === void 0 ? void 0 : event.message) === null || _a === void 0 ? void 0 : _a.id); });
|
|
646
|
+
if (messageIndex !== -1) {
|
|
639
647
|
isThreadReply
|
|
640
648
|
? this.activeThreadMessagesSubject.next([...messages])
|
|
641
649
|
: this.activeChannelMessagesSubject.next([...messages]);
|
|
@@ -915,4 +923,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
|
|
|
915
923
|
providedIn: 'root',
|
|
916
924
|
}]
|
|
917
925
|
}], ctorParameters: function () { return [{ type: i1.ChatClientService }, { type: i0.NgZone }, { type: i2.NotificationService }]; } });
|
|
918
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL2NoYW5uZWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFFYixhQUFhLEdBRWQsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFpQmpFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXpELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7Ozs7QUFRdEM7O0dBRUc7QUFJSCxNQUFNLE9BQU8sY0FBYztJQThQekIsWUFDVSxpQkFBdUMsRUFDdkMsTUFBYyxFQUNkLG1CQUF3QztRQUZ4QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQXNCO1FBQ3ZDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBdEUxQyxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUMzQyxTQUFTLENBQ1YsQ0FBQztRQUNNLHlCQUFvQixHQUFHLElBQUksZUFBZSxDQUNoRCxTQUFTLENBQ1YsQ0FBQztRQUNNLGlDQUE0QixHQUFHLElBQUksZUFBZSxDQUV4RCxFQUFFLENBQUMsQ0FBQztRQUNFLDJCQUFzQixHQUFHLElBQUksYUFBYSxDQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELCtCQUEwQixHQUFrQyxFQUFFLENBQUM7UUFDL0QsaUNBQTRCLEdBQUcsSUFBSSxlQUFlLENBRXhELFNBQVMsQ0FBQyxDQUFDO1FBQ0wsZ0NBQTJCLEdBQUcsSUFBSSxlQUFlLENBRXZELEVBQUUsQ0FB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Q0FBQSxFQUN2RTtZQUNBLE9BQU87U0FDUjtRQUNELE1BQU0sY0FBYyxHQUNsQixJQUFJLENBQUMsd0NBQXdDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLENBQUEsTUFBQSxLQUFLLENBQUMsT0FBTywwQ0FBRSxVQUFVLENBQUEsRUFBRTtZQUM5QixPQUFPO1NBQ1I7UUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxPQUFPLDBDQUFFLEdBQUcsQ0FBQztRQUN0QyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2QsT0FBTztTQUNSO1FBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2RCxJQUNFLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztZQUMxQixDQUFBLE1BQUEsY0FBYyxDQUFDLFNBQVMsQ0FBQywwQ0FBRSxPQUFPLEVBQUUsSUFBRyxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQzVEO1lBQ0EsY0FBYyxDQUFDLFNBQVMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztZQUN4QyxJQUFJLENBQUMsd0NBQXdDLENBQUMsSUFBSSxtQkFDN0MsY0FBYyxFQUNqQixDQUFDO1NBQ0o7SUFDSCxDQUFDOzsyR0F6ekNVLGNBQWM7K0dBQWQsY0FBYyxjQUZiLE1BQU07MkZBRVAsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgT2JzZXJ2YWJsZSxcbiAgUmVwbGF5U3ViamVjdCxcbiAgU3Vic2NyaXB0aW9uLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgZmlyc3QsIG1hcCwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBBdHRhY2htZW50LFxuICBDaGFubmVsLFxuICBDaGFubmVsRmlsdGVycyxcbiAgQ2hhbm5lbE9wdGlvbnMsXG4gIENoYW5uZWxSZXNwb25zZSxcbiAgQ2hhbm5lbFNvcnQsXG4gIEV2ZW50LFxuICBGb3JtYXRNZXNzYWdlUmVzcG9uc2UsXG4gIE1lc3NhZ2UsXG4gIE1lc3NhZ2VSZXNwb25zZSxcbiAgVXBkYXRlZE1lc3NhZ2UsXG4gIFVzZXJGaWx0ZXJzLFxuICBVc2VyUmVzcG9uc2UsXG59IGZyb20gJ3N0cmVhbS1jaGF0JztcbmltcG9ydCB7IENoYXRDbGllbnRTZXJ2aWNlLCBDbGllbnRFdmVudCB9IGZyb20gJy4vY2hhdC1jbGllbnQuc2VydmljZSc7XG5pbXBvcnQgeyBjcmVhdGVNZXNzYWdlUHJldmlldyB9IGZyb20gJy4vbWVzc2FnZS1wcmV2aWV3JztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuL25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IGdldFJlYWRCeSB9IGZyb20gJy4vcmVhZC1ieSc7XG5pbXBvcnQge1xuICBBdHRhY2htZW50VXBsb2FkLFxuICBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzLFxuICBNZXNzYWdlUmVhY3Rpb25UeXBlLFxuICBTdHJlYW1NZXNzYWdlLFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBUaGUgYENoYW5uZWxTZXJ2aWNlYCBwcm92aWRlcyBkYXRhIGFuZCBpbnRlcmFjdGlvbiBmb3IgdGhlIGNoYW5uZWwgbGlzdCBhbmQgbWVzc2FnZSBsaXN0LlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFNlcnZpY2U8XG4gIFQgZXh0ZW5kcyBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzID0gRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljc1xuPiB7XG4gIC8qKlxuICAgKiBFbWl0cyBgZmFsc2VgIGlmIHRoZXJlIGFyZSBubyBtb3JlIHBhZ2VzIG9mIGNoYW5uZWxzIHRoYXQgY2FuIGJlIGxvYWRlZC5cbiAgICovXG4gIGhhc01vcmVDaGFubmVscyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgY3VycmVudGx5IGxvYWRlZCBhbmQgW3dhdGNoZWRdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3dhdGNoX2NoYW5uZWwvP2xhbmd1YWdlPWphdmFzY3JpcHQpIGNoYW5uZWwgbGlzdC5cbiAgICpcbiAgICogOjo6aW1wb3J0YW50XG4gICAqIElmIHlvdSB3YW50IHRvIHN1YnNjcmliZSB0byBjaGFubmVsIGV2ZW50cywgeW91IG5lZWQgdG8gbWFudWFsbHkgcmVlbnRlciBBbmd1bGFyJ3MgY2hhbmdlIGRldGVjdGlvbiB6b25lLCBvdXIgW0NoYW5nZSBkZXRlY3Rpb24gZ3VpZGVdKC4uL2NvbmNlcHRzL2NoYW5nZS1kZXRlY3Rpb24ubWR4KSBleHBsYWlucyB0aGlzIGluIGRldGFpbC5cbiAgICogOjo6XG4gICAqXG4gICAqICBBcGFydCBmcm9tIHBhZ2luYXRpb24sIHRoZSBjaGFubmVsIGxpc3QgaXMgYWxzbyB1cGRhdGVkIG9uIHRoZSBmb2xsb3dpbmcgZXZlbnRzOlxuICAgKlxuICAgKiAgfCBFdmVudCB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlZmF1bHQgYmVoYXZpb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEN1c3RvbSBoYW5kbGVyIHRvIG92ZXJyaWRlICAgICAgICAgICAgICAgICAgICB8XG4gICAqICB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAgICogIHwgYGNoYW5uZWwuZGVsZXRlZGAgICAgICAgICAgICAgICAgICAgfCBSZW1vdmUgY2hhbm5lbCBmcm9tIHRoZSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgY3VzdG9tQ2hhbm5lbERlbGV0ZWRIYW5kbGVyYCAgICAgICAgICAgICAgICAgfFxuICAgKiAgfCBgY2hhbm5lbC5oaWRkZW5gICAgICAgICAgICAgICAgICAgICB8IFJlbW92ZSBjaGFubmVsIGZyb20gdGhlIGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBjdXN0b21DaGFubmVsSGlkZGVuSGFuZGxlcmAgICAgICAgICAgICAgICAgICB8XG4gICAqICB8IGBjaGFubmVsLnRydW5jYXRlZGAgICAgICAgICAgICAgICAgIHwgVXBkYXRlcyB0aGUgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGN1c3RvbUNoYW5uZWxUcnVuY2F0ZWRIYW5kbGVyYCAgICAgICAgICAgICAgIHxcbiAgICogIHwgYGNoYW5uZWwudXBkYXRlZGAgICAgICAgICAgICAgICAgICAgfCBVcGRhdGVzIHRoZSBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgY3VzdG9tQ2hhbm5lbFVwZGF0ZWRIYW5kbGVyYCAgICAgICAgICAgICAgICAgfFxuICAgKiAgfCBgY2hhbm5lbC52aXNpYmxlYCAgICAgICAgICAgICAgICAgICB8IEFkZHMgdGhlIGNoYW5uZWwgdG8gdGhlIGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBjdXN0b21DaGFubmVsVmlzaWJsZUhhbmRsZXJgICAgICAgICAgICAgICAgICB8XG4gICAqICB8IGBtZXNzYWdlLm5ld2AgICAgICAgICAgICAgICAgICAgICAgIHwgTW92ZXMgdGhlIGNoYW5uZWwgdG8gdG9wIG9mIHRoZSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGN1c3RvbU5ld01lc3NhZ2VIYW5kbGVyYCAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogIHwgYG5vdGlmaWNhdGlvbi5hZGRlZF90b19jaGFubmVsYCAgICAgfCBBZGRzIHRoZSBuZXcgY2hhbm5lbCB0byB0aGUgdG9wIG9mIHRoZSBsaXN0IGFuZCBzdGFydHMgd2F0Y2hpbmcgaXQgfCBgY3VzdG9tQWRkZWRUb0NoYW5uZWxOb3RpZmljYXRpb25IYW5kbGVyYCAgICAgfFxuICAgKiAgfCBgbm90aWZpY2F0aW9uLm1lc3NhZ2VfbmV3YCAgICAgICAgICB8IEFkZHMgdGhlIG5ldyBjaGFubmVsIHRvIHRoZSB0b3Agb2YgdGhlIGxpc3QgYW5kIHN0YXJ0cyB3YXRjaGluZyBpdCB8IGBjdXN0b21OZXdNZXNzYWdlTm90aWZpY2F0aW9uSGFuZGxlcmAgICAgICAgICB8XG4gICAqICB8IGBub3RpZmljYXRpb24ucmVtb3ZlZF9mcm9tX2NoYW5uZWxgIHwgUmVtb3ZlcyB0aGUgY2hhbm5lbCBmcm9tIHRoZSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGN1c3RvbVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXJgIHxcbiAgICpcbiAgICogIEl0J3MgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBmaWx0ZXJzIGRvbid0IGFwcGx5IHRvIHVwZGF0ZXMgdG8gdGhlIGxpc3QgZnJvbSBldmVudHMuXG4gICAqXG4gICAqICBPdXIgcGxhdGZvcm0gZG9jdW1lbnRhdGlvbiBjb3ZlcnMgdGhlIHRvcGljIG9mIFtjaGFubmVsIGV2ZW50c10oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvZXZlbnRfb2JqZWN0Lz9sYW5ndWFnZT1qYXZhc2NyaXB0I2V2ZW50cykgaW4gZGVwdGguXG4gICAqL1xuICBjaGFubmVscyQ6IE9ic2VydmFibGU8Q2hhbm5lbDxUPltdIHwgdW5kZWZpbmVkPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNoYW5uZWwuXG4gICAqXG4gICAqIDo6OmltcG9ydGFudFxuICAgKiBJZiB5b3Ugd2FudCB0byBzdWJzY3JpYmUgdG8gY2hhbm5lbCBldmVudHMsIHlvdSBuZWVkIHRvIG1hbnVhbGx5IHJlZW50ZXIgQW5ndWxhcidzIGNoYW5nZSBkZXRlY3Rpb24gem9uZSwgb3VyIFtDaGFuZ2UgZGV0ZWN0aW9uIGd1aWRlXSguLi9jb25jZXB0cy9jaGFuZ2UtZGV0ZWN0aW9uLm1keCkgZXhwbGFpbnMgdGhpcyBpbiBkZXRhaWwuXG4gICAqIDo6OlxuICAgKlxuICAgKiBUaGUgYWN0aXZlIGNoYW5uZWwgd2lsbCBhbHdheXMgYmUgbWFya2VkIGFzIHJlYWQgd2hlbiBhIG5ldyBtZXNzYWdlIGlzIHJlY2VpdmVkXG4gICAqL1xuICBhY3RpdmVDaGFubmVsJDogT2JzZXJ2YWJsZTxDaGFubmVsPFQ+IHwgdW5kZWZpbmVkPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBsaXN0IG9mIGN1cnJlbnRseSBsb2FkZWQgbWVzc2FnZXMgb2YgdGhlIGFjdGl2ZSBjaGFubmVsLlxuICAgKi9cbiAgYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJDogT2JzZXJ2YWJsZTxTdHJlYW1NZXNzYWdlPFQ+W10+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGlkIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFyZW50IG1lc3NhZ2UuIElmIG5vIG1lc3NhZ2UgaXMgc2VsZWN0ZWQsIGl0IGVtaXRzIHVuZGVmaW5lZC5cbiAgICovXG4gIGFjdGl2ZVBhcmVudE1lc3NhZ2VJZCQ6IE9ic2VydmFibGU8c3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBsaXN0IG9mIGN1cnJlbnRseSBsb2FkZWQgdGhyZWFkIHJlcGxpZXMgYmVsb25naW5nIHRvIHRoZSBzZWxlY3RlZCBwYXJlbnQgbWVzc2FnZS4gSWYgdGhlcmUgaXMgbm8gY3VycmVudGx5IGFjdGl2ZSB0aHJlYWQgaXQgZW1pdHMgYW4gZW1wdHkgYXJyYXkuXG4gICAqL1xuICBhY3RpdmVUaHJlYWRNZXNzYWdlcyQ6IE9ic2VydmFibGU8U3RyZWFtTWVzc2FnZTxUPltdPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFyZW50IG1lc3NhZ2UuIElmIG5vIG1lc3NhZ2UgaXMgc2VsZWN0ZWQsIGl0IGVtaXRzIHVuZGVmaW5lZC5cbiAgICovXG4gIGFjdGl2ZVBhcmVudE1lc3NhZ2UkOiBPYnNlcnZhYmxlPFN0cmVhbU1lc3NhZ2U8VD4gfCB1bmRlZmluZWQ+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtZXNzYWdlIHRvIHF1b3RlXG4gICAqL1xuICBtZXNzYWdlVG9RdW90ZSQ6IE9ic2VydmFibGU8U3RyZWFtTWVzc2FnZTxUPiB8IHVuZGVmaW5lZD47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgbGlzdCBvZiB1c2VycyB0aGF0IGFyZSBjdXJyZW50bHkgdHlwaW5nIGluIHRoZSBjaGFubmVsIChjdXJyZW50IHVzZXIgaXMgbm90IGluY2x1ZGVkKVxuICAgKi9cbiAgdXNlcnNUeXBpbmdJbkNoYW5uZWwkOiBPYnNlcnZhYmxlPFVzZXJSZXNwb25zZTxUPltdPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBsaXN0IG9mIHVzZXJzIHRoYXQgYXJlIGN1cnJlbnRseSB0eXBpbmcgaW4gdGhlIGFjdGl2ZSB0aHJlYWQgKGN1cnJlbnQgdXNlciBpcyBub3QgaW5jbHVkZWQpXG4gICAqL1xuICB1c2Vyc1R5cGluZ0luVGhyZWFkJDogT2JzZXJ2YWJsZTxVc2VyUmVzcG9uc2U8VD5bXT47XG4gIC8qKlxuICAgKiBFbWl0cyBhIG1hcCB0aGF0IGNvbnRhaW5zIHRoZSBkYXRlIG9mIHRoZSBsYXRlc3QgbWVzc2FnZSBzZW50IGJ5IHRoZSBjdXJyZW50IHVzZXIgYnkgY2hhbm5lbHMgKHRoaXMgaXMgdXNlZCB0byBkZXRlY3QgaWYgc2xvdyBtb2RlIGNvdW50ZG93biBzaG91bGQgYmUgc3RhcnRlZClcbiAgICovXG4gIGxhdGVzdE1lc3NhZ2VEYXRlQnlVc2VyQnlDaGFubmVscyQ6IE9ic2VydmFibGU8eyBba2V5OiBzdHJpbmddOiBEYXRlIH0+O1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCBpZiBhIG5ldyBtZXNzYWdlIHJlY2VpdmVkIGZyb20gYSBjaGFubmVsIHRoYXQgaXMgbm90IGJlaW5nIHdhdGNoZWQsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSguL0NoYW5uZWxTZXJ2aWNlLm1keC8jY2hhbm5lbHMpXG4gICAqL1xuICBjdXN0b21OZXdNZXNzYWdlTm90aWZpY2F0aW9uSGFuZGxlcj86IChcbiAgICBjbGllbnRFdmVudDogQ2xpZW50RXZlbnQsXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChjaGFubmVsczogKENoYW5uZWw8VD4gfCBDaGFubmVsUmVzcG9uc2U8VD4pW10pID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIHRoZSB1c2VyIGlzIGFkZGVkIHRvIGEgY2hhbm5lbCwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC4vQ2hhbm5lbFNlcnZpY2UubWR4LyNjaGFubmVscylcbiAgICovXG4gIGN1c3RvbUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcj86IChcbiAgICBjbGllbnRFdmVudDogQ2xpZW50RXZlbnQsXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChjaGFubmVsczogKENoYW5uZWw8VD4gfCBDaGFubmVsUmVzcG9uc2U8VD4pW10pID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIHRoZSB1c2VyIGlzIHJlbW92ZWQgZnJvbSBhIGNoYW5uZWwsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSguL0NoYW5uZWxTZXJ2aWNlLm1keC8jY2hhbm5lbHMpXG4gICAqL1xuICBjdXN0b21SZW1vdmVkRnJvbUNoYW5uZWxOb3RpZmljYXRpb25IYW5kbGVyPzogKFxuICAgIGNsaWVudEV2ZW50OiBDbGllbnRFdmVudCxcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKGNoYW5uZWxzOiAoQ2hhbm5lbDxUPiB8IENoYW5uZWxSZXNwb25zZTxUPilbXSkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIHdoZW4gYSBjaGFubmVsIGlzIGRlbGV0ZWQsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSguL0NoYW5uZWxTZXJ2aWNlLm1keC8jY2hhbm5lbHMpXG4gICAqL1xuICBjdXN0b21DaGFubmVsRGVsZXRlZEhhbmRsZXI/OiAoXG4gICAgZXZlbnQ6IEV2ZW50LFxuICAgIGNoYW5uZWw6IENoYW5uZWw8VD4sXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChjaGFubmVsczogKENoYW5uZWw8VD4gfCBDaGFubmVsUmVzcG9uc2U8VD4pW10pID0+IHZvaWQsXG4gICAgbWVzc2FnZUxpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZTxUPltdKSA9PiB2b2lkLFxuICAgIHRocmVhZExpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZTxUPltdKSA9PiB2b2lkLFxuICAgIHBhcmVudE1lc3NhZ2VTZXR0ZXI6IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPFQ+IHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgd2hlbiBhIGNoYW5uZWwgaXMgdXBkYXRlZCwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC4vQ2hhbm5lbFNlcnZpY2UubWR4LyNjaGFubmVscylcbiAgICovXG4gIGN1c3RvbUNoYW5uZWxVcGRhdGVkSGFuZGxlcj86IChcbiAgICBldmVudDogRXZlbnQsXG4gICAgY2hhbm5lbDogQ2hhbm5lbDxUPixcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKGNoYW5uZWxzOiAoQ2hhbm5lbDxUPiB8IENoYW5uZWxSZXNwb25zZTxUPilbXSkgPT4gdm9pZCxcbiAgICBtZXNzYWdlTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgdGhyZWFkTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgcGFyZW50TWVzc2FnZVNldHRlcjogKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIGEgY2hhbm5lbCBpcyB0cnVuY2F0ZWQsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSguL0NoYW5uZWxTZXJ2aWNlLm1keC8jY2hhbm5lbHMpXG4gICAqL1xuICBjdXN0b21DaGFubmVsVHJ1bmNhdGVkSGFuZGxlcj86IChcbiAgICBldmVudDogRXZlbnQsXG4gICAgY2hhbm5lbDogQ2hhbm5lbDxUPixcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKGNoYW5uZWxzOiAoQ2hhbm5lbDxUPiB8IENoYW5uZWxSZXNwb25zZTxUPilbXSkgPT4gdm9pZCxcbiAgICBtZXNzYWdlTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlPFQ+W10pID0+IHZvaWQsXG4gICAgdGhyZWFkTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlPFQ+W10pID0+IHZvaWQsXG4gICAgcGFyZW50TWVzc2FnZVNldHRlcjogKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U8VD4gfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIGEgY2hhbm5lbCBiZWNvbWVzIGhpZGRlbiwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC4vQ2hhbm5lbFNlcnZpY2UubWR4LyNjaGFubmVscylcbiAgICovXG4gIGN1c3RvbUNoYW5uZWxIaWRkZW5IYW5kbGVyPzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBjaGFubmVsOiBDaGFubmVsPFQ+LFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoY2hhbm5lbHM6IChDaGFubmVsPFQ+IHwgQ2hhbm5lbFJlc3BvbnNlPFQ+KVtdKSA9PiB2b2lkLFxuICAgIG1lc3NhZ2VMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2U8VD5bXSkgPT4gdm9pZCxcbiAgICB0aHJlYWRMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2U8VD5bXSkgPT4gdm9pZCxcbiAgICBwYXJlbnRNZXNzYWdlU2V0dGVyOiAobWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPiB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIHdoZW4gYSBjaGFubmVsIGJlY29tZXMgdmlzaWJsZSwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC4vQ2hhbm5lbFNlcnZpY2UubWR4LyNjaGFubmVscylcbiAgICovXG4gIGN1c3RvbUNoYW5uZWxWaXNpYmxlSGFuZGxlcj86IChcbiAgICBldmVudDogRXZlbnQsXG4gICAgY2hhbm5lbDogQ2hhbm5lbDxUPixcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKGNoYW5uZWxzOiAoQ2hhbm5lbDxUPiB8IENoYW5uZWxSZXNwb25zZTxUPilbXSkgPT4gdm9pZCxcbiAgICBtZXNzYWdlTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlPFQ+W10pID0+IHZvaWQsXG4gICAgdGhyZWFkTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlPFQ+W10pID0+IHZvaWQsXG4gICAgcGFyZW50TWVzc2FnZVNldHRlcjogKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U8VD4gfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCBpZiBhIG5ldyBtZXNzYWdlIHJlY2VpdmVkIGZyb20gYSBjaGFubmVsIHRoYXQgaXMgYmVpbmcgd2F0Y2hlZCwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC4vQ2hhbm5lbFNlcnZpY2UubWR4LyNjaGFubmVscylcbiAgICovXG4gIGN1c3RvbU5ld01lc3NhZ2VIYW5kbGVyPzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBjaGFubmVsOiBDaGFubmVsPFQ+LFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoY2hhbm5lbHM6IChDaGFubmVsPFQ+IHwgQ2hhbm5lbFJlc3BvbnNlPFQ+KVtdKSA9PiB2b2lkLFxuICAgIG1lc3NhZ2VMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2U8VD5bXSkgPT4gdm9pZCxcbiAgICB0aHJlYWRMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2U8VD5bXSkgPT4gdm9pZCxcbiAgICBwYXJlbnRNZXNzYWdlU2V0dGVyOiAobWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPiB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGZpbGUgdXBsb2FkIHJlcXVlc3QgLSB5b3UgY2FuIHVzZSB0aGlzIHRvIHVwbG9hZCBmaWxlcyB0byB5b3VyIG93biBDRE5cbiAgICovXG4gIGN1c3RvbUZpbGVVcGxvYWRSZXF1ZXN0PzogKFxuICAgIGZpbGU6IEZpbGUsXG4gICAgY2hhbm5lbDogQ2hhbm5lbDxUPlxuICApID0+IFByb21pc2U8eyBmaWxlOiBzdHJpbmcgfT47XG4gIC8qKlxuICAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGltYWdlIHVwbG9hZCByZXF1ZXN0IC0geW91IGNhbiB1c2UgdGhpcyB0byB1cGxvYWQgaW1hZ2VzIHRvIHlvdXIgb3duIENETlxuICAgKi9cbiAgY3VzdG9tSW1hZ2VVcGxvYWRSZXF1ZXN0PzogKFxuICAgIGZpbGU6IEZpbGUsXG4gICAgY2hhbm5lbDogQ2hhbm5lbDxUPlxuICApID0+IFByb21pc2U8eyBmaWxlOiBzdHJpbmcgfT47XG4gIC8qKlxuICAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGZpbGUgZGVsZXRlIHJlcXVlc3QgLSBvdmVycmlkZSB0aGlzIGlmIHlvdSB1c2UgeW91ciBvd24gQ0ROXG4gICAqL1xuICBjdXN0b21GaWxlRGVsZXRlUmVxdWVzdD86ICh1cmw6IHN0cmluZywgY2hhbm5lbDogQ2hhbm5lbDxUPikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaW1hZ2UgZGVsZXRlIHJlcXVlc3QgLSBvdmVycmlkZSB0aGlzIGlmIHlvdSB1c2UgeW91ciBvd24gQ0ROXG4gICAqL1xuICBjdXN0b21JbWFnZURlbGV0ZVJlcXVlc3Q/OiAoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgY2hhbm5lbDogQ2hhbm5lbDxUPlxuICApID0+IFByb21pc2U8dm9pZD47XG4gIHByaXZhdGUgY2hhbm5lbHNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGFubmVsPFQ+W10gfCB1bmRlZmluZWQ+KFxuICAgIHVuZGVmaW5lZFxuICApO1xuICBwcml2YXRlIGFjdGl2ZUNoYW5uZWxTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGFubmVsPFQ+IHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcbiAgcHJpdmF0ZSBhY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICAoU3RyZWFtTWVzc2FnZTxUPiB8IE1lc3NhZ2VSZXNwb25zZTxUPiB8IEZvcm1hdE1lc3NhZ2VSZXNwb25zZTxUPilbXVxuICA+KFtdKTtcbiAgcHJpdmF0ZSBoYXNNb3JlQ2hhbm5lbHNTdWJqZWN0ID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oMSk7XG4gIHByaXZhdGUgYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnM6IHsgdW5zdWJzY3JpYmU6ICgpID0+IHZvaWQgfVtdID0gW107XG4gIHByaXZhdGUgYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgc3RyaW5nIHwgdW5kZWZpbmVkXG4gID4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBhY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIChTdHJlYW1NZXNzYWdlPFQ+IHwgTWVzc2FnZVJlc3BvbnNlPFQ+IHwgRm9ybWF0TWVzc2FnZVJlc3BvbnNlPFQ+KVtdXG4gID4oW10pO1xuICBwcml2YXRlIGxhdGVzdE1lc3NhZ2VEYXRlQnlVc2VyQnlDaGFubmVsc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHtcbiAgICBba2V5OiBzdHJpbmddOiBEYXRlO1xuICB9Pih7fSk7XG4gIHByaXZhdGUgZmlsdGVyczogQ2hhbm5lbEZpbHRlcnM8VD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc29ydDogQ2hhbm5lbFNvcnQ8VD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgb3B0aW9uczogQ2hhbm5lbE9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZVBhZ2VTaXplID0gMjU7XG4gIHByaXZhdGUgbWVzc2FnZVRvUXVvdGVTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBTdHJlYW1NZXNzYWdlPFQ+IHwgdW5kZWZpbmVkXG4gID4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSB1c2Vyc1R5cGluZ0luQ2hhbm5lbFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFVzZXJSZXNwb25zZTxUPltdPihcbiAgICBbXVxuICApO1xuICBwcml2YXRlIHVzZXJzVHlwaW5nSW5UaHJlYWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVc2VyUmVzcG9uc2U8VD5bXT4oXG4gICAgW11cbiAgKTtcbiAgcHJpdmF0ZSBfc2hvdWxkTWFya0FjdGl2ZUNoYW5uZWxBc1JlYWQgPSB0cnVlO1xuICBwcml2YXRlIHNob3VsZFNldEFjdGl2ZUNoYW5uZWw6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgY2xpZW50RXZlbnRzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaXNTdGF0ZVJlY292ZXJ5SW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgY2hhbm5lbExpc3RTZXR0ZXIgPSAoXG4gICAgY2hhbm5lbHM6IChDaGFubmVsPFQ+IHwgQ2hhbm5lbFJlc3BvbnNlPFQ+KVtdXG4gICkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRDaGFubmVscyA9IHRoaXMuY2hhbm5lbHNTdWJqZWN0LmdldFZhbHVlKCkgfHwgW107XG4gICAgY29uc3QgbmV3Q2hhbm5lbHMgPSBjaGFubmVscy5maWx0ZXIoXG4gICAgICAoYykgPT4gIWN1cnJlbnRDaGFubmVscy5maW5kKChjaGFubmVsKSA9PiBjaGFubmVsLmNpZCA9PT0gYy5jaWQpXG4gICAgKTtcbiAgICBjb25zdCBkZWxldGVkQ2hhbm5lbHMgPSBjdXJyZW50Q2hhbm5lbHMuZmlsdGVyKFxuICAgICAgKGMpID0+ICFjaGFubmVscz8uZmluZCgoY2hhbm5lbCkgPT4gY2hhbm5lbC5jaWQgPT09IGMuY2lkKVxuICAgICk7XG4gICAgdGhpcy5hZGRDaGFubmVsc0Zyb21Ob3RpZmljYXRpb24obmV3Q2hhbm5lbHMgYXMgQ2hhbm5lbFJlc3BvbnNlPFQ+W10pO1xuICAgIHRoaXMucmVtb3ZlQ2hhbm5lbHNGcm9tQ2hhbm5lbExpc3QoZGVsZXRlZENoYW5uZWxzLm1hcCgoYykgPT4gYy5jaWQpKTtcbiAgICBpZiAoIW5ld0NoYW5uZWxzLmxlbmd0aCAmJiAhZGVsZXRlZENoYW5uZWxzLmxlbmd0aCkge1xuICAgICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dChjaGFubmVscyBhcyBDaGFubmVsPFQ+W10pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG1lc3NhZ2VMaXN0U2V0dGVyID0gKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlPFQ+W10pID0+IHtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChtZXNzYWdlcyk7XG4gIH07XG5cbiAgcHJpdmF0ZSB0aHJlYWRMaXN0U2V0dGVyID0gKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlPFQ+W10pID0+IHtcbiAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KG1lc3NhZ2VzKTtcbiAgfTtcblxuICBwcml2YXRlIHBhcmVudE1lc3NhZ2VTZXR0ZXIgPSAobWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPiB8IHVuZGVmaW5lZCkgPT4ge1xuICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5uZXh0KG1lc3NhZ2U/LmlkKTtcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYXRDbGllbnRTZXJ2aWNlOiBDaGF0Q2xpZW50U2VydmljZTxUPixcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZVxuICApIHtcbiAgICB0aGlzLmNoYW5uZWxzJCA9IHRoaXMuY2hhbm5lbHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbCQgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJCA9IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5waXBlKFxuICAgICAgbWFwKChtZXNzYWdlcykgPT4ge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT5cbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybVRvU3RyZWFtTWVzc2FnZShtZXNzYWdlLCBjaGFubmVsKVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuaGFzTW9yZUNoYW5uZWxzJCA9IHRoaXMuaGFzTW9yZUNoYW5uZWxzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZCQgPVxuICAgICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXMkID0gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QucGlwZShcbiAgICAgIG1hcCgobWVzc2FnZXMpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgICAgIHJldHVybiBtZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+XG4gICAgICAgICAgdGhpcy50cmFuc2Zvcm1Ub1N0cmVhbU1lc3NhZ2UobWVzc2FnZSwgY2hhbm5lbClcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2UkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlcyQsXG4gICAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZCQsXG4gICAgXSkucGlwZShcbiAgICAgIG1hcChcbiAgICAgICAgKFttZXNzYWdlcywgcGFyZW50TWVzc2FnZUlkXTogW1xuICAgICAgICAgIFN0cmVhbU1lc3NhZ2VbXSxcbiAgICAgICAgICBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAgICAgXSkgPT4ge1xuICAgICAgICAgIGlmICghcGFyZW50TWVzc2FnZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZXMuZmluZCgobSkgPT4gbS5pZCA9PT0gcGFyZW50TWVzc2FnZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBzaGFyZVJlcGxheSgpXG4gICAgKTtcbiAgICB0aGlzLm1lc3NhZ2VUb1F1b3RlJCA9IHRoaXMubWVzc2FnZVRvUXVvdGVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jb25uZWN0aW9uU3RhdGUkXG4gICAgICAucGlwZShmaWx0ZXIoKHMpID0+IHMgPT09ICdvbmxpbmUnKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB2b2lkIHRoaXMuc2V0QXNBY3RpdmVQYXJlbnRNZXNzYWdlKHVuZGVmaW5lZCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWwkID1cbiAgICAgIHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWxTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMudXNlcnNUeXBpbmdJblRocmVhZCQgPSB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMubGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzJCA9XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2VEYXRlQnlVc2VyQnlDaGFubmVsc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogSWYgc2V0IHRvIGZhbHNlLCByZWFkIGV2ZW50cyB3b24ndCBiZSBzZW50IGFzIG5ldyBtZXNzYWdlcyBhcmUgcmVjZWl2ZWQuIElmIHNldCB0byB0cnVlIGFjdGl2ZSBjaGFubmVsIChpZiBhbnkpIHdpbGwgaW1tZWRpYXRlbHkgYmUgbWFya2VkIGFzIHJlYWQuXG4gICAqL1xuICBnZXQgc2hvdWxkTWFya0FjdGl2ZUNoYW5uZWxBc1JlYWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nob3VsZE1hcmtBY3RpdmVDaGFubmVsQXNSZWFkO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHNldCB0byBmYWxzZSwgcmVhZCBldmVudHMgd29uJ3QgYmUgc2VudCBhcyBuZXcgbWVzc2FnZXMgYXJlIHJlY2VpdmVkLiBJZiBzZXQgdG8gdHJ1ZSBhY3RpdmUgY2hhbm5lbCAoaWYgYW55KSB3aWxsIGltbWVkaWF0ZWx5IGJlIG1hcmtlZCBhcyByZWFkLlxuICAgKi9cbiAgc2V0IHNob3VsZE1hcmtBY3RpdmVDaGFubmVsQXNSZWFkKHNob3VsZE1hcmtBY3RpdmVDaGFubmVsQXNSZWFkOiBib29sZWFuKSB7XG4gICAgaWYgKCF0aGlzLl9zaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZCAmJiBzaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZCkge1xuICAgICAgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpPy5tYXJrUmVhZCgpO1xuICAgIH1cbiAgICB0aGlzLl9zaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZCA9IHNob3VsZE1hcmtBY3RpdmVDaGFubmVsQXNSZWFkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGdpdmVuIGBjaGFubmVsYCBhcyBhY3RpdmUgYW5kIG1hcmtzIGl0IGFzIHJlYWQuXG4gICAqIEBwYXJhbSBjaGFubmVsXG4gICAqL1xuICBzZXRBc0FjdGl2ZUNoYW5uZWwoY2hhbm5lbDogQ2hhbm5lbDxUPikge1xuICAgIGNvbnN0IHByZXZBY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIHRoaXMuc3RvcFdhdGNoRm9yQWN0aXZlQ2hhbm5lbEV2ZW50cyhwcmV2QWN0aXZlQ2hhbm5lbCk7XG4gICAgdGhpcy53YXRjaEZvckFjdGl2ZUNoYW5uZWxFdmVudHMoY2hhbm5lbCk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5uZXh0KGNoYW5uZWwpO1xuICAgIGNoYW5uZWwuc3RhdGUubWVzc2FnZXMuZm9yRWFjaCgobSkgPT4ge1xuICAgICAgbS5yZWFkQnkgPSBnZXRSZWFkQnkobSwgY2hhbm5lbCk7XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuY2FuU2VuZFJlYWRFdmVudHMgJiYgdGhpcy5zaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZCkge1xuICAgICAgdm9pZCBjaGFubmVsLm1hcmtSZWFkKCk7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5jaGFubmVsLnN0YXRlLm1lc3NhZ2VzXSk7XG4gICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtdKTtcbiAgICB0aGlzLm1lc3NhZ2VUb1F1b3RlU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogRGVzZWxlY3RzIHRoZSBjdXJyZW50bHkgYWN0aXZlIChpZiBhbnkpIGNoYW5uZWxcbiAgICovXG4gIGRlc2VsZWN0QWN0aXZlQ2hhbm5lbCgpIHtcbiAgICBjb25zdCBhY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGlmICghYWN0aXZlQ2hhbm5lbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0b3BXYXRjaEZvckFjdGl2ZUNoYW5uZWxFdmVudHMoYWN0aXZlQ2hhbm5lbCk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXSk7XG4gICAgdGhpcy5sYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHNTdWJqZWN0Lm5leHQoe30pO1xuICAgIHRoaXMuc2VsZWN0TWVzc2FnZVRvUXVvdGUodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBnaXZlbiBgbWVzc2FnZWAgYXMgYW4gYWN0aXZlIHBhcmVudCBtZXNzYWdlLiBJZiBgdW5kZWZpbmVkYCBpcyBwcm92aWRlZCwgaXQgd2lsbCBkZWxlc2VsZWN0IHRoZSBjdXJyZW50IHBhcmVudCBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgc2V0QXNBY3RpdmVQYXJlbnRNZXNzYWdlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U8VD4gfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBtZXNzYWdlVG9RdW90ZSA9IHRoaXMubWVzc2FnZVRvUXVvdGVTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgaWYgKG1lc3NhZ2VUb1F1b3RlICYmICEhbWVzc2FnZVRvUXVvdGUucGFyZW50X2lkKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VUb1F1b3RlU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dChtZXNzYWdlLmlkKTtcbiAgICAgIGNvbnN0IGFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhY3RpdmVDaGFubmVsPy5nZXRSZXBsaWVzKG1lc3NhZ2UuaWQsIHtcbiAgICAgICAgbGltaXQ6IHRoaXMub3B0aW9ucz8ubWVzc2FnZV9saW1pdCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChyZXN1bHQ/Lm1lc3NhZ2VzIHx8IFtdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIG5leHQgcGFnZSBvZiBtZXNzYWdlcyBvZiB0aGUgYWN0aXZlIGNoYW5uZWwuIFRoZSBwYWdlIHNpemUgY2FuIGJlIHNldCBpbiB0aGUgW3F1ZXJ5IG9wdGlvbl0oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvcXVlcnlfY2hhbm5lbHMvP2xhbmd1YWdlPWphdmFzY3JpcHQjcXVlcnktb3B0aW9ucykgb2JqZWN0LlxuICAgKi9cbiAgYXN5bmMgbG9hZE1vcmVNZXNzYWdlcygpIHtcbiAgICBjb25zdCBhY3RpdmVDaG5hbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBsYXN0TWVzc2FnZUlkID0gdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0LmdldFZhbHVlKClbMF0/LmlkO1xuICAgIGF3YWl0IGFjdGl2ZUNobmFubmVsPy5xdWVyeSh7XG4gICAgICBtZXNzYWdlczogeyBsaW1pdDogdGhpcy5vcHRpb25zPy5tZXNzYWdlX2xpbWl0LCBpZF9sdDogbGFzdE1lc3NhZ2VJZCB9LFxuICAgICAgbWVtYmVyczogeyBsaW1pdDogMCB9LFxuICAgICAgd2F0Y2hlcnM6IHsgbGltaXQ6IDAgfSxcbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICBhY3RpdmVDaG5hbm5lbD8uZGF0YT8uaWQgPT09XG4gICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk/LmRhdGE/LmlkXG4gICAgKSB7XG4gICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgIC4uLmFjdGl2ZUNobmFubmVsIS5zdGF0ZS5tZXNzYWdlcyxcbiAgICAgIF0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgbmV4dCBwYWdlIG9mIG1lc3NhZ2VzIG9mIHRoZSBhY3RpdmUgdGhyZWFkLiBUaGUgcGFnZSBzaXplIGNhbiBiZSBzZXQgaW4gdGhlIFtxdWVyeSBvcHRpb25dKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X2NoYW5uZWxzLz9sYW5ndWFnZT1qYXZhc2NyaXB0I3F1ZXJ5LW9wdGlvbnMpIG9iamVjdC5cbiAgICovXG4gIGFzeW5jIGxvYWRNb3JlVGhyZWFkUmVwbGllcygpIHtcbiAgICBjb25zdCBhY3RpdmVDaG5hbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBwYXJlbnRNZXNzYWdlSWQgPSB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAoIXBhcmVudE1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXN0TWVzc2FnZUlkID0gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QuZ2V0VmFsdWUoKVswXT8uaWQ7XG4gICAgYXdhaXQgYWN0aXZlQ2huYW5uZWw/LmdldFJlcGxpZXMocGFyZW50TWVzc2FnZUlkLCB7XG4gICAgICBsaW1pdDogdGhpcy5vcHRpb25zPy5tZXNzYWdlX2xpbWl0LFxuICAgICAgaWRfbHQ6IGxhc3RNZXNzYWdlSWQsXG4gICAgfSk7XG4gICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChcbiAgICAgIGFjdGl2ZUNobmFubmVsPy5zdGF0ZS50aHJlYWRzW3BhcmVudE1lc3NhZ2VJZF0gfHwgW11cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXJpZXMgdGhlIGNoYW5uZWxzIHdpdGggdGhlIGdpdmVuIGZpbHRlcnMsIHNvcnRzIGFuZCBvcHRpb25zLiBNb3JlIGluZm8gYWJvdXQgW2NoYW5uZWwgcXVlcnlpbmddKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X2NoYW5uZWxzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KSBjYW4gYmUgZm91bmQgaW4gdGhlIHBsYXRmb3JtIGRvY3VtZW50YXRpb24uIEJ5IGRlZmF1bHQgdGhlIGZpcnN0IGNoYW5uZWwgaW4gdGhlIGxpc3Qgd2lsbCBiZSBzZXQgYXMgYWN0aXZlIGNoYW5uZWwgYW5kIHdpbGwgYmUgbWFya2VkIGFzIHJlYWQuXG4gICAqIEBwYXJhbSBmaWx0ZXJzXG4gICAqIEBwYXJhbSBzb3J0XG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEBwYXJhbSBzaG91bGRTZXRBY3RpdmVDaGFubmVsIERlY2lkZXMgaWYgdGhlIGZpcnN0IGNoYW5uZWwgaW4gdGhlIHJlc3VsdCBzaG91bGQgYmUgbWFkZSBhcyBhbiBhY3RpdmUgY2hhbm5lbCwgb3Igbm8gY2hhbm5lbCBzaG91bGQgYmUgbWFya2VkIGFzIGFjdGl2ZVxuICAgKiBAcmV0dXJucyB0aGUgbGlzdCBvZiBjaGFubmVscyBmb3VuZCBieSB0aGUgcXVlcnlcbiAgICovXG4gIGFzeW5jIGluaXQoXG4gICAgZmlsdGVyczogQ2hhbm5lbEZpbHRlcnM8VD4sXG4gICAgc29ydD86IENoYW5uZWxTb3J0PFQ+LFxuICAgIG9wdGlvbnM/OiBDaGFubmVsT3B0aW9ucyxcbiAgICBzaG91bGRTZXRBY3RpdmVDaGFubmVsOiBib29sZWFuID0gdHJ1ZVxuICApIHtcbiAgICB0aGlzLmZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge1xuICAgICAgb2Zmc2V0OiAwLFxuICAgICAgbGltaXQ6IDI1LFxuICAgICAgc3RhdGU6IHRydWUsXG4gICAgICBwcmVzZW5jZTogdHJ1ZSxcbiAgICAgIHdhdGNoOiB0cnVlLFxuICAgICAgbWVzc2FnZV9saW1pdDogdGhpcy5tZXNzYWdlUGFnZVNpemUsXG4gICAgfTtcbiAgICB0aGlzLnNvcnQgPSBzb3J0IHx8IHsgbGFzdF9tZXNzYWdlX2F0OiAtMSwgdXBkYXRlZF9hdDogLTEgfTtcbiAgICB0aGlzLnNob3VsZFNldEFjdGl2ZUNoYW5uZWwgPSBzaG91bGRTZXRBY3RpdmVDaGFubmVsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnF1ZXJ5Q2hhbm5lbHModGhpcy5zaG91bGRTZXRBY3RpdmVDaGFubmVsKTtcbiAgICAgIHRoaXMuY2xpZW50RXZlbnRzU3Vic2NyaXB0aW9uID0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5ldmVudHMkLnN1YnNjcmliZShcbiAgICAgICAgKG5vdGlmaWNhdGlvbikgPT4gdm9pZCB0aGlzLmhhbmRsZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZFBlcm1hbmVudE5vdGlmaWNhdGlvbihcbiAgICAgICAgJ3N0cmVhbUNoYXQuRXJyb3IgbG9hZGluZyBjaGFubmVscycsXG4gICAgICAgICdlcnJvcidcbiAgICAgICk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBgYWN0aXZlQ2hhbm5lbCRgLCBgY2hhbm5lbHMkYCBhbmQgYGFjdGl2ZUNoYW5uZWxNZXNzYWdlcyRgIE9ic2VydmFibGVzLiBVc2VmdWwgd2hlbiBkaXNjb25uZWN0aW5nIGEgY2hhdCB1c2VyLCB1c2UgaW4gY29tYmluYXRpb24gd2l0aCBbYGRpc2Nvbm5lY3RVc2VyYF0oLi9DaGF0Q2xpZW50U2VydmljZS5tZHgvI2Rpc2Nvbm5lY3R1c2VyKS5cbiAgICovXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuZGVzZWxlY3RBY3RpdmVDaGFubmVsKCk7XG4gICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMuY2xpZW50RXZlbnRzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBuZXh0IHBhZ2Ugb2YgY2hhbm5lbHMuIFRoZSBwYWdlIHNpemUgY2FuIGJlIHNldCBpbiB0aGUgW3F1ZXJ5IG9wdGlvbl0oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvcXVlcnlfY2hhbm5lbHMvP2xhbmd1YWdlPWphdmFzY3JpcHQjcXVlcnktb3B0aW9ucykgb2JqZWN0LlxuICAgKi9cbiAgYXN5bmMgbG9hZE1vcmVDaGFubmVscygpIHtcbiAgICB0aGlzLm9wdGlvbnMhLm9mZnNldCA9IHRoaXMuY2hhbm5lbHMubGVuZ3RoITtcbiAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2hhbm5lbHMoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZWFjdGlvbiB0byBhIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgVGhlIGlkIG9mIHRoZSBtZXNzYWdlIHRvIGFkZCB0aGUgcmVhY3Rpb24gdG9cbiAgICogQHBhcmFtIHJlYWN0aW9uVHlwZSBUaGUgdHlwZSBvZiB0aGUgcmVhY3Rpb25cbiAgICogQHBhcmFtIGN1c3RvbURhdGFcbiAgICovXG4gIGFzeW5jIGFkZFJlYWN0aW9uKFxuICAgIG1lc3NhZ2VJZDogc3RyaW5nLFxuICAgIHJlYWN0aW9uVHlwZTogTWVzc2FnZVJlYWN0aW9uVHlwZSxcbiAgICBjdXN0b21EYXRhPzogVFsncmVhY3Rpb25UeXBlJ11cbiAgKSB7XG4gICAgYXdhaXQgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpPy5zZW5kUmVhY3Rpb24obWVzc2FnZUlkLCB7XG4gICAgICB0eXBlOiByZWFjdGlvblR5cGUsXG4gICAgICAuLi5jdXN0b21EYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSByZWFjdGlvbiBmcm9tIGEgbWVzc2FnZS5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZCBUaGUgaWQgb2YgdGhlIG1lc3NhZ2UgdG8gcmVtb3ZlIHRoZSByZWFjdGlvbiBmcm9tXG4gICAqIEBwYXJhbSByZWFjdGlvblR5cGUgVGhyIHR5cGUgb2YgcmVhY3Rpb24gdG8gcmVtb3ZlXG4gICAqL1xuICBhc3luYyByZW1vdmVSZWFjdGlvbihtZXNzYWdlSWQ6IHN0cmluZywgcmVhY3Rpb25UeXBlOiBNZXNzYWdlUmVhY3Rpb25UeXBlKSB7XG4gICAgYXdhaXQgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdFxuICAgICAgLmdldFZhbHVlKClcbiAgICAgID8uZGVsZXRlUmVhY3Rpb24obWVzc2FnZUlkLCByZWFjdGlvblR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbWVzc2FnZSB0byB0aGUgYWN0aXZlIGNoYW5uZWwuIFRoZSBtZXNzYWdlIGlzIGltbWVkaWF0ZWx5IGFkZGVkIHRvIHRoZSBtZXNzYWdlIGxpc3QsIGlmIGFuIGVycm9yIG9jY3VycyBhbmQgdGhlIG1lc3NhZ2UgY2FuJ3QgYmUgc2VudCwgdGhlIGVycm9yIGlzIGluZGljYXRlZCBpbiBgc3RhdGVgIG9mIHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCBvZiB0aGUgbWVzc2FnZVxuICAgKiBAcGFyYW0gYXR0YWNobWVudHMgVGhlIGF0dGFjaG1lbnRzXG4gICAqIEBwYXJhbSBtZW50aW9uZWRVc2VycyBNZW50aW9uZWQgdXNlcnNcbiAgICogQHBhcmFtIHBhcmVudElkIElkIG9mIHRoZSBwYXJlbnQgbWVzc2FnZSAoaWYgc2VuZGluZyBhIHRocmVhZCByZXBseSlcbiAgICogQHBhcmFtIHF1b3RlZE1lc3NhZ2VJZCBJZCBvZiB0aGUgbWVzc2FnZSB0byBxdW90ZSAoaWYgc2VuZGluZyBhIHF1b3RlIHJlcGx5KVxuICAgKiBAcGFyYW0gY3VzdG9tRGF0YVxuICAgKi9cbiAgYXN5bmMgc2VuZE1lc3NhZ2UoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50PFQ+W10gPSBbXSxcbiAgICBtZW50aW9uZWRVc2VyczogVXNlclJlc3BvbnNlPFQ+W10gPSBbXSxcbiAgICBwYXJlbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIHF1b3RlZE1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIGN1c3RvbURhdGE6IHVuZGVmaW5lZCB8IFBhcnRpYWw8VFsnbWVzc2FnZVR5cGUnXT4gPSB1bmRlZmluZWRcbiAgKSB7XG4gICAgY29uc3QgcHJldmlldyA9IGNyZWF0ZU1lc3NhZ2VQcmV2aWV3KFxuICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXIhLFxuICAgICAgdGV4dCxcbiAgICAgIGF0dGFjaG1lbnRzLFxuICAgICAgbWVudGlvbmVkVXNlcnMsXG4gICAgICBwYXJlbnRJZCxcbiAgICAgIHF1b3RlZE1lc3NhZ2VJZCxcbiAgICAgIGN1c3RvbURhdGFcbiAgICApO1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgIHByZXZpZXcucmVhZEJ5ID0gW107XG4gICAgY2hhbm5lbC5zdGF0ZS5hZGRNZXNzYWdlU29ydGVkKHByZXZpZXcsIHRydWUpO1xuICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2VSZXF1ZXN0KHByZXZpZXcsIGN1c3RvbURhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2VuZHMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gdGhlIGFjdGl2ZSBjaGFubmVsXG4gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHJlc2VuZFxuICAgKi9cbiAgYXN5bmMgcmVzZW5kTWVzc2FnZShtZXNzYWdlOiBTdHJlYW1NZXNzYWdlKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgY2hhbm5lbC5zdGF0ZS5hZGRNZXNzYWdlU29ydGVkKFxuICAgICAge1xuICAgICAgICAuLi4obWVzc2FnZSBhcyBhbnkgYXMgTWVzc2FnZVJlc3BvbnNlPFQ+KSxcbiAgICAgICAgZXJyb3JTdGF0dXNDb2RlOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogJ3NlbmRpbmcnLFxuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2VSZXF1ZXN0KG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIG1lc3NhZ2UgaW4gdGhlIGFjdGl2ZSBjaGFubmVsXG4gICAqIEBwYXJhbSBtZXNzYWdlIE1lc2FnZSB0byBiZSB1cGRhdGVkXG4gICAqL1xuICBhc3luYyB1cGRhdGVNZXNzYWdlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U8VD4pIHtcbiAgICBhd2FpdCB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXBkYXRlTWVzc2FnZShcbiAgICAgIG1lc3NhZ2UgYXMgYW55IGFzIFVwZGF0ZWRNZXNzYWdlPFQ+XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIHRoZSBtZXNzYWdlIGZyb20gdGhlIGFjdGl2ZSBjaGFubmVsXG4gICAqIEBwYXJhbSBtZXNzYWdlIE1lc3NhZ2UgdG8gYmUgZGVsZXRlZFxuICAgKi9cbiAgYXN5bmMgZGVsZXRlTWVzc2FnZShtZXNzYWdlOiBTdHJlYW1NZXNzYWdlKSB7XG4gICAgYXdhaXQgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LmRlbGV0ZU1lc3NhZ2UobWVzc2FnZS5pZCk7XG4gIH1cblxuICAvKipcbiAgICogVXBsb2FkcyBmaWxlcyB0byB0aGUgY2hhbm5lbC4gSWYgeW91IHdhbnQgdG8ga25vdyBtb3JlIGFib3V0IFtmaWxlIHVwbG9hZHNdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L2ZpbGVfdXBsb2Fkcy8/bGFuZ3VhZ2U9amF2YXNjcmlwdCkgY2hlY2sgb3V0IHRoZSBwbGF0Zm9ybSBkb2N1bWVudGF0aW9uLlxuICAgKiBAcGFyYW0gdXBsb2FkcyB0aGUgYXR0YWNobWVudHMgdG8gdXBsb2FkIChvdXRwdXQgb2YgdGhlIFtgQXR0YWNobWVudFNlcnZpY2VgXSguL0F0dGFjaG1lbnRTZXJ2aWNlLm1keCkpXG4gICAqIEByZXR1cm5zIHRoZSByZXN1bHQgb2YgZmlsZSB1cGxvYWQgcmVxdWVzdHNcbiAgICovXG4gIGFzeW5jIHVwbG9hZEF0dGFjaG1lbnRzKFxuICAgIHVwbG9hZHM6IEF0dGFjaG1lbnRVcGxvYWRbXVxuICApOiBQcm9taXNlPEF0dGFjaG1lbnRVcGxvYWRbXT4ge1xuICAgIGNvbnN0IHJlc3VsdDogQXR0YWNobWVudFVwbG9hZFtdID0gW107XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgY29uc3QgdXBsb2FkUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIHVwbG9hZHMubWFwKCh1cGxvYWQpID0+XG4gICAgICAgIHVwbG9hZC50eXBlID09PSAnaW1hZ2UnXG4gICAgICAgICAgPyB0aGlzLmN1c3RvbUltYWdlVXBsb2FkUmVxdWVzdFxuICAgICAgICAgICAgPyB0aGlzLmN1c3RvbUltYWdlVXBsb2FkUmVxdWVzdCh1cGxvYWQuZmlsZSwgY2hhbm5lbClcbiAgICAgICAgICAgIDogY2hhbm5lbC5zZW5kSW1hZ2UodXBsb2FkLmZpbGUpXG4gICAgICAgICAgOiB0aGlzLmN1c3RvbUZpbGVVcGxvYWRSZXF1ZXN0XG4gICAgICAgICAgPyB0aGlzLmN1c3RvbUZpbGVVcGxvYWRSZXF1ZXN0KHVwbG9hZC5maWxlLCBjaGFubmVsKVxuICAgICAgICAgIDogY2hhbm5lbC5zZW5kRmlsZSh1cGxvYWQuZmlsZSlcbiAgICAgIClcbiAgICApO1xuICAgIHVwbG9hZFJlc3VsdHMuZm9yRWFjaCgodXBsb2FkUmVzdWx0LCBpKSA9PiB7XG4gICAgICBjb25zdCBmaWxlID0gdXBsb2Fkc1tpXS5maWxlO1xuICAgICAgY29uc3QgdHlwZSA9IHVwbG9hZHNbaV0udHlwZTtcbiAgICAgIGlmICh1cGxvYWRSZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJykge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgZmlsZSxcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIHN0YXRlOiAnc3VjY2VzcycsXG4gICAgICAgICAgdXJsOiB1cGxvYWRSZXN1bHQudmFsdWUuZmlsZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQucHVzaCh7IGZpbGUsIHR5cGUsIHN0YXRlOiAnZXJyb3InIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGFuIHVwbG9hZGVkIGZpbGUgYnkgVVJMLiBJZiB5b3Ugd2FudCB0byBrbm93IG1vcmUgYWJvdXQgW2ZpbGUgdXBsb2Fkc10oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvZmlsZV91cGxvYWRzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KSBjaGVjayBvdXQgdGhlIHBsYXRmb3JtIGRvY3VtZW50YXRpb25cbiAgICogQHBhcmFtIGF0dGFjaG1lbnRVcGxvYWQgQXR0YWNobWVudCB0byBiZSBkZWxldGVkIChvdXRwdXQgb2YgdGhlIFtgQXR0YWNobWVudFNlcnZpY2VgXSguL0F0dGFjaG1lbnRTZXJ2aWNlLm1keCkpXG4gICAqL1xuICBhc3luYyBkZWxldGVBdHRhY2htZW50KGF0dGFjaG1lbnRVcGxvYWQ6IEF0dGFjaG1lbnRVcGxvYWQpIHtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICBhd2FpdCAoYXR0YWNobWVudFVwbG9hZC50eXBlID09PSAnaW1hZ2UnXG4gICAgICA/IHRoaXMuY3VzdG9tSW1hZ2VEZWxldGVSZXF1ZXN0XG4gICAgICAgID8gdGhpcy5jdXN0b21JbWFnZURlbGV0ZVJlcXVlc3QoYXR0YWNobWVudFVwbG9hZC51cmwhLCBjaGFubmVsKVxuICAgICAgICA6IGNoYW5uZWwuZGVsZXRlSW1hZ2UoYXR0YWNobWVudFVwbG9hZC51cmwhKVxuICAgICAgOiB0aGlzLmN1c3RvbUZpbGVEZWxldGVSZXF1ZXN0XG4gICAgICA/IHRoaXMuY3VzdG9tRmlsZURlbGV0ZVJlcXVlc3QoYXR0YWNobWVudFVwbG9hZC51cmwhLCBjaGFubmVsKVxuICAgICAgOiBjaGFubmVsLmRlbGV0ZUZpbGUoYXR0YWNobWVudFVwbG9hZC51cmwhKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXV0b2NvbXBsZXRlIG9wdGlvbnMgZm9yIGN1cnJlbnQgY2hhbm5lbCBtZW1iZXJzLiBJZiB0aGUgY2hhbm5lbCBoYXMgbGVzcyB0aGFuIDEwMCBtZW1iZXJzLCBpdCByZXR1cm5zIHRoZSBjaGFubmVsIG1lbWJlcnMsIG90aGVyd2lzZSBzZW5kcyBhIFtzZWFyY2ggcmVxdWVzdF0oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvcXVlcnlfbWVtYmVycy8/bGFuZ3VhZ2U9amF2YXNjcmlwdCNwYWdpbmF0aW9uLWFuZC1vcmRlcmluZykgd2l0aCB0aGUgZ2l2ZW4gc2VhcmNoIHRlcm0uXG4gICAqIEBwYXJhbSBzZWFyY2hUZXJtIFRleHQgdG8gc2VhcmNoIGZvciBpbiB0aGUgbmFtZXMgb2YgbWVtYmVyc1xuICAgKiBAcmV0dXJucyBUaGUgbGlzdCBvZiBtZW1iZXJzIG1hdGNoaW5nIHRoZSBzZWFyY2ggZmlsdGVyXG4gICAqL1xuICBhc3luYyBhdXRvY29tcGxldGVNZW1iZXJzKHNlYXJjaFRlcm06IHN0cmluZykge1xuICAgIGNvbnN0IGFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgaWYgKCFhY3RpdmVDaGFubmVsKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhhY3RpdmVDaGFubmVsLnN0YXRlLm1lbWJlcnMpLmxlbmd0aCA8PSAxMDApIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGFjdGl2ZUNoYW5uZWwuc3RhdGUubWVtYmVycykuZmlsdGVyKFxuICAgICAgICAobSkgPT4gbS51c2VyPy5pZCAhPT0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXJJRCFcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghc2VhcmNoVGVybSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhY3RpdmVDaGFubmVsLnF1ZXJ5TWVtYmVycyh7XG4gICAgICAgIG5hbWU6IHsgJGF1dG9jb21wbGV0ZTogc2VhcmNoVGVybSB9LFxuICAgICAgICBpZDogeyAkbmU6IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VySUQhIH0sXG4gICAgICB9IGFzIFVzZXJGaWx0ZXJzPFQ+KTsgLy8gVE9ETzogZmluZCBvdXQgd2h5IHdlIG5lZWQgdHlwZWNhc3QgaGVyZVxuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMocmVzdWx0Lm1lbWJlcnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBbUnVucyBhIG1lc3NhZ2UgYWN0aW9uXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvcmVzdC8jbWVzc2FnZXMtcnVubWVzc2FnZWFjdGlvbikgaW4gdGhlIGN1cnJlbnQgY2hhbm5lbC4gVXBkYXRlcyB0aGUgbWVzc2FnZSBsaXN0IGJhc2VkIG9uIHRoZSBhY3Rpb24gcmVzdWx0IChpZiBubyBtZXNzYWdlIGlzIHJldHVybmVkLCB0aGUgbWVzc2FnZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbWVzc2FnZSBsaXN0KS5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZFxuICAgKiBAcGFyYW0gZm9ybURhdGFcbiAgICovXG4gIGFzeW5jIHNlbmRBY3Rpb24obWVzc2FnZUlkOiBzdHJpbmcsIGZvcm1EYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjaGFubmVsLnNlbmRBY3Rpb24obWVzc2FnZUlkLCBmb3JtRGF0YSk7XG4gICAgaWYgKHJlc3BvbnNlPy5tZXNzYWdlKSB7XG4gICAgICBjaGFubmVsLnN0YXRlLmFkZE1lc3NhZ2VTb3J0ZWQoe1xuICAgICAgICAuLi5yZXNwb25zZS5tZXNzYWdlLFxuICAgICAgICBzdGF0dXM6ICdyZWNlaXZlZCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGlzVGhyZWFkUmVwbHkgPSAhIXJlc3BvbnNlLm1lc3NhZ2UucGFyZW50X2lkO1xuICAgICAgaXNUaHJlYWRSZXBseVxuICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS50aHJlYWRzW3Jlc3BvbnNlLm1lc3NhZ2UucGFyZW50X2lkIV0sXG4gICAgICAgICAgXSlcbiAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlc10pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFubmVsLnN0YXRlLnJlbW92ZU1lc3NhZ2UoeyBpZDogbWVzc2FnZUlkIH0pO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3RcbiAgICAgICAgICAuZ2V0VmFsdWUoKVxuICAgICAgICAgIC5maW5kKChtKSA9PiBtLmlkID09PSBtZXNzYWdlSWQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLmNoYW5uZWwuc3RhdGUubWVzc2FnZXNdKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0XG4gICAgICAgICAgLmdldFZhbHVlKClcbiAgICAgICAgICAuZmluZCgobSkgPT4gbS5pZCA9PT0gbWVzc2FnZUlkKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoXG4gICAgICAgICAgY2hhbm5lbC5zdGF0ZS50aHJlYWRzW3RoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5nZXRWYWx1ZSgpIV1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBvciBkZXNlbGVjdHMgdGhlIGN1cnJlbnQgbWVzc2FnZSB0byBxdW90ZSByZXBseSB0b1xuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzZWxlY3QsIGlmIGNhbGxlZCB3aXRoIGB1bmRlZmluZWRgLCBpdCBkZXNlbGVjdHMgdGhlIG1lc3NhZ2VcbiAgICovXG4gIHNlbGVjdE1lc3NhZ2VUb1F1b3RlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLm1lc3NhZ2VUb1F1b3RlU3ViamVjdC5uZXh0KG1lc3NhZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kTWVzc2FnZVJlcXVlc3QoXG4gICAgcHJldmlldzogTWVzc2FnZVJlc3BvbnNlPFQ+IHwgU3RyZWFtTWVzc2FnZTxUPixcbiAgICBjdXN0b21EYXRhPzogUGFydGlhbDxUWydtZXNzYWdlVHlwZSddPlxuICApIHtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICBjb25zdCBpc1RocmVhZFJlcGx5ID0gISFwcmV2aWV3LnBhcmVudF9pZDtcbiAgICBpc1RocmVhZFJlcGx5XG4gICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgICAgIC4uLmNoYW5uZWwuc3RhdGUudGhyZWFkc1twcmV2aWV3LnBhcmVudF9pZCFdLFxuICAgICAgICBdKVxuICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlc10pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNoYW5uZWwuc2VuZE1lc3NhZ2Uoe1xuICAgICAgICBpZDogcHJldmlldy5pZCxcbiAgICAgICAgdGV4dDogcHJldmlldy50ZXh0LFxuICAgICAgICBhdHRhY2htZW50czogcHJldmlldy5hdHRhY2htZW50cyxcbiAgICAgICAgbWVudGlvbmVkX3VzZXJzOiBwcmV2aWV3Lm1lbnRpb25lZF91c2Vycz8ubWFwKCh1KSA9PiB1LmlkKSxcbiAgICAgICAgcGFyZW50X2lkOiBwcmV2aWV3LnBhcmVudF9pZCxcbiAgICAgICAgcXVvdGVkX21lc3NhZ2VfaWQ6IHByZXZpZXcucXVvdGVkX21lc3NhZ2VfaWQsXG4gICAgICAgIC4uLmN1c3RvbURhdGEsXG4gICAgICB9IGFzIE1lc3NhZ2U8VD4pOyAvLyBUT0RPOiBmaW5kIG91dCB3aHkgd2UgbmVlZCB0eXBlY2FzdCBoZXJlXG4gICAgICBpZiAocmVzcG9uc2U/Lm1lc3NhZ2UpIHtcbiAgICAgICAgY2hhbm5lbC5zdGF0ZS5hZGRNZXNzYWdlU29ydGVkKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnJlc3BvbnNlLm1lc3NhZ2UsXG4gICAgICAgICAgICBzdGF0dXM6ICdyZWNlaXZlZCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlzVGhyZWFkUmVwbHlcbiAgICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgICAgICAgICAuLi5jaGFubmVsLnN0YXRlLnRocmVhZHNbcHJldmlldy5wYXJlbnRfaWQhXSxcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlc10pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzdHJpbmdFcnJvciA9IEpTT04uc3RyaW5naWZ5KGVycm9yKTtcbiAgICAgIGNvbnN0IHBhcnNlZEVycm9yOiB7IHN0YXR1cz86IG51bWJlciB9ID0gc3RyaW5nRXJyb3JcbiAgICAgICAgPyAoSlNPTi5wYXJzZShzdHJpbmdFcnJvcikgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSlcbiAgICAgICAgOiB7fTtcblxuICAgICAgY2hhbm5lbC5zdGF0ZS5hZGRNZXNzYWdlU29ydGVkKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uKHByZXZpZXcgYXMgTWVzc2FnZVJlc3BvbnNlPFQ+KSxcbiAgICAgICAgICBlcnJvclN0YXR1c0NvZGU6IHBhcnNlZEVycm9yLnN0YXR1cyB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgc3RhdHVzOiAnZmFpbGVkJyxcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIGlzVGhyZWFkUmVwbHlcbiAgICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAgIC4uLmNoYW5uZWwuc3RhdGUudGhyZWFkc1twcmV2aWV3LnBhcmVudF9pZCFdLFxuICAgICAgICAgIF0pXG4gICAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLmNoYW5uZWwuc3RhdGUubWVzc2FnZXNdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU5vdGlmaWNhdGlvbihjbGllbnRFdmVudDogQ2xpZW50RXZlbnQ8VD4pIHtcbiAgICBzd2l0Y2ggKGNsaWVudEV2ZW50LmV2ZW50VHlwZSkge1xuICAgICAgY2FzZSAnY29ubmVjdGlvbi5yZWNvdmVyZWQnOiB7XG4gICAgICAgIHZvaWQgdGhpcy5uZ1pvbmUucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc1N0YXRlUmVjb3ZlcnlJblByb2dyZXNzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaXNTdGF0ZVJlY292ZXJ5SW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmluaXQoXG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVycyEsXG4gICAgICAgICAgICAgIHRoaXMuc29ydCxcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgICB0aGlzLnNob3VsZFNldEFjdGl2ZUNoYW5uZWxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmlzU3RhdGVSZWNvdmVyeUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRoaXMuaXNTdGF0ZVJlY292ZXJ5SW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbm90aWZpY2F0aW9uLm1lc3NhZ2VfbmV3Jzoge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmN1c3RvbU5ld01lc3NhZ2VOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbU5ld01lc3NhZ2VOb3RpZmljYXRpb25IYW5kbGVyKFxuICAgICAgICAgICAgICBjbGllbnRFdmVudCxcbiAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVOZXdNZXNzYWdlTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ25vdGlmaWNhdGlvbi5hZGRlZF90b19jaGFubmVsJzoge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21BZGRlZFRvQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXIoXG4gICAgICAgICAgICAgIGNsaWVudEV2ZW50LFxuICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ25vdGlmaWNhdGlvbi5yZW1vdmVkX2Zyb21fY2hhbm5lbCc6IHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jdXN0b21SZW1vdmVkRnJvbUNoYW5uZWxOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXIoXG4gICAgICAgICAgICAgIGNsaWVudEV2ZW50LFxuICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbihjbGllbnRFdmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbihjbGllbnRFdmVudDogQ2xpZW50RXZlbnQ8VD4pIHtcbiAgICBjb25zdCBjaGFubmVsSWRUb0JlUmVtb3ZlZCA9IGNsaWVudEV2ZW50LmV2ZW50LmNoYW5uZWwhLmNpZDtcbiAgICB0aGlzLnJlbW92ZUNoYW5uZWxzRnJvbUNoYW5uZWxMaXN0KFtjaGFubmVsSWRUb0JlUmVtb3ZlZF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVOZXdNZXNzYWdlTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50OiBDbGllbnRFdmVudDxUPikge1xuICAgIGlmIChjbGllbnRFdmVudC5ldmVudC5jaGFubmVsKSB7XG4gICAgICB0aGlzLmFkZENoYW5uZWxzRnJvbU5vdGlmaWNhdGlvbihbY2xpZW50RXZlbnQuZXZlbnQuY2hhbm5lbF0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQWRkZWRUb0NoYW5uZWxOb3RpZmljYXRpb24oY2xpZW50RXZlbnQ6IENsaWVudEV2ZW50PFQ+KSB7XG4gICAgaWYgKGNsaWVudEV2ZW50LmV2ZW50LmNoYW5uZWwpIHtcbiAgICAgIHRoaXMuYWRkQ2hhbm5lbHNGcm9tTm90aWZpY2F0aW9uKFtjbGllbnRFdmVudC5ldmVudC5jaGFubmVsXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRDaGFubmVsc0Zyb21Ob3RpZmljYXRpb24oY2hhbm5lbFJlc3BvbnNlczogQ2hhbm5lbFJlc3BvbnNlPFQ+W10pIHtcbiAgICBjb25zdCBuZXdDaGFubmVsczogQ2hhbm5lbDxUPltdID0gW107XG4gICAgY2hhbm5lbFJlc3BvbnNlcy5mb3JFYWNoKChjaGFubmVsUmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQuY2hhbm5lbChcbiAgICAgICAgY2hhbm5lbFJlc3BvbnNlLnR5cGUsXG4gICAgICAgIGNoYW5uZWxSZXNwb25zZS5pZFxuICAgICAgKTtcbiAgICAgIHZvaWQgY2hhbm5lbC53YXRjaCgpO1xuICAgICAgdGhpcy53YXRjaEZvckNoYW5uZWxFdmVudHMoY2hhbm5lbCk7XG4gICAgICBuZXdDaGFubmVscy5wdXNoKGNoYW5uZWwpO1xuICAgIH0pO1xuICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoW1xuICAgICAgLi4ubmV3Q2hhbm5lbHMsXG4gICAgICAuLi4odGhpcy5jaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKSB8fCBbXSksXG4gICAgXSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUNoYW5uZWxzRnJvbUNoYW5uZWxMaXN0KGNpZHM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgY2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzLmZpbHRlcigoYykgPT4gIWNpZHMuaW5jbHVkZXMoYy5jaWQgfHwgJycpKTtcbiAgICBpZiAoY2hhbm5lbHMubGVuZ3RoIDwgdGhpcy5jaGFubmVscy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoY2hhbm5lbHMpO1xuICAgICAgaWYgKGNpZHMuaW5jbHVkZXModGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpPy5jaWQgfHwgJycpKSB7XG4gICAgICAgIGlmIChjaGFubmVscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5zZXRBc0FjdGl2ZUNoYW5uZWwoY2hhbm5lbHNbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaEZvckFjdGl2ZUNoYW5uZWxFdmVudHMoY2hhbm5lbDogQ2hhbm5lbDxUPikge1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ21lc3NhZ2UubmV3JywgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgZXZlbnQubWVzc2FnZSAmJiBldmVudC5tZXNzYWdlLnBhcmVudF9pZFxuICAgICAgICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAgICAgICAuLi5jaGFubmVsLnN0YXRlLnRocmVhZHNbZXZlbnQubWVzc2FnZS5wYXJlbnRfaWRdLFxuICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlcyxcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsJC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoYykgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FuU2VuZFJlYWRFdmVudHMgJiYgdGhpcy5zaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZCkge1xuICAgICAgICAgICAgICB2b2lkIGM/Lm1hcmtSZWFkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVMYXRlc3RNZXNzYWdlcyhldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ21lc3NhZ2UudXBkYXRlZCcsIChldmVudCkgPT4gdGhpcy5tZXNzYWdlVXBkYXRlZChldmVudCkpXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCdtZXNzYWdlLmRlbGV0ZWQnLCAoZXZlbnQpID0+IHRoaXMubWVzc2FnZVVwZGF0ZWQoZXZlbnQpKVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgY2hhbm5lbC5vbigncmVhY3Rpb24ubmV3JywgKGUpID0+IHRoaXMubWVzc2FnZVJlYWN0aW9uRXZlbnRSZWNlaXZlZChlKSlcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ3JlYWN0aW9uLmRlbGV0ZWQnLCAoZSkgPT5cbiAgICAgICAgdGhpcy5tZXNzYWdlUmVhY3Rpb25FdmVudFJlY2VpdmVkKGUpXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCdyZWFjdGlvbi51cGRhdGVkJywgKGUpID0+XG4gICAgICAgIHRoaXMubWVzc2FnZVJlYWN0aW9uRXZlbnRSZWNlaXZlZChlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgY2hhbm5lbC5vbignbWVzc2FnZS5yZWFkJywgKGUpID0+IHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICBsZXQgbGF0ZXN0TWVzc2FnZSE6IFN0cmVhbU1lc3NhZ2U7XG4gICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXMkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKChtZXNzYWdlcykgPT4ge1xuICAgICAgICAgICAgbGF0ZXN0TWVzc2FnZSA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghbGF0ZXN0TWVzc2FnZSB8fCAhZS51c2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGxhdGVzdE1lc3NhZ2UucmVhZEJ5ID0gZ2V0UmVhZEJ5KGxhdGVzdE1lc3NhZ2UsIGNoYW5uZWwpO1xuXG4gICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QuZ2V0VmFsdWUoKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ3R5cGluZy5zdGFydCcsIChlKSA9PlxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5oYW5kbGVUeXBpbmdTdGFydEV2ZW50KGUpKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgY2hhbm5lbC5vbigndHlwaW5nLnN0b3AnLCAoZSkgPT5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuaGFuZGxlVHlwaW5nU3RvcEV2ZW50KGUpKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCB0aGlzIG1ldGhvZCBpZiB1c2VyIHN0YXJ0ZWQgdHlwaW5nIGluIHRoZSBhY3RpdmUgY2hhbm5lbFxuICAgKiBAcGFyYW0gcGFyZW50SWQgVGhlIGlkIG9mIHRoZSBwYXJlbnQgbWVzc2FnZSwgaWYgdXNlciBpcyB0eXBpbmcgaW4gYSB0aHJlYWRcbiAgICovXG4gIGFzeW5jIHR5cGluZ1N0YXJ0ZWQocGFyZW50SWQ/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGF3YWl0IGFjdGl2ZUNoYW5uZWw/LmtleXN0cm9rZShwYXJlbnRJZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCB0aGlzIG1ldGhvZCBpZiB1c2VyIHN0b3BwZWQgdHlwaW5nIGluIHRoZSBhY3RpdmUgY2hhbm5lbFxuICAgKiBAcGFyYW0gcGFyZW50SWQgVGhlIGlkIG9mIHRoZSBwYXJlbnQgbWVzc2FnZSwgaWYgdXNlciB3ZXJlIHR5cGluZyBpbiBhIHRocmVhZFxuICAgKi9cbiAgYXN5bmMgdHlwaW5nU3RvcHBlZChwYXJlbnRJZD86IHN0cmluZykge1xuICAgIGNvbnN0IGFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgYXdhaXQgYWN0aXZlQ2hhbm5lbD8uc3RvcFR5cGluZyhwYXJlbnRJZCk7XG4gIH1cblxuICBwcml2YXRlIG1lc3NhZ2VVcGRhdGVkKGV2ZW50OiBFdmVudDxUPikge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICBjb25zdCBpc1RocmVhZFJlcGx5ID0gZXZlbnQubWVzc2FnZSAmJiBldmVudC5tZXNzYWdlLnBhcmVudF9pZDtcbiAgICAgIGNvbnN0IG1lc3NhZ2VzID0gaXNUaHJlYWRSZXBseVxuICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0LmdldFZhbHVlKClcbiAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VJbmRleCA9IG1lc3NhZ2VzLmZpbmRJbmRleChcbiAgICAgICAgKG0pID0+IG0uaWQgPT09IGV2ZW50Lm1lc3NhZ2U/LmlkXG4gICAgICApO1xuICAgICAgaWYgKG1lc3NhZ2VJbmRleCAhPT0gLTEgJiYgZXZlbnQubWVzc2FnZSkge1xuICAgICAgICBtZXNzYWdlc1ttZXNzYWdlSW5kZXhdID0gZXZlbnQubWVzc2FnZTtcbiAgICAgICAgaXNUaHJlYWRSZXBseVxuICAgICAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbLi4ubWVzc2FnZXNdKVxuICAgICAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLm1lc3NhZ2VzXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1lc3NhZ2VSZWFjdGlvbkV2ZW50UmVjZWl2ZWQoZTogRXZlbnQ8VD4pIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgY29uc3QgaXNUaHJlYWRNZXNzYWdlID0gZS5tZXNzYWdlICYmIGUubWVzc2FnZS5wYXJlbnRfaWQ7XG4gICAgICBsZXQgbWVzc2FnZXMhOiBTdHJlYW1NZXNzYWdlW107XG4gICAgICAoaXNUaHJlYWRNZXNzYWdlXG4gICAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlcyRcbiAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlcyRcbiAgICAgIClcbiAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgLnN1YnNjcmliZSgobSkgPT4gKG1lc3NhZ2VzID0gbSkpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uaWQgPT09IGU/Lm1lc3NhZ2U/LmlkKTtcbiAgICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBtZXNzYWdlLnJlYWN0aW9uX2NvdW50cyA9IHsgLi4uZS5tZXNzYWdlPy5yZWFjdGlvbl9jb3VudHMgfTtcbiAgICAgIG1lc3NhZ2UucmVhY3Rpb25fc2NvcmVzID0geyAuLi5lLm1lc3NhZ2U/LnJlYWN0aW9uX3Njb3JlcyB9O1xuICAgICAgbWVzc2FnZS5sYXRlc3RfcmVhY3Rpb25zID0gWy4uLihlLm1lc3NhZ2U/LmxhdGVzdF9yZWFjdGlvbnMgfHwgW10pXTtcbiAgICAgIG1lc3NhZ2Uub3duX3JlYWN0aW9ucyA9IFsuLi4oZS5tZXNzYWdlPy5vd25fcmVhY3Rpb25zIHx8IFtdKV07XG4gICAgICBpc1RocmVhZE1lc3NhZ2VcbiAgICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5tZXNzYWdlc10pXG4gICAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLm1lc3NhZ2VzXSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdE1lc3NhZ2UobWVzc2FnZTogTWVzc2FnZVJlc3BvbnNlPFQ+KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAvLyBwYXJzZSB0aGUgZGF0ZS4uXG4gICAgICBwaW5uZWRfYXQ6IG1lc3NhZ2UucGlubmVkX2F0ID8gbmV3IERhdGUobWVzc2FnZS5waW5uZWRfYXQpIDogbnVsbCxcbiAgICAgIGNyZWF0ZWRfYXQ6IG1lc3NhZ2UuY3JlYXRlZF9hdFxuICAgICAgICA/IG5ldyBEYXRlKG1lc3NhZ2UuY3JlYXRlZF9hdClcbiAgICAgICAgOiBuZXcgRGF0ZSgpLFxuICAgICAgdXBkYXRlZF9hdDogbWVzc2FnZS51cGRhdGVkX2F0XG4gICAgICAgID8gbmV3IERhdGUobWVzc2FnZS51cGRhdGVkX2F0KVxuICAgICAgICA6IG5ldyBEYXRlKCksXG4gICAgICBzdGF0dXM6IG1lc3NhZ2Uuc3RhdHVzIHx8ICdyZWNlaXZlZCcsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgaXNTdHJlYW1NZXNzYWdlKFxuICAgIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCBGb3JtYXRNZXNzYWdlUmVzcG9uc2UgfCBNZXNzYWdlUmVzcG9uc2VcbiAgKTogbWVzc2FnZSBpcyBTdHJlYW1NZXNzYWdlIHtcbiAgICByZXR1cm4gISFtZXNzYWdlLnJlYWRCeTtcbiAgfVxuXG4gIHByaXZhdGUgaXNGb3JtYXRNZXNzYWdlUmVzcG9uc2UoXG4gICAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IEZvcm1hdE1lc3NhZ2VSZXNwb25zZSB8IE1lc3NhZ2VSZXNwb25zZVxuICApOiBtZXNzYWdlIGlzIEZvcm1hdE1lc3NhZ2VSZXNwb25zZSB7XG4gICAgcmV0dXJuIG1lc3NhZ2UuY3JlYXRlZF9hdCBpbnN0YW5jZW9mIERhdGU7XG4gIH1cblxuICBwcml2YXRlIHN0b3BXYXRjaEZvckFjdGl2ZUNoYW5uZWxFdmVudHMoY2hhbm5lbDogQ2hhbm5lbDxUPiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghY2hhbm5lbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLmZvckVhY2goKHMpID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucyA9IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBxdWVyeUNoYW5uZWxzKHNob3VsZFNldEFjdGl2ZUNoYW5uZWw6IGJvb2xlYW4pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2hhbm5lbHMgPSBhd2FpdCB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQucXVlcnlDaGFubmVscyhcbiAgICAgICAgdGhpcy5maWx0ZXJzISxcbiAgICAgICAgdGhpcy5zb3J0LFxuICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICAgICk7XG4gICAgICBjaGFubmVscy5mb3JFYWNoKChjKSA9PiB0aGlzLndhdGNoRm9yQ2hhbm5lbEV2ZW50cyhjKSk7XG4gICAgICBjb25zdCBwcmV2Q2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzU3ViamVjdC5nZXRWYWx1ZSgpIHx8IFtdO1xuICAgICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dChbLi4ucHJldkNoYW5uZWxzLCAuLi5jaGFubmVsc10pO1xuICAgICAgaWYgKFxuICAgICAgICBjaGFubmVscy5sZW5ndGggPiAwICYmXG4gICAgICAgICF0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkgJiZcbiAgICAgICAgc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuc2V0QXNBY3RpdmVDaGFubmVsKGNoYW5uZWxzWzBdKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGFzTW9yZUNoYW5uZWxzU3ViamVjdC5uZXh0KGNoYW5uZWxzLmxlbmd0aCA+PSB0aGlzLm9wdGlvbnMhLmxpbWl0ISk7XG4gICAgICByZXR1cm4gY2hhbm5lbHM7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0LmVycm9yKGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgd2F0Y2hGb3JDaGFubmVsRXZlbnRzKGNoYW5uZWw6IENoYW5uZWw8VD4pIHtcbiAgICBjaGFubmVsLm9uKChldmVudDogRXZlbnQ8VD4pID0+IHtcbiAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICBjYXNlICdtZXNzYWdlLm5ldyc6IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VzdG9tTmV3TWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21OZXdNZXNzYWdlSGFuZGxlcihcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlU2V0dGVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZU5ld01lc3NhZ2UoZXZlbnQsIGNoYW5uZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NoYW5uZWwuaGlkZGVuJzoge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21DaGFubmVsSGlkZGVuSGFuZGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNoYW5uZWxIaWRkZW5IYW5kbGVyKFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMudGhyZWFkTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2VTZXR0ZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbm5lbEhpZGRlbihldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY2hhbm5lbC5kZWxldGVkJzoge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21DaGFubmVsRGVsZXRlZEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21DaGFubmVsRGVsZXRlZEhhbmRsZXIoXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUxpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy50aHJlYWRMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZVNldHRlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGFubmVsRGVsZXRlZChldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY2hhbm5lbC52aXNpYmxlJzoge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21DaGFubmVsVmlzaWJsZUhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21DaGFubmVsVmlzaWJsZUhhbmRsZXIoXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUxpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy50aHJlYWRMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZVNldHRlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGFubmVsVmlzaWJsZShldmVudCwgY2hhbm5lbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY2hhbm5lbC51cGRhdGVkJzoge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21DaGFubmVsVXBkYXRlZEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21DaGFubmVsVXBkYXRlZEhhbmRsZXIoXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUxpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy50aHJlYWRMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZVNldHRlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGFubmVsVXBkYXRlKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGFubmVsLnRydW5jYXRlZCc6IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VzdG9tQ2hhbm5lbFRydW5jYXRlZEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21DaGFubmVsVHJ1bmNhdGVkSGFuZGxlcihcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlU2V0dGVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5uZWxUcnVuY2F0ZShldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTmV3TWVzc2FnZShfOiBFdmVudCwgY2hhbm5lbDogQ2hhbm5lbDxUPikge1xuICAgIGNvbnN0IGNoYW5uZWxJbmRleCA9IHRoaXMuY2hhbm5lbHMuZmluZEluZGV4KChjKSA9PiBjLmNpZCA9PT0gY2hhbm5lbC5jaWQpO1xuICAgIHRoaXMuY2hhbm5lbHMuc3BsaWNlKGNoYW5uZWxJbmRleCwgMSk7XG4gICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dChbY2hhbm5lbCwgLi4udGhpcy5jaGFubmVsc10pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDaGFubmVsSGlkZGVuKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMucmVtb3ZlQ2hhbm5lbHNGcm9tQ2hhbm5lbExpc3QoW2V2ZW50LmNoYW5uZWwhLmNpZF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDaGFubmVsRGVsZXRlZChldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLnJlbW92ZUNoYW5uZWxzRnJvbUNoYW5uZWxMaXN0KFtldmVudC5jaGFubmVsIS5jaWRdKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhbm5lbFZpc2libGUoZXZlbnQ6IEV2ZW50LCBjaGFubmVsOiBDaGFubmVsPFQ+KSB7XG4gICAgaWYgKCF0aGlzLmNoYW5uZWxzLmZpbmQoKGMpID0+IGMuY2lkID09PSBldmVudC5jaWQpKSB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT5cbiAgICAgICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dChbLi4udGhpcy5jaGFubmVscywgY2hhbm5lbF0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhbm5lbFVwZGF0ZShldmVudDogRXZlbnQ8VD4pIHtcbiAgICBjb25zdCBjaGFubmVsSW5kZXggPSB0aGlzLmNoYW5uZWxzLmZpbmRJbmRleChcbiAgICAgIChjKSA9PiBjLmNpZCA9PT0gZXZlbnQuY2hhbm5lbCEuY2lkXG4gICAgKTtcbiAgICBpZiAoY2hhbm5lbEluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5jaGFubmVsc1tjaGFubmVsSW5kZXhdLmRhdGEgPSBldmVudC5jaGFubmVsO1xuICAgICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dChbLi4udGhpcy5jaGFubmVsc10pO1xuICAgICAgaWYgKGV2ZW50LmNoYW5uZWw/LmNpZCA9PT0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpPy5jaWQpIHtcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgICAgIGNoYW5uZWwuZGF0YSA9IGV2ZW50LmNoYW5uZWw7XG4gICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dChjaGFubmVsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNoYW5uZWxUcnVuY2F0ZShldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBjaGFubmVsSW5kZXggPSB0aGlzLmNoYW5uZWxzLmZpbmRJbmRleChcbiAgICAgIChjKSA9PiBjLmNpZCA9PT0gZXZlbnQuY2hhbm5lbCEuY2lkXG4gICAgKTtcbiAgICBpZiAoY2hhbm5lbEluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5jaGFubmVsc1tjaGFubmVsSW5kZXhdLnN0YXRlLm1lc3NhZ2VzID0gW107XG4gICAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5uZXh0KFsuLi50aGlzLmNoYW5uZWxzXSk7XG4gICAgICBpZiAoZXZlbnQuY2hhbm5lbD8uY2lkID09PSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk/LmNpZCkge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICAgICAgY2hhbm5lbC5zdGF0ZS5tZXNzYWdlcyA9IFtdO1xuICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0Lm5leHQoY2hhbm5lbCk7XG4gICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtdKTtcbiAgICAgICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbm5lbHNTdWJqZWN0LmdldFZhbHVlKCkgfHwgW107XG4gIH1cblxuICBwcml2YXRlIGdldCBjYW5TZW5kUmVhZEV2ZW50cygpIHtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGlmICghY2hhbm5lbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjYXBhYmlsaXRlcyA9IGNoYW5uZWwuZGF0YT8ub3duX2NhcGFiaWxpdGllcyBhcyBzdHJpbmdbXTtcbiAgICByZXR1cm4gY2FwYWJpbGl0ZXMuaW5kZXhPZigncmVhZC1ldmVudHMnKSAhPT0gLTE7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZm9ybVRvU3RyZWFtTWVzc2FnZShcbiAgICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPFQ+IHwgTWVzc2FnZVJlc3BvbnNlPFQ+IHwgRm9ybWF0TWVzc2FnZVJlc3BvbnNlPFQ+LFxuICAgIGNoYW5uZWw6IENoYW5uZWw8VD5cbiAgKSB7XG4gICAgY29uc3QgaXNUaHJlYWRNZXNzYWdlID0gISFtZXNzYWdlLnBhcmVudF9pZDtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzU3RyZWFtTWVzc2FnZShtZXNzYWdlKSAmJlxuICAgICAgdGhpcy5pc0Zvcm1hdE1lc3NhZ2VSZXNwb25zZShtZXNzYWdlKVxuICAgICkge1xuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzRm9ybWF0TWVzc2FnZVJlc3BvbnNlKG1lc3NhZ2UpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICByZWFkQnk6IGlzVGhyZWFkTWVzc2FnZSA/IFtdIDogZ2V0UmVhZEJ5KG1lc3NhZ2UsIGNoYW5uZWwpLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZm9ybWF0TWVzc2FnZSA9IHRoaXMuZm9ybWF0TWVzc2FnZShtZXNzYWdlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmZvcm1hdE1lc3NhZ2UsXG4gICAgICAgIHJlYWRCeTogaXNUaHJlYWRNZXNzYWdlID8gW10gOiBnZXRSZWFkQnkoZm9ybWF0TWVzc2FnZSwgY2hhbm5lbCksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVHlwaW5nU3RhcnRFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudXNlcj8uaWQgPT09IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyPy5pZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc1R5cGluZ0luVGhyZWFkID0gISFldmVudC5wYXJlbnRfaWQ7XG4gICAgaWYgKFxuICAgICAgaXNUeXBpbmdJblRocmVhZCAmJlxuICAgICAgZXZlbnQucGFyZW50X2lkICE9PSB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QuZ2V0VmFsdWUoKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdWJqZWN0ID0gaXNUeXBpbmdJblRocmVhZFxuICAgICAgPyB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWRTdWJqZWN0XG4gICAgICA6IHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWxTdWJqZWN0O1xuICAgIGNvbnN0IHVzZXJzOiBVc2VyUmVzcG9uc2VbXSA9IHN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCB1c2VyID0gZXZlbnQudXNlcjtcbiAgICBpZiAodXNlciAmJiAhdXNlcnMuZmluZCgodSkgPT4gdS5pZCA9PT0gdXNlci5pZCkpIHtcbiAgICAgIHVzZXJzLnB1c2godXNlcik7XG4gICAgICBzdWJqZWN0Lm5leHQoWy4uLnVzZXJzXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUeXBpbmdTdG9wRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgdXNlcnNUeXBpbmdJbkNoYW5uZWwgPSB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHVzZXJzVHlwaW5nSW5UaHJlYWQgPSB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWRTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgY29uc3QgdXNlciA9IGV2ZW50LnVzZXI7XG4gICAgaWYgKHVzZXIgJiYgdXNlcnNUeXBpbmdJbkNoYW5uZWwuZmluZCgodSkgPT4gdS5pZCA9PT0gdXNlci5pZCkpIHtcbiAgICAgIHVzZXJzVHlwaW5nSW5DaGFubmVsLnNwbGljZShcbiAgICAgICAgdXNlcnNUeXBpbmdJbkNoYW5uZWwuZmluZEluZGV4KCh1KSA9PiB1LmlkID09PSB1c2VyLmlkKSxcbiAgICAgICAgMVxuICAgICAgKTtcbiAgICAgIHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWxTdWJqZWN0Lm5leHQoWy4uLnVzZXJzVHlwaW5nSW5DaGFubmVsXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh1c2VyICYmIHVzZXJzVHlwaW5nSW5UaHJlYWQuZmluZCgodSkgPT4gdS5pZCA9PT0gdXNlci5pZCkpIHtcbiAgICAgIHVzZXJzVHlwaW5nSW5UaHJlYWQuc3BsaWNlKFxuICAgICAgICB1c2Vyc1R5cGluZ0luVGhyZWFkLmZpbmRJbmRleCgodSkgPT4gdS5pZCA9PT0gdXNlci5pZCksXG4gICAgICAgIDFcbiAgICAgICk7XG4gICAgICB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWRTdWJqZWN0Lm5leHQoWy4uLnVzZXJzVHlwaW5nSW5UaHJlYWRdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUxhdGVzdE1lc3NhZ2VzKGV2ZW50OiBFdmVudCkge1xuICAgIGlmIChcbiAgICAgIGV2ZW50Lm1lc3NhZ2U/LnVzZXI/LmlkICE9PSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlPy5jaGF0Q2xpZW50LnVzZXI/LmlkXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxhdGVzdE1lc3NhZ2VzID1cbiAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGlmICghZXZlbnQubWVzc2FnZT8uY3JlYXRlZF9hdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjaGFubmVsSWQgPSBldmVudD8ubWVzc2FnZT8uY2lkO1xuICAgIGlmICghY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2VEYXRlID0gbmV3IERhdGUoZXZlbnQubWVzc2FnZS5jcmVhdGVkX2F0KTtcbiAgICBpZiAoXG4gICAgICAhbGF0ZXN0TWVzc2FnZXNbY2hhbm5lbElkXSB8fFxuICAgICAgbGF0ZXN0TWVzc2FnZXNbY2hhbm5lbElkXT8uZ2V0VGltZSgpIDwgbWVzc2FnZURhdGUuZ2V0VGltZSgpXG4gICAgKSB7XG4gICAgICBsYXRlc3RNZXNzYWdlc1tjaGFubmVsSWRdID0gbWVzc2FnZURhdGU7XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2VEYXRlQnlVc2VyQnlDaGFubmVsc1N1YmplY3QubmV4dCh7XG4gICAgICAgIC4uLmxhdGVzdE1lc3NhZ2VzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
926
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL2NoYW5uZWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFFYixhQUFhLEdBRWQsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFpQmpFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXpELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7Ozs7QUFRdEM7O0dBRUc7QUFJSCxNQUFNLE9BQU8sY0FBYztJQThQekIsWUFDVSxpQkFBdUMsRUFDdkMsTUFBYyxFQUNkLG1CQUF3QztRQUZ4QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQXNCO1FBQ3ZDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBdEUxQyxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUMzQyxTQUFTLENBQ1YsQ0FBQztRQUNNLHlCQUFvQixHQUFHLElBQUksZUFBZSxDQUNoRCxTQUFTLENBQ1YsQ0FBQztRQUNNLGlDQUE0QixHQUFHLElBQUksZUFBZSxDQUV4RCxFQUFFLENBQUMsQ0FBQztRQUNFLDJCQUFzQixHQUFHLElBQUksYUFBYSxDQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELCtCQUEwQixHQUFrQyxFQUFFLENBQUM7UUFDL0QsaUNBQTRCLEdBQUcsSUFBSSxlQUFlLENBRXhELFNBQVMsQ0FBQyxDQUFDO1FBQ0wsZ0NBQTJCLEdBQUcsSUFBSSxlQUFlLENBRXZELEVBQUUsQ0FB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WUFDQSxPQUFPO1NBQ1I7UUFDRCxNQUFNLGNBQWMsR0FDbEIsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxDQUFBLE1BQUEsS0FBSyxDQUFDLE9BQU8sMENBQUUsVUFBVSxDQUFBLEVBQUU7WUFDOUIsT0FBTztTQUNSO1FBQ0QsTUFBTSxTQUFTLEdBQUcsTUFBQSxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsT0FBTywwQ0FBRSxHQUFHLENBQUM7UUFDdEMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNkLE9BQU87U0FDUjtRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkQsSUFDRSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7WUFDMUIsQ0FBQSxNQUFBLGNBQWMsQ0FBQyxTQUFTLENBQUMsMENBQUUsT0FBTyxFQUFFLElBQUcsV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUM1RDtZQUNBLGNBQWMsQ0FBQyxTQUFTLENBQUMsR0FBRyxXQUFXLENBQUM7WUFDeEMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLElBQUksbUJBQzdDLGNBQWMsRUFDakIsQ0FBQztTQUNKO0lBQ0gsQ0FBQzs7MkdBaDBDVSxjQUFjOytHQUFkLGNBQWMsY0FGYixNQUFNOzJGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIE9ic2VydmFibGUsXG4gIFJlcGxheVN1YmplY3QsXG4gIFN1YnNjcmlwdGlvbixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIGZpcnN0LCBtYXAsIHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgQXR0YWNobWVudCxcbiAgQ2hhbm5lbCxcbiAgQ2hhbm5lbEZpbHRlcnMsXG4gIENoYW5uZWxPcHRpb25zLFxuICBDaGFubmVsUmVzcG9uc2UsXG4gIENoYW5uZWxTb3J0LFxuICBFdmVudCxcbiAgRm9ybWF0TWVzc2FnZVJlc3BvbnNlLFxuICBNZXNzYWdlLFxuICBNZXNzYWdlUmVzcG9uc2UsXG4gIFVwZGF0ZWRNZXNzYWdlLFxuICBVc2VyRmlsdGVycyxcbiAgVXNlclJlc3BvbnNlLFxufSBmcm9tICdzdHJlYW0tY2hhdCc7XG5pbXBvcnQgeyBDaGF0Q2xpZW50U2VydmljZSwgQ2xpZW50RXZlbnQgfSBmcm9tICcuL2NoYXQtY2xpZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZVByZXZpZXcgfSBmcm9tICcuL21lc3NhZ2UtcHJldmlldyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9ub3RpZmljYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBnZXRSZWFkQnkgfSBmcm9tICcuL3JlYWQtYnknO1xuaW1wb3J0IHtcbiAgQXR0YWNobWVudFVwbG9hZCxcbiAgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyxcbiAgTWVzc2FnZVJlYWN0aW9uVHlwZSxcbiAgU3RyZWFtTWVzc2FnZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGBDaGFubmVsU2VydmljZWAgcHJvdmlkZXMgZGF0YSBhbmQgaW50ZXJhY3Rpb24gZm9yIHRoZSBjaGFubmVsIGxpc3QgYW5kIG1lc3NhZ2UgbGlzdC5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIENoYW5uZWxTZXJ2aWNlPFxuICBUIGV4dGVuZHMgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyA9IERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3Ncbj4ge1xuICAvKipcbiAgICogRW1pdHMgYGZhbHNlYCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBwYWdlcyBvZiBjaGFubmVscyB0aGF0IGNhbiBiZSBsb2FkZWQuXG4gICAqL1xuICBoYXNNb3JlQ2hhbm5lbHMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGN1cnJlbnRseSBsb2FkZWQgYW5kIFt3YXRjaGVkXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC93YXRjaF9jaGFubmVsLz9sYW5ndWFnZT1qYXZhc2NyaXB0KSBjaGFubmVsIGxpc3QuXG4gICAqXG4gICAqIDo6OmltcG9ydGFudFxuICAgKiBJZiB5b3Ugd2FudCB0byBzdWJzY3JpYmUgdG8gY2hhbm5lbCBldmVudHMsIHlvdSBuZWVkIHRvIG1hbnVhbGx5IHJlZW50ZXIgQW5ndWxhcidzIGNoYW5nZSBkZXRlY3Rpb24gem9uZSwgb3VyIFtDaGFuZ2UgZGV0ZWN0aW9uIGd1aWRlXSguLi9jb25jZXB0cy9jaGFuZ2UtZGV0ZWN0aW9uLm1keCkgZXhwbGFpbnMgdGhpcyBpbiBkZXRhaWwuXG4gICAqIDo6OlxuICAgKlxuICAgKiAgQXBhcnQgZnJvbSBwYWdpbmF0aW9uLCB0aGUgY2hhbm5lbCBsaXN0IGlzIGFsc28gdXBkYXRlZCBvbiB0aGUgZm9sbG93aW5nIGV2ZW50czpcbiAgICpcbiAgICogIHwgRXZlbnQgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZWZhdWx0IGJlaGF2aW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDdXN0b20gaGFuZGxlciB0byBvdmVycmlkZSAgICAgICAgICAgICAgICAgICAgfFxuICAgKiAgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gICAqICB8IGBjaGFubmVsLmRlbGV0ZWRgICAgICAgICAgICAgICAgICAgIHwgUmVtb3ZlIGNoYW5uZWwgZnJvbSB0aGUgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGN1c3RvbUNoYW5uZWxEZWxldGVkSGFuZGxlcmAgICAgICAgICAgICAgICAgIHxcbiAgICogIHwgYGNoYW5uZWwuaGlkZGVuYCAgICAgICAgICAgICAgICAgICAgfCBSZW1vdmUgY2hhbm5lbCBmcm9tIHRoZSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgY3VzdG9tQ2hhbm5lbEhpZGRlbkhhbmRsZXJgICAgICAgICAgICAgICAgICAgfFxuICAgKiAgfCBgY2hhbm5lbC50cnVuY2F0ZWRgICAgICAgICAgICAgICAgICB8IFVwZGF0ZXMgdGhlIGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBjdXN0b21DaGFubmVsVHJ1bmNhdGVkSGFuZGxlcmAgICAgICAgICAgICAgICB8XG4gICAqICB8IGBjaGFubmVsLnVwZGF0ZWRgICAgICAgICAgICAgICAgICAgIHwgVXBkYXRlcyB0aGUgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGN1c3RvbUNoYW5uZWxVcGRhdGVkSGFuZGxlcmAgICAgICAgICAgICAgICAgIHxcbiAgICogIHwgYGNoYW5uZWwudmlzaWJsZWAgICAgICAgICAgICAgICAgICAgfCBBZGRzIHRoZSBjaGFubmVsIHRvIHRoZSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgY3VzdG9tQ2hhbm5lbFZpc2libGVIYW5kbGVyYCAgICAgICAgICAgICAgICAgfFxuICAgKiAgfCBgbWVzc2FnZS5uZXdgICAgICAgICAgICAgICAgICAgICAgICB8IE1vdmVzIHRoZSBjaGFubmVsIHRvIHRvcCBvZiB0aGUgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBjdXN0b21OZXdNZXNzYWdlSGFuZGxlcmAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqICB8IGBub3RpZmljYXRpb24uYWRkZWRfdG9fY2hhbm5lbGAgICAgIHwgQWRkcyB0aGUgbmV3IGNoYW5uZWwgdG8gdGhlIHRvcCBvZiB0aGUgbGlzdCBhbmQgc3RhcnRzIHdhdGNoaW5nIGl0IHwgYGN1c3RvbUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcmAgICAgIHxcbiAgICogIHwgYG5vdGlmaWNhdGlvbi5tZXNzYWdlX25ld2AgICAgICAgICAgfCBBZGRzIHRoZSBuZXcgY2hhbm5lbCB0byB0aGUgdG9wIG9mIHRoZSBsaXN0IGFuZCBzdGFydHMgd2F0Y2hpbmcgaXQgfCBgY3VzdG9tTmV3TWVzc2FnZU5vdGlmaWNhdGlvbkhhbmRsZXJgICAgICAgICAgfFxuICAgKiAgfCBgbm90aWZpY2F0aW9uLnJlbW92ZWRfZnJvbV9jaGFubmVsYCB8IFJlbW92ZXMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBjdXN0b21SZW1vdmVkRnJvbUNoYW5uZWxOb3RpZmljYXRpb25IYW5kbGVyYCB8XG4gICAqXG4gICAqICBJdCdzIGltcG9ydGFudCB0byBub3RlIHRoYXQgZmlsdGVycyBkb24ndCBhcHBseSB0byB1cGRhdGVzIHRvIHRoZSBsaXN0IGZyb20gZXZlbnRzLlxuICAgKlxuICAgKiAgT3VyIHBsYXRmb3JtIGRvY3VtZW50YXRpb24gY292ZXJzIHRoZSB0b3BpYyBvZiBbY2hhbm5lbCBldmVudHNdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L2V2ZW50X29iamVjdC8/bGFuZ3VhZ2U9amF2YXNjcmlwdCNldmVudHMpIGluIGRlcHRoLlxuICAgKi9cbiAgY2hhbm5lbHMkOiBPYnNlcnZhYmxlPENoYW5uZWw8VD5bXSB8IHVuZGVmaW5lZD47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgY3VycmVudGx5IGFjdGl2ZSBjaGFubmVsLlxuICAgKlxuICAgKiA6OjppbXBvcnRhbnRcbiAgICogSWYgeW91IHdhbnQgdG8gc3Vic2NyaWJlIHRvIGNoYW5uZWwgZXZlbnRzLCB5b3UgbmVlZCB0byBtYW51YWxseSByZWVudGVyIEFuZ3VsYXIncyBjaGFuZ2UgZGV0ZWN0aW9uIHpvbmUsIG91ciBbQ2hhbmdlIGRldGVjdGlvbiBndWlkZV0oLi4vY29uY2VwdHMvY2hhbmdlLWRldGVjdGlvbi5tZHgpIGV4cGxhaW5zIHRoaXMgaW4gZGV0YWlsLlxuICAgKiA6OjpcbiAgICpcbiAgICogVGhlIGFjdGl2ZSBjaGFubmVsIHdpbGwgYWx3YXlzIGJlIG1hcmtlZCBhcyByZWFkIHdoZW4gYSBuZXcgbWVzc2FnZSBpcyByZWNlaXZlZFxuICAgKi9cbiAgYWN0aXZlQ2hhbm5lbCQ6IE9ic2VydmFibGU8Q2hhbm5lbDxUPiB8IHVuZGVmaW5lZD47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgbGlzdCBvZiBjdXJyZW50bHkgbG9hZGVkIG1lc3NhZ2VzIG9mIHRoZSBhY3RpdmUgY2hhbm5lbC5cbiAgICovXG4gIGFjdGl2ZUNoYW5uZWxNZXNzYWdlcyQ6IE9ic2VydmFibGU8U3RyZWFtTWVzc2FnZTxUPltdPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBpZCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBhcmVudCBtZXNzYWdlLiBJZiBubyBtZXNzYWdlIGlzIHNlbGVjdGVkLCBpdCBlbWl0cyB1bmRlZmluZWQuXG4gICAqL1xuICBhY3RpdmVQYXJlbnRNZXNzYWdlSWQkOiBPYnNlcnZhYmxlPHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgbGlzdCBvZiBjdXJyZW50bHkgbG9hZGVkIHRocmVhZCByZXBsaWVzIGJlbG9uZ2luZyB0byB0aGUgc2VsZWN0ZWQgcGFyZW50IG1lc3NhZ2UuIElmIHRoZXJlIGlzIG5vIGN1cnJlbnRseSBhY3RpdmUgdGhyZWFkIGl0IGVtaXRzIGFuIGVtcHR5IGFycmF5LlxuICAgKi9cbiAgYWN0aXZlVGhyZWFkTWVzc2FnZXMkOiBPYnNlcnZhYmxlPFN0cmVhbU1lc3NhZ2U8VD5bXT47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBhcmVudCBtZXNzYWdlLiBJZiBubyBtZXNzYWdlIGlzIHNlbGVjdGVkLCBpdCBlbWl0cyB1bmRlZmluZWQuXG4gICAqL1xuICBhY3RpdmVQYXJlbnRNZXNzYWdlJDogT2JzZXJ2YWJsZTxTdHJlYW1NZXNzYWdlPFQ+IHwgdW5kZWZpbmVkPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWVzc2FnZSB0byBxdW90ZVxuICAgKi9cbiAgbWVzc2FnZVRvUXVvdGUkOiBPYnNlcnZhYmxlPFN0cmVhbU1lc3NhZ2U8VD4gfCB1bmRlZmluZWQ+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGxpc3Qgb2YgdXNlcnMgdGhhdCBhcmUgY3VycmVudGx5IHR5cGluZyBpbiB0aGUgY2hhbm5lbCAoY3VycmVudCB1c2VyIGlzIG5vdCBpbmNsdWRlZClcbiAgICovXG4gIHVzZXJzVHlwaW5nSW5DaGFubmVsJDogT2JzZXJ2YWJsZTxVc2VyUmVzcG9uc2U8VD5bXT47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgbGlzdCBvZiB1c2VycyB0aGF0IGFyZSBjdXJyZW50bHkgdHlwaW5nIGluIHRoZSBhY3RpdmUgdGhyZWFkIChjdXJyZW50IHVzZXIgaXMgbm90IGluY2x1ZGVkKVxuICAgKi9cbiAgdXNlcnNUeXBpbmdJblRocmVhZCQ6IE9ic2VydmFibGU8VXNlclJlc3BvbnNlPFQ+W10+O1xuICAvKipcbiAgICogRW1pdHMgYSBtYXAgdGhhdCBjb250YWlucyB0aGUgZGF0ZSBvZiB0aGUgbGF0ZXN0IG1lc3NhZ2Ugc2VudCBieSB0aGUgY3VycmVudCB1c2VyIGJ5IGNoYW5uZWxzICh0aGlzIGlzIHVzZWQgdG8gZGV0ZWN0IGlmIHNsb3cgbW9kZSBjb3VudGRvd24gc2hvdWxkIGJlIHN0YXJ0ZWQpXG4gICAqL1xuICBsYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHMkOiBPYnNlcnZhYmxlPHsgW2tleTogc3RyaW5nXTogRGF0ZSB9PjtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgaWYgYSBuZXcgbWVzc2FnZSByZWNlaXZlZCBmcm9tIGEgY2hhbm5lbCB0aGF0IGlzIG5vdCBiZWluZyB3YXRjaGVkLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oLi9DaGFubmVsU2VydmljZS5tZHgvI2NoYW5uZWxzKVxuICAgKi9cbiAgY3VzdG9tTmV3TWVzc2FnZU5vdGlmaWNhdGlvbkhhbmRsZXI/OiAoXG4gICAgY2xpZW50RXZlbnQ6IENsaWVudEV2ZW50LFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoY2hhbm5lbHM6IChDaGFubmVsPFQ+IHwgQ2hhbm5lbFJlc3BvbnNlPFQ+KVtdKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgd2hlbiB0aGUgdXNlciBpcyBhZGRlZCB0byBhIGNoYW5uZWwsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSguL0NoYW5uZWxTZXJ2aWNlLm1keC8jY2hhbm5lbHMpXG4gICAqL1xuICBjdXN0b21BZGRlZFRvQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXI/OiAoXG4gICAgY2xpZW50RXZlbnQ6IENsaWVudEV2ZW50LFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoY2hhbm5lbHM6IChDaGFubmVsPFQ+IHwgQ2hhbm5lbFJlc3BvbnNlPFQ+KVtdKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgd2hlbiB0aGUgdXNlciBpcyByZW1vdmVkIGZyb20gYSBjaGFubmVsLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oLi9DaGFubmVsU2VydmljZS5tZHgvI2NoYW5uZWxzKVxuICAgKi9cbiAgY3VzdG9tUmVtb3ZlZEZyb21DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcj86IChcbiAgICBjbGllbnRFdmVudDogQ2xpZW50RXZlbnQsXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChjaGFubmVsczogKENoYW5uZWw8VD4gfCBDaGFubmVsUmVzcG9uc2U8VD4pW10pID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIGEgY2hhbm5lbCBpcyBkZWxldGVkLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oLi9DaGFubmVsU2VydmljZS5tZHgvI2NoYW5uZWxzKVxuICAgKi9cbiAgY3VzdG9tQ2hhbm5lbERlbGV0ZWRIYW5kbGVyPzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBjaGFubmVsOiBDaGFubmVsPFQ+LFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoY2hhbm5lbHM6IChDaGFubmVsPFQ+IHwgQ2hhbm5lbFJlc3BvbnNlPFQ+KVtdKSA9PiB2b2lkLFxuICAgIG1lc3NhZ2VMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2U8VD5bXSkgPT4gdm9pZCxcbiAgICB0aHJlYWRMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2U8VD5bXSkgPT4gdm9pZCxcbiAgICBwYXJlbnRNZXNzYWdlU2V0dGVyOiAobWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPiB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIHdoZW4gYSBjaGFubmVsIGlzIHVwZGF0ZWQsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSguL0NoYW5uZWxTZXJ2aWNlLm1keC8jY2hhbm5lbHMpXG4gICAqL1xuICBjdXN0b21DaGFubmVsVXBkYXRlZEhhbmRsZXI/OiAoXG4gICAgZXZlbnQ6IEV2ZW50LFxuICAgIGNoYW5uZWw6IENoYW5uZWw8VD4sXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChjaGFubmVsczogKENoYW5uZWw8VD4gfCBDaGFubmVsUmVzcG9uc2U8VD4pW10pID0+IHZvaWQsXG4gICAgbWVzc2FnZUxpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHRocmVhZExpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHBhcmVudE1lc3NhZ2VTZXR0ZXI6IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgd2hlbiBhIGNoYW5uZWwgaXMgdHJ1bmNhdGVkLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oLi9DaGFubmVsU2VydmljZS5tZHgvI2NoYW5uZWxzKVxuICAgKi9cbiAgY3VzdG9tQ2hhbm5lbFRydW5jYXRlZEhhbmRsZXI/OiAoXG4gICAgZXZlbnQ6IEV2ZW50LFxuICAgIGNoYW5uZWw6IENoYW5uZWw8VD4sXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChjaGFubmVsczogKENoYW5uZWw8VD4gfCBDaGFubmVsUmVzcG9uc2U8VD4pW10pID0+IHZvaWQsXG4gICAgbWVzc2FnZUxpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZTxUPltdKSA9PiB2b2lkLFxuICAgIHRocmVhZExpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZTxUPltdKSA9PiB2b2lkLFxuICAgIHBhcmVudE1lc3NhZ2VTZXR0ZXI6IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPFQ+IHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgd2hlbiBhIGNoYW5uZWwgYmVjb21lcyBoaWRkZW4sIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSguL0NoYW5uZWxTZXJ2aWNlLm1keC8jY2hhbm5lbHMpXG4gICAqL1xuICBjdXN0b21DaGFubmVsSGlkZGVuSGFuZGxlcj86IChcbiAgICBldmVudDogRXZlbnQsXG4gICAgY2hhbm5lbDogQ2hhbm5lbDxUPixcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKGNoYW5uZWxzOiAoQ2hhbm5lbDxUPiB8IENoYW5uZWxSZXNwb25zZTxUPilbXSkgPT4gdm9pZCxcbiAgICBtZXNzYWdlTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlPFQ+W10pID0+IHZvaWQsXG4gICAgdGhyZWFkTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlPFQ+W10pID0+IHZvaWQsXG4gICAgcGFyZW50TWVzc2FnZVNldHRlcjogKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U8VD4gfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIGEgY2hhbm5lbCBiZWNvbWVzIHZpc2libGUsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSguL0NoYW5uZWxTZXJ2aWNlLm1keC8jY2hhbm5lbHMpXG4gICAqL1xuICBjdXN0b21DaGFubmVsVmlzaWJsZUhhbmRsZXI/OiAoXG4gICAgZXZlbnQ6IEV2ZW50LFxuICAgIGNoYW5uZWw6IENoYW5uZWw8VD4sXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChjaGFubmVsczogKENoYW5uZWw8VD4gfCBDaGFubmVsUmVzcG9uc2U8VD4pW10pID0+IHZvaWQsXG4gICAgbWVzc2FnZUxpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZTxUPltdKSA9PiB2b2lkLFxuICAgIHRocmVhZExpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZTxUPltdKSA9PiB2b2lkLFxuICAgIHBhcmVudE1lc3NhZ2VTZXR0ZXI6IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPFQ+IHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgaWYgYSBuZXcgbWVzc2FnZSByZWNlaXZlZCBmcm9tIGEgY2hhbm5lbCB0aGF0IGlzIGJlaW5nIHdhdGNoZWQsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSguL0NoYW5uZWxTZXJ2aWNlLm1keC8jY2hhbm5lbHMpXG4gICAqL1xuICBjdXN0b21OZXdNZXNzYWdlSGFuZGxlcj86IChcbiAgICBldmVudDogRXZlbnQsXG4gICAgY2hhbm5lbDogQ2hhbm5lbDxUPixcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKGNoYW5uZWxzOiAoQ2hhbm5lbDxUPiB8IENoYW5uZWxSZXNwb25zZTxUPilbXSkgPT4gdm9pZCxcbiAgICBtZXNzYWdlTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlPFQ+W10pID0+IHZvaWQsXG4gICAgdGhyZWFkTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlPFQ+W10pID0+IHZvaWQsXG4gICAgcGFyZW50TWVzc2FnZVNldHRlcjogKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U8VD4gfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogWW91IGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCBmaWxlIHVwbG9hZCByZXF1ZXN0IC0geW91IGNhbiB1c2UgdGhpcyB0byB1cGxvYWQgZmlsZXMgdG8geW91ciBvd24gQ0ROXG4gICAqL1xuICBjdXN0b21GaWxlVXBsb2FkUmVxdWVzdD86IChcbiAgICBmaWxlOiBGaWxlLFxuICAgIGNoYW5uZWw6IENoYW5uZWw8VD5cbiAgKSA9PiBQcm9taXNlPHsgZmlsZTogc3RyaW5nIH0+O1xuICAvKipcbiAgICogWW91IGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCBpbWFnZSB1cGxvYWQgcmVxdWVzdCAtIHlvdSBjYW4gdXNlIHRoaXMgdG8gdXBsb2FkIGltYWdlcyB0byB5b3VyIG93biBDRE5cbiAgICovXG4gIGN1c3RvbUltYWdlVXBsb2FkUmVxdWVzdD86IChcbiAgICBmaWxlOiBGaWxlLFxuICAgIGNoYW5uZWw6IENoYW5uZWw8VD5cbiAgKSA9PiBQcm9taXNlPHsgZmlsZTogc3RyaW5nIH0+O1xuICAvKipcbiAgICogWW91IGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCBmaWxlIGRlbGV0ZSByZXF1ZXN0IC0gb3ZlcnJpZGUgdGhpcyBpZiB5b3UgdXNlIHlvdXIgb3duIENETlxuICAgKi9cbiAgY3VzdG9tRmlsZURlbGV0ZVJlcXVlc3Q/OiAodXJsOiBzdHJpbmcsIGNoYW5uZWw6IENoYW5uZWw8VD4pID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGltYWdlIGRlbGV0ZSByZXF1ZXN0IC0gb3ZlcnJpZGUgdGhpcyBpZiB5b3UgdXNlIHlvdXIgb3duIENETlxuICAgKi9cbiAgY3VzdG9tSW1hZ2VEZWxldGVSZXF1ZXN0PzogKFxuICAgIHVybDogc3RyaW5nLFxuICAgIGNoYW5uZWw6IENoYW5uZWw8VD5cbiAgKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBwcml2YXRlIGNoYW5uZWxzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2hhbm5lbDxUPltdIHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcbiAgcHJpdmF0ZSBhY3RpdmVDaGFubmVsU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2hhbm5lbDxUPiB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG4gIHByaXZhdGUgYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgKFN0cmVhbU1lc3NhZ2U8VD4gfCBNZXNzYWdlUmVzcG9uc2U8VD4gfCBGb3JtYXRNZXNzYWdlUmVzcG9uc2U8VD4pW11cbiAgPihbXSk7XG4gIHByaXZhdGUgaGFzTW9yZUNoYW5uZWxzU3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuICBwcml2YXRlIGFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zOiB7IHVuc3Vic2NyaWJlOiAoKSA9PiB2b2lkIH1bXSA9IFtdO1xuICBwcml2YXRlIGFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIHN0cmluZyB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICAoU3RyZWFtTWVzc2FnZTxUPiB8IE1lc3NhZ2VSZXNwb25zZTxUPiB8IEZvcm1hdE1lc3NhZ2VSZXNwb25zZTxUPilbXVxuICA+KFtdKTtcbiAgcHJpdmF0ZSBsYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgW2tleTogc3RyaW5nXTogRGF0ZTtcbiAgfT4oe30pO1xuICBwcml2YXRlIGZpbHRlcnM6IENoYW5uZWxGaWx0ZXJzPFQ+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHNvcnQ6IENoYW5uZWxTb3J0PFQ+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG9wdGlvbnM6IENoYW5uZWxPcHRpb25zIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VQYWdlU2l6ZSA9IDI1O1xuICBwcml2YXRlIG1lc3NhZ2VUb1F1b3RlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgU3RyZWFtTWVzc2FnZTxUPiB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgdXNlcnNUeXBpbmdJbkNoYW5uZWxTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVc2VyUmVzcG9uc2U8VD5bXT4oXG4gICAgW11cbiAgKTtcbiAgcHJpdmF0ZSB1c2Vyc1R5cGluZ0luVGhyZWFkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXNlclJlc3BvbnNlPFQ+W10+KFxuICAgIFtdXG4gICk7XG4gIHByaXZhdGUgX3Nob3VsZE1hcmtBY3RpdmVDaGFubmVsQXNSZWFkID0gdHJ1ZTtcbiAgcHJpdmF0ZSBzaG91bGRTZXRBY3RpdmVDaGFubmVsOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGNsaWVudEV2ZW50c1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGlzU3RhdGVSZWNvdmVyeUluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICBwcml2YXRlIGNoYW5uZWxMaXN0U2V0dGVyID0gKFxuICAgIGNoYW5uZWxzOiAoQ2hhbm5lbDxUPiB8IENoYW5uZWxSZXNwb25zZTxUPilbXVxuICApID0+IHtcbiAgICBjb25zdCBjdXJyZW50Q2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzU3ViamVjdC5nZXRWYWx1ZSgpIHx8IFtdO1xuICAgIGNvbnN0IG5ld0NoYW5uZWxzID0gY2hhbm5lbHMuZmlsdGVyKFxuICAgICAgKGMpID0+ICFjdXJyZW50Q2hhbm5lbHMuZmluZCgoY2hhbm5lbCkgPT4gY2hhbm5lbC5jaWQgPT09IGMuY2lkKVxuICAgICk7XG4gICAgY29uc3QgZGVsZXRlZENoYW5uZWxzID0gY3VycmVudENoYW5uZWxzLmZpbHRlcihcbiAgICAgIChjKSA9PiAhY2hhbm5lbHM/LmZpbmQoKGNoYW5uZWwpID0+IGNoYW5uZWwuY2lkID09PSBjLmNpZClcbiAgICApO1xuICAgIHRoaXMuYWRkQ2hhbm5lbHNGcm9tTm90aWZpY2F0aW9uKG5ld0NoYW5uZWxzIGFzIENoYW5uZWxSZXNwb25zZTxUPltdKTtcbiAgICB0aGlzLnJlbW92ZUNoYW5uZWxzRnJvbUNoYW5uZWxMaXN0KGRlbGV0ZWRDaGFubmVscy5tYXAoKGMpID0+IGMuY2lkKSk7XG4gICAgaWYgKCFuZXdDaGFubmVscy5sZW5ndGggJiYgIWRlbGV0ZWRDaGFubmVscy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoY2hhbm5lbHMgYXMgQ2hhbm5lbDxUPltdKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBtZXNzYWdlTGlzdFNldHRlciA9IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZTxUPltdKSA9PiB7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQobWVzc2FnZXMpO1xuICB9O1xuXG4gIHByaXZhdGUgdGhyZWFkTGlzdFNldHRlciA9IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZTxUPltdKSA9PiB7XG4gICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChtZXNzYWdlcyk7XG4gIH07XG5cbiAgcHJpdmF0ZSBwYXJlbnRNZXNzYWdlU2V0dGVyID0gKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U8VD4gfCB1bmRlZmluZWQpID0+IHtcbiAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dChtZXNzYWdlPy5pZCk7XG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGF0Q2xpZW50U2VydmljZTogQ2hhdENsaWVudFNlcnZpY2U8VD4sXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5jaGFubmVscyQgPSB0aGlzLmNoYW5uZWxzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWwkID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlcyQgPSB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QucGlwZShcbiAgICAgIG1hcCgobWVzc2FnZXMpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgICAgIHJldHVybiBtZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+XG4gICAgICAgICAgdGhpcy50cmFuc2Zvcm1Ub1N0cmVhbU1lc3NhZ2UobWVzc2FnZSwgY2hhbm5lbClcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmhhc01vcmVDaGFubmVscyQgPSB0aGlzLmhhc01vcmVDaGFubmVsc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWQkID1cbiAgICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzJCA9IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0LnBpcGUoXG4gICAgICBtYXAoKG1lc3NhZ2VzKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgICAgICByZXR1cm4gbWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PlxuICAgICAgICAgIHRoaXMudHJhbnNmb3JtVG9TdHJlYW1NZXNzYWdlKG1lc3NhZ2UsIGNoYW5uZWwpXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXMkLFxuICAgICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWQkLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgIChbbWVzc2FnZXMsIHBhcmVudE1lc3NhZ2VJZF06IFtcbiAgICAgICAgICBTdHJlYW1NZXNzYWdlW10sXG4gICAgICAgICAgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgIF0pID0+IHtcbiAgICAgICAgICBpZiAoIXBhcmVudE1lc3NhZ2VJZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uaWQgPT09IHBhcmVudE1lc3NhZ2VJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApLFxuICAgICAgc2hhcmVSZXBsYXkoKVxuICAgICk7XG4gICAgdGhpcy5tZXNzYWdlVG9RdW90ZSQgPSB0aGlzLm1lc3NhZ2VUb1F1b3RlU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY29ubmVjdGlvblN0YXRlJFxuICAgICAgLnBpcGUoZmlsdGVyKChzKSA9PiBzID09PSAnb25saW5lJykpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdm9pZCB0aGlzLnNldEFzQWN0aXZlUGFyZW50TWVzc2FnZSh1bmRlZmluZWQpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsJCA9XG4gICAgICB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWQkID0gdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmxhdGVzdE1lc3NhZ2VEYXRlQnlVc2VyQnlDaGFubmVscyQgPVxuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHNldCB0byBmYWxzZSwgcmVhZCBldmVudHMgd29uJ3QgYmUgc2VudCBhcyBuZXcgbWVzc2FnZXMgYXJlIHJlY2VpdmVkLiBJZiBzZXQgdG8gdHJ1ZSBhY3RpdmUgY2hhbm5lbCAoaWYgYW55KSB3aWxsIGltbWVkaWF0ZWx5IGJlIG1hcmtlZCBhcyByZWFkLlxuICAgKi9cbiAgZ2V0IHNob3VsZE1hcmtBY3RpdmVDaGFubmVsQXNSZWFkKCkge1xuICAgIHJldHVybiB0aGlzLl9zaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gZmFsc2UsIHJlYWQgZXZlbnRzIHdvbid0IGJlIHNlbnQgYXMgbmV3IG1lc3NhZ2VzIGFyZSByZWNlaXZlZC4gSWYgc2V0IHRvIHRydWUgYWN0aXZlIGNoYW5uZWwgKGlmIGFueSkgd2lsbCBpbW1lZGlhdGVseSBiZSBtYXJrZWQgYXMgcmVhZC5cbiAgICovXG4gIHNldCBzaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZChzaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5fc2hvdWxkTWFya0FjdGl2ZUNoYW5uZWxBc1JlYWQgJiYgc2hvdWxkTWFya0FjdGl2ZUNoYW5uZWxBc1JlYWQpIHtcbiAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKT8ubWFya1JlYWQoKTtcbiAgICB9XG4gICAgdGhpcy5fc2hvdWxkTWFya0FjdGl2ZUNoYW5uZWxBc1JlYWQgPSBzaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBnaXZlbiBgY2hhbm5lbGAgYXMgYWN0aXZlIGFuZCBtYXJrcyBpdCBhcyByZWFkLlxuICAgKiBAcGFyYW0gY2hhbm5lbFxuICAgKi9cbiAgc2V0QXNBY3RpdmVDaGFubmVsKGNoYW5uZWw6IENoYW5uZWw8VD4pIHtcbiAgICBjb25zdCBwcmV2QWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICB0aGlzLnN0b3BXYXRjaEZvckFjdGl2ZUNoYW5uZWxFdmVudHMocHJldkFjdGl2ZUNoYW5uZWwpO1xuICAgIHRoaXMud2F0Y2hGb3JBY3RpdmVDaGFubmVsRXZlbnRzKGNoYW5uZWwpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dChjaGFubmVsKTtcbiAgICBjaGFubmVsLnN0YXRlLm1lc3NhZ2VzLmZvckVhY2goKG0pID0+IHtcbiAgICAgIG0ucmVhZEJ5ID0gZ2V0UmVhZEJ5KG0sIGNoYW5uZWwpO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLmNhblNlbmRSZWFkRXZlbnRzICYmIHRoaXMuc2hvdWxkTWFya0FjdGl2ZUNoYW5uZWxBc1JlYWQpIHtcbiAgICAgIHZvaWQgY2hhbm5lbC5tYXJrUmVhZCgpO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlc10pO1xuICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXSk7XG4gICAgdGhpcy5tZXNzYWdlVG9RdW90ZVN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VsZWN0cyB0aGUgY3VycmVudGx5IGFjdGl2ZSAoaWYgYW55KSBjaGFubmVsXG4gICAqL1xuICBkZXNlbGVjdEFjdGl2ZUNoYW5uZWwoKSB7XG4gICAgY29uc3QgYWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAoIWFjdGl2ZUNoYW5uZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdG9wV2F0Y2hGb3JBY3RpdmVDaGFubmVsRXZlbnRzKGFjdGl2ZUNoYW5uZWwpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtdKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgIHRoaXMubGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzU3ViamVjdC5uZXh0KHt9KTtcbiAgICB0aGlzLnNlbGVjdE1lc3NhZ2VUb1F1b3RlKHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZ2l2ZW4gYG1lc3NhZ2VgIGFzIGFuIGFjdGl2ZSBwYXJlbnQgbWVzc2FnZS4gSWYgYHVuZGVmaW5lZGAgaXMgcHJvdmlkZWQsIGl0IHdpbGwgZGVsZXNlbGVjdCB0aGUgY3VycmVudCBwYXJlbnQgbWVzc2FnZS5cbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIHNldEFzQWN0aXZlUGFyZW50TWVzc2FnZShtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbWVzc2FnZVRvUXVvdGUgPSB0aGlzLm1lc3NhZ2VUb1F1b3RlU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGlmIChtZXNzYWdlVG9RdW90ZSAmJiAhIW1lc3NhZ2VUb1F1b3RlLnBhcmVudF9pZCkge1xuICAgICAgdGhpcy5tZXNzYWdlVG9RdW90ZVN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0Lm5leHQobWVzc2FnZS5pZCk7XG4gICAgICBjb25zdCBhY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYWN0aXZlQ2hhbm5lbD8uZ2V0UmVwbGllcyhtZXNzYWdlLmlkLCB7XG4gICAgICAgIGxpbWl0OiB0aGlzLm9wdGlvbnM/Lm1lc3NhZ2VfbGltaXQsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQocmVzdWx0Py5tZXNzYWdlcyB8fCBbXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBuZXh0IHBhZ2Ugb2YgbWVzc2FnZXMgb2YgdGhlIGFjdGl2ZSBjaGFubmVsLiBUaGUgcGFnZSBzaXplIGNhbiBiZSBzZXQgaW4gdGhlIFtxdWVyeSBvcHRpb25dKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X2NoYW5uZWxzLz9sYW5ndWFnZT1qYXZhc2NyaXB0I3F1ZXJ5LW9wdGlvbnMpIG9iamVjdC5cbiAgICovXG4gIGFzeW5jIGxvYWRNb3JlTWVzc2FnZXMoKSB7XG4gICAgY29uc3QgYWN0aXZlQ2huYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgY29uc3QgbGFzdE1lc3NhZ2VJZCA9IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5nZXRWYWx1ZSgpWzBdPy5pZDtcbiAgICBhd2FpdCBhY3RpdmVDaG5hbm5lbD8ucXVlcnkoe1xuICAgICAgbWVzc2FnZXM6IHsgbGltaXQ6IHRoaXMub3B0aW9ucz8ubWVzc2FnZV9saW1pdCwgaWRfbHQ6IGxhc3RNZXNzYWdlSWQgfSxcbiAgICAgIG1lbWJlcnM6IHsgbGltaXQ6IDAgfSxcbiAgICAgIHdhdGNoZXJzOiB7IGxpbWl0OiAwIH0sXG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgYWN0aXZlQ2huYW5uZWw/LmRhdGE/LmlkID09PVxuICAgICAgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpPy5kYXRhPy5pZFxuICAgICkge1xuICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgICAuLi5hY3RpdmVDaG5hbm5lbCEuc3RhdGUubWVzc2FnZXMsXG4gICAgICBdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIG5leHQgcGFnZSBvZiBtZXNzYWdlcyBvZiB0aGUgYWN0aXZlIHRocmVhZC4gVGhlIHBhZ2Ugc2l6ZSBjYW4gYmUgc2V0IGluIHRoZSBbcXVlcnkgb3B0aW9uXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9xdWVyeV9jaGFubmVscy8/bGFuZ3VhZ2U9amF2YXNjcmlwdCNxdWVyeS1vcHRpb25zKSBvYmplY3QuXG4gICAqL1xuICBhc3luYyBsb2FkTW9yZVRocmVhZFJlcGxpZXMoKSB7XG4gICAgY29uc3QgYWN0aXZlQ2huYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgY29uc3QgcGFyZW50TWVzc2FnZUlkID0gdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgaWYgKCFwYXJlbnRNZXNzYWdlSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGFzdE1lc3NhZ2VJZCA9IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0LmdldFZhbHVlKClbMF0/LmlkO1xuICAgIGF3YWl0IGFjdGl2ZUNobmFubmVsPy5nZXRSZXBsaWVzKHBhcmVudE1lc3NhZ2VJZCwge1xuICAgICAgbGltaXQ6IHRoaXMub3B0aW9ucz8ubWVzc2FnZV9saW1pdCxcbiAgICAgIGlkX2x0OiBsYXN0TWVzc2FnZUlkLFxuICAgIH0pO1xuICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoXG4gICAgICBhY3RpdmVDaG5hbm5lbD8uc3RhdGUudGhyZWFkc1twYXJlbnRNZXNzYWdlSWRdIHx8IFtdXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWVyaWVzIHRoZSBjaGFubmVscyB3aXRoIHRoZSBnaXZlbiBmaWx0ZXJzLCBzb3J0cyBhbmQgb3B0aW9ucy4gTW9yZSBpbmZvIGFib3V0IFtjaGFubmVsIHF1ZXJ5aW5nXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9xdWVyeV9jaGFubmVscy8/bGFuZ3VhZ2U9amF2YXNjcmlwdCkgY2FuIGJlIGZvdW5kIGluIHRoZSBwbGF0Zm9ybSBkb2N1bWVudGF0aW9uLiBCeSBkZWZhdWx0IHRoZSBmaXJzdCBjaGFubmVsIGluIHRoZSBsaXN0IHdpbGwgYmUgc2V0IGFzIGFjdGl2ZSBjaGFubmVsIGFuZCB3aWxsIGJlIG1hcmtlZCBhcyByZWFkLlxuICAgKiBAcGFyYW0gZmlsdGVyc1xuICAgKiBAcGFyYW0gc29ydFxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcGFyYW0gc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbCBEZWNpZGVzIGlmIHRoZSBmaXJzdCBjaGFubmVsIGluIHRoZSByZXN1bHQgc2hvdWxkIGJlIG1hZGUgYXMgYW4gYWN0aXZlIGNoYW5uZWwsIG9yIG5vIGNoYW5uZWwgc2hvdWxkIGJlIG1hcmtlZCBhcyBhY3RpdmVcbiAgICogQHJldHVybnMgdGhlIGxpc3Qgb2YgY2hhbm5lbHMgZm91bmQgYnkgdGhlIHF1ZXJ5XG4gICAqL1xuICBhc3luYyBpbml0KFxuICAgIGZpbHRlcnM6IENoYW5uZWxGaWx0ZXJzPFQ+LFxuICAgIHNvcnQ/OiBDaGFubmVsU29ydDxUPixcbiAgICBvcHRpb25zPzogQ2hhbm5lbE9wdGlvbnMsXG4gICAgc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbDogYm9vbGVhbiA9IHRydWVcbiAgKSB7XG4gICAgdGhpcy5maWx0ZXJzID0gZmlsdGVycztcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHtcbiAgICAgIG9mZnNldDogMCxcbiAgICAgIGxpbWl0OiAyNSxcbiAgICAgIHN0YXRlOiB0cnVlLFxuICAgICAgcHJlc2VuY2U6IHRydWUsXG4gICAgICB3YXRjaDogdHJ1ZSxcbiAgICAgIG1lc3NhZ2VfbGltaXQ6IHRoaXMubWVzc2FnZVBhZ2VTaXplLFxuICAgIH07XG4gICAgdGhpcy5zb3J0ID0gc29ydCB8fCB7IGxhc3RfbWVzc2FnZV9hdDogLTEsIHVwZGF0ZWRfYXQ6IC0xIH07XG4gICAgdGhpcy5zaG91bGRTZXRBY3RpdmVDaGFubmVsID0gc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5xdWVyeUNoYW5uZWxzKHRoaXMuc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbCk7XG4gICAgICB0aGlzLmNsaWVudEV2ZW50c1N1YnNjcmlwdGlvbiA9IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuZXZlbnRzJC5zdWJzY3JpYmUoXG4gICAgICAgIChub3RpZmljYXRpb24pID0+IHZvaWQgdGhpcy5oYW5kbGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKVxuICAgICAgKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGRQZXJtYW5lbnROb3RpZmljYXRpb24oXG4gICAgICAgICdzdHJlYW1DaGF0LkVycm9yIGxvYWRpbmcgY2hhbm5lbHMnLFxuICAgICAgICAnZXJyb3InXG4gICAgICApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgYGFjdGl2ZUNoYW5uZWwkYCwgYGNoYW5uZWxzJGAgYW5kIGBhY3RpdmVDaGFubmVsTWVzc2FnZXMkYCBPYnNlcnZhYmxlcy4gVXNlZnVsIHdoZW4gZGlzY29ubmVjdGluZyBhIGNoYXQgdXNlciwgdXNlIGluIGNvbWJpbmF0aW9uIHdpdGggW2BkaXNjb25uZWN0VXNlcmBdKC4vQ2hhdENsaWVudFNlcnZpY2UubWR4LyNkaXNjb25uZWN0dXNlcikuXG4gICAqL1xuICByZXNldCgpIHtcbiAgICB0aGlzLmRlc2VsZWN0QWN0aXZlQ2hhbm5lbCgpO1xuICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICB0aGlzLmNsaWVudEV2ZW50c1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgbmV4dCBwYWdlIG9mIGNoYW5uZWxzLiBUaGUgcGFnZSBzaXplIGNhbiBiZSBzZXQgaW4gdGhlIFtxdWVyeSBvcHRpb25dKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X2NoYW5uZWxzLz9sYW5ndWFnZT1qYXZhc2NyaXB0I3F1ZXJ5LW9wdGlvbnMpIG9iamVjdC5cbiAgICovXG4gIGFzeW5jIGxvYWRNb3JlQ2hhbm5lbHMoKSB7XG4gICAgdGhpcy5vcHRpb25zIS5vZmZzZXQgPSB0aGlzLmNoYW5uZWxzLmxlbmd0aCE7XG4gICAgYXdhaXQgdGhpcy5xdWVyeUNoYW5uZWxzKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVhY3Rpb24gdG8gYSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIFRoZSBpZCBvZiB0aGUgbWVzc2FnZSB0byBhZGQgdGhlIHJlYWN0aW9uIHRvXG4gICAqIEBwYXJhbSByZWFjdGlvblR5cGUgVGhlIHR5cGUgb2YgdGhlIHJlYWN0aW9uXG4gICAqIEBwYXJhbSBjdXN0b21EYXRhXG4gICAqL1xuICBhc3luYyBhZGRSZWFjdGlvbihcbiAgICBtZXNzYWdlSWQ6IHN0cmluZyxcbiAgICByZWFjdGlvblR5cGU6IE1lc3NhZ2VSZWFjdGlvblR5cGUsXG4gICAgY3VzdG9tRGF0YT86IFRbJ3JlYWN0aW9uVHlwZSddXG4gICkge1xuICAgIGF3YWl0IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKT8uc2VuZFJlYWN0aW9uKG1lc3NhZ2VJZCwge1xuICAgICAgdHlwZTogcmVhY3Rpb25UeXBlLFxuICAgICAgLi4uY3VzdG9tRGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgcmVhY3Rpb24gZnJvbSBhIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgVGhlIGlkIG9mIHRoZSBtZXNzYWdlIHRvIHJlbW92ZSB0aGUgcmVhY3Rpb24gZnJvbVxuICAgKiBAcGFyYW0gcmVhY3Rpb25UeXBlIFRociB0eXBlIG9mIHJlYWN0aW9uIHRvIHJlbW92ZVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlUmVhY3Rpb24obWVzc2FnZUlkOiBzdHJpbmcsIHJlYWN0aW9uVHlwZTogTWVzc2FnZVJlYWN0aW9uVHlwZSkge1xuICAgIGF3YWl0IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3RcbiAgICAgIC5nZXRWYWx1ZSgpXG4gICAgICA/LmRlbGV0ZVJlYWN0aW9uKG1lc3NhZ2VJZCwgcmVhY3Rpb25UeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIGFjdGl2ZSBjaGFubmVsLiBUaGUgbWVzc2FnZSBpcyBpbW1lZGlhdGVseSBhZGRlZCB0byB0aGUgbWVzc2FnZSBsaXN0LCBpZiBhbiBlcnJvciBvY2N1cnMgYW5kIHRoZSBtZXNzYWdlIGNhbid0IGJlIHNlbnQsIHRoZSBlcnJvciBpcyBpbmRpY2F0ZWQgaW4gYHN0YXRlYCBvZiB0aGUgbWVzc2FnZS5cbiAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgb2YgdGhlIG1lc3NhZ2VcbiAgICogQHBhcmFtIGF0dGFjaG1lbnRzIFRoZSBhdHRhY2htZW50c1xuICAgKiBAcGFyYW0gbWVudGlvbmVkVXNlcnMgTWVudGlvbmVkIHVzZXJzXG4gICAqIEBwYXJhbSBwYXJlbnRJZCBJZCBvZiB0aGUgcGFyZW50IG1lc3NhZ2UgKGlmIHNlbmRpbmcgYSB0aHJlYWQgcmVwbHkpXG4gICAqIEBwYXJhbSBxdW90ZWRNZXNzYWdlSWQgSWQgb2YgdGhlIG1lc3NhZ2UgdG8gcXVvdGUgKGlmIHNlbmRpbmcgYSBxdW90ZSByZXBseSlcbiAgICogQHBhcmFtIGN1c3RvbURhdGFcbiAgICovXG4gIGFzeW5jIHNlbmRNZXNzYWdlKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBhdHRhY2htZW50czogQXR0YWNobWVudDxUPltdID0gW10sXG4gICAgbWVudGlvbmVkVXNlcnM6IFVzZXJSZXNwb25zZTxUPltdID0gW10sXG4gICAgcGFyZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICBxdW90ZWRNZXNzYWdlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICBjdXN0b21EYXRhOiB1bmRlZmluZWQgfCBQYXJ0aWFsPFRbJ21lc3NhZ2VUeXBlJ10+ID0gdW5kZWZpbmVkXG4gICkge1xuICAgIGNvbnN0IHByZXZpZXcgPSBjcmVhdGVNZXNzYWdlUHJldmlldyhcbiAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyISxcbiAgICAgIHRleHQsXG4gICAgICBhdHRhY2htZW50cyxcbiAgICAgIG1lbnRpb25lZFVzZXJzLFxuICAgICAgcGFyZW50SWQsXG4gICAgICBxdW90ZWRNZXNzYWdlSWQsXG4gICAgICBjdXN0b21EYXRhXG4gICAgKTtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICBwcmV2aWV3LnJlYWRCeSA9IFtdO1xuICAgIGNoYW5uZWwuc3RhdGUuYWRkTWVzc2FnZVNvcnRlZChwcmV2aWV3LCB0cnVlKTtcbiAgICBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlUmVxdWVzdChwcmV2aWV3LCBjdXN0b21EYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNlbmRzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIHRoZSBhY3RpdmUgY2hhbm5lbFxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byByZXNlbmRcbiAgICovXG4gIGFzeW5jIHJlc2VuZE1lc3NhZ2UobWVzc2FnZTogU3RyZWFtTWVzc2FnZSkge1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgIGNoYW5uZWwuc3RhdGUuYWRkTWVzc2FnZVNvcnRlZChcbiAgICAgIHtcbiAgICAgICAgLi4uKG1lc3NhZ2UgYXMgYW55IGFzIE1lc3NhZ2VSZXNwb25zZTxUPiksXG4gICAgICAgIGVycm9yU3RhdHVzQ29kZTogdW5kZWZpbmVkLFxuICAgICAgICBzdGF0dXM6ICdzZW5kaW5nJyxcbiAgICAgIH0sXG4gICAgICB0cnVlXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlUmVxdWVzdChtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBtZXNzYWdlIGluIHRoZSBhY3RpdmUgY2hhbm5lbFxuICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNhZ2UgdG8gYmUgdXBkYXRlZFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlTWVzc2FnZShtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPFQ+KSB7XG4gICAgYXdhaXQgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVwZGF0ZU1lc3NhZ2UoXG4gICAgICBtZXNzYWdlIGFzIGFueSBhcyBVcGRhdGVkTWVzc2FnZTxUPlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgbWVzc2FnZSBmcm9tIHRoZSBhY3RpdmUgY2hhbm5lbFxuICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIHRvIGJlIGRlbGV0ZWRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZU1lc3NhZ2UobWVzc2FnZTogU3RyZWFtTWVzc2FnZSkge1xuICAgIGF3YWl0IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC5kZWxldGVNZXNzYWdlKG1lc3NhZ2UuaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgZmlsZXMgdG8gdGhlIGNoYW5uZWwuIElmIHlvdSB3YW50IHRvIGtub3cgbW9yZSBhYm91dCBbZmlsZSB1cGxvYWRzXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9maWxlX3VwbG9hZHMvP2xhbmd1YWdlPWphdmFzY3JpcHQpIGNoZWNrIG91dCB0aGUgcGxhdGZvcm0gZG9jdW1lbnRhdGlvbi5cbiAgICogQHBhcmFtIHVwbG9hZHMgdGhlIGF0dGFjaG1lbnRzIHRvIHVwbG9hZCAob3V0cHV0IG9mIHRoZSBbYEF0dGFjaG1lbnRTZXJ2aWNlYF0oLi9BdHRhY2htZW50U2VydmljZS5tZHgpKVxuICAgKiBAcmV0dXJucyB0aGUgcmVzdWx0IG9mIGZpbGUgdXBsb2FkIHJlcXVlc3RzXG4gICAqL1xuICBhc3luYyB1cGxvYWRBdHRhY2htZW50cyhcbiAgICB1cGxvYWRzOiBBdHRhY2htZW50VXBsb2FkW11cbiAgKTogUHJvbWlzZTxBdHRhY2htZW50VXBsb2FkW10+IHtcbiAgICBjb25zdCByZXN1bHQ6IEF0dGFjaG1lbnRVcGxvYWRbXSA9IFtdO1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgIGNvbnN0IHVwbG9hZFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICB1cGxvYWRzLm1hcCgodXBsb2FkKSA9PlxuICAgICAgICB1cGxvYWQudHlwZSA9PT0gJ2ltYWdlJ1xuICAgICAgICAgID8gdGhpcy5jdXN0b21JbWFnZVVwbG9hZFJlcXVlc3RcbiAgICAgICAgICAgID8gdGhpcy5jdXN0b21JbWFnZVVwbG9hZFJlcXVlc3QodXBsb2FkLmZpbGUsIGNoYW5uZWwpXG4gICAgICAgICAgICA6IGNoYW5uZWwuc2VuZEltYWdlKHVwbG9hZC5maWxlKVxuICAgICAgICAgIDogdGhpcy5jdXN0b21GaWxlVXBsb2FkUmVxdWVzdFxuICAgICAgICAgID8gdGhpcy5jdXN0b21GaWxlVXBsb2FkUmVxdWVzdCh1cGxvYWQuZmlsZSwgY2hhbm5lbClcbiAgICAgICAgICA6IGNoYW5uZWwuc2VuZEZpbGUodXBsb2FkLmZpbGUpXG4gICAgICApXG4gICAgKTtcbiAgICB1cGxvYWRSZXN1bHRzLmZvckVhY2goKHVwbG9hZFJlc3VsdCwgaSkgPT4ge1xuICAgICAgY29uc3QgZmlsZSA9IHVwbG9hZHNbaV0uZmlsZTtcbiAgICAgIGNvbnN0IHR5cGUgPSB1cGxvYWRzW2ldLnR5cGU7XG4gICAgICBpZiAodXBsb2FkUmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBzdGF0ZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgIHVybDogdXBsb2FkUmVzdWx0LnZhbHVlLmZpbGUsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LnB1c2goeyBmaWxlLCB0eXBlLCBzdGF0ZTogJ2Vycm9yJyB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhbiB1cGxvYWRlZCBmaWxlIGJ5IFVSTC4gSWYgeW91IHdhbnQgdG8ga25vdyBtb3JlIGFib3V0IFtmaWxlIHVwbG9hZHNdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L2ZpbGVfdXBsb2Fkcy8/bGFuZ3VhZ2U9amF2YXNjcmlwdCkgY2hlY2sgb3V0IHRoZSBwbGF0Zm9ybSBkb2N1bWVudGF0aW9uXG4gICAqIEBwYXJhbSBhdHRhY2htZW50VXBsb2FkIEF0dGFjaG1lbnQgdG8gYmUgZGVsZXRlZCAob3V0cHV0IG9mIHRoZSBbYEF0dGFjaG1lbnRTZXJ2aWNlYF0oLi9BdHRhY2htZW50U2VydmljZS5tZHgpKVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlQXR0YWNobWVudChhdHRhY2htZW50VXBsb2FkOiBBdHRhY2htZW50VXBsb2FkKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgYXdhaXQgKGF0dGFjaG1lbnRVcGxvYWQudHlwZSA9PT0gJ2ltYWdlJ1xuICAgICAgPyB0aGlzLmN1c3RvbUltYWdlRGVsZXRlUmVxdWVzdFxuICAgICAgICA/IHRoaXMuY3VzdG9tSW1hZ2VEZWxldGVSZXF1ZXN0KGF0dGFjaG1lbnRVcGxvYWQudXJsISwgY2hhbm5lbClcbiAgICAgICAgOiBjaGFubmVsLmRlbGV0ZUltYWdlKGF0dGFjaG1lbnRVcGxvYWQudXJsISlcbiAgICAgIDogdGhpcy5jdXN0b21GaWxlRGVsZXRlUmVxdWVzdFxuICAgICAgPyB0aGlzLmN1c3RvbUZpbGVEZWxldGVSZXF1ZXN0KGF0dGFjaG1lbnRVcGxvYWQudXJsISwgY2hhbm5lbClcbiAgICAgIDogY2hhbm5lbC5kZWxldGVGaWxlKGF0dGFjaG1lbnRVcGxvYWQudXJsISkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGF1dG9jb21wbGV0ZSBvcHRpb25zIGZvciBjdXJyZW50IGNoYW5uZWwgbWVtYmVycy4gSWYgdGhlIGNoYW5uZWwgaGFzIGxlc3MgdGhhbiAxMDAgbWVtYmVycywgaXQgcmV0dXJucyB0aGUgY2hhbm5lbCBtZW1iZXJzLCBvdGhlcndpc2Ugc2VuZHMgYSBbc2VhcmNoIHJlcXVlc3RdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X21lbWJlcnMvP2xhbmd1YWdlPWphdmFzY3JpcHQjcGFnaW5hdGlvbi1hbmQtb3JkZXJpbmcpIHdpdGggdGhlIGdpdmVuIHNlYXJjaCB0ZXJtLlxuICAgKiBAcGFyYW0gc2VhcmNoVGVybSBUZXh0IHRvIHNlYXJjaCBmb3IgaW4gdGhlIG5hbWVzIG9mIG1lbWJlcnNcbiAgICogQHJldHVybnMgVGhlIGxpc3Qgb2YgbWVtYmVycyBtYXRjaGluZyB0aGUgc2VhcmNoIGZpbHRlclxuICAgKi9cbiAgYXN5bmMgYXV0b2NvbXBsZXRlTWVtYmVycyhzZWFyY2hUZXJtOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGlmICghYWN0aXZlQ2hhbm5lbCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMoYWN0aXZlQ2hhbm5lbC5zdGF0ZS5tZW1iZXJzKS5sZW5ndGggPD0gMTAwKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhhY3RpdmVDaGFubmVsLnN0YXRlLm1lbWJlcnMpLmZpbHRlcihcbiAgICAgICAgKG0pID0+IG0udXNlcj8uaWQgIT09IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VySUQhXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXNlYXJjaFRlcm0pIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYWN0aXZlQ2hhbm5lbC5xdWVyeU1lbWJlcnMoe1xuICAgICAgICBuYW1lOiB7ICRhdXRvY29tcGxldGU6IHNlYXJjaFRlcm0gfSxcbiAgICAgICAgaWQ6IHsgJG5lOiB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlcklEISB9LFxuICAgICAgfSBhcyBVc2VyRmlsdGVyczxUPik7IC8vIFRPRE86IGZpbmQgb3V0IHdoeSB3ZSBuZWVkIHR5cGVjYXN0IGhlcmVcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHJlc3VsdC5tZW1iZXJzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogW1J1bnMgYSBtZXNzYWdlIGFjdGlvbl0oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL3Jlc3QvI21lc3NhZ2VzLXJ1bm1lc3NhZ2VhY3Rpb24pIGluIHRoZSBjdXJyZW50IGNoYW5uZWwuIFVwZGF0ZXMgdGhlIG1lc3NhZ2UgbGlzdCBiYXNlZCBvbiB0aGUgYWN0aW9uIHJlc3VsdCAoaWYgbm8gbWVzc2FnZSBpcyByZXR1cm5lZCwgdGhlIG1lc3NhZ2Ugd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG1lc3NhZ2UgbGlzdCkuXG4gICAqIEBwYXJhbSBtZXNzYWdlSWRcbiAgICogQHBhcmFtIGZvcm1EYXRhXG4gICAqIEBwYXJhbSBwYXJlbnRNZXNzYWdlSWRcbiAgICovXG4gIGFzeW5jIHNlbmRBY3Rpb24oXG4gICAgbWVzc2FnZUlkOiBzdHJpbmcsXG4gICAgZm9ybURhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgcGFyZW50TWVzc2FnZUlkPzogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2hhbm5lbC5zZW5kQWN0aW9uKG1lc3NhZ2VJZCwgZm9ybURhdGEpO1xuICAgIGlmIChyZXNwb25zZT8ubWVzc2FnZSkge1xuICAgICAgY2hhbm5lbC5zdGF0ZS5hZGRNZXNzYWdlU29ydGVkKHtcbiAgICAgICAgLi4ucmVzcG9uc2UubWVzc2FnZSxcbiAgICAgICAgc3RhdHVzOiAncmVjZWl2ZWQnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBpc1RocmVhZFJlcGx5ID0gISFyZXNwb25zZS5tZXNzYWdlLnBhcmVudF9pZDtcbiAgICAgIGlzVGhyZWFkUmVwbHlcbiAgICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAgIC4uLmNoYW5uZWwuc3RhdGUudGhyZWFkc1tyZXNwb25zZS5tZXNzYWdlLnBhcmVudF9pZCFdLFxuICAgICAgICAgIF0pXG4gICAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLmNoYW5uZWwuc3RhdGUubWVzc2FnZXNdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hhbm5lbC5zdGF0ZS5yZW1vdmVNZXNzYWdlKHtcbiAgICAgICAgaWQ6IG1lc3NhZ2VJZCxcbiAgICAgICAgcGFyZW50X2lkOiBwYXJlbnRNZXNzYWdlSWQsXG4gICAgICB9KTtcbiAgICAgIGlmIChwYXJlbnRNZXNzYWdlSWQpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChcbiAgICAgICAgICBjaGFubmVsLnN0YXRlLnRocmVhZHNbdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0LmdldFZhbHVlKCkhXVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLmNoYW5uZWwuc3RhdGUubWVzc2FnZXNdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBvciBkZXNlbGVjdHMgdGhlIGN1cnJlbnQgbWVzc2FnZSB0byBxdW90ZSByZXBseSB0b1xuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzZWxlY3QsIGlmIGNhbGxlZCB3aXRoIGB1bmRlZmluZWRgLCBpdCBkZXNlbGVjdHMgdGhlIG1lc3NhZ2VcbiAgICovXG4gIHNlbGVjdE1lc3NhZ2VUb1F1b3RlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLm1lc3NhZ2VUb1F1b3RlU3ViamVjdC5uZXh0KG1lc3NhZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kTWVzc2FnZVJlcXVlc3QoXG4gICAgcHJldmlldzogTWVzc2FnZVJlc3BvbnNlPFQ+IHwgU3RyZWFtTWVzc2FnZTxUPixcbiAgICBjdXN0b21EYXRhPzogUGFydGlhbDxUWydtZXNzYWdlVHlwZSddPlxuICApIHtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICBjb25zdCBpc1RocmVhZFJlcGx5ID0gISFwcmV2aWV3LnBhcmVudF9pZDtcbiAgICBpc1RocmVhZFJlcGx5XG4gICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgICAgIC4uLmNoYW5uZWwuc3RhdGUudGhyZWFkc1twcmV2aWV3LnBhcmVudF9pZCFdLFxuICAgICAgICBdKVxuICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlc10pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNoYW5uZWwuc2VuZE1lc3NhZ2Uoe1xuICAgICAgICBpZDogcHJldmlldy5pZCxcbiAgICAgICAgdGV4dDogcHJldmlldy50ZXh0LFxuICAgICAgICBhdHRhY2htZW50czogcHJldmlldy5hdHRhY2htZW50cyxcbiAgICAgICAgbWVudGlvbmVkX3VzZXJzOiBwcmV2aWV3Lm1lbnRpb25lZF91c2Vycz8ubWFwKCh1KSA9PiB1LmlkKSxcbiAgICAgICAgcGFyZW50X2lkOiBwcmV2aWV3LnBhcmVudF9pZCxcbiAgICAgICAgcXVvdGVkX21lc3NhZ2VfaWQ6IHByZXZpZXcucXVvdGVkX21lc3NhZ2VfaWQsXG4gICAgICAgIC4uLmN1c3RvbURhdGEsXG4gICAgICB9IGFzIE1lc3NhZ2U8VD4pOyAvLyBUT0RPOiBmaW5kIG91dCB3aHkgd2UgbmVlZCB0eXBlY2FzdCBoZXJlXG4gICAgICBpZiAocmVzcG9uc2U/Lm1lc3NhZ2UpIHtcbiAgICAgICAgY2hhbm5lbC5zdGF0ZS5hZGRNZXNzYWdlU29ydGVkKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnJlc3BvbnNlLm1lc3NhZ2UsXG4gICAgICAgICAgICBzdGF0dXM6ICdyZWNlaXZlZCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlzVGhyZWFkUmVwbHlcbiAgICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgICAgICAgICAuLi5jaGFubmVsLnN0YXRlLnRocmVhZHNbcHJldmlldy5wYXJlbnRfaWQhXSxcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlc10pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzdHJpbmdFcnJvciA9IEpTT04uc3RyaW5naWZ5KGVycm9yKTtcbiAgICAgIGNvbnN0IHBhcnNlZEVycm9yOiB7IHN0YXR1cz86IG51bWJlciB9ID0gc3RyaW5nRXJyb3JcbiAgICAgICAgPyAoSlNPTi5wYXJzZShzdHJpbmdFcnJvcikgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSlcbiAgICAgICAgOiB7fTtcblxuICAgICAgY2hhbm5lbC5zdGF0ZS5hZGRNZXNzYWdlU29ydGVkKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uKHByZXZpZXcgYXMgTWVzc2FnZVJlc3BvbnNlPFQ+KSxcbiAgICAgICAgICBlcnJvclN0YXR1c0NvZGU6IHBhcnNlZEVycm9yLnN0YXR1cyB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgc3RhdHVzOiAnZmFpbGVkJyxcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIGlzVGhyZWFkUmVwbHlcbiAgICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAgIC4uLmNoYW5uZWwuc3RhdGUudGhyZWFkc1twcmV2aWV3LnBhcmVudF9pZCFdLFxuICAgICAgICAgIF0pXG4gICAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLmNoYW5uZWwuc3RhdGUubWVzc2FnZXNdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU5vdGlmaWNhdGlvbihjbGllbnRFdmVudDogQ2xpZW50RXZlbnQ8VD4pIHtcbiAgICBzd2l0Y2ggKGNsaWVudEV2ZW50LmV2ZW50VHlwZSkge1xuICAgICAgY2FzZSAnY29ubmVjdGlvbi5yZWNvdmVyZWQnOiB7XG4gICAgICAgIHZvaWQgdGhpcy5uZ1pvbmUucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc1N0YXRlUmVjb3ZlcnlJblByb2dyZXNzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaXNTdGF0ZVJlY292ZXJ5SW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmluaXQoXG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVycyEsXG4gICAgICAgICAgICAgIHRoaXMuc29ydCxcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgICB0aGlzLnNob3VsZFNldEFjdGl2ZUNoYW5uZWxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmlzU3RhdGVSZWNvdmVyeUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRoaXMuaXNTdGF0ZVJlY292ZXJ5SW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbm90aWZpY2F0aW9uLm1lc3NhZ2VfbmV3Jzoge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmN1c3RvbU5ld01lc3NhZ2VOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbU5ld01lc3NhZ2VOb3RpZmljYXRpb25IYW5kbGVyKFxuICAgICAgICAgICAgICBjbGllbnRFdmVudCxcbiAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVOZXdNZXNzYWdlTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ25vdGlmaWNhdGlvbi5hZGRlZF90b19jaGFubmVsJzoge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21BZGRlZFRvQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXIoXG4gICAgICAgICAgICAgIGNsaWVudEV2ZW50LFxuICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ25vdGlmaWNhdGlvbi5yZW1vdmVkX2Zyb21fY2hhbm5lbCc6IHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jdXN0b21SZW1vdmVkRnJvbUNoYW5uZWxOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXIoXG4gICAgICAgICAgICAgIGNsaWVudEV2ZW50LFxuICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbihjbGllbnRFdmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbihjbGllbnRFdmVudDogQ2xpZW50RXZlbnQ8VD4pIHtcbiAgICBjb25zdCBjaGFubmVsSWRUb0JlUmVtb3ZlZCA9IGNsaWVudEV2ZW50LmV2ZW50LmNoYW5uZWwhLmNpZDtcbiAgICB0aGlzLnJlbW92ZUNoYW5uZWxzRnJvbUNoYW5uZWxMaXN0KFtjaGFubmVsSWRUb0JlUmVtb3ZlZF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVOZXdNZXNzYWdlTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50OiBDbGllbnRFdmVudDxUPikge1xuICAgIGlmIChjbGllbnRFdmVudC5ldmVudC5jaGFubmVsKSB7XG4gICAgICB0aGlzLmFkZENoYW5uZWxzRnJvbU5vdGlmaWNhdGlvbihbY2xpZW50RXZlbnQuZXZlbnQuY2hhbm5lbF0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQWRkZWRUb0NoYW5uZWxOb3RpZmljYXRpb24oY2xpZW50RXZlbnQ6IENsaWVudEV2ZW50PFQ+KSB7XG4gICAgaWYgKGNsaWVudEV2ZW50LmV2ZW50LmNoYW5uZWwpIHtcbiAgICAgIHRoaXMuYWRkQ2hhbm5lbHNGcm9tTm90aWZpY2F0aW9uKFtjbGllbnRFdmVudC5ldmVudC5jaGFubmVsXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRDaGFubmVsc0Zyb21Ob3RpZmljYXRpb24oY2hhbm5lbFJlc3BvbnNlczogQ2hhbm5lbFJlc3BvbnNlPFQ+W10pIHtcbiAgICBjb25zdCBuZXdDaGFubmVsczogQ2hhbm5lbDxUPltdID0gW107XG4gICAgY2hhbm5lbFJlc3BvbnNlcy5mb3JFYWNoKChjaGFubmVsUmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQuY2hhbm5lbChcbiAgICAgICAgY2hhbm5lbFJlc3BvbnNlLnR5cGUsXG4gICAgICAgIGNoYW5uZWxSZXNwb25zZS5pZFxuICAgICAgKTtcbiAgICAgIHZvaWQgY2hhbm5lbC53YXRjaCgpO1xuICAgICAgdGhpcy53YXRjaEZvckNoYW5uZWxFdmVudHMoY2hhbm5lbCk7XG4gICAgICBuZXdDaGFubmVscy5wdXNoKGNoYW5uZWwpO1xuICAgIH0pO1xuICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoW1xuICAgICAgLi4ubmV3Q2hhbm5lbHMsXG4gICAgICAuLi4odGhpcy5jaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKSB8fCBbXSksXG4gICAgXSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUNoYW5uZWxzRnJvbUNoYW5uZWxMaXN0KGNpZHM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgY2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzLmZpbHRlcigoYykgPT4gIWNpZHMuaW5jbHVkZXMoYy5jaWQgfHwgJycpKTtcbiAgICBpZiAoY2hhbm5lbHMubGVuZ3RoIDwgdGhpcy5jaGFubmVscy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoY2hhbm5lbHMpO1xuICAgICAgaWYgKGNpZHMuaW5jbHVkZXModGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpPy5jaWQgfHwgJycpKSB7XG4gICAgICAgIGlmIChjaGFubmVscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5zZXRBc0FjdGl2ZUNoYW5uZWwoY2hhbm5lbHNbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaEZvckFjdGl2ZUNoYW5uZWxFdmVudHMoY2hhbm5lbDogQ2hhbm5lbDxUPikge1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ21lc3NhZ2UubmV3JywgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgZXZlbnQubWVzc2FnZSAmJiBldmVudC5tZXNzYWdlLnBhcmVudF9pZFxuICAgICAgICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAgICAgICAuLi5jaGFubmVsLnN0YXRlLnRocmVhZHNbZXZlbnQubWVzc2FnZS5wYXJlbnRfaWRdLFxuICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlcyxcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsJC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoYykgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FuU2VuZFJlYWRFdmVudHMgJiYgdGhpcy5zaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZCkge1xuICAgICAgICAgICAgICB2b2lkIGM/Lm1hcmtSZWFkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVMYXRlc3RNZXNzYWdlcyhldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ21lc3NhZ2UudXBkYXRlZCcsIChldmVudCkgPT4gdGhpcy5tZXNzYWdlVXBkYXRlZChldmVudCkpXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCdtZXNzYWdlLmRlbGV0ZWQnLCAoZXZlbnQpID0+IHRoaXMubWVzc2FnZVVwZGF0ZWQoZXZlbnQpKVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgY2hhbm5lbC5vbigncmVhY3Rpb24ubmV3JywgKGUpID0+IHRoaXMubWVzc2FnZVJlYWN0aW9uRXZlbnRSZWNlaXZlZChlKSlcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ3JlYWN0aW9uLmRlbGV0ZWQnLCAoZSkgPT5cbiAgICAgICAgdGhpcy5tZXNzYWdlUmVhY3Rpb25FdmVudFJlY2VpdmVkKGUpXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCdyZWFjdGlvbi51cGRhdGVkJywgKGUpID0+XG4gICAgICAgIHRoaXMubWVzc2FnZVJlYWN0aW9uRXZlbnRSZWNlaXZlZChlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgY2hhbm5lbC5vbignbWVzc2FnZS5yZWFkJywgKGUpID0+IHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICBsZXQgbGF0ZXN0TWVzc2FnZSE6IFN0cmVhbU1lc3NhZ2U7XG4gICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXMkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKChtZXNzYWdlcykgPT4ge1xuICAgICAgICAgICAgbGF0ZXN0TWVzc2FnZSA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghbGF0ZXN0TWVzc2FnZSB8fCAhZS51c2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGxhdGVzdE1lc3NhZ2UucmVhZEJ5ID0gZ2V0UmVhZEJ5KGxhdGVzdE1lc3NhZ2UsIGNoYW5uZWwpO1xuXG4gICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QuZ2V0VmFsdWUoKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ3R5cGluZy5zdGFydCcsIChlKSA9PlxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5oYW5kbGVUeXBpbmdTdGFydEV2ZW50KGUpKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgY2hhbm5lbC5vbigndHlwaW5nLnN0b3AnLCAoZSkgPT5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuaGFuZGxlVHlwaW5nU3RvcEV2ZW50KGUpKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCB0aGlzIG1ldGhvZCBpZiB1c2VyIHN0YXJ0ZWQgdHlwaW5nIGluIHRoZSBhY3RpdmUgY2hhbm5lbFxuICAgKiBAcGFyYW0gcGFyZW50SWQgVGhlIGlkIG9mIHRoZSBwYXJlbnQgbWVzc2FnZSwgaWYgdXNlciBpcyB0eXBpbmcgaW4gYSB0aHJlYWRcbiAgICovXG4gIGFzeW5jIHR5cGluZ1N0YXJ0ZWQocGFyZW50SWQ/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGF3YWl0IGFjdGl2ZUNoYW5uZWw/LmtleXN0cm9rZShwYXJlbnRJZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCB0aGlzIG1ldGhvZCBpZiB1c2VyIHN0b3BwZWQgdHlwaW5nIGluIHRoZSBhY3RpdmUgY2hhbm5lbFxuICAgKiBAcGFyYW0gcGFyZW50SWQgVGhlIGlkIG9mIHRoZSBwYXJlbnQgbWVzc2FnZSwgaWYgdXNlciB3ZXJlIHR5cGluZyBpbiBhIHRocmVhZFxuICAgKi9cbiAgYXN5bmMgdHlwaW5nU3RvcHBlZChwYXJlbnRJZD86IHN0cmluZykge1xuICAgIGNvbnN0IGFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgYXdhaXQgYWN0aXZlQ2hhbm5lbD8uc3RvcFR5cGluZyhwYXJlbnRJZCk7XG4gIH1cblxuICBwcml2YXRlIG1lc3NhZ2VVcGRhdGVkKGV2ZW50OiBFdmVudDxUPikge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICBjb25zdCBpc1RocmVhZFJlcGx5ID0gZXZlbnQubWVzc2FnZSAmJiBldmVudC5tZXNzYWdlLnBhcmVudF9pZDtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICBpZiAoIWNoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gR2V0IG1lc3NhZ2VzIGZyb20gc3RhdGUgYXMgbWVzc2FnZSBvcmRlciBjb3VsZCBjaGFuZ2UsIGFuZCBtZXNzYWdlIGNvdWxkJ3ZlIGJlZW4gZGVsZXRlZFxuICAgICAgY29uc3QgbWVzc2FnZXM6IEZvcm1hdE1lc3NhZ2VSZXNwb25zZTxUPltdID0gaXNUaHJlYWRSZXBseVxuICAgICAgICA/IGNoYW5uZWwuc3RhdGUudGhyZWFkc1tldmVudD8ubWVzc2FnZT8ucGFyZW50X2lkIHx8ICcnXVxuICAgICAgICA6IGNoYW5uZWwuc3RhdGUubWVzc2FnZXM7XG4gICAgICBpZiAoIW1lc3NhZ2VzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1lc3NhZ2VJbmRleCA9IG1lc3NhZ2VzLmZpbmRJbmRleChcbiAgICAgICAgKG0pID0+IG0uaWQgPT09IGV2ZW50Py5tZXNzYWdlPy5pZFxuICAgICAgKTtcbiAgICAgIGlmIChtZXNzYWdlSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGlzVGhyZWFkUmVwbHlcbiAgICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLm1lc3NhZ2VzXSlcbiAgICAgICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5tZXNzYWdlc10pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXNzYWdlUmVhY3Rpb25FdmVudFJlY2VpdmVkKGU6IEV2ZW50PFQ+KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGlzVGhyZWFkTWVzc2FnZSA9IGUubWVzc2FnZSAmJiBlLm1lc3NhZ2UucGFyZW50X2lkO1xuICAgICAgbGV0IG1lc3NhZ2VzITogU3RyZWFtTWVzc2FnZVtdO1xuICAgICAgKGlzVGhyZWFkTWVzc2FnZVxuICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXMkXG4gICAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXMkXG4gICAgICApXG4gICAgICAgIC5waXBlKGZpcnN0KCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKG0pID0+IChtZXNzYWdlcyA9IG0pKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlcy5maW5kKChtKSA9PiBtLmlkID09PSBlPy5tZXNzYWdlPy5pZCk7XG4gICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbWVzc2FnZS5yZWFjdGlvbl9jb3VudHMgPSB7IC4uLmUubWVzc2FnZT8ucmVhY3Rpb25fY291bnRzIH07XG4gICAgICBtZXNzYWdlLnJlYWN0aW9uX3Njb3JlcyA9IHsgLi4uZS5tZXNzYWdlPy5yZWFjdGlvbl9zY29yZXMgfTtcbiAgICAgIG1lc3NhZ2UubGF0ZXN0X3JlYWN0aW9ucyA9IFsuLi4oZS5tZXNzYWdlPy5sYXRlc3RfcmVhY3Rpb25zIHx8IFtdKV07XG4gICAgICBtZXNzYWdlLm93bl9yZWFjdGlvbnMgPSBbLi4uKGUubWVzc2FnZT8ub3duX3JlYWN0aW9ucyB8fCBbXSldO1xuICAgICAgaXNUaHJlYWRNZXNzYWdlXG4gICAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbLi4ubWVzc2FnZXNdKVxuICAgICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5tZXNzYWdlc10pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRNZXNzYWdlKG1lc3NhZ2U6IE1lc3NhZ2VSZXNwb25zZTxUPikge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5tZXNzYWdlLFxuICAgICAgLy8gcGFyc2UgdGhlIGRhdGUuLlxuICAgICAgcGlubmVkX2F0OiBtZXNzYWdlLnBpbm5lZF9hdCA/IG5ldyBEYXRlKG1lc3NhZ2UucGlubmVkX2F0KSA6IG51bGwsXG4gICAgICBjcmVhdGVkX2F0OiBtZXNzYWdlLmNyZWF0ZWRfYXRcbiAgICAgICAgPyBuZXcgRGF0ZShtZXNzYWdlLmNyZWF0ZWRfYXQpXG4gICAgICAgIDogbmV3IERhdGUoKSxcbiAgICAgIHVwZGF0ZWRfYXQ6IG1lc3NhZ2UudXBkYXRlZF9hdFxuICAgICAgICA/IG5ldyBEYXRlKG1lc3NhZ2UudXBkYXRlZF9hdClcbiAgICAgICAgOiBuZXcgRGF0ZSgpLFxuICAgICAgc3RhdHVzOiBtZXNzYWdlLnN0YXR1cyB8fCAncmVjZWl2ZWQnLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGlzU3RyZWFtTWVzc2FnZShcbiAgICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgRm9ybWF0TWVzc2FnZVJlc3BvbnNlIHwgTWVzc2FnZVJlc3BvbnNlXG4gICk6IG1lc3NhZ2UgaXMgU3RyZWFtTWVzc2FnZSB7XG4gICAgcmV0dXJuICEhbWVzc2FnZS5yZWFkQnk7XG4gIH1cblxuICBwcml2YXRlIGlzRm9ybWF0TWVzc2FnZVJlc3BvbnNlKFxuICAgIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCBGb3JtYXRNZXNzYWdlUmVzcG9uc2UgfCBNZXNzYWdlUmVzcG9uc2VcbiAgKTogbWVzc2FnZSBpcyBGb3JtYXRNZXNzYWdlUmVzcG9uc2Uge1xuICAgIHJldHVybiBtZXNzYWdlLmNyZWF0ZWRfYXQgaW5zdGFuY2VvZiBEYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wV2F0Y2hGb3JBY3RpdmVDaGFubmVsRXZlbnRzKGNoYW5uZWw6IENoYW5uZWw8VD4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIWNoYW5uZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcXVlcnlDaGFubmVscyhzaG91bGRTZXRBY3RpdmVDaGFubmVsOiBib29sZWFuKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNoYW5uZWxzID0gYXdhaXQgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnF1ZXJ5Q2hhbm5lbHMoXG4gICAgICAgIHRoaXMuZmlsdGVycyEsXG4gICAgICAgIHRoaXMuc29ydCxcbiAgICAgICAgdGhpcy5vcHRpb25zXG4gICAgICApO1xuICAgICAgY2hhbm5lbHMuZm9yRWFjaCgoYykgPT4gdGhpcy53YXRjaEZvckNoYW5uZWxFdmVudHMoYykpO1xuICAgICAgY29uc3QgcHJldkNoYW5uZWxzID0gdGhpcy5jaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKSB8fCBbXTtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoWy4uLnByZXZDaGFubmVscywgLi4uY2hhbm5lbHNdKTtcbiAgICAgIGlmIChcbiAgICAgICAgY2hhbm5lbHMubGVuZ3RoID4gMCAmJlxuICAgICAgICAhdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpICYmXG4gICAgICAgIHNob3VsZFNldEFjdGl2ZUNoYW5uZWxcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNldEFzQWN0aXZlQ2hhbm5lbChjaGFubmVsc1swXSk7XG4gICAgICB9XG4gICAgICB0aGlzLmhhc01vcmVDaGFubmVsc1N1YmplY3QubmV4dChjaGFubmVscy5sZW5ndGggPj0gdGhpcy5vcHRpb25zIS5saW1pdCEpO1xuICAgICAgcmV0dXJuIGNoYW5uZWxzO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5lcnJvcihlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHdhdGNoRm9yQ2hhbm5lbEV2ZW50cyhjaGFubmVsOiBDaGFubmVsPFQ+KSB7XG4gICAgY2hhbm5lbC5vbigoZXZlbnQ6IEV2ZW50PFQ+KSA9PiB7XG4gICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnbWVzc2FnZS5uZXcnOiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbU5ld01lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VzdG9tTmV3TWVzc2FnZUhhbmRsZXIoXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUxpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy50aHJlYWRMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZVNldHRlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVOZXdNZXNzYWdlKGV2ZW50LCBjaGFubmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGFubmVsLmhpZGRlbic6IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VzdG9tQ2hhbm5lbEhpZGRlbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21DaGFubmVsSGlkZGVuSGFuZGxlcihcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlU2V0dGVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5uZWxIaWRkZW4oZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NoYW5uZWwuZGVsZXRlZCc6IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VzdG9tQ2hhbm5lbERlbGV0ZWRIYW5kbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhbm5lbERlbGV0ZWRIYW5kbGVyKFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMudGhyZWFkTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2VTZXR0ZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbm5lbERlbGV0ZWQoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NoYW5uZWwudmlzaWJsZSc6IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VzdG9tQ2hhbm5lbFZpc2libGVIYW5kbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhbm5lbFZpc2libGVIYW5kbGVyKFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMudGhyZWFkTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2VTZXR0ZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbm5lbFZpc2libGUoZXZlbnQsIGNoYW5uZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NoYW5uZWwudXBkYXRlZCc6IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VzdG9tQ2hhbm5lbFVwZGF0ZWRIYW5kbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhbm5lbFVwZGF0ZWRIYW5kbGVyKFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMudGhyZWFkTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2VTZXR0ZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbm5lbFVwZGF0ZShldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY2hhbm5lbC50cnVuY2F0ZWQnOiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUNoYW5uZWxUcnVuY2F0ZWRIYW5kbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhbm5lbFRydW5jYXRlZEhhbmRsZXIoXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUxpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy50aHJlYWRMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZVNldHRlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGFubmVsVHJ1bmNhdGUoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU5ld01lc3NhZ2UoXzogRXZlbnQsIGNoYW5uZWw6IENoYW5uZWw8VD4pIHtcbiAgICBjb25zdCBjaGFubmVsSW5kZXggPSB0aGlzLmNoYW5uZWxzLmZpbmRJbmRleCgoYykgPT4gYy5jaWQgPT09IGNoYW5uZWwuY2lkKTtcbiAgICB0aGlzLmNoYW5uZWxzLnNwbGljZShjaGFubmVsSW5kZXgsIDEpO1xuICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoW2NoYW5uZWwsIC4uLnRoaXMuY2hhbm5lbHNdKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhbm5lbEhpZGRlbihldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLnJlbW92ZUNoYW5uZWxzRnJvbUNoYW5uZWxMaXN0KFtldmVudC5jaGFubmVsIS5jaWRdKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhbm5lbERlbGV0ZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgdGhpcy5yZW1vdmVDaGFubmVsc0Zyb21DaGFubmVsTGlzdChbZXZlbnQuY2hhbm5lbCEuY2lkXSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNoYW5uZWxWaXNpYmxlKGV2ZW50OiBFdmVudCwgY2hhbm5lbDogQ2hhbm5lbDxUPikge1xuICAgIGlmICghdGhpcy5jaGFubmVscy5maW5kKChjKSA9PiBjLmNpZCA9PT0gZXZlbnQuY2lkKSkge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+XG4gICAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMuY2hhbm5lbHMsIGNoYW5uZWxdKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNoYW5uZWxVcGRhdGUoZXZlbnQ6IEV2ZW50PFQ+KSB7XG4gICAgY29uc3QgY2hhbm5lbEluZGV4ID0gdGhpcy5jaGFubmVscy5maW5kSW5kZXgoXG4gICAgICAoYykgPT4gYy5jaWQgPT09IGV2ZW50LmNoYW5uZWwhLmNpZFxuICAgICk7XG4gICAgaWYgKGNoYW5uZWxJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuY2hhbm5lbHNbY2hhbm5lbEluZGV4XS5kYXRhID0gZXZlbnQuY2hhbm5lbDtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMuY2hhbm5lbHNdKTtcbiAgICAgIGlmIChldmVudC5jaGFubmVsPy5jaWQgPT09IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKT8uY2lkKSB7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgICAgICBjaGFubmVsLmRhdGEgPSBldmVudC5jaGFubmVsO1xuICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0Lm5leHQoY2hhbm5lbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDaGFubmVsVHJ1bmNhdGUoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgY2hhbm5lbEluZGV4ID0gdGhpcy5jaGFubmVscy5maW5kSW5kZXgoXG4gICAgICAoYykgPT4gYy5jaWQgPT09IGV2ZW50LmNoYW5uZWwhLmNpZFxuICAgICk7XG4gICAgaWYgKGNoYW5uZWxJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuY2hhbm5lbHNbY2hhbm5lbEluZGV4XS5zdGF0ZS5tZXNzYWdlcyA9IFtdO1xuICAgICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dChbLi4udGhpcy5jaGFubmVsc10pO1xuICAgICAgaWYgKGV2ZW50LmNoYW5uZWw/LmNpZCA9PT0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpPy5jaWQpIHtcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgICAgIGNoYW5uZWwuc3RhdGUubWVzc2FnZXMgPSBbXTtcbiAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5uZXh0KGNoYW5uZWwpO1xuICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbXSk7XG4gICAgICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNoYW5uZWxzKCkge1xuICAgIHJldHVybiB0aGlzLmNoYW5uZWxzU3ViamVjdC5nZXRWYWx1ZSgpIHx8IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY2FuU2VuZFJlYWRFdmVudHMoKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAoIWNoYW5uZWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY2FwYWJpbGl0ZXMgPSBjaGFubmVsLmRhdGE/Lm93bl9jYXBhYmlsaXRpZXMgYXMgc3RyaW5nW107XG4gICAgcmV0dXJuIGNhcGFiaWxpdGVzLmluZGV4T2YoJ3JlYWQtZXZlbnRzJykgIT09IC0xO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1Ub1N0cmVhbU1lc3NhZ2UoXG4gICAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPiB8IE1lc3NhZ2VSZXNwb25zZTxUPiB8IEZvcm1hdE1lc3NhZ2VSZXNwb25zZTxUPixcbiAgICBjaGFubmVsOiBDaGFubmVsPFQ+XG4gICkge1xuICAgIGNvbnN0IGlzVGhyZWFkTWVzc2FnZSA9ICEhbWVzc2FnZS5wYXJlbnRfaWQ7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1N0cmVhbU1lc3NhZ2UobWVzc2FnZSkgJiZcbiAgICAgIHRoaXMuaXNGb3JtYXRNZXNzYWdlUmVzcG9uc2UobWVzc2FnZSlcbiAgICApIHtcbiAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0Zvcm1hdE1lc3NhZ2VSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ubWVzc2FnZSxcbiAgICAgICAgcmVhZEJ5OiBpc1RocmVhZE1lc3NhZ2UgPyBbXSA6IGdldFJlYWRCeShtZXNzYWdlLCBjaGFubmVsKSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZvcm1hdE1lc3NhZ2UgPSB0aGlzLmZvcm1hdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5mb3JtYXRNZXNzYWdlLFxuICAgICAgICByZWFkQnk6IGlzVGhyZWFkTWVzc2FnZSA/IFtdIDogZ2V0UmVhZEJ5KGZvcm1hdE1lc3NhZ2UsIGNoYW5uZWwpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVR5cGluZ1N0YXJ0RXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnVzZXI/LmlkID09PSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlcj8uaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXNUeXBpbmdJblRocmVhZCA9ICEhZXZlbnQucGFyZW50X2lkO1xuICAgIGlmIChcbiAgICAgIGlzVHlwaW5nSW5UaHJlYWQgJiZcbiAgICAgIGV2ZW50LnBhcmVudF9pZCAhPT0gdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0LmdldFZhbHVlKClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3ViamVjdCA9IGlzVHlwaW5nSW5UaHJlYWRcbiAgICAgID8gdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkU3ViamVjdFxuICAgICAgOiB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdDtcbiAgICBjb25zdCB1c2VyczogVXNlclJlc3BvbnNlW10gPSBzdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgY29uc3QgdXNlciA9IGV2ZW50LnVzZXI7XG4gICAgaWYgKHVzZXIgJiYgIXVzZXJzLmZpbmQoKHUpID0+IHUuaWQgPT09IHVzZXIuaWQpKSB7XG4gICAgICB1c2Vycy5wdXNoKHVzZXIpO1xuICAgICAgc3ViamVjdC5uZXh0KFsuLi51c2Vyc10pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVHlwaW5nU3RvcEV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IHVzZXJzVHlwaW5nSW5DaGFubmVsID0gdGhpcy51c2Vyc1R5cGluZ0luQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCB1c2Vyc1R5cGluZ0luVGhyZWFkID0gdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHVzZXIgPSBldmVudC51c2VyO1xuICAgIGlmICh1c2VyICYmIHVzZXJzVHlwaW5nSW5DaGFubmVsLmZpbmQoKHUpID0+IHUuaWQgPT09IHVzZXIuaWQpKSB7XG4gICAgICB1c2Vyc1R5cGluZ0luQ2hhbm5lbC5zcGxpY2UoXG4gICAgICAgIHVzZXJzVHlwaW5nSW5DaGFubmVsLmZpbmRJbmRleCgodSkgPT4gdS5pZCA9PT0gdXNlci5pZCksXG4gICAgICAgIDFcbiAgICAgICk7XG4gICAgICB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdC5uZXh0KFsuLi51c2Vyc1R5cGluZ0luQ2hhbm5lbF0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodXNlciAmJiB1c2Vyc1R5cGluZ0luVGhyZWFkLmZpbmQoKHUpID0+IHUuaWQgPT09IHVzZXIuaWQpKSB7XG4gICAgICB1c2Vyc1R5cGluZ0luVGhyZWFkLnNwbGljZShcbiAgICAgICAgdXNlcnNUeXBpbmdJblRocmVhZC5maW5kSW5kZXgoKHUpID0+IHUuaWQgPT09IHVzZXIuaWQpLFxuICAgICAgICAxXG4gICAgICApO1xuICAgICAgdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkU3ViamVjdC5uZXh0KFsuLi51c2Vyc1R5cGluZ0luVGhyZWFkXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVMYXRlc3RNZXNzYWdlcyhldmVudDogRXZlbnQpIHtcbiAgICBpZiAoXG4gICAgICBldmVudC5tZXNzYWdlPy51c2VyPy5pZCAhPT0gdGhpcy5jaGF0Q2xpZW50U2VydmljZT8uY2hhdENsaWVudC51c2VyPy5pZFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXRlc3RNZXNzYWdlcyA9XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2VEYXRlQnlVc2VyQnlDaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAoIWV2ZW50Lm1lc3NhZ2U/LmNyZWF0ZWRfYXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2hhbm5lbElkID0gZXZlbnQ/Lm1lc3NhZ2U/LmNpZDtcbiAgICBpZiAoIWNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtZXNzYWdlRGF0ZSA9IG5ldyBEYXRlKGV2ZW50Lm1lc3NhZ2UuY3JlYXRlZF9hdCk7XG4gICAgaWYgKFxuICAgICAgIWxhdGVzdE1lc3NhZ2VzW2NoYW5uZWxJZF0gfHxcbiAgICAgIGxhdGVzdE1lc3NhZ2VzW2NoYW5uZWxJZF0/LmdldFRpbWUoKSA8IG1lc3NhZ2VEYXRlLmdldFRpbWUoKVxuICAgICkge1xuICAgICAgbGF0ZXN0TWVzc2FnZXNbY2hhbm5lbElkXSA9IG1lc3NhZ2VEYXRlO1xuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHNTdWJqZWN0Lm5leHQoe1xuICAgICAgICAuLi5sYXRlc3RNZXNzYWdlcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
|