@huntsman-cancer-institute/dictionary-editor 17.14.5 → 17.15.0

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.
@@ -2,176 +2,69 @@ import { Component } from "@angular/core";
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "@angular/common";
4
4
  import * as i2 from "@angular/forms";
5
- //import {MatDialog, MatDialogConfig, MatDialogRef} from "@angular/material/dialog";
6
- //import {SpinnerDialogComponent} from "../popup/spinner-dialog.component";
7
5
  export class SelectEditor {
8
- get options() {
9
- if (this.using_selectOptionsPerRowFilterFunction) {
10
- return this._filteredOptions;
11
- }
12
- else {
13
- return this._options;
14
- }
15
- }
16
- set options(value) {
17
- this._options = value;
18
- }
19
- // private spinnerDialogRefs: MatDialogRef<SpinnerDialogComponent>[] = [];
20
- constructor() {
21
- this.using_selectOptionsPerRowFilterFunction = false;
22
- this._spinnerDialogIsOpen = false;
23
- }
6
+ // variables used for the optional per-row-filtering
7
+ constructor() { }
24
8
  agInit(params) {
25
9
  this.params = params;
26
- this.options = [];
27
- this.optionsValueField = "";
28
- this.optionsDisplayField = "";
29
- if (this.params && this.params.column && this.params.column.colDef) {
30
- this.gridValueField = this.params.column.colDef.field;
31
- this.options = this.params.column.colDef.selectOptions;
32
- this.optionsValueField = this.params.column.colDef.selectOptionsValueField;
33
- this.optionsDisplayField = this.params.column.colDef.selectOptionsDisplayField;
34
- if (this.params.column.colDef.selectOptionsPerRowFilterFunction) {
35
- let backup = this.selectOptionsPerRowFilterFunction;
36
- try {
37
- this.selectOptionsPerRowFilterFunction = this.params.column.colDef.selectOptionsPerRowFilterFunction;
38
- this.using_selectOptionsPerRowFilterFunction = !!this.selectOptionsPerRowFilterFunction;
39
- }
40
- catch (e) {
41
- console.error("selectOptionsPerRowFilterFunction option has wrong signature for column : " + this.params.column.colDef.headerName + "\n"
42
- + " Requires signature (context:any, rowData: any, option: any) => boolean");
43
- this.selectOptionsPerRowFilterFunction = backup;
44
- this.using_selectOptionsPerRowFilterFunction = !!backup;
45
- }
46
- }
47
- this.context = this.params.column.colDef.context;
48
- this.fillGroupAttribute = this.params.column.colDef.fillGroupAttribute;
49
- this.fillAll = this.params.column.colDef.fillAll && ("" + this.params.column.colDef.fillAll).toLowerCase() !== "false";
50
- this.showFillButton = this.params.column.colDef.showFillButton && ("" + this.params.column.colDef.showFillButton).toLowerCase() !== "false";
51
- if (this._options
52
- && this.params.node
53
- && this.params.node.data
54
- && this.using_selectOptionsPerRowFilterFunction) {
55
- this._filteredOptions = this._options.filter((option) => {
56
- return this.selectOptionsPerRowFilterFunction(this.context, this.params.node.data, option);
57
- });
58
- }
59
- }
10
+ this.options = params.options;
11
+ this.valueField = params.valueField;
12
+ this.displayField = params.displayField;
60
13
  if (this.params) {
61
- this.value = this.params.value ? "" + this.params.value : "";
62
- }
63
- if (this.showFillButton && !this.fillAll && (!this.fillGroupAttribute || this.fillGroupAttribute === "")) {
64
- throw new Error("Invalid state, cannot use fill button without specifying the fillGroupAttribute or fillAll.");
65
- }
66
- }
67
- ngOnDestroy() {
68
- if (this.params && this.params.node && this.params.node[(this.gridValueField + "_originalValue")]) {
69
- this.value = this.params.node[(this.gridValueField + "_originalValue")];
14
+ this.value = this.params.value ? String(this.params.value) : "";
70
15
  }
71
16
  }
72
17
  onChange(event) {
73
- if (event && event.currentTarget) {
74
- if (this.params && this.params.node && !this.params.node[(this.gridValueField + "_originalValue")]) {
75
- this.params.node[(this.gridValueField + "_originalValue")] = this.value;
76
- }
77
- // This looks unnecessary, since this.value is linked to the value of the select component, but
78
- // because this also ends editing, it also queues the destruction of this component and the call to getValue.
79
- // The problem was that this.value isn't updated with the new value before this event fires,
80
- // so we need to update it manually here.
81
- this.value = event.currentTarget.value;
82
- this.params.node.setDataValue(this.gridValueField, this.value);
83
- }
84
- if (this.params) {
85
- // If the fill button, which is part of the editor, is activated, don't stop editing
86
- // immediately after making a selection.
87
- if (!this.showFillButton) {
88
- this.params.stopEditing();
89
- }
90
- }
91
18
  }
92
19
  getValue() {
93
- return this.value ? this.value : "";
20
+ return this.params.value ? String(this.params.value) : "";
94
21
  }
95
22
  isPopup() {
96
23
  return false;
97
24
  }
98
- onFillButtonClicked() {
99
- if (!this.fillAll && (!this.fillGroupAttribute || this.fillGroupAttribute === "")) {
100
- throw new Error('No column attribute "fillGroupAttribute" or "fillAll" specified. This is required to use the Fill functionality.');
101
- }
102
- if (this.params && this.params.column && this.params.column.gridApi && this.params.node && (this.fillAll || (this.fillGroupAttribute && this.fillGroupAttribute !== ""))) {
103
- let thisRowNode = this.params.node;
104
- //this.startSpinnerDialog();
105
- this.params.column.gridApi.forEachNodeAfterFilter((rowNode) => {
106
- if (rowNode && rowNode.data && thisRowNode && thisRowNode.data && (this.fillAll || rowNode.data[this.fillGroupAttribute] === thisRowNode.data[this.fillGroupAttribute])) {
107
- let spoofedEvent = {
108
- api: this.params.column.gridApi,
109
- colDef: this.params.column.colDef,
110
- column: this.params.column,
111
- columnApi: this.params.column.columnApi,
112
- context: undefined,
113
- data: rowNode.data,
114
- event: null,
115
- newValue: this.value,
116
- node: rowNode,
117
- oldValue: rowNode.data[this.gridValueField],
118
- rowIndex: rowNode.rowIndex,
119
- rowPinned: undefined,
120
- type: "cellValueChanged",
121
- value: this.value
122
- };
123
- rowNode.data[this.gridValueField] = this.value;
124
- rowNode.setDataValue(this.gridValueField, this.value);
125
- this.params.column.gridApi.dispatchEvent(spoofedEvent);
126
- }
127
- });
128
- this.params.column.gridApi.refreshCells();
129
- setTimeout(() => {
130
- //this.stopSpinnerDialogs();
131
- });
132
- }
133
- }
134
25
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectEditor, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
135
26
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SelectEditor, selector: "ng-component", ngImport: i0, template: `
136
27
  <div class="full-width full-height flex-column-container">
137
28
  <div class="full-height flex-stretch flex-row">
138
- <select class="full-width full-height" [(value)]="value" (change)="onChange($event)">
29
+ <select class="full-width full-height" [(ngModel)]="params.value" (change)="onChange($event)">
139
30
  <option hidden>
140
31
  Select An Option
32
+ </option>
33
+ <!-- Blank Option -->
34
+ <option value="">
35
+
141
36
  </option>
142
37
  <option
143
38
  *ngFor="let option of options"
144
- value="{{option.hasOwnProperty(optionsValueField) ? option[optionsValueField] : (option.value) ? option.value : option }}">
145
- {{option.hasOwnProperty(optionsDisplayField) ? option[optionsDisplayField] : (option.display) ? option.display : option }}
39
+ value="{{option.hasOwnProperty(valueField) ? option[valueField] : (option.value) ? option.value : option }}">
40
+ {{option.hasOwnProperty(displayField) ? option[displayField] : (option.display) ? option.display : option }}
146
41
  </option>
147
42
  </select>
148
43
  </div>
149
- <div *ngIf="showFillButton" class="full-height flex-row button-container">
150
- <button riRippleEffectDict class="full-height" (click)="onFillButtonClicked()">Fill</button>
151
- </div>
152
44
  </div>
153
- `, isInline: true, styles: [".full-width{width:100%}.full-height{height:100%}.flex-column-container{display:flex;flex-direction:row}.flex-row{display:flex}.flex-stretch{display:flex;flex:1}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }] }); }
45
+ `, isInline: true, styles: [".full-width{width:100%}.full-height{height:100%}.flex-column-container{display:flex;flex-direction:row}.flex-row{display:flex}.flex-stretch{display:flex;flex:1}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
154
46
  }
155
47
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectEditor, decorators: [{
156
48
  type: Component,
157
49
  args: [{ template: `
158
50
  <div class="full-width full-height flex-column-container">
159
51
  <div class="full-height flex-stretch flex-row">
160
- <select class="full-width full-height" [(value)]="value" (change)="onChange($event)">
52
+ <select class="full-width full-height" [(ngModel)]="params.value" (change)="onChange($event)">
161
53
  <option hidden>
162
54
  Select An Option
55
+ </option>
56
+ <!-- Blank Option -->
57
+ <option value="">
58
+
163
59
  </option>
164
60
  <option
165
61
  *ngFor="let option of options"
166
- value="{{option.hasOwnProperty(optionsValueField) ? option[optionsValueField] : (option.value) ? option.value : option }}">
167
- {{option.hasOwnProperty(optionsDisplayField) ? option[optionsDisplayField] : (option.display) ? option.display : option }}
62
+ value="{{option.hasOwnProperty(valueField) ? option[valueField] : (option.value) ? option.value : option }}">
63
+ {{option.hasOwnProperty(displayField) ? option[displayField] : (option.display) ? option.display : option }}
168
64
  </option>
169
65
  </select>
170
66
  </div>
171
- <div *ngIf="showFillButton" class="full-height flex-row button-container">
172
- <button riRippleEffectDict class="full-height" (click)="onFillButtonClicked()">Fill</button>
173
- </div>
174
67
  </div>
175
68
  `, styles: [".full-width{width:100%}.full-height{height:100%}.flex-column-container{display:flex;flex-direction:row}.flex-row{display:flex}.flex-stretch{display:flex;flex:1}\n"] }]
176
69
  }], ctorParameters: () => [] });
177
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2RpY3Rpb25hcnktZWRpdG9yL3NyYy9ncmlkLWVkaXRvcnMvc2VsZWN0LmVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFZLE1BQU0sZUFBZSxDQUFDOzs7O0FBRW5ELG9GQUFvRjtBQUNwRiwyRUFBMkU7QUFvRDNFLE1BQU0sT0FBTyxZQUFZO0lBSXJCLElBQVcsT0FBTztRQUNkLElBQUksSUFBSSxDQUFDLHVDQUF1QyxFQUFFLENBQUM7WUFDL0MsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDakMsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDekIsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFXLE9BQU8sQ0FBQyxLQUFZO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUF3QkwsNkVBQTZFO0lBRXpFO1FBbkJVLDRDQUF1QyxHQUFZLEtBQUssQ0FBQztRQWdCM0QseUJBQW9CLEdBQVksS0FBSyxDQUFDO0lBR0MsQ0FBQztJQUVoRCxNQUFNLENBQUMsTUFBVztRQUNkLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUU5QixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FB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QU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3RELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzNELENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMxQyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNaLDRCQUE0QjtZQUNoQyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDTCxDQUFDOytHQTVLUSxZQUFZO21HQUFaLFlBQVksb0RBL0NuQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Ba0JDOzs0RkE2Qk0sWUFBWTtrQkFsRHhCLFNBQVM7K0JBR0o7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBPbkRlc3Ryb3l9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7SUNlbGxFZGl0b3JBbmd1bGFyQ29tcH0gZnJvbSBcImFnLWdyaWQtYW5ndWxhclwiO1xyXG4vL2ltcG9ydCB7TWF0RGlhbG9nLCBNYXREaWFsb2dDb25maWcsIE1hdERpYWxvZ1JlZn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xyXG4vL2ltcG9ydCB7U3Bpbm5lckRpYWxvZ0NvbXBvbmVudH0gZnJvbSBcIi4uL3BvcHVwL3NwaW5uZXItZGlhbG9nLmNvbXBvbmVudFwiO1xyXG5cclxuQENvbXBvbmVudChcclxuICB7XHJcbiAgICB0ZW1wbGF0ZTpcclxuICAgICAgYFxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmdWxsLXdpZHRoIGZ1bGwtaGVpZ2h0IGZsZXgtY29sdW1uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZ1bGwtaGVpZ2h0IGZsZXgtc3RyZXRjaCBmbGV4LXJvd1wiPlxyXG4gICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZnVsbC13aWR0aCBmdWxsLWhlaWdodFwiIFsodmFsdWUpXT1cInZhbHVlXCIgKGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiBoaWRkZW4+XHJcbiAgICAgICAgICAgICAgICBTZWxlY3QgQW4gT3B0aW9uXHJcbiAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG9wdGlvblxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zXCJcclxuICAgICAgICAgICAgICAgIHZhbHVlPVwie3tvcHRpb24uaGFzT3duUHJvcGVydHkob3B0aW9uc1ZhbHVlRmllbGQpID8gb3B0aW9uW29wdGlvbnNWYWx1ZUZpZWxkXSA6IChvcHRpb24udmFsdWUpID8gb3B0aW9uLnZhbHVlIDogb3B0aW9uIH19XCI+XHJcbiAgICAgICAgICAgICAgICB7e29wdGlvbi5oYXNPd25Qcm9wZXJ0eShvcHRpb25zRGlzcGxheUZpZWxkKSA/IG9wdGlvbltvcHRpb25zRGlzcGxheUZpZWxkXSA6IChvcHRpb24uZGlzcGxheSkgPyBvcHRpb24uZGlzcGxheSA6IG9wdGlvbiB9fVxyXG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dGaWxsQnV0dG9uXCIgY2xhc3M9XCJmdWxsLWhlaWdodCBmbGV4LXJvdyBidXR0b24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gcmlSaXBwbGVFZmZlY3REaWN0IGNsYXNzPVwiZnVsbC1oZWlnaHRcIiAoY2xpY2spPVwib25GaWxsQnV0dG9uQ2xpY2tlZCgpXCI+RmlsbDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIGBcclxuICAgICxcclxuICAgIHN0eWxlczogW1xyXG4gICAgICBgXHJcbiAgICAgICAgLmZ1bGwtd2lkdGgge1xyXG4gICAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAuZnVsbC1oZWlnaHQge1xyXG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmZsZXgtY29sdW1uLWNvbnRhaW5lciB7XHJcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5mbGV4LXJvdyB7XHJcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmZsZXgtc3RyZXRjaCB7XHJcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgICAgZmxleDogMTtcclxuICAgICAgICB9XHJcbiAgICAgIGBcclxuICAgIF1cclxuICB9XHJcbilcclxuZXhwb3J0IGNsYXNzIFNlbGVjdEVkaXRvciBpbXBsZW1lbnRzIElDZWxsRWRpdG9yQW5ndWxhckNvbXAsIE9uRGVzdHJveSB7XHJcbiAgICBwdWJsaWMgcGFyYW1zOiBhbnk7XHJcbiAgICBwdWJsaWMgdmFsdWU6IGFueTtcclxuICAgIHByaXZhdGUgX29wdGlvbnM6IGFueVtdO1xyXG4gICAgcHVibGljIGdldCBvcHRpb25zKCk6IGFueVtdIHtcclxuICAgICAgICBpZiAodGhpcy51c2luZ19zZWxlY3RPcHRpb25zUGVyUm93RmlsdGVyRnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcmVkT3B0aW9ucztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG9wdGlvbnModmFsdWU6IGFueVtdKSB7XHJcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvcHRpb25zVmFsdWVGaWVsZDogc3RyaW5nO1xyXG4gICAgcHVibGljIG9wdGlvbnNEaXNwbGF5RmllbGQ6IHN0cmluZztcclxuXHJcbiAgICAvLyB2YXJpYWJsZXMgdXNlZCBmb3IgdGhlIG9wdGlvbmFsIHBlci1yb3ctZmlsdGVyaW5nXHJcbiAgICBwdWJsaWMgY29udGV4dDogYW55O1xyXG4gICAgcHJvdGVjdGVkIHVzaW5nX3NlbGVjdE9wdGlvbnNQZXJSb3dGaWx0ZXJGdW5jdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJvdGVjdGVkIHNlbGVjdE9wdGlvbnNQZXJSb3dGaWx0ZXJGdW5jdGlvbjogKGNvbnRleHQ6IGFueSwgcm93RGF0YTogYW55LCBvcHRpb246IGFueSkgPT4gYm9vbGVhbjtcclxuICAgIHByaXZhdGUgX2ZpbHRlcmVkT3B0aW9uczogYW55W107XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ3JpZFZhbHVlRmllbGQ6IHN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgc2hvd0ZpbGxCdXR0b246IGJvb2xlYW47XHRcdC8vIFRoaXMgcmVwcmVzZW50cyB3aGV0aGVyIHRoZSBlZGl0b3Igc2hvdWxkIHNob3cgdGhlIFwiRmlsbFwiIGJ1dHRvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIHVzZWQgdG8gY29weSB0aGUgdmFsdWUgb2YgdGhpcyBjZWxsIHRvIG90aGVyIGNlbGxzIGluIHRoaXMgY29sdW1uIGluIHRoZSBncmlkXHJcbiAgICBwdWJsaWMgZmlsbEdyb3VwQXR0cmlidXRlOiBzdHJpbmc7XHRcdC8vIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGljaCBcIkdyb3VwXCIgYSBwYXJ0aWN1bGFyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm93IGJlbG9uZ3MgdG8sIHdoaWNoIGlzIHVzZWQgd2hlbiB0aGUgZmlsbCBidXR0b24gaXMgYWN0aXZlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gY2xpY2tlZCwgdGhlIGZpbGwgYnV0dG9uIHdpbGwgY29weSB0aGUgZGF0YSBpbiB0aGF0IGNlbGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgY29ycmVzcG9uZGluZyBjZWxscyBpbiByb3dzIG9mIHRoZSBzYW1lIGdyb3VwLlxyXG4gICAgcHVibGljIGZpbGxBbGw6IGJvb2xlYW47ICAgICAgICAgICAgICAgIC8vIElmIGZpbGxBbGwgaXMgc2V0LCBhbGwgZGF0YSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZ3JvdXBlZCB0b2dldGhlclxyXG5cclxuICAgIHByaXZhdGUgX3NwaW5uZXJEaWFsb2dJc09wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuLy8gICAgcHJpdmF0ZSBzcGlubmVyRGlhbG9nUmVmczogTWF0RGlhbG9nUmVmPFNwaW5uZXJEaWFsb2dDb21wb25lbnQ+W10gPSBbXTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigvKnByb3RlY3RlZCBkaWFsb2c6IE1hdERpYWxvZyovKSB7IH1cclxuXHJcbiAgICBhZ0luaXQocGFyYW1zOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBbXTtcclxuICAgICAgICB0aGlzLm9wdGlvbnNWYWx1ZUZpZWxkID0gXCJcIjtcclxuICAgICAgICB0aGlzLm9wdGlvbnNEaXNwbGF5RmllbGQgPSBcIlwiO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wYXJhbXMgJiYgdGhpcy5wYXJhbXMuY29sdW1uICYmIHRoaXMucGFyYW1zLmNvbHVtbi5jb2xEZWYpIHtcclxuICAgICAgICAgICAgdGhpcy5ncmlkVmFsdWVGaWVsZCA9IHRoaXMucGFyYW1zLmNvbHVtbi5jb2xEZWYuZmllbGQ7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLnBhcmFtcy5jb2x1bW4uY29sRGVmLnNlbGVjdE9wdGlvbnM7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc1ZhbHVlRmllbGQgPSB0aGlzLnBhcmFtcy5jb2x1bW4uY29sRGVmLnNlbGVjdE9wdGlvbnNWYWx1ZUZpZWxkO1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnNEaXNwbGF5RmllbGQgPSB0aGlzLnBhcmFtcy5jb2x1bW4uY29sRGVmLnNlbGVjdE9wdGlvbnNEaXNwbGF5RmllbGQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZi5zZWxlY3RPcHRpb25zUGVyUm93RmlsdGVyRnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGxldCBiYWNrdXAgPSB0aGlzLnNlbGVjdE9wdGlvbnNQZXJSb3dGaWx0ZXJGdW5jdGlvbjtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcHRpb25zUGVyUm93RmlsdGVyRnVuY3Rpb24gPSB0aGlzLnBhcmFtcy5jb2x1bW4uY29sRGVmLnNlbGVjdE9wdGlvbnNQZXJSb3dGaWx0ZXJGdW5jdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzaW5nX3NlbGVjdE9wdGlvbnNQZXJSb3dGaWx0ZXJGdW5jdGlvbiA9ICEhdGhpcy5zZWxlY3RPcHRpb25zUGVyUm93RmlsdGVyRnVuY3Rpb247XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcInNlbGVjdE9wdGlvbnNQZXJSb3dGaWx0ZXJGdW5jdGlvbiBvcHRpb24gaGFzIHdyb25nIHNpZ25hdHVyZSBmb3IgY29sdW1uIDogXCIgKyB0aGlzLnBhcmFtcy5jb2x1bW4uY29sRGVmLmhlYWRlck5hbWUgKyBcIlxcblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICsgXCIgIFJlcXVpcmVzIHNpZ25hdHVyZSAoY29udGV4dDphbnksIHJvd0RhdGE6IGFueSwgb3B0aW9uOiBhbnkpID0+IGJvb2xlYW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcHRpb25zUGVyUm93RmlsdGVyRnVuY3Rpb24gPSBiYWNrdXA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2luZ19zZWxlY3RPcHRpb25zUGVyUm93RmlsdGVyRnVuY3Rpb24gPSAhIWJhY2t1cDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZi5jb250ZXh0O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5maWxsR3JvdXBBdHRyaWJ1dGUgPSB0aGlzLnBhcmFtcy5jb2x1bW4uY29sRGVmLmZpbGxHcm91cEF0dHJpYnV0ZTtcclxuICAgICAgICAgICAgdGhpcy5maWxsQWxsID0gdGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZi5maWxsQWxsICYmIChcIlwiICsgdGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZi5maWxsQWxsKS50b0xvd2VyQ2FzZSgpICE9PSBcImZhbHNlXCI7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNob3dGaWxsQnV0dG9uID0gdGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZi5zaG93RmlsbEJ1dHRvbiAmJiAoXCJcIiArIHRoaXMucGFyYW1zLmNvbHVtbi5jb2xEZWYuc2hvd0ZpbGxCdXR0b24pLnRvTG93ZXJDYXNlKCkgIT09IFwiZmFsc2VcIjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zXHJcbiAgICAgICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlXHJcbiAgICAgICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmRhdGFcclxuICAgICAgICAgICAgICAgICYmIHRoaXMudXNpbmdfc2VsZWN0T3B0aW9uc1BlclJvd0ZpbHRlckZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRPcHRpb25zID0gdGhpcy5fb3B0aW9ucy5maWx0ZXIoKG9wdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0T3B0aW9uc1BlclJvd0ZpbHRlckZ1bmN0aW9uKHRoaXMuY29udGV4dCwgdGhpcy5wYXJhbXMubm9kZS5kYXRhLCBvcHRpb24pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtcykge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5wYXJhbXMudmFsdWUgPyBcIlwiICsgdGhpcy5wYXJhbXMudmFsdWUgOiBcIlwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0ZpbGxCdXR0b24gJiYgIXRoaXMuZmlsbEFsbCAmJiAoIXRoaXMuZmlsbEdyb3VwQXR0cmlidXRlIHx8IHRoaXMuZmlsbEdyb3VwQXR0cmlidXRlID09PSBcIlwiKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN0YXRlLCBjYW5ub3QgdXNlIGZpbGwgYnV0dG9uIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgZmlsbEdyb3VwQXR0cmlidXRlIG9yIGZpbGxBbGwuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJhbXMgJiYgdGhpcy5wYXJhbXMubm9kZSAmJiB0aGlzLnBhcmFtcy5ub2RlWyh0aGlzLmdyaWRWYWx1ZUZpZWxkICsgXCJfb3JpZ2luYWxWYWx1ZVwiKV0pIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMucGFyYW1zLm5vZGVbKHRoaXMuZ3JpZFZhbHVlRmllbGQgKyBcIl9vcmlnaW5hbFZhbHVlXCIpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChldmVudCAmJiBldmVudC5jdXJyZW50VGFyZ2V0KSB7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJhbXMgJiYgdGhpcy5wYXJhbXMubm9kZSAmJiAhdGhpcy5wYXJhbXMubm9kZVsodGhpcy5ncmlkVmFsdWVGaWVsZCArIFwiX29yaWdpbmFsVmFsdWVcIildKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcy5ub2RlWyh0aGlzLmdyaWRWYWx1ZUZpZWxkICsgXCJfb3JpZ2luYWxWYWx1ZVwiKV0gPSB0aGlzLnZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBUaGlzIGxvb2tzIHVubmVjZXNzYXJ5LCBzaW5jZSB0aGlzLnZhbHVlIGlzIGxpbmtlZCB0byB0aGUgdmFsdWUgb2YgdGhlIHNlbGVjdCBjb21wb25lbnQsIGJ1dFxyXG4gICAgICAgICAgICAvLyBiZWNhdXNlIHRoaXMgYWxzbyBlbmRzIGVkaXRpbmcsIGl0IGFsc28gcXVldWVzIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGlzIGNvbXBvbmVudCBhbmQgdGhlIGNhbGwgdG8gZ2V0VmFsdWUuXHJcbiAgICAgICAgICAgIC8vIFRoZSBwcm9ibGVtIHdhcyB0aGF0IHRoaXMudmFsdWUgaXNuJ3QgdXBkYXRlZCB3aXRoIHRoZSBuZXcgdmFsdWUgYmVmb3JlIHRoaXMgZXZlbnQgZmlyZXMsXHJcbiAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gdXBkYXRlIGl0IG1hbnVhbGx5IGhlcmUuXHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5ub2RlLnNldERhdGFWYWx1ZSh0aGlzLmdyaWRWYWx1ZUZpZWxkLCB0aGlzLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zKSB7XHJcblxyXG4gICAgICAgICAgICAvLyAgSWYgdGhlIGZpbGwgYnV0dG9uLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBlZGl0b3IsIGlzIGFjdGl2YXRlZCwgZG9uJ3Qgc3RvcCBlZGl0aW5nXHJcbiAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IGFmdGVyIG1ha2luZyBhIHNlbGVjdGlvbi5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dGaWxsQnV0dG9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcy5zdG9wRWRpdGluZygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFZhbHVlKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlIDogXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICBpc1BvcHVwKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBvbkZpbGxCdXR0b25DbGlja2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5maWxsQWxsICYmICghdGhpcy5maWxsR3JvdXBBdHRyaWJ1dGUgfHwgdGhpcy5maWxsR3JvdXBBdHRyaWJ1dGUgPT09IFwiXCIpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY29sdW1uIGF0dHJpYnV0ZSBcImZpbGxHcm91cEF0dHJpYnV0ZVwiIG9yIFwiZmlsbEFsbFwiIHNwZWNpZmllZC4gVGhpcyBpcyByZXF1aXJlZCB0byB1c2UgdGhlIEZpbGwgZnVuY3Rpb25hbGl0eS4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtcyAmJiB0aGlzLnBhcmFtcy5jb2x1bW4gJiYgdGhpcy5wYXJhbXMuY29sdW1uLmdyaWRBcGkgJiYgdGhpcy5wYXJhbXMubm9kZSAmJiAodGhpcy5maWxsQWxsIHx8ICh0aGlzLmZpbGxHcm91cEF0dHJpYnV0ZSAmJiB0aGlzLmZpbGxHcm91cEF0dHJpYnV0ZSAhPT0gXCJcIikpKSB7XHJcbiAgICAgICAgICAgIGxldCB0aGlzUm93Tm9kZSA9IHRoaXMucGFyYW1zLm5vZGU7XHJcblxyXG4gICAgICAgICAgICAvL3RoaXMuc3RhcnRTcGlubmVyRGlhbG9nKCk7XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLmNvbHVtbi5ncmlkQXBpLmZvckVhY2hOb2RlQWZ0ZXJGaWx0ZXIoKHJvd05vZGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChyb3dOb2RlICYmIHJvd05vZGUuZGF0YSAmJiB0aGlzUm93Tm9kZSAmJiB0aGlzUm93Tm9kZS5kYXRhICYmICh0aGlzLmZpbGxBbGwgfHwgcm93Tm9kZS5kYXRhW3RoaXMuZmlsbEdyb3VwQXR0cmlidXRlXSA9PT0gdGhpc1Jvd05vZGUuZGF0YVt0aGlzLmZpbGxHcm91cEF0dHJpYnV0ZV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNwb29mZWRFdmVudDogYW55ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcGk6IHRoaXMucGFyYW1zLmNvbHVtbi5ncmlkQXBpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xEZWY6IHRoaXMucGFyYW1zLmNvbHVtbi5jb2xEZWYsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5wYXJhbXMuY29sdW1uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5BcGk6IHRoaXMucGFyYW1zLmNvbHVtbi5jb2x1bW5BcGksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcm93Tm9kZS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWU6IHRoaXMudmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU6IHJvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9sZFZhbHVlOiByb3dOb2RlLmRhdGFbdGhpcy5ncmlkVmFsdWVGaWVsZF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiByb3dOb2RlLnJvd0luZGV4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dQaW5uZWQ6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJjZWxsVmFsdWVDaGFuZ2VkXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcm93Tm9kZS5kYXRhW3RoaXMuZ3JpZFZhbHVlRmllbGRdID0gdGhpcy52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICByb3dOb2RlLnNldERhdGFWYWx1ZSh0aGlzLmdyaWRWYWx1ZUZpZWxkLCB0aGlzLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcy5jb2x1bW4uZ3JpZEFwaS5kaXNwYXRjaEV2ZW50KHNwb29mZWRFdmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMuY29sdW1uLmdyaWRBcGkucmVmcmVzaENlbGxzKCk7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLnN0b3BTcGlubmVyRGlhbG9ncygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cdC8qXHJcbiAgICBzdGFydFNwaW5uZXJEaWFsb2coKTogTWF0RGlhbG9nUmVmPFNwaW5uZXJEaWFsb2dDb21wb25lbnQ+IHtcclxuICAgICAgICBpZiAodGhpcy5fc3Bpbm5lckRpYWxvZ0lzT3Blbikge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NwaW5uZXJEaWFsb2dJc09wZW4gPSB0cnVlO1xyXG5cclxuICAgICAgICBsZXQgY29uZmlndXJhdGlvbjogTWF0RGlhbG9nQ29uZmlnID0gbmV3IE1hdERpYWxvZ0NvbmZpZygpO1xyXG4gICAgICAgIGNvbmZpZ3VyYXRpb24uZGF0YSA9IHtcclxuICAgICAgICAgICAgbWVzc2FnZTogXCJQbGVhc2Ugd2FpdC4uLlwiLFxyXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogMyxcclxuICAgICAgICAgICAgZGlhbWV0ZXI6IDMwXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25maWd1cmF0aW9uLndpZHRoID0gXCIxM2VtXCI7XHJcbiAgICAgICAgY29uZmlndXJhdGlvbi5kaXNhYmxlQ2xvc2UgPSB0cnVlO1xyXG5cclxuICAgICAgICBsZXQgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8U3Bpbm5lckRpYWxvZ0NvbXBvbmVudD4gPSB0aGlzLmRpYWxvZy5vcGVuKFNwaW5uZXJEaWFsb2dDb21wb25lbnQsIGNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoKSA9PiB7IHRoaXMuX3NwaW5uZXJEaWFsb2dJc09wZW4gPSBmYWxzZTsgfSk7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyRGlhbG9nUmVmcy5wdXNoKGRpYWxvZ1JlZik7XHJcblxyXG4gICAgICAgIHJldHVybiBkaWFsb2dSZWY7XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcFNwaW5uZXJEaWFsb2dzKCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGRpYWxvZ1JlZiBvZiB0aGlzLnNwaW5uZXJEaWFsb2dSZWZzKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZGlhbG9nUmVmLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNwaW5uZXJEaWFsb2dSZWZzID0gW107XHJcbiAgICB9XHJcblx0Ki9cclxufVxyXG4iXX0=
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2RpY3Rpb25hcnktZWRpdG9yL3NyYy9ncmlkLWVkaXRvcnMvc2VsZWN0LmVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFZLE1BQU0sZUFBZSxDQUFDOzs7O0FBd0RuRCxNQUFNLE9BQU8sWUFBWTtJQVFyQixvREFBb0Q7SUFFcEQsZ0JBQWdCLENBQUM7SUFFakIsTUFBTSxDQUFDLE1BUUY7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztRQUV4QyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDcEUsQ0FBQztJQUVMLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBVTtJQUVuQixDQUFDO0lBRUQsUUFBUTtRQUNKLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUQsQ0FBQztJQUVELE9BQU87UUFDSCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDOytHQTFDUSxZQUFZO21HQUFaLFlBQVksb0RBaERiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BbUJMOzs0RkE2Qk0sWUFBWTtrQkFuRHhCLFNBQVM7K0JBR0U7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkwiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgT25EZXN0cm95fSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0lDZWxsRWRpdG9yQW5ndWxhckNvbXB9IGZyb20gXCJhZy1ncmlkLWFuZ3VsYXJcIjtcclxuaW1wb3J0IHtFdmVudHMsIElDZWxsRWRpdG9yUGFyYW1zfSBmcm9tICdhZy1ncmlkLWNvbW11bml0eSc7XHJcblxyXG5cclxuQENvbXBvbmVudChcclxuICAgIHtcclxuICAgICAgICB0ZW1wbGF0ZTpcclxuICAgICAgICAgICAgYFxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmdWxsLXdpZHRoIGZ1bGwtaGVpZ2h0IGZsZXgtY29sdW1uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZ1bGwtaGVpZ2h0IGZsZXgtc3RyZXRjaCBmbGV4LXJvd1wiPlxyXG4gICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZnVsbC13aWR0aCBmdWxsLWhlaWdodFwiIFsobmdNb2RlbCldPVwicGFyYW1zLnZhbHVlXCIgKGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiBoaWRkZW4+XHJcbiAgICAgICAgICAgICAgICBTZWxlY3QgQW4gT3B0aW9uXHJcbiAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPCEtLSBCbGFuayBPcHRpb24gLS0+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlxyXG5cclxuICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICA8b3B0aW9uXHJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJ7e29wdGlvbi5oYXNPd25Qcm9wZXJ0eSh2YWx1ZUZpZWxkKSA/IG9wdGlvblt2YWx1ZUZpZWxkXSA6IChvcHRpb24udmFsdWUpID8gb3B0aW9uLnZhbHVlIDogb3B0aW9uIH19XCI+XHJcbiAgICAgICAgICAgICAgICB7e29wdGlvbi5oYXNPd25Qcm9wZXJ0eShkaXNwbGF5RmllbGQpID8gb3B0aW9uW2Rpc3BsYXlGaWVsZF0gOiAob3B0aW9uLmRpc3BsYXkpID8gb3B0aW9uLmRpc3BsYXkgOiBvcHRpb24gfX1cclxuICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgYFxyXG4gICAgICAgICxcclxuICAgICAgICBzdHlsZXM6IFtcclxuICAgICAgICAgICAgYFxyXG4gICAgICAgIC5mdWxsLXdpZHRoIHtcclxuICAgICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmZ1bGwtaGVpZ2h0IHtcclxuICAgICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5mbGV4LWNvbHVtbi1jb250YWluZXIge1xyXG4gICAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAuZmxleC1yb3cge1xyXG4gICAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5mbGV4LXN0cmV0Y2gge1xyXG4gICAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICAgIGZsZXg6IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICBgXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG4pXHJcbmV4cG9ydCBjbGFzcyBTZWxlY3RFZGl0b3IgaW1wbGVtZW50cyBJQ2VsbEVkaXRvckFuZ3VsYXJDb21wIHtcclxuICAgIHB1YmxpYyBwYXJhbXM6IElDZWxsRWRpdG9yUGFyYW1zO1xyXG4gICAgcHVibGljIHZhbHVlOiBhbnk7XHJcbiAgICBwdWJsaWMgb3B0aW9uczogYW55W107XHJcblxyXG4gICAgcHVibGljIHZhbHVlRmllbGQ6IHN0cmluZztcclxuICAgIHB1YmxpYyBkaXNwbGF5RmllbGQ6IHN0cmluZztcclxuXHJcbiAgICAvLyB2YXJpYWJsZXMgdXNlZCBmb3IgdGhlIG9wdGlvbmFsIHBlci1yb3ctZmlsdGVyaW5nXHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgICBhZ0luaXQocGFyYW1zOiBJQ2VsbEVkaXRvclBhcmFtcyAmXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkaXNwbGF5RmllbGQ6IHN0cmluZyxcclxuICAgICAgICAgICAgdmFsdWVGaWVsZDogc3RyaW5nLFxyXG4gICAgICAgICAgICBvcHRpb25zOiBhbnlbXSxcclxuICAgICAgICAgICAgZGlzcGxheU9yZGVyOiBhbnksXHJcbiAgICAgICAgICAgIGRpY3Rpb25hcnlEaXNwbGF5OiBhbnksXHJcbiAgICAgICAgICAgIGRpY3Rpb25hcnlUb29sdGlwOiBhbnksXHJcbiAgICAgICAgfSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHBhcmFtcy5vcHRpb25zO1xyXG4gICAgICAgIHRoaXMudmFsdWVGaWVsZCA9IHBhcmFtcy52YWx1ZUZpZWxkO1xyXG4gICAgICAgIHRoaXMuZGlzcGxheUZpZWxkID0gcGFyYW1zLmRpc3BsYXlGaWVsZDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnBhcmFtcy52YWx1ZSA/IFN0cmluZyh0aGlzLnBhcmFtcy52YWx1ZSkgOiBcIlwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXRWYWx1ZSgpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmFtcy52YWx1ZSA/IFN0cmluZyh0aGlzLnBhcmFtcy52YWx1ZSkgOiBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIGlzUG9wdXAoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -1,4 +1,4 @@
1
- import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from "@angular/forms";
1
+ import { FormBuilder, FormControl, FormGroup } from "@angular/forms";
2
2
  /**
3
3
  * This class' purpose is to place FormControls on cells in the grid, and to link them by rows, and rows to the grid as a whole.
4
4
  * It allows you to add validators for a cells' value and link an error type to an error message to display in a tooltip, or
@@ -20,7 +20,7 @@ import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from "@angul
20
20
  * headerName: "Name",
21
21
  * editable: false,
22
22
  * width: 600,
23
- * cellRendererFramework: TextAlignLeftMiddleRenderer,
23
+ * cellRenderer: TextAlignLeftMiddleRenderer,
24
24
  * setErrors: (value: any,
25
25
  * data: any,
26
26
  * node: any,
@@ -56,7 +56,7 @@ export class CellRendererValidation {
56
56
  }
57
57
  agInit(params) {
58
58
  this.params = params;
59
- this.formBuilder = new UntypedFormBuilder();
59
+ this.formBuilder = new FormBuilder();
60
60
  if (this.params
61
61
  && this.params.node
62
62
  && this.params.node.gridApi
@@ -73,7 +73,6 @@ export class CellRendererValidation {
73
73
  }
74
74
  }
75
75
  this.getErrorMessage();
76
- this.agInit2(params);
77
76
  }
78
77
  refresh(params) {
79
78
  return false;
@@ -114,7 +113,7 @@ export class CellRendererValidation {
114
113
  || (this.params.node.gridApi.formGroup
115
114
  && this.params.node.gridApi.formGroup.controls
116
115
  && this.params.node.gridApi.formGroup.controls.length != allNodes.length)) {
117
- this.params.node.gridApi.formGroup = new UntypedFormGroup({});
116
+ this.params.node.gridApi.formGroup = new FormGroup({});
118
117
  }
119
118
  if (this.params.node.gridApi.columnController
120
119
  && this.params.node.gridApi.columnController.columnDefs) {
@@ -143,9 +142,9 @@ export class CellRendererValidation {
143
142
  && column.colDef.field
144
143
  && (column.colDef.validators || column.colDef.setErrors)) {
145
144
  node[column.colDef.field + "_errorMessage"] = '';
146
- let formControl = new UntypedFormControl(column.colDef.field + '_formControl', []);
145
+ let formControl = new FormControl(column.colDef.field + '_formControl', []);
147
146
  if (!node.formGroup) {
148
- node.formGroup = new UntypedFormGroup({});
147
+ node.formGroup = new FormGroup({});
149
148
  }
150
149
  node.formGroup.addControl(column.colDef.field + '_formControl', formControl);
151
150
  if (!Array.isArray(column.colDef.validators)) {
@@ -157,7 +156,7 @@ export class CellRendererValidation {
157
156
  }
158
157
  if (!this.params.node.gridApi.formGroup.contains('RowGroup_' + node.rowIndex)) {
159
158
  if (!node.formGroup) {
160
- node.formGroup = new UntypedFormGroup({});
159
+ node.formGroup = new FormGroup({});
161
160
  }
162
161
  this.params.node.gridApi.formGroup.addControl('RowGroup_' + node.rowIndex, node.formGroup);
163
162
  }
@@ -290,11 +289,11 @@ export class CellRendererValidation {
290
289
  && this.params.colDef.field
291
290
  && (this.params.colDef.validators || this.params.colDef.setErrors)) {
292
291
  this.params.node[this.params.colDef.field + "_errorMessage"] = '';
293
- let formControl = new UntypedFormControl(this.params.colDef.field + '_formControl', []);
292
+ let formControl = new FormControl(this.params.colDef.field + '_formControl', []);
294
293
  if (!this.params.node.formGroup) {
295
- this.params.node.formGroup = new UntypedFormGroup({});
294
+ this.params.node.formGroup = new FormGroup({});
296
295
  if (!this.params.node.gridApi.formGroup) {
297
- this.params.node.gridApi.formGroup = new UntypedFormGroup({});
296
+ this.params.node.gridApi.formGroup = new FormGroup({});
298
297
  }
299
298
  else {
300
299
  // check for any removed nodes & remove their validators if needed.
@@ -342,4 +341,4 @@ export class CellRendererValidation {
342
341
  // Might need to trigger cell validation to run with the new validation.
343
342
  }
344
343
  }
345
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC1yZW5kZXJlci12YWxpZGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZGljdGlvbmFyeS1lZGl0b3Ivc3JjL2dyaWQtcmVuZGVyZXJzL2NlbGwtcmVuZGVyZXItdmFsaWRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrREc7QUFDSCxNQUFNLE9BQWdCLHNCQUFzQjtJQUE1QztRQUlXLGlCQUFZLEdBQVcsRUFBRSxDQUFDO0lBZ1hyQyxDQUFDO0lBNVdHLE1BQU0sQ0FBQyxNQUFXO1FBQ2QsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFFNUMsSUFBSSxJQUFJLENBQUMsTUFBTTtlQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSTtlQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPO2VBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7WUFFdEQsSUFBSSw0QkFBNEIsR0FBWSxLQUFLLENBQUM7WUFFbEQsS0FBSyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDcEUsSUFBSSxTQUFTLENBQUMsZUFBZSxJQUFJLFNBQVMsQ0FBQyxlQUFlLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBQ2xFLDRCQUE0QixHQUFHLElBQUksQ0FBQztnQkFDeEMsQ0FBQztZQUNMLENBQUM7WUFFRCxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLHlDQUF5QyxFQUFFLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ2pDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXZCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUtELE9BQU8sQ0FBQyxNQUFXO1FBQ2YsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELGdIQUFnSDtJQUNoSCxFQUFFO0lBQ0Ysb0VBQW9FO0lBQ3BFLG9GQUFvRjtJQUNwRixxR0FBcUc7SUFDckcscUdBQXFHO0lBQ3JHLHFHQUFxRztJQUNyRyxzR0FBc0c7SUFDdEcsdURBQXVEO0lBQ3ZELEVBQUU7SUFDRix3RkFBd0Y7SUFDeEYscUJBQXFCO1FBQ2pCLElBQUksSUFBSSxDQUFDLE1BQU07ZUFDUixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07ZUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTTtlQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7ZUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJO2VBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU87ZUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFFekMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCO21CQUN4QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsV0FBVzttQkFDdkQsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLHNDQUFzQyxFQUFFLENBQUM7Z0JBRXJHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUUvQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLHNDQUFzQyxHQUFHLElBQUksQ0FBQztZQUMxRyxDQUFDO1lBRUQsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBRWxCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLG9DQUFvQyxFQUFFLENBQUM7Z0JBQ2hFLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMzRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxhQUFhLENBQUM7WUFDakUsQ0FBQztZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUzttQkFDaEMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUzt1QkFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRO3VCQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBRWhGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsRSxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCO21CQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBRTFELEtBQUssSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUN6RSxJQUFJLFNBQVMsQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUM1QyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7NEJBQy9DLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUMzRixDQUFDOzZCQUFNLENBQUM7NEJBQ0osU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7d0JBQzNGLENBQUM7b0JBQ0wsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQztZQUVELElBQUksT0FBYyxDQUFDO1lBRW5CLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNqRixPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUMzRSxPQUFPLE1BQU0sQ0FBQyxNQUFNOzJCQUNiLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSzsyQkFDbkIsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNqRSxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7WUFFRCxLQUFLLElBQUksSUFBSSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUN4QixLQUFLLElBQUksTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUN6QixJQUFJLE1BQU0sQ0FBQyxNQUFNOzJCQUNWLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSzsyQkFDbkIsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7d0JBQzNELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBRWpELElBQUksV0FBVyxHQUF1QixJQUFJLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFFdkcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUM5QyxDQUFDO3dCQUVELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQzt3QkFFN0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDOzRCQUMzQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQzFELENBQUM7d0JBRUQsV0FBVyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUVwRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzlELENBQUM7Z0JBQ0wsQ0FBQztnQkFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUM1RSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzlDLENBQUM7b0JBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMvRixDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRU8sdUJBQXVCO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtlQUNULENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJO2VBQ2pCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTztlQUN6QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0I7ZUFDNUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDOUQsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMzRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUM7UUFDekosQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ3ZGLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQywyQ0FBMkMsRUFBRSxDQUFDO1lBRW5ELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUM1RSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JGLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUdILElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQy9FLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQztRQUNqSyxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDM0YsSUFBSSxDQUFDLHlDQUF5QyxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLDJDQUEyQyxFQUFFLENBQUM7WUFFbkQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQ2hGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekYsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLGVBQWU7UUFDbkIsSUFBSSxJQUFJLENBQUMsTUFBTTtlQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSTtlQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTO2VBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtlQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNO2VBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUVyQyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsY0FBYyxDQUFDLENBQUM7WUFFbkcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVsRixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLENBQUM7UUFDNUYsQ0FBQztJQUNMLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxXQUErQixFQUFFLElBQVMsRUFBRSxTQUFpQjtRQUN6RixJQUFJLFdBQVcsSUFBSSxJQUFJLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNwRSxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLFdBQVcsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3pDLENBQUM7SUFDTCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsV0FBK0IsRUFBRSxJQUFTLEVBQUUsZ0JBQXFCO1FBQ3hGLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzdDLE9BQU8sRUFBRSxDQUFDO1FBQ2QsQ0FBQztRQUVELElBQUksa0JBQWtCLEdBQVcsRUFBRSxDQUFDO1FBRXBDLElBQUksZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDN0Isa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUNqQyxJQUFJLENBQUMsSUFBSSxFQUNULElBQUksRUFDSixnQkFBZ0IsRUFDaEIsSUFBSSxDQUFDLFFBQVEsRUFDYixJQUFJLENBQUMsT0FBTyxDQUNmLENBQUM7UUFDTixDQUFDO1FBRUQsSUFBSSxnQkFBZ0IsR0FBVyxnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDO1FBRXhFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFNUIsSUFBSSxXQUFXLENBQUMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLElBQUksa0JBQWtCLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMzRSxJQUFJLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7WUFDOUUsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDbEIsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxlQUFlLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNqSCxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksZ0JBQWdCLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUM7Z0JBQzVELGdCQUFnQixDQUFDLHdCQUF3QixHQUFHLENBQUMsZ0JBQWdCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUM1RixDQUFDO1lBRUQsS0FBSyxJQUFJLHlCQUF5QixJQUFJLGdCQUFnQixDQUFDLHdCQUF3QixFQUFFLENBQUM7Z0JBQzlFLElBQUksQ0FBQyxDQUFDLHlCQUF5QixDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMseUJBQXlCLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3BGLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO3dCQUM1RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSx5QkFBeUIsQ0FBQyxZQUFZLEdBQUUsSUFBSSxDQUFDO29CQUMzRSxDQUFDO2dCQUNMLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLGtCQUFrQixDQUFDO1FBRTdDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVTLHlDQUF5QztRQUMvQyxJQUFJLElBQUksQ0FBQyxNQUFNO2VBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJO2VBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU87ZUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTO2VBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFnQjtlQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUV4RCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQy9FLE9BQU8sTUFBTSxDQUFDLE1BQU07dUJBQ2IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLO3VCQUNuQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO3VCQUNyRCxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJO3VCQUMvQixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyx5QkFBeUI7MkJBQ3JDLE1BQU0sQ0FBQyxNQUFNLENBQUMseUJBQXlCLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDakUsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsb0NBQW9DLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztRQUNuSCxDQUFDO0lBQ0wsQ0FBQztJQUVTLDJDQUEyQztRQUNqRCxJQUFJLElBQUksQ0FBQyxNQUFNO2VBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJO2VBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRTlCLElBQUkscUJBQXFCLEdBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQztZQUUzRixLQUFLLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hHLElBQUksWUFBWSxDQUFDLGlCQUFpQixJQUFJLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDbkYsWUFBWSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUNyRCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRU0sZ0JBQWdCO1FBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNyQyx3QkFBd0I7UUFFeEIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQy9FLE9BQU8sTUFBTSxDQUFDLE1BQU07bUJBQ2IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLO21CQUNuQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO21CQUNyRCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO2VBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSztlQUN4QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBRXJFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUM7WUFFbEUsSUFBSSxXQUFXLEdBQXVCLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUU1RyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUV0RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2xFLENBQUM7cUJBQU0sQ0FBQztvQkFDSixtRUFBbUU7b0JBQ25FLEtBQUssSUFBSSxXQUFXLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7d0JBQy9FLElBQUksQ0FBQyxFQUFFLEdBQUcsV0FBVyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxXQUFXLEVBQUUsQ0FBQzs0QkFDaEUsSUFBSSxLQUFLLEdBQVksS0FBSyxDQUFDOzRCQUMzQixLQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQ0FDakUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0NBQ3hELEtBQUssR0FBRyxJQUFJLENBQUM7b0NBQ2IsTUFBTTtnQ0FDVixDQUFDOzRCQUNMLENBQUM7NEJBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dDQUNULElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDOzRCQUNsRSxDQUFDO3dCQUNMLENBQUM7b0JBQ0wsQ0FBQztnQkFFTCxDQUFDO2dCQUVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkgsQ0FBQztZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUNsRixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBRTlGLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO29CQUMvQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ2hJLENBQUM7Z0JBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCO3VCQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBRTFELEtBQUssSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDO3dCQUN6RSxJQUFJLFNBQVMsQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDOzRCQUM1QyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0NBQy9DLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDOzRCQUMzRixDQUFDO2lDQUFNLENBQUM7Z0NBQ0osU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7NEJBQzNGLENBQUM7d0JBQ0wsQ0FBQztvQkFDTCxDQUFDO2dCQUNMLENBQUM7WUFDTCxDQUFDO1lBRUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFFRCxzQ0FBc0M7UUFDdEMsbUNBQW1DO1FBQ25DLHFDQUFxQztRQUNyQyx3RUFBd0U7SUFDNUUsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJQ2VsbFJlbmRlcmVyQW5ndWxhckNvbXB9IGZyb20gXCJhZy1ncmlkLWFuZ3VsYXJcIjtcclxuaW1wb3J0IHtVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtQ29udHJvbCwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9yc30gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcycgcHVycG9zZSBpcyB0byBwbGFjZSBGb3JtQ29udHJvbHMgb24gY2VsbHMgaW4gdGhlIGdyaWQsIGFuZCB0byBsaW5rIHRoZW0gYnkgcm93cywgYW5kIHJvd3MgdG8gdGhlIGdyaWQgYXMgYSB3aG9sZS5cclxuICogSXQgYWxsb3dzIHlvdSB0byBhZGQgdmFsaWRhdG9ycyBmb3IgYSBjZWxscycgdmFsdWUgYW5kIGxpbmsgYW4gZXJyb3IgdHlwZSB0byBhbiBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gYSB0b29sdGlwLCBvclxyXG4gKiB5b3UgY2FuIHByb3ZpZGUgYSBmdW5jdGlvbiB0byB0ZXN0IHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJvdyBhbmQgcHJvdmlkZSBhbiBlcnJvciBtZXNzYWdlLlxyXG4gKlxyXG4gKiBUaGUgY2xhc3Mgd29ya3Mgb2ZmIG9mIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMgYWRkZWQgdG8gdGhlIGNvbHVtbkRlZnMgaW4gdGhlIGFnLWdyaWQuXHJcbiAqXHJcbiAqIFdlIGFyZSBsb29raW5nIGZvciB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XHJcbiAqICAgMS4gZXJyb3JNZXNzYWdlSGVhZGVyIDogYSBzdHJpbmcgdG8gZGlzcGxheSBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0IG9mIGFueSBlcnJvcnMgZm91bmQgZm9yIHRoZSBjZWxsXHJcbiAqICAgMi4gdmFsaWRhdG9ycyA6IGFuIGFycmF5IG9mIGFuZ3VsYXIgdmFsaWRhdG9ycyB0byBkZXNjcmliZSB0aGUgY2VsbCB2YWx1ZVxyXG4gKiAgIDMuIGVycm9yTmFtZUVycm9yTWVzc2FnZU1hcCA6IGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBcImVycm9yTmFtZVwicyBhbmQgXCJlcnJvck1lc3NhZ2VcInMgdGhhdCBhcmUgdXNlZCB0byBjcmVhdGUgYSBkaXNwbGF5ZWQgbGlzdCBmb3IgdGhlIHVzZXJcclxuICogICA0LiBzZXRFcnJvcnM6IGEgZnVuY3Rpb24gd2l0aCB0aGUgc2lnbmF0dXJlOlxyXG4gKiAgICAgICAgICAgICAgICAgKHZhbHVlOiBhbnksIGRhdGE6IGFueSwgbm9kZTogYW55LCBjb2xEZWY6IGFueSwgcm93SW5kZXg6IGFueSwgZ3JpZEFwaTogYW55KSA9PiBzdHJpbmdcclxuICogICAgICAgICAgICAgICAgIHdoaWNoIGlzIGNhbGxlZCB0byBnZW5lcmF0ZSBhIGN1c3RvbSBlcnJvciBtZXNzYWdlLCBpZiBuZWVkZWQuIEFuIGVtcHR5IG9yIG51bGwgc3RyaW5nXHJcbiAqICAgICAgICAgICAgICAgICBpcyB0cmVhdGVkIGFzIG5vdCBiZWluZyBhbiBlcnJvci5cclxuICpcclxuICogRXhhbXBsZSBjb2x1bW4gZGVmaW5pdGlvbjpcclxuICogICAgICB7XHJcbiAqICAgICAgICAgIGhlYWRlck5hbWU6IFwiTmFtZVwiLFxyXG4gKiAgICAgICAgICBlZGl0YWJsZTogZmFsc2UsXHJcbiAqICAgICAgICAgIHdpZHRoOiA2MDAsXHJcbiAqICAgICAgICAgIGNlbGxSZW5kZXJlckZyYW1ld29yazogVGV4dEFsaWduTGVmdE1pZGRsZVJlbmRlcmVyLFxyXG4gKiAgICAgICAgICBzZXRFcnJvcnM6ICh2YWx1ZTogYW55LFxyXG4gKiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBhbnksXHJcbiAqICAgICAgICAgICAgICAgICAgICAgIG5vZGU6IGFueSxcclxuICogICAgICAgICAgICAgICAgICAgICAgY29sRGVmOiBhbnksXHJcbiAqICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiBhbnksXHJcbiAqICAgICAgICAgICAgICAgICAgICAgIGdyaWRBcGk6IGFueSkgPT4ge1xyXG4gKiAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSAmJiB2YWx1ZSA9PT0gJ1RFU1QnKSA/ICdJbnZhbGlkIG5hbWUnIDogJyc7XHJcbiAqICAgICAgICAgIH0sXHJcbiAqICAgICAgICAgIHZhbGlkYXRvcnM6IFsgVmFsaWRhdG9ycy5taW5MZW5ndGgoMTApIF0sXHJcbiAqICAgICAgICAgIGVycm9yTWVzc2FnZUhlYWRlcjogJ1Rlc3RpbmdUZXN0aW5nVGVzdGluZycsXHJcbiAqICAgICAgICAgIGVycm9yTmFtZUVycm9yTWVzc2FnZU1hcDogW1xyXG4gKiAgICAgICAgICAgICAgeyBlcnJvck5hbWU6ICdtaW5sZW5ndGgnLCBlcnJvck1lc3NhZ2U6ICdOYW1lIGlzIHRvbyBzaG9ydCcgfVxyXG4gKiAgICAgICAgICBdLFxyXG4gKiAgICAgICAgICBmaWVsZDogXCJuYW1lXCJcclxuICogICAgICB9XHJcbiAqXHJcbiAqIFRvIHVzZSB3aXRoIGEgbmV3IHJlbmRlcmVyLCBleHRlbmQgdGhpcyBjbGFzcywgZG8gbm90IG92ZXJyaWRlIGFnSW5pdCwgb3IgY2FsbCBzdXBlci5hZ0luaXQocGFyYW1zKSBmaXJzdC5cclxuICogKFlvdSBjYW4gdXNlIGFnSW5pdDIgaW5zdGVhZCwgY2FsbGVkIHJpZ2h0IGFmdGVyIGFnSW5pdCkuXHJcbiAqXHJcbiAqIFRvIGRpc3BsYXkgYSB0b29sdGlwIHdpdGggdGhlIGVycm9yIG1lc3NhZ2VzLCBpbmNsdWRlIGFuIGVsZW1lbnQgd2l0aCBhIG1hdFRvb2x0aXAgcG9pbnRpbmcgdG8gdGhpcy5lcnJvck1lc3NhZ2UsIGxpa2U6XHJcbiAqICAgICAgPGRpdiBbbWF0VG9vbHRpcF09XCJ0aGlzLmVycm9yTWVzc2FnZVwiIFttYXRUb29sdGlwU2hvd0RlbGF5XT1cIjMwMFwiIFttYXRUb29sdGlwSGlkZURlbGF5XT1cIjMwMFwiIC4uLlxyXG4gKiBGb3IgY2VsbCBoaWdobGlnaHRpbmcsIHlvdSBjYW4gYWRkIGEgQ1NTIGNsYXNzIHNvbWV0aGluZyBsaWtlIDpcclxuICogICAgICAuZXJyb3Ige1xyXG4gKiAgICAgIFx0YmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHJnYmEoMjU1LDAsMCwwLjI1KSwgcmdiYSgyNTUsMCwwLDAuMjUpLCByZ2JhKDI1NSwwLDAsMC4yNSkpO1xyXG4gKiAgICAgIFx0Ym9yZGVyOiBzb2xpZCByZWQgMnB4O1xyXG4gKiAgICAgIH1cclxuICogICBhbmQgYSBjb25kaXRpb25hbCBjbGFzcyBvbiBhbiBlbGVtZW50IGluIHRoZSB0ZW1wbGF0ZSwgbGlrZSA6XHJcbiAqICAgICAgY2xhc3M9XCJ7e3RoaXMuZXJyb3JNZXNzYWdlICYmIHRoaXMuZXJyb3JNZXNzYWdlICE9PSAnJyA/ICdlcnJvcicgOiAnJ319XCJcclxuICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDZWxsUmVuZGVyZXJWYWxpZGF0aW9uIGltcGxlbWVudHMgSUNlbGxSZW5kZXJlckFuZ3VsYXJDb21wIHtcclxuXHJcbiAgICBwcm90ZWN0ZWQgcGFyYW1zOiBhbnk7XHJcblxyXG4gICAgcHVibGljIGVycm9yTWVzc2FnZTogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyO1xyXG5cclxuICAgIGFnSW5pdChwYXJhbXM6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xyXG4gICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIgPSBuZXcgVW50eXBlZEZvcm1CdWlsZGVyKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtc1xyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaVxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwID09PSB1bmRlZmluZWQpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBmb3VuZERlbGF5VmFsaWRhdGlvblByb3BlcnR5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBjb2x1bW5EZWYgb2YgcGFyYW1zLm5vZGUuZ3JpZEFwaS5jb2x1bW5Db250cm9sbGVyLmNvbHVtbkRlZnMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5EZWYuZGVsYXlWYWxpZGF0aW9uICYmIGNvbHVtbkRlZi5kZWxheVZhbGlkYXRpb24gPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3VuZERlbGF5VmFsaWRhdGlvblByb3BlcnR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFmb3VuZERlbGF5VmFsaWRhdGlvblByb3BlcnR5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRldGVybWluZUlmQWxsUm93c05lZWRWYWxpZGF0aW9uSW5BZHZhbmNlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUFsbEZvcm1Db250cm9scygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdldEVycm9yTWVzc2FnZSgpO1xyXG5cclxuICAgICAgICB0aGlzLmFnSW5pdDIocGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBhYnN0cmFjdCBhZ0luaXQyKHBhcmFtcyk6IHZvaWQ7XHJcblxyXG5cclxuICAgIHJlZnJlc2gocGFyYW1zOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpdGVyYXRlcyBvdmVyIGV2ZXJ5IGNlbGwgaW4gdGhlIGdyaWQgYW5kIHByZXBhcmVzIGFsbCB0aGVpciBuZWVkZWQgZm9ybUdyb3VwcyBhbmQgZm9ybUNvbnRyb2xzLlxyXG4gICAgLy9cclxuICAgIC8vIFRoaXMgd2FzIGRvbmUgdGhpcyB3YXkgKGluIHRoZSBjZWxsIHJlbmRlcmVyKSBmb3IgdGhyZWUgcmVhc29ucyA6XHJcbiAgICAvLyAgIDEuIFdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgY29sdW1uIGFuZCByb3cgZGF0YSBoYXZlIGJlZW4gcHJvdmlkZWQgdG8gdGhlIGdyaWRcclxuICAgIC8vICAgMi4gV2UgZG9uJ3Qgd2FudCB0aGUgcHJvZ3JhbW1lciB0byBoYXZlIHRvIGltcGxlbWVudCBpdCB0aGVtc2VsdmVzIGV2ZXJ5IHRpbWUgdGhleSBjcmVhdGUgYSBncmlkXHJcbiAgICAvLyAgIDMuIFRoZSBncmlkIGRvZXMgbm90IGNyZWF0ZSBhbGwgdGhlIGNlbGwgcmVuZGVyZXJzIGluIGFkdmFuY2UsIGp1c3QgdGhvc2UgdGhhdCBmaXQgb24gdGhlIHNjcmVlblxyXG4gICAgLy8gICAgICAocGx1cyBhIGZldyBuZWFyYnkpIG1lYW5pbmcgd2UgY2FuJ3QganVzdCB1c2UgdGhlIGNlbGwgcmVuZGVyZXIncyBjb25zdHJ1Y3Rvciwgc2luY2Ugd2UgZG9uJ3RcclxuICAgIC8vICAgICAga25vdyBpZiB0aGUgaW5mb3JtYXRpb24gd2Ugc3RhcnQgd2l0aCBpcyB2YWxpZCBvbiBldmVyeSBzY3JlZW4sIGFuZCBiZWNhdXNlIHdlIGhhdmUgc29tZSBjYWxsc1xyXG4gICAgLy8gICAgICB0aGF0IHNlbmQgYmFjayB0aGUgZW50aXJlIGdyaWQncyB3b3J0aCBvZiBkYXRhLlxyXG4gICAgLy9cclxuICAgIC8vIFRoZXJlIG1heSBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcywgaW4gd2hpY2ggY2FzZSB0aGlzIHNob3VsZCBwcm9iYWJseSBiZSByZXBsYWNlZCFcclxuICAgIGNyZWF0ZUFsbEZvcm1Db250cm9scygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJhbXNcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMuY29sdW1uXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLmNvbHVtbi5jb2xEZWZcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMuZGF0YVxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaVxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ2V0TW9kZWwoKSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXJcclxuICAgICAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuZ3JpZE9wdGlvbnNcclxuICAgICAgICAgICAgICAgICYmICF0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLl9ldmVudHNDaGFuZ2VkQnlDZWxsUmVuZGVyZXJWYWxpZGF0aW9uKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VHcmlkT3B0aW9uc0V2ZW50cygpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuZ3JpZE9wdGlvbnMuX2V2ZW50c0NoYW5nZWRCeUNlbGxSZW5kZXJlclZhbGlkYXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgYWxsTm9kZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkubW9kZV9uZWVkVG9WYWxpZGF0ZU9ubHlSZW5kZXJlZENlbGxzKSB7XHJcbiAgICAgICAgICAgICAgICBhbGxOb2RlcyA9IHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5nZXRSZW5kZXJlZE5vZGVzKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhbGxOb2RlcyA9IHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5nZXRNb2RlbCgpLnJvd3NUb0Rpc3BsYXk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cFxyXG4gICAgICAgICAgICAgICAgfHwgKHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXBcclxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwLmNvbnRyb2xzXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cC5jb250cm9scy5sZW5ndGggIT0gYWxsTm9kZXMubGVuZ3RoKSkge1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXAgPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh7fSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuY29sdW1uQ29udHJvbGxlclxyXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmNvbHVtbkNvbnRyb2xsZXIuY29sdW1uRGVmcykge1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGNvbHVtbkRlZiBvZiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuY29sdW1uQ29udHJvbGxlci5jb2x1bW5EZWZzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkRlZi5vdXRlckZvcm0gJiYgY29sdW1uRGVmLmZvcm1OYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29sdW1uRGVmLm91dGVyRm9ybS5nZXQoY29sdW1uRGVmLmZvcm1OYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uRGVmLm91dGVyRm9ybS5hZGRDb250cm9sKGNvbHVtbkRlZi5mb3JtTmFtZSwgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5EZWYub3V0ZXJGb3JtLnNldENvbnRyb2woY29sdW1uRGVmLmZvcm1OYW1lLCB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGNvbHVtbnM6IGFueVtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyYW1zICYmIHRoaXMucGFyYW1zLmNvbHVtbkFwaSAmJiB0aGlzLnBhcmFtcy5jb2x1bW5BcGkuY29sdW1uQ29udHJvbGxlcikge1xyXG4gICAgICAgICAgICAgICAgY29sdW1ucyA9IHRoaXMucGFyYW1zLmNvbHVtbkFwaS5jb2x1bW5Db250cm9sbGVyLmdyaWRDb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5jb2xEZWZcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29sdW1uLmNvbERlZi5maWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiAoY29sdW1uLmNvbERlZi52YWxpZGF0b3JzIHx8IGNvbHVtbi5jb2xEZWYuc2V0RXJyb3JzKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBub2RlIG9mIGFsbE5vZGVzKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjb2x1bW4gb2YgY29sdW1ucykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uY29sRGVmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbHVtbi5jb2xEZWYuZmllbGRcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNvbHVtbi5jb2xEZWYudmFsaWRhdG9ycyB8fCBjb2x1bW4uY29sRGVmLnNldEVycm9ycykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVtjb2x1bW4uY29sRGVmLmZpZWxkICsgXCJfZXJyb3JNZXNzYWdlXCJdID0gJyc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9ybUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woY29sdW1uLmNvbERlZi5maWVsZCArICdfZm9ybUNvbnRyb2wnLCBbXSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUuZm9ybUdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmZvcm1Hcm91cCA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHt9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5mb3JtR3JvdXAuYWRkQ29udHJvbChjb2x1bW4uY29sRGVmLmZpZWxkICsgJ19mb3JtQ29udHJvbCcsIGZvcm1Db250cm9sKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb2x1bW4uY29sRGVmLnZhbGlkYXRvcnMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uY29sRGVmLnZhbGlkYXRvcnMgPSBbY29sdW1uLmNvbERlZi52YWxpZGF0b3JzXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhjb2x1bW4uY29sRGVmLnZhbGlkYXRvcnMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVFcnJvck1lc3NhZ2UoZm9ybUNvbnRyb2wsIG5vZGUsIGNvbHVtbi5jb2xEZWYpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXAuY29udGFpbnMoJ1Jvd0dyb3VwXycgKyBub2RlLnJvd0luZGV4KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9kZS5mb3JtR3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5mb3JtR3JvdXAgPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh7fSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXAuYWRkQ29udHJvbCgnUm93R3JvdXBfJyArIG5vZGUucm93SW5kZXgsIG5vZGUuZm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoYW5nZUdyaWRPcHRpb25zRXZlbnRzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5wYXJhbXNcclxuICAgICAgICAgICAgfHwgIXRoaXMucGFyYW1zLm5vZGVcclxuICAgICAgICAgICAgfHwgIXRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaVxyXG4gICAgICAgICAgICB8fCAhdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlclxyXG4gICAgICAgICAgICB8fCAhdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5vblJvd0RhdGFDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuZ3JpZE9wdGlvbnMub25Sb3dEYXRhQ2hhbmdlZDIgPSB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLm9uUm93RGF0YUNoYW5nZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLm9uUm93RGF0YUNoYW5nZWQgPSAoKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVBbGxGb3JtQ29udHJvbHMoKTtcclxuICAgICAgICAgICAgdGhpcy5mZXRjaEVycm9yTWVzc2FnZXNGb3JDdXJyZW50bHlSZW5kZXJlZENlbGxzKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5vblJvd0RhdGFDaGFuZ2VkMikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5vblJvd0RhdGFDaGFuZ2VkMihldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLm9uR3JpZENvbHVtbnNDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuZ3JpZE9wdGlvbnMub25HcmlkQ29sdW1uc0NoYW5nZWQyID0gdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5vbkdyaWRDb2x1bW5zQ2hhbmdlZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuZ3JpZE9wdGlvbnMub25HcmlkQ29sdW1uc0NoYW5nZWQgPSAoKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5kZXRlcm1pbmVJZkFsbFJvd3NOZWVkVmFsaWRhdGlvbkluQWR2YW5jZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFsbEZvcm1Db250cm9scygpO1xyXG4gICAgICAgICAgICB0aGlzLmZldGNoRXJyb3JNZXNzYWdlc0ZvckN1cnJlbnRseVJlbmRlcmVkQ2VsbHMoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLm9uR3JpZENvbHVtbnNDaGFuZ2VkMikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5vbkdyaWRDb2x1bW5zQ2hhbmdlZDIoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRFcnJvck1lc3NhZ2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLm5vZGVcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZS5mb3JtR3JvdXBcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMuY29sdW1uXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLmNvbHVtbi5jb2xEZWZcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZi5maWVsZCkge1xyXG5cclxuICAgICAgICAgICAgbGV0IGZvcm1Db250cm9sID0gdGhpcy5wYXJhbXMubm9kZS5mb3JtR3JvdXAuZ2V0KHRoaXMucGFyYW1zLmNvbHVtbi5jb2xEZWYuZmllbGQgKyAnX2Zvcm1Db250cm9sJyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVycm9yTWVzc2FnZShmb3JtQ29udHJvbCwgdGhpcy5wYXJhbXMubm9kZSwgdGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IHRoaXMucGFyYW1zLm5vZGVbdGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZi5maWVsZCArIFwiX2Vycm9yTWVzc2FnZVwiXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWZyZXNoRm9ybUNvbnRyb2xWYWx1ZShmb3JtQ29udHJvbDogVW50eXBlZEZvcm1Db250cm9sLCBkYXRhOiBhbnksIGZpZWxkTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGZvcm1Db250cm9sICYmIGRhdGEgJiYgZmllbGROYW1lICYmIGRhdGFbZmllbGROYW1lXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGZvcm1Db250cm9sLnNldFZhbHVlKGRhdGFbZmllbGROYW1lXSk7XHJcbiAgICAgICAgICAgIGZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVFcnJvck1lc3NhZ2UoZm9ybUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCwgbm9kZTogYW55LCBjb2x1bW5EZWZpbml0aW9uOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICghZm9ybUNvbnRyb2wgfHwgIW5vZGUgfHwgIWNvbHVtbkRlZmluaXRpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGN1c3RvbUVycm9yTWVzc2FnZTogc3RyaW5nID0gJyc7XHJcblxyXG4gICAgICAgIGlmIChjb2x1bW5EZWZpbml0aW9uLnNldEVycm9ycykge1xyXG4gICAgICAgICAgICBjdXN0b21FcnJvck1lc3NhZ2UgPSBjb2x1bW5EZWZpbml0aW9uLnNldEVycm9ycyhcclxuICAgICAgICAgICAgICAgIG5vZGUuZGF0YVtjb2x1bW5EZWZpbml0aW9uLmZpZWxkXSxcclxuICAgICAgICAgICAgICAgIG5vZGUuZGF0YSxcclxuICAgICAgICAgICAgICAgIG5vZGUsXHJcbiAgICAgICAgICAgICAgICBjb2x1bW5EZWZpbml0aW9uLFxyXG4gICAgICAgICAgICAgICAgbm9kZS5yb3dJbmRleCxcclxuICAgICAgICAgICAgICAgIG5vZGUuZ3JpZEFwaVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGVycm9yTWVzc2FnZU5hbWU6IHN0cmluZyA9IGNvbHVtbkRlZmluaXRpb24uZmllbGQgKyBcIl9lcnJvck1lc3NhZ2VcIjtcclxuXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoRm9ybUNvbnRyb2xWYWx1ZShmb3JtQ29udHJvbCwgbm9kZS5kYXRhLCBjb2x1bW5EZWZpbml0aW9uLmZpZWxkKTtcclxuXHJcbiAgICAgICAgbm9kZVtlcnJvck1lc3NhZ2VOYW1lXSA9ICcnO1xyXG5cclxuICAgICAgICBpZiAoZm9ybUNvbnRyb2wuaW52YWxpZCB8fCAoY3VzdG9tRXJyb3JNZXNzYWdlICYmIGN1c3RvbUVycm9yTWVzc2FnZSAhPT0gJycpKSB7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW5EZWZpbml0aW9uLmVycm9yTWVzc2FnZUhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgbm9kZVtlcnJvck1lc3NhZ2VOYW1lXSArPSAnJyArIGNvbHVtbkRlZmluaXRpb24uZXJyb3JNZXNzYWdlSGVhZGVyICsgJ1xcbic7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBub2RlW2Vycm9yTWVzc2FnZU5hbWVdICs9XHJcbiAgICAgICAgICAgICAgICAgICAgJ0ludmFsaWQgdmFsdWUgXCInICsgbm9kZS5kYXRhW2NvbHVtbkRlZmluaXRpb24uZmllbGRdICsgJ1wiIGZvciBmaWVsZCAoJyArIGNvbHVtbkRlZmluaXRpb24uZmllbGQgKyAnKVxcbic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb2x1bW5EZWZpbml0aW9uLmVycm9yTmFtZUVycm9yTWVzc2FnZU1hcCkge1xyXG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29sdW1uRGVmaW5pdGlvbi5lcnJvck5hbWVFcnJvck1lc3NhZ2VNYXApKSB7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5EZWZpbml0aW9uLmVycm9yTmFtZUVycm9yTWVzc2FnZU1hcCA9IFtjb2x1bW5EZWZpbml0aW9uLmVycm9yTmFtZUVycm9yTWVzc2FnZU1hcF07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGVycm9yTmFtZUVycm9yTWVzc2FnZVBhaXIgb2YgY29sdW1uRGVmaW5pdGlvbi5lcnJvck5hbWVFcnJvck1lc3NhZ2VNYXApIHtcclxuICAgICAgICAgICAgICAgIGlmICghIWVycm9yTmFtZUVycm9yTWVzc2FnZVBhaXIuZXJyb3JOYW1lICYmICEhZXJyb3JOYW1lRXJyb3JNZXNzYWdlUGFpci5lcnJvck1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybUNvbnRyb2wuaGFzRXJyb3IoZXJyb3JOYW1lRXJyb3JNZXNzYWdlUGFpci5lcnJvck5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVbZXJyb3JNZXNzYWdlTmFtZV0gKz0gZXJyb3JOYW1lRXJyb3JNZXNzYWdlUGFpci5lcnJvck1lc3NhZ2UgKydcXG4nO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbm9kZVtlcnJvck1lc3NhZ2VOYW1lXSArPSBjdXN0b21FcnJvck1lc3NhZ2U7XHJcblxyXG4gICAgICAgIHJldHVybiBub2RlW2Vycm9yTWVzc2FnZU5hbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBkZXRlcm1pbmVJZkFsbFJvd3NOZWVkVmFsaWRhdGlvbkluQWR2YW5jZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJhbXNcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZVxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGlcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMuY29sdW1uQXBpXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLmNvbHVtbkFwaS5jb2x1bW5Db250cm9sbGVyXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLmNvbHVtbkFwaS5jb2x1bW5Db250cm9sbGVyLmdyaWRDb2x1bW5zKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgY29sdW1ucyA9IHRoaXMucGFyYW1zLmNvbHVtbkFwaS5jb2x1bW5Db250cm9sbGVyLmdyaWRDb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uLmNvbERlZlxyXG4gICAgICAgICAgICAgICAgICAgICYmIGNvbHVtbi5jb2xEZWYuZmllbGRcclxuICAgICAgICAgICAgICAgICAgICAmJiAoY29sdW1uLmNvbERlZi52YWxpZGF0b3JzIHx8IGNvbHVtbi5jb2xEZWYuc2V0RXJyb3JzKVxyXG4gICAgICAgICAgICAgICAgICAgICYmIGNvbHVtbi5jb2xEZWYuZWRpdGFibGUgPT09IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAmJiAhKGNvbHVtbi5jb2xEZWYudmFsaWRhdGVPbmx5UmVuZGVyZWRDZWxsc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBjb2x1bW4uY29sRGVmLnZhbGlkYXRlT25seVJlbmRlcmVkQ2VsbHMgPT09IHRydWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5tb2RlX25lZWRUb1ZhbGlkYXRlT25seVJlbmRlcmVkQ2VsbHMgPSBBcnJheS5pc0FycmF5KGNvbHVtbnMpICYmIGNvbHVtbnMubGVuZ3RoID09PSAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZmV0Y2hFcnJvck1lc3NhZ2VzRm9yQ3VycmVudGx5UmVuZGVyZWRDZWxscygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJhbXNcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZVxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBnZXRDZWxsUmVuZGVyZXJQYXJhbXM6IGFueSA9IHsgcm93Tm9kZXM6IHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5nZXRSZW5kZXJlZE5vZGVzKCkgfTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGNlbGxSZW5kZXJlciBvZiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ2V0Q2VsbFJlbmRlcmVySW5zdGFuY2VzKGdldENlbGxSZW5kZXJlclBhcmFtcykpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjZWxsUmVuZGVyZXIuX2FnQXdhcmVDb21wb25lbnQgJiYgY2VsbFJlbmRlcmVyLl9hZ0F3YXJlQ29tcG9uZW50LmdldEVycm9yTWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxSZW5kZXJlci5fYWdBd2FyZUNvbXBvbmVudC5nZXRFcnJvck1lc3NhZ2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlVmFsaWRhdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIlN1Y2Nlc3NmdWxseSByZWFjaGVkIVwiKTtcclxuICAgICAgICAvLyBhZGQgdGhpcyBmb3JtIGNvbnRyb2xcclxuXHJcbiAgICAgICAgbGV0IGNvbHVtbnMgPSB0aGlzLnBhcmFtcy5jb2x1bW5BcGkuY29sdW1uQ29udHJvbGxlci5ncmlkQ29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gY29sdW1uLmNvbERlZlxyXG4gICAgICAgICAgICAgICAgJiYgY29sdW1uLmNvbERlZi5maWVsZFxyXG4gICAgICAgICAgICAgICAgJiYgKGNvbHVtbi5jb2xEZWYudmFsaWRhdG9ycyB8fCBjb2x1bW4uY29sRGVmLnNldEVycm9ycylcclxuICAgICAgICAgICAgICAgICYmIGNvbHVtbi5jb2xEZWYuZmllbGQgPT09IHRoaXMucGFyYW1zLmZpZWxkO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wYXJhbXMuY29sRGVmXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLmNvbERlZi5maWVsZFxyXG4gICAgICAgICAgICAmJiAodGhpcy5wYXJhbXMuY29sRGVmLnZhbGlkYXRvcnMgfHwgdGhpcy5wYXJhbXMuY29sRGVmLnNldEVycm9ycykpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGVbdGhpcy5wYXJhbXMuY29sRGVmLmZpZWxkICsgXCJfZXJyb3JNZXNzYWdlXCJdID0gJyc7XHJcblxyXG4gICAgICAgICAgICBsZXQgZm9ybUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wodGhpcy5wYXJhbXMuY29sRGVmLmZpZWxkICsgJ19mb3JtQ29udHJvbCcsIFtdKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5wYXJhbXMubm9kZS5mb3JtR3JvdXApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZm9ybUdyb3VwID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe30pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXAgPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh7fSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBhbnkgcmVtb3ZlZCBub2RlcyAmIHJlbW92ZSB0aGVpciB2YWxpZGF0b3JzIGlmIG5lZWRlZC5cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjb250cm9sTmFtZSBvZiBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwLmNvbnRyb2xzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCcnICsgY29udHJvbE5hbWUpLnRvTG93ZXJDYXNlKCkuc3Vic3RyKDAsIDkpID09PSAncm93Z3JvdXBfJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBub2RlIG9mIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5nZXRNb2RlbCgpLnJvd3NUb0Rpc3BsYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCcnICsgbm9kZS5yb3dJbmRleCkgPT09ICgnJyArIGNvbnRyb2xOYW1lKS5zdWJzdHIoOSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cC5yZW1vdmVDb250cm9sKGNvbnRyb2xOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cC5hZGRDb250cm9sKCdSb3dHcm91cF8nICsgdGhpcy5wYXJhbXMubm9kZS5yb3dJbmRleCwgdGhpcy5wYXJhbXMubm9kZS5mb3JtR3JvdXApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMucGFyYW1zLm5vZGUuZm9ybUdyb3VwLmNvbnRyb2xzW3RoaXMucGFyYW1zLmNvbERlZi5maWVsZCArICdfZm9ybUNvbnRyb2wnXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5mb3JtR3JvdXAuYWRkQ29udHJvbCh0aGlzLnBhcmFtcy5jb2xEZWYuZmllbGQgKyAnX2Zvcm1Db250cm9sJywgZm9ybUNvbnRyb2wpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMucGFyYW1zLmNvbERlZi52YWxpZGF0b3JzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZm9ybUdyb3VwLmNvbnRyb2xzW3RoaXMucGFyYW1zLmNvbERlZi5maWVsZCArICdfZm9ybUNvbnRyb2wnXS5zZXRWYWxpZGF0b3JzKHRoaXMucGFyYW1zLmNvbERlZi52YWxpZGF0b3JzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmNvbHVtbkNvbnRyb2xsZXJcclxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuY29sdW1uQ29udHJvbGxlci5jb2x1bW5EZWZzKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNvbHVtbkRlZiBvZiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuY29sdW1uQ29udHJvbGxlci5jb2x1bW5EZWZzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5EZWYub3V0ZXJGb3JtICYmIGNvbHVtbkRlZi5mb3JtTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2x1bW5EZWYub3V0ZXJGb3JtLmdldChjb2x1bW5EZWYuZm9ybU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uRGVmLm91dGVyRm9ybS5hZGRDb250cm9sKGNvbHVtbkRlZi5mb3JtTmFtZSwgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkRlZi5vdXRlckZvcm0uc2V0Q29udHJvbChjb2x1bW5EZWYuZm9ybU5hbWUsIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVycm9yTWVzc2FnZShmb3JtQ29udHJvbCwgdGhpcy5wYXJhbXMubm9kZSwgdGhpcy5wYXJhbXMuY29sRGVmKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGFkZCBjb2x1bW4gY29udHJvbCBncm91cHMgaWYgbmVlZGVkXHJcbiAgICAgICAgLy8gYWRkIHJvdyBjb250cm9sIGdyb3VwcyBpZiBuZWVkZWRcclxuICAgICAgICAvLyBzZXR1cCBncmlkIGNvbnRyb2wgZ3JvdXAgaWYgbmVlZGVkXHJcbiAgICAgICAgLy8gTWlnaHQgbmVlZCB0byB0cmlnZ2VyIGNlbGwgdmFsaWRhdGlvbiB0byBydW4gd2l0aCB0aGUgbmV3IHZhbGlkYXRpb24uXHJcbiAgICB9XHJcbn1cclxuIl19
344
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC1yZW5kZXJlci12YWxpZGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZGljdGlvbmFyeS1lZGl0b3Ivc3JjL2dyaWQtcmVuZGVyZXJzL2NlbGwtcmVuZGVyZXItdmFsaWRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrREc7QUFDSCxNQUFNLE9BQWdCLHNCQUFzQjtJQUE1QztRQUVXLGlCQUFZLEdBQVcsRUFBRSxDQUFDO0lBK1ZyQyxDQUFDO0lBN1ZHLE1BQU0sQ0FBQyxNQUFXO1FBQ2QsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLElBQUksSUFBSSxDQUFDLE1BQU07ZUFDUixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7ZUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTztlQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBRXRELElBQUksNEJBQTRCLEdBQVksS0FBSyxDQUFDO1lBQ2xELEtBQUssSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3BFLElBQUksU0FBUyxDQUFDLGVBQWUsSUFBSSxTQUFTLENBQUMsZUFBZSxLQUFLLElBQUksRUFBRSxDQUFDO29CQUNsRSw0QkFBNEIsR0FBRyxJQUFJLENBQUM7Z0JBQ3hDLENBQUM7WUFDTCxDQUFDO1lBQ0QsSUFBSSxDQUFDLDRC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ckNvbXB9IGZyb20gXCJhZy1ncmlkLWFuZ3VsYXJcIjtcclxuaW1wb3J0IHtGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yc30gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzJyBwdXJwb3NlIGlzIHRvIHBsYWNlIEZvcm1Db250cm9scyBvbiBjZWxscyBpbiB0aGUgZ3JpZCwgYW5kIHRvIGxpbmsgdGhlbSBieSByb3dzLCBhbmQgcm93cyB0byB0aGUgZ3JpZCBhcyBhIHdob2xlLlxyXG4gKiBJdCBhbGxvd3MgeW91IHRvIGFkZCB2YWxpZGF0b3JzIGZvciBhIGNlbGxzJyB2YWx1ZSBhbmQgbGluayBhbiBlcnJvciB0eXBlIHRvIGFuIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBhIHRvb2x0aXAsIG9yXHJcbiAqIHlvdSBjYW4gcHJvdmlkZSBhIGZ1bmN0aW9uIHRvIHRlc3Qgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcm93IGFuZCBwcm92aWRlIGFuIGVycm9yIG1lc3NhZ2UuXHJcbiAqXHJcbiAqIFRoZSBjbGFzcyB3b3JrcyBvZmYgb2YgYSBudW1iZXIgb2YgcHJvcGVydGllcyBhZGRlZCB0byB0aGUgY29sdW1uRGVmcyBpbiB0aGUgYWctZ3JpZC5cclxuICpcclxuICogV2UgYXJlIGxvb2tpbmcgZm9yIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcclxuICogICAxLiBlcnJvck1lc3NhZ2VIZWFkZXIgOiBhIHN0cmluZyB0byBkaXNwbGF5IGF0IHRoZSB0b3Agb2YgdGhlIGxpc3Qgb2YgYW55IGVycm9ycyBmb3VuZCBmb3IgdGhlIGNlbGxcclxuICogICAyLiB2YWxpZGF0b3JzIDogYW4gYXJyYXkgb2YgYW5ndWxhciB2YWxpZGF0b3JzIHRvIGRlc2NyaWJlIHRoZSBjZWxsIHZhbHVlXHJcbiAqICAgMy4gZXJyb3JOYW1lRXJyb3JNZXNzYWdlTWFwIDogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIFwiZXJyb3JOYW1lXCJzIGFuZCBcImVycm9yTWVzc2FnZVwicyB0aGF0IGFyZSB1c2VkIHRvIGNyZWF0ZSBhIGRpc3BsYXllZCBsaXN0IGZvciB0aGUgdXNlclxyXG4gKiAgIDQuIHNldEVycm9yczogYSBmdW5jdGlvbiB3aXRoIHRoZSBzaWduYXR1cmU6XHJcbiAqICAgICAgICAgICAgICAgICAodmFsdWU6IGFueSwgZGF0YTogYW55LCBub2RlOiBhbnksIGNvbERlZjogYW55LCByb3dJbmRleDogYW55LCBncmlkQXBpOiBhbnkpID0+IHN0cmluZ1xyXG4gKiAgICAgICAgICAgICAgICAgd2hpY2ggaXMgY2FsbGVkIHRvIGdlbmVyYXRlIGEgY3VzdG9tIGVycm9yIG1lc3NhZ2UsIGlmIG5lZWRlZC4gQW4gZW1wdHkgb3IgbnVsbCBzdHJpbmdcclxuICogICAgICAgICAgICAgICAgIGlzIHRyZWF0ZWQgYXMgbm90IGJlaW5nIGFuIGVycm9yLlxyXG4gKlxyXG4gKiBFeGFtcGxlIGNvbHVtbiBkZWZpbml0aW9uOlxyXG4gKiAgICAgIHtcclxuICogICAgICAgICAgaGVhZGVyTmFtZTogXCJOYW1lXCIsXHJcbiAqICAgICAgICAgIGVkaXRhYmxlOiBmYWxzZSxcclxuICogICAgICAgICAgd2lkdGg6IDYwMCxcclxuICogICAgICAgICAgY2VsbFJlbmRlcmVyOiBUZXh0QWxpZ25MZWZ0TWlkZGxlUmVuZGVyZXIsXHJcbiAqICAgICAgICAgIHNldEVycm9yczogKHZhbHVlOiBhbnksXHJcbiAqICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGFueSxcclxuICogICAgICAgICAgICAgICAgICAgICAgbm9kZTogYW55LFxyXG4gKiAgICAgICAgICAgICAgICAgICAgICBjb2xEZWY6IGFueSxcclxuICogICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IGFueSxcclxuICogICAgICAgICAgICAgICAgICAgICAgZ3JpZEFwaTogYW55KSA9PiB7XHJcbiAqICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlICYmIHZhbHVlID09PSAnVEVTVCcpID8gJ0ludmFsaWQgbmFtZScgOiAnJztcclxuICogICAgICAgICAgfSxcclxuICogICAgICAgICAgdmFsaWRhdG9yczogWyBWYWxpZGF0b3JzLm1pbkxlbmd0aCgxMCkgXSxcclxuICogICAgICAgICAgZXJyb3JNZXNzYWdlSGVhZGVyOiAnVGVzdGluZ1Rlc3RpbmdUZXN0aW5nJyxcclxuICogICAgICAgICAgZXJyb3JOYW1lRXJyb3JNZXNzYWdlTWFwOiBbXHJcbiAqICAgICAgICAgICAgICB7IGVycm9yTmFtZTogJ21pbmxlbmd0aCcsIGVycm9yTWVzc2FnZTogJ05hbWUgaXMgdG9vIHNob3J0JyB9XHJcbiAqICAgICAgICAgIF0sXHJcbiAqICAgICAgICAgIGZpZWxkOiBcIm5hbWVcIlxyXG4gKiAgICAgIH1cclxuICpcclxuICogVG8gdXNlIHdpdGggYSBuZXcgcmVuZGVyZXIsIGV4dGVuZCB0aGlzIGNsYXNzLCBkbyBub3Qgb3ZlcnJpZGUgYWdJbml0LCBvciBjYWxsIHN1cGVyLmFnSW5pdChwYXJhbXMpIGZpcnN0LlxyXG4gKiAoWW91IGNhbiB1c2UgYWdJbml0MiBpbnN0ZWFkLCBjYWxsZWQgcmlnaHQgYWZ0ZXIgYWdJbml0KS5cclxuICpcclxuICogVG8gZGlzcGxheSBhIHRvb2x0aXAgd2l0aCB0aGUgZXJyb3IgbWVzc2FnZXMsIGluY2x1ZGUgYW4gZWxlbWVudCB3aXRoIGEgbWF0VG9vbHRpcCBwb2ludGluZyB0byB0aGlzLmVycm9yTWVzc2FnZSwgbGlrZTpcclxuICogICAgICA8ZGl2IFttYXRUb29sdGlwXT1cInRoaXMuZXJyb3JNZXNzYWdlXCIgW21hdFRvb2x0aXBTaG93RGVsYXldPVwiMzAwXCIgW21hdFRvb2x0aXBIaWRlRGVsYXldPVwiMzAwXCIgLi4uXHJcbiAqIEZvciBjZWxsIGhpZ2hsaWdodGluZywgeW91IGNhbiBhZGQgYSBDU1MgY2xhc3Mgc29tZXRoaW5nIGxpa2UgOlxyXG4gKiAgICAgIC5lcnJvciB7XHJcbiAqICAgICAgXHRiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQocmdiYSgyNTUsMCwwLDAuMjUpLCByZ2JhKDI1NSwwLDAsMC4yNSksIHJnYmEoMjU1LDAsMCwwLjI1KSk7XHJcbiAqICAgICAgXHRib3JkZXI6IHNvbGlkIHJlZCAycHg7XHJcbiAqICAgICAgfVxyXG4gKiAgIGFuZCBhIGNvbmRpdGlvbmFsIGNsYXNzIG9uIGFuIGVsZW1lbnQgaW4gdGhlIHRlbXBsYXRlLCBsaWtlIDpcclxuICogICAgICBjbGFzcz1cInt7dGhpcy5lcnJvck1lc3NhZ2UgJiYgdGhpcy5lcnJvck1lc3NhZ2UgIT09ICcnID8gJ2Vycm9yJyA6ICcnfX1cIlxyXG4gKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENlbGxSZW5kZXJlclZhbGlkYXRpb24gaW1wbGVtZW50cyBJQ2VsbFJlbmRlcmVyQW5ndWxhckNvbXAge1xyXG4gICAgcHJvdGVjdGVkIHBhcmFtczogYW55O1xyXG4gICAgcHVibGljIGVycm9yTWVzc2FnZTogc3RyaW5nID0gXCJcIjtcclxuICAgIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcjtcclxuICAgIGFnSW5pdChwYXJhbXM6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xyXG4gICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIgPSBuZXcgRm9ybUJ1aWxkZXIoKTtcclxuICAgICAgICBpZiAodGhpcy5wYXJhbXNcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZVxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGlcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cCA9PT0gdW5kZWZpbmVkKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgZm91bmREZWxheVZhbGlkYXRpb25Qcm9wZXJ0eTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBjb2x1bW5EZWYgb2YgcGFyYW1zLm5vZGUuZ3JpZEFwaS5jb2x1bW5Db250cm9sbGVyLmNvbHVtbkRlZnMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5EZWYuZGVsYXlWYWxpZGF0aW9uICYmIGNvbHVtbkRlZi5kZWxheVZhbGlkYXRpb24gPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3VuZERlbGF5VmFsaWRhdGlvblByb3BlcnR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWZvdW5kRGVsYXlWYWxpZGF0aW9uUHJvcGVydHkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGV0ZXJtaW5lSWZBbGxSb3dzTmVlZFZhbGlkYXRpb25JbkFkdmFuY2UoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQWxsRm9ybUNvbnRyb2xzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nZXRFcnJvck1lc3NhZ2UoKTtcclxuICAgIH1cclxuICAgIHJlZnJlc2gocGFyYW1zOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGl0ZXJhdGVzIG92ZXIgZXZlcnkgY2VsbCBpbiB0aGUgZ3JpZCBhbmQgcHJlcGFyZXMgYWxsIHRoZWlyIG5lZWRlZCBmb3JtR3JvdXBzIGFuZCBmb3JtQ29udHJvbHMuXHJcbiAgICAvL1xyXG4gICAgLy8gVGhpcyB3YXMgZG9uZSB0aGlzIHdheSAoaW4gdGhlIGNlbGwgcmVuZGVyZXIpIGZvciB0aHJlZSByZWFzb25zIDpcclxuICAgIC8vICAgMS4gV2UgbmVlZCB0byB3YWl0IHVudGlsIHRoZSBjb2x1bW4gYW5kIHJvdyBkYXRhIGhhdmUgYmVlbiBwcm92aWRlZCB0byB0aGUgZ3JpZFxyXG4gICAgLy8gICAyLiBXZSBkb24ndCB3YW50IHRoZSBwcm9ncmFtbWVyIHRvIGhhdmUgdG8gaW1wbGVtZW50IGl0IHRoZW1zZWx2ZXMgZXZlcnkgdGltZSB0aGV5IGNyZWF0ZSBhIGdyaWRcclxuICAgIC8vICAgMy4gVGhlIGdyaWQgZG9lcyBub3QgY3JlYXRlIGFsbCB0aGUgY2VsbCByZW5kZXJlcnMgaW4gYWR2YW5jZSwganVzdCB0aG9zZSB0aGF0IGZpdCBvbiB0aGUgc2NyZWVuXHJcbiAgICAvLyAgICAgIChwbHVzIGEgZmV3IG5lYXJieSkgbWVhbmluZyB3ZSBjYW4ndCBqdXN0IHVzZSB0aGUgY2VsbCByZW5kZXJlcidzIGNvbnN0cnVjdG9yLCBzaW5jZSB3ZSBkb24ndFxyXG4gICAgLy8gICAgICBrbm93IGlmIHRoZSBpbmZvcm1hdGlvbiB3ZSBzdGFydCB3aXRoIGlzIHZhbGlkIG9uIGV2ZXJ5IHNjcmVlbiwgYW5kIGJlY2F1c2Ugd2UgaGF2ZSBzb21lIGNhbGxzXHJcbiAgICAvLyAgICAgIHRoYXQgc2VuZCBiYWNrIHRoZSBlbnRpcmUgZ3JpZCdzIHdvcnRoIG9mIGRhdGEuXHJcbiAgICAvL1xyXG4gICAgLy8gVGhlcmUgbWF5IGJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzLCBpbiB3aGljaCBjYXNlIHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIHJlcGxhY2VkIVxyXG4gICAgY3JlYXRlQWxsRm9ybUNvbnRyb2xzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtc1xyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5jb2x1bW5cclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZlxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5kYXRhXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLm5vZGVcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5nZXRNb2RlbCgpKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyXHJcbiAgICAgICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zXHJcbiAgICAgICAgICAgICAgICAmJiAhdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5fZXZlbnRzQ2hhbmdlZEJ5Q2VsbFJlbmRlcmVyVmFsaWRhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VHcmlkT3B0aW9uc0V2ZW50cygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5fZXZlbnRzQ2hhbmdlZEJ5Q2VsbFJlbmRlcmVyVmFsaWRhdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGFsbE5vZGVzID0gW107XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkubW9kZV9uZWVkVG9WYWxpZGF0ZU9ubHlSZW5kZXJlZENlbGxzKSB7XHJcbiAgICAgICAgICAgICAgICBhbGxOb2RlcyA9IHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5nZXRSZW5kZXJlZE5vZGVzKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhbGxOb2RlcyA9IHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5nZXRNb2RlbCgpLnJvd3NUb0Rpc3BsYXk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwXHJcbiAgICAgICAgICAgICAgICB8fCAodGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cFxyXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXAuY29udHJvbHNcclxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwLmNvbnRyb2xzLmxlbmd0aCAhPSBhbGxOb2Rlcy5sZW5ndGgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5jb2x1bW5Db250cm9sbGVyXHJcbiAgICAgICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuY29sdW1uQ29udHJvbGxlci5jb2x1bW5EZWZzKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY29sdW1uRGVmIG9mIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5jb2x1bW5Db250cm9sbGVyLmNvbHVtbkRlZnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uRGVmLm91dGVyRm9ybSAmJiBjb2x1bW5EZWYuZm9ybU5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2x1bW5EZWYub3V0ZXJGb3JtLmdldChjb2x1bW5EZWYuZm9ybU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5EZWYub3V0ZXJGb3JtLmFkZENvbnRyb2woY29sdW1uRGVmLmZvcm1OYW1lLCB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkRlZi5vdXRlckZvcm0uc2V0Q29udHJvbChjb2x1bW5EZWYuZm9ybU5hbWUsIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgY29sdW1uczogYW55W107XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJhbXMgJiYgdGhpcy5wYXJhbXMuY29sdW1uQXBpICYmIHRoaXMucGFyYW1zLmNvbHVtbkFwaS5jb2x1bW5Db250cm9sbGVyKSB7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5zID0gdGhpcy5wYXJhbXMuY29sdW1uQXBpLmNvbHVtbkNvbnRyb2xsZXIuZ3JpZENvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uLmNvbERlZlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBjb2x1bW4uY29sRGVmLmZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIChjb2x1bW4uY29sRGVmLnZhbGlkYXRvcnMgfHwgY29sdW1uLmNvbERlZi5zZXRFcnJvcnMpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IG5vZGUgb2YgYWxsTm9kZXMpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5jb2xEZWZcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29sdW1uLmNvbERlZi5maWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiAoY29sdW1uLmNvbERlZi52YWxpZGF0b3JzIHx8IGNvbHVtbi5jb2xEZWYuc2V0RXJyb3JzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlW2NvbHVtbi5jb2xEZWYuZmllbGQgKyBcIl9lcnJvck1lc3NhZ2VcIl0gPSAnJztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3JtQ29udHJvbDogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woY29sdW1uLmNvbERlZi5maWVsZCArICdfZm9ybUNvbnRyb2wnLCBbXSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUuZm9ybUdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmZvcm1Hcm91cC5hZGRDb250cm9sKGNvbHVtbi5jb2xEZWYuZmllbGQgKyAnX2Zvcm1Db250cm9sJywgZm9ybUNvbnRyb2wpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbHVtbi5jb2xEZWYudmFsaWRhdG9ycykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5jb2xEZWYudmFsaWRhdG9ycyA9IFtjb2x1bW4uY29sRGVmLnZhbGlkYXRvcnNdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKGNvbHVtbi5jb2xEZWYudmFsaWRhdG9ycyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUVycm9yTWVzc2FnZShmb3JtQ29udHJvbCwgbm9kZSwgY29sdW1uLmNvbERlZik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cC5jb250YWlucygnUm93R3JvdXBfJyArIG5vZGUucm93SW5kZXgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLmZvcm1Hcm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwLmFkZENvbnRyb2woJ1Jvd0dyb3VwXycgKyBub2RlLnJvd0luZGV4LCBub2RlLmZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGFuZ2VHcmlkT3B0aW9uc0V2ZW50cygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMucGFyYW1zXHJcbiAgICAgICAgICAgIHx8ICF0aGlzLnBhcmFtcy5ub2RlXHJcbiAgICAgICAgICAgIHx8ICF0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGlcclxuICAgICAgICAgICAgfHwgIXRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXJcclxuICAgICAgICAgICAgfHwgIXRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuZ3JpZE9wdGlvbnMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuZ3JpZE9wdGlvbnMub25Sb3dEYXRhQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLm9uUm93RGF0YUNoYW5nZWQyID0gdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5vblJvd0RhdGFDaGFuZ2VkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5vblJvd0RhdGFDaGFuZ2VkID0gKChldmVudDogYW55KSA9PiB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFsbEZvcm1Db250cm9scygpO1xyXG4gICAgICAgICAgICB0aGlzLmZldGNoRXJyb3JNZXNzYWdlc0ZvckN1cnJlbnRseVJlbmRlcmVkQ2VsbHMoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLm9uUm93RGF0YUNoYW5nZWQyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLm9uUm93RGF0YUNoYW5nZWQyKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuZ3JpZE9wdGlvbnMub25HcmlkQ29sdW1uc0NoYW5nZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5vbkdyaWRDb2x1bW5zQ2hhbmdlZDIgPSB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLm9uR3JpZENvbHVtbnNDaGFuZ2VkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5vbkdyaWRDb2x1bW5zQ2hhbmdlZCA9ICgoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRldGVybWluZUlmQWxsUm93c05lZWRWYWxpZGF0aW9uSW5BZHZhbmNlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQWxsRm9ybUNvbnRyb2xzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hFcnJvck1lc3NhZ2VzRm9yQ3VycmVudGx5UmVuZGVyZWRDZWxscygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuZ3JpZE9wdGlvbnMub25HcmlkQ29sdW1uc0NoYW5nZWQyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLm9uR3JpZENvbHVtbnNDaGFuZ2VkMihldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEVycm9yTWVzc2FnZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJhbXNcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZVxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmZvcm1Hcm91cFxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5jb2x1bW5cclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZlxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5jb2x1bW4uY29sRGVmLmZpZWxkKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgZm9ybUNvbnRyb2wgPSB0aGlzLnBhcmFtcy5ub2RlLmZvcm1Hcm91cC5nZXQodGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZi5maWVsZCArICdfZm9ybUNvbnRyb2wnKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRXJyb3JNZXNzYWdlKGZvcm1Db250cm9sLCB0aGlzLnBhcmFtcy5ub2RlLCB0aGlzLnBhcmFtcy5jb2x1bW4uY29sRGVmKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gdGhpcy5wYXJhbXMubm9kZVt0aGlzLnBhcmFtcy5jb2x1bW4uY29sRGVmLmZpZWxkICsgXCJfZXJyb3JNZXNzYWdlXCJdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlZnJlc2hGb3JtQ29udHJvbFZhbHVlKGZvcm1Db250cm9sOiBGb3JtQ29udHJvbCwgZGF0YTogYW55LCBmaWVsZE5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGlmIChmb3JtQ29udHJvbCAmJiBkYXRhICYmIGZpZWxkTmFtZSAmJiBkYXRhW2ZpZWxkTmFtZV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBmb3JtQ29udHJvbC5zZXRWYWx1ZShkYXRhW2ZpZWxkTmFtZV0pO1xyXG4gICAgICAgICAgICBmb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlRXJyb3JNZXNzYWdlKGZvcm1Db250cm9sOiBGb3JtQ29udHJvbCwgbm9kZTogYW55LCBjb2x1bW5EZWZpbml0aW9uOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICghZm9ybUNvbnRyb2wgfHwgIW5vZGUgfHwgIWNvbHVtbkRlZmluaXRpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGN1c3RvbUVycm9yTWVzc2FnZTogc3RyaW5nID0gJyc7XHJcblxyXG4gICAgICAgIGlmIChjb2x1bW5EZWZpbml0aW9uLnNldEVycm9ycykge1xyXG4gICAgICAgICAgICBjdXN0b21FcnJvck1lc3NhZ2UgPSBjb2x1bW5EZWZpbml0aW9uLnNldEVycm9ycyhcclxuICAgICAgICAgICAgICAgIG5vZGUuZGF0YVtjb2x1bW5EZWZpbml0aW9uLmZpZWxkXSxcclxuICAgICAgICAgICAgICAgIG5vZGUuZGF0YSxcclxuICAgICAgICAgICAgICAgIG5vZGUsXHJcbiAgICAgICAgICAgICAgICBjb2x1bW5EZWZpbml0aW9uLFxyXG4gICAgICAgICAgICAgICAgbm9kZS5yb3dJbmRleCxcclxuICAgICAgICAgICAgICAgIG5vZGUuZ3JpZEFwaVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGVycm9yTWVzc2FnZU5hbWU6IHN0cmluZyA9IGNvbHVtbkRlZmluaXRpb24uZmllbGQgKyBcIl9lcnJvck1lc3NhZ2VcIjtcclxuXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoRm9ybUNvbnRyb2xWYWx1ZShmb3JtQ29udHJvbCwgbm9kZS5kYXRhLCBjb2x1bW5EZWZpbml0aW9uLmZpZWxkKTtcclxuXHJcbiAgICAgICAgbm9kZVtlcnJvck1lc3NhZ2VOYW1lXSA9ICcnO1xyXG5cclxuXHJcbiAgICAgICAgaWYgKGZvcm1Db250cm9sLmludmFsaWQgfHwgKGN1c3RvbUVycm9yTWVzc2FnZSAmJiBjdXN0b21FcnJvck1lc3NhZ2UgIT09ICcnKSkge1xyXG4gICAgICAgICAgICBpZiAoY29sdW1uRGVmaW5pdGlvbi5lcnJvck1lc3NhZ2VIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgIG5vZGVbZXJyb3JNZXNzYWdlTmFtZV0gKz0gJycgKyBjb2x1bW5EZWZpbml0aW9uLmVycm9yTWVzc2FnZUhlYWRlciArICdcXG4nO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbm9kZVtlcnJvck1lc3NhZ2VOYW1lXSArPVxyXG4gICAgICAgICAgICAgICAgICAgICdJbnZhbGlkIHZhbHVlIFwiJyArIG5vZGUuZGF0YVtjb2x1bW5EZWZpbml0aW9uLmZpZWxkXSArICdcIiBmb3IgZmllbGQgKCcgKyBjb2x1bW5EZWZpbml0aW9uLmZpZWxkICsgJylcXG4nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29sdW1uRGVmaW5pdGlvbi5lcnJvck5hbWVFcnJvck1lc3NhZ2VNYXApIHtcclxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbHVtbkRlZmluaXRpb24uZXJyb3JOYW1lRXJyb3JNZXNzYWdlTWFwKSkge1xyXG4gICAgICAgICAgICAgICAgY29sdW1uRGVmaW5pdGlvbi5lcnJvck5hbWVFcnJvck1lc3NhZ2VNYXAgPSBbY29sdW1uRGVmaW5pdGlvbi5lcnJvck5hbWVFcnJvck1lc3NhZ2VNYXBdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBlcnJvck5hbWVFcnJvck1lc3NhZ2VQYWlyIG9mIGNvbHVtbkRlZmluaXRpb24uZXJyb3JOYW1lRXJyb3JNZXNzYWdlTWFwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoISFlcnJvck5hbWVFcnJvck1lc3NhZ2VQYWlyLmVycm9yTmFtZSAmJiAhIWVycm9yTmFtZUVycm9yTWVzc2FnZVBhaXIuZXJyb3JNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1Db250cm9sLmhhc0Vycm9yKGVycm9yTmFtZUVycm9yTWVzc2FnZVBhaXIuZXJyb3JOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlW2Vycm9yTWVzc2FnZU5hbWVdICs9IGVycm9yTmFtZUVycm9yTWVzc2FnZVBhaXIuZXJyb3JNZXNzYWdlICsnXFxuJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG5vZGVbZXJyb3JNZXNzYWdlTmFtZV0gKz0gY3VzdG9tRXJyb3JNZXNzYWdlO1xyXG5cclxuICAgICAgICByZXR1cm4gbm9kZVtlcnJvck1lc3NhZ2VOYW1lXTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZGV0ZXJtaW5lSWZBbGxSb3dzTmVlZFZhbGlkYXRpb25JbkFkdmFuY2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLm5vZGVcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLmNvbHVtbkFwaVxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5jb2x1bW5BcGkuY29sdW1uQ29udHJvbGxlclxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5jb2x1bW5BcGkuY29sdW1uQ29udHJvbGxlci5ncmlkQ29sdW1ucykge1xyXG5cclxuICAgICAgICAgICAgbGV0IGNvbHVtbnMgPSB0aGlzLnBhcmFtcy5jb2x1bW5BcGkuY29sdW1uQ29udHJvbGxlci5ncmlkQ29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5jb2xEZWZcclxuICAgICAgICAgICAgICAgICAgICAmJiBjb2x1bW4uY29sRGVmLmZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgKGNvbHVtbi5jb2xEZWYudmFsaWRhdG9ycyB8fCBjb2x1bW4uY29sRGVmLnNldEVycm9ycylcclxuICAgICAgICAgICAgICAgICAgICAmJiBjb2x1bW4uY29sRGVmLmVkaXRhYmxlID09PSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgIShjb2x1bW4uY29sRGVmLnZhbGlkYXRlT25seVJlbmRlcmVkQ2VsbHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29sdW1uLmNvbERlZi52YWxpZGF0ZU9ubHlSZW5kZXJlZENlbGxzID09PSB0cnVlKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkubW9kZV9uZWVkVG9WYWxpZGF0ZU9ubHlSZW5kZXJlZENlbGxzID0gQXJyYXkuaXNBcnJheShjb2x1bW5zKSAmJiBjb2x1bW5zLmxlbmd0aCA9PT0gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGZldGNoRXJyb3JNZXNzYWdlc0ZvckN1cnJlbnRseVJlbmRlcmVkQ2VsbHMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLm5vZGVcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgZ2V0Q2VsbFJlbmRlcmVyUGFyYW1zOiBhbnkgPSB7IHJvd05vZGVzOiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ2V0UmVuZGVyZWROb2RlcygpIH07XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBjZWxsUmVuZGVyZXIgb2YgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdldENlbGxSZW5kZXJlckluc3RhbmNlcyhnZXRDZWxsUmVuZGVyZXJQYXJhbXMpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2VsbFJlbmRlcmVyLl9hZ0F3YXJlQ29tcG9uZW50ICYmIGNlbGxSZW5kZXJlci5fYWdBd2FyZUNvbXBvbmVudC5nZXRFcnJvck1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsUmVuZGVyZXIuX2FnQXdhcmVDb21wb25lbnQuZ2V0RXJyb3JNZXNzYWdlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVZhbGlkYXRpb24oKTogdm9pZCB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJTdWNjZXNzZnVsbHkgcmVhY2hlZCFcIik7XHJcbiAgICAgICAgLy8gYWRkIHRoaXMgZm9ybSBjb250cm9sXHJcblxyXG4gICAgICAgIGxldCBjb2x1bW5zID0gdGhpcy5wYXJhbXMuY29sdW1uQXBpLmNvbHVtbkNvbnRyb2xsZXIuZ3JpZENvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+IHtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb2x1bW4uY29sRGVmXHJcbiAgICAgICAgICAgICAgICAmJiBjb2x1bW4uY29sRGVmLmZpZWxkXHJcbiAgICAgICAgICAgICAgICAmJiAoY29sdW1uLmNvbERlZi52YWxpZGF0b3JzIHx8IGNvbHVtbi5jb2xEZWYuc2V0RXJyb3JzKVxyXG4gICAgICAgICAgICAgICAgJiYgY29sdW1uLmNvbERlZi5maWVsZCA9PT0gdGhpcy5wYXJhbXMuZmllbGQ7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtcy5jb2xEZWZcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMuY29sRGVmLmZpZWxkXHJcbiAgICAgICAgICAgICYmICh0aGlzLnBhcmFtcy5jb2xEZWYudmFsaWRhdG9ycyB8fCB0aGlzLnBhcmFtcy5jb2xEZWYuc2V0RXJyb3JzKSkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMubm9kZVt0aGlzLnBhcmFtcy5jb2xEZWYuZmllbGQgKyBcIl9lcnJvck1lc3NhZ2VcIl0gPSAnJztcclxuXHJcbiAgICAgICAgICAgIGxldCBmb3JtQ29udHJvbDogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wodGhpcy5wYXJhbXMuY29sRGVmLmZpZWxkICsgJ19mb3JtQ29udHJvbCcsIFtdKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5wYXJhbXMubm9kZS5mb3JtR3JvdXApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgYW55IHJlbW92ZWQgbm9kZXMgJiByZW1vdmUgdGhlaXIgdmFsaWRhdG9ycyBpZiBuZWVkZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY29udHJvbE5hbWUgb2YgT2JqZWN0LmtleXModGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cC5jb250cm9scykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgnJyArIGNvbnRyb2xOYW1lKS50b0xvd2VyQ2FzZSgpLnN1YnN0cigwLCA5KSA9PT0gJ3Jvd2dyb3VwXycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbm9kZSBvZiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ2V0TW9kZWwoKS5yb3dzVG9EaXNwbGF5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgnJyArIG5vZGUucm93SW5kZXgpID09PSAoJycgKyBjb250cm9sTmFtZSkuc3Vic3RyKDkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXAucmVtb3ZlQ29udHJvbChjb250cm9sTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXAuYWRkQ29udHJvbCgnUm93R3JvdXBfJyArIHRoaXMucGFyYW1zLm5vZGUucm93SW5kZXgsIHRoaXMucGFyYW1zLm5vZGUuZm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLnBhcmFtcy5ub2RlLmZvcm1Hcm91cC5jb250cm9sc1t0aGlzLnBhcmFtcy5jb2xEZWYuZmllbGQgKyAnX2Zvcm1Db250cm9sJ10pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZm9ybUdyb3VwLmFkZENvbnRyb2wodGhpcy5wYXJhbXMuY29sRGVmLmZpZWxkICsgJ19mb3JtQ29udHJvbCcsIGZvcm1Db250cm9sKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnBhcmFtcy5jb2xEZWYudmFsaWRhdG9ycykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcy5ub2RlLmZvcm1Hcm91cC5jb250cm9sc1t0aGlzLnBhcmFtcy5jb2xEZWYuZmllbGQgKyAnX2Zvcm1Db250cm9sJ10uc2V0VmFsaWRhdG9ycyh0aGlzLnBhcmFtcy5jb2xEZWYudmFsaWRhdG9ycyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5jb2x1bW5Db250cm9sbGVyXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmNvbHVtbkNvbnRyb2xsZXIuY29sdW1uRGVmcykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjb2x1bW5EZWYgb2YgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmNvbHVtbkNvbnRyb2xsZXIuY29sdW1uRGVmcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uRGVmLm91dGVyRm9ybSAmJiBjb2x1bW5EZWYuZm9ybU5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29sdW1uRGVmLm91dGVyRm9ybS5nZXQoY29sdW1uRGVmLmZvcm1OYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkRlZi5vdXRlckZvcm0uYWRkQ29udHJvbChjb2x1bW5EZWYuZm9ybU5hbWUsIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5EZWYub3V0ZXJGb3JtLnNldENvbnRyb2woY29sdW1uRGVmLmZvcm1OYW1lLCB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVFcnJvck1lc3NhZ2UoZm9ybUNvbnRyb2wsIHRoaXMucGFyYW1zLm5vZGUsIHRoaXMucGFyYW1zLmNvbERlZik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhZGQgY29sdW1uIGNvbnRyb2wgZ3JvdXBzIGlmIG5lZWRlZFxyXG4gICAgICAgIC8vIGFkZCByb3cgY29udHJvbCBncm91cHMgaWYgbmVlZGVkXHJcbiAgICAgICAgLy8gc2V0dXAgZ3JpZCBjb250cm9sIGdyb3VwIGlmIG5lZWRlZFxyXG4gICAgICAgIC8vIE1pZ2h0IG5lZWQgdG8gdHJpZ2dlciBjZWxsIHZhbGlkYXRpb24gdG8gcnVuIHdpdGggdGhlIG5ldyB2YWxpZGF0aW9uLlxyXG5cclxuICAgIH1cclxufVxyXG5cclxuIl19