@bizdoc/core 1.14.13 → 1.14.14

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.
@@ -1,8 +1,6 @@
1
- import { Output, ViewChild, ViewContainerRef } from '@angular/core';
2
- import { Component, Injector } from '@angular/core';
1
+ import { EventEmitter, Output, ViewChild, ViewContainerRef, Component, Injector } from '@angular/core';
3
2
  import { Subject, takeUntil } from 'rxjs';
4
3
  import { NodeRef } from './node-ref';
5
- import { EventEmitter } from '@angular/core';
6
4
  import { LayoutComponent } from '../../../core/layout/layout.component';
7
5
  import { cleanup } from '../../../core/functions';
8
6
  import * as i0 from "@angular/core";
@@ -15,8 +13,8 @@ import * as i6 from "@angular/material/form-field";
15
13
  import * as i7 from "@angular/material/select";
16
14
  import * as i8 from "@angular/material/core";
17
15
  import * as i9 from "@angular/material/button-toggle";
18
- import * as i10 from "@angular/common";
19
- import * as i11 from "@angular/flex-layout/flex";
16
+ import * as i10 from "@angular/flex-layout/flex";
17
+ import * as i11 from "@angular/common";
20
18
  import * as i12 from "@angular/material/input";
21
19
  import * as i13 from "../../../core/pipes/translate.pipe";
