@xw-components/formula-editor 18.1.0 → 18.1.1
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/esm2022/formula-editor-request.service.mjs +11 -5
- package/esm2022/formula-editor.component.mjs +195 -32
- package/esm2022/formula-editor.model.mjs +9 -1
- package/esm2022/formula-editor.service.mjs +3 -6
- package/fesm2022/formula-editor.mjs +214 -40
- package/fesm2022/formula-editor.mjs.map +1 -1
- package/formula-editor-request.service.d.ts +43 -8
- package/formula-editor.component.d.ts +169 -7
- package/formula-editor.model.d.ts +9 -0
- package/package.json +1 -1
|
@@ -8,11 +8,17 @@ export class FormulaEditorRequestService {
|
|
|
8
8
|
constructor() { }
|
|
9
9
|
/**
|
|
10
10
|
* 获取字段的描述
|
|
11
|
-
*
|
|
12
|
-
*
|
|
11
|
+
* 实现类需要根据字段id来获取字段的描述
|
|
12
|
+
* 例如:
|
|
13
|
+
* ```typescript
|
|
14
|
+
* getFieldDescription(description: WritableSignal<string>) {
|
|
15
|
+
* description.set('');
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
* @param description 描述字符串信号量
|
|
13
19
|
*/
|
|
14
|
-
getFieldDescription() {
|
|
15
|
-
|
|
20
|
+
getFieldDescription(description) {
|
|
21
|
+
description.set('');
|
|
16
22
|
}
|
|
17
23
|
}
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXVsYS1lZGl0b3ItcmVxdWVzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29tcG9uZW50cy9mb3JtdWxhLWVkaXRvci9mb3JtdWxhLWVkaXRvci1yZXF1ZXN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFPL0QsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsSUFBSSxjQUFjLENBQThCLGtDQUFrQyxDQUFDLENBQUM7QUFFcEk7OztHQUdHO0FBQ0gsTUFBTSxPQUFnQiwyQkFBMkI7SUFDL0MsZ0JBQWUsQ0FBQztJQWdEaEI7Ozs7Ozs7Ozs7T0FVRztJQUNILG1CQUFtQixDQUFDLFdBQW1DO1FBQ3JELFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIFdyaXRhYmxlU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgTnpUcmVlTm9kZU9wdGlvbnMgfSBmcm9tICduZy16b3Jyby1hbnRkL3RyZWUnO1xuXG5pbXBvcnQgeyBGaWVsZCwgRnVuYywgSXRlbVR5cGUgfSBmcm9tICcuL2Zvcm11bGEtZWRpdG9yLm1vZGVsJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuL2Zvcm11bGEtZWRpdG9yLnNlcnZpY2UnO1xuXG5leHBvcnQgY29uc3QgRm9ybXVsYUVkaXRvclJlcXVlc3RTZXJ2aWNlVG9rZW4gPSBuZXcgSW5qZWN0aW9uVG9rZW48Rm9ybXVsYUVkaXRvclJlcXVlc3RTZXJ2aWNlPignRm9ybXVsYUVkaXRvclJlcXVlc3RTZXJ2aWNlVG9rZW4nKTtcblxuLyoqXG4gKiDlhazlvI/nvJbovpHlmajor7fmsYLmnI3liqHvvIznlKjkuo7ojrflj5blh73mlbDliJfooajjgIHlrZfmrrXliJfooajjgIHmjIfmoIfliJfooajlkozmoKHpqozlhazlvI/moLzlvI9cbiAqIOWunueOsOexu+mcgOimgeWunueOsOWbm+S4quaWueazleOAguWmguaenOaciemDqOWIhuaWueazleS4jemcgOimge+8jOWPr+S7peWunueOsOepuuaWueazleOAglxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9ybXVsYUVkaXRvclJlcXVlc3RTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiDojrflj5blh73mlbDliJfooahcbiAgICog5a6e546w57G76ZyA6KaB5qC55o2u5YmNbuS4qumAieaLqeahhueahOWAvOadpeWKqOaAgeiOt+WPluS4i+S4gOS4qumAieaLqeahhueahOmAiemhuVxuICAgKiDkvovlpoLvvJpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBnZXRGdW5jdGlvbnMoZnVuY3Rpb25MaXN0OiBXcml0YWJsZVNpZ25hbDxOelRyZWVOb2RlT3B0aW9uc1tdPikge1xuICAgKiAgIGZ1bmN0aW9uTGlzdC5zZXQoW1xuICAgKiAgICAgeyB0aXRsZTogJ1NVTScsIGtleTogJ3N1bScsIGNsYXNzTmFtZTogJ3N1bScgfSxcbiAgICogICAgIHsgdGl0bGU6ICdBVkcnLCBrZXk6ICdhdmcnLCBjbGFzc05hbWU6ICdhdmcnIH1cbiAgICogICBdKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICogQHBhcmFtIGZ1bmN0aW9uTGlzdCDlh73mlbDliJfooajkv6Hlj7fph49cbiAgICovXG4gIGFic3RyYWN0IGdldEZ1bmN0aW9ucyhmdW5jdGlvbkxpc3Q6IFdyaXRhYmxlU2lnbmFsPE56VHJlZU5vZGVPcHRpb25zW10+KTogdm9pZDtcblxuICAvKipcbiAgICog6I635Y+W5a2X5q615YiX6KGoXG4gICAqIOWunueOsOexu+mcgOimgeagueaNruWJjW7kuKrpgInmi6nmoYbnmoTlgLzmnaXliqjmgIHojrflj5bkuIvkuIDkuKrpgInmi6nmoYbnmoTpgInpoblcbiAgICog5L6L5aaC77yaXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogZ2V0RmllbGRzKGZpZWxkTGlzdDogV3JpdGFibGVTaWduYWw8RmllbGRbXT4pIHtcbiAgICogICBmaWVsZExpc3Quc2V0KFtcbiAgICogICAgIHsgaWQ6ICd1c2VyJywgbmFtZTogJ+eUqOaItycsIGNsYXNzTmFtZTogJ3VzZXInIH0sXG4gICAqICAgICB7IGlkOiAnb3JkZXInLCBuYW1lOiAn6K6i5Y2VJywgY2xhc3NOYW1lOiAndXNlcicgfVxuICAgKiAgIF0pO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKiBAcGFyYW0gZmllbGRMaXN0IOWtl+auteWIl+ihqOS/oeWPt+mHj1xuICAgKi9cbiAgYWJzdHJhY3QgZ2V0RmllbGRzKGZpZWxkTGlzdDogV3JpdGFibGVTaWduYWw8RmllbGRbXT4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiDmoKHpqozlhazlvI/moLzlvI9cbiAgICog5a6e546w57G76ZyA6KaB5qC55o2u5YWs5byP5a2X56ym5Liy5p2l5qCh6aqM5qC85byP5piv5ZCm5q2j56GuXG4gICAqIOS+i+Wmgu+8mlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHZhbGlkYXRlRm9ybXVsYShmb3JtdWxhOiBOelNhZmVBbnksIHJlczogV3JpdGFibGVTaWduYWw8VmFsaWRhdGlvblJlc3VsdCB8IG51bGw+KSB7XG4gICAqICAgcmVzLnNldCh7IHZhbGlkOiB0cnVlLCBtZXNzYWdlOiAnJyB9KTtcbiAgICogfVxuICAgKiBgYGBcbiAgICogQHBhcmFtIGZvcm11bGEg5YWs5byP5a2X56ym5LiyXG4gICAqIEBwYXJhbSByZXMg5a2X5q615YiX6KGo5L+h5Y+36YePXG4gICAqL1xuICBhYnN0cmFjdCB2YWxpZGF0ZUZvcm11bGEoZm9ybXVsYTogTnpTYWZlQW55LCByZXM6IFdyaXRhYmxlU2lnbmFsPFZhbGlkYXRpb25SZXN1bHQgfCBudWxsPik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIOiOt+WPluWtl+auteeahOaPj+i/sFxuICAgKiDlrp7njrDnsbvpnIDopoHmoLnmja7lrZfmrrVpZOadpeiOt+WPluWtl+auteeahOaPj+i/sFxuICAgKiDkvovlpoLvvJpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBnZXRGaWVsZERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uOiBXcml0YWJsZVNpZ25hbDxzdHJpbmc+KSB7XG4gICAqICAgZGVzY3JpcHRpb24uc2V0KCcnKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIOaPj+i/sOWtl+espuS4suS/oeWPt+mHj1xuICAgKi9cbiAgZ2V0RmllbGREZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogV3JpdGFibGVTaWduYWw8c3RyaW5nPik6IHZvaWQge1xuICAgIGRlc2NyaXB0aW9uLnNldCgnJyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -12,7 +12,7 @@ import { NzMessageService } from 'ng-zorro-antd/message';
|
|
|
12
12
|
import { NzToolTipModule } from 'ng-zorro-antd/tooltip';
|
|
13
13
|
import { NzTreeModule } from 'ng-zorro-antd/tree';
|
|
14
14
|
import { FormulaEditorRequestServiceToken } from './formula-editor-request.service';
|
|
15
|
-
import { CheckFormatMethod, FuncListType, ItemType, OPERATOR_LIST } from './formula-editor.model';
|
|
15
|
+
import { CheckFormatMethod, DEFAULT_TEXT, FuncListType, ItemType, OPERATOR_LIST } from './formula-editor.model';
|
|
16
16
|
import { FormulaEditorService } from './formula-editor.service';
|
|
17
17
|
import { ICONS } from './formula-editor-icon';
|
|
18
18
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
@@ -30,6 +30,166 @@ import * as i9 from "ng-zorro-antd/tooltip";
|
|
|
30
30
|
* 公式编辑器组件
|
|
31
31
|
* 用于创建和编辑计算公式,支持函数、指标和字段的插入与验证
|
|
32
32
|
* 依赖className与在使用组件处使用穿透样式实现样式
|
|
33
|
+
*
|
|
34
|
+
* 例如:
|
|
35
|
+
* ```typescript
|
|
36
|
+
* // 1. 首先实现 FormulaEditorRequestService
|
|
37
|
+
* @Injectable({ providedIn: 'root' })
|
|
38
|
+
* export class MyFormulaRequestService extends FormulaEditorRequestService {
|
|
39
|
+
* getFunctions(functionList: WritableSignal<NzTreeNodeOptions[]>) {
|
|
40
|
+
* functionList.set([
|
|
41
|
+
* {
|
|
42
|
+
* title: '聚合函数',
|
|
43
|
+
* key: 'agg',
|
|
44
|
+
* children: [
|
|
45
|
+
* { title: 'SUM', key: 'sum', className: 'agg', id: 'sum', description: '求和函数' },
|
|
46
|
+
* { title: 'AVG', key: 'avg', className: 'agg', id: 'avg', description: '平均值函数' },
|
|
47
|
+
* { title: 'COUNT', key: 'count', className: 'agg', id: 'count', description: '计数函数' }
|
|
48
|
+
* ]
|
|
49
|
+
* },
|
|
50
|
+
* {
|
|
51
|
+
* title: '数学函数',
|
|
52
|
+
* key: 'math',
|
|
53
|
+
* children: [
|
|
54
|
+
* { title: 'ABS', key: 'abs', className: 'math', id: 'abs', description: '绝对值函数' },
|
|
55
|
+
* { title: 'ROUND', key: 'round', className: 'math', id: 'round', description: '四舍五入函数' }
|
|
56
|
+
* ]
|
|
57
|
+
* }
|
|
58
|
+
* ]);
|
|
59
|
+
* }
|
|
60
|
+
*
|
|
61
|
+
* getFields(fieldList: WritableSignal<Field[]>) {
|
|
62
|
+
* fieldList.set([
|
|
63
|
+
* { id: 'user_count', name: '用户数量', className: 'field' },
|
|
64
|
+
* { id: 'order_amount', name: '订单金额', className: 'field' },
|
|
65
|
+
* { id: 'product_price', name: '商品价格', className: 'field' }
|
|
66
|
+
* ]);
|
|
67
|
+
* }
|
|
68
|
+
*
|
|
69
|
+
* validateFormula(formula: NzSafeAny, res: WritableSignal<ValidationResult | null>) {
|
|
70
|
+
* // 调用后端API校验公式
|
|
71
|
+
* this.http.post('/api/formula/validate', { formula }).subscribe({
|
|
72
|
+
* next: (response) => {
|
|
73
|
+
* res.set({
|
|
74
|
+
* isValid: response.valid,
|
|
75
|
+
* errors: response.errors || []
|
|
76
|
+
* });
|
|
77
|
+
* },
|
|
78
|
+
* error: () => {
|
|
79
|
+
* res.set({
|
|
80
|
+
* isValid: false,
|
|
81
|
+
* errors: ['校验失败,请稍后重试']
|
|
82
|
+
* });
|
|
83
|
+
* }
|
|
84
|
+
* });
|
|
85
|
+
* }
|
|
86
|
+
*
|
|
87
|
+
* getFieldDescription(description: WritableSignal<string>) {
|
|
88
|
+
* description.set('选择字段后显示字段描述信息');
|
|
89
|
+
* }
|
|
90
|
+
* }
|
|
91
|
+
*
|
|
92
|
+
* // 2. 在模块中提供服务
|
|
93
|
+
* providers: [
|
|
94
|
+
* { provide: FormulaEditorRequestServiceToken, useClass: MyFormulaRequestService }
|
|
95
|
+
* ]
|
|
96
|
+
*
|
|
97
|
+
* // 3. 在父组件中使用
|
|
98
|
+
* @Component({
|
|
99
|
+
* template: `
|
|
100
|
+
* <app-formula-editor
|
|
101
|
+
* [itemType]="itemType"
|
|
102
|
+
* [defaultText]="defaultText"
|
|
103
|
+
* [checkFormatMethod]="checkFormatMethod"
|
|
104
|
+
* [functionListType]="functionListType"
|
|
105
|
+
* [itemTemplate]="itemTemplate">
|
|
106
|
+
* </app-formula-editor>
|
|
107
|
+
*
|
|
108
|
+
* <button (click)="getFormula()">获取公式JSON</button>
|
|
109
|
+
* <button (click)="getFormulaText()">获取公式文本</button>
|
|
110
|
+
* <button (click)="loadExampleFormula()">加载示例公式</button>
|
|
111
|
+
* `
|
|
112
|
+
* })
|
|
113
|
+
* export class ParentComponent {
|
|
114
|
+
* @ViewChild(FormulaEditorComponent) formulaEditor!: FormulaEditorComponent;
|
|
115
|
+
*
|
|
116
|
+
* itemType = ItemType.Field;
|
|
117
|
+
* checkFormatMethod = CheckFormatMethod.self;
|
|
118
|
+
* functionListType = FuncListType.Tree;
|
|
119
|
+
*
|
|
120
|
+
* defaultText = {
|
|
121
|
+
* fieldTitle: '字段',
|
|
122
|
+
* indicatorTitle: '指标',
|
|
123
|
+
* checkFormatTitle: '格式校验'
|
|
124
|
+
* };
|
|
125
|
+
*
|
|
126
|
+
* // 获取公式JSON
|
|
127
|
+
* getFormula() {
|
|
128
|
+
* const formula = this.formulaEditor.getFormula();
|
|
129
|
+
* console.log('公式JSON:', formula);
|
|
130
|
+
* }
|
|
131
|
+
*
|
|
132
|
+
* // 获取公式文本
|
|
133
|
+
* getFormulaText() {
|
|
134
|
+
* const text = this.formulaEditor.getFormulaText();
|
|
135
|
+
* console.log('公式文本:', text);
|
|
136
|
+
* }
|
|
137
|
+
*
|
|
138
|
+
* // 加载示例公式
|
|
139
|
+
* loadExampleFormula() {
|
|
140
|
+
* const exampleFormula = {
|
|
141
|
+
* type: 'doc',
|
|
142
|
+
* content: [
|
|
143
|
+
* {
|
|
144
|
+
* type: 'paragraph',
|
|
145
|
+
* content: [
|
|
146
|
+
* {
|
|
147
|
+
* type: 'func',
|
|
148
|
+
* attrs: {
|
|
149
|
+
* name: 'SUM',
|
|
150
|
+
* id: 'sum',
|
|
151
|
+
* className: 'text-func-agg'
|
|
152
|
+
* }
|
|
153
|
+
* },
|
|
154
|
+
* {
|
|
155
|
+
* type: 'text',
|
|
156
|
+
* text: '('
|
|
157
|
+
* },
|
|
158
|
+
* {
|
|
159
|
+
* type: 'field',
|
|
160
|
+
* attrs: {
|
|
161
|
+
* name: 'order_amount',
|
|
162
|
+
* id: 'order_amount',
|
|
163
|
+
* className: 'text-field-field'
|
|
164
|
+
* }
|
|
165
|
+
* },
|
|
166
|
+
* {
|
|
167
|
+
* type: 'text',
|
|
168
|
+
* text: ')'
|
|
169
|
+
* }
|
|
170
|
+
* ]
|
|
171
|
+
* }
|
|
172
|
+
* ]
|
|
173
|
+
* };
|
|
174
|
+
* this.formulaEditor.loadFormula(exampleFormula);
|
|
175
|
+
* }
|
|
176
|
+
* }
|
|
177
|
+
*
|
|
178
|
+
* // 4. 样式穿透(在父组件样式文件中)
|
|
179
|
+
* // :host ::ng-deep .text-func-agg {
|
|
180
|
+
* // color: #1890ff;
|
|
181
|
+
* // background-color: #e6f7ff;
|
|
182
|
+
* // padding: 2px 6px;
|
|
183
|
+
* // border-radius: 4px;
|
|
184
|
+
* // }
|
|
185
|
+
*
|
|
186
|
+
* // :host ::ng-deep .text-field-field {
|
|
187
|
+
* // color: #52c41a;
|
|
188
|
+
* // background-color: #f6ffed;
|
|
189
|
+
* // padding: 2px 6px;
|
|
190
|
+
* // border-radius: 4px;
|
|
191
|
+
* // }
|
|
192
|
+
* ```
|
|
33
193
|
*/
|
|
34
194
|
export class FormulaEditorComponent {
|
|
35
195
|
getOperatorIcon(type) {
|
|
@@ -61,7 +221,7 @@ export class FormulaEditorComponent {
|
|
|
61
221
|
* 字段标题,当项目类型为字段时显示
|
|
62
222
|
* 默认值:'字段'
|
|
63
223
|
*/
|
|
64
|
-
this.
|
|
224
|
+
this.defaultText = input({});
|
|
65
225
|
/**
|
|
66
226
|
* 格式检查方法
|
|
67
227
|
* 默认值:CheckFormatMethod.self
|
|
@@ -75,13 +235,15 @@ export class FormulaEditorComponent {
|
|
|
75
235
|
this.itemTemplate = input(null);
|
|
76
236
|
this._itemType = ItemType;
|
|
77
237
|
this._funcListType = FuncListType;
|
|
238
|
+
this._defaultText = DEFAULT_TEXT;
|
|
78
239
|
this.searchWord = '';
|
|
79
|
-
this.fieldListOrigin = [];
|
|
240
|
+
this.fieldListOrigin = signal([]);
|
|
80
241
|
this.fieldList = [];
|
|
81
242
|
this.checkLoading = false;
|
|
82
243
|
this.showDescription = true;
|
|
83
|
-
this.funcNode = [];
|
|
84
|
-
this.fieldDescription = '';
|
|
244
|
+
this.funcNode = signal([]);
|
|
245
|
+
this.fieldDescription = signal('');
|
|
246
|
+
this.validationResult = signal(null);
|
|
85
247
|
this.editDescription = '请选择函数';
|
|
86
248
|
this.editDescShow = 'none';
|
|
87
249
|
this.searchField = signal('');
|
|
@@ -89,25 +251,36 @@ export class FormulaEditorComponent {
|
|
|
89
251
|
this._operatorList = OPERATOR_LIST;
|
|
90
252
|
effect(() => {
|
|
91
253
|
const searchWord = this.searchField();
|
|
92
|
-
this.fieldList = this.fieldListOrigin.filter(item => item.name.includes(searchWord));
|
|
254
|
+
this.fieldList = this.fieldListOrigin().filter(item => item.name.includes(searchWord));
|
|
93
255
|
});
|
|
94
256
|
effect(() => {
|
|
95
257
|
const itemType = this.itemType();
|
|
96
258
|
if (itemType === ItemType.Field) {
|
|
97
|
-
this.formulaEditorRequestService.getFields()
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
259
|
+
this.formulaEditorRequestService.getFields(this.fieldListOrigin);
|
|
260
|
+
}
|
|
261
|
+
}, { allowSignalWrites: true });
|
|
262
|
+
effect(() => {
|
|
263
|
+
const fieldListOrigin = this.fieldListOrigin();
|
|
264
|
+
this.fieldList = [...fieldListOrigin];
|
|
265
|
+
});
|
|
266
|
+
effect(() => {
|
|
267
|
+
const validationResult = this.validationResult();
|
|
268
|
+
if (validationResult) {
|
|
269
|
+
this.checkLoading = false;
|
|
270
|
+
if (validationResult.isValid) {
|
|
271
|
+
this.msg.success(`${this.defaultText().checkFormatTitle || this._defaultText.checkFormatTitle}通过`);
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
this.msg.error(`${this.defaultText().checkFormatTitle || this._defaultText.checkFormatTitle}不通过: ${validationResult.errors.join(', ')}`);
|
|
275
|
+
this.editDescription = validationResult.errors.join(', ');
|
|
276
|
+
this.editDescShow = 'error';
|
|
277
|
+
}
|
|
101
278
|
}
|
|
102
279
|
});
|
|
103
280
|
}
|
|
104
281
|
ngOnInit() {
|
|
105
|
-
this.formulaEditorRequestService.getFunctions()
|
|
106
|
-
|
|
107
|
-
});
|
|
108
|
-
this.formulaEditorRequestService.getFieldDescription().then(res => {
|
|
109
|
-
this.fieldDescription = res;
|
|
110
|
-
});
|
|
282
|
+
this.formulaEditorRequestService.getFunctions(this.funcNode);
|
|
283
|
+
this.formulaEditorRequestService.getFieldDescription(this.fieldDescription);
|
|
111
284
|
}
|
|
112
285
|
ngAfterViewInit() {
|
|
113
286
|
this.formulaEditorService.initNodes();
|
|
@@ -212,27 +385,17 @@ export class FormulaEditorComponent {
|
|
|
212
385
|
if (this.checkFormatMethod() === CheckFormatMethod.self) {
|
|
213
386
|
const result = this.validateFormula();
|
|
214
387
|
if (result.isValid) {
|
|
215
|
-
this.msg.success(
|
|
388
|
+
this.msg.success(`${this.defaultText().checkFormatTitle || this._defaultText.checkFormatTitle}通过`);
|
|
216
389
|
}
|
|
217
390
|
else {
|
|
218
|
-
this.msg.error(
|
|
391
|
+
this.msg.error(`${this.defaultText().checkFormatTitle || this._defaultText.checkFormatTitle}不通过: ${result.errors.join(', ')}`);
|
|
219
392
|
this.editDescription = result.errors.join(', ');
|
|
220
393
|
this.editDescShow = 'error';
|
|
221
394
|
}
|
|
222
395
|
}
|
|
223
396
|
else {
|
|
224
397
|
this.checkLoading = true;
|
|
225
|
-
this.formulaEditorRequestService.validateFormula(this.getFormula())
|
|
226
|
-
this.checkLoading = false;
|
|
227
|
-
if (res.isValid) {
|
|
228
|
-
this.msg.success('格式校验通过');
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
this.msg.error(`格式校验不通过: ${res.errors.join(', ')}`);
|
|
232
|
-
this.editDescription = res.errors.join(', ');
|
|
233
|
-
this.editDescShow = 'error';
|
|
234
|
-
}
|
|
235
|
-
});
|
|
398
|
+
this.formulaEditorRequestService.validateFormula(this.getFormula(), this.validationResult);
|
|
236
399
|
}
|
|
237
400
|
}
|
|
238
401
|
/**
|
|
@@ -276,7 +439,7 @@ export class FormulaEditorComponent {
|
|
|
276
439
|
this.showDescription = !this.showDescription;
|
|
277
440
|
}
|
|
278
441
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormulaEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
279
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FormulaEditorComponent, isStandalone: true, selector: "app-formula-editor", inputs: { itemType: { classPropertyName: "itemType", publicName: "itemType", isSignal: true, isRequired: false, transformFunction: null }, fieldTitle: { classPropertyName: "fieldTitle", publicName: "fieldTitle", isSignal: true, isRequired: false, transformFunction: null }, checkFormatMethod: { classPropertyName: "checkFormatMethod", publicName: "checkFormatMethod", isSignal: true, isRequired: false, transformFunction: null }, functionListType: { classPropertyName: "functionListType", publicName: "functionListType", isSignal: true, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true }], ngImport: i0, template: "<div nz-row class=\"formula-editor\">\n <div nz-col nzSpan=\"10\" class=\"editor-box\">\n <div class=\"editor-title\">\n <div class=\"label-title label-require\">\u5B57\u6BB5\u8868\u8FBE\u5F0F</div>\n <button nz-button nzType=\"link\" nzSize=\"small\" [nzLoading]=\"checkLoading\" (click)=\"checkFormat()\">\u683C\u5F0F\u6821\u9A8C</button>\n </div>\n <div class=\"edit-box\">\n <div class=\"edit-operation-box\">\n @for (item of _operatorList; track item) {\n <div class=\"edit-operation-item\" (click)=\"insertOperator(item.name)\">\n <span class=\"operator-icon\" [innerHTML]=\"getOperatorIcon(item.type)\"></span>\n </div>\n }\n </div>\n <div #editor class=\"editor\"></div>\n @if (editDescShow !== 'none') {\n <div class=\"edit-description-box\">\n <div class=\"edit-description-head\" [style]=\"{ marginBottom: !showDescription ? '10px' : '0' }\">\n <span class=\"edit-description-title\">{{ editDescShow === 'func' ? '\u51FD\u6570\u91CA\u4E49' : '\u6821\u9A8C\u9519\u8BEF\u4FE1\u606F' }}</span>\n <span\n class=\"edit-description-icon\"\n nz-icon\n [nzType]=\"showDescription ? 'down' : 'up'\"\n nzTheme=\"outline\"\n (click)=\"toggleDescription()\"\n ></span>\n </div>\n @if (showDescription) {\n <div class=\"edit-description-text\"> {{ editDescription }} </div>\n }\n </div>\n }\n </div>\n </div>\n @switch (itemType()) {\n @case (_itemType.Field) {\n <div nz-col nzSpan=\"7\" class=\"field-box\">\n <div class=\"label-title\"\n >{{ fieldTitle() }}\n @if (fieldDescription) {\n <span nz-icon nzType=\"question-circle\" nzTheme=\"outline\" nz-tooltip [nzTooltipTitle]=\"fieldDescription\"></span>\n }\n </div>\n <nz-input-group [nzSuffix]=\"suffixIconSearch\">\n <input type=\"text\" nz-input placeholder=\"\u641C\u7D22\" [(ngModel)]=\"searchField\" />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\"></i>\n </ng-template>\n <div class=\"field-list\">\n @for (item of fieldList; track item) {\n <div (click)=\"insertField(item)\" [class]=\"item.className ? 'item-field-' + item.className : ''\" class=\"field-list-item\">\n @if (item.image) {\n <img class=\"field-img\" [src]=\"item.image\" />\n }\n @if (item.icon) {\n <span class=\"field-icon\" nz-icon [nzIconfont]=\"item.icon\"></span>\n }\n <span class=\"field-name\" [innerHTML]=\"item.name | nzHighlight: searchField() : 'i' : 'node-highlight'\"></span>\n @if (item.description) {\n <span\n class=\"desc-icon\"\n nz-icon\n nzType=\"question-circle\"\n nzTheme=\"outline\"\n nz-tooltip\n [nzTooltipTitle]=\"item.description\"\n ></span>\n }\n </div>\n }\n </div>\n </div>\n }\n @case (_itemType.Template) {\n <div nz-col nzSpan=\"7\" class=\"field-box\">\n <ng-container *ngTemplateOutlet=\"itemTemplate()\"></ng-container>\n </div>\n }\n }\n <div nz-col nzSpan=\"7\" class=\"function-box\">\n <div class=\"label-title\">\u51FD\u6570</div>\n <nz-input-group [nzSuffix]=\"suffixIconSearch\">\n <input type=\"text\" nz-input placeholder=\"\u641C\u7D22\" [(ngModel)]=\"searchFunction\" />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\"></i>\n </ng-template>\n <nz-tree\n class=\"function-tree\"\n [nzHideUnMatched]=\"true\"\n [nzSearchValue]=\"searchFunction()\"\n [nzTreeTemplate]=\"nzTreeTemplate\"\n [nzData]=\"funcNode\"\n [nzShowExpand]=\"functionListType() === _funcListType.Tree\"\n (nzClick)=\"functionClick($event)\"\n ></nz-tree>\n <ng-template #nzTreeTemplate let-node let-origin=\"origin\">\n <span class=\"custom-node\" [innerHTML]=\"origin.name | nzHighlight: searchFunction() : 'i' : 'node-highlight'\">\n @if (origin.description) {\n <span\n class=\"desc-icon\"\n nz-icon\n nzType=\"question-circle\"\n nzTheme=\"outline\"\n nz-tooltip\n [nzTooltipTitle]=\"origin.description\"\n ></span>\n }\n </span>\n </ng-template>\n </div>\n</div>\n", styles: [":host ::ng-deep .ant-tree-node-content-wrapper{width:100%}:host ::ng-deep .ant-input-affix-wrapper{padding:0 11px;height:32px}:host ::ng-deep .ProseMirror-focused{outline:none}:host ::ng-deep .node-highlight{color:#ff4d4f!important}:host .total-box{width:1000px;padding:8px;background-color:#fff}:host .ant-input-affix-wrapper{width:100%}:host .desc-icon{margin-left:auto}:host .formula-editor .editor-box{padding:12px;border-right:1px solid #e8e8e8}:host .formula-editor .editor-box .editor-title{display:flex;justify-content:space-between}:host .formula-editor .editor-box .edit-box{display:flex;flex-direction:column;height:400px;border:1px solid #ccc;border-radius:2px}:host .formula-editor .editor-box .edit-box .edit-operation-box{display:flex;gap:10px;align-items:center;height:32px;padding:0 10px;border-bottom:1px solid #ccc}:host .formula-editor .editor-box .edit-box .edit-operation-box .edit-operation-item{width:16px;height:16px;color:#687488;font-size:16px;line-height:16px;cursor:pointer;-webkit-user-select:none;user-select:none}:host .formula-editor .editor-box .edit-box .edit-operation-box .edit-operation-item .operator-icon{pointer-events:none}:host .formula-editor .editor-box .edit-box .edit-operation-box .edit-operation-item:hover .operator-icon{fill:#2e87ff}:host .formula-editor .editor-box .edit-box .edit-description-box{display:flex;flex-direction:column;padding:10px 10px 0;border-top:1px solid #ccc}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-head{display:flex;justify-content:space-between}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-text{max-height:128px;overflow:hidden auto;color:#333;font-size:13px;white-space:pre-wrap}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-title{color:#333;font-weight:700;font-size:14px}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-icon{font-size:14px;cursor:pointer}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-icon:hover{color:#2e87ff}:host .formula-editor .editor-box .edit-box .editor{flex:1;min-height:0;padding:12px 10px;overflow:auto;font-size:13px}:host .formula-editor .metric-box{padding:12px}:host .formula-editor .metric-box .metric-list{display:flex;flex-direction:column;gap:4px;height:360px;margin-top:12px;overflow-y:auto}:host .formula-editor .metric-box .metric-list-item{display:flex;align-items:center;height:32px;min-height:32px;padding:0 12px;border:1px solid #ccc;border-radius:2px;cursor:pointer}:host .formula-editor .metric-box .metric-list-item:hover{background:#2e87ff1a;border:1px solid #2e87ff;border-radius:2px}:host .formula-editor .metric-box .metric-list-item .metric-img{width:24px;height:24px;margin-right:8px}:host .formula-editor .metric-box .metric-list-item .metric-icon{margin-right:4px;font-size:16px}:host .formula-editor .metric-box .metric-list-item .metric-name{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host .formula-editor .field-box{padding:12px}:host .formula-editor .field-box .field-list{display:flex;flex-direction:column;gap:4px;height:360px;margin-top:12px;overflow-y:auto}:host .formula-editor .field-box .field-list-item{display:flex;flex-direction:row;align-items:center;height:32px;min-height:32px;padding:0 10px;border:1px solid #ccc;border-radius:2px;cursor:pointer}:host .formula-editor .field-box .field-list-item:hover{background:#2e87ff1a;border:1px solid #2e87ff;border-radius:2px}:host .formula-editor .field-box .field-list-item .field-img{width:24px;height:24px;margin-right:4px}:host .formula-editor .field-box .field-list-item .field-icon{margin-right:4px;font-size:16px}:host .formula-editor .field-box .field-list-item .field-name{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host .formula-editor .function-box{padding:12px;border-left:1px solid #e8e8e8}:host .formula-editor .function-box .function-tree{height:360px;margin-top:8px;overflow-y:auto}:host .formula-editor .function-box .function-tree .custom-node{display:flex;align-items:center}:host .formula-editor .label-title{margin-bottom:12px;color:#333;font-weight:400;font-size:14px}:host .formula-editor .label-require:after{margin-left:4px;color:#f5222d;content:\"*\"}\n"], dependencies: [{ kind: "directive", type: NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzInputModule }, { kind: "directive", type: i2.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i2.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i2.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i4.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: NzTreeModule }, { kind: "component", type: i6.NzTreeComponent, selector: "nz-tree", inputs: ["nzShowIcon", "nzHideUnMatched", "nzBlockNode", "nzExpandAll", "nzSelectMode", "nzCheckStrictly", "nzShowExpand", "nzShowLine", "nzCheckable", "nzAsyncData", "nzDraggable", "nzMultiple", "nzExpandedIcon", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualHeight", "nzTreeTemplate", "nzBeforeDrop", "nzData", "nzExpandedKeys", "nzSelectedKeys", "nzCheckedKeys", "nzSearchValue", "nzSearchFunc"], outputs: ["nzExpandedKeysChange", "nzSelectedKeysChange", "nzCheckedKeysChange", "nzSearchValueChange", "nzClick", "nzDblClick", "nzContextMenu", "nzCheckBoxChange", "nzExpandChange", "nzOnDragStart", "nzOnDragEnter", "nzOnDragOver", "nzOnDragLeave", "nzOnDrop", "nzOnDragEnd"], exportAs: ["nzTree"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i7.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i8.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i9.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "pipe", type: NzHighlightPipe, name: "nzHighlight" }] }); }
|
|
442
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FormulaEditorComponent, isStandalone: true, selector: "app-formula-editor", inputs: { itemType: { classPropertyName: "itemType", publicName: "itemType", isSignal: true, isRequired: false, transformFunction: null }, defaultText: { classPropertyName: "defaultText", publicName: "defaultText", isSignal: true, isRequired: false, transformFunction: null }, checkFormatMethod: { classPropertyName: "checkFormatMethod", publicName: "checkFormatMethod", isSignal: true, isRequired: false, transformFunction: null }, functionListType: { classPropertyName: "functionListType", publicName: "functionListType", isSignal: true, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null } }, providers: [FormulaEditorService], viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true }], ngImport: i0, template: "<div nz-row class=\"formula-editor\">\n <div nz-col nzSpan=\"10\" class=\"editor-box\">\n <div class=\"editor-title\">\n <div class=\"label-title label-require\">{{ defaultText().inputTitle || _defaultText.inputTitle }}</div>\n <button nz-button nzType=\"link\" nzSize=\"small\" [nzLoading]=\"checkLoading\" (click)=\"checkFormat()\">{{\n defaultText().checkFormatTitle || _defaultText.checkFormatTitle\n }}</button>\n </div>\n <div class=\"edit-box\">\n <div class=\"edit-operation-box\">\n @for (item of _operatorList; track item) {\n <div class=\"edit-operation-item\" (click)=\"insertOperator(item.name)\">\n <span class=\"operator-icon\" [innerHTML]=\"getOperatorIcon(item.type)\"></span>\n </div>\n }\n </div>\n <div #editor class=\"editor\"></div>\n @if (editDescShow !== 'none') {\n <div class=\"edit-description-box\">\n <div class=\"edit-description-head\" [style]=\"{ marginBottom: !showDescription ? '10px' : '0' }\">\n <span class=\"edit-description-title\">{{ editDescShow === 'func' ? '\u51FD\u6570\u91CA\u4E49' : '\u6821\u9A8C\u9519\u8BEF\u4FE1\u606F' }}</span>\n <span\n class=\"edit-description-icon\"\n nz-icon\n [nzType]=\"showDescription ? 'down' : 'up'\"\n nzTheme=\"outline\"\n (click)=\"toggleDescription()\"\n ></span>\n </div>\n @if (showDescription) {\n <div class=\"edit-description-text\"> {{ editDescription }} </div>\n }\n </div>\n }\n </div>\n </div>\n @switch (itemType()) {\n @case (_itemType.Field) {\n <div nz-col nzSpan=\"7\" class=\"field-box\">\n <div class=\"label-title\"\n >{{ defaultText().fieldTitle || _defaultText.fieldTitle }}\n @if (fieldDescription()) {\n <span nz-icon nzType=\"question-circle\" nzTheme=\"outline\" nz-tooltip [nzTooltipTitle]=\"fieldDescription()\"></span>\n }\n </div>\n <nz-input-group [nzSuffix]=\"suffixIconSearch\">\n <input\n type=\"text\"\n nz-input\n [placeholder]=\"defaultText().searchFieldPlaceholder || _defaultText.searchFieldPlaceholder\"\n [(ngModel)]=\"searchField\"\n />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\"></i>\n </ng-template>\n <div class=\"field-list\">\n @for (item of fieldList; track item) {\n <div (click)=\"insertField(item)\" [class]=\"item.className ? 'item-field-' + item.className : ''\" class=\"field-list-item\">\n @if (item.image) {\n <img class=\"field-img\" [src]=\"item.image\" />\n }\n @if (item.icon) {\n <span class=\"field-icon\" nz-icon [nzIconfont]=\"item.icon\"></span>\n }\n <span class=\"field-name\" [innerHTML]=\"item.name | nzHighlight: searchField() : 'i' : 'node-highlight'\"></span>\n @if (item.description) {\n <span\n class=\"desc-icon\"\n nz-icon\n nzType=\"question-circle\"\n nzTheme=\"outline\"\n nz-tooltip\n [nzTooltipTitle]=\"item.description\"\n ></span>\n }\n </div>\n }\n </div>\n </div>\n }\n @case (_itemType.Template) {\n <div nz-col nzSpan=\"7\" class=\"field-box\">\n <ng-container *ngTemplateOutlet=\"itemTemplate()\"></ng-container>\n </div>\n }\n }\n <div nz-col nzSpan=\"7\" class=\"function-box\">\n <div class=\"label-title\">{{ defaultText().functionTitle || _defaultText.functionTitle }}</div>\n <nz-input-group [nzSuffix]=\"suffixIconSearch\">\n <input\n type=\"text\"\n nz-input\n [placeholder]=\"defaultText().searchFunctionPlaceholder || _defaultText.searchFunctionPlaceholder\"\n [(ngModel)]=\"searchFunction\"\n />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\"></i>\n </ng-template>\n <nz-tree\n class=\"function-tree\"\n [nzHideUnMatched]=\"true\"\n [nzSearchValue]=\"searchFunction()\"\n [nzTreeTemplate]=\"nzTreeTemplate\"\n [nzData]=\"funcNode()\"\n [nzShowExpand]=\"functionListType() === _funcListType.Tree\"\n (nzClick)=\"functionClick($event)\"\n ></nz-tree>\n <ng-template #nzTreeTemplate let-node let-origin=\"origin\">\n <span class=\"custom-node\" [innerHTML]=\"origin.name | nzHighlight: searchFunction() : 'i' : 'node-highlight'\">\n @if (origin.description) {\n <span\n class=\"desc-icon\"\n nz-icon\n nzType=\"question-circle\"\n nzTheme=\"outline\"\n nz-tooltip\n [nzTooltipTitle]=\"origin.description\"\n ></span>\n }\n </span>\n </ng-template>\n </div>\n</div>\n", styles: [":host ::ng-deep .ant-tree-node-content-wrapper{width:100%}:host ::ng-deep .ant-input-affix-wrapper{padding:0 11px;height:32px}:host ::ng-deep .ProseMirror-focused{outline:none}:host ::ng-deep .node-highlight{color:#ff4d4f!important}:host .total-box{width:1000px;padding:8px;background-color:#fff}:host .ant-input-affix-wrapper{width:100%}:host .desc-icon{margin-left:auto}:host .formula-editor .editor-box{padding:12px;border-right:1px solid #e8e8e8}:host .formula-editor .editor-box .editor-title{display:flex;justify-content:space-between}:host .formula-editor .editor-box .edit-box{display:flex;flex-direction:column;height:400px;border:1px solid #ccc;border-radius:2px}:host .formula-editor .editor-box .edit-box .edit-operation-box{display:flex;gap:10px;align-items:center;height:32px;padding:0 10px;border-bottom:1px solid #ccc}:host .formula-editor .editor-box .edit-box .edit-operation-box .edit-operation-item{width:16px;height:16px;color:#687488;font-size:16px;line-height:16px;cursor:pointer;-webkit-user-select:none;user-select:none}:host .formula-editor .editor-box .edit-box .edit-operation-box .edit-operation-item .operator-icon{pointer-events:none}:host .formula-editor .editor-box .edit-box .edit-operation-box .edit-operation-item:hover .operator-icon{fill:#2e87ff}:host .formula-editor .editor-box .edit-box .edit-description-box{display:flex;flex-direction:column;padding:10px 10px 0;border-top:1px solid #ccc}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-head{display:flex;justify-content:space-between}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-text{max-height:128px;overflow:hidden auto;color:#333;font-size:13px;white-space:pre-wrap}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-title{color:#333;font-weight:700;font-size:14px}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-icon{font-size:14px;cursor:pointer}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-icon:hover{color:#2e87ff}:host .formula-editor .editor-box .edit-box .editor{flex:1;min-height:0;padding:12px 10px;overflow:auto;font-size:13px}:host .formula-editor .metric-box{padding:12px}:host .formula-editor .metric-box .metric-list{display:flex;flex-direction:column;gap:4px;height:360px;margin-top:12px;overflow-y:auto}:host .formula-editor .metric-box .metric-list-item{display:flex;align-items:center;height:32px;min-height:32px;padding:0 12px;border:1px solid #ccc;border-radius:2px;cursor:pointer}:host .formula-editor .metric-box .metric-list-item:hover{background:#2e87ff1a;border:1px solid #2e87ff;border-radius:2px}:host .formula-editor .metric-box .metric-list-item .metric-img{width:24px;height:24px;margin-right:8px}:host .formula-editor .metric-box .metric-list-item .metric-icon{margin-right:4px;font-size:16px}:host .formula-editor .metric-box .metric-list-item .metric-name{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host .formula-editor .field-box{padding:12px}:host .formula-editor .field-box .field-list{display:flex;flex-direction:column;gap:4px;height:360px;margin-top:12px;overflow-y:auto}:host .formula-editor .field-box .field-list-item{display:flex;flex-direction:row;align-items:center;height:32px;min-height:32px;padding:0 10px;border:1px solid #ccc;border-radius:2px;cursor:pointer}:host .formula-editor .field-box .field-list-item:hover{background:#2e87ff1a;border:1px solid #2e87ff;border-radius:2px}:host .formula-editor .field-box .field-list-item .field-img{width:24px;height:24px;margin-right:4px}:host .formula-editor .field-box .field-list-item .field-icon{margin-right:4px;font-size:16px}:host .formula-editor .field-box .field-list-item .field-name{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host .formula-editor .function-box{padding:12px;border-left:1px solid #e8e8e8}:host .formula-editor .function-box .function-tree{height:360px;margin-top:8px;overflow-y:auto}:host .formula-editor .function-box .function-tree .custom-node{display:flex;align-items:center}:host .formula-editor .label-title{margin-bottom:12px;color:#333;font-weight:400;font-size:14px}:host .formula-editor .label-require:after{margin-left:4px;color:#f5222d;content:\"*\"}\n"], dependencies: [{ kind: "directive", type: NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzInputModule }, { kind: "directive", type: i2.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i2.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i2.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i4.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: NzTreeModule }, { kind: "component", type: i6.NzTreeComponent, selector: "nz-tree", inputs: ["nzShowIcon", "nzHideUnMatched", "nzBlockNode", "nzExpandAll", "nzSelectMode", "nzCheckStrictly", "nzShowExpand", "nzShowLine", "nzCheckable", "nzAsyncData", "nzDraggable", "nzMultiple", "nzExpandedIcon", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualHeight", "nzTreeTemplate", "nzBeforeDrop", "nzData", "nzExpandedKeys", "nzSelectedKeys", "nzCheckedKeys", "nzSearchValue", "nzSearchFunc"], outputs: ["nzExpandedKeysChange", "nzSelectedKeysChange", "nzCheckedKeysChange", "nzSearchValueChange", "nzClick", "nzDblClick", "nzContextMenu", "nzCheckBoxChange", "nzExpandChange", "nzOnDragStart", "nzOnDragEnter", "nzOnDragOver", "nzOnDragLeave", "nzOnDrop", "nzOnDragEnd"], exportAs: ["nzTree"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i7.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i8.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i9.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "pipe", type: NzHighlightPipe, name: "nzHighlight" }] }); }
|
|
280
443
|
}
|
|
281
444
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormulaEditorComponent, decorators: [{
|
|
282
445
|
type: Component,
|
|
@@ -291,9 +454,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
291
454
|
NzButtonModule,
|
|
292
455
|
NzToolTipModule,
|
|
293
456
|
NzHighlightPipe
|
|
294
|
-
], template: "<div nz-row class=\"formula-editor\">\n <div nz-col nzSpan=\"10\" class=\"editor-box\">\n <div class=\"editor-title\">\n <div class=\"label-title label-require\"
|
|
457
|
+
], providers: [FormulaEditorService], template: "<div nz-row class=\"formula-editor\">\n <div nz-col nzSpan=\"10\" class=\"editor-box\">\n <div class=\"editor-title\">\n <div class=\"label-title label-require\">{{ defaultText().inputTitle || _defaultText.inputTitle }}</div>\n <button nz-button nzType=\"link\" nzSize=\"small\" [nzLoading]=\"checkLoading\" (click)=\"checkFormat()\">{{\n defaultText().checkFormatTitle || _defaultText.checkFormatTitle\n }}</button>\n </div>\n <div class=\"edit-box\">\n <div class=\"edit-operation-box\">\n @for (item of _operatorList; track item) {\n <div class=\"edit-operation-item\" (click)=\"insertOperator(item.name)\">\n <span class=\"operator-icon\" [innerHTML]=\"getOperatorIcon(item.type)\"></span>\n </div>\n }\n </div>\n <div #editor class=\"editor\"></div>\n @if (editDescShow !== 'none') {\n <div class=\"edit-description-box\">\n <div class=\"edit-description-head\" [style]=\"{ marginBottom: !showDescription ? '10px' : '0' }\">\n <span class=\"edit-description-title\">{{ editDescShow === 'func' ? '\u51FD\u6570\u91CA\u4E49' : '\u6821\u9A8C\u9519\u8BEF\u4FE1\u606F' }}</span>\n <span\n class=\"edit-description-icon\"\n nz-icon\n [nzType]=\"showDescription ? 'down' : 'up'\"\n nzTheme=\"outline\"\n (click)=\"toggleDescription()\"\n ></span>\n </div>\n @if (showDescription) {\n <div class=\"edit-description-text\"> {{ editDescription }} </div>\n }\n </div>\n }\n </div>\n </div>\n @switch (itemType()) {\n @case (_itemType.Field) {\n <div nz-col nzSpan=\"7\" class=\"field-box\">\n <div class=\"label-title\"\n >{{ defaultText().fieldTitle || _defaultText.fieldTitle }}\n @if (fieldDescription()) {\n <span nz-icon nzType=\"question-circle\" nzTheme=\"outline\" nz-tooltip [nzTooltipTitle]=\"fieldDescription()\"></span>\n }\n </div>\n <nz-input-group [nzSuffix]=\"suffixIconSearch\">\n <input\n type=\"text\"\n nz-input\n [placeholder]=\"defaultText().searchFieldPlaceholder || _defaultText.searchFieldPlaceholder\"\n [(ngModel)]=\"searchField\"\n />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\"></i>\n </ng-template>\n <div class=\"field-list\">\n @for (item of fieldList; track item) {\n <div (click)=\"insertField(item)\" [class]=\"item.className ? 'item-field-' + item.className : ''\" class=\"field-list-item\">\n @if (item.image) {\n <img class=\"field-img\" [src]=\"item.image\" />\n }\n @if (item.icon) {\n <span class=\"field-icon\" nz-icon [nzIconfont]=\"item.icon\"></span>\n }\n <span class=\"field-name\" [innerHTML]=\"item.name | nzHighlight: searchField() : 'i' : 'node-highlight'\"></span>\n @if (item.description) {\n <span\n class=\"desc-icon\"\n nz-icon\n nzType=\"question-circle\"\n nzTheme=\"outline\"\n nz-tooltip\n [nzTooltipTitle]=\"item.description\"\n ></span>\n }\n </div>\n }\n </div>\n </div>\n }\n @case (_itemType.Template) {\n <div nz-col nzSpan=\"7\" class=\"field-box\">\n <ng-container *ngTemplateOutlet=\"itemTemplate()\"></ng-container>\n </div>\n }\n }\n <div nz-col nzSpan=\"7\" class=\"function-box\">\n <div class=\"label-title\">{{ defaultText().functionTitle || _defaultText.functionTitle }}</div>\n <nz-input-group [nzSuffix]=\"suffixIconSearch\">\n <input\n type=\"text\"\n nz-input\n [placeholder]=\"defaultText().searchFunctionPlaceholder || _defaultText.searchFunctionPlaceholder\"\n [(ngModel)]=\"searchFunction\"\n />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\"></i>\n </ng-template>\n <nz-tree\n class=\"function-tree\"\n [nzHideUnMatched]=\"true\"\n [nzSearchValue]=\"searchFunction()\"\n [nzTreeTemplate]=\"nzTreeTemplate\"\n [nzData]=\"funcNode()\"\n [nzShowExpand]=\"functionListType() === _funcListType.Tree\"\n (nzClick)=\"functionClick($event)\"\n ></nz-tree>\n <ng-template #nzTreeTemplate let-node let-origin=\"origin\">\n <span class=\"custom-node\" [innerHTML]=\"origin.name | nzHighlight: searchFunction() : 'i' : 'node-highlight'\">\n @if (origin.description) {\n <span\n class=\"desc-icon\"\n nz-icon\n nzType=\"question-circle\"\n nzTheme=\"outline\"\n nz-tooltip\n [nzTooltipTitle]=\"origin.description\"\n ></span>\n }\n </span>\n </ng-template>\n </div>\n</div>\n", styles: [":host ::ng-deep .ant-tree-node-content-wrapper{width:100%}:host ::ng-deep .ant-input-affix-wrapper{padding:0 11px;height:32px}:host ::ng-deep .ProseMirror-focused{outline:none}:host ::ng-deep .node-highlight{color:#ff4d4f!important}:host .total-box{width:1000px;padding:8px;background-color:#fff}:host .ant-input-affix-wrapper{width:100%}:host .desc-icon{margin-left:auto}:host .formula-editor .editor-box{padding:12px;border-right:1px solid #e8e8e8}:host .formula-editor .editor-box .editor-title{display:flex;justify-content:space-between}:host .formula-editor .editor-box .edit-box{display:flex;flex-direction:column;height:400px;border:1px solid #ccc;border-radius:2px}:host .formula-editor .editor-box .edit-box .edit-operation-box{display:flex;gap:10px;align-items:center;height:32px;padding:0 10px;border-bottom:1px solid #ccc}:host .formula-editor .editor-box .edit-box .edit-operation-box .edit-operation-item{width:16px;height:16px;color:#687488;font-size:16px;line-height:16px;cursor:pointer;-webkit-user-select:none;user-select:none}:host .formula-editor .editor-box .edit-box .edit-operation-box .edit-operation-item .operator-icon{pointer-events:none}:host .formula-editor .editor-box .edit-box .edit-operation-box .edit-operation-item:hover .operator-icon{fill:#2e87ff}:host .formula-editor .editor-box .edit-box .edit-description-box{display:flex;flex-direction:column;padding:10px 10px 0;border-top:1px solid #ccc}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-head{display:flex;justify-content:space-between}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-text{max-height:128px;overflow:hidden auto;color:#333;font-size:13px;white-space:pre-wrap}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-title{color:#333;font-weight:700;font-size:14px}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-icon{font-size:14px;cursor:pointer}:host .formula-editor .editor-box .edit-box .edit-description-box .edit-description-icon:hover{color:#2e87ff}:host .formula-editor .editor-box .edit-box .editor{flex:1;min-height:0;padding:12px 10px;overflow:auto;font-size:13px}:host .formula-editor .metric-box{padding:12px}:host .formula-editor .metric-box .metric-list{display:flex;flex-direction:column;gap:4px;height:360px;margin-top:12px;overflow-y:auto}:host .formula-editor .metric-box .metric-list-item{display:flex;align-items:center;height:32px;min-height:32px;padding:0 12px;border:1px solid #ccc;border-radius:2px;cursor:pointer}:host .formula-editor .metric-box .metric-list-item:hover{background:#2e87ff1a;border:1px solid #2e87ff;border-radius:2px}:host .formula-editor .metric-box .metric-list-item .metric-img{width:24px;height:24px;margin-right:8px}:host .formula-editor .metric-box .metric-list-item .metric-icon{margin-right:4px;font-size:16px}:host .formula-editor .metric-box .metric-list-item .metric-name{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host .formula-editor .field-box{padding:12px}:host .formula-editor .field-box .field-list{display:flex;flex-direction:column;gap:4px;height:360px;margin-top:12px;overflow-y:auto}:host .formula-editor .field-box .field-list-item{display:flex;flex-direction:row;align-items:center;height:32px;min-height:32px;padding:0 10px;border:1px solid #ccc;border-radius:2px;cursor:pointer}:host .formula-editor .field-box .field-list-item:hover{background:#2e87ff1a;border:1px solid #2e87ff;border-radius:2px}:host .formula-editor .field-box .field-list-item .field-img{width:24px;height:24px;margin-right:4px}:host .formula-editor .field-box .field-list-item .field-icon{margin-right:4px;font-size:16px}:host .formula-editor .field-box .field-list-item .field-name{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host .formula-editor .function-box{padding:12px;border-left:1px solid #e8e8e8}:host .formula-editor .function-box .function-tree{height:360px;margin-top:8px;overflow-y:auto}:host .formula-editor .function-box .function-tree .custom-node{display:flex;align-items:center}:host .formula-editor .label-title{margin-bottom:12px;color:#333;font-weight:400;font-size:14px}:host .formula-editor .label-require:after{margin-left:4px;color:#f5222d;content:\"*\"}\n"] }]
|
|
295
458
|
}], ctorParameters: () => [], propDecorators: { editor: [{
|
|
296
459
|
type: ViewChild,
|
|
297
460
|
args: ['editor']
|
|
298
461
|
}] } });
|
|
299
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXVsYS1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29tcG9uZW50cy9mb3JtdWxhLWVkaXRvci9mb3JtdWxhLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb21wb25lbnRzL2Zvcm11bGEtZWRpdG9yL2Zvcm11bGEtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQXNDLE1BQU0sZUFBZSxDQUFDO0FBQzVJLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RDLE9BQU8sVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQXFCLFlBQVksRUFBcUIsTUFBTSxvQkFBb0IsQ0FBQztBQUV4RixPQUFPLEVBQStCLGdDQUFnQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakgs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QUNYLFlBQVksaU5BQ1osWUFBWSxxTUFDWixZQUFZLGswQkFDWixjQUFjLG9mQUNkLGVBQWUsb2ZBQ2YsZUFBZTs7NEZBS04sc0JBQXNCO2tCQWxCbEMsU0FBUzsrQkFDRSxvQkFBb0IsY0FDbEIsSUFBSSxXQUNQO3dCQUNQLGNBQWM7d0JBQ2QsWUFBWTt3QkFDWixhQUFhO3dCQUNiLFdBQVc7d0JBQ1gsWUFBWTt3QkFDWixZQUFZO3dCQUNaLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxlQUFlO3dCQUNmLGVBQWU7cUJBQ2hCO3dEQVNvQixNQUFNO3NCQUExQixTQUFTO3VCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIHNpZ25hbCwgU2lnbmFsLCBWaWV3Q2hpbGQsIEFmdGVyVmlld0luaXQsIE9uSW5pdCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSAnQHRpcHRhcC9jb3JlJztcbmltcG9ydCBTdGFydGVyS2l0IGZyb20gJ0B0aXB0YXAvc3RhcnRlci1raXQnO1xuaW1wb3J0IHsgTnpCdXR0b25Nb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2J1dHRvbic7XG5pbXBvcnQgeyBOekhpZ2hsaWdodFBpcGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvaGlnaGxpZ2h0JztcbmltcG9ydCB7IE56Q29sRGlyZWN0aXZlLCBOekdyaWRNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2dyaWQnO1xuaW1wb3J0IHsgTnpJY29uTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9pY29uJztcbmltcG9ydCB7IE56SW5wdXRNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2lucHV0JztcbmltcG9ydCB7IE56TWVzc2FnZVNlcnZpY2UgfSBmcm9tICduZy16b3Jyby1hbnRkL21lc3NhZ2UnO1xuaW1wb3J0IHsgTnpUb29sVGlwTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC90b29sdGlwJztcbmltcG9ydCB7IE56Rm9ybWF0RW1pdEV2ZW50LCBOelRyZWVNb2R1bGUsIE56VHJlZU5vZGVPcHRpb25zIH0gZnJvbSAnbmctem9ycm8tYW50ZC90cmVlJztcblxuaW1wb3J0IHsgRm9ybXVsYUVkaXRvclJlcXVlc3RTZXJ2aWNlLCBGb3JtdWxhRWRpdG9yUmVxdWVzdFNlcnZpY2VUb2tlbiB9IGZyb20gJy4vZm9ybXVsYS1lZGl0b3ItcmVxdWVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IENoZWNrRm9ybWF0TWV0aG9kLCBGaWVsZCwgRnVuYywgRnVuY0xpc3RUeXBlLCBJdGVtVHlwZSwgT1BFUkFUT1JfTElTVCB9IGZyb20gJy4vZm9ybXVsYS1lZGl0b3IubW9kZWwnO1xuaW1wb3J0IHsgRm9ybXVsYUVkaXRvclNlcnZpY2UsIFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuL2Zvcm11bGEtZWRpdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUNPTlMgfSBmcm9tICcuL2Zvcm11bGEtZWRpdG9yLWljb24nO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbi8qKlxuICog5YWs5byP57yW6L6R5Zmo57uE5Lu2XG4gKiDnlKjkuo7liJvlu7rlkoznvJbovpHorqHnrpflhazlvI/vvIzmlK/mjIHlh73mlbDjgIHmjIfmoIflkozlrZfmrrXnmoTmj5LlhaXkuI7pqozor4FcbiAqIOS+nei1lmNsYXNzTmFtZeS4juWcqOS9v+eUqOe7hOS7tuWkhOS9v+eUqOepv+mAj+agt+W8j+WunueOsOagt+W8j1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZm9ybXVsYS1lZGl0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTnpDb2xEaXJlY3RpdmUsXG4gICAgTnpHcmlkTW9kdWxlLFxuICAgIE56SW5wdXRNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTnpJY29uTW9kdWxlLFxuICAgIENvbW1vbk1vZHVsZSxcbiAgICBOelRyZWVNb2R1bGUsXG4gICAgTnpCdXR0b25Nb2R1bGUsXG4gICAgTnpUb29sVGlwTW9kdWxlLFxuICAgIE56SGlnaGxpZ2h0UGlwZVxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybXVsYS1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtdWxhLWVkaXRvci5jb21wb25lbnQubGVzcyddXG59KVxuZXhwb3J0IGNsYXNzIEZvcm11bGFFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkluaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IGZvcm11bGFFZGl0b3JTZXJ2aWNlID0gaW5qZWN0KEZvcm11bGFFZGl0b3JTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzYW5pdGl6ZXIgPSBpbmplY3QoRG9tU2FuaXRpemVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBtc2cgPSBpbmplY3QoTnpNZXNzYWdlU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZm9ybXVsYUVkaXRvclJlcXVlc3RTZXJ2aWNlID0gaW5qZWN0PEZvcm11bGFFZGl0b3JSZXF1ZXN0U2VydmljZT4oRm9ybXVsYUVkaXRvclJlcXVlc3RTZXJ2aWNlVG9rZW4pO1xuICBAVmlld0NoaWxkKCdlZGl0b3InKSBlZGl0b3IhOiBFbGVtZW50UmVmO1xuXG4gIC8qKlxuICAgKiDpobnnm67nsbvlnovvvIzlhrPlrprmmL7npLrlrZfmrrXmiJboh6rlrprkuYlcbiAgICog6buY6K6k5YC877yaSXRlbVR5cGUuRmllbGRcbiAgICovXG4gIGl0ZW1UeXBlID0gaW5wdXQ8SXRlbVR5cGU+KEl0ZW1UeXBlLkZpZWxkKTtcblxuICAvKipcbiAgICog5a2X5q615qCH6aKY77yM5b2T6aG555uu57G75Z6L5Li65a2X5q615pe25pi+56S6XG4gICAqIOm7mOiupOWAvO+8miflrZfmrrUnXG4gICAqL1xuICBmaWVsZFRpdGxlID0gaW5wdXQ8c3RyaW5nPign5a2X5q61Jyk7XG5cbiAgLyoqXG4gICAqIOagvOW8j+ajgOafpeaWueazlVxuICAgKiDpu5jorqTlgLzvvJpDaGVja0Zvcm1hdE1ldGhvZC5zZWxmXG4gICAqL1xuICBjaGVja0Zvcm1hdE1ldGhvZCA9IGlucHV0PENoZWNrRm9ybWF0TWV0aG9kPihDaGVja0Zvcm1hdE1ldGhvZC5zZWxmKTtcblxuICAvKipcbiAgICog5Ye95pWw5YiX6KGo5pi+56S657G75Z6LXG4gICAqIOm7mOiupOWAvO+8mkZ1bmNMaXN0VHlwZS5UcmVlXG4gICAqL1xuICBmdW5jdGlvbkxpc3RUeXBlID0gaW5wdXQ8RnVuY0xpc3RUeXBlPihGdW5jTGlzdFR5cGUuVHJlZSk7XG5cbiAgaXRlbVRlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8dm9pZD4gfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBfaXRlbVR5cGUgPSBJdGVtVHlwZTtcbiAgcmVhZG9ubHkgX2Z1bmNMaXN0VHlwZSA9IEZ1bmNMaXN0VHlwZTtcblxuICBzZWFyY2hXb3JkOiBzdHJpbmcgPSAnJztcblxuICBmaWVsZExpc3RPcmlnaW46IEZpZWxkW10gPSBbXTtcbiAgZmllbGRMaXN0OiBGaWVsZFtdID0gW107XG5cbiAgZWRpdG9yT2JqITogRWRpdG9yO1xuICBjaGVja0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd0Rlc2NyaXB0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICBmdW5jTm9kZTogTnpUcmVlTm9kZU9wdGlvbnNbXSA9IFtdO1xuICBmaWVsZERlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJztcbiAgZWRpdERlc2NyaXB0aW9uOiBzdHJpbmcgPSAn6K+36YCJ5oup5Ye95pWwJztcblxuICBlZGl0RGVzY1Nob3c6ICdmdW5jJyB8ICdlcnJvcicgfCAnbm9uZScgPSAnbm9uZSc7XG5cbiAgc2VhcmNoRmllbGQ6IFNpZ25hbDxzdHJpbmc+ID0gc2lnbmFsKCcnKTtcbiAgc2VhcmNoRnVuY3Rpb246IFNpZ25hbDxzdHJpbmc+ID0gc2lnbmFsKCcnKTtcblxuICBfb3BlcmF0b3JMaXN0ID0gT1BFUkFUT1JfTElTVDtcblxuICBnZXRPcGVyYXRvckljb24odHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpY29uTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgYWRkOiBJQ09OUy5qaWEsXG4gICAgICBtaW51czogSUNPTlMuamlhbixcbiAgICAgIG11bHRpcGx5OiBJQ09OUy5jaGVuZyxcbiAgICAgIGRpdmlkZTogSUNPTlMuY2h1LFxuICAgICAgJ2xlZnQtcGFyZW50aGVzaXMnOiBJQ09OUy56dW9rdW9oYW8sXG4gICAgICAncmlnaHQtcGFyZW50aGVzaXMnOiBJQ09OUy55b3VrdW9oYW9cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChpY29uTWFwW3R5cGVdIHx8ICcnKSBhcyBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICog5p6E6YCg5Ye95pWwXG4gICAqIOWIneWni+WMluS/oeWPt+ebkeWQrO+8jOWkhOeQhuaQnOe0ouWSjOmhueebruexu+Wei+WPmOWMllxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3Qgc2VhcmNoV29yZCA9IHRoaXMuc2VhcmNoRmllbGQoKTtcbiAgICAgIHRoaXMuZmllbGRMaXN0ID0gdGhpcy5maWVsZExpc3RPcmlnaW4uZmlsdGVyKGl0ZW0gPT4gaXRlbS5uYW1lLmluY2x1ZGVzKHNlYXJjaFdvcmQpKTtcbiAgICB9KTtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgaXRlbVR5cGUgPSB0aGlzLml0ZW1UeXBlKCk7XG4gICAgICBpZiAoaXRlbVR5cGUgPT09IEl0ZW1UeXBlLkZpZWxkKSB7XG4gICAgICAgIHRoaXMuZm9ybXVsYUVkaXRvclJlcXVlc3RTZXJ2aWNlLmdldEZpZWxkcygpLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICB0aGlzLmZpZWxkTGlzdE9yaWdpbiA9IHJlcztcbiAgICAgICAgICB0aGlzLmZpZWxkTGlzdCA9IFsuLi50aGlzLmZpZWxkTGlzdE9yaWdpbl07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5mb3JtdWxhRWRpdG9yUmVxdWVzdFNlcnZpY2UuZ2V0RnVuY3Rpb25zKCkudGhlbihyZXMgPT4ge1xuICAgICAgdGhpcy5mdW5jTm9kZSA9IHJlcztcbiAgICB9KTtcbiAgICB0aGlzLmZvcm11bGFFZGl0b3JSZXF1ZXN0U2VydmljZS5nZXRGaWVsZERlc2NyaXB0aW9uKCkudGhlbihyZXMgPT4ge1xuICAgICAgdGhpcy5maWVsZERlc2NyaXB0aW9uID0gcmVzO1xuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuZm9ybXVsYUVkaXRvclNlcnZpY2UuaW5pdE5vZGVzKCk7XG4gICAgdGhpcy5lZGl0b3JPYmogPSBuZXcgRWRpdG9yKHtcbiAgICAgIGVsZW1lbnQ6IHRoaXMuZWRpdG9yLm5hdGl2ZUVsZW1lbnQsXG4gICAgICBleHRlbnNpb25zOiBbXG4gICAgICAgIFN0YXJ0ZXJLaXQuY29uZmlndXJlKHtcbiAgICAgICAgICBibG9ja3F1b3RlOiBmYWxzZSxcbiAgICAgICAgICBjb2RlQmxvY2s6IGZhbHNlLFxuICAgICAgICAgIGNvZGU6IGZhbHNlXG4gICAgICAgIH0pLFxuICAgICAgICB0aGlzLmZvcm11bGFFZGl0b3JTZXJ2aWNlLmZ1bmNOb2RlISxcbiAgICAgICAgdGhpcy5mb3JtdWxhRWRpdG9yU2VydmljZS5maWVsZE5vZGUhXG4gICAgICBdXG4gICAgfSk7XG4gIH1cblxuICBpbnNlcnRGdW5jKGZ1bmM6IEZ1bmMpIHtcbiAgICB0aGlzLmVkaXRvck9ialxuICAgICAgLmNoYWluKClcbiAgICAgIC5pbnNlcnRDb250ZW50KHtcbiAgICAgICAgdHlwZTogJ2Z1bmMnLFxuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIG5hbWU6IGZ1bmMubmFtZSxcbiAgICAgICAgICBpZDogZnVuYy5pZCxcbiAgICAgICAgICBjbGFzc05hbWU6IGB0ZXh0LWZ1bmMtJHtmdW5jLmNsYXNzTmFtZX1gXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRlbnQ6IFtdXG4gICAgICB9KVxuICAgICAgLmZvY3VzKClcbiAgICAgIC5ydW4oKTtcbiAgfVxuXG4gIGluc2VydEZpZWxkKGZpZWxkOiBGaWVsZCkge1xuICAgIHRoaXMuZWRpdG9yT2JqXG4gICAgICAuY2hhaW4oKVxuICAgICAgLmluc2VydENvbnRlbnQoe1xuICAgICAgICB0eXBlOiAnZmllbGQnLFxuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIG5hbWU6IGZpZWxkLm5hbWUsXG4gICAgICAgICAgaWQ6IGZpZWxkLmlkLFxuICAgICAgICAgIGNsYXNzTmFtZTogYHRleHQtZmllbGQtJHtmaWVsZC5jbGFzc05hbWV9YFxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZvY3VzKClcbiAgICAgIC5ydW4oKTtcbiAgfVxuXG4gIGluc2VydE9wZXJhdG9yKG9wZXJhdG9yOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVkaXRvck9ialxuICAgICAgLmNoYWluKClcbiAgICAgIC5pbnNlcnRDb250ZW50KHtcbiAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICB0ZXh0OiBvcGVyYXRvclxuICAgICAgfSlcbiAgICAgIC5mb2N1cygpXG4gICAgICAucnVuKCk7XG4gIH1cblxuICBmdW5jdGlvbkNsaWNrKG5vZGU6IE56Rm9ybWF0RW1pdEV2ZW50KSB7XG4gICAgY29uc3QgZnVuYyA9IG5vZGUubm9kZSEub3JpZ2luIGFzIHVua25vd24gYXMgRnVuYztcbiAgICB0aGlzLmVkaXREZXNjcmlwdGlvbiA9IGZ1bmMuZGVzY3JpcHRpb24gfHwgJyc7XG4gICAgdGhpcy5lZGl0RGVzY1Nob3cgPSAnZnVuYyc7XG4gICAgdGhpcy5pbnNlcnRGdW5jKGZ1bmMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluWFrOW8j0pTT05cbiAgICogQHJldHVybnMg5YWs5byP55qESlNPTuihqOekulxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyDov5Tlm57npLrkvotcbiAgICoge1xuICAgKiAgIFwidHlwZVwiOiBcImRvY1wiLFxuICAgKiAgIFwiY29udGVudFwiOiBbXG4gICAqICAgICB7XG4gICAqICAgICAgIFwidHlwZVwiOiBcInBhcmFncmFwaFwiLFxuICAgKiAgICAgICBcImNvbnRlbnRcIjogW1xuICAgKiAgICAgICAgIHtcbiAgICogICAgICAgICAgIFwidHlwZVwiOiBcImZ1bmNcIixcbiAgICogICAgICAgICAgIFwiYXR0cnNcIjoge1xuICAgKiAgICAgICAgICAgICBcIm5hbWVcIjogXCJTVU1cIixcbiAgICogICAgICAgICAgICAgXCJpZFwiOiBcInN1bVwiLFxuICAgKiAgICAgICAgICAgICBcImNsYXNzTmFtZVwiOiBcInRleHQtZnVuYy1hZ2dcIlxuICAgKiAgICAgICAgICAgfVxuICAgKiAgICAgICAgIH1cbiAgICogICAgICAgXVxuICAgKiAgICAgfVxuICAgKiAgIF1cbiAgICogfVxuICAgKi9cbiAgcHVibGljIGdldEZvcm11bGEoKSB7XG4gICAgY29uc3QgZm9ybXVsYSA9IHRoaXMuZWRpdG9yT2JqLmdldEpTT04oKTtcbiAgICByZXR1cm4gZm9ybXVsYTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blhazlvI/mlofmnKxcbiAgICogQHJldHVybnMg5YWs5byP55qE57qv5paH5pys6KGo56S6XG4gICAqIEBleGFtcGxlXG4gICAqIC8vIOi/lOWbnuekuuS+i1xuICAgKiBcIlNVTShmaWVsZDEsIGZpZWxkMilcIlxuICAgKi9cbiAgcHVibGljIGdldEZvcm11bGFUZXh0KCkge1xuICAgIGNvbnN0IGZvcm11bGFUZXh0ID0gdGhpcy5lZGl0b3JPYmouZ2V0VGV4dCgpO1xuICAgIHJldHVybiBmb3JtdWxhVGV4dDtcbiAgfVxuXG4gIGNoZWNrRm9ybWF0KCkge1xuICAgIGlmICh0aGlzLmNoZWNrRm9ybWF0TWV0aG9kKCkgPT09IENoZWNrRm9ybWF0TWV0aG9kLnNlbGYpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudmFsaWRhdGVGb3JtdWxhKCk7XG4gICAgICBpZiAocmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhpcy5tc2cuc3VjY2Vzcygn5qC85byP5qCh6aqM6YCa6L+HJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1zZy5lcnJvcihg5qC85byP5qCh6aqM5LiN6YCa6L+HOiAke3Jlc3VsdC5lcnJvcnMuam9pbignLCAnKX1gKTtcbiAgICAgICAgdGhpcy5lZGl0RGVzY3JpcHRpb24gPSByZXN1bHQuZXJyb3JzLmpvaW4oJywgJyk7XG4gICAgICAgIHRoaXMuZWRpdERlc2NTaG93ID0gJ2Vycm9yJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGVja0xvYWRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5mb3JtdWxhRWRpdG9yUmVxdWVzdFNlcnZpY2UudmFsaWRhdGVGb3JtdWxhKHRoaXMuZ2V0Rm9ybXVsYSgpKS50aGVuKHJlcyA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChyZXMuaXNWYWxpZCkge1xuICAgICAgICAgIHRoaXMubXNnLnN1Y2Nlc3MoJ+agvOW8j+agoemqjOmAmui/hycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubXNnLmVycm9yKGDmoLzlvI/moKHpqozkuI3pgJrov4c6ICR7cmVzLmVycm9ycy5qb2luKCcsICcpfWApO1xuICAgICAgICAgIHRoaXMuZWRpdERlc2NyaXB0aW9uID0gcmVzLmVycm9ycy5qb2luKCcsICcpO1xuICAgICAgICAgIHRoaXMuZWRpdERlc2NTaG93ID0gJ2Vycm9yJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOS7jkpTT07liqDovb3lhazlvI9cbiAgICogQHBhcmFtIGZvcm11bGEg5YWs5byP55qESlNPTuihqOekulxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyDkvb/nlKjnpLrkvotcbiAgICogY29uc3QgZm9ybXVsYSA9IHtcbiAgICogICBcInR5cGVcIjogXCJkb2NcIixcbiAgICogICBcImNvbnRlbnRcIjogW1xuICAgKiAgICAge1xuICAgKiAgICAgICBcInR5cGVcIjogXCJwYXJhZ3JhcGhcIixcbiAgICogICAgICAgXCJjb250ZW50XCI6IFtcbiAgICogICAgICAgICB7XG4gICAqICAgICAgICAgICBcInR5cGVcIjogXCJmdW5jXCIsXG4gICAqICAgICAgICAgICBcImF0dHJzXCI6IHtcbiAgICogICAgICAgICAgICAgXCJuYW1lXCI6IFwiU1VNXCIsXG4gICAqICAgICAgICAgICAgIFwiaWRcIjogXCJzdW1cIixcbiAgICogICAgICAgICAgICAgXCJjbGFzc05hbWVcIjogXCJ0ZXh0LWZ1bmMtYWdnXCJcbiAgICogICAgICAgICAgIH1cbiAgICogICAgICAgICB9XG4gICAqICAgICAgIF1cbiAgICogICAgIH1cbiAgICogICBdXG4gICAqIH07XG4gICAqIGZvcm11bGFFZGl0b3IubG9hZEZvcm11bGEoZm9ybXVsYSk7XG4gICAqL1xuICBwdWJsaWMgbG9hZEZvcm11bGEoZm9ybXVsYTogYW55KSB7XG4gICAgaWYgKCFmb3JtdWxhIHx8ICF0aGlzLmVkaXRvck9iaikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVkaXRvck9iai5jb21tYW5kcy5zZXRDb250ZW50KGZvcm11bGEpO1xuICB9XG5cbiAgLy8g5qCh6aqM5YWs5byPXG4gIHZhbGlkYXRlRm9ybXVsYSgpOiBWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCBmb3JtdWxhID0gdGhpcy5lZGl0b3JPYmouZ2V0SlNPTigpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZm9ybXVsYUVkaXRvclNlcnZpY2UudmFsaWRhdGVGb3JtdWxhKGZvcm11bGEpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB0b2dnbGVEZXNjcmlwdGlvbigpIHtcbiAgICB0aGlzLnNob3dEZXNjcmlwdGlvbiA9ICF0aGlzLnNob3dEZXNjcmlwdGlvbjtcbiAgfVxufVxuIiwiPGRpdiBuei1yb3cgY2xhc3M9XCJmb3JtdWxhLWVkaXRvclwiPlxuICA8ZGl2IG56LWNvbCBuelNwYW49XCIxMFwiIGNsYXNzPVwiZWRpdG9yLWJveFwiPlxuICAgIDxkaXYgY2xhc3M9XCJlZGl0b3ItdGl0bGVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC10aXRsZSBsYWJlbC1yZXF1aXJlXCI+5a2X5q616KGo6L6+5byPPC9kaXY+XG4gICAgICA8YnV0dG9uIG56LWJ1dHRvbiBuelR5cGU9XCJsaW5rXCIgbnpTaXplPVwic21hbGxcIiBbbnpMb2FkaW5nXT1cImNoZWNrTG9hZGluZ1wiIChjbGljayk9XCJjaGVja0Zvcm1hdCgpXCI+5qC85byP5qCh6aqMPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImVkaXQtYm94XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZWRpdC1vcGVyYXRpb24tYm94XCI+XG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgX29wZXJhdG9yTGlzdDsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlZGl0LW9wZXJhdGlvbi1pdGVtXCIgKGNsaWNrKT1cImluc2VydE9wZXJhdG9yKGl0ZW0ubmFtZSlcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3BlcmF0b3ItaWNvblwiIFtpbm5lckhUTUxdPVwiZ2V0T3BlcmF0b3JJY29uKGl0ZW0udHlwZSlcIj48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAjZWRpdG9yIGNsYXNzPVwiZWRpdG9yXCI+PC9kaXY+XG4gICAgICBAaWYgKGVkaXREZXNjU2hvdyAhPT0gJ25vbmUnKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJlZGl0LWRlc2NyaXB0aW9uLWJveFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlZGl0LWRlc2NyaXB0aW9uLWhlYWRcIiBbc3R5bGVdPVwieyBtYXJnaW5Cb3R0b206ICFzaG93RGVzY3JpcHRpb24gPyAnMTBweCcgOiAnMCcgfVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlZGl0LWRlc2NyaXB0aW9uLXRpdGxlXCI+e3sgZWRpdERlc2NTaG93ID09PSAnZnVuYycgPyAn5Ye95pWw6YeK5LmJJyA6ICfmoKHpqozplJnor6/kv6Hmga8nIH19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0LWRlc2NyaXB0aW9uLWljb25cIlxuICAgICAgICAgICAgICBuei1pY29uXG4gICAgICAgICAgICAgIFtuelR5cGVdPVwic2hvd0Rlc2NyaXB0aW9uID8gJ2Rvd24nIDogJ3VwJ1wiXG4gICAgICAgICAgICAgIG56VGhlbWU9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURlc2NyaXB0aW9uKClcIlxuICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKHNob3dEZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXQtZGVzY3JpcHRpb24tdGV4dFwiPiB7eyBlZGl0RGVzY3JpcHRpb24gfX0gPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIEBzd2l0Y2ggKGl0ZW1UeXBlKCkpIHtcbiAgICBAY2FzZSAoX2l0ZW1UeXBlLkZpZWxkKSB7XG4gICAgICA8ZGl2IG56LWNvbCBuelNwYW49XCI3XCIgY2xhc3M9XCJmaWVsZC1ib3hcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLXRpdGxlXCJcbiAgICAgICAgICA+e3sgZmllbGRUaXRsZSgpIH19XG4gICAgICAgICAgQGlmIChmaWVsZERlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICA8c3BhbiBuei1pY29uIG56VHlwZT1cInF1ZXN0aW9uLWNpcmNsZVwiIG56VGhlbWU9XCJvdXRsaW5lXCIgbnotdG9vbHRpcCBbbnpUb29sdGlwVGl0bGVdPVwiZmllbGREZXNjcmlwdGlvblwiPjwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bnotaW5wdXQtZ3JvdXAgW256U3VmZml4XT1cInN1ZmZpeEljb25TZWFyY2hcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuei1pbnB1dCBwbGFjZWhvbGRlcj1cIuaQnOe0olwiIFsobmdNb2RlbCldPVwic2VhcmNoRmllbGRcIiAvPlxuICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3N1ZmZpeEljb25TZWFyY2g+XG4gICAgICAgICAgPGkgbnotaWNvbiBuelR5cGU9XCJzZWFyY2hcIj48L2k+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1saXN0XCI+XG4gICAgICAgICAgQGZvciAoaXRlbSBvZiBmaWVsZExpc3Q7IHRyYWNrIGl0ZW0pIHtcbiAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImluc2VydEZpZWxkKGl0ZW0pXCIgW2NsYXNzXT1cIml0ZW0uY2xhc3NOYW1lID8gJ2l0ZW0tZmllbGQtJyArIGl0ZW0uY2xhc3NOYW1lIDogJydcIiBjbGFzcz1cImZpZWxkLWxpc3QtaXRlbVwiPlxuICAgICAgICAgICAgICBAaWYgKGl0ZW0uaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiZmllbGQtaW1nXCIgW3NyY109XCJpdGVtLmltYWdlXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKGl0ZW0uaWNvbikge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtaWNvblwiIG56LWljb24gW256SWNvbmZvbnRdPVwiaXRlbS5pY29uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtbmFtZVwiIFtpbm5lckhUTUxdPVwiaXRlbS5uYW1lIHwgbnpIaWdobGlnaHQ6IHNlYXJjaEZpZWxkKCkgOiAnaScgOiAnbm9kZS1oaWdobGlnaHQnXCI+PC9zcGFuPlxuICAgICAgICAgICAgICBAaWYgKGl0ZW0uZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXNjLWljb25cIlxuICAgICAgICAgICAgICAgICAgbnotaWNvblxuICAgICAgICAgICAgICAgICAgbnpUeXBlPVwicXVlc3Rpb24tY2lyY2xlXCJcbiAgICAgICAgICAgICAgICAgIG56VGhlbWU9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgICAgICAgIG56LXRvb2x0aXBcbiAgICAgICAgICAgICAgICAgIFtuelRvb2x0aXBUaXRsZV09XCJpdGVtLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICAgIEBjYXNlIChfaXRlbVR5cGUuVGVtcGxhdGUpIHtcbiAgICAgIDxkaXYgbnotY29sIG56U3Bhbj1cIjdcIiBjbGFzcz1cImZpZWxkLWJveFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbVRlbXBsYXRlKClcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuICA8ZGl2IG56LWNvbCBuelNwYW49XCI3XCIgY2xhc3M9XCJmdW5jdGlvbi1ib3hcIj5cbiAgICA8ZGl2IGNsYXNzPVwibGFiZWwtdGl0bGVcIj7lh73mlbA8L2Rpdj5cbiAgICA8bnotaW5wdXQtZ3JvdXAgW256U3VmZml4XT1cInN1ZmZpeEljb25TZWFyY2hcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG56LWlucHV0IHBsYWNlaG9sZGVyPVwi5pCc57SiXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hGdW5jdGlvblwiIC8+XG4gICAgPC9uei1pbnB1dC1ncm91cD5cbiAgICA8bmctdGVtcGxhdGUgI3N1ZmZpeEljb25TZWFyY2g+XG4gICAgICA8aSBuei1pY29uIG56VHlwZT1cInNlYXJjaFwiPjwvaT5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuei10cmVlXG4gICAgICBjbGFzcz1cImZ1bmN0aW9uLXRyZWVcIlxuICAgICAgW256SGlkZVVuTWF0Y2hlZF09XCJ0cnVlXCJcbiAgICAgIFtuelNlYXJjaFZhbHVlXT1cInNlYXJjaEZ1bmN0aW9uKClcIlxuICAgICAgW256VHJlZVRlbXBsYXRlXT1cIm56VHJlZVRlbXBsYXRlXCJcbiAgICAgIFtuekRhdGFdPVwiZnVuY05vZGVcIlxuICAgICAgW256U2hvd0V4cGFuZF09XCJmdW5jdGlvbkxpc3RUeXBlKCkgPT09IF9mdW5jTGlzdFR5cGUuVHJlZVwiXG4gICAgICAobnpDbGljayk9XCJmdW5jdGlvbkNsaWNrKCRldmVudClcIlxuICAgID48L256LXRyZWU+XG4gICAgPG5nLXRlbXBsYXRlICNuelRyZWVUZW1wbGF0ZSBsZXQtbm9kZSBsZXQtb3JpZ2luPVwib3JpZ2luXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImN1c3RvbS1ub2RlXCIgW2lubmVySFRNTF09XCJvcmlnaW4ubmFtZSB8IG56SGlnaGxpZ2h0OiBzZWFyY2hGdW5jdGlvbigpIDogJ2knIDogJ25vZGUtaGlnaGxpZ2h0J1wiPlxuICAgICAgICBAaWYgKG9yaWdpbi5kZXNjcmlwdGlvbikge1xuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cImRlc2MtaWNvblwiXG4gICAgICAgICAgICBuei1pY29uXG4gICAgICAgICAgICBuelR5cGU9XCJxdWVzdGlvbi1jaXJjbGVcIlxuICAgICAgICAgICAgbnpUaGVtZT1cIm91dGxpbmVcIlxuICAgICAgICAgICAgbnotdG9vbHRpcFxuICAgICAgICAgICAgW256VG9vbHRpcFRpdGxlXT1cIm9yaWdpbi5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9zcGFuPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
462
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXVsYS1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29tcG9uZW50cy9mb3JtdWxhLWVkaXRvci9mb3JtdWxhLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb21wb25lbnRzL2Zvcm11bGEtZWRpdG9yL2Zvcm11bGEtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFFTixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFFTixTQUFTLEVBS1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBcUIsWUFBWSxFQUFxQixNQUFNLG9CQUFvQixDQUFDO0FBRXhGLE9BQU8sRUFBK0IsZ0NBQWdDLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqSCxP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REFPWixNQUFNO3NCQUExQixTQUFTO3VCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBlZmZlY3QsXG4gIEVsZW1lbnRSZWYsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIHNpZ25hbCxcbiAgU2lnbmFsLFxuICBWaWV3Q2hpbGQsXG4gIEFmdGVyVmlld0luaXQsXG4gIE9uSW5pdCxcbiAgVGVtcGxhdGVSZWYsXG4gIFdyaXRhYmxlU2lnbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBFZGl0b3IgfSBmcm9tICdAdGlwdGFwL2NvcmUnO1xuaW1wb3J0IFN0YXJ0ZXJLaXQgZnJvbSAnQHRpcHRhcC9zdGFydGVyLWtpdCc7XG5pbXBvcnQgeyBOekJ1dHRvbk1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvYnV0dG9uJztcbmltcG9ydCB7IE56SGlnaGxpZ2h0UGlwZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9oaWdobGlnaHQnO1xuaW1wb3J0IHsgTnpDb2xEaXJlY3RpdmUsIE56R3JpZE1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvZ3JpZCc7XG5pbXBvcnQgeyBOekljb25Nb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2ljb24nO1xuaW1wb3J0IHsgTnpJbnB1dE1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvaW5wdXQnO1xuaW1wb3J0IHsgTnpNZXNzYWdlU2VydmljZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvbWVzc2FnZSc7XG5pbXBvcnQgeyBOelRvb2xUaXBNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL3Rvb2x0aXAnO1xuaW1wb3J0IHsgTnpGb3JtYXRFbWl0RXZlbnQsIE56VHJlZU1vZHVsZSwgTnpUcmVlTm9kZU9wdGlvbnMgfSBmcm9tICduZy16b3Jyby1hbnRkL3RyZWUnO1xuXG5pbXBvcnQgeyBGb3JtdWxhRWRpdG9yUmVxdWVzdFNlcnZpY2UsIEZvcm11bGFFZGl0b3JSZXF1ZXN0U2VydmljZVRva2VuIH0gZnJvbSAnLi9mb3JtdWxhLWVkaXRvci1yZXF1ZXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hlY2tGb3JtYXRNZXRob2QsIERFRkFVTFRfVEVYVCwgRGVmYXVsdFRleHQsIEZpZWxkLCBGdW5jLCBGdW5jTGlzdFR5cGUsIEl0ZW1UeXBlLCBPUEVSQVRPUl9MSVNUIH0gZnJvbSAnLi9mb3JtdWxhLWVkaXRvci5tb2RlbCc7XG5pbXBvcnQgeyBGb3JtdWxhRWRpdG9yU2VydmljZSwgVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4vZm9ybXVsYS1lZGl0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBJQ09OUyB9IGZyb20gJy4vZm9ybXVsYS1lZGl0b3ItaWNvbic7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcblxuLyoqXG4gKiDlhazlvI/nvJbovpHlmajnu4Tku7ZcbiAqIOeUqOS6juWIm+W7uuWSjOe8lui+keiuoeeul+WFrOW8j++8jOaUr+aMgeWHveaVsOOAgeaMh+agh+WSjOWtl+auteeahOaPkuWFpeS4jumqjOivgVxuICog5L6d6LWWY2xhc3NOYW1l5LiO5Zyo5L2/55So57uE5Lu25aSE5L2/55So56m/6YCP5qC35byP5a6e546w5qC35byPXG4gKlxuICog5L6L5aaC77yaXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyAxLiDpppblhYjlrp7njrAgRm9ybXVsYUVkaXRvclJlcXVlc3RTZXJ2aWNlXG4gKiBASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuICogZXhwb3J0IGNsYXNzIE15Rm9ybXVsYVJlcXVlc3RTZXJ2aWNlIGV4dGVuZHMgRm9ybXVsYUVkaXRvclJlcXVlc3RTZXJ2aWNlIHtcbiAqICAgZ2V0RnVuY3Rpb25zKGZ1bmN0aW9uTGlzdDogV3JpdGFibGVTaWduYWw8TnpUcmVlTm9kZU9wdGlvbnNbXT4pIHtcbiAqICAgICBmdW5jdGlvbkxpc3Quc2V0KFtcbiAqICAgICAgIHtcbiAqICAgICAgICAgdGl0bGU6ICfogZrlkIjlh73mlbAnLFxuICogICAgICAgICBrZXk6ICdhZ2cnLFxuICogICAgICAgICBjaGlsZHJlbjogW1xuICogICAgICAgICAgIHsgdGl0bGU6ICdTVU0nLCBrZXk6ICdzdW0nLCBjbGFzc05hbWU6ICdhZ2cnLCBpZDogJ3N1bScsIGRlc2NyaXB0aW9uOiAn5rGC5ZKM5Ye95pWwJyB9LFxuICogICAgICAgICAgIHsgdGl0bGU6ICdBVkcnLCBrZXk6ICdhdmcnLCBjbGFzc05hbWU6ICdhZ2cnLCBpZDogJ2F2ZycsIGRlc2NyaXB0aW9uOiAn5bmz5Z2H5YC85Ye95pWwJyB9LFxuICogICAgICAgICAgIHsgdGl0bGU6ICdDT1VOVCcsIGtleTogJ2NvdW50JywgY2xhc3NOYW1lOiAnYWdnJywgaWQ6ICdjb3VudCcsIGRlc2NyaXB0aW9uOiAn6K6h5pWw5Ye95pWwJyB9XG4gKiAgICAgICAgIF1cbiAqICAgICAgIH0sXG4gKiAgICAgICB7XG4gKiAgICAgICAgIHRpdGxlOiAn5pWw5a2m5Ye95pWwJyxcbiAqICAgICAgICAga2V5OiAnbWF0aCcsXG4gKiAgICAgICAgIGNoaWxkcmVuOiBbXG4gKiAgICAgICAgICAgeyB0aXRsZTogJ0FCUycsIGtleTogJ2FicycsIGNsYXNzTmFtZTogJ21hdGgnLCBpZDogJ2FicycsIGRlc2NyaXB0aW9uOiAn57ud5a+55YC85Ye95pWwJyB9LFxuICogICAgICAgICAgIHsgdGl0bGU6ICdST1VORCcsIGtleTogJ3JvdW5kJywgY2xhc3NOYW1lOiAnbWF0aCcsIGlkOiAncm91bmQnLCBkZXNjcmlwdGlvbjogJ+Wbm+iIjeS6lOWFpeWHveaVsCcgfVxuICogICAgICAgICBdXG4gKiAgICAgICB9XG4gKiAgICAgXSk7XG4gKiAgIH1cbiAqXG4gKiAgIGdldEZpZWxkcyhmaWVsZExpc3Q6IFdyaXRhYmxlU2lnbmFsPEZpZWxkW10+KSB7XG4gKiAgICAgZmllbGRMaXN0LnNldChbXG4gKiAgICAgICB7IGlkOiAndXNlcl9jb3VudCcsIG5hbWU6ICfnlKjmiLfmlbDph48nLCBjbGFzc05hbWU6ICdmaWVsZCcgfSxcbiAqICAgICAgIHsgaWQ6ICdvcmRlcl9hbW91bnQnLCBuYW1lOiAn6K6i5Y2V6YeR6aKdJywgY2xhc3NOYW1lOiAnZmllbGQnIH0sXG4gKiAgICAgICB7IGlkOiAncHJvZHVjdF9wcmljZScsIG5hbWU6ICfllYblk4Hku7fmoLwnLCBjbGFzc05hbWU6ICdmaWVsZCcgfVxuICogICAgIF0pO1xuICogICB9XG4gKlxuICogICB2YWxpZGF0ZUZvcm11bGEoZm9ybXVsYTogTnpTYWZlQW55LCByZXM6IFdyaXRhYmxlU2lnbmFsPFZhbGlkYXRpb25SZXN1bHQgfCBudWxsPikge1xuICogICAgIC8vIOiwg+eUqOWQjuerr0FQSeagoemqjOWFrOW8j1xuICogICAgIHRoaXMuaHR0cC5wb3N0KCcvYXBpL2Zvcm11bGEvdmFsaWRhdGUnLCB7IGZvcm11bGEgfSkuc3Vic2NyaWJlKHtcbiAqICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICogICAgICAgICByZXMuc2V0KHtcbiAqICAgICAgICAgICBpc1ZhbGlkOiByZXNwb25zZS52YWxpZCxcbiAqICAgICAgICAgICBlcnJvcnM6IHJlc3BvbnNlLmVycm9ycyB8fCBbXVxuICogICAgICAgICB9KTtcbiAqICAgICAgIH0sXG4gKiAgICAgICBlcnJvcjogKCkgPT4ge1xuICogICAgICAgICByZXMuc2V0KHtcbiAqICAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAqICAgICAgICAgICBlcnJvcnM6IFsn5qCh6aqM5aSx6LSl77yM6K+356iN5ZCO6YeN6K+VJ11cbiAqICAgICAgICAgfSk7XG4gKiAgICAgICB9XG4gKiAgICAgfSk7XG4gKiAgIH1cbiAqXG4gKiAgIGdldEZpZWxkRGVzY3JpcHRpb24oZGVzY3JpcHRpb246IFdyaXRhYmxlU2lnbmFsPHN0cmluZz4pIHtcbiAqICAgICBkZXNjcmlwdGlvbi5zZXQoJ+mAieaLqeWtl+auteWQjuaYvuekuuWtl+auteaPj+i/sOS/oeaBrycpO1xuICogICB9XG4gKiB9XG4gKlxuICogLy8gMi4g5Zyo5qih5Z2X5Lit5o+Q5L6b5pyN5YqhXG4gKiBwcm92aWRlcnM6IFtcbiAqICAgeyBwcm92aWRlOiBGb3JtdWxhRWRpdG9yUmVxdWVzdFNlcnZpY2VUb2tlbiwgdXNlQ2xhc3M6IE15Rm9ybXVsYVJlcXVlc3RTZXJ2aWNlIH1cbiAqIF1cbiAqXG4gKiAvLyAzLiDlnKjniLbnu4Tku7bkuK3kvb/nlKhcbiAqIEBDb21wb25lbnQoe1xuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxhcHAtZm9ybXVsYS1lZGl0b3JcbiAqICAgICAgIFtpdGVtVHlwZV09XCJpdGVtVHlwZVwiXG4gKiAgICAgICBbZGVmYXVsdFRleHRdPVwiZGVmYXVsdFRleHRcIlxuICogICAgICAgW2NoZWNrRm9ybWF0TWV0aG9kXT1cImNoZWNrRm9ybWF0TWV0aG9kXCJcbiAqICAgICAgIFtmdW5jdGlvbkxpc3RUeXBlXT1cImZ1bmN0aW9uTGlzdFR5cGVcIlxuICogICAgICAgW2l0ZW1UZW1wbGF0ZV09XCJpdGVtVGVtcGxhdGVcIj5cbiAqICAgICA8L2FwcC1mb3JtdWxhLWVkaXRvcj5cbiAqXG4gKiAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZ2V0Rm9ybXVsYSgpXCI+6I635Y+W5YWs5byPSlNPTjwvYnV0dG9uPlxuICogICAgIDxidXR0b24gKGNsaWNrKT1cImdldEZvcm11bGFUZXh0KClcIj7ojrflj5blhazlvI/mlofmnKw8L2J1dHRvbj5cbiAqICAgICA8YnV0dG9uIChjbGljayk9XCJsb2FkRXhhbXBsZUZvcm11bGEoKVwiPuWKoOi9veekuuS+i+WFrOW8jzwvYnV0dG9uPlxuICogICBgXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIFBhcmVudENvbXBvbmVudCB7XG4gKiAgIEBWaWV3Q2hpbGQoRm9ybXVsYUVkaXRvckNvbXBvbmVudCkgZm9ybXVsYUVkaXRvciE6IEZvcm11bGFFZGl0b3JDb21wb25lbnQ7XG4gKlxuICogICBpdGVtVHlwZSA9IEl0ZW1UeXBlLkZpZWxkO1xuICogICBjaGVja0Zvcm1hdE1ldGhvZCA9IENoZWNrRm9ybWF0TWV0aG9kLnNlbGY7XG4gKiAgIGZ1bmN0aW9uTGlzdFR5cGUgPSBGdW5jTGlzdFR5cGUuVHJlZTtcbiAqXG4gKiAgIGRlZmF1bHRUZXh0ID0ge1xuICogICAgIGZpZWxkVGl0bGU6ICflrZfmrrUnLFxuICogICAgIGluZGljYXRvclRpdGxlOiAn5oyH5qCHJyxcbiAqICAgICBjaGVja0Zvcm1hdFRpdGxlOiAn5qC85byP5qCh6aqMJ1xuICogICB9O1xuICpcbiAqICAgLy8g6I635Y+W5YWs5byPSlNPTlxuICogICBnZXRGb3JtdWxhKCkge1xuICogICAgIGNvbnN0IGZvcm11bGEgPSB0aGlzLmZvcm11bGFFZGl0b3IuZ2V0Rm9ybXVsYSgpO1xuICogICAgIGNvbnNvbGUubG9nKCflhazlvI9KU09OOicsIGZvcm11bGEpO1xuICogICB9XG4gKlxuICogICAvLyDojrflj5blhazlvI/mlofmnKxcbiAqICAgZ2V0Rm9ybXVsYVRleHQoKSB7XG4gKiAgICAgY29uc3QgdGV4dCA9IHRoaXMuZm9ybXVsYUVkaXRvci5nZXRGb3JtdWxhVGV4dCgpO1xuICogICAgIGNvbnNvbGUubG9nKCflhazlvI/mlofmnKw6JywgdGV4dCk7XG4gKiAgIH1cbiAqXG4gKiAgIC8vIOWKoOi9veekuuS+i+WFrOW8j1xuICogICBsb2FkRXhhbXBsZUZvcm11bGEoKSB7XG4gKiAgICAgY29uc3QgZXhhbXBsZUZvcm11bGEgPSB7XG4gKiAgICAgICB0eXBlOiAnZG9jJyxcbiAqICAgICAgIGNvbnRlbnQ6IFtcbiAqICAgICAgICAge1xuICogICAgICAgICAgIHR5cGU6ICdwYXJhZ3JhcGgnLFxuICogICAgICAgICAgIGNvbnRlbnQ6IFtcbiAqICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgdHlwZTogJ2Z1bmMnLFxuICogICAgICAgICAgICAgICBhdHRyczoge1xuICogICAgICAgICAgICAgICAgIG5hbWU6ICdTVU0nLFxuICogICAgICAgICAgICAgICAgIGlkOiAnc3VtJyxcbiAqICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICd0ZXh0LWZ1bmMtYWdnJ1xuICogICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICB9LFxuICogICAgICAgICAgICAge1xuICogICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICAgICAgICAgIHRleHQ6ICcoJ1xuICogICAgICAgICAgICAgfSxcbiAqICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgdHlwZTogJ2ZpZWxkJyxcbiAqICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAqICAgICAgICAgICAgICAgICBuYW1lOiAnb3JkZXJfYW1vdW50JyxcbiAqICAgICAgICAgICAgICAgICBpZDogJ29yZGVyX2Ftb3VudCcsXG4gKiAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAndGV4dC1maWVsZC1maWVsZCdcbiAqICAgICAgICAgICAgICAgfVxuICogICAgICAgICAgICAgfSxcbiAqICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICogICAgICAgICAgICAgICB0ZXh0OiAnKSdcbiAqICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICBdXG4gKiAgICAgICAgIH1cbiAqICAgICAgIF1cbiAqICAgICB9O1xuICogICAgIHRoaXMuZm9ybXVsYUVkaXRvci5sb2FkRm9ybXVsYShleGFtcGxlRm9ybXVsYSk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyA0LiDmoLflvI/nqb/pgI/vvIjlnKjniLbnu4Tku7bmoLflvI/mlofku7bkuK3vvIlcbiAqIC8vIDpob3N0IDo6bmctZGVlcCAudGV4dC1mdW5jLWFnZyB7XG4gKiAvLyAgIGNvbG9yOiAjMTg5MGZmO1xuICogLy8gICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTZmN2ZmO1xuICogLy8gICBwYWRkaW5nOiAycHggNnB4O1xuICogLy8gICBib3JkZXItcmFkaXVzOiA0cHg7XG4gKiAvLyB9XG4gKlxuICogLy8gOmhvc3QgOjpuZy1kZWVwIC50ZXh0LWZpZWxkLWZpZWxkIHtcbiAqIC8vICAgY29sb3I6ICM1MmM0MWE7XG4gKiAvLyAgIGJhY2tncm91bmQtY29sb3I6ICNmNmZmZWQ7XG4gKiAvLyAgIHBhZGRpbmc6IDJweCA2cHg7XG4gKiAvLyAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAqIC8vIH1cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZm9ybXVsYS1lZGl0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTnpDb2xEaXJlY3RpdmUsXG4gICAgTnpHcmlkTW9kdWxlLFxuICAgIE56SW5wdXRNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTnpJY29uTW9kdWxlLFxuICAgIENvbW1vbk1vZHVsZSxcbiAgICBOelRyZWVNb2R1bGUsXG4gICAgTnpCdXR0b25Nb2R1bGUsXG4gICAgTnpUb29sVGlwTW9kdWxlLFxuICAgIE56SGlnaGxpZ2h0UGlwZVxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybXVsYS1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtdWxhLWVkaXRvci5jb21wb25lbnQubGVzcyddLFxuICBwcm92aWRlcnM6IFtGb3JtdWxhRWRpdG9yU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgRm9ybXVsYUVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uSW5pdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZm9ybXVsYUVkaXRvclNlcnZpY2UgPSBpbmplY3QoRm9ybXVsYUVkaXRvclNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNhbml0aXplciA9IGluamVjdChEb21TYW5pdGl6ZXIpO1xuICBwcml2YXRlIHJlYWRvbmx5IG1zZyA9IGluamVjdChOek1lc3NhZ2VTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmb3JtdWxhRWRpdG9yUmVxdWVzdFNlcnZpY2UgPSBpbmplY3Q8Rm9ybXVsYUVkaXRvclJlcXVlc3RTZXJ2aWNlPihGb3JtdWxhRWRpdG9yUmVxdWVzdFNlcnZpY2VUb2tlbik7XG4gIEBWaWV3Q2hpbGQoJ2VkaXRvcicpIGVkaXRvciE6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIOmhueebruexu+Wei++8jOWGs+WumuaYvuekuuWtl+auteaIluiHquWumuS5iVxuICAgKiDpu5jorqTlgLzvvJpJdGVtVHlwZS5GaWVsZFxuICAgKi9cbiAgaXRlbVR5cGUgPSBpbnB1dDxJdGVtVHlwZT4oSXRlbVR5cGUuRmllbGQpO1xuXG4gIC8qKlxuICAgKiDlrZfmrrXmoIfpopjvvIzlvZPpobnnm67nsbvlnovkuLrlrZfmrrXml7bmmL7npLpcbiAgICog6buY6K6k5YC877yaJ+Wtl+autSdcbiAgICovXG4gIGRlZmF1bHRUZXh0ID0gaW5wdXQ8RGVmYXVsdFRleHQ+KHt9KTtcblxuICAvKipcbiAgICog5qC85byP5qOA5p+l5pa55rOVXG4gICAqIOm7mOiupOWAvO+8mkNoZWNrRm9ybWF0TWV0aG9kLnNlbGZcbiAgICovXG4gIGNoZWNrRm9ybWF0TWV0aG9kID0gaW5wdXQ8Q2hlY2tGb3JtYXRNZXRob2Q+KENoZWNrRm9ybWF0TWV0aG9kLnNlbGYpO1xuXG4gIC8qKlxuICAgKiDlh73mlbDliJfooajmmL7npLrnsbvlnotcbiAgICog6buY6K6k5YC877yaRnVuY0xpc3RUeXBlLlRyZWVcbiAgICovXG4gIGZ1bmN0aW9uTGlzdFR5cGUgPSBpbnB1dDxGdW5jTGlzdFR5cGU+KEZ1bmNMaXN0VHlwZS5UcmVlKTtcblxuICBpdGVtVGVtcGxhdGUgPSBpbnB1dDxUZW1wbGF0ZVJlZjx2b2lkPiB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IF9pdGVtVHlwZSA9IEl0ZW1UeXBlO1xuICByZWFkb25seSBfZnVuY0xpc3RUeXBlID0gRnVuY0xpc3RUeXBlO1xuICByZWFkb25seSBfZGVmYXVsdFRleHQgPSBERUZBVUxUX1RFWFQ7XG5cbiAgc2VhcmNoV29yZDogc3RyaW5nID0gJyc7XG5cbiAgZmllbGRMaXN0T3JpZ2luOiBXcml0YWJsZVNpZ25hbDxGaWVsZFtdPiA9IHNpZ25hbChbXSk7XG4gIGZpZWxkTGlzdDogRmllbGRbXSA9IFtdO1xuXG4gIGVkaXRvck9iaiE6IEVkaXRvcjtcbiAgY2hlY2tMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dEZXNjcmlwdGlvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgZnVuY05vZGU6IFdyaXRhYmxlU2lnbmFsPE56VHJlZU5vZGVPcHRpb25zW10+ID0gc2lnbmFsKFtdKTtcbiAgZmllbGREZXNjcmlwdGlvbjogV3JpdGFibGVTaWduYWw8c3RyaW5nPiA9IHNpZ25hbCgnJyk7XG4gIHZhbGlkYXRpb25SZXN1bHQ6IFdyaXRhYmxlU2lnbmFsPFZhbGlkYXRpb25SZXN1bHQgfCBudWxsPiA9IHNpZ25hbChudWxsKTtcblxuICBlZGl0RGVzY3JpcHRpb246IHN0cmluZyA9ICfor7fpgInmi6nlh73mlbAnO1xuXG4gIGVkaXREZXNjU2hvdzogJ2Z1bmMnIHwgJ2Vycm9yJyB8ICdub25lJyA9ICdub25lJztcblxuICBzZWFyY2hGaWVsZDogU2lnbmFsPHN0cmluZz4gPSBzaWduYWwoJycpO1xuICBzZWFyY2hGdW5jdGlvbjogU2lnbmFsPHN0cmluZz4gPSBzaWduYWwoJycpO1xuXG4gIF9vcGVyYXRvckxpc3QgPSBPUEVSQVRPUl9MSVNUO1xuXG4gIGdldE9wZXJhdG9ySWNvbih0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGljb25NYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBhZGQ6IElDT05TLmppYSxcbiAgICAgIG1pbnVzOiBJQ09OUy5qaWFuLFxuICAgICAgbXVsdGlwbHk6IElDT05TLmNoZW5nLFxuICAgICAgZGl2aWRlOiBJQ09OUy5jaHUsXG4gICAgICAnbGVmdC1wYXJlbnRoZXNpcyc6IElDT05TLnp1b2t1b2hhbyxcbiAgICAgICdyaWdodC1wYXJlbnRoZXNpcyc6IElDT05TLnlvdWt1b2hhb1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGljb25NYXBbdHlwZV0gfHwgJycpIGFzIHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiDmnoTpgKDlh73mlbBcbiAgICog5Yid5aeL5YyW5L+h5Y+355uR5ZCs77yM5aSE55CG5pCc57Si5ZKM6aG555uu57G75Z6L5Y+Y5YyWXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBzZWFyY2hXb3JkID0gdGhpcy5zZWFyY2hGaWVsZCgpO1xuICAgICAgdGhpcy5maWVsZExpc3QgPSB0aGlzLmZpZWxkTGlzdE9yaWdpbigpLmZpbHRlcihpdGVtID0+IGl0ZW0ubmFtZS5pbmNsdWRlcyhzZWFyY2hXb3JkKSk7XG4gICAgfSk7XG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtVHlwZSA9IHRoaXMuaXRlbVR5cGUoKTtcbiAgICAgICAgaWYgKGl0ZW1UeXBlID09PSBJdGVtVHlwZS5GaWVsZCkge1xuICAgICAgICAgIHRoaXMuZm9ybXVsYUVkaXRvclJlcXVlc3RTZXJ2aWNlLmdldEZpZWxkcyh0aGlzLmZpZWxkTGlzdE9yaWdpbik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZExpc3RPcmlnaW4gPSB0aGlzLmZpZWxkTGlzdE9yaWdpbigpO1xuICAgICAgdGhpcy5maWVsZExpc3QgPSBbLi4uZmllbGRMaXN0T3JpZ2luXTtcbiAgICB9KTtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblJlc3VsdCgpO1xuICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQpIHtcbiAgICAgICAgdGhpcy5jaGVja0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgIHRoaXMubXNnLnN1Y2Nlc3MoYCR7dGhpcy5kZWZhdWx0VGV4dCgpLmNoZWNrRm9ybWF0VGl0bGUgfHwgdGhpcy5fZGVmYXVsdFRleHQuY2hlY2tGb3JtYXRUaXRsZX3pgJrov4dgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm1zZy5lcnJvcihcbiAgICAgICAgICAgIGAke3RoaXMuZGVmYXVsdFRleHQoKS5jaGVja0Zvcm1hdFRpdGxlIHx8IHRoaXMuX2RlZmF1bHRUZXh0LmNoZWNrRm9ybWF0VGl0bGV95LiN6YCa6L+HOiAke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3JzLmpvaW4oJywgJyl9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5lZGl0RGVzY3JpcHRpb24gPSB2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5qb2luKCcsICcpO1xuICAgICAgICAgIHRoaXMuZWRpdERlc2NTaG93ID0gJ2Vycm9yJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5mb3JtdWxhRWRpdG9yUmVxdWVzdFNlcnZpY2UuZ2V0RnVuY3Rpb25zKHRoaXMuZnVuY05vZGUpO1xuICAgIHRoaXMuZm9ybXVsYUVkaXRvclJlcXVlc3RTZXJ2aWNlLmdldEZpZWxkRGVzY3JpcHRpb24odGhpcy5maWVsZERlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmZvcm11bGFFZGl0b3JTZXJ2aWNlLmluaXROb2RlcygpO1xuICAgIHRoaXMuZWRpdG9yT2JqID0gbmV3IEVkaXRvcih7XG4gICAgICBlbGVtZW50OiB0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50LFxuICAgICAgZXh0ZW5zaW9uczogW1xuICAgICAgICBTdGFydGVyS2l0LmNvbmZpZ3VyZSh7XG4gICAgICAgICAgYmxvY2txdW90ZTogZmFsc2UsXG4gICAgICAgICAgY29kZUJsb2NrOiBmYWxzZSxcbiAgICAgICAgICBjb2RlOiBmYWxzZVxuICAgICAgICB9KSxcbiAgICAgICAgdGhpcy5mb3JtdWxhRWRpdG9yU2VydmljZS5mdW5jTm9kZSEsXG4gICAgICAgIHRoaXMuZm9ybXVsYUVkaXRvclNlcnZpY2UuZmllbGROb2RlIVxuICAgICAgXVxuICAgIH0pO1xuICB9XG5cbiAgaW5zZXJ0RnVuYyhmdW5jOiBGdW5jKSB7XG4gICAgdGhpcy5lZGl0b3JPYmpcbiAgICAgIC5jaGFpbigpXG4gICAgICAuaW5zZXJ0Q29udGVudCh7XG4gICAgICAgIHR5cGU6ICdmdW5jJyxcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICBuYW1lOiBmdW5jLm5hbWUsXG4gICAgICAgICAgaWQ6IGZ1bmMuaWQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBgdGV4dC1mdW5jLSR7ZnVuYy5jbGFzc05hbWV9YFxuICAgICAgICB9LFxuICAgICAgICBjb250ZW50OiBbXVxuICAgICAgfSlcbiAgICAgIC5mb2N1cygpXG4gICAgICAucnVuKCk7XG4gIH1cblxuICBpbnNlcnRGaWVsZChmaWVsZDogRmllbGQpIHtcbiAgICB0aGlzLmVkaXRvck9ialxuICAgICAgLmNoYWluKClcbiAgICAgIC5pbnNlcnRDb250ZW50KHtcbiAgICAgICAgdHlwZTogJ2ZpZWxkJyxcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICBuYW1lOiBmaWVsZC5uYW1lLFxuICAgICAgICAgIGlkOiBmaWVsZC5pZCxcbiAgICAgICAgICBjbGFzc05hbWU6IGB0ZXh0LWZpZWxkLSR7ZmllbGQuY2xhc3NOYW1lfWBcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5mb2N1cygpXG4gICAgICAucnVuKCk7XG4gIH1cblxuICBpbnNlcnRPcGVyYXRvcihvcGVyYXRvcjogc3RyaW5nKSB7XG4gICAgdGhpcy5lZGl0b3JPYmpcbiAgICAgIC5jaGFpbigpXG4gICAgICAuaW5zZXJ0Q29udGVudCh7XG4gICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgdGV4dDogb3BlcmF0b3JcbiAgICAgIH0pXG4gICAgICAuZm9jdXMoKVxuICAgICAgLnJ1bigpO1xuICB9XG5cbiAgZnVuY3Rpb25DbGljayhub2RlOiBOekZvcm1hdEVtaXRFdmVudCkge1xuICAgIGNvbnN0IGZ1bmMgPSBub2RlLm5vZGUhLm9yaWdpbiBhcyB1bmtub3duIGFzIEZ1bmM7XG4gICAgdGhpcy5lZGl0RGVzY3JpcHRpb24gPSBmdW5jLmRlc2NyaXB0aW9uIHx8ICcnO1xuICAgIHRoaXMuZWRpdERlc2NTaG93ID0gJ2Z1bmMnO1xuICAgIHRoaXMuaW5zZXJ0RnVuYyhmdW5jKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blhazlvI9KU09OXG4gICAqIEByZXR1cm5zIOWFrOW8j+eahEpTT07ooajnpLpcbiAgICogQGV4YW1wbGVcbiAgICogLy8g6L+U5Zue56S65L6LXG4gICAqIHtcbiAgICogICBcInR5cGVcIjogXCJkb2NcIixcbiAgICogICBcImNvbnRlbnRcIjogW1xuICAgKiAgICAge1xuICAgKiAgICAgICBcInR5cGVcIjogXCJwYXJhZ3JhcGhcIixcbiAgICogICAgICAgXCJjb250ZW50XCI6IFtcbiAgICogICAgICAgICB7XG4gICAqICAgICAgICAgICBcInR5cGVcIjogXCJmdW5jXCIsXG4gICAqICAgICAgICAgICBcImF0dHJzXCI6IHtcbiAgICogICAgICAgICAgICAgXCJuYW1lXCI6IFwiU1VNXCIsXG4gICAqICAgICAgICAgICAgIFwiaWRcIjogXCJzdW1cIixcbiAgICogICAgICAgICAgICAgXCJjbGFzc05hbWVcIjogXCJ0ZXh0LWZ1bmMtYWdnXCJcbiAgICogICAgICAgICAgIH1cbiAgICogICAgICAgICB9XG4gICAqICAgICAgIF1cbiAgICogICAgIH1cbiAgICogICBdXG4gICAqIH1cbiAgICovXG4gIHB1YmxpYyBnZXRGb3JtdWxhKCkge1xuICAgIGNvbnN0IGZvcm11bGEgPSB0aGlzLmVkaXRvck9iai5nZXRKU09OKCk7XG4gICAgcmV0dXJuIGZvcm11bGE7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5YWs5byP5paH5pysXG4gICAqIEByZXR1cm5zIOWFrOW8j+eahOe6r+aWh+acrOihqOekulxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyDov5Tlm57npLrkvotcbiAgICogXCJTVU0oZmllbGQxLCBmaWVsZDIpXCJcbiAgICovXG4gIHB1YmxpYyBnZXRGb3JtdWxhVGV4dCgpIHtcbiAgICBjb25zdCBmb3JtdWxhVGV4dCA9IHRoaXMuZWRpdG9yT2JqLmdldFRleHQoKTtcbiAgICByZXR1cm4gZm9ybXVsYVRleHQ7XG4gIH1cblxuICBjaGVja0Zvcm1hdCgpIHtcbiAgICBpZiAodGhpcy5jaGVja0Zvcm1hdE1ldGhvZCgpID09PSBDaGVja0Zvcm1hdE1ldGhvZC5zZWxmKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnZhbGlkYXRlRm9ybXVsYSgpO1xuICAgICAgaWYgKHJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRoaXMubXNnLnN1Y2Nlc3MoYCR7dGhpcy5kZWZhdWx0VGV4dCgpLmNoZWNrRm9ybWF0VGl0bGUgfHwgdGhpcy5fZGVmYXVsdFRleHQuY2hlY2tGb3JtYXRUaXRsZX3pgJrov4dgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubXNnLmVycm9yKGAke3RoaXMuZGVmYXVsdFRleHQoKS5jaGVja0Zvcm1hdFRpdGxlIHx8IHRoaXMuX2RlZmF1bHRUZXh0LmNoZWNrRm9ybWF0VGl0bGV95LiN6YCa6L+HOiAke3Jlc3VsdC5lcnJvcnMuam9pbignLCAnKX1gKTtcbiAgICAgICAgdGhpcy5lZGl0RGVzY3JpcHRpb24gPSByZXN1bHQuZXJyb3JzLmpvaW4oJywgJyk7XG4gICAgICAgIHRoaXMuZWRpdERlc2NTaG93ID0gJ2Vycm9yJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGVja0xvYWRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5mb3JtdWxhRWRpdG9yUmVxdWVzdFNlcnZpY2UudmFsaWRhdGVGb3JtdWxhKHRoaXMuZ2V0Rm9ybXVsYSgpLCB0aGlzLnZhbGlkYXRpb25SZXN1bHQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDku45KU09O5Yqg6L295YWs5byPXG4gICAqIEBwYXJhbSBmb3JtdWxhIOWFrOW8j+eahEpTT07ooajnpLpcbiAgICogQGV4YW1wbGVcbiAgICogLy8g5L2/55So56S65L6LXG4gICAqIGNvbnN0IGZvcm11bGEgPSB7XG4gICAqICAgXCJ0eXBlXCI6IFwiZG9jXCIsXG4gICAqICAgXCJjb250ZW50XCI6IFtcbiAgICogICAgIHtcbiAgICogICAgICAgXCJ0eXBlXCI6IFwicGFyYWdyYXBoXCIsXG4gICAqICAgICAgIFwiY29udGVudFwiOiBbXG4gICAqICAgICAgICAge1xuICAgKiAgICAgICAgICAgXCJ0eXBlXCI6IFwiZnVuY1wiLFxuICAgKiAgICAgICAgICAgXCJhdHRyc1wiOiB7XG4gICAqICAgICAgICAgICAgIFwibmFtZVwiOiBcIlNVTVwiLFxuICAgKiAgICAgICAgICAgICBcImlkXCI6IFwic3VtXCIsXG4gICAqICAgICAgICAgICAgIFwiY2xhc3NOYW1lXCI6IFwidGV4dC1mdW5jLWFnZ1wiXG4gICAqICAgICAgICAgICB9XG4gICAqICAgICAgICAgfVxuICAgKiAgICAgICBdXG4gICAqICAgICB9XG4gICAqICAgXVxuICAgKiB9O1xuICAgKiBmb3JtdWxhRWRpdG9yLmxvYWRGb3JtdWxhKGZvcm11bGEpO1xuICAgKi9cbiAgcHVibGljIGxvYWRGb3JtdWxhKGZvcm11bGE6IGFueSkge1xuICAgIGlmICghZm9ybXVsYSB8fCAhdGhpcy5lZGl0b3JPYmopIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lZGl0b3JPYmouY29tbWFuZHMuc2V0Q29udGVudChmb3JtdWxhKTtcbiAgfVxuXG4gIC8vIOagoemqjOWFrOW8j1xuICB2YWxpZGF0ZUZvcm11bGEoKTogVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgZm9ybXVsYSA9IHRoaXMuZWRpdG9yT2JqLmdldEpTT04oKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZvcm11bGFFZGl0b3JTZXJ2aWNlLnZhbGlkYXRlRm9ybXVsYShmb3JtdWxhKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdG9nZ2xlRGVzY3JpcHRpb24oKSB7XG4gICAgdGhpcy5zaG93RGVzY3JpcHRpb24gPSAhdGhpcy5zaG93RGVzY3JpcHRpb247XG4gIH1cbn1cbiIsIjxkaXYgbnotcm93IGNsYXNzPVwiZm9ybXVsYS1lZGl0b3JcIj5cbiAgPGRpdiBuei1jb2wgbnpTcGFuPVwiMTBcIiBjbGFzcz1cImVkaXRvci1ib3hcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZWRpdG9yLXRpdGxlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtdGl0bGUgbGFiZWwtcmVxdWlyZVwiPnt7IGRlZmF1bHRUZXh0KCkuaW5wdXRUaXRsZSB8fCBfZGVmYXVsdFRleHQuaW5wdXRUaXRsZSB9fTwvZGl2PlxuICAgICAgPGJ1dHRvbiBuei1idXR0b24gbnpUeXBlPVwibGlua1wiIG56U2l6ZT1cInNtYWxsXCIgW256TG9hZGluZ109XCJjaGVja0xvYWRpbmdcIiAoY2xpY2spPVwiY2hlY2tGb3JtYXQoKVwiPnt7XG4gICAgICAgIGRlZmF1bHRUZXh0KCkuY2hlY2tGb3JtYXRUaXRsZSB8fCBfZGVmYXVsdFRleHQuY2hlY2tGb3JtYXRUaXRsZVxuICAgICAgfX08L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZWRpdC1ib3hcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJlZGl0LW9wZXJhdGlvbi1ib3hcIj5cbiAgICAgICAgQGZvciAoaXRlbSBvZiBfb3BlcmF0b3JMaXN0OyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXQtb3BlcmF0aW9uLWl0ZW1cIiAoY2xpY2spPVwiaW5zZXJ0T3BlcmF0b3IoaXRlbS5uYW1lKVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcGVyYXRvci1pY29uXCIgW2lubmVySFRNTF09XCJnZXRPcGVyYXRvckljb24oaXRlbS50eXBlKVwiPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICNlZGl0b3IgY2xhc3M9XCJlZGl0b3JcIj48L2Rpdj5cbiAgICAgIEBpZiAoZWRpdERlc2NTaG93ICE9PSAnbm9uZScpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImVkaXQtZGVzY3JpcHRpb24tYm94XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXQtZGVzY3JpcHRpb24taGVhZFwiIFtzdHlsZV09XCJ7IG1hcmdpbkJvdHRvbTogIXNob3dEZXNjcmlwdGlvbiA/ICcxMHB4JyA6ICcwJyB9XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVkaXQtZGVzY3JpcHRpb24tdGl0bGVcIj57eyBlZGl0RGVzY1Nob3cgPT09ICdmdW5jJyA/ICflh73mlbDph4rkuYknIDogJ+agoemqjOmUmeivr+S/oeaBrycgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cImVkaXQtZGVzY3JpcHRpb24taWNvblwiXG4gICAgICAgICAgICAgIG56LWljb25cbiAgICAgICAgICAgICAgW256VHlwZV09XCJzaG93RGVzY3JpcHRpb24gPyAnZG93bicgOiAndXAnXCJcbiAgICAgICAgICAgICAgbnpUaGVtZT1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRGVzY3JpcHRpb24oKVwiXG4gICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIEBpZiAoc2hvd0Rlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWRpdC1kZXNjcmlwdGlvbi10ZXh0XCI+IHt7IGVkaXREZXNjcmlwdGlvbiB9fSA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgQHN3aXRjaCAoaXRlbVR5cGUoKSkge1xuICAgIEBjYXNlIChfaXRlbVR5cGUuRmllbGQpIHtcbiAgICAgIDxkaXYgbnotY29sIG56U3Bhbj1cIjdcIiBjbGFzcz1cImZpZWxkLWJveFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtdGl0bGVcIlxuICAgICAgICAgID57eyBkZWZhdWx0VGV4dCgpLmZpZWxkVGl0bGUgfHwgX2RlZmF1bHRUZXh0LmZpZWxkVGl0bGUgfX1cbiAgICAgICAgICBAaWYgKGZpZWxkRGVzY3JpcHRpb24oKSkge1xuICAgICAgICAgICAgPHNwYW4gbnotaWNvbiBuelR5cGU9XCJxdWVzdGlvbi1jaXJjbGVcIiBuelRoZW1lPVwib3V0bGluZVwiIG56LXRvb2x0aXAgW256VG9vbHRpcFRpdGxlXT1cImZpZWxkRGVzY3JpcHRpb24oKVwiPjwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bnotaW5wdXQtZ3JvdXAgW256U3VmZml4XT1cInN1ZmZpeEljb25TZWFyY2hcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIG56LWlucHV0XG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZGVmYXVsdFRleHQoKS5zZWFyY2hGaWVsZFBsYWNlaG9sZGVyIHx8IF9kZWZhdWx0VGV4dC5zZWFyY2hGaWVsZFBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoRmllbGRcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvbnotaW5wdXQtZ3JvdXA+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjc3VmZml4SWNvblNlYXJjaD5cbiAgICAgICAgICA8aSBuei1pY29uIG56VHlwZT1cInNlYXJjaFwiPjwvaT5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWxpc3RcIj5cbiAgICAgICAgICBAZm9yIChpdGVtIG9mIGZpZWxkTGlzdDsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiaW5zZXJ0RmllbGQoaXRlbSlcIiBbY2xhc3NdPVwiaXRlbS5jbGFzc05hbWUgPyAnaXRlbS1maWVsZC0nICsgaXRlbS5jbGFzc05hbWUgOiAnJ1wiIGNsYXNzPVwiZmllbGQtbGlzdC1pdGVtXCI+XG4gICAgICAgICAgICAgIEBpZiAoaXRlbS5pbWFnZSkge1xuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJmaWVsZC1pbWdcIiBbc3JjXT1cIml0ZW0uaW1hZ2VcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoaXRlbS5pY29uKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1pY29uXCIgbnotaWNvbiBbbnpJY29uZm9udF09XCJpdGVtLmljb25cIj48L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1uYW1lXCIgW2lubmVySFRNTF09XCJpdGVtLm5hbWUgfCBuekhpZ2hsaWdodDogc2VhcmNoRmllbGQoKSA6ICdpJyA6ICdub2RlLWhpZ2hsaWdodCdcIj48L3NwYW4+XG4gICAgICAgICAgICAgIEBpZiAoaXRlbS5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImRlc2MtaWNvblwiXG4gICAgICAgICAgICAgICAgICBuei1pY29uXG4gICAgICAgICAgICAgICAgICBuelR5cGU9XCJxdWVzdGlvbi1jaXJjbGVcIlxuICAgICAgICAgICAgICAgICAgbnpUaGVtZT1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgICAgbnotdG9vbHRpcFxuICAgICAgICAgICAgICAgICAgW256VG9vbHRpcFRpdGxlXT1cIml0ZW0uZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGNhc2UgKF9pdGVtVHlwZS5UZW1wbGF0ZSkge1xuICAgICAgPGRpdiBuei1jb2wgbnpTcGFuPVwiN1wiIGNsYXNzPVwiZmllbGQtYm94XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtVGVtcGxhdGUoKVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9XG4gIDxkaXYgbnotY29sIG56U3Bhbj1cIjdcIiBjbGFzcz1cImZ1bmN0aW9uLWJveFwiPlxuICAgIDxkaXYgY2xhc3M9XCJsYWJlbC10aXRsZVwiPnt7IGRlZmF1bHRUZXh0KCkuZnVuY3Rpb25UaXRsZSB8fCBfZGVmYXVsdFRleHQuZnVuY3Rpb25UaXRsZSB9fTwvZGl2PlxuICAgIDxuei1pbnB1dC1ncm91cCBbbnpTdWZmaXhdPVwic3VmZml4SWNvblNlYXJjaFwiPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgbnotaW5wdXRcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cImRlZmF1bHRUZXh0KCkuc2VhcmNoRnVuY3Rpb25QbGFjZWhvbGRlciB8fCBfZGVmYXVsdFRleHQuc2VhcmNoRnVuY3Rpb25QbGFjZWhvbGRlclwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoRnVuY3Rpb25cIlxuICAgICAgLz5cbiAgICA8L256LWlucHV0LWdyb3VwPlxuICAgIDxuZy10ZW1wbGF0ZSAjc3VmZml4SWNvblNlYXJjaD5cbiAgICAgIDxpIG56LWljb24gbnpUeXBlPVwic2VhcmNoXCI+PC9pPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG56LXRyZWVcbiAgICAgIGNsYXNzPVwiZnVuY3Rpb24tdHJlZVwiXG4gICAgICBbbnpIaWRlVW5NYXRjaGVkXT1cInRydWVcIlxuICAgICAgW256U2VhcmNoVmFsdWVdPVwic2VhcmNoRnVuY3Rpb24oKVwiXG4gICAgICBbbnpUcmVlVGVtcGxhdGVdPVwibnpUcmVlVGVtcGxhdGVcIlxuICAgICAgW256RGF0YV09XCJmdW5jTm9kZSgpXCJcbiAgICAgIFtuelNob3dFeHBhbmRdPVwiZnVuY3Rpb25MaXN0VHlwZSgpID09PSBfZnVuY0xpc3RUeXBlLlRyZWVcIlxuICAgICAgKG56Q2xpY2spPVwiZnVuY3Rpb25DbGljaygkZXZlbnQpXCJcbiAgICA+PC9uei10cmVlPlxuICAgIDxuZy10ZW1wbGF0ZSAjbnpUcmVlVGVtcGxhdGUgbGV0LW5vZGUgbGV0LW9yaWdpbj1cIm9yaWdpblwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjdXN0b20tbm9kZVwiIFtpbm5lckhUTUxdPVwib3JpZ2luLm5hbWUgfCBuekhpZ2hsaWdodDogc2VhcmNoRnVuY3Rpb24oKSA6ICdpJyA6ICdub2RlLWhpZ2hsaWdodCdcIj5cbiAgICAgICAgQGlmIChvcmlnaW4uZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJkZXNjLWljb25cIlxuICAgICAgICAgICAgbnotaWNvblxuICAgICAgICAgICAgbnpUeXBlPVwicXVlc3Rpb24tY2lyY2xlXCJcbiAgICAgICAgICAgIG56VGhlbWU9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgIG56LXRvb2x0aXBcbiAgICAgICAgICAgIFtuelRvb2x0aXBUaXRsZV09XCJvcmlnaW4uZGVzY3JpcHRpb25cIlxuICAgICAgICAgID48L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|