@datagrok-libraries/statistics 1.9.2 → 1.12.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.
- package/css/styles.css +229 -0
- package/package.json +3 -2
- package/src/fit/const.d.ts +58 -0
- package/src/fit/const.d.ts.map +1 -0
- package/src/fit/const.js +63 -0
- package/src/fit/fit-data.d.ts.map +1 -1
- package/src/fit/fit-data.js +37 -5
- package/src/fit/new-fit-API.d.ts +6 -0
- package/src/fit/new-fit-API.d.ts.map +1 -1
- package/src/fit/new-fit-API.js +2 -8
- package/src/mpo/dialogs/desirability-mode-dialog.d.ts +14 -0
- package/src/mpo/dialogs/desirability-mode-dialog.d.ts.map +1 -0
- package/src/mpo/dialogs/desirability-mode-dialog.js +198 -0
- package/src/mpo/editors/desirability-editor-factory.d.ts +15 -0
- package/src/mpo/editors/desirability-editor-factory.d.ts.map +1 -0
- package/src/mpo/editors/desirability-editor-factory.js +11 -0
- package/src/mpo/editors/mpo-categorical-editor.d.ts +24 -0
- package/src/mpo/editors/mpo-categorical-editor.d.ts.map +1 -0
- package/src/mpo/editors/mpo-categorical-editor.js +113 -0
- package/src/mpo/editors/mpo-line-editor.d.ts +46 -0
- package/src/mpo/editors/mpo-line-editor.d.ts.map +1 -0
- package/src/mpo/editors/mpo-line-editor.js +583 -0
- package/src/mpo/mpo-profile-editor.d.ts +42 -6
- package/src/mpo/mpo-profile-editor.d.ts.map +1 -1
- package/src/mpo/mpo-profile-editor.js +368 -59
- package/src/mpo/mpo.d.ts +53 -3
- package/src/mpo/mpo.d.ts.map +1 -1
- package/src/mpo/mpo.js +92 -16
- package/src/mpo/utils.d.ts +6 -0
- package/src/mpo/utils.d.ts.map +1 -0
- package/src/mpo/utils.js +17 -0
- package/src/mpo/mpo-line-editor.d.ts +0 -10
- package/src/mpo/mpo-line-editor.d.ts.map +0 -1
- package/src/mpo/mpo-line-editor.js +0 -258
|
@@ -1,13 +1,49 @@
|
|
|
1
1
|
import * as DG from 'datagrok-api/dg';
|
|
2
|
-
import { DesirabilityProfile } from './mpo';
|
|
3
2
|
import { Subject } from 'rxjs';
|
|
3
|
+
import { DesirabilityProfile, WeightedAggregation } from './mpo';
|
|
4
|
+
import '../../css/styles.css';
|
|
4
5
|
export declare class MpoProfileEditor {
|
|
5
|
-
root: HTMLDivElement;
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
readonly root: HTMLDivElement;
|
|
7
|
+
readonly onChanged: Subject<void>;
|
|
8
|
+
readonly aggregationInput: DG.ChoiceInput<WeightedAggregation | null>;
|
|
8
9
|
profile?: DesirabilityProfile;
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
dataFrame?: DG.DataFrame;
|
|
11
|
+
design: boolean;
|
|
12
|
+
preview: boolean;
|
|
13
|
+
private rows;
|
|
14
|
+
private rowIds;
|
|
15
|
+
private rowSubs;
|
|
16
|
+
private propertyOrder;
|
|
17
|
+
columnMapping: Record<string, string | null>;
|
|
18
|
+
constructor(dataFrame?: DG.DataFrame, design?: boolean, preview?: boolean);
|
|
19
|
+
private newRowId;
|
|
11
20
|
setProfile(profile?: DesirabilityProfile): void;
|
|
21
|
+
getProfile(): DesirabilityProfile | undefined;
|
|
22
|
+
setDesignMode(on: boolean): void;
|
|
23
|
+
setPreviewMode(on: boolean): void;
|
|
24
|
+
private render;
|
|
25
|
+
private renderEmpty;
|
|
26
|
+
private renderDesignEmpty;
|
|
27
|
+
addProperty(): void;
|
|
28
|
+
private buildHeader;
|
|
29
|
+
private buildRow;
|
|
30
|
+
private buildPropertyCell;
|
|
31
|
+
private buildWeightCell;
|
|
32
|
+
private buildColumnSelector;
|
|
33
|
+
private getEligibleColumnNames;
|
|
34
|
+
private getNumericalColumnNames;
|
|
35
|
+
private resolveColumn;
|
|
36
|
+
private correctPropertyType;
|
|
37
|
+
private switchPropertyType;
|
|
38
|
+
private rebuildRow;
|
|
39
|
+
private buildModeGear;
|
|
40
|
+
private buildRowControls;
|
|
41
|
+
private openModeDialog;
|
|
42
|
+
private getPropertyNameByRowId;
|
|
43
|
+
private renameProperty;
|
|
44
|
+
private deleteRow;
|
|
45
|
+
private insertRowAfterRow;
|
|
46
|
+
private mutateProperty;
|
|
47
|
+
private emitChange;
|
|
12
48
|
}
|
|
13
49
|
//# sourceMappingURL=mpo-profile-editor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mpo-profile-editor.d.ts","sourceRoot":"","sources":["mpo-profile-editor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"mpo-profile-editor.d.ts","sourceRoot":"","sources":["mpo-profile-editor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAItC,OAAO,EAAC,OAAO,EAAe,MAAM,MAAM,CAAC;AAC3C,OAAO,EAEL,mBAAmB,EAAwB,mBAAmB,EAE/D,MAAM,OAAO,CAAC;AAIf,OAAO,sBAAsB,CAAC;AAM9B,qBAAa,gBAAgB;IAC3B,QAAQ,CAAC,IAAI,iBAAc;IAC3B,QAAQ,CAAC,SAAS,gBAAuB;IACzC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,WAAW,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IAEtE,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC;IACzB,MAAM,UAAS;IACf,OAAO,UAAS;IAEhB,OAAO,CAAC,IAAI,CAAmC;IAC/C,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,OAAO,CAAmC;IAElD,OAAO,CAAC,aAAa,CAAgB;IACrC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAM;gBAEtC,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,MAAM,UAAQ,EAAE,OAAO,UAAQ;IAiBrE,OAAO,CAAC,QAAQ;IAIhB,UAAU,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI;IA2B/C,UAAU,IAAI,mBAAmB,GAAG,SAAS;IAI7C,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI;IAQhC,cAAc,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI;IAQjC,OAAO,CAAC,MAAM;IA0Bd,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,iBAAiB;IASzB,WAAW,IAAI,IAAI;IAgBnB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,QAAQ;IA2ChB,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,eAAe;IAmDvB,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,uBAAuB;IAM/B,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,SAAS;IA0BjB,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,UAAU;CAInB"}
|
|
@@ -1,79 +1,388 @@
|
|
|
1
1
|
import * as ui from 'datagrok-api/ui';
|
|
2
|
-
import
|
|
2
|
+
import * as grok from 'datagrok-api/grok';
|
|
3
3
|
import { Subject } from 'rxjs';
|
|
4
|
+
import { DEFAULT_AGGREGATION, WEIGHTED_AGGREGATIONS_LIST, createDefaultCategorical, createDefaultNumerical, isNumerical, migrateDesirability, } from './mpo';
|
|
5
|
+
import { DesirabilityEditorFactory } from './editors/desirability-editor-factory';
|
|
6
|
+
import { DesirabilityModeDialog } from './dialogs/desirability-mode-dialog';
|
|
7
|
+
import '../../css/styles.css';
|
|
8
|
+
import { MPO_SCORE_CHANGED_EVENT } from './utils';
|
|
9
|
+
const MAX_CATEGORICAL_CATEGORIES = 20;
|
|
4
10
|
export class MpoProfileEditor {
|
|
5
|
-
constructor(dataFrame) {
|
|
11
|
+
constructor(dataFrame, design = false, preview = false) {
|
|
6
12
|
this.root = ui.div([]);
|
|
7
13
|
this.onChanged = new Subject();
|
|
14
|
+
this.design = false;
|
|
15
|
+
this.preview = false;
|
|
16
|
+
this.rows = {};
|
|
17
|
+
this.rowIds = {};
|
|
18
|
+
this.rowSubs = new Map();
|
|
19
|
+
this.propertyOrder = [];
|
|
20
|
+
this.columnMapping = {};
|
|
8
21
|
this.dataFrame = dataFrame;
|
|
9
|
-
this.
|
|
22
|
+
this.design = design;
|
|
23
|
+
this.preview = preview;
|
|
24
|
+
this.aggregationInput = ui.input.choice('Aggregation', {
|
|
25
|
+
items: WEIGHTED_AGGREGATIONS_LIST,
|
|
26
|
+
value: DEFAULT_AGGREGATION,
|
|
27
|
+
nullable: false,
|
|
28
|
+
onValueChanged: (v) => {
|
|
29
|
+
if (this.profile)
|
|
30
|
+
this.profile.aggregation = v;
|
|
31
|
+
this.emitChange();
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
this.aggregationInput.setTooltip('Score aggregation method');
|
|
10
35
|
}
|
|
11
|
-
|
|
12
|
-
return
|
|
36
|
+
newRowId() {
|
|
37
|
+
return crypto.randomUUID();
|
|
13
38
|
}
|
|
14
39
|
setProfile(profile) {
|
|
40
|
+
var _a, _b;
|
|
41
|
+
if (profile) {
|
|
42
|
+
for (const key of Object.keys(profile.properties)) {
|
|
43
|
+
const prop = migrateDesirability(profile.properties[key]);
|
|
44
|
+
if (isNumerical(prop))
|
|
45
|
+
(_a = prop.mode) !== null && _a !== void 0 ? _a : (prop.mode = 'freeform');
|
|
46
|
+
profile.properties[key] = prop;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
for (const sub of this.rowSubs.values())
|
|
50
|
+
sub.unsubscribe();
|
|
51
|
+
this.rowSubs.clear();
|
|
15
52
|
this.profile = profile;
|
|
53
|
+
this.aggregationInput.value = (_b = profile === null || profile === void 0 ? void 0 : profile.aggregation) !== null && _b !== void 0 ? _b : DEFAULT_AGGREGATION;
|
|
54
|
+
this.columnMapping = {};
|
|
55
|
+
this.rows = {};
|
|
56
|
+
this.rowIds = {};
|
|
57
|
+
this.propertyOrder = profile ? Object.keys(profile.properties) : [];
|
|
58
|
+
for (const name of this.propertyOrder)
|
|
59
|
+
this.rowIds[name] = this.newRowId();
|
|
60
|
+
this.render();
|
|
61
|
+
}
|
|
62
|
+
getProfile() {
|
|
63
|
+
return this.profile;
|
|
64
|
+
}
|
|
65
|
+
setDesignMode(on) {
|
|
66
|
+
if (this.design === on)
|
|
67
|
+
return;
|
|
68
|
+
this.design = on;
|
|
69
|
+
this.rows = {};
|
|
70
|
+
this.render();
|
|
71
|
+
}
|
|
72
|
+
setPreviewMode(on) {
|
|
73
|
+
if (this.preview === on)
|
|
74
|
+
return;
|
|
75
|
+
this.preview = on;
|
|
76
|
+
this.rows = {};
|
|
77
|
+
this.render();
|
|
78
|
+
}
|
|
79
|
+
render() {
|
|
16
80
|
ui.empty(this.root);
|
|
17
|
-
if (!profile)
|
|
18
|
-
this.
|
|
81
|
+
if (!this.profile)
|
|
82
|
+
return this.renderEmpty('No profile specified.');
|
|
83
|
+
const rows = this.propertyOrder.map((name) => {
|
|
84
|
+
const rowId = this.rowIds[name];
|
|
85
|
+
if (!this.rows[rowId])
|
|
86
|
+
this.rows[rowId] = this.buildRow(name, rowId, this.profile.properties[name]);
|
|
87
|
+
return this.rows[rowId];
|
|
88
|
+
});
|
|
89
|
+
if (!rows.length) {
|
|
90
|
+
if (!this.preview)
|
|
91
|
+
this.root.append(this.buildHeader());
|
|
92
|
+
if (this.design)
|
|
93
|
+
return this.renderDesignEmpty();
|
|
94
|
+
return this.renderEmpty('No properties defined.');
|
|
95
|
+
}
|
|
96
|
+
if (!this.preview)
|
|
97
|
+
this.root.append(this.buildHeader());
|
|
98
|
+
this.root.append(ui.divV(rows));
|
|
99
|
+
}
|
|
100
|
+
renderEmpty(text) {
|
|
101
|
+
this.root.append(ui.divText(text));
|
|
102
|
+
}
|
|
103
|
+
renderDesignEmpty() {
|
|
104
|
+
const icon = ui.iconFA('chart-line');
|
|
105
|
+
const heading = ui.h3('No properties yet');
|
|
106
|
+
const msg = ui.p('Select a dataset to auto-populate properties from its numerical columns, or add them manually.');
|
|
107
|
+
const addBtn = ui.link('+ Add Property', () => this.addProperty());
|
|
108
|
+
const container = ui.divV([icon, heading, msg, addBtn], 'statistics-mpo-empty-state');
|
|
109
|
+
this.root.append(container);
|
|
110
|
+
}
|
|
111
|
+
addProperty() {
|
|
112
|
+
if (!this.profile)
|
|
19
113
|
return;
|
|
114
|
+
const newName = `NewProperty${Object.keys(this.profile.properties).length + 1}`;
|
|
115
|
+
const newRowId = this.newRowId();
|
|
116
|
+
this.profile.properties[newName] = createDefaultNumerical();
|
|
117
|
+
this.rowIds[newName] = newRowId;
|
|
118
|
+
this.propertyOrder.push(newName);
|
|
119
|
+
this.rows = {};
|
|
120
|
+
this.render();
|
|
121
|
+
this.emitChange();
|
|
122
|
+
}
|
|
123
|
+
buildHeader() {
|
|
124
|
+
return ui.divH([
|
|
125
|
+
ui.divText('Property', 'statistics-mpo-header-property'),
|
|
126
|
+
ui.divText('Weight', 'statistics-mpo-header-weight'),
|
|
127
|
+
ui.divText('Desirability', 'statistics-mpo-header-desirability'),
|
|
128
|
+
], 'statistics-mpo-header');
|
|
129
|
+
}
|
|
130
|
+
buildRow(name, rowId, prop) {
|
|
131
|
+
var _a;
|
|
132
|
+
const row = ui.divH([], 'statistics-mpo-row');
|
|
133
|
+
row.dataset.rowId = rowId;
|
|
134
|
+
const col = this.resolveColumn(name);
|
|
135
|
+
if (col) {
|
|
136
|
+
const corrected = this.correctPropertyType(prop, col);
|
|
137
|
+
if (corrected) {
|
|
138
|
+
prop = corrected;
|
|
139
|
+
this.profile.properties[name] = prop;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const editor = DesirabilityEditorFactory.create(prop, 300, 80, this.design);
|
|
143
|
+
(_a = this.rowSubs.get(rowId)) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
144
|
+
this.rowSubs.set(rowId, editor.onChanged.subscribe(() => this.emitChange()));
|
|
145
|
+
const propertyCell = this.buildPropertyCell(rowId, name);
|
|
146
|
+
const weightCell = this.buildWeightCell(rowId, prop);
|
|
147
|
+
const columnCell = this.buildColumnSelector(rowId, name, editor);
|
|
148
|
+
const modeGear = this.design ?
|
|
149
|
+
this.buildModeGear(rowId, prop, editor) :
|
|
150
|
+
null;
|
|
151
|
+
const controls = this.design ? this.buildRowControls(rowId) : null;
|
|
152
|
+
row.append(ui.divV([propertyCell, columnCell].filter(Boolean), 'statistics-mpo-property-cell'), weightCell, ui.divH([editor.root, modeGear].filter(Boolean)));
|
|
153
|
+
if (controls)
|
|
154
|
+
row.append(controls);
|
|
155
|
+
return row;
|
|
156
|
+
}
|
|
157
|
+
buildPropertyCell(rowId, name) {
|
|
158
|
+
if (this.dataFrame) {
|
|
159
|
+
const el = ui.divText(name);
|
|
160
|
+
ui.tooltip.bind(el, () => name);
|
|
161
|
+
return el;
|
|
20
162
|
}
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
163
|
+
let currentName = name;
|
|
164
|
+
const propNameInp = ui.input.string('', { value: name, onValueChanged: (v) => {
|
|
165
|
+
if (!v || v === currentName)
|
|
166
|
+
return;
|
|
167
|
+
this.renameProperty(currentName, v);
|
|
168
|
+
currentName = v;
|
|
169
|
+
} });
|
|
170
|
+
ui.tooltip.bind(propNameInp.input, () => currentName);
|
|
171
|
+
return propNameInp.root;
|
|
172
|
+
}
|
|
173
|
+
buildWeightCell(rowId, prop) {
|
|
174
|
+
var _a;
|
|
175
|
+
const name = this.getPropertyNameByRowId(rowId);
|
|
176
|
+
const children = [];
|
|
177
|
+
const weightInput = ui.input.float('', { value: prop.weight, min: 0, max: 1, format: '#0.000',
|
|
178
|
+
onValueChanged: (v) => {
|
|
179
|
+
if (name)
|
|
180
|
+
this.mutateProperty(name, (p) => p.weight = Math.max(0, Math.min(1, v !== null && v !== void 0 ? v : 0)));
|
|
30
181
|
},
|
|
31
182
|
});
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
nullable: true,
|
|
55
|
-
items: (_c = (_b = (_a = this.dataFrame) === null || _a === void 0 ? void 0 : _a.columns) === null || _b === void 0 ? void 0 : _b.names()) !== null && _c !== void 0 ? _c : [''],
|
|
56
|
-
value: matchedColumnName !== null && matchedColumnName !== void 0 ? matchedColumnName : ''
|
|
183
|
+
weightInput.root.classList.add('statistics-mpo-weight-input');
|
|
184
|
+
children.push(weightInput.root);
|
|
185
|
+
if (this.dataFrame) {
|
|
186
|
+
const numCols = this.getNumericalColumnNames();
|
|
187
|
+
let isColumn = !!prop.weightColumn && numCols.includes(prop.weightColumn);
|
|
188
|
+
const colInput = ui.input.choice('', { items: numCols, nullable: true, value: (_a = prop.weightColumn) !== null && _a !== void 0 ? _a : '',
|
|
189
|
+
onValueChanged: (v) => {
|
|
190
|
+
if (name)
|
|
191
|
+
this.mutateProperty(name, (p) => p.weightColumn = v || undefined);
|
|
192
|
+
}, });
|
|
193
|
+
const syncToggle = () => {
|
|
194
|
+
weightInput.root.classList.toggle('statistics-mpo-hidden', isColumn);
|
|
195
|
+
colInput.root.classList.toggle('statistics-mpo-hidden', !isColumn);
|
|
196
|
+
toggle.classList.toggle('statistics-mpo-weight-toggle-active', isColumn);
|
|
197
|
+
};
|
|
198
|
+
const toggle = ui.iconFA('columns', () => {
|
|
199
|
+
isColumn = !isColumn;
|
|
200
|
+
syncToggle();
|
|
201
|
+
if (!isColumn && name)
|
|
202
|
+
this.mutateProperty(name, (p) => { delete p.weightColumn; });
|
|
203
|
+
else if (isColumn && name && colInput.value)
|
|
204
|
+
this.mutateProperty(name, (p) => p.weightColumn = colInput.value || undefined);
|
|
57
205
|
});
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
]),
|
|
63
|
-
weightInput.root,
|
|
64
|
-
lineEditor.root, // Add the Konva container div
|
|
65
|
-
]);
|
|
66
|
-
rowDiv.style.alignItems = 'center'; // Vertically align items in the row
|
|
67
|
-
rowDiv.style.marginBottom = '5px'; // Space between rows
|
|
68
|
-
rowDiv.style.minHeight = '70px'; // Ensure consistent row height even if editor takes time
|
|
69
|
-
return rowDiv;
|
|
70
|
-
}).filter((el) => el !== null); // Filter out skipped properties
|
|
71
|
-
if (propertyRows.length > 0) {
|
|
72
|
-
this.root.append(header);
|
|
73
|
-
this.root.append(ui.divV(propertyRows)); // Cast needed after filter
|
|
206
|
+
toggle.classList.add('statistics-mpo-weight-toggle');
|
|
207
|
+
ui.tooltip.bind(toggle, () => isColumn ? 'Switch to manual weight' : 'Use weight from column');
|
|
208
|
+
syncToggle();
|
|
209
|
+
children.push(colInput.root, toggle);
|
|
74
210
|
}
|
|
211
|
+
return ui.divH(children, 'statistics-mpo-weight-cell');
|
|
212
|
+
}
|
|
213
|
+
buildColumnSelector(rowId, name, editor) {
|
|
214
|
+
var _a, _b;
|
|
215
|
+
if (!this.dataFrame)
|
|
216
|
+
return null;
|
|
217
|
+
const items = this.getEligibleColumnNames();
|
|
218
|
+
const matched = (_a = this.columnMapping[name]) !== null && _a !== void 0 ? _a : null;
|
|
219
|
+
if (matched) {
|
|
220
|
+
const col = this.dataFrame.col(matched);
|
|
221
|
+
(_b = editor.setColumn) === null || _b === void 0 ? void 0 : _b.call(editor, col);
|
|
222
|
+
}
|
|
223
|
+
const input = ui.input.choice('', { items, nullable: true, value: matched !== null && matched !== void 0 ? matched : '', onValueChanged: (v) => {
|
|
224
|
+
var _a;
|
|
225
|
+
this.columnMapping[name] = v !== null && v !== void 0 ? v : null;
|
|
226
|
+
const col = v ? this.dataFrame.col(v) : null;
|
|
227
|
+
if (col && this.switchPropertyType(name, rowId, col))
|
|
228
|
+
return;
|
|
229
|
+
(_a = editor.setColumn) === null || _a === void 0 ? void 0 : _a.call(editor, col);
|
|
230
|
+
this.emitChange();
|
|
231
|
+
} });
|
|
232
|
+
return input.root;
|
|
233
|
+
}
|
|
234
|
+
getEligibleColumnNames() {
|
|
235
|
+
if (!this.dataFrame)
|
|
236
|
+
return [];
|
|
237
|
+
return Array.from(this.dataFrame.columns)
|
|
238
|
+
.filter((c) => !c.isCategorical || c.categories.length <= MAX_CATEGORICAL_CATEGORIES)
|
|
239
|
+
.map((c) => c.name);
|
|
240
|
+
}
|
|
241
|
+
getNumericalColumnNames() {
|
|
242
|
+
if (!this.dataFrame)
|
|
243
|
+
return [];
|
|
244
|
+
return Array.from(this.dataFrame.columns.numerical).map((c) => c.name);
|
|
245
|
+
}
|
|
246
|
+
resolveColumn(name) {
|
|
247
|
+
var _a, _b, _c;
|
|
248
|
+
if (!this.dataFrame)
|
|
249
|
+
return null;
|
|
250
|
+
const eligible = this.getEligibleColumnNames();
|
|
251
|
+
const colName = (_b = (_a = this.columnMapping[name]) !== null && _a !== void 0 ? _a : eligible.find((c) => c.toLowerCase() === name.toLowerCase())) !== null && _b !== void 0 ? _b : null;
|
|
252
|
+
if (colName)
|
|
253
|
+
this.columnMapping[name] = colName;
|
|
254
|
+
return colName ? (_c = this.dataFrame.col(colName)) !== null && _c !== void 0 ? _c : null : null;
|
|
255
|
+
}
|
|
256
|
+
correctPropertyType(prop, col) {
|
|
257
|
+
if (isNumerical(prop) && col.isCategorical) {
|
|
258
|
+
const categories = col.categories.map((c) => ({ name: c, desirability: 1 }));
|
|
259
|
+
return createDefaultCategorical(prop.weight, categories);
|
|
260
|
+
}
|
|
261
|
+
if (!isNumerical(prop) && col.isNumerical)
|
|
262
|
+
return createDefaultNumerical(prop.weight, col.min, col.max);
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
switchPropertyType(name, rowId, col) {
|
|
266
|
+
if (!this.profile)
|
|
267
|
+
return false;
|
|
268
|
+
const corrected = this.correctPropertyType(this.profile.properties[name], col);
|
|
269
|
+
if (!corrected)
|
|
270
|
+
return false;
|
|
271
|
+
this.profile.properties[name] = corrected;
|
|
272
|
+
this.rebuildRow(name, rowId);
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
275
|
+
rebuildRow(name, rowId) {
|
|
276
|
+
const oldRow = this.rows[rowId];
|
|
277
|
+
const newRow = this.buildRow(name, rowId, this.profile.properties[name]);
|
|
278
|
+
this.rows[rowId] = newRow;
|
|
279
|
+
if (oldRow === null || oldRow === void 0 ? void 0 : oldRow.parentNode)
|
|
280
|
+
oldRow.replaceWith(newRow);
|
|
281
|
+
this.emitChange();
|
|
282
|
+
}
|
|
283
|
+
buildModeGear(rowId, prop, editor) {
|
|
284
|
+
const gear = ui.icons.settings(() => {
|
|
285
|
+
var _a, _b;
|
|
286
|
+
const name = this.getPropertyNameByRowId(rowId);
|
|
287
|
+
if (!name)
|
|
288
|
+
return;
|
|
289
|
+
const colName = this.columnMapping[name];
|
|
290
|
+
const col = colName ? (_b = (_a = this.dataFrame) === null || _a === void 0 ? void 0 : _a.col(colName)) !== null && _b !== void 0 ? _b : null : null;
|
|
291
|
+
this.openModeDialog(name, rowId, prop, editor, col);
|
|
292
|
+
});
|
|
293
|
+
gear.classList.add('statistics-mpo-gear');
|
|
294
|
+
return gear;
|
|
295
|
+
}
|
|
296
|
+
buildRowControls(rowId) {
|
|
297
|
+
const add = ui.icons.add(() => this.insertRowAfterRow(rowId));
|
|
298
|
+
const del = ui.icons.delete(() => this.deleteRow(rowId));
|
|
299
|
+
return ui.divH([add, del], 'statistics-mpo-control-buttons');
|
|
300
|
+
}
|
|
301
|
+
openModeDialog(name, rowId, prop, editor, mappedCol = null) {
|
|
302
|
+
new DesirabilityModeDialog(name, prop, (patch) => {
|
|
303
|
+
var _a;
|
|
304
|
+
const p = (_a = this.profile) === null || _a === void 0 ? void 0 : _a.properties[name];
|
|
305
|
+
if (p)
|
|
306
|
+
Object.assign(p, patch);
|
|
307
|
+
editor.redrawAll();
|
|
308
|
+
}, (newProp) => {
|
|
309
|
+
if (!this.profile)
|
|
310
|
+
return;
|
|
311
|
+
this.profile.properties[name] = newProp;
|
|
312
|
+
this.rebuildRow(name, rowId);
|
|
313
|
+
}, mappedCol).show();
|
|
314
|
+
}
|
|
315
|
+
getPropertyNameByRowId(rowId) {
|
|
316
|
+
var _a;
|
|
317
|
+
return (_a = Object.entries(this.rowIds)
|
|
318
|
+
.find(([, id]) => id === rowId)) === null || _a === void 0 ? void 0 : _a[0];
|
|
319
|
+
}
|
|
320
|
+
renameProperty(oldName, newName) {
|
|
321
|
+
var _a;
|
|
322
|
+
if (!this.profile || this.profile.properties[newName])
|
|
323
|
+
return;
|
|
324
|
+
const rowId = this.rowIds[oldName];
|
|
325
|
+
this.profile.properties[newName] = this.profile.properties[oldName];
|
|
326
|
+
delete this.profile.properties[oldName];
|
|
327
|
+
this.columnMapping[newName] = (_a = this.columnMapping[oldName]) !== null && _a !== void 0 ? _a : null;
|
|
328
|
+
delete this.columnMapping[oldName];
|
|
329
|
+
const idx = this.propertyOrder.indexOf(oldName);
|
|
330
|
+
if (idx >= 0)
|
|
331
|
+
this.propertyOrder[idx] = newName;
|
|
332
|
+
delete this.rowIds[oldName];
|
|
333
|
+
this.rowIds[newName] = rowId;
|
|
334
|
+
this.emitChange();
|
|
335
|
+
}
|
|
336
|
+
deleteRow(rowId) {
|
|
337
|
+
var _a;
|
|
338
|
+
const name = this.getPropertyNameByRowId(rowId);
|
|
339
|
+
if (!name || !this.profile)
|
|
340
|
+
return;
|
|
341
|
+
delete this.profile.properties[name];
|
|
342
|
+
delete this.columnMapping[name];
|
|
343
|
+
delete this.rowIds[name];
|
|
344
|
+
(_a = this.rowSubs.get(rowId)) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
345
|
+
this.rowSubs.delete(rowId);
|
|
346
|
+
const idx = this.propertyOrder.indexOf(name);
|
|
347
|
+
if (idx >= 0)
|
|
348
|
+
this.propertyOrder.splice(idx, 1);
|
|
349
|
+
const rowEl = this.rows[rowId];
|
|
350
|
+
delete this.rows[rowId];
|
|
351
|
+
if (this.propertyOrder.length === 0)
|
|
352
|
+
this.render();
|
|
75
353
|
else
|
|
76
|
-
|
|
354
|
+
rowEl === null || rowEl === void 0 ? void 0 : rowEl.remove();
|
|
355
|
+
this.emitChange();
|
|
356
|
+
}
|
|
357
|
+
insertRowAfterRow(rowId) {
|
|
358
|
+
var _a;
|
|
359
|
+
if (!this.profile)
|
|
360
|
+
return;
|
|
361
|
+
const afterName = this.getPropertyNameByRowId(rowId);
|
|
362
|
+
if (!afterName)
|
|
363
|
+
return;
|
|
364
|
+
const newName = `NewProperty${Object.keys(this.profile.properties).length + 1}`;
|
|
365
|
+
const newRowId = this.newRowId();
|
|
366
|
+
this.profile.properties[newName] = createDefaultNumerical();
|
|
367
|
+
this.rowIds[newName] = newRowId;
|
|
368
|
+
const idx = this.propertyOrder.indexOf(afterName);
|
|
369
|
+
this.propertyOrder.splice(idx + 1, 0, newName);
|
|
370
|
+
const newRow = this.buildRow(newName, newRowId, this.profile.properties[newName]);
|
|
371
|
+
this.rows[newRowId] = newRow;
|
|
372
|
+
(_a = this.rows[rowId]) === null || _a === void 0 ? void 0 : _a.after(newRow);
|
|
373
|
+
this.emitChange();
|
|
374
|
+
}
|
|
375
|
+
mutateProperty(name, updater) {
|
|
376
|
+
var _a;
|
|
377
|
+
const prop = (_a = this.profile) === null || _a === void 0 ? void 0 : _a.properties[name];
|
|
378
|
+
if (!prop)
|
|
379
|
+
return;
|
|
380
|
+
updater(prop);
|
|
381
|
+
this.emitChange();
|
|
382
|
+
}
|
|
383
|
+
emitChange() {
|
|
384
|
+
this.onChanged.next();
|
|
385
|
+
grok.events.fireCustomEvent(MPO_SCORE_CHANGED_EVENT, {});
|
|
77
386
|
}
|
|
78
387
|
}
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXBvLXByb2ZpbGUtZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibXBvLXByb2ZpbGUtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHdEMsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUc3QixNQUFNLE9BQU8sZ0JBQWdCO0lBTTNCLFlBQVksU0FBd0I7UUFMcEMsU0FBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFbEIsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFJeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxVQUFVLENBQUMsT0FBNkI7UUFDdEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO1lBQ3RELE9BQU87U0FDUjtRQUVELGtDQUFrQztRQUNsQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ3JCLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUMsS0FBSyxFQUFFLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFDLEVBQUMsQ0FBQztZQUNyRSxFQUFFLENBQUMs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QVksRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFDLEVBQUMsQ0FBQztvQkFDekYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSTtpQkFDekMsQ0FBQztnQkFDRixXQUFXLENBQUMsSUFBSTtnQkFDaEIsVUFBVSxDQUFDLElBQUksRUFBRSw4QkFBOEI7YUFDaEQsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUMsb0NBQW9DO1lBQ3hFLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxDQUFDLHFCQUFxQjtZQUN4RCxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsQ0FBQyx5REFBeUQ7WUFFMUYsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0M7UUFFaEUsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCO1NBQ3RGOztZQUNDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsOERBQThELENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuXG5pbXBvcnQge0Rlc2lyYWJpbGl0eVByb2ZpbGV9IGZyb20gJy4vbXBvJztcbmltcG9ydCB7TXBvRGVzaXJhYmlsaXR5TGluZUVkaXRvcn0gZnJvbSAnLi9tcG8tbGluZS1lZGl0b3InO1xuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcblxuXG5leHBvcnQgY2xhc3MgTXBvUHJvZmlsZUVkaXRvciB7XG4gIHJvb3QgPSB1aS5kaXYoW10pO1xuICBkYXRhRnJhbWU/OiBERy5EYXRhRnJhbWU7XG4gIG9uQ2hhbmdlZCA9IG5ldyBTdWJqZWN0KCk7XG4gIHByb2ZpbGU/OiBEZXNpcmFiaWxpdHlQcm9maWxlO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGFGcmFtZT86IERHLkRhdGFGcmFtZSkge1xuICAgIHRoaXMuZGF0YUZyYW1lID0gZGF0YUZyYW1lO1xuICAgIHRoaXMuc2V0UHJvZmlsZSgpO1xuICB9XG5cbiAgZ2V0UHJvZmlsZSgpOiBEZXNpcmFiaWxpdHlQcm9maWxlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wcm9maWxlO1xuICB9XG5cbiAgc2V0UHJvZmlsZShwcm9maWxlPzogRGVzaXJhYmlsaXR5UHJvZmlsZSkge1xuICAgIHRoaXMucHJvZmlsZSA9IHByb2ZpbGU7XG4gICAgdWkuZW1wdHkodGhpcy5yb290KTtcbiAgICBpZiAoIXByb2ZpbGUpIHtcbiAgICAgIHRoaXMucm9vdC5hcHBlbmQodWkuZGl2VGV4dCgnTm8gcHJvZmlsZSBzcGVjaWZpZWQuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBoZWFkZXIgcm93IGZvciB0aGUgdGFibGVcbiAgICBjb25zdCBoZWFkZXIgPSB1aS5kaXZIKFtcbiAgICAgIHVpLmRpdlRleHQoJ1Byb3BlcnR5Jywge3N0eWxlOiB7Zm9udFdlaWdodDogJ2JvbGQnLCB3aWR0aDogJzE1MHB4J319KSxcbiAgICAgIHVpLmRpdlRleHQoJ1dlaWdodCcsIHtzdHlsZToge2ZvbnRXZWlnaHQ6ICdib2xkJywgd2lkdGg6ICc2MHB4J319KSxcbiAgICAgIHVpLmRpdlRleHQoJ0Rlc2lyYWJpbGl0eScsIHtzdHlsZToge2ZvbnRXZWlnaHQ6ICdib2xkJywgZmxleEdyb3c6ICcxJ319KSwgLy8gTGV0IGVkaXRvciB0YWtlIHNwYWNlXG4gICAgXSwge3N0eWxlOiB7XG4gICAgICBtYXJnaW5Ub3A6ICcxMHB4JyxcbiAgICAgIHBhZGRpbmdCb3R0b206ICc1cHgnLFxuICAgICAgYm9yZGVyQm90dG9tOiAnMXB4IHNvbGlkICNjY2MnLFxuICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9wZXJ0eVJvd3MgPSBPYmplY3QuZW50cmllcyhwcm9maWxlLnByb3BlcnRpZXMpLm1hcCgoW3Byb3BlcnR5TmFtZSwgcHJvcF0pID0+IHtcbiAgICAgIGNvbnN0IGxpbmVFZGl0b3IgPSBuZXcgTXBvRGVzaXJhYmlsaXR5TGluZUVkaXRvcihwcm9wLCAzMDAsIDgwKTtcbiAgICAgIGxpbmVFZGl0b3Iub25DaGFuZ2VkLnN1YnNjcmliZSgoXykgPT4gdGhpcy5vbkNoYW5nZWQubmV4dCgpKTtcblxuICAgICAgLy8gSW5wdXQgZm9yIHdlaWdodCAtIHVwZGF0ZXMgdGhlICpjb3B5KiBvZiB0aGUgdGVtcGxhdGUgZGF0YVxuICAgICAgY29uc3Qgd2VpZ2h0SW5wdXQgPSB1aS5pbnB1dC5mbG9hdCgnJywgeyAvLyBObyBsYWJlbCBuZWVkZWQgaGVyZVxuICAgICAgICB2YWx1ZTogcHJvcC53ZWlnaHQsIG1pbjogMCwgbWF4OiAxLFxuICAgICAgICBvblZhbHVlQ2hhbmdlZDogKG5ld1ZhbHVlKSA9PiB7IC8vIENoYW5nZWQgcGFyYW1ldGVyIG5hbWUgZm9yIGNsYXJpdHlcbiAgICAgICAgICBpZiAocHJvZmlsZSAmJiBwcm9maWxlLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSkge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB3ZWlnaHQgaW4gdGhlIHRlbXBvcmFyeSB0ZW1wbGF0ZSBvYmplY3RcbiAgICAgICAgICAgIGxldCBjbGFtcGVkV2VpZ2h0ID0gbmV3VmFsdWUgPz8gMDtcbiAgICAgICAgICAgIGNsYW1wZWRXZWlnaHQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBjbGFtcGVkV2VpZ2h0KSk7IC8vIENsYW1wIDAtMVxuICAgICAgICAgICAgcHJvZmlsZS5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0ud2VpZ2h0ID0gY2xhbXBlZFdlaWdodDtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgd2VpZ2h0SW5wdXQucm9vdC5zdHlsZS53aWR0aCA9ICc2MHB4JztcbiAgICAgIHdlaWdodElucHV0LnJvb3Quc3R5bGUubWFyZ2luVG9wID0gJzIxcHgnO1xuXG4gICAgICBjb25zdCBtYXRjaGVkQ29sdW1uTmFtZSA9IHRoaXMuZGF0YUZyYW1lID9cbiAgICAgICAgdGhpcy5kYXRhRnJhbWUuY29sdW1ucy5uYW1lcygpLmZpbmQoKG5hbWUpID0+IG5hbWUudG9Mb3dlckNhc2UoKSA9PSBwcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKSkgOlxuICAgICAgICBudWxsO1xuXG4gICAgICBjb25zdCBjb2x1bW5JbnB1dCA9IHVpLmlucHV0LmNob2ljZSgnJywge1xuICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgaXRlbXM6IHRoaXMuZGF0YUZyYW1lPy5jb2x1bW5zPy5uYW1lcygpID8/IFsnJ10sXG4gICAgICAgIHZhbHVlOiBtYXRjaGVkQ29sdW1uTmFtZSA/PyAnJ30pO1xuXG4gICAgICBjb25zdCByb3dEaXYgPSB1aS5kaXZIKFtcbiAgICAgICAgdWkuZGl2VihbXG4gICAgICAgICAgdWkuZGl2VGV4dChwcm9wZXJ0eU5hbWUsIHtzdHlsZToge3dpZHRoOiAnMTUwcHgnLCBwYWRkaW5nVG9wOiAnNXB4JywgbWFyZ2luTGVmdDogJzRweCd9fSksXG4gICAgICAgICAgdGhpcy5kYXRhRnJhbWUgPyBjb2x1bW5JbnB1dC5yb290IDogbnVsbCxcbiAgICAgICAgXSksXG4gICAgICAgIHdlaWdodElucHV0LnJvb3QsXG4gICAgICAgIGxpbmVFZGl0b3Iucm9vdCwgLy8gQWRkIHRoZSBLb252YSBjb250YWluZXIgZGl2XG4gICAgICBdKTtcbiAgICAgIHJvd0Rpdi5zdHlsZS5hbGlnbkl0ZW1zID0gJ2NlbnRlcic7IC8vIFZlcnRpY2FsbHkgYWxpZ24gaXRlbXMgaW4gdGhlIHJvd1xuICAgICAgcm93RGl2LnN0eWxlLm1hcmdpbkJvdHRvbSA9ICc1cHgnOyAvLyBTcGFjZSBiZXR3ZWVuIHJvd3NcbiAgICAgIHJvd0Rpdi5zdHlsZS5taW5IZWlnaHQgPSAnNzBweCc7IC8vIEVuc3VyZSBjb25zaXN0ZW50IHJvdyBoZWlnaHQgZXZlbiBpZiBlZGl0b3IgdGFrZXMgdGltZVxuXG4gICAgICByZXR1cm4gcm93RGl2O1xuICAgIH0pLmZpbHRlcigoZWwpID0+IGVsICE9PSBudWxsKTsgLy8gRmlsdGVyIG91dCBza2lwcGVkIHByb3BlcnRpZXNcblxuICAgIGlmIChwcm9wZXJ0eVJvd3MubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5yb290LmFwcGVuZChoZWFkZXIpO1xuICAgICAgdGhpcy5yb290LmFwcGVuZCh1aS5kaXZWKHByb3BlcnR5Um93cyBhcyBIVE1MRWxlbWVudFtdKSk7IC8vIENhc3QgbmVlZGVkIGFmdGVyIGZpbHRlclxuICAgIH0gZWxzZVxuICAgICAgdGhpcy5yb290LmFwcGVuZCh1aS5kaXZUZXh0KCdObyBtYXRjaGluZyBwcm9wZXJ0aWVzIGZvdW5kIGluIHRoZSB0YWJsZSBmb3IgdGhpcyB0ZW1wbGF0ZS4nKSk7XG4gIH1cbn1cbiJdfQ==
|
|
388
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXBvLXByb2ZpbGUtZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibXBvLXByb2ZpbGUtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUUxQyxPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxtQkFBbUIsRUFBRSwwQkFBMEIsRUFFL0Msd0JBQXdCLEVBQUUsc0JBQXNCLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixHQUNuRixNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBcUIseUJBQXlCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUNwRyxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUUxRSxPQUFPLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUVoRCxNQUFNLDBCQUEwQixHQUFHLEVBQUUsQ0FBQztBQUV0QyxNQUFNLE9BQU8sZ0JBQWdCO0lBaUIzQixZQUFZLFNBQXdCLEVBQUUsTUFBTSxHQUFHLEtBQUssRUFBRSxPQUFPLEdBQUcsS0FBSztRQWhCNUQsU0FBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEIsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFLekMsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFUixTQUFJLEdBQWdDLEVBQUUsQ0FBQztRQUN2QyxXQUFNLEdBQTJCLEVBQUUsQ0FBQztRQUNwQyxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7UUFFMUMsa0JBQWEsR0FBYSxFQUFFLENBQUM7UUFDckMsa0JBQWEsR0FBa0MsRUFBRSxDQUFDO1FBR2hELElB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Q2xELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRS9DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2xGLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBRTdCLE1BQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMENBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRU8sY0FBYyxDQUNwQixJQUFZLEVBQ1osT0FBMEM7O1FBRTFDLE1BQU0sSUFBSSxHQUFHLE1BQUEsSUFBSSxDQUFDLE9BQU8sMENBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxJQUFJO1lBQ1AsT0FBTztRQUVULE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5cbmltcG9ydCB7U3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIERFRkFVTFRfQUdHUkVHQVRJT04sIFdFSUdIVEVEX0FHR1JFR0FUSU9OU19MSVNULFxuICBEZXNpcmFiaWxpdHlQcm9maWxlLCBQcm9wZXJ0eURlc2lyYWJpbGl0eSwgV2VpZ2h0ZWRBZ2dyZWdhdGlvbixcbiAgY3JlYXRlRGVmYXVsdENhdGVnb3JpY2FsLCBjcmVhdGVEZWZhdWx0TnVtZXJpY2FsLCBpc051bWVyaWNhbCwgbWlncmF0ZURlc2lyYWJpbGl0eSxcbn0gZnJvbSAnLi9tcG8nO1xuaW1wb3J0IHtEZXNpcmFiaWxpdHlFZGl0b3IsIERlc2lyYWJpbGl0eUVkaXRvckZhY3Rvcnl9IGZyb20gJy4vZWRpdG9ycy9kZXNpcmFiaWxpdHktZWRpdG9yLWZhY3RvcnknO1xuaW1wb3J0IHtEZXNpcmFiaWxpdHlNb2RlRGlhbG9nfSBmcm9tICcuL2RpYWxvZ3MvZGVzaXJhYmlsaXR5LW1vZGUtZGlhbG9nJztcblxuaW1wb3J0ICcuLi8uLi9jc3Mvc3R5bGVzLmNzcyc7XG5cbmltcG9ydCB7TVBPX1NDT1JFX0NIQU5HRURfRVZFTlR9IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBNQVhfQ0FURUdPUklDQUxfQ0FURUdPUklFUyA9IDIwO1xuXG5leHBvcnQgY2xhc3MgTXBvUHJvZmlsZUVkaXRvciB7XG4gIHJlYWRvbmx5IHJvb3QgPSB1aS5kaXYoW10pO1xuICByZWFkb25seSBvbkNoYW5nZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICByZWFkb25seSBhZ2dyZWdhdGlvbklucHV0OiBERy5DaG9pY2VJbnB1dDxXZWlnaHRlZEFnZ3JlZ2F0aW9uIHwgbnVsbD47XG5cbiAgcHJvZmlsZT86IERlc2lyYWJpbGl0eVByb2ZpbGU7XG4gIGRhdGFGcmFtZT86IERHLkRhdGFGcmFtZTtcbiAgZGVzaWduID0gZmFsc2U7XG4gIHByZXZpZXcgPSBmYWxzZTtcblxuICBwcml2YXRlIHJvd3M6IFJlY29yZDxzdHJpbmcsIEhUTUxFbGVtZW50PiA9IHt9O1xuICBwcml2YXRlIHJvd0lkczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIHJvd1N1YnMgPSBuZXcgTWFwPHN0cmluZywgU3Vic2NyaXB0aW9uPigpO1xuXG4gIHByaXZhdGUgcHJvcGVydHlPcmRlcjogc3RyaW5nW10gPSBbXTtcbiAgY29sdW1uTWFwcGluZzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihkYXRhRnJhbWU/OiBERy5EYXRhRnJhbWUsIGRlc2lnbiA9IGZhbHNlLCBwcmV2aWV3ID0gZmFsc2UpIHtcbiAgICB0aGlzLmRhdGFGcmFtZSA9IGRhdGFGcmFtZTtcbiAgICB0aGlzLmRlc2lnbiA9IGRlc2lnbjtcbiAgICB0aGlzLnByZXZpZXcgPSBwcmV2aWV3O1xuICAgIHRoaXMuYWdncmVnYXRpb25JbnB1dCA9IHVpLmlucHV0LmNob2ljZSgnQWdncmVnYXRpb24nLCB7XG4gICAgICBpdGVtczogV0VJR0hURURfQUdHUkVHQVRJT05TX0xJU1QsXG4gICAgICB2YWx1ZTogREVGQVVMVF9BR0dSRUdBVElPTixcbiAgICAgIG51bGxhYmxlOiBmYWxzZSxcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAodikgPT4ge1xuICAgICAgICBpZiAodGhpcy5wcm9maWxlKVxuICAgICAgICAgIHRoaXMucHJvZmlsZS5hZ2dyZWdhdGlvbiA9IHY7XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLmFnZ3JlZ2F0aW9uSW5wdXQuc2V0VG9vbHRpcCgnU2NvcmUgYWdncmVnYXRpb24gbWV0aG9kJyk7XG4gIH1cblxuICBwcml2YXRlIG5ld1Jvd0lkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7XG4gIH1cblxuICBzZXRQcm9maWxlKHByb2ZpbGU/OiBEZXNpcmFiaWxpdHlQcm9maWxlKTogdm9pZCB7XG4gICAgaWYgKHByb2ZpbGUpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHByb2ZpbGUucHJvcGVydGllcykpIHtcbiAgICAgICAgY29uc3QgcHJvcCA9IG1pZ3JhdGVEZXNpcmFiaWxpdHkocHJvZmlsZS5wcm9wZXJ0aWVzW2tleV0pO1xuICAgICAgICBpZiAoaXNOdW1lcmljYWwocHJvcCkpXG4gICAgICAgICAgcHJvcC5tb2RlID8/PSAnZnJlZWZvcm0nO1xuICAgICAgICBwcm9maWxlLnByb3BlcnRpZXNba2V5XSA9IHByb3A7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzdWIgb2YgdGhpcy5yb3dTdWJzLnZhbHVlcygpKVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5yb3dTdWJzLmNsZWFyKCk7XG5cbiAgICB0aGlzLnByb2ZpbGUgPSBwcm9maWxlO1xuICAgIHRoaXMuYWdncmVnYXRpb25JbnB1dC52YWx1ZSA9IHByb2ZpbGU/LmFnZ3JlZ2F0aW9uID8/IERFRkFVTFRfQUdHUkVHQVRJT047XG4gICAgdGhpcy5jb2x1bW5NYXBwaW5nID0ge307XG4gICAgdGhpcy5yb3dzID0ge307XG4gICAgdGhpcy5yb3dJZHMgPSB7fTtcbiAgICB0aGlzLnByb3BlcnR5T3JkZXIgPSBwcm9maWxlID8gT2JqZWN0LmtleXMocHJvZmlsZS5wcm9wZXJ0aWVzKSA6IFtdO1xuXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMucHJvcGVydHlPcmRlcilcbiAgICAgIHRoaXMucm93SWRzW25hbWVdID0gdGhpcy5uZXdSb3dJZCgpO1xuXG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIGdldFByb2ZpbGUoKTogRGVzaXJhYmlsaXR5UHJvZmlsZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucHJvZmlsZTtcbiAgfVxuXG4gIHNldERlc2lnbk1vZGUob246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZXNpZ24gPT09IG9uKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuZGVzaWduID0gb247XG4gICAgdGhpcy5yb3dzID0ge307XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIHNldFByZXZpZXdNb2RlKG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJldmlldyA9PT0gb24pXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5wcmV2aWV3ID0gb247XG4gICAgdGhpcy5yb3dzID0ge307XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyKCk6IHZvaWQge1xuICAgIHVpLmVtcHR5KHRoaXMucm9vdCk7XG5cbiAgICBpZiAoIXRoaXMucHJvZmlsZSlcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckVtcHR5KCdObyBwcm9maWxlIHNwZWNpZmllZC4nKTtcblxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnByb3BlcnR5T3JkZXIubWFwKChuYW1lKSA9PiB7XG4gICAgICBjb25zdCByb3dJZCA9IHRoaXMucm93SWRzW25hbWVdO1xuICAgICAgaWYgKCF0aGlzLnJvd3Nbcm93SWRdKVxuICAgICAgICB0aGlzLnJvd3Nbcm93SWRdID0gdGhpcy5idWlsZFJvdyhuYW1lLCByb3dJZCwgdGhpcy5wcm9maWxlIS5wcm9wZXJ0aWVzW25hbWVdKTtcbiAgICAgIHJldHVybiB0aGlzLnJvd3Nbcm93SWRdO1xuICAgIH0pO1xuXG4gICAgaWYgKCFyb3dzLmxlbmd0aCkge1xuICAgICAgaWYgKCF0aGlzLnByZXZpZXcpXG4gICAgICAgIHRoaXMucm9vdC5hcHBlbmQodGhpcy5idWlsZEhlYWRlcigpKTtcbiAgICAgIGlmICh0aGlzLmRlc2lnbilcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRGVzaWduRW1wdHkoKTtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckVtcHR5KCdObyBwcm9wZXJ0aWVzIGRlZmluZWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZpZXcpXG4gICAgICB0aGlzLnJvb3QuYXBwZW5kKHRoaXMuYnVpbGRIZWFkZXIoKSk7XG4gICAgdGhpcy5yb290LmFwcGVuZCh1aS5kaXZWKHJvd3MpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyRW1wdHkodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yb290LmFwcGVuZCh1aS5kaXZUZXh0KHRleHQpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyRGVzaWduRW1wdHkoKTogdm9pZCB7XG4gICAgY29uc3QgaWNvbiA9IHVpLmljb25GQSgnY2hhcnQtbGluZScpO1xuICAgIGNvbnN0IGhlYWRpbmcgPSB1aS5oMygnTm8gcHJvcGVydGllcyB5ZXQnKTtcbiAgICBjb25zdCBtc2cgPSB1aS5wKCdTZWxlY3QgYSBkYXRhc2V0IHRvIGF1dG8tcG9wdWxhdGUgcHJvcGVydGllcyBmcm9tIGl0cyBudW1lcmljYWwgY29sdW1ucywgb3IgYWRkIHRoZW0gbWFudWFsbHkuJyk7XG4gICAgY29uc3QgYWRkQnRuID0gdWkubGluaygnKyBBZGQgUHJvcGVydHknLCAoKSA9PiB0aGlzLmFkZFByb3BlcnR5KCkpO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHVpLmRpdlYoW2ljb24sIGhlYWRpbmcsIG1zZywgYWRkQnRuXSwgJ3N0YXRpc3RpY3MtbXBvLWVtcHR5LXN0YXRlJyk7XG4gICAgdGhpcy5yb290LmFwcGVuZChjb250YWluZXIpO1xuICB9XG5cbiAgYWRkUHJvcGVydHkoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByb2ZpbGUpXG4gICAgICByZXR1cm47XG5cbiAgICBjb25zdCBuZXdOYW1lID0gYE5ld1Byb3BlcnR5JHtPYmplY3Qua2V5cyh0aGlzLnByb2ZpbGUucHJvcGVydGllcykubGVuZ3RoICsgMX1gO1xuICAgIGNvbnN0IG5ld1Jvd0lkID0gdGhpcy5uZXdSb3dJZCgpO1xuXG4gICAgdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbbmV3TmFtZV0gPSBjcmVhdGVEZWZhdWx0TnVtZXJpY2FsKCk7XG4gICAgdGhpcy5yb3dJZHNbbmV3TmFtZV0gPSBuZXdSb3dJZDtcbiAgICB0aGlzLnByb3BlcnR5T3JkZXIucHVzaChuZXdOYW1lKTtcblxuICAgIHRoaXMucm93cyA9IHt9O1xuICAgIHRoaXMucmVuZGVyKCk7XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkSGVhZGVyKCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdWkuZGl2SChbXG4gICAgICB1aS5kaXZUZXh0KCdQcm9wZXJ0eScsICdzdGF0aXN0aWNzLW1wby1oZWFkZXItcHJvcGVydHknKSxcbiAgICAgIHVpLmRpdlRleHQoJ1dlaWdodCcsICdzdGF0aXN0aWNzLW1wby1oZWFkZXItd2VpZ2h0JyksXG4gICAgICB1aS5kaXZUZXh0KCdEZXNpcmFiaWxpdHknLCAnc3RhdGlzdGljcy1tcG8taGVhZGVyLWRlc2lyYWJpbGl0eScpLFxuICAgIF0sICdzdGF0aXN0aWNzLW1wby1oZWFkZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRSb3coXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHJvd0lkOiBzdHJpbmcsXG4gICAgcHJvcDogUHJvcGVydHlEZXNpcmFiaWxpdHksXG4gICk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCByb3cgPSB1aS5kaXZIKFtdLCAnc3RhdGlzdGljcy1tcG8tcm93Jyk7XG4gICAgcm93LmRhdGFzZXQucm93SWQgPSByb3dJZDtcblxuICAgIGNvbnN0IGNvbCA9IHRoaXMucmVzb2x2ZUNvbHVtbihuYW1lKTtcbiAgICBpZiAoY29sKSB7XG4gICAgICBjb25zdCBjb3JyZWN0ZWQgPSB0aGlzLmNvcnJlY3RQcm9wZXJ0eVR5cGUocHJvcCwgY29sKTtcbiAgICAgIGlmIChjb3JyZWN0ZWQpIHtcbiAgICAgICAgcHJvcCA9IGNvcnJlY3RlZDtcbiAgICAgICAgdGhpcy5wcm9maWxlIS5wcm9wZXJ0aWVzW25hbWVdID0gcHJvcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlZGl0b3IgPSBEZXNpcmFiaWxpdHlFZGl0b3JGYWN0b3J5LmNyZWF0ZShwcm9wLCAzMDAsIDgwLCB0aGlzLmRlc2lnbik7XG4gICAgdGhpcy5yb3dTdWJzLmdldChyb3dJZCk/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5yb3dTdWJzLnNldChyb3dJZCwgZWRpdG9yLm9uQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5lbWl0Q2hhbmdlKCkpKTtcblxuICAgIGNvbnN0IHByb3BlcnR5Q2VsbCA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNlbGwocm93SWQsIG5hbWUpO1xuICAgIGNvbnN0IHdlaWdodENlbGwgPSB0aGlzLmJ1aWxkV2VpZ2h0Q2VsbChyb3dJZCwgcHJvcCk7XG4gICAgY29uc3QgY29sdW1uQ2VsbCA9IHRoaXMuYnVpbGRDb2x1bW5TZWxlY3Rvcihyb3dJZCwgbmFtZSwgZWRpdG9yKTtcblxuICAgIGNvbnN0IG1vZGVHZWFyID0gdGhpcy5kZXNpZ24gP1xuICAgICAgdGhpcy5idWlsZE1vZGVHZWFyKHJvd0lkLCBwcm9wLCBlZGl0b3IpIDpcbiAgICAgIG51bGw7XG5cbiAgICBjb25zdCBjb250cm9scyA9IHRoaXMuZGVzaWduID8gdGhpcy5idWlsZFJvd0NvbnRyb2xzKHJvd0lkKSA6IG51bGw7XG5cbiAgICByb3cuYXBwZW5kKFxuICAgICAgdWkuZGl2VihbcHJvcGVydHlDZWxsLCBjb2x1bW5DZWxsXS5maWx0ZXIoQm9vbGVhbiksICdzdGF0aXN0aWNzLW1wby1wcm9wZXJ0eS1jZWxsJyksXG4gICAgICB3ZWlnaHRDZWxsLFxuICAgICAgdWkuZGl2SChbZWRpdG9yLnJvb3QsIG1vZGVHZWFyXS5maWx0ZXIoQm9vbGVhbikpLFxuICAgICk7XG5cbiAgICBpZiAoY29udHJvbHMpXG4gICAgICByb3cuYXBwZW5kKGNvbnRyb2xzKTtcblxuICAgIHJldHVybiByb3c7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUHJvcGVydHlDZWxsKHJvd0lkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuZGF0YUZyYW1lKSB7XG4gICAgICBjb25zdCBlbCA9IHVpLmRpdlRleHQobmFtZSk7XG4gICAgICB1aS50b29sdGlwLmJpbmQoZWwsICgpID0+IG5hbWUpO1xuICAgICAgcmV0dXJuIGVsO1xuICAgIH1cblxuICAgIGxldCBjdXJyZW50TmFtZSA9IG5hbWU7XG5cbiAgICBjb25zdCBwcm9wTmFtZUlucCA9IHVpLmlucHV0LnN0cmluZygnJywge3ZhbHVlOiBuYW1lLCBvblZhbHVlQ2hhbmdlZDogKHYpID0+IHtcbiAgICAgIGlmICghdiB8fCB2ID09PSBjdXJyZW50TmFtZSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgdGhpcy5yZW5hbWVQcm9wZXJ0eShjdXJyZW50TmFtZSwgdik7XG4gICAgICBjdXJyZW50TmFtZSA9IHY7XG4gICAgfX0pO1xuXG4gICAgdWkudG9vbHRpcC5iaW5kKHByb3BOYW1lSW5wLmlucHV0LCAoKSA9PiBjdXJyZW50TmFtZSk7XG4gICAgcmV0dXJuIHByb3BOYW1lSW5wLnJvb3Q7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkV2VpZ2h0Q2VsbChcbiAgICByb3dJZDogc3RyaW5nLFxuICAgIHByb3A6IFByb3BlcnR5RGVzaXJhYmlsaXR5LFxuICApOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0UHJvcGVydHlOYW1lQnlSb3dJZChyb3dJZCk7XG4gICAgY29uc3QgY2hpbGRyZW46IEhUTUxFbGVtZW50W10gPSBbXTtcblxuICAgIGNvbnN0IHdlaWdodElucHV0ID0gdWkuaW5wdXQuZmxvYXQoJycsIHt2YWx1ZTogcHJvcC53ZWlnaHQsIG1pbjogMCwgbWF4OiAxLCBmb3JtYXQ6ICcjMC4wMDAnLFxuICAgICAgb25WYWx1ZUNoYW5nZWQ6ICh2KSA9PiB7XG4gICAgICAgIGlmIChuYW1lKVxuICAgICAgICAgIHRoaXMubXV0YXRlUHJvcGVydHkobmFtZSwgKHApID0+IHAud2VpZ2h0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdiA/PyAwKSkpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB3ZWlnaHRJbnB1dC5yb290LmNsYXNzTGlzdC5hZGQoJ3N0YXRpc3RpY3MtbXBvLXdlaWdodC1pbnB1dCcpO1xuICAgIGNoaWxkcmVuLnB1c2god2VpZ2h0SW5wdXQucm9vdCk7XG5cbiAgICBpZiAodGhpcy5kYXRhRnJhbWUpIHtcbiAgICAgIGNvbnN0IG51bUNvbHMgPSB0aGlzLmdldE51bWVyaWNhbENvbHVtbk5hbWVzKCk7XG4gICAgICBsZXQgaXNDb2x1bW4gPSAhIXByb3Aud2VpZ2h0Q29sdW1uICYmIG51bUNvbHMuaW5jbHVkZXMocHJvcC53ZWlnaHRDb2x1bW4pO1xuXG4gICAgICBjb25zdCBjb2xJbnB1dCA9IHVpLmlucHV0LmNob2ljZSgnJywge2l0ZW1zOiBudW1Db2xzLCBudWxsYWJsZTogdHJ1ZSwgdmFsdWU6IHByb3Aud2VpZ2h0Q29sdW1uID8/ICcnLFxuICAgICAgICBvblZhbHVlQ2hhbmdlZDogKHYpID0+IHtcbiAgICAgICAgICBpZiAobmFtZSlcbiAgICAgICAgICAgIHRoaXMubXV0YXRlUHJvcGVydHkobmFtZSwgKHApID0+IHAud2VpZ2h0Q29sdW1uID0gdiB8fCB1bmRlZmluZWQpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHN5bmNUb2dnbGUgPSAoKSA9PiB7XG4gICAgICAgIHdlaWdodElucHV0LnJvb3QuY2xhc3NMaXN0LnRvZ2dsZSgnc3RhdGlzdGljcy1tcG8taGlkZGVuJywgaXNDb2x1bW4pO1xuICAgICAgICBjb2xJbnB1dC5yb290LmNsYXNzTGlzdC50b2dnbGUoJ3N0YXRpc3RpY3MtbXBvLWhpZGRlbicsICFpc0NvbHVtbik7XG4gICAgICAgIHRvZ2dsZS5jbGFzc0xpc3QudG9nZ2xlKCdzdGF0aXN0aWNzLW1wby13ZWlnaHQtdG9nZ2xlLWFjdGl2ZScsIGlzQ29sdW1uKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHRvZ2dsZSA9IHVpLmljb25GQSgnY29sdW1ucycsICgpID0+IHtcbiAgICAgICAgaXNDb2x1bW4gPSAhaXNDb2x1bW47XG4gICAgICAgIHN5bmNUb2dnbGUoKTtcbiAgICAgICAgaWYgKCFpc0NvbHVtbiAmJiBuYW1lKVxuICAgICAgICAgIHRoaXMubXV0YXRlUHJvcGVydHkobmFtZSwgKHApID0+IHsgZGVsZXRlIHAud2VpZ2h0Q29sdW1uOyB9KTtcbiAgICAgICAgZWxzZSBpZiAoaXNDb2x1bW4gJiYgbmFtZSAmJiBjb2xJbnB1dC52YWx1ZSlcbiAgICAgICAgICB0aGlzLm11dGF0ZVByb3BlcnR5KG5hbWUsIChwKSA9PiBwLndlaWdodENvbHVtbiA9IGNvbElucHV0LnZhbHVlIHx8IHVuZGVmaW5lZCk7XG4gICAgICB9KTtcbiAgICAgIHRvZ2dsZS5jbGFzc0xpc3QuYWRkKCdzdGF0aXN0aWNzLW1wby13ZWlnaHQtdG9nZ2xlJyk7XG4gICAgICB1aS50b29sdGlwLmJpbmQodG9nZ2xlLCAoKSA9PiBpc0NvbHVtbiA/ICdTd2l0Y2ggdG8gbWFudWFsIHdlaWdodCcgOiAnVXNlIHdlaWdodCBmcm9tIGNvbHVtbicpO1xuICAgICAgc3luY1RvZ2dsZSgpO1xuXG4gICAgICBjaGlsZHJlbi5wdXNoKGNvbElucHV0LnJvb3QsIHRvZ2dsZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVpLmRpdkgoY2hpbGRyZW4sICdzdGF0aXN0aWNzLW1wby13ZWlnaHQtY2VsbCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZENvbHVtblNlbGVjdG9yKFxuICAgIHJvd0lkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGVkaXRvcjogRGVzaXJhYmlsaXR5RWRpdG9yLFxuICApOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGlmICghdGhpcy5kYXRhRnJhbWUpXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRFbGlnaWJsZUNvbHVtbk5hbWVzKCk7XG4gICAgY29uc3QgbWF0Y2hlZCA9IHRoaXMuY29sdW1uTWFwcGluZ1tuYW1lXSA/PyBudWxsO1xuXG4gICAgaWYgKG1hdGNoZWQpIHtcbiAgICAgIGNvbnN0IGNvbCA9IHRoaXMuZGF0YUZyYW1lLmNvbChtYXRjaGVkKTtcbiAgICAgIGVkaXRvci5zZXRDb2x1bW4/Lihjb2wpO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0ID0gdWkuaW5wdXQuY2hvaWNlKCcnLCB7aXRlbXMsIG51bGxhYmxlOiB0cnVlLCB2YWx1ZTogbWF0Y2hlZCA/PyAnJywgb25WYWx1ZUNoYW5nZWQ6ICh2KSA9PiB7XG4gICAgICB0aGlzLmNvbHVtbk1hcHBpbmdbbmFtZV0gPSB2ID8/IG51bGw7XG4gICAgICBjb25zdCBjb2wgPSB2ID8gdGhpcy5kYXRhRnJhbWUhLmNvbCh2KSA6IG51bGw7XG4gICAgICBpZiAoY29sICYmIHRoaXMuc3dpdGNoUHJvcGVydHlUeXBlKG5hbWUsIHJvd0lkLCBjb2wpKVxuICAgICAgICByZXR1cm47XG4gICAgICBlZGl0b3Iuc2V0Q29sdW1uPy4oY29sKTtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH19KTtcbiAgICByZXR1cm4gaW5wdXQucm9vdDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RWxpZ2libGVDb2x1bW5OYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLmRhdGFGcmFtZSlcbiAgICAgIHJldHVybiBbXTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmRhdGFGcmFtZS5jb2x1bW5zKVxuICAgICAgLmZpbHRlcigoYykgPT4gIWMuaXNDYXRlZ29yaWNhbCB8fCBjLmNhdGVnb3JpZXMubGVuZ3RoIDw9IE1BWF9DQVRFR09SSUNBTF9DQVRFR09SSUVTKVxuICAgICAgLm1hcCgoYykgPT4gYy5uYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TnVtZXJpY2FsQ29sdW1uTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5kYXRhRnJhbWUpXG4gICAgICByZXR1cm4gW107XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5kYXRhRnJhbWUuY29sdW1ucy5udW1lcmljYWwpLm1hcCgoYykgPT4gYy5uYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUNvbHVtbihuYW1lOiBzdHJpbmcpOiBERy5Db2x1bW4gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuZGF0YUZyYW1lKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZWxpZ2libGUgPSB0aGlzLmdldEVsaWdpYmxlQ29sdW1uTmFtZXMoKTtcbiAgICBjb25zdCBjb2xOYW1lID0gdGhpcy5jb2x1bW5NYXBwaW5nW25hbWVdID8/IGVsaWdpYmxlLmZpbmQoKGMpID0+IGMudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpKSA/PyBudWxsO1xuICAgIGlmIChjb2xOYW1lKVxuICAgICAgdGhpcy5jb2x1bW5NYXBwaW5nW25hbWVdID0gY29sTmFtZTtcbiAgICByZXR1cm4gY29sTmFtZSA/IHRoaXMuZGF0YUZyYW1lLmNvbChjb2xOYW1lKSA/PyBudWxsIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY29ycmVjdFByb3BlcnR5VHlwZShwcm9wOiBQcm9wZXJ0eURlc2lyYWJpbGl0eSwgY29sOiBERy5Db2x1bW4pOiBQcm9wZXJ0eURlc2lyYWJpbGl0eSB8IG51bGwge1xuICAgIGlmIChpc051bWVyaWNhbChwcm9wKSAmJiBjb2wuaXNDYXRlZ29yaWNhbCkge1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IGNvbC5jYXRlZ29yaWVzLm1hcCgoYzogc3RyaW5nKSA9PiAoe25hbWU6IGMsIGRlc2lyYWJpbGl0eTogMX0pKTtcbiAgICAgIHJldHVybiBjcmVhdGVEZWZhdWx0Q2F0ZWdvcmljYWwocHJvcC53ZWlnaHQsIGNhdGVnb3JpZXMpO1xuICAgIH1cblxuICAgIGlmICghaXNOdW1lcmljYWwocHJvcCkgJiYgY29sLmlzTnVtZXJpY2FsKVxuICAgICAgcmV0dXJuIGNyZWF0ZURlZmF1bHROdW1lcmljYWwocHJvcC53ZWlnaHQsIGNvbC5taW4sIGNvbC5tYXgpO1xuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHN3aXRjaFByb3BlcnR5VHlwZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcm93SWQ6IHN0cmluZyxcbiAgICBjb2w6IERHLkNvbHVtbixcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnByb2ZpbGUpXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBjb3JyZWN0ZWQgPSB0aGlzLmNvcnJlY3RQcm9wZXJ0eVR5cGUodGhpcy5wcm9maWxlLnByb3BlcnRpZXNbbmFtZV0sIGNvbCk7XG4gICAgaWYgKCFjb3JyZWN0ZWQpXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICB0aGlzLnByb2ZpbGUucHJvcGVydGllc1tuYW1lXSA9IGNvcnJlY3RlZDtcbiAgICB0aGlzLnJlYnVpbGRSb3cobmFtZSwgcm93SWQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSByZWJ1aWxkUm93KG5hbWU6IHN0cmluZywgcm93SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG9sZFJvdyA9IHRoaXMucm93c1tyb3dJZF07XG4gICAgY29uc3QgbmV3Um93ID0gdGhpcy5idWlsZFJvdyhuYW1lLCByb3dJZCwgdGhpcy5wcm9maWxlIS5wcm9wZXJ0aWVzW25hbWVdKTtcbiAgICB0aGlzLnJvd3Nbcm93SWRdID0gbmV3Um93O1xuXG4gICAgaWYgKG9sZFJvdz8ucGFyZW50Tm9kZSlcbiAgICAgIG9sZFJvdy5yZXBsYWNlV2l0aChuZXdSb3cpO1xuXG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTW9kZUdlYXIoXG4gICAgcm93SWQ6IHN0cmluZyxcbiAgICBwcm9wOiBQcm9wZXJ0eURlc2lyYWJpbGl0eSxcbiAgICBlZGl0b3I6IERlc2lyYWJpbGl0eUVkaXRvcixcbiAgKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGdlYXIgPSB1aS5pY29ucy5zZXR0aW5ncygoKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gdGhpcy5nZXRQcm9wZXJ0eU5hbWVCeVJvd0lkKHJvd0lkKTtcbiAgICAgIGlmICghbmFtZSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgY29sTmFtZSA9IHRoaXMuY29sdW1uTWFwcGluZ1tuYW1lXTtcbiAgICAgIGNvbnN0IGNvbCA9IGNvbE5hbWUgPyB0aGlzLmRhdGFGcmFtZT8uY29sKGNvbE5hbWUpID8/IG51bGwgOiBudWxsO1xuICAgICAgdGhpcy5vcGVuTW9kZURpYWxvZyhuYW1lLCByb3dJZCwgcHJvcCwgZWRpdG9yLCBjb2wpO1xuICAgIH0pO1xuXG4gICAgZ2Vhci5jbGFzc0xpc3QuYWRkKCdzdGF0aXN0aWNzLW1wby1nZWFyJyk7XG4gICAgcmV0dXJuIGdlYXI7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUm93Q29udHJvbHMocm93SWQ6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBhZGQgPSB1aS5pY29ucy5hZGQoKCkgPT4gdGhpcy5pbnNlcnRSb3dBZnRlclJvdyhyb3dJZCkpO1xuICAgIGNvbnN0IGRlbCA9IHVpLmljb25zLmRlbGV0ZSgoKSA9PiB0aGlzLmRlbGV0ZVJvdyhyb3dJZCkpO1xuICAgIHJldHVybiB1aS5kaXZIKFthZGQsIGRlbF0sICdzdGF0aXN0aWNzLW1wby1jb250cm9sLWJ1dHRvbnMnKTtcbiAgfVxuXG4gIHByaXZhdGUgb3Blbk1vZGVEaWFsb2coXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHJvd0lkOiBzdHJpbmcsXG4gICAgcHJvcDogUHJvcGVydHlEZXNpcmFiaWxpdHksXG4gICAgZWRpdG9yOiBEZXNpcmFiaWxpdHlFZGl0b3IsXG4gICAgbWFwcGVkQ29sOiBERy5Db2x1bW4gfCBudWxsID0gbnVsbCxcbiAgKTogdm9pZCB7XG4gICAgbmV3IERlc2lyYWJpbGl0eU1vZGVEaWFsb2coXG4gICAgICBuYW1lLFxuICAgICAgcHJvcCxcbiAgICAgIChwYXRjaCkgPT4ge1xuICAgICAgICBjb25zdCBwID0gdGhpcy5wcm9maWxlPy5wcm9wZXJ0aWVzW25hbWVdO1xuICAgICAgICBpZiAocClcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHAsIHBhdGNoKTtcbiAgICAgICAgZWRpdG9yLnJlZHJhd0FsbCgpO1xuICAgICAgfSxcbiAgICAgIChuZXdQcm9wKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5wcm9maWxlKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbbmFtZV0gPSBuZXdQcm9wO1xuICAgICAgICB0aGlzLnJlYnVpbGRSb3cobmFtZSwgcm93SWQpO1xuICAgICAgfSxcbiAgICAgIG1hcHBlZENvbCxcbiAgICApLnNob3coKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHJvcGVydHlOYW1lQnlSb3dJZChyb3dJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5yb3dJZHMpXG4gICAgICAuZmluZCgoWywgaWRdKSA9PiBpZCA9PT0gcm93SWQpPy5bMF07XG4gIH1cblxuICBwcml2YXRlIHJlbmFtZVByb3BlcnR5KG9sZE5hbWU6IHN0cmluZywgbmV3TmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByb2ZpbGUgfHwgdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbbmV3TmFtZV0pXG4gICAgICByZXR1cm47XG5cbiAgICBjb25zdCByb3dJZCA9IHRoaXMucm93SWRzW29sZE5hbWVdO1xuICAgIHRoaXMucHJvZmlsZS5wcm9wZXJ0aWVzW25ld05hbWVdID0gdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbb2xkTmFtZV07XG4gICAgZGVsZXRlIHRoaXMucHJvZmlsZS5wcm9wZXJ0aWVzW29sZE5hbWVdO1xuXG4gICAgdGhpcy5jb2x1bW5NYXBwaW5nW25ld05hbWVdID0gdGhpcy5jb2x1bW5NYXBwaW5nW29sZE5hbWVdID8/IG51bGw7XG4gICAgZGVsZXRlIHRoaXMuY29sdW1uTWFwcGluZ1tvbGROYW1lXTtcblxuICAgIGNvbnN0IGlkeCA9IHRoaXMucHJvcGVydHlPcmRlci5pbmRleE9mKG9sZE5hbWUpO1xuICAgIGlmIChpZHggPj0gMClcbiAgICAgIHRoaXMucHJvcGVydHlPcmRlcltpZHhdID0gbmV3TmFtZTtcblxuICAgIGRlbGV0ZSB0aGlzLnJvd0lkc1tvbGROYW1lXTtcbiAgICB0aGlzLnJvd0lkc1tuZXdOYW1lXSA9IHJvd0lkO1xuXG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGRlbGV0ZVJvdyhyb3dJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0UHJvcGVydHlOYW1lQnlSb3dJZChyb3dJZCk7XG4gICAgaWYgKCFuYW1lIHx8ICF0aGlzLnByb2ZpbGUpXG4gICAgICByZXR1cm47XG5cbiAgICBkZWxldGUgdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbbmFtZV07XG4gICAgZGVsZXRlIHRoaXMuY29sdW1uTWFwcGluZ1tuYW1lXTtcbiAgICBkZWxldGUgdGhpcy5yb3dJZHNbbmFtZV07XG4gICAgdGhpcy5yb3dTdWJzLmdldChyb3dJZCk/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5yb3dTdWJzLmRlbGV0ZShyb3dJZCk7XG5cbiAgICBjb25zdCBpZHggPSB0aGlzLnByb3BlcnR5T3JkZXIuaW5kZXhPZihuYW1lKTtcbiAgICBpZiAoaWR4ID49IDApXG4gICAgICB0aGlzLnByb3BlcnR5T3JkZXIuc3BsaWNlKGlkeCwgMSk7XG5cbiAgICBjb25zdCByb3dFbCA9IHRoaXMucm93c1tyb3dJZF07XG4gICAgZGVsZXRlIHRoaXMucm93c1tyb3dJZF07XG5cbiAgICBpZiAodGhpcy5wcm9wZXJ0eU9yZGVyLmxlbmd0aCA9PT0gMClcbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgZWxzZVxuICAgICAgcm93RWw/LnJlbW92ZSgpO1xuXG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGluc2VydFJvd0FmdGVyUm93KHJvd0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucHJvZmlsZSlcbiAgICAgIHJldHVybjtcblxuICAgIGNvbnN0IGFmdGVyTmFtZSA9IHRoaXMuZ2V0UHJvcGVydHlOYW1lQnlSb3dJZChyb3dJZCk7XG4gICAgaWYgKCFhZnRlck5hbWUpXG4gICAgICByZXR1cm47XG5cbiAgICBjb25zdCBuZXdOYW1lID0gYE5ld1Byb3BlcnR5JHtPYmplY3Qua2V5cyh0aGlzLnByb2ZpbGUucHJvcGVydGllcykubGVuZ3RoICsgMX1gO1xuICAgIGNvbnN0IG5ld1Jvd0lkID0gdGhpcy5uZXdSb3dJZCgpO1xuXG4gICAgdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbbmV3TmFtZV0gPSBjcmVhdGVEZWZhdWx0TnVtZXJpY2FsKCk7XG5cbiAgICB0aGlzLnJvd0lkc1tuZXdOYW1lXSA9IG5ld1Jvd0lkO1xuXG4gICAgY29uc3QgaWR4ID0gdGhpcy5wcm9wZXJ0eU9yZGVyLmluZGV4T2YoYWZ0ZXJOYW1lKTtcbiAgICB0aGlzLnByb3BlcnR5T3JkZXIuc3BsaWNlKGlkeCArIDEsIDAsIG5ld05hbWUpO1xuXG4gICAgY29uc3QgbmV3Um93ID0gdGhpcy5idWlsZFJvdyhuZXdOYW1lLCBuZXdSb3dJZCwgdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbbmV3TmFtZV0pO1xuICAgIHRoaXMucm93c1tuZXdSb3dJZF0gPSBuZXdSb3c7XG5cbiAgICB0aGlzLnJvd3Nbcm93SWRdPy5hZnRlcihuZXdSb3cpO1xuICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBtdXRhdGVQcm9wZXJ0eShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdXBkYXRlcjogKHA6IFByb3BlcnR5RGVzaXJhYmlsaXR5KSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwcm9wID0gdGhpcy5wcm9maWxlPy5wcm9wZXJ0aWVzW25hbWVdO1xuICAgIGlmICghcHJvcClcbiAgICAgIHJldHVybjtcblxuICAgIHVwZGF0ZXIocHJvcCk7XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZWQubmV4dCgpO1xuICAgIGdyb2suZXZlbnRzLmZpcmVDdXN0b21FdmVudChNUE9fU0NPUkVfQ0hBTkdFRF9FVkVOVCwge30pO1xuICB9XG59XG4iXX0=
|