@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.
@@ -8,11 +8,17 @@ export class FormulaEditorRequestService {
8
8
  constructor() { }
9
9
  /**
10
10
  * 获取字段的描述
11
- * @param item 字段对象
12
- * @returns 描述字符串
11
+ * 实现类需要根据字段id来获取字段的描述
12
+ * 例如:
13
+ * ```typescript
14
+ * getFieldDescription(description: WritableSignal<string>) {
15
+ * description.set('');
16
+ * }
17
+ * ```
18
+ * @param description 描述字符串信号量
13
19
  */
14
- getFieldDescription() {
15
- return Promise.resolve('');
20
+ getFieldDescription(description) {
21
+ description.set('');
16
22
  }
17
23
  }
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXVsYS1lZGl0b3ItcmVxdWVzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29tcG9uZW50cy9mb3JtdWxhLWVkaXRvci9mb3JtdWxhLWVkaXRvci1yZXF1ZXN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU8vQyxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFJLGNBQWMsQ0FBOEIsa0NBQWtDLENBQUMsQ0FBQztBQUVwSTs7O0dBR0c7QUFDSCxNQUFNLE9BQWdCLDJCQUEyQjtJQUMvQyxnQkFBZSxDQUFDO0lBbUJoQjs7OztPQUlHO0lBQ0gsbUJBQW1CO1FBQ2pCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTnpTYWZlQW55IH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IE56VHJlZU5vZGVPcHRpb25zIH0gZnJvbSAnbmctem9ycm8tYW50ZC90cmVlJztcblxuaW1wb3J0IHsgRmllbGQsIEZ1bmMsIEl0ZW1UeXBlIH0gZnJvbSAnLi9mb3JtdWxhLWVkaXRvci5tb2RlbCc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi9mb3JtdWxhLWVkaXRvci5zZXJ2aWNlJztcblxuZXhwb3J0IGNvbnN0IEZvcm11bGFFZGl0b3JSZXF1ZXN0U2VydmljZVRva2VuID0gbmV3IEluamVjdGlvblRva2VuPEZvcm11bGFFZGl0b3JSZXF1ZXN0U2VydmljZT4oJ0Zvcm11bGFFZGl0b3JSZXF1ZXN0U2VydmljZVRva2VuJyk7XG5cbi8qKlxuICog5YWs5byP57yW6L6R5Zmo6K+35rGC5pyN5Yqh77yM55So5LqO6I635Y+W5Ye95pWw5YiX6KGo44CB5a2X5q615YiX6KGo44CB5oyH5qCH5YiX6KGo5ZKM5qCh6aqM5YWs5byP5qC85byPXG4gKiDlrp7njrDnsbvpnIDopoHlrp7njrDlm5vkuKrmlrnms5XjgILlpoLmnpzmnInpg6jliIbmlrnms5XkuI3pnIDopoHvvIzlj6/ku6Xlrp7njrDnqbrmlrnms5XjgIJcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZvcm11bGFFZGl0b3JSZXF1ZXN0U2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICog6I635Y+W5Ye95pWw5YiX6KGoXG4gICAqL1xuICBhYnN0cmFjdCBnZXRGdW5jdGlvbnMoKTogUHJvbWlzZTxOelRyZWVOb2RlT3B0aW9uc1tdPjtcblxuICAvKipcbiAgICog6I635Y+W5a2X5q615YiX6KGoXG4gICAqL1xuICBhYnN0cmFjdCBnZXRGaWVsZHMoKTogUHJvbWlzZTxGaWVsZFtdPjtcblxuICAvKipcbiAgICog5qCh6aqM5YWs5byP5qC85byPXG4gICAqIEBwYXJhbSBmb3JtdWxhIOWFrOW8j+Wtl+espuS4slxuICAgKiBAcmV0dXJucyDmoKHpqoznu5PmnpxcbiAgICovXG4gIGFic3RyYWN0IHZhbGlkYXRlRm9ybXVsYShmb3JtdWxhOiBOelNhZmVBbnkpOiBQcm9taXNlPFZhbGlkYXRpb25SZXN1bHQ+O1xuXG4gIC8qKlxuICAgKiDojrflj5blrZfmrrXnmoTmj4/ov7BcbiAgICogQHBhcmFtIGl0ZW0g5a2X5q615a+56LGhXG4gICAqIEByZXR1cm5zIOaPj+i/sOWtl+espuS4slxuICAgKi9cbiAgZ2V0RmllbGREZXNjcmlwdGlvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoJycpO1xuICB9XG59XG4iXX0=
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.fieldTitle = input('字段');
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().then(res => {
98
- this.fieldListOrigin = res;
99
- this.fieldList = [...this.fieldListOrigin];
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().then(res => {
106
- this.funcNode = res;
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(`格式校验不通过: ${result.errors.join(', ')}`);
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()).then(res => {
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\">\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"] }]
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXVsYS1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29tcG9uZW50cy9mb3JtdWxhLWVkaXRvci9mb3JtdWxhLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb21wb25lbnRzL2Zvcm11bGEtZWRpdG9yL2Zvcm11bGEtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQXNDLE1BQU0sZUFBZSxDQUFDO0FBQzVJLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RDLE9BQU8sVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQXFCLFlBQVksRUFBcUIsTUFBTSxvQkFBb0IsQ0FBQztBQUV4RixPQUFPLEVBQStCLGdDQUFnQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakgsT0FBTyxFQUFFLGlCQUFpQixFQUFlLFlBQVksRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0csT0FBTyxFQUFFLG9CQUFvQixFQUFvQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7Ozs7O0FBRXpEOzs7O0dBSUc7QUFtQkgsTUFBTSxPQUFPLHNCQUFzQjtJQXdEakMsZUFBZSxDQUFDLElBQVk7UUFDMUIsTUFBTSxPQUFPLEdBQTJCO1lBQ3RDLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNqQixRQUFRLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDckIsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHO1lBQ2pCLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxTQUFTO1lBQ25DLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxTQUFTO1NBQ3JDLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBVyxDQUFDO0lBQy9FLENBQUM7SUFFRDs7O09BR0c7SUFFSDtRQXhFaUIseUJBQW9CLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDcEQsY0FBUyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNqQyxRQUFHLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDL0IsZ0NBQTJCLEdBQUcsTUFBTSxDQUE4QixnQ0FBZ0MsQ0FBQyxDQUFDO1FBR3JIOzs7V0FHRztRQUNILGFBQVEsR0FBRyxLQUFLLENBQVcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTNDOzs7V0FHRztRQUNILGVBQVUsR0FBRyxLQUFLLENBQVMsSUFBSSxDQUFDLENBQUM7UUFFakM7OztXQUdHO1FBQ0gsc0JBQWlCLEdBQUcsS0FBSyxDQUFvQixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyRTs7O1dBR0c7UUFDSCxxQkFBZ0IsR0FBRyxLQUFLLENBQWUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTFELGlCQUFZLEdBQUcsS0FBSyxDQUEyQixJQUFJLENBQUMsQ0FBQztRQUU1QyxjQUFTLEdBQUcsUUFBUSxDQUFDO1FBQ3JCLGtCQUFhLEdBQUcsWUFBWSxDQUFDO1FBRXRDLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFFeEIsb0JBQWUsR0FBWSxFQUFFLENBQUM7UUFDOUIsY0FBUyxHQUFZLEVBQUUsQ0FBQztRQUd4QixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixvQkFBZSxHQUFZLElBQUksQ0FBQztRQUVoQyxhQUFRLEdBQXdCLEVBQUUsQ0FBQztRQUNuQyxxQkFBZ0IsR0FBVyxFQUFFLENBQUM7UUFDOUIsb0JBQWUsR0FBVyxPQUFPLENBQUM7UUFFbEMsaUJBQVksR0FBOEIsTUFBTSxDQUFDO1FBRWpELGdCQUFXLEdBQW1CLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QyxtQkFBYyxHQUFtQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFNUMsa0JBQWEsR0FBRyxhQUFhLENBQUM7UUFvQjVCLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDdkYsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2pDLElBQUksUUFBUSxLQUFLLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDdEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxHQUFHLENBQUM7b0JBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDN0MsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDekQsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsMkJBQTJCLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDaEUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxNQUFNLENBQUM7WUFDMUIsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYTtZQUNsQyxVQUFVLEVBQUU7Z0JBQ1YsVUFBVSxDQUFDLFNBQVMsQ0FBQztvQkFDbkIsVUFBVSxFQUFFLEtBQUs7b0JBQ2pCLFNBQVMsRUFBRSxLQUFLO29CQUNoQixJQUFJLEVBQUUsS0FBSztpQkFDWixDQUFDO2dCQUNGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFTO2dCQUNuQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBVTthQUNyQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBVTtRQUNuQixJQUFJLENBQUMsU0FBUzthQUNYLEtBQUssRUFBRTthQUNQLGFBQWEsQ0FBQztZQUNiLElBQUksRUFBRSxNQUFNO1lBQ1osS0FBSyxFQUFFO2dCQUNMLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDZixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ1gsU0FBUyxFQUFFLGFBQWEsSUFBSSxDQUFDLFNBQVMsRUFBRTthQUN6QztZQUNELE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQzthQUNELEtBQUssRUFBRTthQUNQLEdBQUcsRUFBRSxDQUFDO0lBQ1gsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFZO1FBQ3RCLElBQUksQ0FBQyxTQUFTO2FBQ1gsS0FBSyxFQUFFO2FBQ1AsYUFBYSxDQUFDO1lBQ2IsSUFBSSxFQUFFLE9BQU87WUFDYixLQUFLLEVBQUU7Z0JBQ0wsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2dCQUNoQixFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQ1osU0FBUyxFQUFFLGNBQWMsS0FBSyxDQUFDLFNBQVMsRUFBRTthQUMzQztTQUNGLENBQUM7YUFDRCxLQUFLLEVBQUU7YUFDUCxHQUFHLEVBQUUsQ0FBQztJQUNYLENBQUM7SUFFRCxjQUFjLENBQUMsUUFBZ0I7UUFDN0IsSUFBSSxDQUFDLFNBQVM7YUFDWCxLQUFLLEVBQUU7YUFDUCxhQUFhLENBQUM7WUFDYixJQUFJLEVBQUUsTUFBTTtZQUNaLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQzthQUNELEtBQUssRUFBRTthQUNQLEdBQUcsRUFBRSxDQUFDO0lBQ1gsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUF1QjtRQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSyxDQUFDLE1BQXlCLENBQUM7UUFDbEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F1Qkc7SUFDSSxVQUFVO1FBQ2YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN6QyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksY0FBYztRQUNuQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzdDLE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdEMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUM7WUFDOUIsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekIsSUFBSSxDQUFDLDJCQUEyQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzdFLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUMxQixJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDaEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzdCLENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDcEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDN0MsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUM7Z0JBQzlCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXdCRztJQUNJLFdBQVcsQ0FBQyxPQUFZO1FBQzdCLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDaEMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELE9BQU87SUFDUCxlQUFlO1FBQ2IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUMvQyxDQUFDOytHQTlRVSxzQkFBc0I7bUdBQXRCLHNCQUFzQixzNEJDM0NuQyxna0pBaUhBLDh3SURwRkksY0FBYyx3T0FDZCxZQUFZLDJMQUNaLGFBQWEsdXBCQUNiLFdBQVcsOG1CQUNYLFlBQVksaU5BQ1osWUFBWSxxTUFDWixZQUFZLGswQkFDWixjQUFjLG9mQUNkLGVBQWUsb2ZBQ2YsZUFBZTs7NEZBS04sc0JBQXNCO2tCQWxCbEMsU0FBUzsrQkFDRSxvQkFBb0IsY0FDbEIsSUFBSSxXQUNQO3dCQUNQLGNBQWM7d0JBQ2QsWUFBWTt3QkFDWixhQUFhO3dCQUNiLFdBQVc7d0JBQ1gsWUFBWTt3QkFDWixZQUFZO3dCQUNaLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxlQUFlO3dCQUNmLGVBQWU7cUJBQ2hCO3dEQVNvQixNQUFNO3NCQUExQixTQUFTO3VCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIHNpZ25hbCwgU2lnbmFsLCBWaWV3Q2hpbGQsIEFmdGVyVmlld0luaXQsIE9uSW5pdCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSAnQHRpcHRhcC9jb3JlJztcbmltcG9ydCBTdGFydGVyS2l0IGZyb20gJ0B0aXB0YXAvc3RhcnRlci1raXQnO1xuaW1wb3J0IHsgTnpCdXR0b25Nb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2J1dHRvbic7XG5pbXBvcnQgeyBOekhpZ2hsaWdodFBpcGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvaGlnaGxpZ2h0JztcbmltcG9ydCB7IE56Q29sRGlyZWN0aXZlLCBOekdyaWRNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2dyaWQnO1xuaW1wb3J0IHsgTnpJY29uTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9pY29uJztcbmltcG9ydCB7IE56SW5wdXRNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2lucHV0JztcbmltcG9ydCB7IE56TWVzc2FnZVNlcnZpY2UgfSBmcm9tICduZy16b3Jyby1hbnRkL21lc3NhZ2UnO1xuaW1wb3J0IHsgTnpUb29sVGlwTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC90b29sdGlwJztcbmltcG9ydCB7IE56Rm9ybWF0RW1pdEV2ZW50LCBOelRyZWVNb2R1bGUsIE56VHJlZU5vZGVPcHRpb25zIH0gZnJvbSAnbmctem9ycm8tYW50ZC90cmVlJztcblxuaW1wb3J0IHsgRm9ybXVsYUVkaXRvclJlcXVlc3RTZXJ2aWNlLCBGb3JtdWxhRWRpdG9yUmVxdWVzdFNlcnZpY2VUb2tlbiB9IGZyb20gJy4vZm9ybXVsYS1lZGl0b3ItcmVxdWVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IENoZWNrRm9ybWF0TWV0aG9kLCBGaWVsZCwgRnVuYywgRnVuY0xpc3RUeXBlLCBJdGVtVHlwZSwgT1BFUkFUT1JfTElTVCB9IGZyb20gJy4vZm9ybXVsYS1lZGl0b3IubW9kZWwnO1xuaW1wb3J0IHsgRm9ybXVsYUVkaXRvclNlcnZpY2UsIFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuL2Zvcm11bGEtZWRpdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUNPTlMgfSBmcm9tICcuL2Zvcm11bGEtZWRpdG9yLWljb24nO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbi8qKlxuICog5YWs5byP57yW6L6R5Zmo57uE5Lu2XG4gKiDnlKjkuo7liJvlu7rlkoznvJbovpHorqHnrpflhazlvI/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