@firestitch/form 12.4.19 → 12.4.21
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/app/directives/form/form.directive.d.ts +6 -4
- package/bundles/firestitch-form.umd.js +36 -20
- package/bundles/firestitch-form.umd.js.map +1 -1
- package/esm2015/app/directives/form/form.directive.js +33 -27
- package/fesm2015/firestitch-form.js +32 -26
- package/fesm2015/firestitch-form.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,8 +7,8 @@ import { guid } from '@firestitch/common';
|
|
|
7
7
|
import { DrawerRef } from '@firestitch/drawer';
|
|
8
8
|
import { FsMessage, MessageMode } from '@firestitch/message';
|
|
9
9
|
import { FsPrompt } from '@firestitch/prompt';
|
|
10
|
-
import { BehaviorSubject, defer, fromEvent, iif,
|
|
11
|
-
import { catchError, delay, filter, first, map, mapTo, mergeMap, startWith, switchMap, take, takeUntil, tap } from 'rxjs/operators';
|
|
10
|
+
import { BehaviorSubject, defer, fromEvent, iif, of, Subject, throwError, } from 'rxjs';
|
|
11
|
+
import { catchError, delay, filter, first, map, mapTo, mergeMap, startWith, switchMap, take, takeUntil, tap, } from 'rxjs/operators';
|
|
12
12
|
import { FormDeactivateGuard } from '../../guards/form-deactivate.guard';
|
|
13
13
|
import { confirmResultContinue } from '../../helpers/confirm-result-continue';
|
|
14
14
|
import { confirmUnsaved } from '../../helpers/confirm-unsaved';
|
|
@@ -59,7 +59,6 @@ export class FsFormDirective {
|
|
|
59
59
|
this.submitted = new EventEmitter();
|
|
60
60
|
this.reseted = new EventEmitter();
|
|
61
61
|
this.cleared = new EventEmitter();
|
|
62
|
-
this.submitRegistered = new EventEmitter();
|
|
63
62
|
this.fsFormClass = true;
|
|
64
63
|
this._tabGroups = new QueryList();
|
|
65
64
|
this._buttons = new QueryList();
|
|
@@ -68,6 +67,10 @@ export class FsFormDirective {
|
|
|
68
67
|
this._status$ = new BehaviorSubject(FormStatus.Valid);
|
|
69
68
|
this._destroy$ = new Subject();
|
|
70
69
|
this._confirmed = false;
|
|
70
|
+
this._submit$ = null;
|
|
71
|
+
}
|
|
72
|
+
set submit(submit$) {
|
|
73
|
+
this._submit$ = submit$;
|
|
71
74
|
}
|
|
72
75
|
get submitting() {
|
|
73
76
|
return this._status$.getValue() === FormStatus.Submitting;
|
|
@@ -91,20 +94,15 @@ export class FsFormDirective {
|
|
|
91
94
|
const submittedEvent = {
|
|
92
95
|
ngForm: this.ngForm,
|
|
93
96
|
submitter: this._submitter,
|
|
94
|
-
response: null
|
|
97
|
+
response: null,
|
|
95
98
|
};
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
const result = this.submit(this._submitEvent);
|
|
100
|
-
if (!isObservable(result)) {
|
|
101
|
-
return of(submittedEvent);
|
|
102
|
-
}
|
|
103
|
-
return result
|
|
99
|
+
const submit$ = this._submit$ ?
|
|
100
|
+
this._submit$(this._submitEvent) : of(submittedEvent);
|
|
101
|
+
return submit$
|
|
104
102
|
.pipe(map((response) => {
|
|
105
103
|
submittedEvent.response = response;
|
|
106
104
|
return submittedEvent;
|
|
107
|
-
}));
|
|
105
|
+
}), takeUntil(this._destroy$));
|
|
108
106
|
}
|
|
109
107
|
get _formInvalidState$() {
|
|
110
108
|
this._form.broadcast('invalid', this._submitEvent);
|
|
@@ -142,10 +140,20 @@ export class FsFormDirective {
|
|
|
142
140
|
this._updateDirtySubmitButtons();
|
|
143
141
|
}
|
|
144
142
|
}
|
|
145
|
-
|
|
146
|
-
this.
|
|
147
|
-
|
|
148
|
-
|
|
143
|
+
get hasSubmit() {
|
|
144
|
+
return this._submit$ !== null;
|
|
145
|
+
}
|
|
146
|
+
clearSubmit() {
|
|
147
|
+
this._submit$ = null;
|
|
148
|
+
setTimeout(() => {
|
|
149
|
+
this._cdRef.markForCheck();
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
registerSubmit(submit$) {
|
|
153
|
+
this._submit$ = () => submit$;
|
|
154
|
+
setTimeout(() => {
|
|
155
|
+
this._cdRef.markForCheck();
|
|
156
|
+
});
|
|
149
157
|
}
|
|
150
158
|
ngAfterContentInit() {
|
|
151
159
|
this._registerConfirm();
|
|
@@ -277,7 +285,7 @@ export class FsFormDirective {
|
|
|
277
285
|
const dialog = document.getElementById(this._dialogRef.id);
|
|
278
286
|
const paths = event.composedPath();
|
|
279
287
|
if (paths) {
|
|
280
|
-
paths.forEach(item => {
|
|
288
|
+
paths.forEach((item) => {
|
|
281
289
|
if (dialog === item) {
|
|
282
290
|
this._ngZone.run(() => {
|
|
283
291
|
this._formClose();
|
|
@@ -327,7 +335,7 @@ export class FsFormDirective {
|
|
|
327
335
|
const submitButtons = this._buttons
|
|
328
336
|
.filter((button) => button.submit);
|
|
329
337
|
const activeButton = submitButtons
|
|
330
|
-
.find(button => {
|
|
338
|
+
.find((button) => {
|
|
331
339
|
return button.active;
|
|
332
340
|
});
|
|
333
341
|
return activeButton ? activeButton : submitButtons[0];
|
|
@@ -499,20 +507,20 @@ export class FsFormDirective {
|
|
|
499
507
|
}
|
|
500
508
|
_registerConfirmDialogClose() {
|
|
501
509
|
if (this._dialogRef) {
|
|
502
|
-
this.formDialogClose.forEach(item => {
|
|
510
|
+
this.formDialogClose.forEach((item) => {
|
|
503
511
|
this._registerDialogClose(item);
|
|
504
512
|
});
|
|
505
513
|
this.formDialogClose.changes
|
|
506
514
|
.pipe(takeUntil(this._destroy$))
|
|
507
515
|
.subscribe((e) => {
|
|
508
|
-
e.forEach(item => {
|
|
516
|
+
e.forEach((item) => {
|
|
509
517
|
this._registerDialogClose(item);
|
|
510
518
|
});
|
|
511
519
|
});
|
|
512
520
|
}
|
|
513
521
|
}
|
|
514
522
|
_registerConfirmDialogBackdropEscape() {
|
|
515
|
-
this._dialogBackdropEscape = this._dialogRef && this._dialogRef.disableClose
|
|
523
|
+
this._dialogBackdropEscape = this._dialogRef && !this._dialogRef.disableClose;
|
|
516
524
|
if (this._dialogRef && !this._dialogRef.disableClose) {
|
|
517
525
|
this._dialogRef.disableClose = true;
|
|
518
526
|
this._dialogRef.backdropClick()
|
|
@@ -531,7 +539,7 @@ export class FsFormDirective {
|
|
|
531
539
|
this.ngForm.form.registerControl = (name, control) => {
|
|
532
540
|
const el = this._element.nativeElement.querySelector(`input[name='${name}']`);
|
|
533
541
|
if (el) {
|
|
534
|
-
el.setAttribute('name', name
|
|
542
|
+
el.setAttribute('name', `${name}_${guid()}`);
|
|
535
543
|
if (!el.getAttribute('autocomplete')) {
|
|
536
544
|
el.setAttribute('autocomplete', 'none');
|
|
537
545
|
}
|
|
@@ -624,7 +632,7 @@ export class FsFormDirective {
|
|
|
624
632
|
}
|
|
625
633
|
}
|
|
626
634
|
FsFormDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFormDirective, deps: [{ token: NgForm }, { token: i1.FsForm }, { token: i0.ElementRef }, { token: i2.FsMessage }, { token: i3.FsPrompt }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: MatDialogRef, optional: true }, { token: DrawerRef, optional: true }, { token: i4.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Directive });
|
|
627
|
-
FsFormDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.16", type: FsFormDirective, selector: "[fsForm]", inputs: { wrapperSelector: "wrapperSelector", messageSelector: "messageSelector", hintSelector: "hintSelector", labelSelector: "labelSelector", autocomplete: "autocomplete", shortcuts: "shortcuts", confirm: "confirm", confirmDialog: "confirmDialog", confirmDrawer: "confirmDrawer", confirmBrowser: "confirmBrowser", confirmTabs: "confirmTabs", dirtySubmitButton: "dirtySubmitButton", submit: "submit", successDelay: "successDelay", errorDelay: "errorDelay", tabGroup: "tabGroup", deactivationGuard: "deactivationGuard" }, outputs: { submitEvent: "fsForm", invalid: "invalid", valid: "valid", submitted: "submitted", reseted: "reseted", cleared: "cleared"
|
|
635
|
+
FsFormDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.16", type: FsFormDirective, selector: "[fsForm]", inputs: { wrapperSelector: "wrapperSelector", messageSelector: "messageSelector", hintSelector: "hintSelector", labelSelector: "labelSelector", autocomplete: "autocomplete", shortcuts: "shortcuts", confirm: "confirm", confirmDialog: "confirmDialog", confirmDrawer: "confirmDrawer", confirmBrowser: "confirmBrowser", confirmTabs: "confirmTabs", dirtySubmitButton: "dirtySubmitButton", submit: "submit", successDelay: "successDelay", errorDelay: "errorDelay", tabGroup: "tabGroup", deactivationGuard: "deactivationGuard" }, outputs: { submitEvent: "fsForm", invalid: "invalid", valid: "valid", submitted: "submitted", reseted: "reseted", cleared: "cleared" }, host: { properties: { "class.fs-form": "this.fsFormClass" } }, queries: [{ propertyName: "formDialogClose", predicate: FsFormDialogCloseDirective, descendants: true }, { propertyName: "_tabGroups", predicate: MatTabGroup, descendants: true }], usesOnChanges: true, ngImport: i0 });
|
|
628
636
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFormDirective, decorators: [{
|
|
629
637
|
type: Directive,
|
|
630
638
|
args: [{
|
|
@@ -690,8 +698,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
|
|
|
690
698
|
type: Output
|
|
691
699
|
}], cleared: [{
|
|
692
700
|
type: Output
|
|
693
|
-
}], submitRegistered: [{
|
|
694
|
-
type: Output
|
|
695
701
|
}], fsFormClass: [{
|
|
696
702
|
type: HostBinding,
|
|
697
703
|
args: ['class.fs-form']
|
|
@@ -702,4 +708,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
|
|
|
702
708
|
type: ContentChildren,
|
|
703
709
|
args: [MatTabGroup, { descendants: true }]
|
|
704
710
|
}] } });
|
|
705
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2RpcmVjdGl2ZXMvZm9ybS9mb3JtLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBSU4sUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEdBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFtQixNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsY0FBYyxFQUFTLE1BQU0saUJBQWlCLENBQUM7QUFFeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBVSxXQUFXLEVBQWdCLE1BQU0sd0JBQXdCLENBQUM7QUFFM0UsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU5QyxPQUFPLEVBQ0wsZUFBZSxFQUNmLEtBQUssRUFDTCxTQUFTLEVBQ1QsR0FBRyxFQUNILFlBQVksRUFFWixFQUFFLEVBQ0YsT0FBTyxFQUNQLFVBQVUsRUFDWCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFDTCxVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFDTixLQUFLLEVBQ0wsR0FBRyxFQUNILEtBQUssRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUNULFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULEdBQUcs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QUlDLGFBQWE7c0JBRG5CLEtBQUs7Z0JBSUMsYUFBYTtzQkFEbkIsS0FBSztnQkFJQyxjQUFjO3NCQURwQixLQUFLO2dCQUlDLFdBQVc7c0JBRGpCLEtBQUs7Z0JBSUMsaUJBQWlCO3NCQUR2QixLQUFLO2dCQUlDLE1BQU07c0JBRFosS0FBSztnQkFJQyxZQUFZO3NCQURsQixLQUFLO2dCQUlDLFVBQVU7c0JBRGhCLEtBQUs7Z0JBSUMsUUFBUTtzQkFEZCxLQUFLO2dCQUlDLGlCQUFpQjtzQkFEdkIsS0FBSztnQkFJQyxXQUFXO3NCQURqQixNQUFNO3VCQUFDLFFBQVE7Z0JBSVQsT0FBTztzQkFEYixNQUFNO2dCQUlBLEtBQUs7c0JBRFgsTUFBTTtnQkFJQSxTQUFTO3NCQURmLE1BQU07Z0JBSUEsT0FBTztzQkFEYixNQUFNO2dCQUlBLE9BQU87c0JBRGIsTUFBTTtnQkFJQSxnQkFBZ0I7c0JBRHRCLE1BQU07Z0JBSUEsV0FBVztzQkFEakIsV0FBVzt1QkFBQyxlQUFlO2dCQUlyQixlQUFlO3NCQURyQixlQUFlO3VCQUFDLDBCQUEwQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkFJMUQsVUFBVTtzQkFEakIsZUFBZTt1QkFBQyxXQUFXLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRUYWIsIE1hdFRhYkdyb3VwLCBNYXRUYWJIZWFkZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcblxuaW1wb3J0IHsgZ3VpZCB9IGZyb20gJ0BmaXJlc3RpdGNoL2NvbW1vbic7XG5pbXBvcnQgeyBEcmF3ZXJSZWYgfSBmcm9tICdAZmlyZXN0aXRjaC9kcmF3ZXInO1xuaW1wb3J0IHsgRnNNZXNzYWdlLCBNZXNzYWdlTW9kZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuXG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGRlZmVyLFxuICBmcm9tRXZlbnQsXG4gIGlpZixcbiAgaXNPYnNlcnZhYmxlLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgU3ViamVjdCxcbiAgdGhyb3dFcnJvclxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGNhdGNoRXJyb3IsXG4gIGRlbGF5LFxuICBmaWx0ZXIsXG4gIGZpcnN0LFxuICBtYXAsXG4gIG1hcFRvLFxuICBtZXJnZU1hcCxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgRm9ybURlYWN0aXZhdGVHdWFyZCB9IGZyb20gJy4uLy4uL2d1YXJkcy9mb3JtLWRlYWN0aXZhdGUuZ3VhcmQnO1xuaW1wb3J0IHsgY29uZmlybVJlc3VsdENvbnRpbnVlIH0gZnJvbSAnLi4vLi4vaGVscGVycy9jb25maXJtLXJlc3VsdC1jb250aW51ZSc7XG5pbXBvcnQgeyBjb25maXJtVW5zYXZlZCB9IGZyb20gJy4uLy4uL2hlbHBlcnMvY29uZmlybS11bnNhdmVkJztcbmltcG9ydCB7IGdldEFjdGl2ZVJvdXRlIH0gZnJvbSAnLi4vLi4vaGVscGVycy9nZXQtYWN0aXZlLXJvdXRlJztcbmltcG9ydCB7IGdldEZvcm1FcnJvcnMgfSBmcm9tICcuLi8uLi9oZWxwZXJzL2dldC1mb3JtLWVycm9ycyc7XG5pbXBvcnQgeyBGc0Zvcm0gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mc2Zvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBGc0J1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2J1dHRvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRnNGb3JtRGlhbG9nQ2xvc2VEaXJlY3RpdmUgfSBmcm9tICcuLi9mb3JtLWRpYWxvZy1jbG9zZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ29uZmlybVJlc3VsdCB9IGZyb20gJy4vLi4vLi4vZW51bXMvY29uZmlybS1yZXN1bHQnO1xuaW1wb3J0IHsgRm9ybVN0YXR1cyB9IGZyb20gJy4vLi4vLi4vZW51bXMvZm9ybS1zdGF0dXMnO1xuaW1wb3J0IHsgQ29uZmlybUNvbmZpZywgQ29uZmlybVRhYkdyb3VwLCBTdWJtaXR0ZWRFdmVudCB9IGZyb20gJy4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBTdWJtaXRFdmVudCB9IGZyb20gJy4vLi4vLi4vaW50ZXJmYWNlcy9zdWJtaXQtZXZlbnQnO1xuXG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tmc0Zvcm1dJyxcbn0pXG5leHBvcnQgY2xhc3MgRnNGb3JtRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHdyYXBwZXJTZWxlY3RvciA9ICcuZnMtZm9ybS13cmFwcGVyLC5tYXQtZm9ybS1maWVsZCc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIG1lc3NhZ2VTZWxlY3RvciA9ICcuZnMtZm9ybS1tZXNzYWdlLC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcic7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGhpbnRTZWxlY3RvciA9ICcuZnMtZm9ybS1oaW50LC5tYXQtZm9ybS1maWVsZC1oaW50LXdyYXBwZXInO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsYWJlbFNlbGVjdG9yID0gJy5mcy1mb3JtLWxhYmVsLC5tYXQtZm9ybS1maWVsZC1sYWJlbCc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGF1dG9jb21wbGV0ZSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG9ydGN1dHMgPSB0cnVlOyAvLyBDdHJsICsgc1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjb25maXJtOiBDb25maXJtQ29uZmlnIHwgYm9vbGVhbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGNvbmZpcm1EaWFsb2cgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjb25maXJtRHJhd2VyID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY29uZmlybUJyb3dzZXIgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjb25maXJtVGFicyA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGRpcnR5U3VibWl0QnV0dG9uID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc3VibWl0OiAoZXZlbnQ6IFN1Ym1pdEV2ZW50KSA9PiBPYnNlcnZhYmxlPGFueT47XG5cbiAgQElucHV0KClcbiAgcHVibGljIHN1Y2Nlc3NEZWxheSA9IDA7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGVycm9yRGVsYXkgPSAxMDAwO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0YWJHcm91cDogTWF0VGFiR3JvdXA7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGRlYWN0aXZhdGlvbkd1YXJkID0gdHJ1ZTtcblxuICBAT3V0cHV0KCdmc0Zvcm0nKVxuICBwdWJsaWMgc3VibWl0RXZlbnQ6IEV2ZW50RW1pdHRlcjxTdWJtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBpbnZhbGlkOiBFdmVudEVtaXR0ZXI8U3VibWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgdmFsaWQ6IEV2ZW50RW1pdHRlcjxTdWJtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzdWJtaXR0ZWQ6IEV2ZW50RW1pdHRlcjxTdWJtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZXNldGVkOiBFdmVudEVtaXR0ZXI8U3VibWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgY2xlYXJlZDogRXZlbnRFbWl0dGVyPFN1Ym1pdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHN1Ym1pdFJlZ2lzdGVyZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZnMtZm9ybScpXG4gIHB1YmxpYyBmc0Zvcm1DbGFzcyA9IHRydWU7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihGc0Zvcm1EaWFsb2dDbG9zZURpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBwdWJsaWMgZm9ybURpYWxvZ0Nsb3NlOiBRdWVyeUxpc3Q8RnNGb3JtRGlhbG9nQ2xvc2VEaXJlY3RpdmU+O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oTWF0VGFiR3JvdXAsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgcHJpdmF0ZSBfdGFiR3JvdXBzOiBRdWVyeUxpc3Q8TWF0VGFiR3JvdXA+ID0gbmV3IFF1ZXJ5TGlzdCgpO1xuXG4gIHByaXZhdGUgX2J1dHRvbnMgPSBuZXcgUXVlcnlMaXN0PEZzQnV0dG9uRGlyZWN0aXZlPigpO1xuICBwcml2YXRlIF9yZWdpc3RlckNvbnRyb2w7XG4gIHByaXZhdGUgX2FjdGl2ZVN1Ym1pdEJ1dHRvbjogRnNCdXR0b25EaXJlY3RpdmU7XG4gIHByaXZhdGUgX2RpYWxvZ0JhY2tkcm9wRXNjYXBlID0gZmFsc2U7XG4gIHByaXZhdGUgX3NuYXBzaG90OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gIHByaXZhdGUgX2FjdGl2YXRlZFJvdXRlQ29uZmlnOiBSb3V0ZSB8IG51bGw7XG4gIHByaXZhdGUgX3N0YXR1cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KEZvcm1TdGF0dXMuVmFsaWQpO1xuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgX2NvbmZpcm1lZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTmdGb3JtKVxuICAgIHB1YmxpYyBuZ0Zvcm06IE5nRm9ybSxcbiAgICBwcml2YXRlIF9mb3JtOiBGc0Zvcm0sXG4gICAgcHJpdmF0ZSBfZWxlbWVudDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIF9tZXNzYWdlOiBGc01lc3NhZ2UsXG4gICAgcHJpdmF0ZSBfcHJvbXB0OiBGc1Byb21wdCxcbiAgICBwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIF9jZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG5cbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1hdERpYWxvZ1JlZilcbiAgICBwcml2YXRlIF9kaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxhbnk+LFxuXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChEcmF3ZXJSZWYpXG4gICAgcHJpdmF0ZSBfZHJhd2VyUmVmOiBEcmF3ZXJSZWY8YW55PixcblxuICAgIHByaXZhdGUgX3JvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgKSB7IH1cblxuICBwdWJsaWMgZ2V0IHN1Ym1pdHRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cyQuZ2V0VmFsdWUoKSA9PT0gRm9ybVN0YXR1cy5TdWJtaXR0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCB2YWxpZGF0aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0dXMkLmdldFZhbHVlKCkgPT09IEZvcm1TdGF0dXMuVmFsaWRhdGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29tcGxldGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdHVzJC5nZXRWYWx1ZSgpID09PSBGb3JtU3RhdHVzLkNvbXBsZXRpbmc7XG4gIH1cblxuICBwcml2YXRlIGdldCBfc3VibWl0RXZlbnQoKTogU3VibWl0RXZlbnQge1xuICAgIHJldHVybiB7XG4gICAgICBuZ0Zvcm06IHRoaXMubmdGb3JtLFxuICAgICAgc3VibWl0dGVyOiB0aGlzLl9zdWJtaXR0ZXIsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9mb3JtVmFsaWRTdGF0ZSQoKTogT2JzZXJ2YWJsZTxTdWJtaXR0ZWRFdmVudD4ge1xuICAgIHRoaXMuX2Zvcm0uYnJvYWRjYXN0KCd2YWxpZCcsIHRoaXMuX3N1Ym1pdEV2ZW50KTtcbiAgICB0aGlzLnN1Ym1pdEV2ZW50LmVtaXQodGhpcy5fc3VibWl0RXZlbnQpO1xuICAgIHRoaXMudmFsaWQuZW1pdCh0aGlzLl9zdWJtaXRFdmVudCk7XG5cbiAgICBjb25zdCBzdWJtaXR0ZWRFdmVudDogU3VibWl0dGVkRXZlbnQgPSB7XG4gICAgICBuZ0Zvcm06IHRoaXMubmdGb3JtLFxuICAgICAgc3VibWl0dGVyOiB0aGlzLl9zdWJtaXR0ZXIsXG4gICAgICByZXNwb25zZTogbnVsbFxuICAgIH07XG5cbiAgICBpZiAoIXRoaXMuc3VibWl0KSB7XG4gICAgICByZXR1cm4gb2Yoc3VibWl0dGVkRXZlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc3VibWl0KHRoaXMuX3N1Ym1pdEV2ZW50KTtcblxuICAgIGlmICghaXNPYnNlcnZhYmxlKHJlc3VsdCkpIHtcbiAgICAgIHJldHVybiBvZihzdWJtaXR0ZWRFdmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBzdWJtaXR0ZWRFdmVudC5yZXNwb25zZSA9IHJlc3BvbnNlO1xuXG4gICAgICAgICAgcmV0dXJuIHN1Ym1pdHRlZEV2ZW50O1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9mb3JtSW52YWxpZFN0YXRlJCgpOiBPYnNlcnZhYmxlPG5ldmVyPiB7XG4gICAgdGhpcy5fZm9ybS5icm9hZGNhc3QoJ2ludmFsaWQnLCB0aGlzLl9zdWJtaXRFdmVudCk7XG5cbiAgICBpZiAodGhpcy5pbnZhbGlkKSB7XG4gICAgICB0aGlzLmludmFsaWQuZW1pdCh0aGlzLl9zdWJtaXRFdmVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9ICdQbGVhc2UgcmV2aWV3IGVycm9ycyBoaWdobGlnaHRlZCBpbiByZWQnO1xuICAgIHRoaXMuX21lc3NhZ2UuZXJyb3IobWVzc2FnZSwgeyBtb2RlOiBNZXNzYWdlTW9kZS5Ub2FzdCB9KTtcblxuICAgIGNvbnN0IGVsID0gdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uZy1pbnZhbGlkJyk7XG5cbiAgICBpZiAoZWwpIHtcbiAgICAgIGVsLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aHJvd0Vycm9yKCdGb3JtIHZhbGlkYXRpb24gZXJyb3InKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9zdWJtaXR0ZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlU3VibWl0QnV0dG9uXG4gICAgICA/IHRoaXMuX2FjdGl2ZVN1Ym1pdEJ1dHRvbi5uYW1lXG4gICAgICA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuZGVhY3RpdmF0aW9uR3VhcmQpIHtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyQ2FuRGVhY3RpdmF0ZUd1YXJkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVnaXN0ZXJDb25maXJtRGlhbG9nQmFja2Ryb3BFc2NhcGUoKTtcbiAgICB0aGlzLl9saXN0ZW5Ib3RLZXlzKCk7XG4gICAgdGhpcy5fbGlzdGVuV2luZG93Q2xvc2UoKTtcbiAgICB0aGlzLl9saXN0ZW5TdWJtaXQoKTtcbiAgICB0aGlzLl9saXN0ZW5Gb3JtU3RhdHVzKCk7XG5cbiAgICBpZiAoIXRoaXMuYXV0b2NvbXBsZXRlKSB7XG4gICAgICB0aGlzLl9yZWdpc3RlckF1dG9jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMuY29uZmlybSkge1xuICAgICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyU3VibWl0KGZuOiAoKSA9PiBPYnNlcnZhYmxlPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLnN1Ym1pdCA9IGZuO1xuICAgIHRoaXMuc3VibWl0UmVnaXN0ZXJlZC5lbWl0KCk7XG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3JlZ2lzdGVyQ29uZmlybSgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyQ29uZmlybURpYWxvZ0Nsb3NlKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJDb25maXJtRHJhd2VyQ2xvc2UoKTtcbiAgICB0aGlzLl9yZWdpc3RlckNvbmZpcm1UYWJzKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJEcmF3ZXJDbG9zZSgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyRGlydHlTdWJtaXRCdXR0b24oKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9jbGVhbnVwQ2FuRGVhY3RpdmF0ZSgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVNuYXBzaG90KCk6IHZvaWQge1xuICAgIHRoaXMuX3NuYXBzaG90ID0gdGhpcy5uZ0Zvcm0udmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U25hcHNob3QoKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHRoaXMuX3NuYXBzaG90IHx8IHt9O1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLnJlc2V0Rm9ybSgpO1xuXG4gICAgT2JqZWN0LmtleXModGhpcy5uZ0Zvcm0uY29udHJvbHMpXG4gICAgICAuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLm5nRm9ybS5jb250cm9sc1tuYW1lXTtcbiAgICAgICAgY29udHJvbC5yZXNldCh0aGlzLl9zbmFwc2hvdFtuYW1lXSk7XG4gICAgICB9KTtcblxuICAgIHRoaXMucmVzZXRlZC5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5uZ0Zvcm0ucmVzZXRGb3JtKCk7XG4gICAgdGhpcy5jbGVhcmVkLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXJ0eSgpOiB2b2lkIHtcbiAgICB0aGlzLm5nRm9ybS5mb3JtLm1hcmtBc0RpcnR5KCk7XG4gICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gIH1cblxuICBwdWJsaWMgdHJpZ2dlclN1Ym1pdChvcHRpb25zPzogeyBjb25maXJtZWQ6IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIHRoaXMuX2NvbmZpcm1lZCA9IG9wdGlvbnM/LmNvbmZpcm1lZDtcbiAgICB0aGlzLm5nRm9ybS5uZ1N1Ym1pdC5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgdHJpZ2dlckNvbmZpcm0oKTogT2JzZXJ2YWJsZTxDb25maXJtUmVzdWx0PiB7XG4gICAgY29uc3Qgc3VibWl0dGVkID0gdGhpcy5zdWJtaXR0aW5nID8gdGhpcy5zdWJtaXR0ZWQuYXNPYnNlcnZhYmxlKCkgOiBvZih7fSk7XG5cbiAgICByZXR1cm4gc3VibWl0dGVkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgbWVyZ2VNYXAoKCkgPT4gY29uZmlybVVuc2F2ZWQoW3RoaXNdLCB0aGlzLl9wcm9tcHQpKSxcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZW5hYmxlKCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLmNvbnRyb2wuZW5hYmxlKCk7XG5cbiAgICB0aGlzLl91cGRhdGVEaXJ0eVN1Ym1pdEJ1dHRvbnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLmNvbnRyb2wuZGlzYWJsZSgpO1xuXG4gICAgdGhpcy5fYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWRkQnV0dG9uKGJ1dHRvbjogRnNCdXR0b25EaXJlY3RpdmUpOiB2b2lkIHtcbiAgICB0aGlzLl9idXR0b25zLnJlc2V0KFxuICAgICAgW1xuICAgICAgICAuLi50aGlzLl9idXR0b25zLnRvQXJyYXkoKSxcbiAgICAgICAgYnV0dG9uLFxuICAgICAgXSk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQnV0dG9uKGJ1dHRvbjogRnNCdXR0b25EaXJlY3RpdmUpOiB2b2lkIHtcbiAgICB0aGlzLl9idXR0b25zLnJlc2V0KFxuICAgICAgW1xuICAgICAgICAuLi50aGlzLl9idXR0b25zLnRvQXJyYXkoKVxuICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IChidXR0b24gIT09IGl0ZW0pKSxcbiAgICAgIF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuU3VibWl0KCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtXG4gICAgICAubmdTdWJtaXRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pLFxuICAgICAgICBtYXAoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHsgZXZlbnQsIGNvbmZpcm1lZDogdGhpcy5fY29uZmlybWVkIH07XG4gICAgICAgIH0pLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fY29uZmlybWVkID0gZmFsc2UpLFxuICAgICAgICBmaWx0ZXIoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBbRm9ybVN0YXR1cy5WYWxpZCwgRm9ybVN0YXR1cy5JbnZhbGlkXVxuICAgICAgICAgICAgLmluY2x1ZGVzKHRoaXMuX3N0YXR1cyQuZ2V0VmFsdWUoKSk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fYnJvYWRjYXNWYWxpZGF0aW5nRXZlbnRzKCkpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy52YWxpZGF0ZSgpKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX2Jyb2FkY2FzdFN1Ym1pdHRpbmdFdmVudHMoKSksXG4gICAgICAgIHN3aXRjaE1hcCgoZGF0YSkgPT4gdGhpcy5fd2FpdFVudGlsU3RhdHVzUGVuZGluZygpXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBtYXBUbyhkYXRhKSxcbiAgICAgICAgICApKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX3NldHVwQWN0aXZlU3VibWl0QnV0dG9uKCkpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fZGlzYWJsZUJ1dHRvbnMoKSksXG4gICAgICAgIG1lcmdlTWFwKChkYXRhKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMubmdGb3JtLnN0YXR1cyA9PT0gJ0lOVkFMSUQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9ybUludmFsaWRTdGF0ZSQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1WYWxpZFN0YXRlJFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIG1hcCgoc3VibWl0RXZlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4uc3VibWl0RXZlbnQsXG4gICAgICAgICAgICAgICAgY29uZmlybWVkOiBkYXRhLmNvbmZpcm1lZFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlLCBzb3VyY2UkKSA9PiB7XG4gICAgICAgICAgdGhpcy5faGFuZGxlRXJyb3IoZSk7XG5cbiAgICAgICAgICByZXR1cm4gc291cmNlJDtcbiAgICAgICAgfSksXG4gICAgICAgIHRhcCgoc3VibWl0dGVkRXZlbnQ6IFN1Ym1pdHRlZEV2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5fY29tcGxldGVTdWJtaXQodHJ1ZSwgc3VibWl0dGVkRXZlbnQpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7IH0pO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKCk6IHZvaWQge1xuICAgIE9iamVjdC52YWx1ZXModGhpcy5uZ0Zvcm0uY29udHJvbHMpXG4gICAgICAuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuRm9ybVN0YXR1cygpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGF0dXMkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGZvcm1TdGF0dXM6IEZvcm1TdGF0dXMpID0+IHtcbiAgICAgICAgY29uc3QgY2xzID0gW0Zvcm1TdGF0dXMuU3VibWl0dGluZywgRm9ybVN0YXR1cy5WYWxpZGF0aW5nXTtcbiAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdDtcbiAgICAgICAgY2xhc3NMaXN0LnJlbW92ZSguLi5jbHMpO1xuICAgICAgICBpZiAoY2xzLmluZGV4T2YoZm9ybVN0YXR1cykgIT09IC0xKSB7XG4gICAgICAgICAgY2xhc3NMaXN0LmFkZChmb3JtU3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RlbldpbmRvd0Nsb3NlKCk6IHZvaWQge1xuICAgIGZyb21FdmVudCh3aW5kb3csICdiZWZvcmV1bmxvYWQnKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlybSAmJiB0aGlzLmNvbmZpcm1Ccm93c2VyICYmIHRoaXMubmdGb3JtLmRpcnR5KSB7XG4gICAgICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5Ib3RLZXlzKCk6IHZvaWQge1xuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBmcm9tRXZlbnQoZG9jdW1lbnQsICdrZXlkb3duJylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9kaWFsb2dCYWNrZHJvcEVzY2FwZSAmJiBldmVudC5jb2RlID09PSAnRXNjYXBlJykge1xuICAgICAgICAgICAgY29uc3QgZGlhbG9nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5fZGlhbG9nUmVmLmlkKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGhzID0gZXZlbnQuY29tcG9zZWRQYXRoKCk7XG5cbiAgICAgICAgICAgIGlmIChwYXRocykge1xuICAgICAgICAgICAgICBwYXRocy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkaWFsb2cgPT09IGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb3JtQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIGV2ZW50LmNvZGUgPT09ICdLZXlTJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvcnRjdXRzKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9lbGVtZW50SW5Gb3JtKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZ0Zvcm0ubmdTdWJtaXQubmV4dCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2Zvcm1DbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25maXJtICYmIHRoaXMuY29uZmlybURpYWxvZykge1xuICAgICAgdGhpcy50cmlnZ2VyQ29uZmlybSgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcigocmVzdWx0KSA9PiBjb25maXJtUmVzdWx0Q29udGludWUocmVzdWx0KSksXG4gICAgICAgICAgc3dpdGNoTWFwKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgPT09IENvbmZpcm1SZXN1bHQuUHJpc3RpbmUgfHwgcmVzdWx0ID09PSBDb25maXJtUmVzdWx0LkRpc2NhcmRcbiAgICAgICAgICAgICAgPyBvZihudWxsKVxuICAgICAgICAgICAgICA6IHRoaXMuc3VibWl0dGVkLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBTdWJtaXR0ZWRFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZi5jbG9zZShyZXN1bHQ/LnJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2RpYWxvZ1JlZi5jbG9zZShudWxsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckRpYWxvZ0Nsb3NlKGRpcmVjdGl2ZTogRnNGb3JtRGlhbG9nQ2xvc2VEaXJlY3RpdmUpOiB2b2lkIHtcbiAgICBpZiAoIWRpcmVjdGl2ZS5yZWdpc3RlcmVkKSB7XG4gICAgICBkaXJlY3RpdmUucmVnaXN0ZXJlZCA9IHRydWU7XG5cbiAgICAgIGRpcmVjdGl2ZS5jbGlja2VkJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2Zvcm1DbG9zZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRBY3RpdmVTdWJtaXRCdXR0b24oKTogRnNCdXR0b25EaXJlY3RpdmUge1xuICAgIGNvbnN0IHN1Ym1pdEJ1dHRvbnMgPSB0aGlzLl9idXR0b25zXG4gICAgICAuZmlsdGVyKChidXR0b24pID0+IGJ1dHRvbi5zdWJtaXQpO1xuXG4gICAgY29uc3QgYWN0aXZlQnV0dG9uID0gc3VibWl0QnV0dG9uc1xuICAgICAgLmZpbmQoYnV0dG9uID0+IHtcbiAgICAgICAgcmV0dXJuIGJ1dHRvbi5hY3RpdmU7XG4gICAgICB9KTtcblxuICAgIHJldHVybiBhY3RpdmVCdXR0b24gPyBhY3RpdmVCdXR0b24gOiBzdWJtaXRCdXR0b25zWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSBfZWxlbWVudEluRm9ybShlbDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChlbC5pc1NhbWVOb2RlKHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZWwucGFyZW50RWxlbWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRJbkZvcm0oZWwucGFyZW50RWxlbWVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tcGxldGVTdWJtaXQoc3VjY2Vzcywgc3VibWl0RXZlbnQ6IFN1Ym1pdHRlZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMubmdGb3JtLmNvbnRyb2wubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgIHRoaXMuY3JlYXRlU25hcHNob3QoKTtcbiAgICAgIHRoaXMuc3VibWl0dGVkLmVtaXQoc3VibWl0RXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZXNldEJ1dHRvbnMoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fYWN0aXZlU3VibWl0QnV0dG9uKSB7XG4gICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICB0aGlzLl9hY3RpdmVTdWJtaXRCdXR0b24uc3VjY2VzcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlU3VibWl0QnV0dG9uLmVycm9yKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuU3VibWl0dGVkKTtcblxuICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5TdWNjZXNzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuRXJyb3IpO1xuICAgIH1cblxuICAgIHRoaXMuX3N0YXR1cyQubmV4dChGb3JtU3RhdHVzLkNvbXBsZXRpbmcpO1xuXG4gICAgY29uc3QgcmVzZXREZWxheSA9IHN1Y2Nlc3MgPyB0aGlzLnN1Y2Nlc3NEZWxheSA6IHRoaXMuZXJyb3JEZWxheTtcblxuICAgIG9mKHRydWUpXG4gICAgICAucGlwZShcbiAgICAgICAgZGVsYXkocmVzZXREZWxheSksXG4gICAgICAgIGZpcnN0KCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm5nRm9ybS5mb3JtLnN0YXR1cyA9PT0gJ1ZBTElEJykge1xuICAgICAgICAgIHRoaXMuX3N0YXR1cyQubmV4dChGb3JtU3RhdHVzLlZhbGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5JbnZhbGlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Jlc2V0QnV0dG9ucygpO1xuICAgICAgICB0aGlzLl9yZXNldEFjdGl2ZUJ1dHRvbnMoKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc2V0QnV0dG9ucygpOiB2b2lkIHtcbiAgICB0aGlzLl9idXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgYnV0dG9uLnJlc2V0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZXNldEFjdGl2ZUJ1dHRvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5fYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgIGJ1dHRvbi5yZXNldEFjdGl2ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDb25maXJtKCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLmZvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoY2hhbmdlcykgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb25maXJtKSB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBPYmplY3Qua2V5cyh0aGlzLl9zbmFwc2hvdCk7XG5cbiAgICAgICAgICBPYmplY3Qua2V5cyhjaGFuZ2VzKVxuICAgICAgICAgICAgLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcuaW5kZXhPZihuYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zbmFwc2hvdFtuYW1lXSA9IGNoYW5nZXNbbmFtZV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyRHJhd2VyQ2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RyYXdlclJlZikge1xuICAgICAgdGhpcy5fZHJhd2VyUmVmLmNsb3NlU3RhcnQkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoc3Vic2NyaWJlcikgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnN1Ym1pdHRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyRcbiAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKChzdGF0dXMpID0+IHN0YXR1cyA9PT0gRm9ybVN0YXR1cy5TdWNjZXNzIHx8IHN0YXR1cyA9PT0gRm9ybVN0YXR1cy5FcnJvciksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAuc3Vic2NyaWJlKChzdGF0dXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBGb3JtU3RhdHVzLlN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckNvbmZpcm1EcmF3ZXJDbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZHJhd2VyUmVmKSB7XG4gICAgICB0aGlzLl9kcmF3ZXJSZWYuY2xvc2VTdGFydCRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaWlmKFxuICAgICAgICAgICAgICAoKSA9PiB0aGlzLmNvbmZpcm0gJiYgdGhpcy5jb25maXJtRHJhd2VyLFxuICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJDb25maXJtKClcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgIG1hcCgocmVzdWx0KSA9PiBjb25maXJtUmVzdWx0Q29udGludWUocmVzdWx0KSksXG4gICAgICAgICAgICAgICAgICB0YXAoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIGRlZmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoKTtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ29uZmlybVRhYnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGFiR3JvdXApIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJDb25maXJtVGFiR3JvdXAodGhpcy50YWJHcm91cCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWdpc3RlckNvbmZpcm1UYWJHcm91cHModGhpcy5fdGFiR3JvdXBzLnRvQXJyYXkoKSk7XG5cbiAgICB0aGlzLl90YWJHcm91cHMuY2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyQ29uZmlybVRhYkdyb3Vwcyh0aGlzLl90YWJHcm91cHMudG9BcnJheSgpKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyQ29uZmlybVRhYkdyb3Vwcyh0YWJHcm91cHM6IE1hdFRhYkdyb3VwW10pOiB2b2lkIHtcbiAgICB0YWJHcm91cHMuZm9yRWFjaCgodGFiR3JvdXA6IE1hdFRhYkdyb3VwKSA9PiB7XG4gICAgICB0aGlzLnJlZ2lzdGVyQ29uZmlybVRhYkdyb3VwKHRhYkdyb3VwKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckNvbmZpcm1UYWJHcm91cCh0YWJHcm91cDogTWF0VGFiR3JvdXApOiB2b2lkIHtcbiAgICBjb25zdCBjb25maXJtVGFiR3JvdXAgPSB0YWJHcm91cCBhcyBDb25maXJtVGFiR3JvdXA7XG4gICAgaWYgKCFjb25maXJtVGFiR3JvdXAuX29yaWdpbmFsSGFuZGxlQ2xpY2spIHtcbiAgICAgIGNvbmZpcm1UYWJHcm91cC5fb3JpZ2luYWxIYW5kbGVDbGljayA9IHRhYkdyb3VwLl9oYW5kbGVDbGljaztcbiAgICAgIGNvbmZpcm1UYWJHcm91cC5faGFuZGxDbGljayQgPSBuZXcgU3ViamVjdDx7IHRhYjogTWF0VGFiOyB0YWJIZWFkZXI6IE1hdFRhYkhlYWRlcjsgaWR4OiBudW1iZXIgfT4oKTtcbiAgICAgIGNvbmZpcm1UYWJHcm91cC5faGFuZGxlQ2xpY2sgPSAodGFiOiBNYXRUYWIsIHRhYkhlYWRlcjogTWF0VGFiSGVhZGVyLCBpZHg6IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAoY29uZmlybVRhYkdyb3VwLl9oYW5kbENsaWNrJC5vYnNlcnZlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uZmlybVRhYkdyb3VwLl9oYW5kbENsaWNrJC5uZXh0KHsgdGFiLCB0YWJIZWFkZXIsIGlkeCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25maXJtVGFiR3JvdXAuX29yaWdpbmFsSGFuZGxlQ2xpY2sodGFiLCB0YWJIZWFkZXIsIGlkeCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25maXJtVGFiR3JvdXAuX2hhbmRsQ2xpY2skXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zdWJtaXR0aW5nKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlybSAmJiB0aGlzLmNvbmZpcm1UYWJzKSB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJDb25maXJtKClcbiAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlybVJlc3VsdENvbnRpbnVlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGNvbmZpcm1UYWJHcm91cC5zZWxlY3RlZEluZGV4ID0gZXZlbnQuaWR4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpcm1UYWJHcm91cC5fb3JpZ2luYWxIYW5kbGVDbGljayhldmVudC50YWIsIGV2ZW50LnRhYkhlYWRlciwgZXZlbnQuaWR4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDb25maXJtRGlhbG9nQ2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RpYWxvZ1JlZikge1xuICAgICAgdGhpcy5mb3JtRGlhbG9nQ2xvc2UuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJEaWFsb2dDbG9zZShpdGVtKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmZvcm1EaWFsb2dDbG9zZS5jaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoZSkgPT4ge1xuICAgICAgICAgIGUuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyRGlhbG9nQ2xvc2UoaXRlbSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ29uZmlybURpYWxvZ0JhY2tkcm9wRXNjYXBlKCk6IHZvaWQge1xuICAgIHRoaXMuX2RpYWxvZ0JhY2tkcm9wRXNjYXBlID0gdGhpcy5fZGlhbG9nUmVmICYmIHRoaXMuX2RpYWxvZ1JlZi5kaXNhYmxlQ2xvc2UgIT09IHRydWU7XG5cbiAgICBpZiAodGhpcy5fZGlhbG9nUmVmICYmICF0aGlzLl9kaWFsb2dSZWYuZGlzYWJsZUNsb3NlKSB7XG4gICAgICB0aGlzLl9kaWFsb2dSZWYuZGlzYWJsZUNsb3NlID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2RpYWxvZ1JlZi5iYWNrZHJvcENsaWNrKClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2Zvcm1DbG9zZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgdGhpcy5fZGVzdHJveSRcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmRpc2FibGVDbG9zZSA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckF1dG9jb21wbGV0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWdpc3RlckNvbnRyb2wgPSB0aGlzLm5nRm9ybS5mb3JtLnJlZ2lzdGVyQ29udHJvbC5iaW5kKHRoaXMubmdGb3JtLmZvcm0pO1xuXG4gICAgdGhpcy5uZ0Zvcm0uZm9ybS5yZWdpc3RlckNvbnRyb2wgPSAobmFtZTogc3RyaW5nLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcblxuICAgICAgY29uc3QgZWw6IEVsZW1lbnQgPSB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihgaW5wdXRbbmFtZT0nJHtuYW1lfSddYCk7XG5cbiAgICAgIGlmIChlbCkge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBuYW1lICsgJ18nICsgZ3VpZCgpKTtcblxuICAgICAgICBpZiAoIWVsLmdldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJykpIHtcbiAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2F1dG9jb21wbGV0ZScsICdub25lJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyQ29udHJvbChuYW1lLCBjb250cm9sKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckRpcnR5U3VibWl0QnV0dG9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5uZ0Zvcm0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm5nRm9ybS5mb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuX2J1dHRvbnMuY2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZURpcnR5U3VibWl0QnV0dG9ucygpOiB2b2lkIHtcbiAgICB0aGlzLl9idXR0b25zXG4gICAgICAuZmlsdGVyKChidXR0b24pID0+IGJ1dHRvbi5zdWJtaXQpXG4gICAgICAuZm9yRWFjaCgoc3VibWl0QnV0dG9uOiBGc0J1dHRvbkRpcmVjdGl2ZSkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlybSB8fCAhdGhpcy5kaXJ0eVN1Ym1pdEJ1dHRvbiB8fCB0aGlzLm5nRm9ybS5kaXJ0eSB8fCAhc3VibWl0QnV0dG9uLmRpcnR5U3VibWl0KSB7XG4gICAgICAgICAgc3VibWl0QnV0dG9uLmVuYWJsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1Ym1pdEJ1dHRvbi5kaXNhYmxlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnJvYWRjYXN0U3VibWl0dGluZ0V2ZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5TdWJtaXR0aW5nKTtcbiAgICB0aGlzLl9mb3JtLmJyb2FkY2FzdCgnc3VibWl0JywgdGhpcy5uZ0Zvcm0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnJvYWRjYXNWYWxpZGF0aW5nRXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMuX3N0YXR1cyQubmV4dChGb3JtU3RhdHVzLlZhbGlkYXRpbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0dXBBY3RpdmVTdWJtaXRCdXR0b24oKTogdm9pZCB7XG4gICAgdGhpcy5fYWN0aXZlU3VibWl0QnV0dG9uID0gdGhpcy5fZ2V0QWN0aXZlU3VibWl0QnV0dG9uKCk7XG4gICAgdGhpcy5fcmVzZXRCdXR0b25zKCk7XG5cbiAgICBpZiAodGhpcy5fYWN0aXZlU3VibWl0QnV0dG9uKSB7XG4gICAgICB0aGlzLl9hY3RpdmVTdWJtaXRCdXR0b24ucHJvY2VzcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2Rpc2FibGVCdXR0b25zKCk6IHZvaWQge1xuICAgIHRoaXMuX2J1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24uZGlzYWJsZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfd2FpdFVudGlsU3RhdHVzUGVuZGluZygpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm5nRm9ybS5zdGF0dXNDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKHRoaXMubmdGb3JtLnN0YXR1cyksXG4gICAgICAgIGZpcnN0KChzdGF0ZSkgPT4gc3RhdGUgIT09ICdQRU5ESU5HJyksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlRXJyb3IoZTogU3VibWl0dGVkRXZlbnQpIHtcbiAgICBjb25zb2xlLmxvZygnJWMgRm9ybSBTdWJtaXQgJywgJ2NvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogI0QzM0Y0OScsICdFcnJvciBvY2N1cmVkJyk7XG5cbiAgICBjb25zb2xlLmdyb3VwKCdFcnJvciBEZXRhaWxzOicpO1xuICAgIGNvbnNvbGUubG9nKCdNZXNzYWdlOiAnLCBlKTtcbiAgICBjb25zb2xlLmxvZygnRm9ybVJlZjogJywgdGhpcyk7XG5cbiAgICBpZiAodGhpcy5uZ0Zvcm0uaW52YWxpZCkge1xuICAgICAgY29uc3QgZXJyb3JzID0gZ2V0Rm9ybUVycm9ycyh0aGlzLm5nRm9ybS5jb250cm9sLCBudWxsKTtcbiAgICAgIGNvbnNvbGUubG9nKCdWYWxpZGF0aW9uIEVycm9yczogJywgZXJyb3JzKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG5cbiAgICB0aGlzLl9jb21wbGV0ZVN1Ym1pdChmYWxzZSwgbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckNhbkRlYWN0aXZhdGVHdWFyZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZyA9IGdldEFjdGl2ZVJvdXRlKHRoaXMuX3JvdXRlKS5yb3V0ZUNvbmZpZztcblxuICAgIGlmICghdGhpcy5fYWN0aXZhdGVkUm91dGVDb25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9mb3JtLnJlZ2lzdGVyRm9ybURpcmVjdGl2ZSh0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZy5jb21wb25lbnQsIHRoaXMpO1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUpKSB7XG4gICAgICB0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlID0gW107XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUuaW5kZXhPZihGb3JtRGVhY3RpdmF0ZUd1YXJkKSA9PSAtMSkge1xuICAgICAgdGhpcy5fYWN0aXZhdGVkUm91dGVDb25maWcuY2FuRGVhY3RpdmF0ZS5wdXNoKEZvcm1EZWFjdGl2YXRlR3VhcmQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NsZWFudXBDYW5EZWFjdGl2YXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fYWN0aXZhdGVkUm91dGVDb25maWcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGd1YXJkSW5kZXggPSB0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlLmluZGV4T2YoRm9ybURlYWN0aXZhdGVHdWFyZCk7XG4gICAgdGhpcy5fYWN0aXZhdGVkUm91dGVDb25maWcuY2FuRGVhY3RpdmF0ZS5zcGxpY2UoZ3VhcmRJbmRleCwgMSk7XG5cbiAgICB0aGlzLl9mb3JtLnJlbW92ZUZvcm1EaXJlY3RpdmUodGhpcy5fYWN0aXZhdGVkUm91dGVDb25maWcuY29tcG9uZW50KTtcbiAgfVxuXG59XG4iXX0=
|
|
711
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2RpcmVjdGl2ZXMvZm9ybS9mb3JtLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBSU4sUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEdBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFtQixNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsY0FBYyxFQUFTLE1BQU0saUJBQWlCLENBQUM7QUFFeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBVSxXQUFXLEVBQWdCLE1BQU0sd0JBQXdCLENBQUM7QUFFM0UsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU5QyxPQUFPLEVBQ0wsZUFBZSxFQUNmLEtBQUssRUFDTCxTQUFTLEVBQ1QsR0FBRyxFQUVILEVBQUUsRUFDRixPQUFPLEVBQ1AsVUFBVSxHQUNYLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUNMLFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLEtBQUssRUFDTCxHQUFHLEVBQ0gsS0FBSyxFQUNMLFFBQVEsRUFDUixTQUFTLEVBQ1QsU0FBUyxFQUNULElBQUksRUFDSixTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0s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LE1BQU07OzBCQVNiLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsWUFBWTs7MEJBRy9CLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsU0FBUzt5RUF2R3hCLGVBQWU7c0JBRHJCLEtBQUs7Z0JBSUMsZUFBZTtzQkFEckIsS0FBSztnQkFJQyxZQUFZO3NCQURsQixLQUFLO2dCQUlDLGFBQWE7c0JBRG5CLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxTQUFTO3NCQURmLEtBQUs7Z0JBSUMsT0FBTztzQkFEYixLQUFLO2dCQUlDLGFBQWE7c0JBRG5CLEtBQUs7Z0JBSUMsYUFBYTtzQkFEbkIsS0FBSztnQkFJQyxjQUFjO3NCQURwQixLQUFLO2dCQUlDLFdBQVc7c0JBRGpCLEtBQUs7Z0JBSUMsaUJBQWlCO3NCQUR2QixLQUFLO2dCQUlLLE1BQU07c0JBRGhCLEtBQUs7Z0JBTUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxVQUFVO3NCQURoQixLQUFLO2dCQUlDLFFBQVE7c0JBRGQsS0FBSztnQkFJQyxpQkFBaUI7c0JBRHZCLEtBQUs7Z0JBSUMsV0FBVztzQkFEakIsTUFBTTt1QkFBQyxRQUFRO2dCQUlULE9BQU87c0JBRGIsTUFBTTtnQkFJQSxLQUFLO3NCQURYLE1BQU07Z0JBSUEsU0FBUztzQkFEZixNQUFNO2dCQUlBLE9BQU87c0JBRGIsTUFBTTtnQkFJQSxPQUFPO3NCQURiLE1BQU07Z0JBSUEsV0FBVztzQkFEakIsV0FBVzt1QkFBQyxlQUFlO2dCQUlyQixlQUFlO3NCQURyQixlQUFlO3VCQUFDLDBCQUEwQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkFJMUQsVUFBVTtzQkFEakIsZUFBZTt1QkFBQyxXQUFXLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRUYWIsIE1hdFRhYkdyb3VwLCBNYXRUYWJIZWFkZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcblxuaW1wb3J0IHsgZ3VpZCB9IGZyb20gJ0BmaXJlc3RpdGNoL2NvbW1vbic7XG5pbXBvcnQgeyBEcmF3ZXJSZWYgfSBmcm9tICdAZmlyZXN0aXRjaC9kcmF3ZXInO1xuaW1wb3J0IHsgRnNNZXNzYWdlLCBNZXNzYWdlTW9kZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuXG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGRlZmVyLFxuICBmcm9tRXZlbnQsXG4gIGlpZixcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIFN1YmplY3QsXG4gIHRocm93RXJyb3IsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgY2F0Y2hFcnJvcixcbiAgZGVsYXksXG4gIGZpbHRlcixcbiAgZmlyc3QsXG4gIG1hcCxcbiAgbWFwVG8sXG4gIG1lcmdlTWFwLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YXAsXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgRm9ybURlYWN0aXZhdGVHdWFyZCB9IGZyb20gJy4uLy4uL2d1YXJkcy9mb3JtLWRlYWN0aXZhdGUuZ3VhcmQnO1xuaW1wb3J0IHsgY29uZmlybVJlc3VsdENvbnRpbnVlIH0gZnJvbSAnLi4vLi4vaGVscGVycy9jb25maXJtLXJlc3VsdC1jb250aW51ZSc7XG5pbXBvcnQgeyBjb25maXJtVW5zYXZlZCB9IGZyb20gJy4uLy4uL2hlbHBlcnMvY29uZmlybS11bnNhdmVkJztcbmltcG9ydCB7IGdldEFjdGl2ZVJvdXRlIH0gZnJvbSAnLi4vLi4vaGVscGVycy9nZXQtYWN0aXZlLXJvdXRlJztcbmltcG9ydCB7IGdldEZvcm1FcnJvcnMgfSBmcm9tICcuLi8uLi9oZWxwZXJzL2dldC1mb3JtLWVycm9ycyc7XG5pbXBvcnQgeyBGc0Zvcm0gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mc2Zvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBGc0J1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2J1dHRvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRnNGb3JtRGlhbG9nQ2xvc2VEaXJlY3RpdmUgfSBmcm9tICcuLi9mb3JtLWRpYWxvZy1jbG9zZS5kaXJlY3RpdmUnO1xuXG5pbXBvcnQgeyBDb25maXJtUmVzdWx0IH0gZnJvbSAnLi8uLi8uLi9lbnVtcy9jb25maXJtLXJlc3VsdCc7XG5pbXBvcnQgeyBGb3JtU3RhdHVzIH0gZnJvbSAnLi8uLi8uLi9lbnVtcy9mb3JtLXN0YXR1cyc7XG5pbXBvcnQgeyBDb25maXJtQ29uZmlnLCBDb25maXJtVGFiR3JvdXAsIFN1Ym1pdHRlZEV2ZW50IH0gZnJvbSAnLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFN1Ym1pdEV2ZW50IH0gZnJvbSAnLi8uLi8uLi9pbnRlcmZhY2VzL3N1Ym1pdC1ldmVudCc7XG5cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2ZzRm9ybV0nLFxufSlcbmV4cG9ydCBjbGFzcyBGc0Zvcm1EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgd3JhcHBlclNlbGVjdG9yID0gJy5mcy1mb3JtLXdyYXBwZXIsLm1hdC1mb3JtLWZpZWxkJztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgbWVzc2FnZVNlbGVjdG9yID0gJy5mcy1mb3JtLW1lc3NhZ2UsLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyJztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgaGludFNlbGVjdG9yID0gJy5mcy1mb3JtLWhpbnQsLm1hdC1mb3JtLWZpZWxkLWhpbnQtd3JhcHBlcic7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGxhYmVsU2VsZWN0b3IgPSAnLmZzLWZvcm0tbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWxhYmVsJztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgYXV0b2NvbXBsZXRlID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3J0Y3V0cyA9IHRydWU7IC8vIEN0cmwgKyBzXG5cbiAgQElucHV0KClcbiAgcHVibGljIGNvbmZpcm06IENvbmZpcm1Db25maWcgfCBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY29uZmlybURpYWxvZyA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGNvbmZpcm1EcmF3ZXIgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjb25maXJtQnJvd3NlciA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGNvbmZpcm1UYWJzID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZGlydHlTdWJtaXRCdXR0b24gPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc3VibWl0KHN1Ym1pdCQ6IChldmVudDogU3VibWl0RXZlbnQpID0+IE9ic2VydmFibGU8YW55Pikge1xuICAgIHRoaXMuX3N1Ym1pdCQgPSBzdWJtaXQkO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHN1Y2Nlc3NEZWxheSA9IDA7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGVycm9yRGVsYXkgPSAxMDAwO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0YWJHcm91cDogTWF0VGFiR3JvdXA7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGRlYWN0aXZhdGlvbkd1YXJkID0gdHJ1ZTtcblxuICBAT3V0cHV0KCdmc0Zvcm0nKVxuICBwdWJsaWMgc3VibWl0RXZlbnQ6IEV2ZW50RW1pdHRlcjxTdWJtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBpbnZhbGlkOiBFdmVudEVtaXR0ZXI8U3VibWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgdmFsaWQ6IEV2ZW50RW1pdHRlcjxTdWJtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzdWJtaXR0ZWQ6IEV2ZW50RW1pdHRlcjxTdWJtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZXNldGVkOiBFdmVudEVtaXR0ZXI8U3VibWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgY2xlYXJlZDogRXZlbnRFbWl0dGVyPFN1Ym1pdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZzLWZvcm0nKVxuICBwdWJsaWMgZnNGb3JtQ2xhc3MgPSB0cnVlO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oRnNGb3JtRGlhbG9nQ2xvc2VEaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgcHVibGljIGZvcm1EaWFsb2dDbG9zZTogUXVlcnlMaXN0PEZzRm9ybURpYWxvZ0Nsb3NlRGlyZWN0aXZlPjtcblxuICBAQ29udGVudENoaWxkcmVuKE1hdFRhYkdyb3VwLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIHByaXZhdGUgX3RhYkdyb3VwczogUXVlcnlMaXN0PE1hdFRhYkdyb3VwPiA9IG5ldyBRdWVyeUxpc3QoKTtcblxuICBwcml2YXRlIF9idXR0b25zID0gbmV3IFF1ZXJ5TGlzdDxGc0J1dHRvbkRpcmVjdGl2ZT4oKTtcbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDb250cm9sO1xuICBwcml2YXRlIF9hY3RpdmVTdWJtaXRCdXR0b246IEZzQnV0dG9uRGlyZWN0aXZlO1xuICBwcml2YXRlIF9kaWFsb2dCYWNrZHJvcEVzY2FwZSA9IGZhbHNlO1xuICBwcml2YXRlIF9zbmFwc2hvdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBwcml2YXRlIF9hY3RpdmF0ZWRSb3V0ZUNvbmZpZzogUm91dGUgfCBudWxsO1xuICBwcml2YXRlIF9zdGF0dXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdChGb3JtU3RhdHVzLlZhbGlkKTtcbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIF9jb25maXJtZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc3VibWl0JDogKGV2ZW50OiBTdWJtaXRFdmVudCkgPT4gT2JzZXJ2YWJsZTxhbnk+ID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE5nRm9ybSlcbiAgICBwdWJsaWMgbmdGb3JtOiBOZ0Zvcm0sXG4gICAgcHJpdmF0ZSBfZm9ybTogRnNGb3JtLFxuICAgIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfbWVzc2FnZTogRnNNZXNzYWdlLFxuICAgIHByaXZhdGUgX3Byb21wdDogRnNQcm9tcHQsXG4gICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBfY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChNYXREaWFsb2dSZWYpXG4gICAgcHJpdmF0ZSBfZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8YW55PixcblxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRHJhd2VyUmVmKVxuICAgIHByaXZhdGUgX2RyYXdlclJlZjogRHJhd2VyUmVmPGFueT4sXG5cbiAgICBwcml2YXRlIF9yb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICkgeyB9XG5cbiAgcHVibGljIGdldCBzdWJtaXR0aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0dXMkLmdldFZhbHVlKCkgPT09IEZvcm1TdGF0dXMuU3VibWl0dGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmFsaWRhdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdHVzJC5nZXRWYWx1ZSgpID09PSBGb3JtU3RhdHVzLlZhbGlkYXRpbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbXBsZXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cyQuZ2V0VmFsdWUoKSA9PT0gRm9ybVN0YXR1cy5Db21wbGV0aW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX3N1Ym1pdEV2ZW50KCk6IFN1Ym1pdEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdGb3JtOiB0aGlzLm5nRm9ybSxcbiAgICAgIHN1Ym1pdHRlcjogdGhpcy5fc3VibWl0dGVyLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldCBfZm9ybVZhbGlkU3RhdGUkKCk6IE9ic2VydmFibGU8U3VibWl0dGVkRXZlbnQ+IHtcbiAgICB0aGlzLl9mb3JtLmJyb2FkY2FzdCgndmFsaWQnLCB0aGlzLl9zdWJtaXRFdmVudCk7XG4gICAgdGhpcy5zdWJtaXRFdmVudC5lbWl0KHRoaXMuX3N1Ym1pdEV2ZW50KTtcbiAgICB0aGlzLnZhbGlkLmVtaXQodGhpcy5fc3VibWl0RXZlbnQpO1xuXG4gICAgY29uc3Qgc3VibWl0dGVkRXZlbnQ6IFN1Ym1pdHRlZEV2ZW50ID0ge1xuICAgICAgbmdGb3JtOiB0aGlzLm5nRm9ybSxcbiAgICAgIHN1Ym1pdHRlcjogdGhpcy5fc3VibWl0dGVyLFxuICAgICAgcmVzcG9uc2U6IG51bGwsXG4gICAgfTtcblxuICAgIGNvbnN0IHN1Ym1pdCQ6IE9ic2VydmFibGU8YW55PiA9IHRoaXMuX3N1Ym1pdCQgP1xuICAgICAgdGhpcy5fc3VibWl0JCh0aGlzLl9zdWJtaXRFdmVudCkgOiBvZihzdWJtaXR0ZWRFdmVudCk7XG5cbiAgICByZXR1cm4gc3VibWl0JFxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBzdWJtaXR0ZWRFdmVudC5yZXNwb25zZSA9IHJlc3BvbnNlO1xuXG4gICAgICAgICAgcmV0dXJuIHN1Ym1pdHRlZEV2ZW50O1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldCBfZm9ybUludmFsaWRTdGF0ZSQoKTogT2JzZXJ2YWJsZTxuZXZlcj4ge1xuICAgIHRoaXMuX2Zvcm0uYnJvYWRjYXN0KCdpbnZhbGlkJywgdGhpcy5fc3VibWl0RXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuaW52YWxpZCkge1xuICAgICAgdGhpcy5pbnZhbGlkLmVtaXQodGhpcy5fc3VibWl0RXZlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSAnUGxlYXNlIHJldmlldyBlcnJvcnMgaGlnaGxpZ2h0ZWQgaW4gcmVkJztcbiAgICB0aGlzLl9tZXNzYWdlLmVycm9yKG1lc3NhZ2UsIHsgbW9kZTogTWVzc2FnZU1vZGUuVG9hc3QgfSk7XG5cbiAgICBjb25zdCBlbCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcubmctaW52YWxpZCcpO1xuXG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhyb3dFcnJvcignRm9ybSB2YWxpZGF0aW9uIGVycm9yJyk7XG4gIH1cblxuICBwcml2YXRlIGdldCBfc3VibWl0dGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVN1Ym1pdEJ1dHRvblxuICAgICAgPyB0aGlzLl9hY3RpdmVTdWJtaXRCdXR0b24ubmFtZVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLmRlYWN0aXZhdGlvbkd1YXJkKSB7XG4gICAgICB0aGlzLl9yZWdpc3RlckNhbkRlYWN0aXZhdGVHdWFyZCgpO1xuICAgIH1cblxuICAgIHRoaXMuX3JlZ2lzdGVyQ29uZmlybURpYWxvZ0JhY2tkcm9wRXNjYXBlKCk7XG4gICAgdGhpcy5fbGlzdGVuSG90S2V5cygpO1xuICAgIHRoaXMuX2xpc3RlbldpbmRvd0Nsb3NlKCk7XG4gICAgdGhpcy5fbGlzdGVuU3VibWl0KCk7XG4gICAgdGhpcy5fbGlzdGVuRm9ybVN0YXR1cygpO1xuXG4gICAgaWYgKCF0aGlzLmF1dG9jb21wbGV0ZSkge1xuICAgICAgdGhpcy5fcmVnaXN0ZXJBdXRvY29tcGxldGUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmNvbmZpcm0pIHtcbiAgICAgIHRoaXMuX3VwZGF0ZURpcnR5U3VibWl0QnV0dG9ucygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzU3VibWl0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdWJtaXQkICE9PSBudWxsO1xuICB9XG5cbiAgcHVibGljIGNsZWFyU3VibWl0KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1Ym1pdCQgPSBudWxsO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlclN1Ym1pdChzdWJtaXQkOiBPYnNlcnZhYmxlPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJtaXQkID0gKCkgPT4gc3VibWl0JDtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3JlZ2lzdGVyQ29uZmlybSgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyQ29uZmlybURpYWxvZ0Nsb3NlKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJDb25maXJtRHJhd2VyQ2xvc2UoKTtcbiAgICB0aGlzLl9yZWdpc3RlckNvbmZpcm1UYWJzKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJEcmF3ZXJDbG9zZSgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyRGlydHlTdWJtaXRCdXR0b24oKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9jbGVhbnVwQ2FuRGVhY3RpdmF0ZSgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVNuYXBzaG90KCk6IHZvaWQge1xuICAgIHRoaXMuX3NuYXBzaG90ID0gdGhpcy5uZ0Zvcm0udmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U25hcHNob3QoKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHRoaXMuX3NuYXBzaG90IHx8IHt9O1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLnJlc2V0Rm9ybSgpO1xuXG4gICAgT2JqZWN0LmtleXModGhpcy5uZ0Zvcm0uY29udHJvbHMpXG4gICAgICAuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLm5nRm9ybS5jb250cm9sc1tuYW1lXTtcbiAgICAgICAgY29udHJvbC5yZXNldCh0aGlzLl9zbmFwc2hvdFtuYW1lXSk7XG4gICAgICB9KTtcblxuICAgIHRoaXMucmVzZXRlZC5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5uZ0Zvcm0ucmVzZXRGb3JtKCk7XG4gICAgdGhpcy5jbGVhcmVkLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXJ0eSgpOiB2b2lkIHtcbiAgICB0aGlzLm5nRm9ybS5mb3JtLm1hcmtBc0RpcnR5KCk7XG4gICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gIH1cblxuICBwdWJsaWMgdHJpZ2dlclN1Ym1pdChvcHRpb25zPzogeyBjb25maXJtZWQ6IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIHRoaXMuX2NvbmZpcm1lZCA9IG9wdGlvbnM/LmNvbmZpcm1lZDtcbiAgICB0aGlzLm5nRm9ybS5uZ1N1Ym1pdC5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgdHJpZ2dlckNvbmZpcm0oKTogT2JzZXJ2YWJsZTxDb25maXJtUmVzdWx0PiB7XG4gICAgY29uc3Qgc3VibWl0dGVkID0gdGhpcy5zdWJtaXR0aW5nID8gdGhpcy5zdWJtaXR0ZWQuYXNPYnNlcnZhYmxlKCkgOiBvZih7fSk7XG5cbiAgICByZXR1cm4gc3VibWl0dGVkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgbWVyZ2VNYXAoKCkgPT4gY29uZmlybVVuc2F2ZWQoW3RoaXNdLCB0aGlzLl9wcm9tcHQpKSxcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZW5hYmxlKCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLmNvbnRyb2wuZW5hYmxlKCk7XG5cbiAgICB0aGlzLl91cGRhdGVEaXJ0eVN1Ym1pdEJ1dHRvbnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLmNvbnRyb2wuZGlzYWJsZSgpO1xuXG4gICAgdGhpcy5fYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWRkQnV0dG9uKGJ1dHRvbjogRnNCdXR0b25EaXJlY3RpdmUpOiB2b2lkIHtcbiAgICB0aGlzLl9idXR0b25zLnJlc2V0KFxuICAgICAgW1xuICAgICAgICAuLi50aGlzLl9idXR0b25zLnRvQXJyYXkoKSxcbiAgICAgICAgYnV0dG9uLFxuICAgICAgXSk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQnV0dG9uKGJ1dHRvbjogRnNCdXR0b25EaXJlY3RpdmUpOiB2b2lkIHtcbiAgICB0aGlzLl9idXR0b25zLnJlc2V0KFxuICAgICAgW1xuICAgICAgICAuLi50aGlzLl9idXR0b25zLnRvQXJyYXkoKVxuICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IChidXR0b24gIT09IGl0ZW0pKSxcbiAgICAgIF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuU3VibWl0KCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtXG4gICAgICAubmdTdWJtaXRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pLFxuICAgICAgICBtYXAoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHsgZXZlbnQsIGNvbmZpcm1lZDogdGhpcy5fY29uZmlybWVkIH07XG4gICAgICAgIH0pLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fY29uZmlybWVkID0gZmFsc2UpLFxuICAgICAgICBmaWx0ZXIoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBbRm9ybVN0YXR1cy5WYWxpZCwgRm9ybVN0YXR1cy5JbnZhbGlkXVxuICAgICAgICAgICAgLmluY2x1ZGVzKHRoaXMuX3N0YXR1cyQuZ2V0VmFsdWUoKSk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fYnJvYWRjYXNWYWxpZGF0aW5nRXZlbnRzKCkpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy52YWxpZGF0ZSgpKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX2Jyb2FkY2FzdFN1Ym1pdHRpbmdFdmVudHMoKSksXG4gICAgICAgIHN3aXRjaE1hcCgoZGF0YSkgPT4gdGhpcy5fd2FpdFVudGlsU3RhdHVzUGVuZGluZygpXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBtYXBUbyhkYXRhKSxcbiAgICAgICAgICApKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX3NldHVwQWN0aXZlU3VibWl0QnV0dG9uKCkpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fZGlzYWJsZUJ1dHRvbnMoKSksXG4gICAgICAgIG1lcmdlTWFwKChkYXRhKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMubmdGb3JtLnN0YXR1cyA9PT0gJ0lOVkFMSUQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9ybUludmFsaWRTdGF0ZSQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1WYWxpZFN0YXRlJFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIG1hcCgoc3VibWl0RXZlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4uc3VibWl0RXZlbnQsXG4gICAgICAgICAgICAgICAgY29uZmlybWVkOiBkYXRhLmNvbmZpcm1lZCxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZSwgc291cmNlJCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yKGUpO1xuXG4gICAgICAgICAgcmV0dXJuIHNvdXJjZSQ7XG4gICAgICAgIH0pLFxuICAgICAgICB0YXAoKHN1Ym1pdHRlZEV2ZW50OiBTdWJtaXR0ZWRFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2NvbXBsZXRlU3VibWl0KHRydWUsIHN1Ym1pdHRlZEV2ZW50KTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHsgfSk7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoKTogdm9pZCB7XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLm5nRm9ybS5jb250cm9scylcbiAgICAgIC5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5Gb3JtU3RhdHVzKCk6IHZvaWQge1xuICAgIHRoaXMuX3N0YXR1cyRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoZm9ybVN0YXR1czogRm9ybVN0YXR1cykgPT4ge1xuICAgICAgICBjb25zdCBjbHMgPSBbRm9ybVN0YXR1cy5TdWJtaXR0aW5nLCBGb3JtU3RhdHVzLlZhbGlkYXRpbmddO1xuICAgICAgICBjb25zdCBjbGFzc0xpc3QgPSB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0O1xuICAgICAgICBjbGFzc0xpc3QucmVtb3ZlKC4uLmNscyk7XG4gICAgICAgIGlmIChjbHMuaW5kZXhPZihmb3JtU3RhdHVzKSAhPT0gLTEpIHtcbiAgICAgICAgICBjbGFzc0xpc3QuYWRkKGZvcm1TdGF0dXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuV2luZG93Q2xvc2UoKTogdm9pZCB7XG4gICAgZnJvbUV2ZW50KHdpbmRvdywgJ2JlZm9yZXVubG9hZCcpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb25maXJtICYmIHRoaXMuY29uZmlybUJyb3dzZXIgJiYgdGhpcy5uZ0Zvcm0uZGlydHkpIHtcbiAgICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RlbkhvdEtleXMoKTogdm9pZCB7XG4gICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGZyb21FdmVudChkb2N1bWVudCwgJ2tleWRvd24nKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX2RpYWxvZ0JhY2tkcm9wRXNjYXBlICYmIGV2ZW50LmNvZGUgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgICBjb25zdCBkaWFsb2cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLl9kaWFsb2dSZWYuaWQpO1xuICAgICAgICAgICAgY29uc3QgcGF0aHMgPSBldmVudC5jb21wb3NlZFBhdGgoKTtcblxuICAgICAgICAgICAgaWYgKHBhdGhzKSB7XG4gICAgICAgICAgICAgIHBhdGhzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGlhbG9nID09PSBpdGVtKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9ybUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiBldmVudC5jb2RlID09PSAnS2V5UycpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNob3J0Y3V0cykge1xuICAgICAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudEluRm9ybShkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHRoaXMubmdGb3JtLm5nU3VibWl0Lm5leHQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9mb3JtQ2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlybSAmJiB0aGlzLmNvbmZpcm1EaWFsb2cpIHtcbiAgICAgIHRoaXMudHJpZ2dlckNvbmZpcm0oKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKHJlc3VsdCkgPT4gY29uZmlybVJlc3VsdENvbnRpbnVlKHJlc3VsdCkpLFxuICAgICAgICAgIHN3aXRjaE1hcCgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID09PSBDb25maXJtUmVzdWx0LlByaXN0aW5lIHx8IHJlc3VsdCA9PT0gQ29uZmlybVJlc3VsdC5EaXNjYXJkXG4gICAgICAgICAgICAgID8gb2YobnVsbClcbiAgICAgICAgICAgICAgOiB0aGlzLnN1Ym1pdHRlZC5hc09ic2VydmFibGUoKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogU3VibWl0dGVkRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2UocmVzdWx0Py5yZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2UobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJEaWFsb2dDbG9zZShkaXJlY3RpdmU6IEZzRm9ybURpYWxvZ0Nsb3NlRGlyZWN0aXZlKTogdm9pZCB7XG4gICAgaWYgKCFkaXJlY3RpdmUucmVnaXN0ZXJlZCkge1xuICAgICAgZGlyZWN0aXZlLnJlZ2lzdGVyZWQgPSB0cnVlO1xuXG4gICAgICBkaXJlY3RpdmUuY2xpY2tlZCRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9mb3JtQ2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0QWN0aXZlU3VibWl0QnV0dG9uKCk6IEZzQnV0dG9uRGlyZWN0aXZlIHtcbiAgICBjb25zdCBzdWJtaXRCdXR0b25zID0gdGhpcy5fYnV0dG9uc1xuICAgICAgLmZpbHRlcigoYnV0dG9uKSA9PiBidXR0b24uc3VibWl0KTtcblxuICAgIGNvbnN0IGFjdGl2ZUJ1dHRvbiA9IHN1Ym1pdEJ1dHRvbnNcbiAgICAgIC5maW5kKChidXR0b24pID0+IHtcbiAgICAgICAgcmV0dXJuIGJ1dHRvbi5hY3RpdmU7XG4gICAgICB9KTtcblxuICAgIHJldHVybiBhY3RpdmVCdXR0b24gPyBhY3RpdmVCdXR0b24gOiBzdWJtaXRCdXR0b25zWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSBfZWxlbWVudEluRm9ybShlbDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChlbC5pc1NhbWVOb2RlKHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZWwucGFyZW50RWxlbWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRJbkZvcm0oZWwucGFyZW50RWxlbWVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tcGxldGVTdWJtaXQoc3VjY2Vzcywgc3VibWl0RXZlbnQ6IFN1Ym1pdHRlZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMubmdGb3JtLmNvbnRyb2wubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgIHRoaXMuY3JlYXRlU25hcHNob3QoKTtcbiAgICAgIHRoaXMuc3VibWl0dGVkLmVtaXQoc3VibWl0RXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZXNldEJ1dHRvbnMoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fYWN0aXZlU3VibWl0QnV0dG9uKSB7XG4gICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICB0aGlzLl9hY3RpdmVTdWJtaXRCdXR0b24uc3VjY2VzcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlU3VibWl0QnV0dG9uLmVycm9yKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuU3VibWl0dGVkKTtcblxuICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5TdWNjZXNzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuRXJyb3IpO1xuICAgIH1cblxuICAgIHRoaXMuX3N0YXR1cyQubmV4dChGb3JtU3RhdHVzLkNvbXBsZXRpbmcpO1xuXG4gICAgY29uc3QgcmVzZXREZWxheSA9IHN1Y2Nlc3MgPyB0aGlzLnN1Y2Nlc3NEZWxheSA6IHRoaXMuZXJyb3JEZWxheTtcblxuICAgIG9mKHRydWUpXG4gICAgICAucGlwZShcbiAgICAgICAgZGVsYXkocmVzZXREZWxheSksXG4gICAgICAgIGZpcnN0KCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm5nRm9ybS5mb3JtLnN0YXR1cyA9PT0gJ1ZBTElEJykge1xuICAgICAgICAgIHRoaXMuX3N0YXR1cyQubmV4dChGb3JtU3RhdHVzLlZhbGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5JbnZhbGlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Jlc2V0QnV0dG9ucygpO1xuICAgICAgICB0aGlzLl9yZXNldEFjdGl2ZUJ1dHRvbnMoKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc2V0QnV0dG9ucygpOiB2b2lkIHtcbiAgICB0aGlzLl9idXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgYnV0dG9uLnJlc2V0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZXNldEFjdGl2ZUJ1dHRvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5fYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgIGJ1dHRvbi5yZXNldEFjdGl2ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDb25maXJtKCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLmZvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGNoYW5nZXMpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlybSkge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gT2JqZWN0LmtleXModGhpcy5fc25hcHNob3QpO1xuXG4gICAgICAgICAgT2JqZWN0LmtleXMoY2hhbmdlcylcbiAgICAgICAgICAgIC5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nLmluZGV4T2YobmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc25hcHNob3RbbmFtZV0gPSBjaGFuZ2VzW25hbWVdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckRyYXdlckNsb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kcmF3ZXJSZWYpIHtcbiAgICAgIHRoaXMuX2RyYXdlclJlZi5jbG9zZVN0YXJ0JFxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKHN1YnNjcmliZXIpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5zdWJtaXR0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMkXG4gICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoc3RhdHVzKSA9PiBzdGF0dXMgPT09IEZvcm1TdGF0dXMuU3VjY2VzcyB8fCBzdGF0dXMgPT09IEZvcm1TdGF0dXMuRXJyb3IpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSgoc3RhdHVzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gRm9ybVN0YXR1cy5TdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCgpO1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDb25maXJtRHJhd2VyQ2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RyYXdlclJlZikge1xuICAgICAgdGhpcy5fZHJhd2VyUmVmLmNsb3NlU3RhcnQkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgoc3Vic2NyaWJlcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGlpZihcbiAgICAgICAgICAgICAgKCkgPT4gdGhpcy5jb25maXJtICYmIHRoaXMuY29uZmlybURyYXdlcixcbiAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ29uZmlybSgpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICBtYXAoKHJlc3VsdCkgPT4gY29uZmlybVJlc3VsdENvbnRpbnVlKHJlc3VsdCkpLFxuICAgICAgICAgICAgICAgICAgdGFwKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCgpO1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ29uZmlybVRhYnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGFiR3JvdXApIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJDb25maXJtVGFiR3JvdXAodGhpcy50YWJHcm91cCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWdpc3RlckNvbmZpcm1UYWJHcm91cHModGhpcy5fdGFiR3JvdXBzLnRvQXJyYXkoKSk7XG5cbiAgICB0aGlzLl90YWJHcm91cHMuY2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWdpc3RlckNvbmZpcm1UYWJHcm91cHModGhpcy5fdGFiR3JvdXBzLnRvQXJyYXkoKSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckNvbmZpcm1UYWJHcm91cHModGFiR3JvdXBzOiBNYXRUYWJHcm91cFtdKTogdm9pZCB7XG4gICAgdGFiR3JvdXBzLmZvckVhY2goKHRhYkdyb3VwOiBNYXRUYWJHcm91cCkgPT4ge1xuICAgICAgdGhpcy5yZWdpc3RlckNvbmZpcm1UYWJHcm91cCh0YWJHcm91cCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJDb25maXJtVGFiR3JvdXAodGFiR3JvdXA6IE1hdFRhYkdyb3VwKTogdm9pZCB7XG4gICAgY29uc3QgY29uZmlybVRhYkdyb3VwID0gdGFiR3JvdXAgYXMgQ29uZmlybVRhYkdyb3VwO1xuICAgIGlmICghY29uZmlybVRhYkdyb3VwLl9vcmlnaW5hbEhhbmRsZUNsaWNrKSB7XG4gICAgICBjb25maXJtVGFiR3JvdXAuX29yaWdpbmFsSGFuZGxlQ2xpY2sgPSB0YWJHcm91cC5faGFuZGxlQ2xpY2s7XG4gICAgICBjb25maXJtVGFiR3JvdXAuX2hhbmRsQ2xpY2skID0gbmV3IFN1YmplY3Q8eyB0YWI6IE1hdFRhYjsgdGFiSGVhZGVyOiBNYXRUYWJIZWFkZXI7IGlkeDogbnVtYmVyIH0+KCk7XG4gICAgICBjb25maXJtVGFiR3JvdXAuX2hhbmRsZUNsaWNrID0gKHRhYjogTWF0VGFiLCB0YWJIZWFkZXI6IE1hdFRhYkhlYWRlciwgaWR4OiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKGNvbmZpcm1UYWJHcm91cC5faGFuZGxDbGljayQub2JzZXJ2ZXJzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbmZpcm1UYWJHcm91cC5faGFuZGxDbGljayQubmV4dCh7IHRhYiwgdGFiSGVhZGVyLCBpZHggfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uZmlybVRhYkdyb3VwLl9vcmlnaW5hbEhhbmRsZUNsaWNrKHRhYiwgdGFiSGVhZGVyLCBpZHgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbmZpcm1UYWJHcm91cC5faGFuZGxDbGljayRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN1Ym1pdHRpbmcpIHtcbiAgICAgICAgICBpZiAodGhpcy5jb25maXJtICYmIHRoaXMuY29uZmlybVRhYnMpIHtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlckNvbmZpcm0oKVxuICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb25maXJtUmVzdWx0Q29udGludWUocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgY29uZmlybVRhYkdyb3VwLnNlbGVjdGVkSW5kZXggPSBldmVudC5pZHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlybVRhYkdyb3VwLl9vcmlnaW5hbEhhbmRsZUNsaWNrKGV2ZW50LnRhYiwgZXZlbnQudGFiSGVhZGVyLCBldmVudC5pZHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckNvbmZpcm1EaWFsb2dDbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZGlhbG9nUmVmKSB7XG4gICAgICB0aGlzLmZvcm1EaWFsb2dDbG9zZS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyRGlhbG9nQ2xvc2UoaXRlbSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5mb3JtRGlhbG9nQ2xvc2UuY2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKGUpID0+IHtcbiAgICAgICAgICBlLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyRGlhbG9nQ2xvc2UoaXRlbSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ29uZmlybURpYWxvZ0JhY2tkcm9wRXNjYXBlKCk6IHZvaWQge1xuICAgIHRoaXMuX2RpYWxvZ0JhY2tkcm9wRXNjYXBlID0gdGhpcy5fZGlhbG9nUmVmICYmICF0aGlzLl9kaWFsb2dSZWYuZGlzYWJsZUNsb3NlO1xuXG4gICAgaWYgKHRoaXMuX2RpYWxvZ1JlZiAmJiAhdGhpcy5fZGlhbG9nUmVmLmRpc2FibGVDbG9zZSkge1xuICAgICAgdGhpcy5fZGlhbG9nUmVmLmRpc2FibGVDbG9zZSA9IHRydWU7XG4gICAgICB0aGlzLl9kaWFsb2dSZWYuYmFja2Ryb3BDbGljaygpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZm9ybUNsb3NlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9kZXN0cm95JFxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWYuZGlzYWJsZUNsb3NlID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQXV0b2NvbXBsZXRlKCk6IHZvaWQge1xuICAgIHRoaXMuX3JlZ2lzdGVyQ29udHJvbCA9IHRoaXMubmdGb3JtLmZvcm0ucmVnaXN0ZXJDb250cm9sLmJpbmQodGhpcy5uZ0Zvcm0uZm9ybSk7XG5cbiAgICB0aGlzLm5nRm9ybS5mb3JtLnJlZ2lzdGVyQ29udHJvbCA9IChuYW1lOiBzdHJpbmcsIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuXG4gICAgICBjb25zdCBlbDogRWxlbWVudCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGBpbnB1dFtuYW1lPScke25hbWV9J11gKTtcblxuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnbmFtZScsIGAke25hbWV9XyR7Z3VpZCgpfWApO1xuXG4gICAgICAgIGlmICghZWwuZ2V0QXR0cmlidXRlKCdhdXRvY29tcGxldGUnKSkge1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJywgJ25vbmUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJDb250cm9sKG5hbWUsIGNvbnRyb2wpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckRpcnR5U3VibWl0QnV0dG9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5uZ0Zvcm0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm5nRm9ybS5mb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuX2J1dHRvbnMuY2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZURpcnR5U3VibWl0QnV0dG9ucygpOiB2b2lkIHtcbiAgICB0aGlzLl9idXR0b25zXG4gICAgICAuZmlsdGVyKChidXR0b24pID0+IGJ1dHRvbi5zdWJtaXQpXG4gICAgICAuZm9yRWFjaCgoc3VibWl0QnV0dG9uOiBGc0J1dHRvbkRpcmVjdGl2ZSkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlybSB8fCAhdGhpcy5kaXJ0eVN1Ym1pdEJ1dHRvbiB8fCB0aGlzLm5nRm9ybS5kaXJ0eSB8fCAhc3VibWl0QnV0dG9uLmRpcnR5U3VibWl0KSB7XG4gICAgICAgICAgc3VibWl0QnV0dG9uLmVuYWJsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1Ym1pdEJ1dHRvbi5kaXNhYmxlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnJvYWRjYXN0U3VibWl0dGluZ0V2ZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5TdWJtaXR0aW5nKTtcbiAgICB0aGlzLl9mb3JtLmJyb2FkY2FzdCgnc3VibWl0JywgdGhpcy5uZ0Zvcm0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnJvYWRjYXNWYWxpZGF0aW5nRXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMuX3N0YXR1cyQubmV4dChGb3JtU3RhdHVzLlZhbGlkYXRpbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0dXBBY3RpdmVTdWJtaXRCdXR0b24oKTogdm9pZCB7XG4gICAgdGhpcy5fYWN0aXZlU3VibWl0QnV0dG9uID0gdGhpcy5fZ2V0QWN0aXZlU3VibWl0QnV0dG9uKCk7XG4gICAgdGhpcy5fcmVzZXRCdXR0b25zKCk7XG5cbiAgICBpZiAodGhpcy5fYWN0aXZlU3VibWl0QnV0dG9uKSB7XG4gICAgICB0aGlzLl9hY3RpdmVTdWJtaXRCdXR0b24ucHJvY2VzcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2Rpc2FibGVCdXR0b25zKCk6IHZvaWQge1xuICAgIHRoaXMuX2J1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24uZGlzYWJsZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfd2FpdFVudGlsU3RhdHVzUGVuZGluZygpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm5nRm9ybS5zdGF0dXNDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKHRoaXMubmdGb3JtLnN0YXR1cyksXG4gICAgICAgIGZpcnN0KChzdGF0ZSkgPT4gc3RhdGUgIT09ICdQRU5ESU5HJyksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlRXJyb3IoZTogU3VibWl0dGVkRXZlbnQpIHtcbiAgICBjb25zb2xlLmxvZygnJWMgRm9ybSBTdWJtaXQgJywgJ2NvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogI0QzM0Y0OScsICdFcnJvciBvY2N1cmVkJyk7XG4gICAgY29uc29sZS5ncm91cCgnRXJyb3IgRGV0YWlsczonKTtcbiAgICBjb25zb2xlLmxvZygnTWVzc2FnZTogJywgZSk7XG4gICAgY29uc29sZS5sb2coJ0Zvcm1SZWY6ICcsIHRoaXMpO1xuXG4gICAgaWYgKHRoaXMubmdGb3JtLmludmFsaWQpIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IGdldEZvcm1FcnJvcnModGhpcy5uZ0Zvcm0uY29udHJvbCwgbnVsbCk7XG4gICAgICBjb25zb2xlLmxvZygnVmFsaWRhdGlvbiBFcnJvcnM6ICcsIGVycm9ycyk7XG4gICAgfVxuXG4gICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgIHRoaXMuX2NvbXBsZXRlU3VibWl0KGZhbHNlLCBudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ2FuRGVhY3RpdmF0ZUd1YXJkKCk6IHZvaWQge1xuICAgIHRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnID0gZ2V0QWN0aXZlUm91dGUodGhpcy5fcm91dGUpLnJvdXRlQ29uZmlnO1xuXG4gICAgaWYgKCF0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2Zvcm0ucmVnaXN0ZXJGb3JtRGlyZWN0aXZlKHRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnLmNvbXBvbmVudCwgdGhpcyk7XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5fYWN0aXZhdGVkUm91dGVDb25maWcuY2FuRGVhY3RpdmF0ZSkpIHtcbiAgICAgIHRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fYWN0aXZhdGVkUm91dGVDb25maWcuY2FuRGVhY3RpdmF0ZS5pbmRleE9mKEZvcm1EZWFjdGl2YXRlR3VhcmQpID09IC0xKSB7XG4gICAgICB0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlLnB1c2goRm9ybURlYWN0aXZhdGVHdWFyZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2xlYW51cENhbkRlYWN0aXZhdGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGd1YXJkSW5kZXggPSB0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlLmluZGV4T2YoRm9ybURlYWN0aXZhdGVHdWFyZCk7XG4gICAgdGhpcy5fYWN0aXZhdGVkUm91dGVDb25maWcuY2FuRGVhY3RpdmF0ZS5zcGxpY2UoZ3VhcmRJbmRleCwgMSk7XG5cbiAgICB0aGlzLl9mb3JtLnJlbW92ZUZvcm1EaXJlY3RpdmUodGhpcy5fYWN0aXZhdGVkUm91dGVDb25maWcuY29tcG9uZW50KTtcbiAgfVxuXG59XG4iXX0=
|
|
@@ -17,8 +17,8 @@ import { DrawerRef } from '@firestitch/drawer';
|
|
|
17
17
|
import * as i2 from '@firestitch/message';
|
|
18
18
|
import { MessageMode } from '@firestitch/message';
|
|
19
19
|
import * as i1 from '@firestitch/prompt';
|
|
20
|
-
import { Observable, Subject, of, BehaviorSubject,
|
|
21
|
-
import { first, filter, map, take, mergeMap, tap, switchMap, mapTo, catchError,
|
|
20
|
+
import { Observable, Subject, of, BehaviorSubject, throwError, fromEvent, iif, defer, from, isObservable } from 'rxjs';
|
|
21
|
+
import { first, filter, map, takeUntil, take, mergeMap, tap, switchMap, mapTo, catchError, delay, startWith } from 'rxjs/operators';
|
|
22
22
|
import { values, keys, isObject } from 'lodash-es';
|
|
23
23
|
import { isValid } from 'date-fns';
|
|
24
24
|
|
|
@@ -276,7 +276,6 @@ class FsFormDirective {
|
|
|
276
276
|
this.submitted = new EventEmitter();
|
|
277
277
|
this.reseted = new EventEmitter();
|
|
278
278
|
this.cleared = new EventEmitter();
|
|
279
|
-
this.submitRegistered = new EventEmitter();
|
|
280
279
|
this.fsFormClass = true;
|
|
281
280
|
this._tabGroups = new QueryList();
|
|
282
281
|
this._buttons = new QueryList();
|
|
@@ -285,6 +284,10 @@ class FsFormDirective {
|
|
|
285
284
|
this._status$ = new BehaviorSubject(FormStatus.Valid);
|
|
286
285
|
this._destroy$ = new Subject();
|
|
287
286
|
this._confirmed = false;
|
|
287
|
+
this._submit$ = null;
|
|
288
|
+
}
|
|
289
|
+
set submit(submit$) {
|
|
290
|
+
this._submit$ = submit$;
|
|
288
291
|
}
|
|
289
292
|
get submitting() {
|
|
290
293
|
return this._status$.getValue() === FormStatus.Submitting;
|
|
@@ -308,20 +311,15 @@ class FsFormDirective {
|
|
|
308
311
|
const submittedEvent = {
|
|
309
312
|
ngForm: this.ngForm,
|
|
310
313
|
submitter: this._submitter,
|
|
311
|
-
response: null
|
|
314
|
+
response: null,
|
|
312
315
|
};
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
const result = this.submit(this._submitEvent);
|
|
317
|
-
if (!isObservable(result)) {
|
|
318
|
-
return of(submittedEvent);
|
|
319
|
-
}
|
|
320
|
-
return result
|
|
316
|
+
const submit$ = this._submit$ ?
|
|
317
|
+
this._submit$(this._submitEvent) : of(submittedEvent);
|
|
318
|
+
return submit$
|
|
321
319
|
.pipe(map((response) => {
|
|
322
320
|
submittedEvent.response = response;
|
|
323
321
|
return submittedEvent;
|
|
324
|
-
}));
|
|
322
|
+
}), takeUntil(this._destroy$));
|
|
325
323
|
}
|
|
326
324
|
get _formInvalidState$() {
|
|
327
325
|
this._form.broadcast('invalid', this._submitEvent);
|
|
@@ -359,10 +357,20 @@ class FsFormDirective {
|
|
|
359
357
|
this._updateDirtySubmitButtons();
|
|
360
358
|
}
|
|
361
359
|
}
|
|
362
|
-
|
|
363
|
-
this.
|
|
364
|
-
|
|
365
|
-
|
|
360
|
+
get hasSubmit() {
|
|
361
|
+
return this._submit$ !== null;
|
|
362
|
+
}
|
|
363
|
+
clearSubmit() {
|
|
364
|
+
this._submit$ = null;
|
|
365
|
+
setTimeout(() => {
|
|
366
|
+
this._cdRef.markForCheck();
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
registerSubmit(submit$) {
|
|
370
|
+
this._submit$ = () => submit$;
|
|
371
|
+
setTimeout(() => {
|
|
372
|
+
this._cdRef.markForCheck();
|
|
373
|
+
});
|
|
366
374
|
}
|
|
367
375
|
ngAfterContentInit() {
|
|
368
376
|
this._registerConfirm();
|
|
@@ -494,7 +502,7 @@ class FsFormDirective {
|
|
|
494
502
|
const dialog = document.getElementById(this._dialogRef.id);
|
|
495
503
|
const paths = event.composedPath();
|
|
496
504
|
if (paths) {
|
|
497
|
-
paths.forEach(item => {
|
|
505
|
+
paths.forEach((item) => {
|
|
498
506
|
if (dialog === item) {
|
|
499
507
|
this._ngZone.run(() => {
|
|
500
508
|
this._formClose();
|
|
@@ -544,7 +552,7 @@ class FsFormDirective {
|
|
|
544
552
|
const submitButtons = this._buttons
|
|
545
553
|
.filter((button) => button.submit);
|
|
546
554
|
const activeButton = submitButtons
|
|
547
|
-
.find(button => {
|
|
555
|
+
.find((button) => {
|
|
548
556
|
return button.active;
|
|
549
557
|
});
|
|
550
558
|
return activeButton ? activeButton : submitButtons[0];
|
|
@@ -716,20 +724,20 @@ class FsFormDirective {
|
|
|
716
724
|
}
|
|
717
725
|
_registerConfirmDialogClose() {
|
|
718
726
|
if (this._dialogRef) {
|
|
719
|
-
this.formDialogClose.forEach(item => {
|
|
727
|
+
this.formDialogClose.forEach((item) => {
|
|
720
728
|
this._registerDialogClose(item);
|
|
721
729
|
});
|
|
722
730
|
this.formDialogClose.changes
|
|
723
731
|
.pipe(takeUntil(this._destroy$))
|
|
724
732
|
.subscribe((e) => {
|
|
725
|
-
e.forEach(item => {
|
|
733
|
+
e.forEach((item) => {
|
|
726
734
|
this._registerDialogClose(item);
|
|
727
735
|
});
|
|
728
736
|
});
|
|
729
737
|
}
|
|
730
738
|
}
|
|
731
739
|
_registerConfirmDialogBackdropEscape() {
|
|
732
|
-
this._dialogBackdropEscape = this._dialogRef && this._dialogRef.disableClose
|
|
740
|
+
this._dialogBackdropEscape = this._dialogRef && !this._dialogRef.disableClose;
|
|
733
741
|
if (this._dialogRef && !this._dialogRef.disableClose) {
|
|
734
742
|
this._dialogRef.disableClose = true;
|
|
735
743
|
this._dialogRef.backdropClick()
|
|
@@ -748,7 +756,7 @@ class FsFormDirective {
|
|
|
748
756
|
this.ngForm.form.registerControl = (name, control) => {
|
|
749
757
|
const el = this._element.nativeElement.querySelector(`input[name='${name}']`);
|
|
750
758
|
if (el) {
|
|
751
|
-
el.setAttribute('name', name
|
|
759
|
+
el.setAttribute('name', `${name}_${guid()}`);
|
|
752
760
|
if (!el.getAttribute('autocomplete')) {
|
|
753
761
|
el.setAttribute('autocomplete', 'none');
|
|
754
762
|
}
|
|
@@ -841,7 +849,7 @@ class FsFormDirective {
|
|
|
841
849
|
}
|
|
842
850
|
}
|
|
843
851
|
FsFormDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFormDirective, deps: [{ token: NgForm }, { token: FsForm }, { token: i0.ElementRef }, { token: i2.FsMessage }, { token: i1.FsPrompt }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: MatDialogRef, optional: true }, { token: DrawerRef, optional: true }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Directive });
|
|
844
|
-
FsFormDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.16", type: FsFormDirective, selector: "[fsForm]", inputs: { wrapperSelector: "wrapperSelector", messageSelector: "messageSelector", hintSelector: "hintSelector", labelSelector: "labelSelector", autocomplete: "autocomplete", shortcuts: "shortcuts", confirm: "confirm", confirmDialog: "confirmDialog", confirmDrawer: "confirmDrawer", confirmBrowser: "confirmBrowser", confirmTabs: "confirmTabs", dirtySubmitButton: "dirtySubmitButton", submit: "submit", successDelay: "successDelay", errorDelay: "errorDelay", tabGroup: "tabGroup", deactivationGuard: "deactivationGuard" }, outputs: { submitEvent: "fsForm", invalid: "invalid", valid: "valid", submitted: "submitted", reseted: "reseted", cleared: "cleared"
|
|
852
|
+
FsFormDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.16", type: FsFormDirective, selector: "[fsForm]", inputs: { wrapperSelector: "wrapperSelector", messageSelector: "messageSelector", hintSelector: "hintSelector", labelSelector: "labelSelector", autocomplete: "autocomplete", shortcuts: "shortcuts", confirm: "confirm", confirmDialog: "confirmDialog", confirmDrawer: "confirmDrawer", confirmBrowser: "confirmBrowser", confirmTabs: "confirmTabs", dirtySubmitButton: "dirtySubmitButton", submit: "submit", successDelay: "successDelay", errorDelay: "errorDelay", tabGroup: "tabGroup", deactivationGuard: "deactivationGuard" }, outputs: { submitEvent: "fsForm", invalid: "invalid", valid: "valid", submitted: "submitted", reseted: "reseted", cleared: "cleared" }, host: { properties: { "class.fs-form": "this.fsFormClass" } }, queries: [{ propertyName: "formDialogClose", predicate: FsFormDialogCloseDirective, descendants: true }, { propertyName: "_tabGroups", predicate: MatTabGroup, descendants: true }], usesOnChanges: true, ngImport: i0 });
|
|
845
853
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFormDirective, decorators: [{
|
|
846
854
|
type: Directive,
|
|
847
855
|
args: [{
|
|
@@ -907,8 +915,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
|
|
|
907
915
|
type: Output
|
|
908
916
|
}], cleared: [{
|
|
909
917
|
type: Output
|
|
910
|
-
}], submitRegistered: [{
|
|
911
|
-
type: Output
|
|
912
918
|
}], fsFormClass: [{
|
|
913
919
|
type: HostBinding,
|
|
914
920
|
args: ['class.fs-form']
|