qms-angular 1.0.53 → 1.0.54
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/bundles/qms-angular.umd.js +330 -1081
- package/bundles/qms-angular.umd.js.map +1 -1
- package/esm2015/lib/common/qms-icon.const.js +1 -107
- package/esm2015/lib/components/app-icon/icon-registry.service.js +2 -2
- package/esm2015/lib/components/related/common/qms-icon.const.js +107 -0
- package/esm2015/lib/components/related/common/tree.function.js +96 -0
- package/esm2015/lib/components/related/model/popup-data.model.js +1 -1
- package/esm2015/lib/components/related/model/risk-analysis.model.js +1 -1
- package/esm2015/lib/components/related/model/tree-config.model.js +3 -0
- package/esm2015/lib/components/related/model/tree-node.model.js +3 -0
- package/esm2015/lib/components/related/model/tree.model.js +3 -0
- package/esm2015/lib/components/related/popup/related-popup.component.js +3 -3
- package/esm2015/lib/components/related/related.module.js +10 -9
- package/esm2015/lib/components/related/risk/analysis/analysis.component.js +2 -2
- package/esm2015/lib/components/related/risk/list/list.component.js +1 -1
- package/esm2015/lib/components/related/tree/tree.component.js +684 -0
- package/esm2015/public-api.js +7 -13
- package/fesm2015/qms-angular.js +272 -993
- package/fesm2015/qms-angular.js.map +1 -1
- package/lib/common/qms-icon.const.d.ts +0 -23
- package/lib/components/related/common/qms-icon.const.d.ts +23 -0
- package/lib/components/{tree → related/common}/tree.function.d.ts +2 -2
- package/lib/components/related/model/popup-data.model.d.ts +2 -2
- package/lib/components/related/model/risk-analysis.model.d.ts +2 -2
- package/lib/components/{tree → related}/model/tree-config.model.d.ts +2 -2
- package/lib/components/{tree → related}/model/tree-node.model.d.ts +0 -0
- package/lib/components/{tree → related}/model/tree.model.d.ts +0 -0
- package/lib/components/related/popup/related-popup.component.d.ts +14 -4
- package/lib/components/related/related.module.d.ts +26 -26
- package/lib/components/related/risk/analysis/analysis.component.d.ts +11 -3
- package/lib/components/related/risk/list/list.component.d.ts +1 -1
- package/lib/components/{tree → related/tree}/tree.component.d.ts +16 -6
- package/package.json +1 -1
- package/public-api.d.ts +6 -12
- package/src/assets/jointjs/scss/bpmn.scss +28 -28
- package/src/assets/qms-ckeditor-plugin/build/ckeditor.js +1 -2
- package/src/assets/qms-ckeditor-plugin/build/ckeditor.js.map +1 -1
- package/src/assets/qms-ckeditor-plugin/package-lock.json +12190 -9
- package/src/assets/qms-ckeditor-plugin/src/ckeditor.js +0 -2
- package/src/assets/qms-ckeditor-plugin/src/dist/ckeditor.dev.js +173 -0
- package/src/assets/qms-ckeditor-plugin/src/plugins/fullscreen/dist/qmsCKEditorFullscreenPlugin.dev.js +87 -0
- package/src/lib/components/{tree → related/tree}/tree.component.scss +3 -3
- package/src/themes/_scrollbar.scss +10 -3
- package/esm2015/lib/components/select-include-children/model/select-option.model.js +0 -3
- package/esm2015/lib/components/select-include-children/model/select-popup-data.model.js +0 -9
- package/esm2015/lib/components/select-include-children/model/select.const.js +0 -6
- package/esm2015/lib/components/select-include-children/select-include-children.component.js +0 -562
- package/esm2015/lib/components/select-include-children/select-include-children.module.js +0 -102
- package/esm2015/lib/components/select-include-children/services/select-global.service.js +0 -22
- package/esm2015/lib/components/tree/model/tree-config.model.js +0 -3
- package/esm2015/lib/components/tree/model/tree-flat-node.model.js +0 -3
- package/esm2015/lib/components/tree/model/tree-node.model.js +0 -3
- package/esm2015/lib/components/tree/model/tree.model.js +0 -3
- package/esm2015/lib/components/tree/tree.component.js +0 -685
- package/esm2015/lib/components/tree/tree.function.js +0 -96
- package/esm2015/lib/components/tree/tree.module.js +0 -90
- package/lib/components/select-include-children/model/select-option.model.d.ts +0 -9
- package/lib/components/select-include-children/model/select-popup-data.model.d.ts +0 -11
- package/lib/components/select-include-children/model/select.const.d.ts +0 -5
- package/lib/components/select-include-children/select-include-children.component.d.ts +0 -88
- package/lib/components/select-include-children/select-include-children.module.d.ts +0 -27
- package/lib/components/select-include-children/services/select-global.service.d.ts +0 -12
- package/lib/components/tree/model/tree-flat-node.model.d.ts +0 -11
- package/lib/components/tree/tree.module.d.ts +0 -24
- package/src/lib/components/select-include-children/select-include-children.component.scss +0 -304
- package/src/themes/_non-bg-scrollbar.scss +0 -33
@@ -1,685 +0,0 @@
|
|
1
|
-
import { SelectionModel } from '@angular/cdk/collections';
|
2
|
-
import { FlatTreeControl } from '@angular/cdk/tree';
|
3
|
-
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
|
4
|
-
import { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';
|
5
|
-
import { DataType } from '../related/common/data-type.enum';
|
6
|
-
import { DocumentNodeType } from '../related/common/document-folder-type.enum';
|
7
|
-
import { ItemIconType } from '../related/common/item-icon-type.enum';
|
8
|
-
import { RelatedConst } from '../related/common/related.const';
|
9
|
-
import TreeFunctions from './tree.function';
|
10
|
-
import { KEYBOARD_DOWN_ICON, KEYBOARD_UP_ICON } from '../../common/qms-icon.const';
|
11
|
-
import * as i0 from "@angular/core";
|
12
|
-
import * as i1 from "@angular/platform-browser";
|
13
|
-
import * as i2 from "@angular/material/icon";
|
14
|
-
import * as i3 from "../app-icon/icon-registry.service";
|
15
|
-
import * as i4 from "@angular/material/tree";
|
16
|
-
import * as i5 from "@angular/material/checkbox";
|
17
|
-
import * as i6 from "@angular/material/button";
|
18
|
-
import * as i7 from "@angular/common";
|
19
|
-
import * as i8 from "../../directives/form.directive";
|
20
|
-
export class TreeComponent {
|
21
|
-
constructor(cdRef, domSanitizer, iconRegistry, appIconService) {
|
22
|
-
this.cdRef = cdRef;
|
23
|
-
this.domSanitizer = domSanitizer;
|
24
|
-
this.iconRegistry = iconRegistry;
|
25
|
-
this.appIconService = appIconService;
|
26
|
-
this.treeData = [];
|
27
|
-
this.selectedData = [];
|
28
|
-
this.selectedRiskData = [];
|
29
|
-
this.disabledList = [];
|
30
|
-
this.selectNodeEvent = new EventEmitter();
|
31
|
-
this.selectFolderEvent = new EventEmitter();
|
32
|
-
this.checkBoxEvent = new EventEmitter();
|
33
|
-
this.childCheckedEvent = new EventEmitter();
|
34
|
-
this.nodeExpandEvent = new EventEmitter();
|
35
|
-
this.getChildNodeSelectOne = new EventEmitter();
|
36
|
-
this.listParentObj = {};
|
37
|
-
this.filterData = [];
|
38
|
-
this.arrIndex = [];
|
39
|
-
this.checkedNodeList = [];
|
40
|
-
this.useExpandFeature = true;
|
41
|
-
this.allowSelectFolder = false;
|
42
|
-
this.areaOfCurrentProcess = '';
|
43
|
-
this.showCheckBox = false;
|
44
|
-
this.allowMultipleCheck = true;
|
45
|
-
this.singleSelectedNode = false;
|
46
|
-
this.onlyCheckBoxForChild = false;
|
47
|
-
this.onlyFolder = false;
|
48
|
-
this.itemIconType = ItemIconType;
|
49
|
-
this.displayType = 1;
|
50
|
-
this.openIcon = '';
|
51
|
-
this.openIconColor = '#1954A9';
|
52
|
-
this.closeIcon = '';
|
53
|
-
this.closeIconColor = '#000000';
|
54
|
-
this.itemIcon = '';
|
55
|
-
this.itemIconSvg = '';
|
56
|
-
this.itemIconPath = '';
|
57
|
-
this.itemIconBase64 = '';
|
58
|
-
this.treeControl = new FlatTreeControl((node) => {
|
59
|
-
return node.level;
|
60
|
-
}, (node) => {
|
61
|
-
return node.expandable;
|
62
|
-
});
|
63
|
-
this.isChecked = false;
|
64
|
-
this.idCheckIcon = '';
|
65
|
-
this.listChildNode = [];
|
66
|
-
this.dataType = DataType;
|
67
|
-
this.transformer = (node, level) => {
|
68
|
-
let checkHasChild = true;
|
69
|
-
if (!node.children) {
|
70
|
-
checkHasChild = false;
|
71
|
-
}
|
72
|
-
else if (!(!!node.children && node.children.length && node.children.length > 0)) {
|
73
|
-
checkHasChild = false;
|
74
|
-
}
|
75
|
-
// tslint:disable-next-line:max-line-length
|
76
|
-
else if (!!node.children &&
|
77
|
-
node.children.length &&
|
78
|
-
node.children.length === 1 &&
|
79
|
-
!node.children[0].name.length &&
|
80
|
-
node.id.toString() === this.areaOfCurrentProcess) {
|
81
|
-
checkHasChild = false;
|
82
|
-
}
|
83
|
-
if (!(this.listParentObj[node.id] === 1)) {
|
84
|
-
checkHasChild = false;
|
85
|
-
}
|
86
|
-
return {
|
87
|
-
expandable: !!node.children && node.children.length > 0,
|
88
|
-
name: node.name,
|
89
|
-
level,
|
90
|
-
id: node.id,
|
91
|
-
hasChild: checkHasChild,
|
92
|
-
parentId: node.parentId,
|
93
|
-
disabled: false,
|
94
|
-
levelType: node.levelType
|
95
|
-
};
|
96
|
-
};
|
97
|
-
this.treeFlattener = new MatTreeFlattener(this.transformer, (node) => {
|
98
|
-
return node.level;
|
99
|
-
}, (node) => {
|
100
|
-
return node.expandable;
|
101
|
-
}, (node) => {
|
102
|
-
return node.children;
|
103
|
-
});
|
104
|
-
this.dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);
|
105
|
-
this.hasChild = (_, node) => {
|
106
|
-
return node.expandable;
|
107
|
-
};
|
108
|
-
iconRegistry.addSvgIconLiteral('keyboard_up', domSanitizer.bypassSecurityTrustHtml(KEYBOARD_UP_ICON));
|
109
|
-
iconRegistry.addSvgIconLiteral('keyboard_down', domSanitizer.bypassSecurityTrustHtml(KEYBOARD_DOWN_ICON));
|
110
|
-
appIconService.registerProcessIcon(iconRegistry, domSanitizer);
|
111
|
-
appIconService.registerProcessAreaIcon(iconRegistry, domSanitizer);
|
112
|
-
appIconService.registerDocumentIcon(iconRegistry, domSanitizer);
|
113
|
-
appIconService.registerFolderIcon(iconRegistry, domSanitizer);
|
114
|
-
appIconService.registerDeviationIcon(iconRegistry, domSanitizer);
|
115
|
-
appIconService.registerChecklistIcon(iconRegistry, domSanitizer);
|
116
|
-
appIconService.registerRiskIcon(iconRegistry, domSanitizer);
|
117
|
-
}
|
118
|
-
ngOnChanges(changes) {
|
119
|
-
if (changes.treeData && JSON.stringify(changes.treeData.currentValue) !== JSON.stringify(changes.treeData.previousValue)) {
|
120
|
-
this.treeData = [...this.treeData, changes.treeData.currentValue];
|
121
|
-
this.initTreeData();
|
122
|
-
}
|
123
|
-
if (changes.selectedData &&
|
124
|
-
(changes.selectedData.currentValue.length > 0 ||
|
125
|
-
JSON.stringify(changes.selectedData.currentValue) !==
|
126
|
-
JSON.stringify(changes.selectedData.previousValue))) {
|
127
|
-
this.checkSelected(changes.selectedData.currentValue);
|
128
|
-
}
|
129
|
-
else {
|
130
|
-
for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
|
131
|
-
this.checklistSelection.deselect(this.treeControl.dataNodes[i]);
|
132
|
-
}
|
133
|
-
}
|
134
|
-
if (changes.disabledList && JSON.stringify(changes.disabledList.currentValue) !== JSON.stringify(changes.disabledList.previousValue)) {
|
135
|
-
this.checkDisabledList();
|
136
|
-
}
|
137
|
-
}
|
138
|
-
ngOnInit() {
|
139
|
-
this.initTreeData();
|
140
|
-
}
|
141
|
-
initTreeData() {
|
142
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;
|
143
|
-
this.treeData.forEach(item => {
|
144
|
-
if (!!item.parentId && item.parentId.length > 0) {
|
145
|
-
this.listParentObj[item.parentId] = 1;
|
146
|
-
}
|
147
|
-
if (item.childId && item.childId.length > 0) {
|
148
|
-
this.listParentObj[item.rootId] = 1;
|
149
|
-
}
|
150
|
-
});
|
151
|
-
this.filterData = this.treeData;
|
152
|
-
this.treeObject = TreeFunctions.buildObjectTree(this.filterData);
|
153
|
-
this.dataSource.data = TreeFunctions.buildArrayTree(this.treeObject || {}, 0).map(element => {
|
154
|
-
const item = this.sortDataTree(element);
|
155
|
-
element = null;
|
156
|
-
element = Object.assign({}, item);
|
157
|
-
return element;
|
158
|
-
});
|
159
|
-
this.useExpandFeature = !((_a = this.treeConfig) === null || _a === void 0 ? void 0 : _a.showCheckBox);
|
160
|
-
this.allowSelectFolder = (_b = this.treeConfig) === null || _b === void 0 ? void 0 : _b.allowSelectFolder;
|
161
|
-
this.areaOfCurrentProcess = (_c = this.treeConfig) === null || _c === void 0 ? void 0 : _c.areaOfCurrentProcess;
|
162
|
-
this.showCheckBox = (_d = this.treeConfig) === null || _d === void 0 ? void 0 : _d.showCheckBox;
|
163
|
-
this.onlyCheckBoxForChild = (_e = this.treeConfig) === null || _e === void 0 ? void 0 : _e.onlyCheckBoxForChild;
|
164
|
-
this.moduleId = (_f = this.treeConfig) === null || _f === void 0 ? void 0 : _f.moduleId;
|
165
|
-
this.openIcon = (_g = this.treeConfig) === null || _g === void 0 ? void 0 : _g.openIcon;
|
166
|
-
this.openIconColor = ((_h = this.treeConfig) === null || _h === void 0 ? void 0 : _h.openIconColor) ? (_j = this.treeConfig) === null || _j === void 0 ? void 0 : _j.openIconColor : this.openIconColor;
|
167
|
-
this.closeIcon = (_k = this.treeConfig) === null || _k === void 0 ? void 0 : _k.closeIcon;
|
168
|
-
this.closeIconColor = ((_l = this.treeConfig) === null || _l === void 0 ? void 0 : _l.closeIconColor) ? (_m = this.treeConfig) === null || _m === void 0 ? void 0 : _m.closeIconColor : this.closeIconColor;
|
169
|
-
this.itemIcon = (_o = this.treeConfig) === null || _o === void 0 ? void 0 : _o.itemIcon;
|
170
|
-
this.itemIconSvg = (_p = this.treeConfig) === null || _p === void 0 ? void 0 : _p.itemIconSvg;
|
171
|
-
this.itemIconPath = (_q = this.treeConfig) === null || _q === void 0 ? void 0 : _q.itemIconPath;
|
172
|
-
this.itemIconBase64 = this.domSanitizer.bypassSecurityTrustResourceUrl((_r = this.treeConfig) === null || _r === void 0 ? void 0 : _r.itemIconBase64);
|
173
|
-
this.allowMultipleCheck = (_s = this.treeConfig) === null || _s === void 0 ? void 0 : _s.allowMultipleCheck;
|
174
|
-
this.singleSelectedNode = (_t = this.treeConfig) === null || _t === void 0 ? void 0 : _t.singleSelectedNode;
|
175
|
-
this.onlyFolder = (_u = this.treeConfig) === null || _u === void 0 ? void 0 : _u.onlyFolder;
|
176
|
-
this.checklistSelection = new SelectionModel(this.allowMultipleCheck); /* true: multiple */
|
177
|
-
this.displayType = this.getItemIconType(this.treeConfig);
|
178
|
-
// Expand child node tree
|
179
|
-
if (this.treeConfig.expandAll) {
|
180
|
-
this.treeControl.expandAll();
|
181
|
-
}
|
182
|
-
// Risk Tree
|
183
|
-
if (this.selectedRiskData.length) {
|
184
|
-
const selectedData = [];
|
185
|
-
for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
|
186
|
-
this.selectedRiskData.forEach(x => {
|
187
|
-
const index = selectedData.findIndex(el => el.id === x.rootId);
|
188
|
-
if (x.rootId === this.treeControl.dataNodes[i].id && index < 0) {
|
189
|
-
selectedData.push(this.treeControl.dataNodes[i]);
|
190
|
-
}
|
191
|
-
});
|
192
|
-
}
|
193
|
-
this.checkSelected(selectedData);
|
194
|
-
this.checkBoxEvent.emit(selectedData);
|
195
|
-
}
|
196
|
-
//check disabled list
|
197
|
-
this.checkDisabledList();
|
198
|
-
}
|
199
|
-
checkDisabledList() {
|
200
|
-
// Disable List
|
201
|
-
if (this.disabledList.length) {
|
202
|
-
for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
|
203
|
-
this.disabledList.forEach(x => {
|
204
|
-
var _a;
|
205
|
-
if (x.id === this.treeControl.dataNodes[i].id
|
206
|
-
&& (!x.parentId || x.parentId === ((_a = this.treeControl.dataNodes[i]) === null || _a === void 0 ? void 0 : _a.parentId))) {
|
207
|
-
this.treeControl.dataNodes[i].disabled = true;
|
208
|
-
}
|
209
|
-
});
|
210
|
-
}
|
211
|
-
}
|
212
|
-
//Selected node with select one
|
213
|
-
if (this.disabledList.length && this.treeConfig.selectOne) {
|
214
|
-
let itemMarkChecked = this.disabledList[this.disabledList.length - 1].toUpperCase();
|
215
|
-
this.idCheckIcon = itemMarkChecked;
|
216
|
-
// get all children nodes on same level
|
217
|
-
let listChildNodeSameLevel = this.findChildNode(itemMarkChecked, this.dataSource.data);
|
218
|
-
// get all children in all level
|
219
|
-
this.listChildNode = [];
|
220
|
-
this.getChild(listChildNodeSameLevel);
|
221
|
-
this.getChildNodeSelectOne.emit(this.listChildNode);
|
222
|
-
for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
|
223
|
-
if (itemMarkChecked === this.treeControl.dataNodes[i].id) {
|
224
|
-
this.selectNodeEvent.emit(this.treeControl.dataNodes[i]);
|
225
|
-
}
|
226
|
-
this.disabledList.forEach(el => {
|
227
|
-
if (this.treeControl.dataNodes[i].id === el.toUpperCase()) {
|
228
|
-
this.treeControl.expand(this.treeControl.dataNodes[i]);
|
229
|
-
}
|
230
|
-
});
|
231
|
-
// remove all children nodes when user dont need to show them
|
232
|
-
this.listChildNode.forEach(el => {
|
233
|
-
var _a;
|
234
|
-
if (el.id && ((_a = this.treeControl.dataNodes[i]) === null || _a === void 0 ? void 0 : _a.id) === el.id) {
|
235
|
-
this.treeControl.dataNodes.splice(i, 1);
|
236
|
-
}
|
237
|
-
});
|
238
|
-
}
|
239
|
-
}
|
240
|
-
else {
|
241
|
-
this.idCheckIcon = '';
|
242
|
-
this.treeControl.collapseAll();
|
243
|
-
this.cdRef.detectChanges();
|
244
|
-
}
|
245
|
-
}
|
246
|
-
getChild(obj) {
|
247
|
-
for (let i = 0; i < obj.children.length; i++) {
|
248
|
-
if (obj.children[i].children) {
|
249
|
-
this.getChild(obj.children[i]);
|
250
|
-
delete obj.children[i].children;
|
251
|
-
this.listChildNode.push(obj.children[i]);
|
252
|
-
}
|
253
|
-
else {
|
254
|
-
this.listChildNode.push(obj.children[i]);
|
255
|
-
}
|
256
|
-
}
|
257
|
-
}
|
258
|
-
sortDataTree(obj) {
|
259
|
-
if (obj.children) {
|
260
|
-
let child = [];
|
261
|
-
const leafNode = obj.children.filter(x => !x.children);
|
262
|
-
const subFolderNode = obj.children.filter(x => x.children);
|
263
|
-
// for(let index = subFolderNode.length - 1; index >= 0 ; index--){
|
264
|
-
// let el = subFolderNode[index];
|
265
|
-
// this.sortDataTree(el);
|
266
|
-
// child.unshift(el);
|
267
|
-
// }
|
268
|
-
subFolderNode.forEach(element => {
|
269
|
-
let el = element;
|
270
|
-
this.sortDataTree(el);
|
271
|
-
child.push(el);
|
272
|
-
});
|
273
|
-
leafNode.forEach(element => {
|
274
|
-
let el = element;
|
275
|
-
child.push(el);
|
276
|
-
});
|
277
|
-
obj.children = child;
|
278
|
-
}
|
279
|
-
return obj;
|
280
|
-
}
|
281
|
-
getImagePath() {
|
282
|
-
return this.domSanitizer.bypassSecurityTrustResourceUrl(this.treeConfig.itemIconBase64);
|
283
|
-
}
|
284
|
-
checkSelected(itemSelected) {
|
285
|
-
setTimeout(() => {
|
286
|
-
if (!this.treeControl['dataNodes'])
|
287
|
-
return;
|
288
|
-
for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
|
289
|
-
const tree = this.treeControl.dataNodes[i];
|
290
|
-
this.checklistSelection.deselect(tree);
|
291
|
-
for (let j = 0; j < itemSelected.length; j++) {
|
292
|
-
const element = itemSelected[j];
|
293
|
-
if (tree.id === element.id && (!element.parentId || tree.parentId === element.parentId) && !tree.disabled) {
|
294
|
-
this.checklistSelection.select(tree);
|
295
|
-
}
|
296
|
-
}
|
297
|
-
}
|
298
|
-
}, 500);
|
299
|
-
}
|
300
|
-
checkSelectedSameNode(itemSelected, flag) {
|
301
|
-
for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
|
302
|
-
const tree = this.treeControl.dataNodes[i];
|
303
|
-
for (let j = 0; j < itemSelected.length; j++) {
|
304
|
-
const element = itemSelected[j];
|
305
|
-
if (element.id && tree.id === element.id
|
306
|
-
&& tree.parentId === element.parentId && !tree.disabled) {
|
307
|
-
flag ? this.checklistSelection.select(tree) : this.checklistSelection.deselect(tree);
|
308
|
-
}
|
309
|
-
}
|
310
|
-
}
|
311
|
-
}
|
312
|
-
getItemIconType(treeConfig) {
|
313
|
-
if (treeConfig.itemIcon && treeConfig.itemIcon.length)
|
314
|
-
return this.itemIconType.name;
|
315
|
-
if (treeConfig.itemIconPath && treeConfig.itemIconPath.length)
|
316
|
-
return this.itemIconType.path;
|
317
|
-
if (treeConfig.itemIconBase64 && treeConfig.itemIconBase64.length)
|
318
|
-
return this.itemIconType.base64;
|
319
|
-
if (treeConfig.itemIconSvg && treeConfig.itemIconSvg.length)
|
320
|
-
return this.itemIconType.svg;
|
321
|
-
return this.itemIconType.none;
|
322
|
-
}
|
323
|
-
/** Whether all the descendants of the node are selected */
|
324
|
-
descendantsAllSelected(node) {
|
325
|
-
const descendants = !this.singleSelectedNode ? this.treeControl.getDescendants(node).filter(item => !item.disabled) : [];
|
326
|
-
if (!descendants.length) {
|
327
|
-
return this.checklistSelection.isSelected(node);
|
328
|
-
}
|
329
|
-
const selected = this.checklistSelection.isSelected(node);
|
330
|
-
const allSelected = descendants.every(child => this.checklistSelection.isSelected(child));
|
331
|
-
if (!selected && allSelected) {
|
332
|
-
this.checklistSelection.select(node);
|
333
|
-
this.cdRef.markForCheck();
|
334
|
-
}
|
335
|
-
return allSelected;
|
336
|
-
}
|
337
|
-
/** Whether part of the descendants are selected */
|
338
|
-
descendantsPartiallySelected(node) {
|
339
|
-
const descendants = !this.singleSelectedNode ? this.treeControl.getDescendants(node).filter(item => !item.disabled) : [];
|
340
|
-
const result = descendants.some(child => this.checklistSelection.isSelected(child));
|
341
|
-
return result && !this.descendantsAllSelected(node);
|
342
|
-
}
|
343
|
-
/** Toggle the to-do item selection. Select/deselect all the descendants node */
|
344
|
-
todoItemSelectionToggle(node) {
|
345
|
-
// tree have duplicate node
|
346
|
-
if (this.treeConfig.canHaveDupId) {
|
347
|
-
for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
|
348
|
-
if (this.treeControl.dataNodes[i].id === node.id
|
349
|
-
&& this.treeControl.dataNodes[i].parentId === node.parentId
|
350
|
-
&& !this.treeControl.dataNodes[i].disabled) {
|
351
|
-
this.checklistSelection.toggle(this.treeControl.dataNodes[i]);
|
352
|
-
}
|
353
|
-
}
|
354
|
-
}
|
355
|
-
else {
|
356
|
-
this.checklistSelection.toggle(node);
|
357
|
-
}
|
358
|
-
// process/ document single selected
|
359
|
-
if (this.singleSelectedNode) {
|
360
|
-
this.checkBoxEvent.emit(this.checklistSelection.selected);
|
361
|
-
}
|
362
|
-
else {
|
363
|
-
const descendants = this.treeControl.getDescendants(node).filter(item => !item.disabled);
|
364
|
-
this.checkSelectedSameNode(descendants, this.descendantsAllSelected(node));
|
365
|
-
!this.descendantsAllSelected(node)
|
366
|
-
? this.checklistSelection.select(...descendants)
|
367
|
-
: this.checklistSelection.deselect(...descendants);
|
368
|
-
this.cdRef.markForCheck();
|
369
|
-
const allNodeIsParent = this.checklistSelection.selected.every(child => child.expandable);
|
370
|
-
if (allNodeIsParent) {
|
371
|
-
this.checklistSelection.selected.forEach(element => {
|
372
|
-
this.checklistSelection.deselect(element);
|
373
|
-
});
|
374
|
-
}
|
375
|
-
this.checkBoxEvent.emit(this.checklistSelection.selected);
|
376
|
-
}
|
377
|
-
}
|
378
|
-
todoChildSelectionToggle(node) {
|
379
|
-
for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
|
380
|
-
if (this.treeControl.dataNodes[i].id === node.id
|
381
|
-
&& this.treeControl.dataNodes[i].parentId === node.parentId
|
382
|
-
&& !this.treeControl.dataNodes[i].disabled) {
|
383
|
-
this.checklistSelection.toggle(this.treeControl.dataNodes[i]);
|
384
|
-
}
|
385
|
-
}
|
386
|
-
// this.checklistSelection.toggle(node);
|
387
|
-
this.cdRef.markForCheck();
|
388
|
-
this.checkBoxEvent.emit(this.checklistSelection.selected);
|
389
|
-
}
|
390
|
-
todoItemSelectionById(ids) {
|
391
|
-
ids.forEach(id => {
|
392
|
-
for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
|
393
|
-
if (this.treeControl.dataNodes[i].id === id
|
394
|
-
&& !this.treeControl.dataNodes[i].disabled) {
|
395
|
-
if (!this.checklistSelection.isSelected(this.treeControl.dataNodes[i]))
|
396
|
-
this.checklistSelection.toggle(this.treeControl.dataNodes[i]);
|
397
|
-
}
|
398
|
-
}
|
399
|
-
});
|
400
|
-
this.checkBoxEvent.emit(this.checklistSelection.selected);
|
401
|
-
}
|
402
|
-
todoItemSelection(nodes) {
|
403
|
-
nodes.forEach(node => {
|
404
|
-
for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
|
405
|
-
if (this.treeControl.dataNodes[i].id === node.id &&
|
406
|
-
this.treeControl.dataNodes[i].parentId === node.parentId &&
|
407
|
-
!this.treeControl.dataNodes[i].disabled) {
|
408
|
-
if (!this.checklistSelection.isSelected(this.treeControl.dataNodes[i]))
|
409
|
-
this.checklistSelection.toggle(this.treeControl.dataNodes[i]);
|
410
|
-
}
|
411
|
-
}
|
412
|
-
});
|
413
|
-
this.checkBoxEvent.emit(this.checklistSelection.selected);
|
414
|
-
}
|
415
|
-
selectNode(node) {
|
416
|
-
if (window[RelatedConst.IS_DISPLAY_SEARCH_RESULT]) {
|
417
|
-
window.postMessage(RelatedConst.HIDE_SEARCH_RESULT, '*');
|
418
|
-
}
|
419
|
-
if (this.treeConfig.selectOne) {
|
420
|
-
node.itemType = this.checkDataTypeSelectNode(node);
|
421
|
-
this.idCheckIcon = node.id;
|
422
|
-
this.selectNodeEvent.emit(node);
|
423
|
-
}
|
424
|
-
}
|
425
|
-
checkDataTypeSelectNode(node) {
|
426
|
-
let itemType = -1;
|
427
|
-
switch (this.moduleId) {
|
428
|
-
case DataType.process:
|
429
|
-
itemType = node.expandable ? DataType.area : DataType.process;
|
430
|
-
break;
|
431
|
-
case DataType.document:
|
432
|
-
itemType = node.expandable ? DataType.folder : DataType.document;
|
433
|
-
break;
|
434
|
-
default:
|
435
|
-
itemType = this.moduleId;
|
436
|
-
break;
|
437
|
-
}
|
438
|
-
return itemType;
|
439
|
-
}
|
440
|
-
selectFolder(node) {
|
441
|
-
this.selectFolderEvent.emit(node);
|
442
|
-
}
|
443
|
-
onExpandNode(node, isExpandNode) {
|
444
|
-
if (this.treeConfig.selectOne) {
|
445
|
-
// if (this.disabledList.length &&
|
446
|
-
// (node.id === this.disabledList[this.disabledList.length - 1].toUpperCase() ||
|
447
|
-
// node.parentId === this.disabledList[this.disabledList.length - 1].toUpperCase())) {
|
448
|
-
// return;
|
449
|
-
// }
|
450
|
-
this.idCheckIcon = node.id;
|
451
|
-
node.itemType = this.checkDataTypeSelectNode(node);
|
452
|
-
this.selectNodeEvent.emit(node);
|
453
|
-
}
|
454
|
-
if (window[RelatedConst.IS_DISPLAY_SEARCH_RESULT]) {
|
455
|
-
window.postMessage(RelatedConst.HIDE_SEARCH_RESULT, '*');
|
456
|
-
}
|
457
|
-
// set useExpandFeature = true to improve performance of tree loading
|
458
|
-
if (!isExpandNode || !this.useExpandFeature) {
|
459
|
-
for (let i = 0; i < this.arrIndex.length; i++) {
|
460
|
-
if (this.arrIndex[i] === node.id) {
|
461
|
-
this.arrIndex.splice(i, 1);
|
462
|
-
}
|
463
|
-
}
|
464
|
-
if (isExpandNode && !this.expandOnTitleClick) {
|
465
|
-
this.nodeExpandEvent.emit(node);
|
466
|
-
}
|
467
|
-
return;
|
468
|
-
}
|
469
|
-
// get array index to expand node after refresh datasource
|
470
|
-
let index = 0;
|
471
|
-
let isChange = false;
|
472
|
-
let isRemove = false;
|
473
|
-
this.arrIndex.push(node.id);
|
474
|
-
const childArray = this.treeData.filter((x) => {
|
475
|
-
return x.parentId === node.id;
|
476
|
-
});
|
477
|
-
let rootId = '0';
|
478
|
-
let parentElement;
|
479
|
-
let childrenList;
|
480
|
-
if (childArray.length === 0) {
|
481
|
-
return;
|
482
|
-
}
|
483
|
-
childArray.forEach((item) => {
|
484
|
-
if (item.rootId === rootId) {
|
485
|
-
return;
|
486
|
-
}
|
487
|
-
// get child node from original datasource
|
488
|
-
const child = this.getChildNode(item.rootId, childArray);
|
489
|
-
rootId = item.rootId;
|
490
|
-
index = this.getNodeIndex(child.id, undefined, this.dataSource['_treeControl'].dataNodes);
|
491
|
-
if (index > -1) {
|
492
|
-
return;
|
493
|
-
}
|
494
|
-
// add child node to expand node
|
495
|
-
parentElement = this.findChildNode(node.id, this.dataSource.data);
|
496
|
-
if (parentElement) {
|
497
|
-
// temporary remove all node without children => purpose to add node folder first
|
498
|
-
if (!isRemove) {
|
499
|
-
childrenList = [...parentElement.children];
|
500
|
-
this.removeChildren(parentElement);
|
501
|
-
isRemove = true;
|
502
|
-
}
|
503
|
-
// add node folder first
|
504
|
-
parentElement.children.push(child);
|
505
|
-
isChange = true;
|
506
|
-
}
|
507
|
-
});
|
508
|
-
// add node without children again
|
509
|
-
if (isRemove) {
|
510
|
-
this.addChildren(parentElement, childrenList);
|
511
|
-
}
|
512
|
-
// refresh data and expand tree node from root node
|
513
|
-
if (isChange) {
|
514
|
-
this.refreshTreeData();
|
515
|
-
this.arrIndex.forEach((item) => {
|
516
|
-
index = this.getNodeIndex(item, undefined, this.dataSource['_treeControl'].dataNodes);
|
517
|
-
this.treeControl.expand(this.treeControl.dataNodes[index]);
|
518
|
-
});
|
519
|
-
isChange = false;
|
520
|
-
}
|
521
|
-
}
|
522
|
-
removeChildren(parentElement) {
|
523
|
-
if (parentElement.children) {
|
524
|
-
parentElement.children.length = 0;
|
525
|
-
}
|
526
|
-
}
|
527
|
-
addChildren(parentElement, childrenList) {
|
528
|
-
if (childrenList) {
|
529
|
-
childrenList.forEach((e) => {
|
530
|
-
parentElement.children.push(e);
|
531
|
-
});
|
532
|
-
}
|
533
|
-
}
|
534
|
-
getNodeIndex(id, level, data) {
|
535
|
-
if (level) {
|
536
|
-
return data.findIndex((x) => {
|
537
|
-
return x.id === id && x.level === level;
|
538
|
-
});
|
539
|
-
}
|
540
|
-
return data.findIndex((x) => {
|
541
|
-
return x.id === id;
|
542
|
-
});
|
543
|
-
}
|
544
|
-
getChildNode(rootId, data) {
|
545
|
-
const childArray = data.filter((x) => {
|
546
|
-
return x.rootId === rootId;
|
547
|
-
});
|
548
|
-
const child = { id: childArray[0].rootId, name: childArray[0].subName, children: [] };
|
549
|
-
childArray.forEach((item) => {
|
550
|
-
child.children.push({ id: item.childId, name: item.childName, parentId: rootId });
|
551
|
-
});
|
552
|
-
return child;
|
553
|
-
}
|
554
|
-
findChildNode(id, data) {
|
555
|
-
// eslint-disable-next-line no-restricted-syntax
|
556
|
-
for (const currentFather of data) {
|
557
|
-
if (currentFather.id === id) {
|
558
|
-
return currentFather;
|
559
|
-
}
|
560
|
-
if (currentFather.children) {
|
561
|
-
const currentChild = currentFather.children.find((x) => {
|
562
|
-
return x.id === id;
|
563
|
-
});
|
564
|
-
if (currentChild) {
|
565
|
-
return currentChild;
|
566
|
-
}
|
567
|
-
// eslint-disable-next-line no-restricted-syntax
|
568
|
-
for (const currentChild1 of currentFather.children) {
|
569
|
-
if (id !== currentChild1.id) {
|
570
|
-
const result = this.findChildNode(id, currentFather.children);
|
571
|
-
if (result !== false) {
|
572
|
-
return result;
|
573
|
-
}
|
574
|
-
}
|
575
|
-
}
|
576
|
-
}
|
577
|
-
}
|
578
|
-
return false;
|
579
|
-
}
|
580
|
-
refreshTreeData() {
|
581
|
-
const data = this.dataSource.data;
|
582
|
-
this.dataSource.data = [];
|
583
|
-
this.dataSource.data = data;
|
584
|
-
}
|
585
|
-
getNodeIcon(node) {
|
586
|
-
if (this.openIcon && this.closeIcon) {
|
587
|
-
return this.treeControl.isExpanded(node) ? this.openIcon : this.closeIcon;
|
588
|
-
}
|
589
|
-
switch (this.moduleId) {
|
590
|
-
case DataType.document: {
|
591
|
-
const nodeData = this.treeData.filter(x => { return x.rootId === node.id; });
|
592
|
-
if (nodeData.length > 0) {
|
593
|
-
switch (nodeData[0].levelType) {
|
594
|
-
case DocumentNodeType.DepartmentFolder:
|
595
|
-
return this.treeControl.isExpanded(node) ? 'department_folder_outlined' : 'department_folder';
|
596
|
-
case DocumentNodeType.RegionalFolder:
|
597
|
-
return this.treeControl.isExpanded(node) ? 'regional_folder_outlined' : 'regional_folder';
|
598
|
-
case DocumentNodeType.TopFolder:
|
599
|
-
return this.treeControl.isExpanded(node) ? 'enterprise_folder_outlined' : 'enterprise_folder';
|
600
|
-
case DocumentNodeType.Folder:
|
601
|
-
return this.treeControl.isExpanded(node) ? 'local_folder_outlined' : 'local_folder';
|
602
|
-
default:
|
603
|
-
return this.treeControl.isExpanded(node) ? 'folder_outlined' : 'folder';
|
604
|
-
}
|
605
|
-
}
|
606
|
-
return this.treeControl.isExpanded(node) ? 'keyboard_up' : 'keyboard_down';
|
607
|
-
}
|
608
|
-
case DataType.process:
|
609
|
-
return this.treeControl.isExpanded(node) ? 'process_area_outlined' : 'process_area';
|
610
|
-
default:
|
611
|
-
return this.treeControl.isExpanded(node) ? 'keyboard_up' : 'keyboard_down';
|
612
|
-
}
|
613
|
-
}
|
614
|
-
getItemIcon(node) {
|
615
|
-
switch (this.moduleId) {
|
616
|
-
case DataType.document:
|
617
|
-
switch (node.levelType) {
|
618
|
-
case DocumentNodeType.DepartmentFolder:
|
619
|
-
return 'document_department';
|
620
|
-
case DocumentNodeType.RegionalFolder:
|
621
|
-
return 'document_regional';
|
622
|
-
case DocumentNodeType.TopFolder:
|
623
|
-
return 'document_enterprise';
|
624
|
-
case DocumentNodeType.Folder:
|
625
|
-
return 'document_local';
|
626
|
-
default:
|
627
|
-
return 'document';
|
628
|
-
}
|
629
|
-
case DataType.process:
|
630
|
-
return 'process';
|
631
|
-
case DataType.checklist:
|
632
|
-
return 'checklist';
|
633
|
-
case DataType.deviation:
|
634
|
-
return 'deviation';
|
635
|
-
case DataType.risk:
|
636
|
-
return 'risk';
|
637
|
-
default:
|
638
|
-
return 'document';
|
639
|
-
}
|
640
|
-
}
|
641
|
-
selectFolderNode(node) {
|
642
|
-
if (!this.expandOnTitleClick) {
|
643
|
-
this.onExpandNode(node, true);
|
644
|
-
}
|
645
|
-
}
|
646
|
-
getNodeId(node) {
|
647
|
-
return `_${node.parentId ? node.parentId : ''}_${node.id}_${node.level}`;
|
648
|
-
}
|
649
|
-
}
|
650
|
-
TreeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: TreeComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DomSanitizer }, { token: i2.MatIconRegistry }, { token: i3.QMSIconRegistryService }], target: i0.ɵɵFactoryTarget.Component });
|
651
|
-
TreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: TreeComponent, selector: "qms-tree", inputs: { treeData: "treeData", treeConfig: "treeConfig", selectedData: "selectedData", selectedRiskData: "selectedRiskData", disabledList: "disabledList", expandOnTitleClick: "expandOnTitleClick" }, outputs: { selectNodeEvent: "selectNodeEvent", selectFolderEvent: "selectFolderEvent", checkBoxEvent: "checkBoxEvent", childCheckedEvent: "childCheckedEvent", nodeExpandEvent: "nodeExpandEvent", getChildNodeSelectOne: "getChildNodeSelectOne" }, usesOnChanges: true, ngImport: i0, template: "<mat-tree\r\n [dataSource]=\"dataSource\"\r\n [treeControl]=\"treeControl\"\r\n class=\"tree__container\"\r\n>\r\n <mat-tree-node\r\n class=\"tree-branch\"\r\n *matTreeNodeDef=\"let node\"\r\n matTreeNodeToggle\r\n matTreeNodePadding\r\n >\r\n <!-- form thu 1 - child -->\r\n <mat-checkbox\r\n qms-group-options\r\n [disabled]=\"node.disabled\"\r\n color=\"default\"\r\n *ngIf=\"node.name && showCheckBox && !onlyCheckBoxForChild && !onlyFolder\"\r\n class=\"checklist-leaf-node\"\r\n [checked]=\"checklistSelection.isSelected(node)\"\r\n (change)=\"todoItemSelectionToggle(node)\"\r\n >\r\n </mat-checkbox>\r\n\r\n <!-- form thu 2 -->\r\n <mat-checkbox\r\n qms-group-options\r\n [disabled]=\"node.disabled\"\r\n color=\"default\"\r\n *ngIf=\"node.name && showCheckBox && onlyCheckBoxForChild && !onlyFolder\"\r\n class=\"ml-10 checklist-leaf-node\"\r\n [checked]=\"checklistSelection.isSelected(node)\"\r\n (change)=\"todoItemSelectionToggle(node)\"\r\n ></mat-checkbox>\r\n <div\r\n class=\"expand-node\"\r\n *ngIf=\"node.name && !onlyFolder\"\r\n [class.bgSelected]=\"treeConfig.selectOne && idCheckIcon == node.id\"\r\n (click)=\"selectNode(node)\"\r\n >\r\n <div class=\"expand-node__text\">\r\n <mat-icon\r\n *ngIf=\"displayType === itemIconType.name && !onlyCheckBoxForChild\"\r\n class=\"mat-icon-rtl-mirror material-icons-outlined\"\r\n >\r\n {{ itemIcon }}\r\n </mat-icon>\r\n\r\n <mat-icon\r\n *ngIf=\"displayType === itemIconType.svg && !onlyCheckBoxForChild\"\r\n class=\"mat-icon-rtl-mirror material-icons-outlined\"\r\n [svgIcon]=\"itemIconSvg\"\r\n >\r\n </mat-icon>\r\n\r\n <img\r\n *ngIf=\"displayType === itemIconType.path && !onlyCheckBoxForChild\"\r\n class=\"mat-icon\"\r\n [src]=\"itemIconPath\"\r\n />\r\n\r\n <img\r\n *ngIf=\"displayType === itemIconType.base64 && !onlyCheckBoxForChild\"\r\n class=\"mat-icon image-base64\"\r\n [src]=\"getImagePath()\"\r\n />\r\n\r\n <mat-icon\r\n *ngIf=\"displayType === itemIconType.none && !onlyCheckBoxForChild\"\r\n class=\"mat-icon-rtl-mirror material-icons-outlined\"\r\n [svgIcon]=\"getItemIcon(node)\"\r\n ></mat-icon>\r\n <span class=\"text-node\">{{ node.name }}</span>\r\n </div>\r\n <mat-icon\r\n class=\"icon-check\"\r\n *ngIf=\"treeConfig.selectOne && idCheckIcon == node.id\"\r\n >done</mat-icon\r\n >\r\n </div>\r\n </mat-tree-node>\r\n\r\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding>\r\n <!-- form thu 1 - parent -->\r\n <mat-checkbox\r\n qms-group-options\r\n [disabled]=\"node.disabled\"\r\n color=\"default\"\r\n *ngIf=\"showCheckBox && !onlyCheckBoxForChild\"\r\n [checked]=\"descendantsAllSelected(node)\"\r\n [indeterminate]=\"descendantsPartiallySelected(node)\"\r\n (change)=\"todoItemSelectionToggle(node)\"\r\n ></mat-checkbox>\r\n <button\r\n class=\"button-boder\"\r\n mat-icon-button\r\n matTreeNodeToggle\r\n [disableRipple]=\"!node.hasChild\"\r\n [attr.aria-label]=\"'toggle ' + node.filename\"\r\n >\r\n <mat-icon\r\n *ngIf=\"openIcon && closeIcon\"\r\n class=\"mat-icon-rtl-mirror\"\r\n [ngStyle]=\"{\r\n color: treeControl.isExpanded(node) ? openIconColor : closeIconColor\r\n }\"\r\n >{{ getNodeIcon(node) }}</mat-icon\r\n >\r\n <mat-icon\r\n *ngIf=\"!openIcon || !closeIcon\"\r\n class=\"mat-icon-rtl-mirror\"\r\n [ngClass]=\"{\r\n 'open-icon': treeControl.isExpanded(node),\r\n 'not-department-icon': moduleId !== dataType.document\r\n }\"\r\n [svgIcon]=\"getNodeIcon(node)\"\r\n >\r\n </mat-icon>\r\n </button>\r\n <span\r\n *ngIf=\"expandOnTitleClick\"\r\n matTreeNodeToggle\r\n class=\"text-node-parent\"\r\n style=\"cursor: pointer\"\r\n (click)=\"onExpandNode(node)\"\r\n [ngStyle]=\"{\r\n color: treeControl.isExpanded(node) ? openIconColor : '#000000'\r\n }\"\r\n >\r\n <span>{{ node.name }}</span>\r\n <mat-icon\r\n class=\"icon-check\"\r\n *ngIf=\"treeConfig.selectOne && idCheckIcon == node.id\"\r\n >done</mat-icon\r\n >\r\n </span>\r\n <span\r\n *ngIf=\"!expandOnTitleClick\"\r\n class=\"text-node-parent\"\r\n (click)=\"selectFolderNode(node)\"\r\n style=\"cursor: pointer\"\r\n [id]=\"getNodeId(node)\"\r\n >\r\n <span>{{ node.name }}</span>\r\n <mat-icon\r\n class=\"icon-check\"\r\n *ngIf=\"treeConfig.selectOne && idCheckIcon == node.id\"\r\n >done</mat-icon\r\n >\r\n </span>\r\n </mat-tree-node>\r\n</mat-tree>\r\n", styles: ["@font-face{font-family:Open Sans;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v20/mem8YaGs126MiZpBA-UFWJ0bbck.woff2) format(\"woff2\");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-family:Open Sans;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v20/mem8YaGs126MiZpBA-UFUZ0bbck.woff2) format(\"woff2\");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-family:Open Sans;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v20/mem8YaGs126MiZpBA-UFWZ0bbck.woff2) format(\"woff2\");unicode-range:U+1f??}@font-face{font-family:Open Sans;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v20/mem8YaGs126MiZpBA-UFVp0bbck.woff2) format(\"woff2\");unicode-range:U+0370-03ff}@font-face{font-family:Open Sans;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v20/mem8YaGs126MiZpBA-UFWp0bbck.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-family:Open Sans;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v20/mem8YaGs126MiZpBA-UFW50bbck.woff2) format(\"woff2\");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-family:Open Sans;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v20/mem8YaGs126MiZpBA-UFVZ0b.woff2) format(\"woff2\");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-family:Raleway;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/raleway/v19/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCFPrEHJA.woff2) format(\"woff2\");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-family:Raleway;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/raleway/v19/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCMPrEHJA.woff2) format(\"woff2\");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-family:Raleway;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/raleway/v19/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCHPrEHJA.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-family:Raleway;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/raleway/v19/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCGPrEHJA.woff2) format(\"woff2\");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-family:Raleway;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/raleway/v19/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCIPrE.woff2) format(\"woff2\");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}.tree__container{font-family:Open Sans;font-style:normal;font-weight:400;font-size:.875rem;line-height:19px;color:#323232}.tree__container .mat-tree-node{color:#000;min-height:0}.tree__container .mat-tree-node .mat-checkbox.qms-group-options{padding:0}.tree__container .mat-tree-node .mat-checkbox.qms-group-options .mat-checkbox-inner-container{margin-right:11px}.tree__container .button{margin-left:6px}.tree__container .button:focus,.tree__container .button:hover{background-color:#009ef2;border-radius:2px;width:auto}.tree__container .button-boder:focus,.tree__container .button:focus{outline:0}.tree__container .button-folder-boder:focus{outline:0}.tree__container .button-folder-boder:focus,.tree__container .button-folder-boder:hover{background-color:#009ef2;border-radius:2px;width:auto}.tree__container .expand-node{margin-left:8px;min-height:32px;justify-content:space-between;width:100%}.tree__container .expand-node,.tree__container .expand-node .expand-node__text{display:flex;align-items:center}.tree__container .expand-node .mat-icon{color:rgba(0,0,0,.6);margin-right:17px;min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content}.tree__container .expand-node .mat-icon svg{display:block;min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content}.tree__container .expand-node.bgSelected .icon-check{color:#1954a9}.tree__container .text-node-parent{width:100%;display:flex;align-items:center;justify-content:space-between;margin-left:10px;cursor:pointer}.tree__container .text-node-parent.active-item{color:#1954a9!important}.tree__container .text-node-parent.bgSelected .icon-check{color:#1954a9}.tree__container .mr-11{margin-right:11px}.tree__container .ml-10{margin-left:10px}.tree__container .tree-branch:hover{background-color:#e5eefb}.tree__container .image-base64{width:20px;height:20px}.tree__container .mat-checkbox.qms-group-options.mat-checkbox-checked{background:transparent!important}::ng-deep .mat-tree .mat-checkbox.qms-group-options{padding:0}::ng-deep .mat-tree .mat-checkbox.qms-group-options.mat-checkbox-checked{background-color:transparent}::ng-deep .mat-tree .mat-checkbox.qms-group-options .mat-checkbox-inner-container{margin-right:0}svg{display:block;min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content}.open-icon.not-department-icon svg path,.open-icon svg path:first-child{fill:#1954a9}"], components: [{ type: i4.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "id", "labelPosition", "name", "required", "checked", "disabled", "indeterminate", "aria-describedby", "value"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i4.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { type: i4.MatTreeNode, selector: "mat-tree-node", inputs: ["role", "disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { type: i4.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { type: i4.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.QMSGroupOptionDirective, selector: "[qms-group-options]" }, { type: i8.AutocompleteOffDirective, selector: "[qms-group-options]" }, { type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], encapsulation: i0.ViewEncapsulation.None });
|
652
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: TreeComponent, decorators: [{
|
653
|
-
type: Component,
|
654
|
-
args: [{
|
655
|
-
selector: 'qms-tree',
|
656
|
-
templateUrl: './tree.component.html',
|
657
|
-
styleUrls: ['./tree.component.scss'],
|
658
|
-
encapsulation: ViewEncapsulation.None,
|
659
|
-
}]
|
660
|
-
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.DomSanitizer }, { type: i2.MatIconRegistry }, { type: i3.QMSIconRegistryService }]; }, propDecorators: { treeData: [{
|
661
|
-
type: Input
|
662
|
-
}], treeConfig: [{
|
663
|
-
type: Input
|
664
|
-
}], selectedData: [{
|
665
|
-
type: Input
|
666
|
-
}], selectedRiskData: [{
|
667
|
-
type: Input
|
668
|
-
}], disabledList: [{
|
669
|
-
type: Input
|
670
|
-
}], expandOnTitleClick: [{
|
671
|
-
type: Input
|
672
|
-
}], selectNodeEvent: [{
|
673
|
-
type: Output
|
674
|
-
}], selectFolderEvent: [{
|
675
|
-
type: Output
|
676
|
-
}], checkBoxEvent: [{
|
677
|
-
type: Output
|
678
|
-
}], childCheckedEvent: [{
|
679
|
-
type: Output
|
680
|
-
}], nodeExpandEvent: [{
|
681
|
-
type: Output
|
682
|
-
}], getChildNodeSelectOne: [{
|
683
|
-
type: Output
|
684
|
-
}] } });
|
685
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9xbXMtYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvdHJlZS90cmVlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Ftcy1hbmd1bGFyL3NyYy9saWIvY29tcG9uZW50cy90cmVlL3RyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9JLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR2pGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9ELE9BQU8sYUFBYSxNQUFNLGlCQUFpQixDQUFDO0FBRzVDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7Ozs7Ozs7O0FBcUJuRixNQUFNLE9BQU8sYUFBYTtJQXNEeEIsWUFBb0IsS0FBd0IsRUFDbEMsWUFBMEIsRUFDMUIsWUFBNkIsRUFDN0IsY0FBc0M7UUFINUIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDbEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUJB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RUFBRTtZQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUMvQjtJQUNILENBQUM7SUFFRCxTQUFTLENBQUMsSUFBa0I7UUFDMUIsT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMzRSxDQUFDOzswR0FodEJVLGFBQWE7OEZBQWIsYUFBYSxrZ0JDbkMxQiwwNkpBdUpBOzJGRHBIYSxhQUFhO2tCQU56QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxVQUFVO29CQUNwQixXQUFXLEVBQUUsdUJBQXVCO29CQUNwQyxTQUFTLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztvQkFDcEMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7aUJBQ3RDO3NNQUVVLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLHFCQUFxQjtzQkFBOUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcclxuaW1wb3J0IHsgRmxhdFRyZWVDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RyZWUnO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRJY29uUmVnaXN0cnkgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0VHJlZUZsYXREYXRhU291cmNlLCBNYXRUcmVlRmxhdHRlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdHJlZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBRTVNJY29uUmVnaXN0cnlTZXJ2aWNlIH0gZnJvbSAnLi4vYXBwLWljb24vaWNvbi1yZWdpc3RyeS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi9yZWxhdGVkL2NvbW1vbi9kYXRhLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IERvY3VtZW50Tm9kZVR5cGUgfSBmcm9tICcuLi9yZWxhdGVkL2NvbW1vbi9kb2N1bWVudC1mb2xkZXItdHlwZS5lbnVtJztcclxuaW1wb3J0IHsgSXRlbUljb25UeXBlIH0gZnJvbSAnLi4vcmVsYXRlZC9jb21tb24vaXRlbS1pY29uLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IFJlbGF0ZWRDb25zdCB9IGZyb20gJy4uL3JlbGF0ZWQvY29tbW9uL3JlbGF0ZWQuY29uc3QnO1xyXG5pbXBvcnQgVHJlZUZ1bmN0aW9ucyBmcm9tICcuL3RyZWUuZnVuY3Rpb24nO1xyXG5pbXBvcnQgeyBUcmVlQ29uZmlnIH0gZnJvbSAnLi9tb2RlbC90cmVlLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IFRyZWVNb2RlbCB9IGZyb20gJy4vbW9kZWwvdHJlZS5tb2RlbCc7XHJcbmltcG9ydCB7IEtFWUJPQVJEX0RPV05fSUNPTiwgS0VZQk9BUkRfVVBfSUNPTiB9IGZyb20gJy4uLy4uL2NvbW1vbi9xbXMtaWNvbi5jb25zdCc7XHJcbmltcG9ydCB7IFRyZWVGbGF0Tm9kZSB9IGZyb20gJy4vbW9kZWwvdHJlZS1mbGF0LW5vZGUubW9kZWwnO1xyXG5cclxuaW50ZXJmYWNlIFRyZWVOb2RlIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBjaGlsZHJlbj86IFRyZWVOb2RlW107XHJcbiAgcGFyZW50SWQ/OiBzdHJpbmc7XHJcbiAgbGV2ZWxUeXBlPzogbnVtYmVyO1xyXG59XHJcbmludGVyZmFjZSBJQ2hlY2tlZE5vZGUge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgY2hlY2tlZDogYm9vbGVhbjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdxbXMtdHJlZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RyZWUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RyZWUuY29tcG9uZW50LnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHJlZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSB0cmVlRGF0YTogQXJyYXk8VHJlZU1vZGVsPiA9IFtdO1xyXG4gIEBJbnB1dCgpIHRyZWVDb25maWc6IFRyZWVDb25maWc7XHJcbiAgQElucHV0KCkgc2VsZWN0ZWREYXRhOiBBcnJheTxUcmVlRmxhdE5vZGU+ID0gW107XHJcbiAgQElucHV0KCkgc2VsZWN0ZWRSaXNrRGF0YTogYW55ID0gW107XHJcbiAgQElucHV0KCkgZGlzYWJsZWRMaXN0OiBhbnkgPSBbXTtcclxuICBASW5wdXQoKSBleHBhbmRPblRpdGxlQ2xpY2s6IGJvb2xlYW47XHJcbiAgQE91dHB1dCgpIHNlbGVjdE5vZGVFdmVudDogRXZlbnRFbWl0dGVyPFRyZWVGbGF0Tm9kZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIHNlbGVjdEZvbGRlckV2ZW50OiBFdmVudEVtaXR0ZXI8VHJlZUZsYXROb2RlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgY2hlY2tCb3hFdmVudDogRXZlbnRFbWl0dGVyPFRyZWVGbGF0Tm9kZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgY2hpbGRDaGVja2VkRXZlbnQ6IEV2ZW50RW1pdHRlcjxJQ2hlY2tlZE5vZGU+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBub2RlRXhwYW5kRXZlbnQ6IEV2ZW50RW1pdHRlcjxUcmVlRmxhdE5vZGU+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBnZXRDaGlsZE5vZGVTZWxlY3RPbmU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBsaXN0UGFyZW50T2JqID0ge307XHJcbiAgZmlsdGVyRGF0YTogVHJlZU1vZGVsW10gPSBbXTtcclxuICB0cmVlT2JqZWN0OiBvYmplY3Q7XHJcbiAgYXJySW5kZXg6IHN0cmluZ1tdID0gW107XHJcbiAgY2hlY2tlZE5vZGVMaXN0OiBBcnJheTxUcmVlRmxhdE5vZGU+ID0gW107XHJcbiAgdXNlRXhwYW5kRmVhdHVyZSA9IHRydWU7XHJcbiAgYWxsb3dTZWxlY3RGb2xkZXIgPSBmYWxzZTtcclxuICBhcmVhT2ZDdXJyZW50UHJvY2VzcyA9ICcnO1xyXG4gIHNob3dDaGVja0JveCA9IGZhbHNlO1xyXG4gIGFsbG93TXVsdGlwbGVDaGVjayA9IHRydWU7XHJcbiAgc2luZ2xlU2VsZWN0ZWROb2RlID0gZmFsc2U7XHJcbiAgb25seUNoZWNrQm94Rm9yQ2hpbGQgPSBmYWxzZTtcclxuICBvbmx5Rm9sZGVyID0gZmFsc2U7XHJcbiAgaXRlbUljb25UeXBlID0gSXRlbUljb25UeXBlO1xyXG4gIGRpc3BsYXlUeXBlID0gMTtcclxuICBvcGVuSWNvbiA9ICcnO1xyXG4gIG9wZW5JY29uQ29sb3IgPSAnIzE5NTRBOSc7XHJcbiAgY2xvc2VJY29uID0gJyc7XHJcbiAgY2xvc2VJY29uQ29sb3IgPSAnIzAwMDAwMCc7XHJcbiAgaXRlbUljb24gPSAnJztcclxuICBpdGVtSWNvblN2ZyA9ICcnO1xyXG4gIGl0ZW1JY29uUGF0aCA9ICcnO1xyXG4gIGl0ZW1JY29uQmFzZTY0ID0gJyc7XHJcbiAgbW9kdWxlSWQ6IG51bWJlcjtcclxuXHJcbiAgdHJlZUNvbnRyb2wgPSBuZXcgRmxhdFRyZWVDb250cm9sPFRyZWVGbGF0Tm9kZT4oXHJcbiAgICAobm9kZSkgPT4ge1xyXG4gICAgICByZXR1cm4gbm9kZS5sZXZlbDtcclxuICAgIH0sXHJcbiAgICAobm9kZSkgPT4ge1xyXG4gICAgICByZXR1cm4gbm9kZS5leHBhbmRhYmxlO1xyXG4gICAgfVxyXG4gICk7XHJcblxyXG4gIGlzQ2hlY2tlZCA9IGZhbHNlO1xyXG4gIGNoZWNrbGlzdFNlbGVjdGlvbjogYW55O1xyXG4gIGlkQ2hlY2tJY29uID0gJyc7XHJcbiAgbGlzdENoaWxkTm9kZSA9IFtdO1xyXG4gIGRhdGFUeXBlID0gRGF0YVR5cGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBkb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgIHByaXZhdGUgaWNvblJlZ2lzdHJ5OiBNYXRJY29uUmVnaXN0cnksXHJcbiAgICBwcml2YXRlIGFwcEljb25TZXJ2aWNlOiBRTVNJY29uUmVnaXN0cnlTZXJ2aWNlKSB7XHJcbiAgICBpY29uUmVnaXN0cnkuYWRkU3ZnSWNvbkxpdGVyYWwoJ2tleWJvYXJkX3VwJywgZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKEtFWUJPQVJEX1VQX0lDT04pKTtcclxuICAgIGljb25SZWdpc3RyeS5hZGRTdmdJY29uTGl0ZXJhbCgna2V5Ym9hcmRfZG93bicsIGRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChLRVlCT0FSRF9ET1dOX0lDT04pKTtcclxuICAgIGFwcEljb25TZXJ2aWNlLnJlZ2lzdGVyUHJvY2Vzc0ljb24oaWNvblJlZ2lzdHJ5LCBkb21TYW5pdGl6ZXIpO1xyXG4gICAgYXBwSWNvblNlcnZpY2UucmVnaXN0ZXJQcm9jZXNzQXJlYUljb24oaWNvblJlZ2lzdHJ5LCBkb21TYW5pdGl6ZXIpO1xyXG4gICAgYXBwSWNvblNlcnZpY2UucmVnaXN0ZXJEb2N1bWVudEljb24oaWNvblJlZ2lzdHJ5LCBkb21TYW5pdGl6ZXIpO1xyXG4gICAgYXBwSWNvblNlcnZpY2UucmVnaXN0ZXJGb2xkZXJJY29uKGljb25SZWdpc3RyeSwgZG9tU2FuaXRpemVyKTtcclxuICAgIGFwcEljb25TZXJ2aWNlLnJlZ2lzdGVyRGV2aWF0aW9uSWNvbihpY29uUmVnaXN0cnksIGRvbVNhbml0aXplcik7XHJcbiAgICBhcHBJY29uU2VydmljZS5yZWdpc3RlckNoZWNrbGlzdEljb24oaWNvblJlZ2lzdHJ5LCBkb21TYW5pdGl6ZXIpO1xyXG4gICAgYXBwSWNvblNlcnZpY2UucmVnaXN0ZXJSaXNrSWNvbihpY29uUmVnaXN0cnksIGRvbVNhbml0aXplcik7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcy50cmVlRGF0YSAmJiBKU09OLnN0cmluZ2lmeShjaGFuZ2VzLnRyZWVEYXRhLmN1cnJlbnRWYWx1ZSkgIT09IEpTT04uc3RyaW5naWZ5KGNoYW5nZXMudHJlZURhdGEucHJldmlvdXNWYWx1ZSkpIHtcclxuICAgICAgdGhpcy50cmVlRGF0YSA9IFsuLi50aGlzLnRyZWVEYXRhLCBjaGFuZ2VzLnRyZWVEYXRhLmN1cnJlbnRWYWx1ZV07XHJcbiAgICAgIHRoaXMuaW5pdFRyZWVEYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXMuc2VsZWN0ZWREYXRhICYmXHJcbiAgICAgIChjaGFuZ2VzLnNlbGVjdGVkRGF0YS5jdXJyZW50VmFsdWUubGVuZ3RoID4gMCB8fFxyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGNoYW5nZXMuc2VsZWN0ZWREYXRhLmN1cnJlbnRWYWx1ZSkgIT09XHJcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlcy5zZWxlY3RlZERhdGEucHJldmlvdXNWYWx1ZSkpKSB7XHJcbiAgICAgIHRoaXMuY2hlY2tTZWxlY3RlZChjaGFuZ2VzLnNlbGVjdGVkRGF0YS5jdXJyZW50VmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmRlc2VsZWN0KHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzLmRpc2FibGVkTGlzdCAmJiBKU09OLnN0cmluZ2lmeShjaGFuZ2VzLmRpc2FibGVkTGlzdC5jdXJyZW50VmFsdWUpICE9PSBKU09OLnN0cmluZ2lmeShjaGFuZ2VzLmRpc2FibGVkTGlzdC5wcmV2aW91c1ZhbHVlKSkge1xyXG4gICAgICB0aGlzLmNoZWNrRGlzYWJsZWRMaXN0KCk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXRUcmVlRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgaW5pdFRyZWVEYXRhKCkge1xyXG4gICAgdGhpcy50cmVlRGF0YS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICBpZiAoISFpdGVtLnBhcmVudElkICYmIGl0ZW0ucGFyZW50SWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMubGlzdFBhcmVudE9ialtpdGVtLnBhcmVudElkXSA9IDE7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGl0ZW0uY2hpbGRJZCAmJiBpdGVtLmNoaWxkSWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMubGlzdFBhcmVudE9ialtpdGVtLnJvb3RJZF0gPSAxO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpbHRlckRhdGEgPSB0aGlzLnRyZWVEYXRhO1xyXG5cclxuICAgIHRoaXMudHJlZU9iamVjdCA9IFRyZWVGdW5jdGlvbnMuYnVpbGRPYmplY3RUcmVlKHRoaXMuZmlsdGVyRGF0YSk7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IFRyZWVGdW5jdGlvbnMuYnVpbGRBcnJheVRyZWUodGhpcy50cmVlT2JqZWN0IHx8IHt9LCAwKS5tYXAoZWxlbWVudCA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnNvcnREYXRhVHJlZShlbGVtZW50KTtcclxuICAgICAgZWxlbWVudCA9IG51bGw7XHJcbiAgICAgIGVsZW1lbnQgPSB7IC4uLnt9LCAuLi5pdGVtIH07XHJcbiAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy51c2VFeHBhbmRGZWF0dXJlID0gIXRoaXMudHJlZUNvbmZpZz8uc2hvd0NoZWNrQm94O1xyXG4gICAgdGhpcy5hbGxvd1NlbGVjdEZvbGRlciA9IHRoaXMudHJlZUNvbmZpZz8uYWxsb3dTZWxlY3RGb2xkZXI7XHJcbiAgICB0aGlzLmFyZWFPZkN1cnJlbnRQcm9jZXNzID0gdGhpcy50cmVlQ29uZmlnPy5hcmVhT2ZDdXJyZW50UHJvY2VzcztcclxuICAgIHRoaXMuc2hvd0NoZWNrQm94ID0gdGhpcy50cmVlQ29uZmlnPy5zaG93Q2hlY2tCb3g7XHJcbiAgICB0aGlzLm9ubHlDaGVja0JveEZvckNoaWxkID0gdGhpcy50cmVlQ29uZmlnPy5vbmx5Q2hlY2tCb3hGb3JDaGlsZDtcclxuICAgIHRoaXMubW9kdWxlSWQgPSB0aGlzLnRyZWVDb25maWc/Lm1vZHVsZUlkO1xyXG4gICAgdGhpcy5vcGVuSWNvbiA9IHRoaXMudHJlZUNvbmZpZz8ub3Blbkljb247XHJcbiAgICB0aGlzLm9wZW5JY29uQ29sb3IgPSB0aGlzLnRyZWVDb25maWc/Lm9wZW5JY29uQ29sb3IgPyB0aGlzLnRyZWVDb25maWc/Lm9wZW5JY29uQ29sb3IgOiB0aGlzLm9wZW5JY29uQ29sb3I7XHJcbiAgICB0aGlzLmNsb3NlSWNvbiA9IHRoaXMudHJlZUNvbmZpZz8uY2xvc2VJY29uO1xyXG4gICAgdGhpcy5jbG9zZUljb25Db2xvciA9IHRoaXMudHJlZUNvbmZpZz8uY2xvc2VJY29uQ29sb3IgPyB0aGlzLnRyZWVDb25maWc/LmNsb3NlSWNvbkNvbG9yIDogdGhpcy5jbG9zZUljb25Db2xvcjtcclxuICAgIHRoaXMuaXRlbUljb24gPSB0aGlzLnRyZWVDb25maWc/Lml0ZW1JY29uO1xyXG4gICAgdGhpcy5pdGVtSWNvblN2ZyA9IHRoaXMudHJlZUNvbmZpZz8uaXRlbUljb25Tdmc7XHJcbiAgICB0aGlzLml0ZW1JY29uUGF0aCA9IHRoaXMudHJlZUNvbmZpZz8uaXRlbUljb25QYXRoO1xyXG4gICAgdGhpcy5pdGVtSWNvbkJhc2U2NCA9IHRoaXMuZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCh0aGlzLnRyZWVDb25maWc/Lml0ZW1JY29uQmFzZTY0KSBhcyBzdHJpbmc7XHJcbiAgICB0aGlzLmFsbG93TXVsdGlwbGVDaGVjayA9IHRoaXMudHJlZUNvbmZpZz8uYWxsb3dNdWx0aXBsZUNoZWNrO1xyXG4gICAgdGhpcy5zaW5nbGVTZWxlY3RlZE5vZGUgPSB0aGlzLnRyZWVDb25maWc/LnNpbmdsZVNlbGVjdGVkTm9kZTtcclxuICAgIHRoaXMub25seUZvbGRlciA9IHRoaXMudHJlZUNvbmZpZz8ub25seUZvbGRlcjtcclxuICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPFRyZWVGbGF0Tm9kZT4odGhpcy5hbGxvd011bHRpcGxlQ2hlY2spOyAvKiB0cnVlOiBtdWx0aXBsZSAqL1xyXG5cclxuICAgIHRoaXMuZGlzcGxheVR5cGUgPSB0aGlzLmdldEl0ZW1JY29uVHlwZSh0aGlzLnRyZWVDb25maWcpO1xyXG5cclxuICAgIC8vIEV4cGFuZCBjaGlsZCBub2RlIHRyZWVcclxuICAgIGlmICh0aGlzLnRyZWVDb25maWcuZXhwYW5kQWxsKSB7XHJcbiAgICAgIHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kQWxsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmlzayBUcmVlXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFJpc2tEYXRhLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBzZWxlY3RlZERhdGEgPSBbXTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSaXNrRGF0YS5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzZWxlY3RlZERhdGEuZmluZEluZGV4KGVsID0+IGVsLmlkID09PSB4LnJvb3RJZCk7XHJcbiAgICAgICAgICBpZiAoeC5yb290SWQgPT09IHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldLmlkICYmIGluZGV4IDwgMCkge1xyXG4gICAgICAgICAgICBzZWxlY3RlZERhdGEucHVzaCh0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2hlY2tTZWxlY3RlZChzZWxlY3RlZERhdGEpO1xyXG4gICAgICB0aGlzLmNoZWNrQm94RXZlbnQuZW1pdChzZWxlY3RlZERhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vY2hlY2sgZGlzYWJsZWQgbGlzdFxyXG4gICAgdGhpcy5jaGVja0Rpc2FibGVkTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tEaXNhYmxlZExpc3QoKSB7XHJcbiAgICAvLyBEaXNhYmxlIExpc3RcclxuICAgIGlmICh0aGlzLmRpc2FibGVkTGlzdC5sZW5ndGgpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWRMaXN0LmZvckVhY2goeCA9PiB7XHJcbiAgICAgICAgICBpZiAoeC5pZCA9PT0gdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXNbaV0uaWRcclxuICAgICAgICAgICAgJiYgKCF4LnBhcmVudElkIHx8IHgucGFyZW50SWQgPT09IHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldPy5wYXJlbnRJZCkpIHtcclxuICAgICAgICAgICAgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXNbaV0uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9TZWxlY3RlZCBub2RlIHdpdGggc2VsZWN0IG9uZVxyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWRMaXN0Lmxlbmd0aCAmJiB0aGlzLnRyZWVDb25maWcuc2VsZWN0T25lKSB7XHJcbiAgICAgIGxldCBpdGVtTWFya0NoZWNrZWQgPSB0aGlzLmRpc2FibGVkTGlzdFt0aGlzLmRpc2FibGVkTGlzdC5sZW5ndGggLSAxXS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICB0aGlzLmlkQ2hlY2tJY29uID0gaXRlbU1hcmtDaGVja2VkO1xyXG4gICAgICAvLyBnZXQgYWxsIGNoaWxkcmVuIG5vZGVzIG9uIHNhbWUgbGV2ZWxcclxuICAgICAgbGV0IGxpc3RDaGlsZE5vZGVTYW1lTGV2ZWwgPSB0aGlzLmZpbmRDaGlsZE5vZGUoaXRlbU1hcmtDaGVja2VkLCB0aGlzLmRhdGFTb3VyY2UuZGF0YSk7XHJcbiAgICAgIC8vIGdldCBhbGwgY2hpbGRyZW4gaW4gYWxsIGxldmVsXHJcbiAgICAgIHRoaXMubGlzdENoaWxkTm9kZSA9IFtdO1xyXG4gICAgICB0aGlzLmdldENoaWxkKGxpc3RDaGlsZE5vZGVTYW1lTGV2ZWwpO1xyXG4gICAgICB0aGlzLmdldENoaWxkTm9kZVNlbGVjdE9uZS5lbWl0KHRoaXMubGlzdENoaWxkTm9kZSk7XHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGl0ZW1NYXJrQ2hlY2tlZCA9PT0gdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXNbaV0uaWQpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0Tm9kZUV2ZW50LmVtaXQodGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXNbaV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmRpc2FibGVkTGlzdC5mb3JFYWNoKGVsID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXS5pZCA9PT0gZWwudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICB0aGlzLnRyZWVDb250cm9sLmV4cGFuZCh0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBjaGlsZHJlbiBub2RlcyB3aGVuIHVzZXIgZG9udCBuZWVkIHRvIHNob3cgdGhlbVxyXG4gICAgICAgIHRoaXMubGlzdENoaWxkTm9kZS5mb3JFYWNoKGVsID0+IHtcclxuICAgICAgICAgIGlmIChlbC5pZCAmJiB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXT8uaWQgPT09IGVsLmlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaWRDaGVja0ljb24gPSAnJztcclxuICAgICAgdGhpcy50cmVlQ29udHJvbC5jb2xsYXBzZUFsbCgpO1xyXG4gICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldENoaWxkKG9iaikge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmouY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKG9iai5jaGlsZHJlbltpXS5jaGlsZHJlbikge1xyXG4gICAgICAgIHRoaXMuZ2V0Q2hpbGQob2JqLmNoaWxkcmVuW2ldKTtcclxuICAgICAgICBkZWxldGUgb2JqLmNoaWxkcmVuW2ldLmNoaWxkcmVuO1xyXG4gICAgICAgIHRoaXMubGlzdENoaWxkTm9kZS5wdXNoKG9iai5jaGlsZHJlbltpXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5saXN0Q2hpbGROb2RlLnB1c2gob2JqLmNoaWxkcmVuW2ldKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc29ydERhdGFUcmVlKG9iaikge1xyXG4gICAgaWYgKG9iai5jaGlsZHJlbikge1xyXG4gICAgICBsZXQgY2hpbGQgPSBbXTtcclxuICAgICAgY29uc3QgbGVhZk5vZGUgPSBvYmouY2hpbGRyZW4uZmlsdGVyKHggPT4gIXguY2hpbGRyZW4pO1xyXG4gICAgICBjb25zdCBzdWJGb2xkZXJOb2RlID0gb2JqLmNoaWxkcmVuLmZpbHRlcih4ID0+IHguY2hpbGRyZW4pO1xyXG4gICAgICAvLyBmb3IobGV0IGluZGV4ID0gc3ViRm9sZGVyTm9kZS5sZW5ndGggLSAxOyBpbmRleCA+PSAwIDsgaW5kZXgtLSl7XHJcbiAgICAgIC8vICAgbGV0IGVsID0gc3ViRm9sZGVyTm9kZVtpbmRleF07XHJcbiAgICAgIC8vICAgdGhpcy5zb3J0RGF0YVRyZWUoZWwpO1xyXG4gICAgICAvLyAgIGNoaWxkLnVuc2hpZnQoZWwpO1xyXG4gICAgICAvLyB9XHJcbiAgICAgIHN1YkZvbGRlck5vZGUuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICBsZXQgZWwgPSBlbGVtZW50O1xyXG4gICAgICAgIHRoaXMuc29ydERhdGFUcmVlKGVsKTtcclxuICAgICAgICBjaGlsZC5wdXNoKGVsKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBsZWFmTm9kZS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgIGxldCBlbCA9IGVsZW1lbnQ7XHJcbiAgICAgICAgY2hpbGQucHVzaChlbCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBvYmouY2hpbGRyZW4gPSBjaGlsZDtcclxuICAgIH1cclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG5cclxuICBnZXRJbWFnZVBhdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHRoaXMudHJlZUNvbmZpZy5pdGVtSWNvbkJhc2U2NCkgYXMgc3RyaW5nO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tTZWxlY3RlZChpdGVtU2VsZWN0ZWQ6IFRyZWVGbGF0Tm9kZVtdKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLnRyZWVDb250cm9sWydkYXRhTm9kZXMnXSkgcmV0dXJuO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgdHJlZSA9IHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldO1xyXG4gICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmRlc2VsZWN0KHRyZWUpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGl0ZW1TZWxlY3RlZC5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IGl0ZW1TZWxlY3RlZFtqXTtcclxuICAgICAgICAgIGlmICh0cmVlLmlkID09PSBlbGVtZW50LmlkICYmICghZWxlbWVudC5wYXJlbnRJZCB8fCB0cmVlLnBhcmVudElkID09PSBlbGVtZW50LnBhcmVudElkKSAmJiAhdHJlZS5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3QodHJlZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LCA1MDApO1xyXG5cclxuICB9XHJcblxyXG4gIGNoZWNrU2VsZWN0ZWRTYW1lTm9kZShpdGVtU2VsZWN0ZWQ6IFRyZWVGbGF0Tm9kZVtdLCBmbGFnOiBib29sZWFuKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXTtcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpdGVtU2VsZWN0ZWQubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gaXRlbVNlbGVjdGVkW2pdO1xyXG4gICAgICAgIGlmIChlbGVtZW50LmlkICYmIHRyZWUuaWQgPT09IGVsZW1lbnQuaWRcclxuICAgICAgICAgICYmIHRyZWUucGFyZW50SWQgPT09IGVsZW1lbnQucGFyZW50SWQgJiYgIXRyZWUuZGlzYWJsZWQpIHtcclxuICAgICAgICAgIGZsYWcgPyB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3QodHJlZSkgOiB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5kZXNlbGVjdCh0cmVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEl0ZW1JY29uVHlwZSh0cmVlQ29uZmlnOiBUcmVlQ29uZmlnKSB7XHJcbiAgICBpZiAodHJlZUNvbmZpZy5pdGVtSWNvbiAmJiB0cmVlQ29uZmlnLml0ZW1JY29uLmxlbmd0aCkgcmV0dXJuIHRoaXMuaXRlbUljb25UeXBlLm5hbWU7XHJcbiAgICBpZiAodHJlZUNvbmZpZy5pdGVtSWNvblBhdGggJiYgdHJlZUNvbmZpZy5pdGVtSWNvblBhdGgubGVuZ3RoKSByZXR1cm4gdGhpcy5pdGVtSWNvblR5cGUucGF0aDtcclxuICAgIGlmICh0cmVlQ29uZmlnLml0ZW1JY29uQmFzZTY0ICYmIHRyZWVDb25maWcuaXRlbUljb25CYXNlNjQubGVuZ3RoKSByZXR1cm4gdGhpcy5pdGVtSWNvblR5cGUuYmFzZTY0O1xyXG4gICAgaWYgKHRyZWVDb25maWcuaXRlbUljb25TdmcgJiYgdHJlZUNvbmZpZy5pdGVtSWNvblN2Zy5sZW5ndGgpIHJldHVybiB0aGlzLml0ZW1JY29uVHlwZS5zdmc7XHJcbiAgICByZXR1cm4gdGhpcy5pdGVtSWNvblR5cGUubm9uZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdHJhbnNmb3JtZXIgPSAobm9kZTogVHJlZU5vZGUsIGxldmVsOiBudW1iZXIpID0+IHtcclxuICAgIGxldCBjaGVja0hhc0NoaWxkID0gdHJ1ZTtcclxuICAgIGlmICghbm9kZS5jaGlsZHJlbikge1xyXG4gICAgICBjaGVja0hhc0NoaWxkID0gZmFsc2U7XHJcbiAgICB9IGVsc2UgaWYgKCEoISFub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkpIHtcclxuICAgICAgY2hlY2tIYXNDaGlsZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgZWxzZSBpZiAoXHJcbiAgICAgICEhbm9kZS5jaGlsZHJlbiAmJlxyXG4gICAgICBub2RlLmNoaWxkcmVuLmxlbmd0aCAmJlxyXG4gICAgICBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJlxyXG4gICAgICAhbm9kZS5jaGlsZHJlblswXS5uYW1lLmxlbmd0aCAmJlxyXG4gICAgICBub2RlLmlkLnRvU3RyaW5nKCkgPT09IHRoaXMuYXJlYU9mQ3VycmVudFByb2Nlc3NcclxuICAgICkge1xyXG4gICAgICBjaGVja0hhc0NoaWxkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCEodGhpcy5saXN0UGFyZW50T2JqW25vZGUuaWRdID09PSAxKSkge1xyXG4gICAgICBjaGVja0hhc0NoaWxkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZXhwYW5kYWJsZTogISFub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCxcclxuICAgICAgbmFtZTogbm9kZS5uYW1lLFxyXG4gICAgICBsZXZlbCxcclxuICAgICAgaWQ6IG5vZGUuaWQsXHJcbiAgICAgIGhhc0NoaWxkOiBjaGVja0hhc0NoaWxkLFxyXG4gICAgICBwYXJlbnRJZDogbm9kZS5wYXJlbnRJZCxcclxuICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBsZXZlbFR5cGU6IG5vZGUubGV2ZWxUeXBlXHJcbiAgICB9O1xyXG4gIH07XHJcblxyXG4gIHRyZWVGbGF0dGVuZXIgPSBuZXcgTWF0VHJlZUZsYXR0ZW5lcihcclxuICAgIHRoaXMudHJhbnNmb3JtZXIsXHJcbiAgICAobm9kZSkgPT4ge1xyXG4gICAgICByZXR1cm4gbm9kZS5sZXZlbDtcclxuICAgIH0sXHJcbiAgICAobm9kZSkgPT4ge1xyXG4gICAgICByZXR1cm4gbm9kZS5leHBhbmRhYmxlO1xyXG4gICAgfSxcclxuICAgIChub2RlKSA9PiB7XHJcbiAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuO1xyXG4gICAgfVxyXG4gICk7XHJcblxyXG4gIGRhdGFTb3VyY2UgPSBuZXcgTWF0VHJlZUZsYXREYXRhU291cmNlKHRoaXMudHJlZUNvbnRyb2wsIHRoaXMudHJlZUZsYXR0ZW5lcik7XHJcblxyXG5cclxuICAvKiogV2hldGhlciBhbGwgdGhlIGRlc2NlbmRhbnRzIG9mIHRoZSBub2RlIGFyZSBzZWxlY3RlZCAqL1xyXG4gIGRlc2NlbmRhbnRzQWxsU2VsZWN0ZWQobm9kZTogVHJlZUZsYXROb2RlKTogYm9vbGVhbiB7XHJcblxyXG4gICAgY29uc3QgZGVzY2VuZGFudHMgPSAhdGhpcy5zaW5nbGVTZWxlY3RlZE5vZGUgPyB0aGlzLnRyZWVDb250cm9sLmdldERlc2NlbmRhbnRzKG5vZGUpLmZpbHRlcihpdGVtID0+ICFpdGVtLmRpc2FibGVkKSA6IFtdO1xyXG5cclxuICAgIGlmICghZGVzY2VuZGFudHMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpO1xyXG5cclxuICAgIGNvbnN0IGFsbFNlbGVjdGVkID0gZGVzY2VuZGFudHMuZXZlcnkoY2hpbGQgPT4gdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChjaGlsZCkpO1xyXG4gICAgaWYgKCFzZWxlY3RlZCAmJiBhbGxTZWxlY3RlZCkge1xyXG4gICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3Qobm9kZSk7XHJcbiAgICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYWxsU2VsZWN0ZWQ7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqIFdoZXRoZXIgcGFydCBvZiB0aGUgZGVzY2VuZGFudHMgYXJlIHNlbGVjdGVkICovXHJcbiAgZGVzY2VuZGFudHNQYXJ0aWFsbHlTZWxlY3RlZChub2RlOiBUcmVlRmxhdE5vZGUpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gIXRoaXMuc2luZ2xlU2VsZWN0ZWROb2RlID8gdGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhub2RlKS5maWx0ZXIoaXRlbSA9PiAhaXRlbS5kaXNhYmxlZCkgOiBbXTtcclxuXHJcbiAgICBjb25zdCByZXN1bHQgPSBkZXNjZW5kYW50cy5zb21lKGNoaWxkID0+IHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQoY2hpbGQpKTtcclxuICAgIHJldHVybiByZXN1bHQgJiYgIXRoaXMuZGVzY2VuZGFudHNBbGxTZWxlY3RlZChub2RlKTtcclxuICB9XHJcblxyXG4gIC8qKiBUb2dnbGUgdGhlIHRvLWRvIGl0ZW0gc2VsZWN0aW9uLiBTZWxlY3QvZGVzZWxlY3QgYWxsIHRoZSBkZXNjZW5kYW50cyBub2RlICovXHJcbiAgdG9kb0l0ZW1TZWxlY3Rpb25Ub2dnbGUobm9kZTogVHJlZUZsYXROb2RlKTogdm9pZCB7XHJcbiAgICAvLyB0cmVlIGhhdmUgZHVwbGljYXRlIG5vZGVcclxuICAgIGlmICh0aGlzLnRyZWVDb25maWcuY2FuSGF2ZUR1cElkKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAodGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXNbaV0uaWQgPT09IG5vZGUuaWRcclxuICAgICAgICAgICYmIHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldLnBhcmVudElkID09PSBub2RlLnBhcmVudElkXHJcbiAgICAgICAgICAmJiAhdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXNbaV0uZGlzYWJsZWQpIHtcclxuICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnRvZ2dsZSh0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi50b2dnbGUobm9kZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIHByb2Nlc3MvIGRvY3VtZW50IHNpbmdsZSBzZWxlY3RlZFxyXG4gICAgaWYgKHRoaXMuc2luZ2xlU2VsZWN0ZWROb2RlKSB7XHJcbiAgICAgIHRoaXMuY2hlY2tCb3hFdmVudC5lbWl0KHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkKTtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBkZXNjZW5kYW50cyA9IHRoaXMudHJlZUNvbnRyb2wuZ2V0RGVzY2VuZGFudHMobm9kZSkuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uZGlzYWJsZWQpO1xyXG5cclxuICAgICAgdGhpcy5jaGVja1NlbGVjdGVkU2FtZU5vZGUoZGVzY2VuZGFudHMsIHRoaXMuZGVzY2VuZGFudHNBbGxTZWxlY3RlZChub2RlKSk7XHJcblxyXG4gICAgICAhdGhpcy5kZXNjZW5kYW50c0FsbFNlbGVjdGVkKG5vZGUpXHJcbiAgICAgICAgPyB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3QoLi4uZGVzY2VuZGFudHMpXHJcbiAgICAgICAgOiB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5kZXNlbGVjdCguLi5kZXNjZW5kYW50cyk7XHJcblxyXG4gICAgICB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpO1xyXG5cclxuICAgICAgY29uc3QgYWxsTm9kZUlzUGFyZW50ID0gdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0ZWQuZXZlcnkoY2hpbGQgPT4gY2hpbGQuZXhwYW5kYWJsZSk7XHJcbiAgICAgIGlmIChhbGxOb2RlSXNQYXJlbnQpIHtcclxuICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3RlZC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uZGVzZWxlY3QoZWxlbWVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jaGVja0JveEV2ZW50LmVtaXQodGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0ZWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9kb0NoaWxkU2VsZWN0aW9uVG9nZ2xlKG5vZGU6IFRyZWVGbGF0Tm9kZSk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXNbaV0uaWQgPT09IG5vZGUuaWRcclxuICAgICAgICAmJiB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXS5wYXJlbnRJZCA9PT0gbm9kZS5wYXJlbnRJZFxyXG4gICAgICAgICYmICF0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXS5kaXNhYmxlZCkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnRvZ2dsZSh0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnRvZ2dsZShub2RlKTtcclxuICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB0aGlzLmNoZWNrQm94RXZlbnQuZW1pdCh0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3RlZCk7XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZG9JdGVtU2VsZWN0aW9uQnlJZChpZHM6IGFueVtdKTogdm9pZCB7XHJcbiAgICBpZHMuZm9yRWFjaChcclxuICAgICAgaWQgPT4ge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmICh0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXS5pZCA9PT0gaWRcclxuICAgICAgICAgICAgJiYgIXRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZCh0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXSkpXHJcbiAgICAgICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24udG9nZ2xlKHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICB0aGlzLmNoZWNrQm94RXZlbnQuZW1pdCh0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3RlZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9kb0l0ZW1TZWxlY3Rpb24obm9kZXM6IFRyZWVOb2RlW10pOiB2b2lkIHtcclxuICAgIG5vZGVzLmZvckVhY2goXHJcbiAgICAgIG5vZGUgPT4ge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmICh0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXS5pZCA9PT0gbm9kZS5pZCAmJlxyXG4gICAgICAgICAgICB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXS5wYXJlbnRJZCA9PT0gbm9kZS5wYXJlbnRJZCAmJlxyXG4gICAgICAgICAgICAhdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXNbaV0uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldKSlcclxuICAgICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi50b2dnbGUodGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXNbaV0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIHRoaXMuY2hlY2tCb3hFdmVudC5lbWl0KHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkKTtcclxuICB9XHJcblxyXG4gIGhhc0NoaWxkID0gKF86IG51bWJlciwgbm9kZTogVHJlZUZsYXROb2RlKSA9PiB7XHJcbiAgICByZXR1cm4gbm9kZS5leHBhbmRhYmxlO1xyXG4gIH07XHJcblxyXG4gIHNlbGVjdE5vZGUobm9kZTogVHJlZUZsYXROb2RlKSB7XHJcbiAgICBpZiAod2luZG93W1JlbGF0ZWRDb25zdC5JU19ESVNQTEFZX1NFQVJDSF9SRVNVTFRdKSB7XHJcbiAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZShSZWxhdGVkQ29uc3QuSElERV9TRUFSQ0hfUkVTVUxULCAnKicpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnRyZWVDb25maWcuc2VsZWN0T25lKSB7XHJcbiAgICAgIG5vZGUuaXRlbVR5cGUgPSB0aGlzLmNoZWNrRGF0YVR5cGVTZWxlY3ROb2RlKG5vZGUpO1xyXG4gICAgICB0aGlzLmlkQ2hlY2tJY29uID0gbm9kZS5pZDtcclxuICAgICAgdGhpcy5zZWxlY3ROb2RlRXZlbnQuZW1pdChub2RlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoZWNrRGF0YVR5cGVTZWxlY3ROb2RlKG5vZGU6IFRyZWVGbGF0Tm9kZSkge1xyXG4gICAgbGV0IGl0ZW1UeXBlID0gLTE7XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLm1vZHVsZUlkKSB7XHJcbiAgICAgIGNhc2UgRGF0YVR5cGUucHJvY2VzczpcclxuICAgICAgICBpdGVtVHlwZSA9IG5vZGUuZXhwYW5kYWJsZSA/IERhdGFUeXBlLmFyZWEgOiBEYXRhVHlwZS5wcm9jZXNzO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIERhdGFUeXBlLmRvY3VtZW50OlxyXG4gICAgICAgIGl0ZW1UeXBlID0gbm9kZS5leHBhbmRhYmxlID8gRGF0YVR5cGUuZm9sZGVyIDogRGF0YVR5cGUuZG9jdW1lbnQ7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGl0ZW1UeXBlID0gdGhpcy5tb2R1bGVJZDtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXRlbVR5cGU7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RGb2xkZXIobm9kZTogVHJlZUZsYXROb2RlKSB7XHJcbiAgICB0aGlzLnNlbGVjdEZvbGRlckV2ZW50LmVtaXQobm9kZSk7XHJcbiAgfVxyXG5cclxuICBvbkV4cGFuZE5vZGUobm9kZTogVHJlZUZsYXROb2RlLCBpc0V4cGFuZE5vZGU/OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy50cmVlQ29uZmlnLnNlbGVjdE9uZSkge1xyXG4gICAgICAvLyBpZiAodGhpcy5kaXNhYmxlZExpc3QubGVuZ3RoICYmXHJcbiAgICAgIC8vICAgKG5vZGUuaWQgPT09IHRoaXMuZGlzYWJsZWRMaXN0W3RoaXMuZGlzYWJsZWRMaXN0Lmxlbmd0aCAtIDFdLnRvVXBwZXJDYXNlKCkgfHxcclxuICAgICAgLy8gICAgIG5vZGUucGFyZW50SWQgPT09IHRoaXMuZGlzYWJsZWRMaXN0W3RoaXMuZGlzYWJsZWRMaXN0Lmxlbmd0aCAtIDFdLnRvVXBwZXJDYXNlKCkpKSB7XHJcbiAgICAgIC8vICAgcmV0dXJuO1xyXG4gICAgICAvLyB9XHJcbiAgICAgIHRoaXMuaWRDaGVja0ljb24gPSBub2RlLmlkO1xyXG4gICAgICBub2RlLml0ZW1UeXBlID0gdGhpcy5jaGVja0RhdGFUeXBlU2VsZWN0Tm9kZShub2RlKTtcclxuICAgICAgdGhpcy5zZWxlY3ROb2RlRXZlbnQuZW1pdChub2RlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod2luZG93W1JlbGF0ZWRDb25zdC5JU19ESVNQTEFZX1NFQVJDSF9SRVNVTFRdKSB7XHJcbiAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZShSZWxhdGVkQ29uc3QuSElERV9TRUFSQ0hfUkVTVUxULCAnKicpO1xyXG4gICAgfVxyXG4gICAgLy8gc2V0IHVzZUV4cGFuZEZlYXR1cmUgPSB0cnVlIHRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugb2YgdHJlZSBsb2FkaW5nXHJcbiAgICBpZiAoIWlzRXhwYW5kTm9kZSB8fCAhdGhpcy51c2VFeHBhbmRGZWF0dXJlKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hcnJJbmRleC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLmFyckluZGV4W2ldID09PSBub2RlLmlkKSB7XHJcbiAgICAgICAgICB0aGlzLmFyckluZGV4LnNwbGljZShpLCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGlzRXhwYW5kTm9kZSAmJiAhdGhpcy5leHBhbmRPblRpdGxlQ2xpY2spIHtcclxuICAgICAgICB0aGlzLm5vZGVFeHBhbmRFdmVudC5lbWl0KG5vZGUpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vIGdldCBhcnJheSBpbmRleCB0byBleHBhbmQgbm9kZSBhZnRlciByZWZyZXNoIGRhdGFzb3VyY2VcclxuICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICBsZXQgaXNDaGFuZ2UgPSBmYWxzZTtcclxuICAgIGxldCBpc1JlbW92ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5hcnJJbmRleC5wdXNoKG5vZGUuaWQpO1xyXG5cclxuICAgIGNvbnN0IGNoaWxkQXJyYXkgPSB0aGlzLnRyZWVEYXRhLmZpbHRlcigoeCkgPT4ge1xyXG4gICAgICByZXR1cm4geC5wYXJlbnRJZCA9PT0gbm9kZS5pZDtcclxuICAgIH0pO1xyXG4gICAgbGV0IHJvb3RJZCA9ICcwJztcclxuICAgIGxldCBwYXJlbnRFbGVtZW50OiBUcmVlTm9kZTtcclxuICAgIGxldCBjaGlsZHJlbkxpc3Q6IFRyZWVOb2RlW107XHJcbiAgICBpZiAoY2hpbGRBcnJheS5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY2hpbGRBcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLnJvb3RJZCA9PT0gcm9vdElkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBnZXQgY2hpbGQgbm9kZSBmcm9tIG9yaWdpbmFsIGRhdGFzb3VyY2VcclxuICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLmdldENoaWxkTm9kZShpdGVtLnJvb3RJZCwgY2hpbGRBcnJheSk7XHJcbiAgICAgIHJvb3RJZCA9IGl0ZW0ucm9vdElkO1xyXG5cclxuICAgICAgaW5kZXggPSB0aGlzLmdldE5vZGVJbmRleChjaGlsZC5pZCwgdW5kZWZpbmVkLCB0aGlzLmRhdGFTb3VyY2VbJ190cmVlQ29udHJvbCddLmRhdGFOb2Rlcyk7XHJcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBhZGQgY2hpbGQgbm9kZSB0byBleHBhbmQgbm9kZVxyXG4gICAgICBwYXJlbnRFbGVtZW50ID0gdGhpcy5maW5kQ2hpbGROb2RlKG5vZGUuaWQsIHRoaXMuZGF0YVNvdXJjZS5kYXRhKTtcclxuICAgICAgaWYgKHBhcmVudEVsZW1lbnQpIHtcclxuICAgICAgICAvLyB0ZW1wb3JhcnkgcmVtb3ZlIGFsbCBub2RlIHdpdGhvdXQgY2hpbGRyZW4gPT4gcHVycG9zZSB0byBhZGQgbm9kZSBmb2xkZXIgZmlyc3RcclxuICAgICAgICBpZiAoIWlzUmVtb3ZlKSB7XHJcbiAgICAgICAgICBjaGlsZHJlbkxpc3QgPSBbLi4ucGFyZW50RWxlbWVudC5jaGlsZHJlbl07XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZUNoaWxkcmVuKHBhcmVudEVsZW1lbnQpO1xyXG4gICAgICAgICAgaXNSZW1vdmUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBhZGQgbm9kZSBmb2xkZXIgZmlyc3RcclxuICAgICAgICBwYXJlbnRFbGVtZW50LmNoaWxkcmVuLnB1c2goY2hpbGQpO1xyXG4gICAgICAgIGlzQ2hhbmdlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvLyBhZGQgbm9kZSB3aXRob3V0IGNoaWxkcmVuIGFnYWluXHJcbiAgICBpZiAoaXNSZW1vdmUpIHtcclxuICAgICAgdGhpcy5hZGRDaGlsZHJlbihwYXJlbnRFbGVtZW50LCBjaGlsZHJlbkxpc3QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlZnJlc2ggZGF0YSBhbmQgZXhwYW5kIHRyZWUgbm9kZSBmcm9tIHJvb3Qgbm9kZVxyXG4gICAgaWYgKGlzQ2hhbmdlKSB7XHJcbiAgICAgIHRoaXMucmVmcmVzaFRyZWVEYXRhKCk7XHJcbiAgICAgIHRoaXMuYXJySW5kZXguZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGluZGV4ID0gdGhpcy5nZXROb2RlSW5kZXgoaXRlbSwgdW5kZWZpbmVkLCB0aGlzLmRhdGFTb3VyY2VbJ190cmVlQ29udHJvbCddLmRhdGFOb2Rlcyk7XHJcbiAgICAgICAgdGhpcy50cmVlQ29udHJvbC5leHBhbmQodGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXNbaW5kZXhdKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGlzQ2hhbmdlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVDaGlsZHJlbihwYXJlbnRFbGVtZW50PzogVHJlZU5vZGUpIHtcclxuICAgIGlmIChwYXJlbnRFbGVtZW50LmNoaWxkcmVuKSB7XHJcbiAgICAgIHBhcmVudEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID0gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZENoaWxkcmVuKHBhcmVudEVsZW1lbnQ/OiBUcmVlTm9kZSwgY2hpbGRyZW5MaXN0PzogVHJlZU5vZGVbXSkge1xyXG4gICAgaWYgKGNoaWxkcmVuTGlzdCkge1xyXG4gICAgICBjaGlsZHJlbkxpc3QuZm9yRWFjaCgoZSkgPT4ge1xyXG4gICAgICAgIHBhcmVudEVsZW1lbnQuY2hpbGRyZW4ucHVzaChlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXROb2RlSW5kZXgoaWQ6IHN0cmluZywgbGV2ZWw/OiBudW1iZXIsIGRhdGE/OiBhbnlbXSkge1xyXG4gICAgaWYgKGxldmVsKSB7XHJcbiAgICAgIHJldHVybiBkYXRhLmZpbmRJbmRleCgoeCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB4LmlkID09PSBpZCAmJiB4LmxldmVsID09PSBsZXZlbDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRhdGEuZmluZEluZGV4KCh4KSA9PiB7XHJcbiAgICAgIHJldHVybiB4LmlkID09PSBpZDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2hpbGROb2RlKHJvb3RJZDogc3RyaW5nLCBkYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IGNoaWxkQXJyYXkgPSBkYXRhLmZpbHRlcigoeCkgPT4ge1xyXG4gICAgICByZXR1cm4geC5yb290SWQgPT09IHJvb3RJZDtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgY2hpbGQgPSB7IGlkOiBjaGlsZEFycmF5WzBdLnJvb3RJZCwgbmFtZTogY2hpbGRBcnJheVswXS5zdWJOYW1lLCBjaGlsZHJlbjogW10gfSBhcyBUcmVlTm9kZTtcclxuICAgIGNoaWxkQXJyYXkuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBjaGlsZC5jaGlsZHJlbi5wdXNoKHsgaWQ6IGl0ZW0uY2hpbGRJZCwgbmFtZTogaXRlbS5jaGlsZE5hbWUsIHBhcmVudElkOiByb290SWQgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjaGlsZDtcclxuICB9XHJcblxyXG4gIGZpbmRDaGlsZE5vZGUoaWQ6IHN0cmluZywgZGF0YTogVHJlZU5vZGVbXSkge1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XHJcbiAgICBmb3IgKGNvbnN0IGN1cnJlbnRGYXRoZXIgb2YgZGF0YSkge1xyXG4gICAgICBpZiAoY3VycmVudEZhdGhlci5pZCA9PT0gaWQpIHtcclxuICAgICAgICByZXR1cm4gY3VycmVudEZhdGhlcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGN1cnJlbnRGYXRoZXIuY2hpbGRyZW4pIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50Q2hpbGQgPSBjdXJyZW50RmF0aGVyLmNoaWxkcmVuLmZpbmQoKHgpID0+IHtcclxuICAgICAgICAgIHJldHVybiB4LmlkID09PSBpZDtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoY3VycmVudENoaWxkKSB7XHJcbiAgICAgICAgICByZXR1cm4gY3VycmVudENoaWxkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XHJcbiAgICAgICAgZm9yIChjb25zdCBjdXJyZW50Q2hpbGQxIG9mIGN1cnJlbnRGYXRoZXIuY2hpbGRyZW4pIHtcclxuICAgICAgICAgIGlmIChpZCAhPT0gY3VycmVudENoaWxkMS5pZCkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZpbmRDaGlsZE5vZGUoaWQsIGN1cnJlbnRGYXRoZXIuY2hpbGRyZW4pO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJlZnJlc2hUcmVlRGF0YSgpIHtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YTtcclxuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gW107XHJcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBnZXROb2RlSWNvbihub2RlOiBUcmVlRmxhdE5vZGUpIHtcclxuICAgIGlmICh0aGlzLm9wZW5JY29uICYmIHRoaXMuY2xvc2VJY29uKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkgPyB0aGlzLm9wZW5JY29uIDogdGhpcy5jbG9zZUljb247XHJcbiAgICB9XHJcbiAgICBzd2l0Y2ggKHRoaXMubW9kdWxlSWQpIHtcclxuICAgICAgY2FzZSBEYXRhVHlwZS5kb2N1bWVudDoge1xyXG4gICAgICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy50cmVlRGF0YS5maWx0ZXIoeCA9PiB7IHJldHVybiB4LnJvb3RJZCA9PT0gbm9kZS5pZDsgfSk7XHJcbiAgICAgICAgaWYgKG5vZGVEYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHN3aXRjaCAobm9kZURhdGFbMF0ubGV2ZWxUeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRG9jdW1lbnROb2RlVHlwZS5EZXBhcnRtZW50Rm9sZGVyOlxyXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkgPyAnZGVwYXJ0bWVudF9mb2xkZXJfb3V0bGluZWQnIDogJ2RlcGFydG1lbnRfZm9sZGVyJztcclxuICAgICAgICAgICAgY2FzZSBEb2N1bWVudE5vZGVUeXBlLlJlZ2lvbmFsRm9sZGVyOlxyXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkgPyAncmVnaW9uYWxfZm9sZGVyX291dGxpbmVkJyA6ICdyZWdpb25hbF9mb2xkZXInO1xyXG4gICAgICAgICAgICBjYXNlIERvY3VtZW50Tm9kZVR5cGUuVG9wRm9sZGVyOlxyXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkgPyAnZW50ZXJwcmlzZV9mb2xkZXJfb3V0bGluZWQnIDogJ2VudGVycHJpc2VfZm9sZGVyJztcclxuICAgICAgICAgICAgY2FzZSBEb2N1bWVudE5vZGVUeXBlLkZvbGRlcjpcclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpID8gJ2xvY2FsX2ZvbGRlcl9vdXRsaW5lZCcgOiAnbG9jYWxfZm9sZGVyJztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpID8gJ2ZvbGRlcl9vdXRsaW5lZCcgOiAnZm9sZGVyJztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKSA/ICdrZXlib2FyZF91cCcgOiAna2V5Ym9hcmRfZG93bic7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSBEYXRhVHlwZS5wcm9jZXNzOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkgPyAncHJvY2Vzc19hcmVhX291dGxpbmVkJyA6ICdwcm9jZXNzX2FyZWEnO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiB0aGlzLnRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkgPyAna2V5Ym9hcmRfdXAnIDogJ2tleWJvYXJkX2Rvd24nO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0SXRlbUljb24obm9kZSkge1xyXG4gICAgc3dpdGNoICh0aGlzLm1vZHVsZUlkKSB7XHJcbiAgICAgIGNhc2UgRGF0YVR5cGUuZG9jdW1lbnQ6XHJcbiAgICAgICAgc3dpdGNoIChub2RlLmxldmVsVHlwZSkge1xyXG4gICAgICAgICAgY2FzZSBEb2N1bWVudE5vZGVUeXBlLkRlcGFydG1lbnRGb2xkZXI6XHJcbiAgICAgICAgICAgIHJldHVybiAnZG9jdW1lbnRfZGVwYXJ0bWVudCc7XHJcbiAgICAgICAgICBjYXNlIERvY3VtZW50Tm9kZVR5cGUuUmVnaW9uYWxGb2xkZXI6XHJcbiAgICAgICAgICAgIHJldHVybiAnZG9jdW1lbnRfcmVnaW9uYWwnO1xyXG4gICAgICAgICAgY2FzZSBEb2N1bWVudE5vZGVUeXBlLlRvcEZvbGRlcjpcclxuICAgICAgICAgICAgcmV0dXJuICdkb2N1bWVudF9lbnRlcnByaXNlJztcclxuICAgICAgICAgIGNhc2UgRG9jdW1lbnROb2RlVHlwZS5Gb2xkZXI6XHJcbiAgICAgICAgICAgIHJldHVybiAnZG9jdW1lbnRfbG9jYWwnO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuICdkb2N1bWVudCc7XHJcbiAgICAgICAgfVxyXG4gICAgICBjYXNlIERhdGFUeXBlLnByb2Nlc3M6XHJcbiAgICAgICAgcmV0dXJuICdwcm9jZXNzJztcclxuICAgICAgY2FzZSBEYXRhVHlwZS5jaGVja2xpc3Q6XHJcbiAgICAgICAgcmV0dXJuICdjaGVja2xpc3QnO1xyXG4gICAgICBjYXNlIERhdGFUeXBlLmRldmlhdGlvbjpcclxuICAgICAgICByZXR1cm4gJ2RldmlhdGlvbic7XHJcbiAgICAgIGNhc2UgRGF0YVR5cGUucmlzazpcclxuICAgICAgICByZXR1cm4gJ3Jpc2snO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAnZG9jdW1lbnQnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0Rm9sZGVyTm9kZShub2RlOiBUcmVlRmxhdE5vZGUpIHtcclxuICAgIGlmICghdGhpcy5leHBhbmRPblRpdGxlQ2xpY2spIHtcclxuICAgICAgdGhpcy5vbkV4cGFuZE5vZGUobm9kZSwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXROb2RlSWQobm9kZTogVHJlZUZsYXROb2RlKSB7XHJcbiAgICByZXR1cm4gYF8ke25vZGUucGFyZW50SWQgPyBub2RlLnBhcmVudElkIDogJyd9XyR7bm9kZS5pZH1fJHtub2RlLmxldmVsfWA7XHJcbiAgfVxyXG59XHJcbiIsIjxtYXQtdHJlZVxyXG4gIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxyXG4gIFt0cmVlQ29udHJvbF09XCJ0cmVlQ29udHJvbFwiXHJcbiAgY2xhc3M9XCJ0cmVlX19jb250YWluZXJcIlxyXG4+XHJcbiAgPG1hdC10cmVlLW5vZGVcclxuICAgIGNsYXNzPVwidHJlZS1icmFuY2hcIlxyXG4gICAgKm1hdFRyZWVOb2RlRGVmPVwibGV0IG5vZGVcIlxyXG4gICAgbWF0VHJlZU5vZGVUb2dnbGVcclxuICAgIG1hdFRyZWVOb2RlUGFkZGluZ1xyXG4gID5cclxuICAgIDwhLS0gZm9ybSB0aHUgMSAtIGNoaWxkIC0tPlxyXG4gICAgPG1hdC1jaGVja2JveFxyXG4gICAgICBxbXMtZ3JvdXAtb3B0aW9uc1xyXG4gICAgICBbZGlzYWJsZWRdPVwibm9kZS5kaXNhYmxlZFwiXHJcbiAgICAgIGNvbG9yPVwiZGVmYXVsdFwiXHJcbiAgICAgICpuZ0lmPVwibm9kZS5uYW1lICYmIHNob3dDaGVja0JveCAmJiAhb25seUNoZWNrQm94Rm9yQ2hpbGQgJiYgIW9ubHlGb2xkZXJcIlxyXG4gICAgICBjbGFzcz1cImNoZWNrbGlzdC1sZWFmLW5vZGVcIlxyXG4gICAgICBbY2hlY2tlZF09XCJjaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKVwiXHJcbiAgICAgIChjaGFuZ2UpPVwidG9kb0l0ZW1TZWxlY3Rpb25Ub2dnbGUobm9kZSlcIlxyXG4gICAgPlxyXG4gICAgPC9tYXQtY2hlY2tib3g+XHJcblxyXG4gICAgPCEtLSBmb3JtIHRodSAyIC0tPlxyXG4gICAgPG1hdC1jaGVja2JveFxyXG4gICAgICBxbXMtZ3JvdXAtb3B0aW9uc1xyXG4gICAgICBbZGlzYWJsZWRdPVwibm9kZS5kaXNhYmxlZFwiXHJcbiAgICAgIGNvbG9yPVwiZGVmYXVsdFwiXHJcbiAgICAgICpuZ0lmPVwibm9kZS5uYW1lICYmIHNob3dDaGVja0JveCAmJiBvbmx5Q2hlY2tCb3hGb3JDaGlsZCAmJiAhb25seUZvbGRlclwiXHJcbiAgICAgIGNsYXNzPVwibWwtMTAgY2hlY2tsaXN0LWxlYWYtbm9kZVwiXHJcbiAgICAgIFtjaGVja2VkXT1cImNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpXCJcclxuICAgICAgKGNoYW5nZSk9XCJ0b2RvSXRlbVNlbGVjdGlvblRvZ2dsZShub2RlKVwiXHJcbiAgICA+PC9tYXQtY2hlY2tib3g+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiZXhwYW5kLW5vZGVcIlxyXG4gICAgICAqbmdJZj1cIm5vZGUubmFtZSAmJiAhb25seUZvbGRlclwiXHJcbiAgICAgIFtjbGFzcy5iZ1NlbGVjdGVkXT1cInRyZWVDb25maWcuc2VsZWN0T25lICYmIGlkQ2hlY2tJY29uID09IG5vZGUuaWRcIlxyXG4gICAgICAoY2xpY2spPVwic2VsZWN0Tm9kZShub2RlKVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJleHBhbmQtbm9kZV9fdGV4dFwiPlxyXG4gICAgICAgIDxtYXQtaWNvblxyXG4gICAgICAgICAgKm5nSWY9XCJkaXNwbGF5VHlwZSA9PT0gaXRlbUljb25UeXBlLm5hbWUgJiYgIW9ubHlDaGVja0JveEZvckNoaWxkXCJcclxuICAgICAgICAgIGNsYXNzPVwibWF0LWljb24tcnRsLW1pcnJvciBtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgaXRlbUljb24gfX1cclxuICAgICAgICA8L21hdC1pY29uPlxyXG5cclxuICAgICAgICA8bWF0LWljb25cclxuICAgICAgICAgICpuZ0lmPVwiZGlzcGxheVR5cGUgPT09IGl0ZW1JY29uVHlwZS5zdmcgJiYgIW9ubHlDaGVja0JveEZvckNoaWxkXCJcclxuICAgICAgICAgIGNsYXNzPVwibWF0LWljb24tcnRsLW1pcnJvciBtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiXHJcbiAgICAgICAgICBbc3ZnSWNvbl09XCJpdGVtSWNvblN2Z1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWljb24+XHJcblxyXG4gICAgICAgIDxpbWdcclxuICAgICAgICAgICpuZ0lmPVwiZGlzcGxheVR5cGUgPT09IGl0ZW1JY29uVHlwZS5wYXRoICYmICFvbmx5Q2hlY2tCb3hGb3JDaGlsZFwiXHJcbiAgICAgICAgICBjbGFzcz1cIm1hdC1pY29uXCJcclxuICAgICAgICAgIFtzcmNdPVwiaXRlbUljb25QYXRoXCJcclxuICAgICAgICAvPlxyXG5cclxuICAgICAgICA8aW1nXHJcbiAgICAgICAgICAqbmdJZj1cImRpc3BsYXlUeXBlID09PSBpdGVtSWNvblR5cGUuYmFzZTY0ICYmICFvbmx5Q2hlY2tCb3hGb3JDaGlsZFwiXHJcbiAgICAgICAgICBjbGFzcz1cIm1hdC1pY29uIGltYWdlLWJhc2U2NFwiXHJcbiAgICAgICAgICBbc3JjXT1cImdldEltYWdlUGF0aCgpXCJcclxuICAgICAgICAvPlxyXG5cclxuICAgICAgICA8bWF0LWljb25cclxuICAgICAgICAgICpuZ0lmPVwiZGlzcGxheVR5cGUgPT09IGl0ZW1JY29uVHlwZS5ub25lICYmICFvbmx5Q2hlY2tCb3hGb3JDaGlsZFwiXHJcbiAgICAgICAgICBjbGFzcz1cIm1hdC1pY29uLXJ0bC1taXJyb3IgbWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIlxyXG4gICAgICAgICAgW3N2Z0ljb25dPVwiZ2V0SXRlbUljb24obm9kZSlcIlxyXG4gICAgICAgID48L21hdC1pY29uPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1ub2RlXCI+e3sgbm9kZS5uYW1lIH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG1hdC1pY29uXHJcbiAgICAgICAgY2xhc3M9XCJpY29uLWNoZWNrXCJcclxuICAgICAgICAqbmdJZj1cInRyZWVDb25maWcuc2VsZWN0T25lICYmIGlkQ2hlY2tJY29uID09IG5vZGUuaWRcIlxyXG4gICAgICAgID5kb25lPC9tYXQtaWNvblxyXG4gICAgICA+XHJcbiAgICA8L2Rpdj5cclxuICA8L21hdC10cmVlLW5vZGU+XHJcblxyXG4gIDxtYXQtdHJlZS1ub2RlICptYXRUcmVlTm9kZURlZj1cImxldCBub2RlOyB3aGVuOiBoYXNDaGlsZFwiIG1hdFRyZWVOb2RlUGFkZGluZz5cclxuICAgIDwhLS0gZm9ybSB0aHUgMSAtIHBhcmVudCAtLT5cclxuICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgcW1zLWdyb3VwLW9wdGlvbnNcclxuICAgICAgW2Rpc2FibGVkXT1cIm5vZGUuZGlzYWJsZWRcIlxyXG4gICAgICBjb2xvcj1cImRlZmF1bHRcIlxyXG4gICAgICAqbmdJZj1cInNob3dDaGVja0JveCAmJiAhb25seUNoZWNrQm94Rm9yQ2hpbGRcIlxyXG4gICAgICBbY2hlY2tlZF09XCJkZXNjZW5kYW50c0FsbFNlbGVjdGVkKG5vZGUpXCJcclxuICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiZGVzY2VuZGFudHNQYXJ0aWFsbHlTZWxlY3RlZChub2RlKVwiXHJcbiAgICAgIChjaGFuZ2UpPVwidG9kb0l0ZW1TZWxlY3Rpb25Ub2dnbGUobm9kZSlcIlxyXG4gICAgPjwvbWF0LWNoZWNrYm94PlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICBjbGFzcz1cImJ1dHRvbi1ib2RlclwiXHJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICBtYXRUcmVlTm9kZVRvZ2dsZVxyXG4gICAgICBbZGlzYWJsZVJpcHBsZV09XCIhbm9kZS5oYXNDaGlsZFwiXHJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3RvZ2dsZSAnICsgbm9kZS5maWxlbmFtZVwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtaWNvblxyXG4gICAgICAgICpuZ0lmPVwib3Blbkljb24gJiYgY2xvc2VJY29uXCJcclxuICAgICAgICBjbGFzcz1cIm1hdC1pY29uLXJ0bC1taXJyb3JcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgIGNvbG9yOiB0cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpID8gb3Blbkljb25Db2xvciA6IGNsb3NlSWNvbkNvbG9yXHJcbiAgICAgICAgfVwiXHJcbiAgICAgICAgPnt7IGdldE5vZGVJY29uKG5vZGUpIH19PC9tYXQtaWNvblxyXG4gICAgICA+XHJcbiAgICAgIDxtYXQtaWNvblxyXG4gICAgICAgICpuZ0lmPVwiIW9wZW5JY29uIHx8ICFjbG9zZUljb25cIlxyXG4gICAgICAgIGNsYXNzPVwibWF0LWljb24tcnRsLW1pcnJvclwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgJ29wZW4taWNvbic6IHRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSksXHJcbiAgICAgICAgICAnbm90LWRlcGFydG1lbnQtaWNvbic6IG1vZHVsZUlkICE9PSBkYXRhVHlwZS5kb2N1bWVudFxyXG4gICAgICAgIH1cIlxyXG4gICAgICAgIFtzdmdJY29uXT1cImdldE5vZGVJY29uKG5vZGUpXCJcclxuICAgICAgPlxyXG4gICAgICA8L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8c3BhblxyXG4gICAgICAqbmdJZj1cImV4cGFuZE9uVGl0bGVDbGlja1wiXHJcbiAgICAgIG1hdFRyZWVOb2RlVG9nZ2xlXHJcbiAgICAgIGNsYXNzPVwidGV4dC1ub2RlLXBhcmVudFwiXHJcbiAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCJcclxuICAgICAgKGNsaWNrKT1cIm9uRXhwYW5kTm9kZShub2RlKVwiXHJcbiAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICBjb2xvcjogdHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKSA/IG9wZW5JY29uQ29sb3IgOiAnIzAwMDAwMCdcclxuICAgICAgfVwiXHJcbiAgICA+XHJcbiAgICAgIDxzcGFuPnt7IG5vZGUubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgPG1hdC1pY29uXHJcbiAgICAgICAgY2xhc3M9XCJpY29uLWNoZWNrXCJcclxuICAgICAgICAqbmdJZj1cInRyZWVDb25maWcuc2VsZWN0T25lICYmIGlkQ2hlY2tJY29uID09IG5vZGUuaWRcIlxyXG4gICAgICAgID5kb25lPC9tYXQtaWNvblxyXG4gICAgICA+XHJcbiAgICA8L3NwYW4+XHJcbiAgICA8c3BhblxyXG4gICAgICAqbmdJZj1cIiFleHBhbmRPblRpdGxlQ2xpY2tcIlxyXG4gICAgICBjbGFzcz1cInRleHQtbm9kZS1wYXJlbnRcIlxyXG4gICAgICAoY2xpY2spPVwic2VsZWN0Rm9sZGVyTm9kZShub2RlKVwiXHJcbiAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCJcclxuICAgICAgW2lkXT1cImdldE5vZGVJZChub2RlKVwiXHJcbiAgICA+XHJcbiAgICAgIDxzcGFuPnt7IG5vZGUubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgPG1hdC1pY29uXHJcbiAgICAgICAgY2xhc3M9XCJpY29uLWNoZWNrXCJcclxuICAgICAgICAqbmdJZj1cInRyZWVDb25maWcuc2VsZWN0T25lICYmIGlkQ2hlY2tJY29uID09IG5vZGUuaWRcIlxyXG4gICAgICAgID5kb25lPC9tYXQtaWNvblxyXG4gICAgICA+XHJcbiAgICA8L3NwYW4+XHJcbiAgPC9tYXQtdHJlZS1ub2RlPlxyXG48L21hdC10cmVlPlxyXG4iXX0=
|