22
20
  export class WorkflowNodeComponent {
@@ -29,7 +27,7 @@ export class WorkflowNodeComponent {
29
27
  this._fb = _fb;
30
28
  this._pane = _pane;
31
29
  this.change = new EventEmitter();
32
- this.connectorInfo = this._fb.group({
30
+ this.connector = this._fb.group({
33
31
  action: '',
34
32
  case: ''
35
33
  });
@@ -39,29 +37,48 @@ export class WorkflowNodeComponent {
39
37
  ngOnInit() {
40
38
  this._pane.dataChange.subscribe(d => {
41
39
  this.nodes = d['nodes'];
40
+ this.diagram = d['diagram'];
42
41
  this.connectors = d['connectors'];
43
42
  this.tool = null;
44
43
  this._elementDestroy.next();
44
+ this.argumentstemplate.clear();
45
45
  if (this.connectors.length) {
46
- this.connectorInfo.valueChanges.pipe(takeUntil(this._elementDestroy)).subscribe(() => {
47
- this.connectors.forEach(c => {
48
- Object.assign(c.addInfo, this.connectorInfo.getRawValue());
49
- this.change.emit();
50
- });
51
- });
52
46
  const connector = this.connectors[0];
53
- this.connectors.forEach(c => { if (!c.addInfo)
54
- c.addInfo = {}; });
55
- const action = connector.addInfo.action, acase = connector.addInfo.case;
56
- this.connectorInfo.patchValue({
57
- action: this.connectors.length === 1 || this.connectors.every(c => c.addInfo.action === action) ? action : null,
58
- case: this.connectors.length === 1 || this.connectors.every(c => c.addInfo.case === acase) ? acase : null
59
- });
47
+ if (connector.addInfo) {
48
+ const action = connector.addInfo['action'], acase = connector.addInfo['case'];
49
+ this.connector.patchValue({
50
+ action: this.connectors.length === 1 || this.connectors.every(c => c.addInfo && c.addInfo['action'] === action) ? action : null,
51
+ case: this.connectors.length === 1 || this.connectors.every(c => c.addInfo && c.addInfo['case'] === acase) ? acase : null
52
+ });
53
+ }
60
54
  this._pane.title = this._translate.get(this.connectors.length === 1 ? 'Connector' : 'Connectors', this.connectors.length);
61
55
  this._pane.icon = 'link';
56
+ this.connector.valueChanges.pipe(takeUntil(this._elementDestroy)).subscribe(v => {
57
+ const content = v['case'] || v['action'];
58
+ this.connectors.forEach(c => {
59
+ if (!c.addInfo)
60
+ c.addInfo = this.connector.getRawValue();
61
+ else
62
+ Object.assign(c.addInfo, this.connector.getRawValue());
63
+ cleanup(c.addInfo);
64
+ if (!c.annotations.length)
65
+ c.annotations.push({
66
+ style: {
67
+ color: this._session.theme.dark ? 'white' : 'black',
68
+ fill: 'transparent',
69
+ opacity: .8,
70
+ },
71
+ content
72
+ });
73
+ else
74
+ c.annotations[0].content = content;
75
+ });
76
+ this.diagram.dataBind();
77
+ this.change.emit();
78
+ });
79
+ this.argumentstemplate.createEmbeddedView(this.connectorargs);
62
80
  }
63
- this.argumentstemplate.clear();
64
- if (this.nodes.length) {
81
+ else {
65
82
  const node = this.node = this.nodes[0], addInfo = node.addInfo;
66
83
  if (addInfo && addInfo.nodeType) {
67
84
  const nodeType = addInfo.nodeType;
@@ -69,10 +86,22 @@ export class WorkflowNodeComponent {
69
86
  this._pane.title = tool.title;
70
87
  const annotationArg = tool.arguments.find(a => a.diagram);
71
88
  function change(m) {
72
- if (annotationArg && m[annotationArg.name] !== null && m[annotationArg.name] !== undefined) {
73
- node.annotations[0].content = m[annotationArg.name];
89
+ if (annotationArg && m[annotationArg.name] !== null) {
90
+ if (node.annotations.length)
91
+ node.annotations[0].content = m[annotationArg.name] || null;
92
+ else
93
+ node.annotations.push({
94
+ style: {
95
+ color: this._session.theme.dark ? 'white' : 'black',
96
+ fill: 'transparent',
97
+ opacity: .8,
98
+ },
99
+ content: m[annotationArg.name] || null
100
+ });
74
101
  }
75
- Object.assign(addInfo, cleanup(m));
102
+ Object.assign(addInfo, m);
103
+ cleanup(addInfo);
104
+ this.diagram.dataBind();
76
105
  this.change.emit();
77
106
  }
78
107
  if (tool.template) {
@@ -105,8 +134,8 @@ export class WorkflowNodeComponent {
105
134
  instance.form.patchValue(node.addInfo, { emitEvent: false });
106
135
  return instance;
107
136
  }
108
- connectorCaseChange(acase) {
109
- this.connectorInfo.controls['case'].setValue(acase);
137
+ connectorCaseChange(evt) {
138
+ this.connector.controls['case'].setValue(evt.value);
110
139
  this.change.emit();
111
140
  }
112
141
  ngOnDestroy() {
@@ -115,14 +144,17 @@ export class WorkflowNodeComponent {
115
144
  }
116
145
  }
117
146
  WorkflowNodeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: WorkflowNodeComponent, deps: [{ token: i1.SessionService }, { token: i2.BizDocComponentFactoryResolver }, { token: i0.ComponentFactoryResolver }, { token: i0.Injector }, { token: i3.TranslateService }, { token: i4.FormBuilder }, { token: i5.PaneRef }], target: i0.ɵɵFactoryTarget.Component });
118
- WorkflowNodeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.9", type: WorkflowNodeComponent, selector: "ng-component", outputs: { change: "change" }, viewQueries: [{ propertyName: "argumentstemplate", first: true, predicate: ["arguments"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: "<ng-container #arguments>\r\n</ng-container>\r\n<form *ngIf=\"connectors?.length\" [formGroup]=\"connectorInfo\" fxLayout=\"column\" autocomplete=\"off\">\r\n <mat-form-field>\r\n <mat-select [placeholder]=\"'Action' | translate\" formControlName=\"action\">\r\n <mat-option *ngFor=\"let action of actions\" [value]=\"action.name\">{{action.title}}</mat-option>\r\n <mat-option>{{'None' | translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-button-toggle-group [value]=\"connectorInfo.controls['case'].value\" #acase=\"matButtonToggleGroup\" (change)=\"connectorCaseChange(acase.value)\">\r\n <mat-button-toggle value=\"true\">{{'True' | translate}}</mat-button-toggle>\r\n <mat-button-toggle value=\"false\">{{'False' | translate}}</mat-button-toggle>\r\n <mat-button-toggle>{{'Case' | translate}}</mat-button-toggle>\r\n </mat-button-toggle-group>\r\n <mat-form-field>\r\n <input matInput [placeholder]=\"'Case' | translate\" formControlName=\"case\" />\r\n </mat-form-field>\r\n</form>\r\n<!--<mat-expansion-panel fxLayout=\"column\" class=\"mat-elevation-z0\" [attr.aria-label]=\"'Design' | translate\" style=\"background: none\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>{{'Design'|translate}}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <ng-container *ngIf=\"connectors.length\">\r\n < mat.get-color-from-palette-picker (valueChanges)='strokeChange($event)' [label]=\"'Stroke'|translate\"></ mat.get-color-from-palette-picker>\r\n </ng-container>\r\n <ng-container *ngIf=\"nodes.length\">\r\n <ng-container *ngIf=\"nodes[0].annotations.length\">\r\n <mat-form-field>\r\n <input matInput type=\"number\" [placeholder]=\"'FontSize'|translate\" (change)=\"sizeChange($event.target.value)\" [value]=\"fontSize\" />\r\n </mat-form-field>\r\n < mat.get-color-from-palette-picker (valueChanges)='colorChange($event)' [label]=\"'Color'|translate\"></ mat.get-color-from-palette-picker>\r\n </ng-container>\r\n < mat.get-color-from-palette-picker (valueChanges)='bgChange($event)' [label]=\"'Background'|translate\"></ mat.get-color-from-palette-picker>\r\n < mat.get-color-from-palette-picker (valueChanges)='strokeChange($event)' [label]=\"'Stroke'|translate\"></ mat.get-color-from-palette-picker>\r\n </ng-container>\r\n</mat-expansion-panel>-->\r\n", styles: [":host{padding:8px;display:block}\n"], components: [{ type: i6.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i7.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i9.MatButtonToggle, selector: "mat-button-toggle", inputs: ["disableRipple", "aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "appearance", "checked", "disabled"], outputs: ["change"], exportAs: ["matButtonToggle"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i11.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }], pipes: { "translate": i13.TranslatePipe } });
147
+ WorkflowNodeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.9", type: WorkflowNodeComponent, selector: "ng-component", outputs: { change: "change" }, viewQueries: [{ propertyName: "argumentstemplate", first: true, predicate: ["arguments"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "connectorargs", first: true, predicate: ["connectorargs"], descendants: true, static: true }], ngImport: i0, template: "<ng-container #arguments>\r\n</ng-container>\r\n<ng-template #connectorargs>\r\n <form [formGroup]=\"connector\" fxLayout=\"column\" autocomplete=\"off\">\r\n <mat-form-field>\r\n <mat-select [placeholder]=\"'Action' | translate\" formControlName=\"action\">\r\n <mat-option *ngFor=\"let action of actions\" [value]=\"action.name\">{{action.title}}</mat-option>\r\n <mat-option>{{'None' | translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-button-toggle-group [value]=\"connector.controls['case'].value\" #acase=\"matButtonToggleGroup\" (change)=\"connectorCaseChange($event)\">\r\n <mat-button-toggle value=\"true\">{{'True' | translate}}</mat-button-toggle>\r\n <mat-button-toggle value=\"false\">{{'False' | translate}}</mat-button-toggle>\r\n <mat-button-toggle>{{'Case' | translate}}</mat-button-toggle>\r\n </mat-button-toggle-group>\r\n <mat-form-field [style.display]=\"connector.controls['case'].value==='true'||connector.controls['case'].value==='false'?'none':''\">\r\n <input matInput [placeholder]=\"'Case' | translate\" formControlName=\"case\" />\r\n </mat-form-field>\r\n </form>\r\n</ng-template>\r\n", styles: [":host{width:100%;padding:4px;display:block}\n"], components: [{ type: i6.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i7.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i9.MatButtonToggle, selector: "mat-button-toggle", inputs: ["disableRipple", "aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "appearance", "checked", "disabled"], outputs: ["change"], exportAs: ["matButtonToggle"] }], directives: [{ type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i10.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }], pipes: { "translate": i13.TranslatePipe } });
119
148
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: WorkflowNodeComponent, decorators: [{
120
149
  type: Component,
121
- args: [{ template: "<ng-container #arguments>\r\n</ng-container>\r\n<form *ngIf=\"connectors?.length\" [formGroup]=\"connectorInfo\" fxLayout=\"column\" autocomplete=\"off\">\r\n <mat-form-field>\r\n <mat-select [placeholder]=\"'Action' | translate\" formControlName=\"action\">\r\n <mat-option *ngFor=\"let action of actions\" [value]=\"action.name\">{{action.title}}</mat-option>\r\n <mat-option>{{'None' | translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-button-toggle-group [value]=\"connectorInfo.controls['case'].value\" #acase=\"matButtonToggleGroup\" (change)=\"connectorCaseChange(acase.value)\">\r\n <mat-button-toggle value=\"true\">{{'True' | translate}}</mat-button-toggle>\r\n <mat-button-toggle value=\"false\">{{'False' | translate}}</mat-button-toggle>\r\n <mat-button-toggle>{{'Case' | translate}}</mat-button-toggle>\r\n </mat-button-toggle-group>\r\n <mat-form-field>\r\n <input matInput [placeholder]=\"'Case' | translate\" formControlName=\"case\" />\r\n </mat-form-field>\r\n</form>\r\n<!--<mat-expansion-panel fxLayout=\"column\" class=\"mat-elevation-z0\" [attr.aria-label]=\"'Design' | translate\" style=\"background: none\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>{{'Design'|translate}}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <ng-container *ngIf=\"connectors.length\">\r\n < mat.get-color-from-palette-picker (valueChanges)='strokeChange($event)' [label]=\"'Stroke'|translate\"></ mat.get-color-from-palette-picker>\r\n </ng-container>\r\n <ng-container *ngIf=\"nodes.length\">\r\n <ng-container *ngIf=\"nodes[0].annotations.length\">\r\n <mat-form-field>\r\n <input matInput type=\"number\" [placeholder]=\"'FontSize'|translate\" (change)=\"sizeChange($event.target.value)\" [value]=\"fontSize\" />\r\n </mat-form-field>\r\n < mat.get-color-from-palette-picker (valueChanges)='colorChange($event)' [label]=\"'Color'|translate\"></ mat.get-color-from-palette-picker>\r\n </ng-container>\r\n < mat.get-color-from-palette-picker (valueChanges)='bgChange($event)' [label]=\"'Background'|translate\"></ mat.get-color-from-palette-picker>\r\n < mat.get-color-from-palette-picker (valueChanges)='strokeChange($event)' [label]=\"'Stroke'|translate\"></ mat.get-color-from-palette-picker>\r\n </ng-container>\r\n</mat-expansion-panel>-->\r\n", styles: [":host{padding:8px;display:block}\n"] }]
150
+ args: [{ template: "<ng-container #arguments>\r\n</ng-container>\r\n<ng-template #connectorargs>\r\n <form [formGroup]=\"connector\" fxLayout=\"column\" autocomplete=\"off\">\r\n <mat-form-field>\r\n <mat-select [placeholder]=\"'Action' | translate\" formControlName=\"action\">\r\n <mat-option *ngFor=\"let action of actions\" [value]=\"action.name\">{{action.title}}</mat-option>\r\n <mat-option>{{'None' | translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-button-toggle-group [value]=\"connector.controls['case'].value\" #acase=\"matButtonToggleGroup\" (change)=\"connectorCaseChange($event)\">\r\n <mat-button-toggle value=\"true\">{{'True' | translate}}</mat-button-toggle>\r\n <mat-button-toggle value=\"false\">{{'False' | translate}}</mat-button-toggle>\r\n <mat-button-toggle>{{'Case' | translate}}</mat-button-toggle>\r\n </mat-button-toggle-group>\r\n <mat-form-field [style.display]=\"connector.controls['case'].value==='true'||connector.controls['case'].value==='false'?'none':''\">\r\n <input matInput [placeholder]=\"'Case' | translate\" formControlName=\"case\" />\r\n </mat-form-field>\r\n </form>\r\n</ng-template>\r\n", styles: [":host{width:100%;padding:4px;display:block}\n"] }]
122
151
  }], ctorParameters: function () { return [{ type: i1.SessionService }, { type: i2.BizDocComponentFactoryResolver }, { type: i0.ComponentFactoryResolver }, { type: i0.Injector }, { type: i3.TranslateService }, { type: i4.FormBuilder }, { type: i5.PaneRef }]; }, propDecorators: { change: [{
123
152
  type: Output
124
153
  }], argumentstemplate: [{
125
154
  type: ViewChild,
126
155
  args: ['arguments', { static: true, read: ViewContainerRef }]
156
+ }], connectorargs: [{
157
+ type: ViewChild,
158
+ args: ['connectorargs', { static: true }]
127
159
  }] } });
128
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJpZXMvY29yZS9zcmMvbGliL2FkbWluL2Zvcm0vd29ya2Zsb3cvbm9kZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJpZXMvY29yZS9zcmMvbGliL2FkbWluL2Zvcm0vd29ya2Zsb3cvbm9kZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQStDLE1BQU0sRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakgsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFNMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVyQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUV4RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQU9sRCxNQUFNLE9BQ0UscUJBQXFCO0lBYTNCLFlBQ1UsUUFBd0IsRUFDeEIsZ0JBQWdELEVBQ2hELEdBQTZCLEVBQzdCLFNBQW1CLEVBQ25CLFVBQTRCLEVBQzVCLEdBQWdCLEVBQ2hCLEtBQXFDO1FBTnJDLGFBQVEsR0FBUixRQUFRLENBQWdCO1FBQ3hCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBZ0M7UUFDaEQsUUFBRyxHQUFILEdBQUcsQ0FBMEI7UUFDN0IsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUNuQixlQUFVLEdBQVYsVUFBVSxDQUFrQjtRQUM1QixRQUFHLEdBQUgsR0FBRyxDQUFhO1FBQ2hCLFVBQUssR0FB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ZFEscUJBQXFCO2tCQUw1QixTQUFTOzsrUkFNVyxNQUFNO3NCQUF4QixNQUFNO2dCQUMyRCxpQkFBaUI7c0JBQWxGLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29ubmVjdG9yTW9kZWwsIE5vZGVNb2RlbCB9IGZyb20gJ0BzeW5jZnVzaW9uL2VqMi1hbmd1bGFyLWRpYWdyYW1zJztcclxuaW1wb3J0IHsgQml6RG9jQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9jb21wb25lbnQtZmFjdG9yeS1yZXNvbHZlcic7XHJcbmltcG9ydCB7IEFjdGlvbiwgRmxvd05vZGUgfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscyc7XHJcbmltcG9ydCB7IFNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXNzaW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQYW5lUmVmIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zbG90cy9wYW5lLXJlZic7XHJcbmltcG9ydCB7IE5vZGVSZWYgfSBmcm9tICcuL25vZGUtcmVmJztcclxuaW1wb3J0IHsgQXJndW1lbnRzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9iYXNlJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IExheW91dENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbGF5b3V0L2xheW91dC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS90cmFuc2xhdGUuc2VydmljZSc7XHJcbmltcG9ydCB7IGNsZWFudXAgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2Z1bmN0aW9ucyc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgdGVtcGxhdGVVcmw6ICcuL25vZGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25vZGUuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0XHJcbiAgY2xhc3MgV29ya2Zsb3dOb2RlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBPdXRwdXQoKSByZWFkb25seSBjaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQFZpZXdDaGlsZCgnYXJndW1lbnRzJywgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgYXJndW1lbnRzdGVtcGxhdGU6IFZpZXdDb250YWluZXJSZWY7XHJcbiAgbm9kZXM6IE5vZGVNb2RlbFtdO1xyXG4gIGNvbm5lY3RvcnM6IENvbm5lY3Rvck1vZGVsW107XHJcbiAgcmVhZG9ubHkgY29ubmVjdG9ySW5mbyA9IHRoaXMuX2ZiLmdyb3VwKHtcclxuICAgIGFjdGlvbjogJycsXHJcbiAgICBjYXNlOiAnJ1xyXG4gIH0pO1xyXG4gIGFjdGlvbnM6IEFjdGlvbltdO1xyXG4gIHRvb2w/OiBGbG93Tm9kZTtcclxuICBwcml2YXRlIF9lbGVtZW50RGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgbm9kZTogTm9kZU1vZGVsO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfc2Vzc2lvbjogU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9mYWN0b3J5UmVzb2x2ZXI6IEJpekRvY0NvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgIHByaXZhdGUgX2NmOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICBwcml2YXRlIF90cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9mYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIF9wYW5lOiBQYW5lUmVmPFdvcmtmbG93Tm9kZUNvbXBvbmVudD4pIHtcclxuICAgIHRoaXMuYWN0aW9ucyA9IF9zZXNzaW9uLnByb2ZpbGUuYWN0aW9ucztcclxuICB9XHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wYW5lLmRhdGFDaGFuZ2Uuc3Vic2NyaWJlKGQgPT4ge1xyXG4gICAgICB0aGlzLm5vZGVzID0gZFsnbm9kZXMnXTtcclxuICAgICAgdGhpcy5jb25uZWN0b3JzID0gZFsnY29ubmVjdG9ycyddO1xyXG4gICAgICB0aGlzLnRvb2wgPSBudWxsO1xyXG5cclxuICAgICAgdGhpcy5fZWxlbWVudERlc3Ryb3kubmV4dCgpO1xyXG4gICAgICBpZiAodGhpcy5jb25uZWN0b3JzLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY29ubmVjdG9ySW5mby52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5fZWxlbWVudERlc3Ryb3kpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb25uZWN0b3JzLmZvckVhY2goYyA9PiB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYy5hZGRJbmZvLCB0aGlzLmNvbm5lY3RvckluZm8uZ2V0UmF3VmFsdWUoKSlcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2UuZW1pdCgpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgY29ubmVjdG9yID0gdGhpcy5jb25uZWN0b3JzWzBdO1xyXG4gICAgICAgIHRoaXMuY29ubmVjdG9ycy5mb3JFYWNoKGMgPT4geyBpZiAoIWMuYWRkSW5mbykgYy5hZGRJbmZvID0ge30gfSk7XHJcbiAgICAgICAgY29uc3QgYWN0aW9uID0gKGNvbm5lY3Rvci5hZGRJbmZvIGFzIGFueSkuYWN0aW9uLFxyXG4gICAgICAgICAgYWNhc2UgPSAoY29ubmVjdG9yLmFkZEluZm8gYXMgYW55KS5jYXNlO1xyXG4gICAgICAgIHRoaXMuY29ubmVjdG9ySW5mby5wYXRjaFZhbHVlKHtcclxuICAgICAgICAgIGFjdGlvbjogdGhpcy5jb25uZWN0b3JzLmxlbmd0aCA9PT0gMSB8fCB0aGlzLmNvbm5lY3RvcnMuZXZlcnkoYyA9PiAoYy5hZGRJbmZvIGFzIGFueSkuYWN0aW9uID09PSBhY3Rpb24pID8gYWN0aW9uIDogbnVsbCxcclxuICAgICAgICAgIGNhc2U6IHRoaXMuY29ubmVjdG9ycy5sZW5ndGggPT09IDEgfHwgdGhpcy5jb25uZWN0b3JzLmV2ZXJ5KGMgPT4gKGMuYWRkSW5mbyBhcyBhbnkpLmNhc2UgPT09IGFjYXNlKSA/IGFjYXNlIDogbnVsbFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX3BhbmUudGl0bGUgPSB0aGlzLl90cmFuc2xhdGUuZ2V0KHRoaXMuY29ubmVjdG9ycy5sZW5ndGggPT09IDEgPyAnQ29ubmVjdG9yJyA6ICdDb25uZWN0b3JzJywgdGhpcy5jb25uZWN0b3JzLmxlbmd0aCk7XHJcbiAgICAgICAgdGhpcy5fcGFuZS5pY29uID0gJ2xpbmsnO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYXJndW1lbnRzdGVtcGxhdGUuY2xlYXIoKTtcclxuICAgICAgaWYgKHRoaXMubm9kZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMubm9kZSA9IHRoaXMubm9kZXNbMF0sXHJcbiAgICAgICAgICBhZGRJbmZvID0gbm9kZS5hZGRJbmZvIGFzIGFueTtcclxuICAgICAgICBpZiAoYWRkSW5mbyAmJiBhZGRJbmZvLm5vZGVUeXBlKSB7XHJcbiAgICAgICAgICBjb25zdCBub2RlVHlwZSA9IGFkZEluZm8ubm9kZVR5cGU7XHJcbiAgICAgICAgICBjb25zdCB0b29sID0gdGhpcy50b29sID0gdGhpcy5fc2Vzc2lvbi5wcm9maWxlLm5vZGVzLmZpbmQobiA9PiBuLm5hbWUgPT09IG5vZGVUeXBlKTtcclxuICAgICAgICAgIHRoaXMuX3BhbmUudGl0bGUgPSB0b29sLnRpdGxlO1xyXG4gICAgICAgICAgY29uc3QgYW5ub3RhdGlvbkFyZyA9IHRvb2wuYXJndW1lbnRzLmZpbmQoYSA9PiBhLmRpYWdyYW0pO1xyXG5cclxuICAgICAgICAgIGZ1bmN0aW9uIGNoYW5nZShtKSB7XHJcbiAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uQXJnICYmIG1bYW5ub3RhdGlvbkFyZy5uYW1lXSAhPT0gbnVsbCAmJiBtW2Fubm90YXRpb25BcmcubmFtZV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgIG5vZGUuYW5ub3RhdGlvbnNbMF0uY29udGVudCA9IG1bYW5ub3RhdGlvbkFyZy5uYW1lXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGFkZEluZm8sIGNsZWFudXAobSkpO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRvb2wudGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5fY3JlYXRlVG9vbFRlbXBsYXRlKHRvb2wsIG5vZGUpO1xyXG5cclxuICAgICAgICAgICAgaW5zdGFuY2UuZm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKGNoYW5nZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKHRvb2wuYXJndW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLl9jcmVhdGVMYXlvdXRBcmd1bWVudHModG9vbCwgbm9kZSk7XHJcblxyXG4gICAgICAgICAgICBpbnN0YW5jZS5tb2RlbENoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl9lbGVtZW50RGVzdHJveSkpLnN1YnNjcmliZShjaGFuZ2UuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfY3JlYXRlTGF5b3V0QXJndW1lbnRzKHRvb2w6IEZsb3dOb2RlLCBub2RlOiBOb2RlTW9kZWwpIHtcclxuICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLl9jZi5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShMYXlvdXRDb21wb25lbnQpO1xyXG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5hcmd1bWVudHN0ZW1wbGF0ZS5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSwgMCwgdGhpcy5faW5qZWN0b3IpO1xyXG4gICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgTGF5b3V0Q29tcG9uZW50O1xyXG4gICAgaW5zdGFuY2UuZmllbGRzID0gdG9vbC5hcmd1bWVudHM7XHJcbiAgICBpbnN0YW5jZS5tb2RlbCA9IG5vZGUuYWRkSW5mbztcclxuICAgIGluc3RhbmNlLmNyZWF0ZSgpO1xyXG4gICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gIH1cclxuICBwcml2YXRlIF9jcmVhdGVUb29sVGVtcGxhdGUodG9vbDogRmxvd05vZGUsIG5vZGU6IE5vZGVNb2RlbCkge1xyXG4gICAgY29uc3QgY29tcG9uZW50RmFjdG9yeSA9IHRoaXMuX2ZhY3RvcnlSZXNvbHZlci5yZXNvbHZlKHRoaXMudG9vbC50ZW1wbGF0ZSk7XHJcbiAgICBjb25zdCBub2RlUmVmID0gbmV3IE5vZGVSZWYodG9vbCk7XHJcbiAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZShbeyBwcm92aWRlOiBOb2RlUmVmLCB1c2VWYWx1ZTogbm9kZVJlZiB9XSwgdGhpcy5faW5qZWN0b3IpO1xyXG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5hcmd1bWVudHN0ZW1wbGF0ZS5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSwgMCwgaW5qZWN0b3IpO1xyXG4gICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgQXJndW1lbnRzQ29tcG9uZW50PGFueT47XHJcbiAgICBpbnN0YW5jZS5mb3JtLnBhdGNoVmFsdWUobm9kZS5hZGRJbmZvLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICByZXR1cm4gaW5zdGFuY2U7XHJcbiAgfVxyXG4gIGNvbm5lY3RvckNhc2VDaGFuZ2UoYWNhc2U/OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY29ubmVjdG9ySW5mby5jb250cm9sc1snY2FzZSddLnNldFZhbHVlKGFjYXNlKTtcclxuICAgIHRoaXMuY2hhbmdlLmVtaXQoKTtcclxuICB9XHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9lbGVtZW50RGVzdHJveS5uZXh0KCk7XHJcbiAgICB0aGlzLl9lbGVtZW50RGVzdHJveS5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8bmctY29udGFpbmVyICNhcmd1bWVudHM+XHJcbjwvbmctY29udGFpbmVyPlxyXG48Zm9ybSAqbmdJZj1cImNvbm5lY3RvcnM/Lmxlbmd0aFwiIFtmb3JtR3JvdXBdPVwiY29ubmVjdG9ySW5mb1wiIGZ4TGF5b3V0PVwiY29sdW1uXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XHJcbiAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgPG1hdC1zZWxlY3QgW3BsYWNlaG9sZGVyXT1cIidBY3Rpb24nIHwgdHJhbnNsYXRlXCIgZm9ybUNvbnRyb2xOYW1lPVwiYWN0aW9uXCI+XHJcbiAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgYWN0aW9uc1wiIFt2YWx1ZV09XCJhY3Rpb24ubmFtZVwiPnt7YWN0aW9uLnRpdGxlfX08L21hdC1vcHRpb24+XHJcbiAgICAgIDxtYXQtb3B0aW9uPnt7J05vbmUnIHwgdHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICA8L21hdC1zZWxlY3Q+XHJcbiAgPC9tYXQtZm9ybS1maWVsZD5cclxuICA8bWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAgW3ZhbHVlXT1cImNvbm5lY3RvckluZm8uY29udHJvbHNbJ2Nhc2UnXS52YWx1ZVwiICNhY2FzZT1cIm1hdEJ1dHRvblRvZ2dsZUdyb3VwXCIgKGNoYW5nZSk9XCJjb25uZWN0b3JDYXNlQ2hhbmdlKGFjYXNlLnZhbHVlKVwiPlxyXG4gICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVwidHJ1ZVwiPnt7J1RydWUnIHwgdHJhbnNsYXRlfX08L21hdC1idXR0b24tdG9nZ2xlPlxyXG4gICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVwiZmFsc2VcIj57eydGYWxzZScgfCB0cmFuc2xhdGV9fTwvbWF0LWJ1dHRvbi10b2dnbGU+XHJcbiAgICA8bWF0LWJ1dHRvbi10b2dnbGU+e3snQ2FzZScgfCB0cmFuc2xhdGV9fTwvbWF0LWJ1dHRvbi10b2dnbGU+XHJcbiAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cclxuICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8aW5wdXQgbWF0SW5wdXQgW3BsYWNlaG9sZGVyXT1cIidDYXNlJyB8IHRyYW5zbGF0ZVwiIGZvcm1Db250cm9sTmFtZT1cImNhc2VcIiAvPlxyXG4gIDwvbWF0LWZvcm0tZmllbGQ+XHJcbjwvZm9ybT5cclxuPCEtLTxtYXQtZXhwYW5zaW9uLXBhbmVsIGZ4TGF5b3V0PVwiY29sdW1uXCIgY2xhc3M9XCJtYXQtZWxldmF0aW9uLXowXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInRGVzaWduJyB8IHRyYW5zbGF0ZVwiIHN0eWxlPVwiYmFja2dyb3VuZDogbm9uZVwiPlxyXG4gIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgIDxtYXQtcGFuZWwtdGl0bGU+e3snRGVzaWduJ3x0cmFuc2xhdGV9fTwvbWF0LXBhbmVsLXRpdGxlPlxyXG4gIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbm5lY3RvcnMubGVuZ3RoXCI+XHJcbiAgICA8IG1hdC5nZXQtY29sb3ItZnJvbS1wYWxldHRlLXBpY2tlciAodmFsdWVDaGFuZ2VzKT0nc3Ryb2tlQ2hhbmdlKCRldmVudCknIFtsYWJlbF09XCInU3Ryb2tlJ3x0cmFuc2xhdGVcIj48LyBtYXQuZ2V0LWNvbG9yLWZyb20tcGFsZXR0ZS1waWNrZXI+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vZGVzLmxlbmd0aFwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vZGVzWzBdLmFubm90YXRpb25zLmxlbmd0aFwiPlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJudW1iZXJcIiBbcGxhY2Vob2xkZXJdPVwiJ0ZvbnRTaXplJ3x0cmFuc2xhdGVcIiAoY2hhbmdlKT1cInNpemVDaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSlcIiBbdmFsdWVdPVwiZm9udFNpemVcIiAvPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8IG1hdC5nZXQtY29sb3ItZnJvbS1wYWxldHRlLXBpY2tlciAodmFsdWVDaGFuZ2VzKT0nY29sb3JDaGFuZ2UoJGV2ZW50KScgW2xhYmVsXT1cIidDb2xvcid8dHJhbnNsYXRlXCI+PC8gbWF0LmdldC1jb2xvci1mcm9tLXBhbGV0dGUtcGlja2VyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8IG1hdC5nZXQtY29sb3ItZnJvbS1wYWxldHRlLXBpY2tlciAodmFsdWVDaGFuZ2VzKT0nYmdDaGFuZ2UoJGV2ZW50KScgW2xhYmVsXT1cIidCYWNrZ3JvdW5kJ3x0cmFuc2xhdGVcIj48LyBtYXQuZ2V0LWNvbG9yLWZyb20tcGFsZXR0ZS1waWNrZXI+XHJcbiAgICA8IG1hdC5nZXQtY29sb3ItZnJvbS1wYWxldHRlLXBpY2tlciAodmFsdWVDaGFuZ2VzKT0nc3Ryb2tlQ2hhbmdlKCRldmVudCknIFtsYWJlbF09XCInU3Ryb2tlJ3x0cmFuc2xhdGVcIj48LyBtYXQuZ2V0LWNvbG9yLWZyb20tcGFsZXR0ZS1waWNrZXI+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvbWF0LWV4cGFuc2lvbi1wYW5lbD4tLT5cclxuIl19
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJpZXMvY29yZS9zcmMvbGliL2FkbWluL2Zvcm0vd29ya2Zsb3cvbm9kZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJpZXMvY29yZS9zcmMvbGliL2FkbWluL2Zvcm0vd29ya2Zsb3cvbm9kZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRCLFlBQVksRUFBcUIsTUFBTSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBZSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR2pLLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTTFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFckMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXhFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBTWxELE1BQU0sT0FDRSxxQkFBcUI7SUFlM0IsWUFDVSxRQUF3QixFQUN4QixnQkFBZ0QsRUFDaEQsR0FBNkIsRUFDN0IsU0FBbUIsRUFDbkIsVUFBNEIsRUFDNUIsR0FBZ0IsRUFDaEIsS0FBcUM7UUFOckMsYUFBUSxHQUFSLFFBQVEsQ0FBZ0I7UUFDeEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFnQztRQUNoRCxRQUFHLEdBQUgsR0FBRyxDQUEwQjtRQUM3QixjQUFTLEdBQVQsU0FBUyxDQUFVO1FBQ25CLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQzVCLFFBQUcsR0FBSCxHQUFHLENBQWE7UUFDaEIsVUFBSyxHQUFMLEtBQUssQ0FBZ0M7UUFyQjVCLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBTXRDLGNBQVMs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QVEscUJBQXFCO2tCQUw1QixTQUFTOzsrUkFNVyxNQUFNO3NCQUF4QixNQUFNO2dCQUMyRCxpQkFBaUI7c0JBQWxGLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ2xCLGFBQWE7c0JBQTFELFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgRXZlbnRFbWl0dGVyLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIFRlbXBsYXRlUmVmLCBDb21wb25lbnQsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Ub2dnbGVDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24tdG9nZ2xlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENvbm5lY3Rvck1vZGVsLCBEaWFncmFtLCBOb2RlTW9kZWwgfSBmcm9tICdAc3luY2Z1c2lvbi9lajItYW5ndWxhci1kaWFncmFtcyc7XHJcbmltcG9ydCB7IEJpekRvY0NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciB9IGZyb20gJy4uLy4uLy4uL2NvcmUvY29tcG9uZW50LWZhY3RvcnktcmVzb2x2ZXInO1xyXG5pbXBvcnQgeyBBY3Rpb24sIEZsb3dOb2RlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMnO1xyXG5pbXBvcnQgeyBTZXNzaW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2Vzc2lvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUGFuZVJlZiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2xvdHMvcGFuZS1yZWYnO1xyXG5pbXBvcnQgeyBOb2RlUmVmIH0gZnJvbSAnLi9ub2RlLXJlZic7XHJcbmltcG9ydCB7IEFyZ3VtZW50c0NvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvYmFzZSc7XHJcbmltcG9ydCB7IExheW91dENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbGF5b3V0L2xheW91dC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS90cmFuc2xhdGUuc2VydmljZSc7XHJcbmltcG9ydCB7IGNsZWFudXAgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2Z1bmN0aW9ucyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICB0ZW1wbGF0ZVVybDogJy4vbm9kZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbm9kZS5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnRcclxuICBjbGFzcyBXb3JrZmxvd05vZGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAVmlld0NoaWxkKCdhcmd1bWVudHMnLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSBhcmd1bWVudHN0ZW1wbGF0ZTogVmlld0NvbnRhaW5lclJlZjtcclxuICBAVmlld0NoaWxkKCdjb25uZWN0b3JhcmdzJywgeyBzdGF0aWM6IHRydWUgfSkgY29ubmVjdG9yYXJnczogVGVtcGxhdGVSZWY8YW55PjtcclxuICBub2RlczogTm9kZU1vZGVsW107XHJcbiAgY29ubmVjdG9yczogQ29ubmVjdG9yTW9kZWxbXTtcclxuICBkaWFncmFtOiBEaWFncmFtO1xyXG4gIHJlYWRvbmx5IGNvbm5lY3RvciA9IHRoaXMuX2ZiLmdyb3VwKHtcclxuICAgIGFjdGlvbjogJycsXHJcbiAgICBjYXNlOiAnJ1xyXG4gIH0pO1xyXG4gIGFjdGlvbnM6IEFjdGlvbltdO1xyXG4gIHRvb2w/OiBGbG93Tm9kZTtcclxuICBub2RlOiBOb2RlTW9kZWw7XHJcbiAgcHJpdmF0ZSBfZWxlbWVudERlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfc2Vzc2lvbjogU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9mYWN0b3J5UmVzb2x2ZXI6IEJpekRvY0NvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgIHByaXZhdGUgX2NmOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICBwcml2YXRlIF90cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9mYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIF9wYW5lOiBQYW5lUmVmPFdvcmtmbG93Tm9kZUNvbXBvbmVudD4pIHtcclxuICAgIHRoaXMuYWN0aW9ucyA9IF9zZXNzaW9uLnByb2ZpbGUuYWN0aW9ucztcclxuICB9XHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wYW5lLmRhdGFDaGFuZ2Uuc3Vic2NyaWJlKGQgPT4ge1xyXG4gICAgICB0aGlzLm5vZGVzID0gZFsnbm9kZXMnXTtcclxuICAgICAgdGhpcy5kaWFncmFtID0gZFsnZGlhZ3JhbSddO1xyXG4gICAgICB0aGlzLmNvbm5lY3RvcnMgPSBkWydjb25uZWN0b3JzJ107XHJcbiAgICAgIHRoaXMudG9vbCA9IG51bGw7XHJcblxyXG4gICAgICB0aGlzLl9lbGVtZW50RGVzdHJveS5uZXh0KCk7XHJcbiAgICAgIHRoaXMuYXJndW1lbnRzdGVtcGxhdGUuY2xlYXIoKTtcclxuICAgICAgaWYgKHRoaXMuY29ubmVjdG9ycy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBjb25uZWN0b3IgPSB0aGlzLmNvbm5lY3RvcnNbMF07XHJcbiAgICAgICAgaWYgKGNvbm5lY3Rvci5hZGRJbmZvKSB7XHJcbiAgICAgICAgICBjb25zdCBhY3Rpb24gPSBjb25uZWN0b3IuYWRkSW5mb1snYWN0aW9uJ10sIGFjYXNlID0gY29ubmVjdG9yLmFkZEluZm9bJ2Nhc2UnXTtcclxuICAgICAgICAgIHRoaXMuY29ubmVjdG9yLnBhdGNoVmFsdWUoe1xyXG4gICAgICAgICAgICBhY3Rpb246IHRoaXMuY29ubmVjdG9ycy5sZW5ndGggPT09IDEgfHwgdGhpcy5jb25uZWN0b3JzLmV2ZXJ5KGMgPT4gYy5hZGRJbmZvICYmIGMuYWRkSW5mb1snYWN0aW9uJ10gPT09IGFjdGlvbikgPyBhY3Rpb24gOiBudWxsLFxyXG4gICAgICAgICAgICBjYXNlOiB0aGlzLmNvbm5lY3RvcnMubGVuZ3RoID09PSAxIHx8IHRoaXMuY29ubmVjdG9ycy5ldmVyeShjID0+IGMuYWRkSW5mbyAmJiBjLmFkZEluZm9bJ2Nhc2UnXSA9PT0gYWNhc2UpID8gYWNhc2UgOiBudWxsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcGFuZS50aXRsZSA9IHRoaXMuX3RyYW5zbGF0ZS5nZXQodGhpcy5jb25uZWN0b3JzLmxlbmd0aCA9PT0gMSA/ICdDb25uZWN0b3InIDogJ0Nvbm5lY3RvcnMnLCB0aGlzLmNvbm5lY3RvcnMubGVuZ3RoKTtcclxuICAgICAgICB0aGlzLl9wYW5lLmljb24gPSAnbGluayc7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0b3IudmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuX2VsZW1lbnREZXN0cm95KSkuc3Vic2NyaWJlKHYgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY29udGVudCA9IHZbJ2Nhc2UnXSB8fCB2WydhY3Rpb24nXTtcclxuICAgICAgICAgIHRoaXMuY29ubmVjdG9ycy5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWMuYWRkSW5mbylcclxuICAgICAgICAgICAgICBjLmFkZEluZm8gPSB0aGlzLmNvbm5lY3Rvci5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjLmFkZEluZm8sIHRoaXMuY29ubmVjdG9yLmdldFJhd1ZhbHVlKCkpO1xyXG4gICAgICAgICAgICBjbGVhbnVwKGMuYWRkSW5mbyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWMuYW5ub3RhdGlvbnMubGVuZ3RoKVxyXG4gICAgICAgICAgICAgIGMuYW5ub3RhdGlvbnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICBjb2xvcjogdGhpcy5fc2Vzc2lvbi50aGVtZS5kYXJrID8gJ3doaXRlJyA6ICdibGFjaycsXHJcbiAgICAgICAgICAgICAgICAgIGZpbGw6ICd0cmFuc3BhcmVudCcsXHJcbiAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IC44LFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZWxzZSBjLmFubm90YXRpb25zWzBdLmNvbnRlbnQgPSBjb250ZW50O1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLmRpYWdyYW0uZGF0YUJpbmQoKTtcclxuICAgICAgICAgIHRoaXMuY2hhbmdlLmVtaXQoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmFyZ3VtZW50c3RlbXBsYXRlLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLmNvbm5lY3RvcmFyZ3MpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGUgPSB0aGlzLm5vZGVzWzBdLFxyXG4gICAgICAgICAgYWRkSW5mbyA9IG5vZGUuYWRkSW5mbyBhcyBhbnk7XHJcbiAgICAgICAgaWYgKGFkZEluZm8gJiYgYWRkSW5mby5ub2RlVHlwZSkge1xyXG4gICAgICAgICAgY29uc3Qgbm9kZVR5cGUgPSBhZGRJbmZvLm5vZGVUeXBlO1xyXG4gICAgICAgICAgY29uc3QgdG9vbCA9IHRoaXMudG9vbCA9IHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5ub2Rlcy5maW5kKG4gPT4gbi5uYW1lID09PSBub2RlVHlwZSk7XHJcbiAgICAgICAgICB0aGlzLl9wYW5lLnRpdGxlID0gdG9vbC50aXRsZTtcclxuICAgICAgICAgIGNvbnN0IGFubm90YXRpb25BcmcgPSB0b29sLmFyZ3VtZW50cy5maW5kKGEgPT4gYS5kaWFncmFtKTtcclxuXHJcbiAgICAgICAgICBmdW5jdGlvbiBjaGFuZ2UobSkge1xyXG4gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbkFyZyAmJiBtW2Fubm90YXRpb25BcmcubmFtZV0gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICBpZiAobm9kZS5hbm5vdGF0aW9ucy5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgICBub2RlLmFubm90YXRpb25zWzBdLmNvbnRlbnQgPSBtW2Fubm90YXRpb25BcmcubmFtZV0gfHwgbnVsbDtcclxuICAgICAgICAgICAgICBlbHNlIFxyXG4gICAgICAgICAgICAgICAgbm9kZS5hbm5vdGF0aW9ucy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogdGhpcy5fc2Vzc2lvbi50aGVtZS5kYXJrID8gJ3doaXRlJyA6ICdibGFjaycsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbDogJ3RyYW5zcGFyZW50JyxcclxuICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAuOCxcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgY29udGVudDogbVthbm5vdGF0aW9uQXJnLm5hbWVdIHx8IG51bGxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYWRkSW5mbywgbSk7XHJcbiAgICAgICAgICAgIGNsZWFudXAoYWRkSW5mbyk7XHJcbiAgICAgICAgICAgIHRoaXMuZGlhZ3JhbS5kYXRhQmluZCgpO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRvb2wudGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5fY3JlYXRlVG9vbFRlbXBsYXRlKHRvb2wsIG5vZGUpO1xyXG5cclxuICAgICAgICAgICAgaW5zdGFuY2UuZm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKGNoYW5nZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKHRvb2wuYXJndW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLl9jcmVhdGVMYXlvdXRBcmd1bWVudHModG9vbCwgbm9kZSk7XHJcblxyXG4gICAgICAgICAgICBpbnN0YW5jZS5tb2RlbENoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl9lbGVtZW50RGVzdHJveSkpLnN1YnNjcmliZShjaGFuZ2UuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfY3JlYXRlTGF5b3V0QXJndW1lbnRzKHRvb2w6IEZsb3dOb2RlLCBub2RlOiBOb2RlTW9kZWwpIHtcclxuICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLl9jZi5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShMYXlvdXRDb21wb25lbnQpO1xyXG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5hcmd1bWVudHN0ZW1wbGF0ZS5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSwgMCwgdGhpcy5faW5qZWN0b3IpO1xyXG4gICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgTGF5b3V0Q29tcG9uZW50O1xyXG4gICAgaW5zdGFuY2UuZmllbGRzID0gdG9vbC5hcmd1bWVudHM7XHJcbiAgICBpbnN0YW5jZS5tb2RlbCA9IG5vZGUuYWRkSW5mbztcclxuICAgIGluc3RhbmNlLmNyZWF0ZSgpO1xyXG4gICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gIH1cclxuICBwcml2YXRlIF9jcmVhdGVUb29sVGVtcGxhdGUodG9vbDogRmxvd05vZGUsIG5vZGU6IE5vZGVNb2RlbCkge1xyXG4gICAgY29uc3QgY29tcG9uZW50RmFjdG9yeSA9IHRoaXMuX2ZhY3RvcnlSZXNvbHZlci5yZXNvbHZlKHRoaXMudG9vbC50ZW1wbGF0ZSk7XHJcbiAgICBjb25zdCBub2RlUmVmID0gbmV3IE5vZGVSZWYodG9vbCk7XHJcbiAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZShbeyBwcm92aWRlOiBOb2RlUmVmLCB1c2VWYWx1ZTogbm9kZVJlZiB9XSwgdGhpcy5faW5qZWN0b3IpO1xyXG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5hcmd1bWVudHN0ZW1wbGF0ZS5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSwgMCwgaW5qZWN0b3IpO1xyXG4gICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgQXJndW1lbnRzQ29tcG9uZW50PGFueT47XHJcbiAgICBpbnN0YW5jZS5mb3JtLnBhdGNoVmFsdWUobm9kZS5hZGRJbmZvLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICByZXR1cm4gaW5zdGFuY2U7XHJcbiAgfVxyXG4gIGNvbm5lY3RvckNhc2VDaGFuZ2UoZXZ0PzogTWF0QnV0dG9uVG9nZ2xlQ2hhbmdlKSB7XHJcbiAgICB0aGlzLmNvbm5lY3Rvci5jb250cm9sc1snY2FzZSddLnNldFZhbHVlKGV2dC52YWx1ZSk7XHJcbiAgICB0aGlzLmNoYW5nZS5lbWl0KCk7XHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZWxlbWVudERlc3Ryb3kubmV4dCgpO1xyXG4gICAgdGhpcy5fZWxlbWVudERlc3Ryb3kuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAjYXJndW1lbnRzPlxyXG48L25nLWNvbnRhaW5lcj5cclxuPG5nLXRlbXBsYXRlICNjb25uZWN0b3JhcmdzPlxyXG4gIDxmb3JtIFtmb3JtR3JvdXBdPVwiY29ubmVjdG9yXCIgZnhMYXlvdXQ9XCJjb2x1bW5cIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1zZWxlY3QgW3BsYWNlaG9sZGVyXT1cIidBY3Rpb24nIHwgdHJhbnNsYXRlXCIgZm9ybUNvbnRyb2xOYW1lPVwiYWN0aW9uXCI+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBhY3Rpb25zXCIgW3ZhbHVlXT1cImFjdGlvbi5uYW1lXCI+e3thY3Rpb24udGl0bGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8bWF0LW9wdGlvbj57eydOb25lJyB8IHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIFt2YWx1ZV09XCJjb25uZWN0b3IuY29udHJvbHNbJ2Nhc2UnXS52YWx1ZVwiICNhY2FzZT1cIm1hdEJ1dHRvblRvZ2dsZUdyb3VwXCIgKGNoYW5nZSk9XCJjb25uZWN0b3JDYXNlQ2hhbmdlKCRldmVudClcIj5cclxuICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVwidHJ1ZVwiPnt7J1RydWUnIHwgdHJhbnNsYXRlfX08L21hdC1idXR0b24tdG9nZ2xlPlxyXG4gICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XCJmYWxzZVwiPnt7J0ZhbHNlJyB8IHRyYW5zbGF0ZX19PC9tYXQtYnV0dG9uLXRvZ2dsZT5cclxuICAgICAgPG1hdC1idXR0b24tdG9nZ2xlPnt7J0Nhc2UnIHwgdHJhbnNsYXRlfX08L21hdC1idXR0b24tdG9nZ2xlPlxyXG4gICAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBbc3R5bGUuZGlzcGxheV09XCJjb25uZWN0b3IuY29udHJvbHNbJ2Nhc2UnXS52YWx1ZT09PSd0cnVlJ3x8Y29ubmVjdG9yLmNvbnRyb2xzWydjYXNlJ10udmFsdWU9PT0nZmFsc2UnPydub25lJzonJ1wiPlxyXG4gICAgICA8aW5wdXQgbWF0SW5wdXQgW3BsYWNlaG9sZGVyXT1cIidDYXNlJyB8IHRyYW5zbGF0ZVwiIGZvcm1Db250cm9sTmFtZT1cImNhc2VcIiAvPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICA8L2Zvcm0+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==