@yibozhang/pro-table 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,20 +2,22 @@ import { Component, ContentChild, Input } from "@angular/core";
2
2
  export class PageContainerComponent {
3
3
  constructor() {
4
4
  this.title = "";
5
+ this.showHeader = true;
5
6
  }
6
7
  ngOnInit() { }
7
8
  }
8
9
  PageContainerComponent.decorators = [
9
10
  { type: Component, args: [{
10
11
  selector: "app-page-container",
11
- template: "<nz-card\r\n [nzBorderless]=\"true\"\r\n [nzBodyStyle]=\"{ padding: '10px', width: '100%' }\"\r\n>\r\n <div class=\"page-container-title\" *ngIf=\"title\">{{ title }}</div>\r\n <div class=\"page-container-header\">\r\n <ng-container *ngTemplateOutlet=\"headerTpl\"></ng-container>\r\n </div>\r\n <div class=\"page-container-body\">\r\n <ng-container *ngTemplateOutlet=\"bodyTpl\"></ng-container>\r\n </div>\r\n</nz-card>\r\n",
12
+ template: "<nz-card\r\n [nzBorderless]=\"true\"\r\n [nzBodyStyle]=\"{ padding: '10px', width: '100%' }\"\r\n>\r\n <div class=\"page-container-title\" *ngIf=\"title\">{{ title }}</div>\r\n <div class=\"page-container-header\" *ngIf=\"showHeader\">\r\n <ng-container *ngTemplateOutlet=\"headerTpl\"></ng-container>\r\n </div>\r\n <div class=\"page-container-body\">\r\n <ng-container *ngTemplateOutlet=\"bodyTpl\"></ng-container>\r\n </div>\r\n</nz-card>\r\n",
12
13
  styles: [".page-container-title{border-left:3px solid #096dd9;color:#1d1d1d;font-size:16px;margin-bottom:16px;padding-left:10px}.page-container-body,.page-container-header{box-sizing:border-box;padding:7px}"]
13
14
  },] }
14
15
  ];
15
16
  PageContainerComponent.ctorParameters = () => [];
16
17
  PageContainerComponent.propDecorators = {
17
18
  title: [{ type: Input }],
19
+ showHeader: [{ type: Input }],
18
20
  headerTpl: [{ type: ContentChild, args: ["header",] }],
19
21
  bodyTpl: [{ type: ContentChild, args: ["body",] }]
20
22
  };
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1jb250YWluZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IkQ6L3Byb2plY3RzL3Zwcy1mcm9udC9Gcm9udC9EYXNQTVNXZWIvbGliL3Byby10YWJsZS9zcmMvIiwic291cmNlcyI6WyJsaWIvcGFnZS1jb250YWluZXIvcGFnZS1jb250YWluZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBdUIsTUFBTSxlQUFlLENBQUM7QUFPcEYsTUFBTSxPQUFPLHNCQUFzQjtJQUtqQztRQUpTLFVBQUssR0FBVyxFQUFFLENBQUM7SUFJYixDQUFDO0lBRWhCLFFBQVEsS0FBVSxDQUFDOzs7WUFacEIsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxvQkFBb0I7Z0JBQzlCLGljQUE4Qzs7YUFFL0M7Ozs7b0JBRUUsS0FBSzt3QkFDTCxZQUFZLFNBQUMsUUFBUTtzQkFDckIsWUFBWSxTQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgSW5wdXQsIE9uSW5pdCwgVGVtcGxhdGVSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiYXBwLXBhZ2UtY29udGFpbmVyXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9wYWdlLWNvbnRhaW5lci5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9wYWdlLWNvbnRhaW5lci5jb21wb25lbnQubGVzc1wiXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFBhZ2VDb250YWluZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmcgPSBcIlwiO1xyXG4gIEBDb250ZW50Q2hpbGQoXCJoZWFkZXJcIikgaGVhZGVyVHBsITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAQ29udGVudENoaWxkKFwiYm9keVwiKSBib2R5VHBsITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XHJcbn1cclxuIl19
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1jb250YWluZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IkQ6L3Byb2plY3RzL3Zwcy1mcm9udC9Gcm9udC9EYXNQTVNXZWIvbGliL3Byby10YWJsZS9zcmMvIiwic291cmNlcyI6WyJsaWIvcGFnZS1jb250YWluZXIvcGFnZS1jb250YWluZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBdUIsTUFBTSxlQUFlLENBQUM7QUFPcEYsTUFBTSxPQUFPLHNCQUFzQjtJQU1qQztRQUxTLFVBQUssR0FBVyxFQUFFLENBQUM7UUFDbkIsZUFBVSxHQUFZLElBQUksQ0FBQztJQUlyQixDQUFDO0lBRWhCLFFBQVEsS0FBVSxDQUFDOzs7WUFicEIsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxvQkFBb0I7Z0JBQzlCLHNkQUE4Qzs7YUFFL0M7Ozs7b0JBRUUsS0FBSzt5QkFDTCxLQUFLO3dCQUNMLFlBQVksU0FBQyxRQUFRO3NCQUNyQixZQUFZLFNBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkLCBJbnB1dCwgT25Jbml0LCBUZW1wbGF0ZVJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtcGFnZS1jb250YWluZXJcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3BhZ2UtY29udGFpbmVyLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL3BhZ2UtY29udGFpbmVyLmNvbXBvbmVudC5sZXNzXCJdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGFnZUNvbnRhaW5lckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZyA9IFwiXCI7XHJcbiAgQElucHV0KCkgc2hvd0hlYWRlcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgQENvbnRlbnRDaGlsZChcImhlYWRlclwiKSBoZWFkZXJUcGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBDb250ZW50Q2hpbGQoXCJib2R5XCIpIGJvZHlUcGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge31cclxufVxyXG4iXX0=
@@ -12,6 +12,7 @@ export class AntdFormService {
12
12
  this.formStore = {};
13
13
  this.formModifyType = "create";
14
14
  // ==================== 私有属性 ====================
15
+ this.formRegisterStore = {};
15
16
  this.labelWidth = "120px";
16
17
  this.labelAlign = "right";
17
18
  this.labelObservers = {};
@@ -26,18 +27,62 @@ export class AntdFormService {
26
27
  };
27
28
  }
28
29
  // ==================== 表单创建和初始化 ====================
30
+ // 判断是否为嵌套 FormGroup 配置
31
+ isFormGroupConfig(config) {
32
+ return (typeof config === "object" &&
33
+ config !== null &&
34
+ "type" in config &&
35
+ config.type === "group");
36
+ }
37
+ // 递归创建嵌套 FormGroup
38
+ createNestedFormGroup(fields, disabled) {
39
+ const groupConfig = {};
40
+ Object.entries(fields).forEach(([key, fieldConfig]) => {
41
+ var _a, _b, _c, _d, _e;
42
+ if (this.isFormGroupConfig(fieldConfig)) {
43
+ // 递归创建嵌套的 FormGroup
44
+ groupConfig[key] = this.createNestedFormGroup(fieldConfig.fields, (_a = fieldConfig.disabled) !== null && _a !== void 0 ? _a : disabled);
45
+ }
46
+ else {
47
+ // 创建普通 FormControl
48
+ groupConfig[key] = [
49
+ {
50
+ value: fieldConfig.value,
51
+ disabled: (_c = (_b = fieldConfig.disabled) !== null && _b !== void 0 ? _b : disabled) !== null && _c !== void 0 ? _c : false,
52
+ },
53
+ (_e = (_d = fieldConfig.validators) === null || _d === void 0 ? void 0 : _d.call(fieldConfig)) !== null && _e !== void 0 ? _e : [],
54
+ ];
55
+ }
56
+ });
57
+ return this.fb.group(groupConfig);
58
+ }
29
59
  // 初始化表单
30
60
  createFormGroup(name, config, options) {
31
61
  const groupConfig = {};
32
62
  this.errorMessageStore[name] = {};
33
63
  Object.entries(config).forEach(([key, fieldConfig]) => {
34
64
  var _a, _b, _c;
35
- groupConfig[key] = [
36
- { value: fieldConfig.value, disabled: (_a = fieldConfig.disabled) !== null && _a !== void 0 ? _a : false },
37
- (_c = (_b = fieldConfig.validators) === null || _b === void 0 ? void 0 : _b.call(fieldConfig)) !== null && _c !== void 0 ? _c : [],
38
- ];
39
- if (fieldConfig.errorMessages) {
40
- this.errorMessageStore[name][key] = fieldConfig.errorMessages;
65
+ if (this.isFormGroupConfig(fieldConfig)) {
66
+ // 处理嵌套 FormGroup
67
+ const nestedGroup = this.createNestedFormGroup(fieldConfig.fields, fieldConfig.disabled);
68
+ groupConfig[key] = nestedGroup;
69
+ // 存储嵌套 FormGroup 的错误消息(如果需要)
70
+ if (fieldConfig.errorMessages) {
71
+ this.errorMessageStore[name][key] = fieldConfig.errorMessages;
72
+ }
73
+ }
74
+ else {
75
+ // 处理普通字段
76
+ groupConfig[key] = [
77
+ {
78
+ value: fieldConfig.value,
79
+ disabled: (_a = fieldConfig.disabled) !== null && _a !== void 0 ? _a : false,
80
+ },
81
+ (_c = (_b = fieldConfig.validators) === null || _b === void 0 ? void 0 : _b.call(fieldConfig)) !== null && _c !== void 0 ? _c : [],
82
+ ];
83
+ if (fieldConfig.errorMessages) {
84
+ this.errorMessageStore[name][key] = fieldConfig.errorMessages;
85
+ }
41
86
  }
42
87
  });
43
88
  if (options === null || options === void 0 ? void 0 : options.labelWidth) {
@@ -47,6 +92,7 @@ export class AntdFormService {
47
92
  this.labelAlign = options.labelAlign;
48
93
  }
49
94
  this.formStore[name] = this.fb.group(groupConfig);
95
+ this.formRegisterStore[name] = true;
50
96
  this.setCSSVariablesToTarget(name);
51
97
  return this.formStore[name];
52
98
  }
@@ -56,6 +102,46 @@ export class AntdFormService {
56
102
  var _a;
57
103
  (_a = this.formStore[name]) === null || _a === void 0 ? void 0 : _a.reset(value);
58
104
  }
105
+ // 检测表单是否完成注册
106
+ isFormRegistered(name) {
107
+ var _a;
108
+ return (_a = this.formRegisterStore[name]) !== null && _a !== void 0 ? _a : false;
109
+ }
110
+ // 销毁对应的表单
111
+ destory(names) {
112
+ names.forEach((name) => {
113
+ // 2. 清理错误消息存储
114
+ if (this.errorMessageStore[name]) {
115
+ delete this.errorMessageStore[name];
116
+ }
117
+ // 3. 清理表单注册标记
118
+ if (this.formRegisterStore[name]) {
119
+ delete this.formRegisterStore[name];
120
+ }
121
+ // 4. 清理表单组(Angular 会自动处理 FormGroup 的清理)
122
+ if (this.formStore[name]) {
123
+ delete this.formStore[name];
124
+ }
125
+ });
126
+ }
127
+ // 根据路径获取嵌套的 FormGroup
128
+ getNestedFormGroup(formGroup, path) {
129
+ if (!path || path.trim() === "") {
130
+ return formGroup;
131
+ }
132
+ const pathParts = path.split(".").filter((p) => p.trim() !== "");
133
+ let currentGroup = formGroup;
134
+ for (const part of pathParts) {
135
+ if (!currentGroup || !(currentGroup instanceof FormGroup)) {
136
+ return null;
137
+ }
138
+ currentGroup = currentGroup.get(part);
139
+ if (!currentGroup || !(currentGroup instanceof FormGroup)) {
140
+ return null;
141
+ }
142
+ }
143
+ return currentGroup instanceof FormGroup ? currentGroup : null;
144
+ }
59
145
  // 批量添加字段配置
60
146
  addFieldsConfig(formName, fieldsConfig, options) {
61
147
  var _a;
@@ -65,8 +151,8 @@ export class AntdFormService {
65
151
  failed: [],
66
152
  };
67
153
  // 1. 验证表单是否存在
68
- const formGroup = this.formStore[formName];
69
- if (!formGroup) {
154
+ const rootFormGroup = this.formStore[formName];
155
+ if (!rootFormGroup) {
70
156
  // 如果表单不存在,所有字段都失败
71
157
  Object.keys(fieldsConfig).forEach((fieldName) => {
72
158
  var _a;
@@ -80,20 +166,41 @@ export class AntdFormService {
80
166
  result.success = false;
81
167
  return result;
82
168
  }
83
- // 2. 初始化 errorMessageStore(如果不存在)
169
+ // 2. 获取目标 FormGroup(支持嵌套路径)
170
+ const targetPath = options === null || options === void 0 ? void 0 : options.targetPath;
171
+ const targetFormGroup = targetPath
172
+ ? this.getNestedFormGroup(rootFormGroup, targetPath)
173
+ : rootFormGroup;
174
+ if (!targetFormGroup) {
175
+ // 如果目标 FormGroup 不存在,所有字段都失败
176
+ Object.keys(fieldsConfig).forEach((fieldName) => {
177
+ var _a;
178
+ const error = targetPath
179
+ ? `Target FormGroup at path "${targetPath}" not found`
180
+ : `FormGroup not found`;
181
+ result.failed.push({
182
+ fieldName,
183
+ error,
184
+ });
185
+ (_a = options === null || options === void 0 ? void 0 : options.onFieldAdded) === null || _a === void 0 ? void 0 : _a.call(options, fieldName, false, error);
186
+ });
187
+ result.success = false;
188
+ return result;
189
+ }
190
+ // 3. 初始化 errorMessageStore(如果不存在)
84
191
  if (!this.errorMessageStore[formName]) {
85
192
  this.errorMessageStore[formName] = {};
86
193
  }
87
- // 3. 批量构建控件配置
194
+ // 4. 批量构建控件配置
88
195
  const controlsToAdd = {};
89
196
  const errorMessagesToAdd = {};
90
- // 4. 遍历所有字段配置,进行验证和构建
197
+ // 5. 遍历所有字段配置,进行验证和构建
91
198
  Object.entries(fieldsConfig).forEach(([fieldName, fieldConfig]) => {
92
199
  var _a, _b, _c, _d, _e;
93
200
  try {
94
- // 4.1 检查字段是否已存在
95
- if (formGroup.get(fieldName)) {
96
- const error = `Field "${fieldName}" already exists`;
201
+ // 5.1 检查字段是否已存在
202
+ if (targetFormGroup.get(fieldName)) {
203
+ const error = `Field "${fieldName}" already exists${targetPath ? ` in "${targetPath}"` : ""}`;
97
204
  result.failed.push({
98
205
  fieldName,
99
206
  error,
@@ -101,20 +208,38 @@ export class AntdFormService {
101
208
  (_a = options === null || options === void 0 ? void 0 : options.onFieldAdded) === null || _a === void 0 ? void 0 : _a.call(options, fieldName, false, error);
102
209
  return;
103
210
  }
104
- // 4.2 创建控件
105
- const controlOptions = {
106
- validators: (_c = (_b = fieldConfig.validators) === null || _b === void 0 ? void 0 : _b.call(fieldConfig)) !== null && _c !== void 0 ? _c : [],
107
- };
108
- const control = this.fb.control(fieldConfig.value, controlOptions);
109
- // 设置 disabled 状态
110
- if (fieldConfig.disabled) {
111
- control.disable();
211
+ // 5.2 创建控件
212
+ let control;
213
+ if (this.isFormGroupConfig(fieldConfig)) {
214
+ // 创建嵌套 FormGroup
215
+ control = this.createNestedFormGroup(fieldConfig.fields, fieldConfig.disabled);
216
+ // 存储嵌套 FormGroup 的错误消息(如果需要)
217
+ if (fieldConfig.errorMessages) {
218
+ const errorMessageKey = targetPath
219
+ ? `${targetPath}.${fieldName}`
220
+ : fieldName;
221
+ errorMessagesToAdd[errorMessageKey] = fieldConfig.errorMessages;
222
+ }
112
223
  }
113
- controlsToAdd[fieldName] = control;
114
- // 存储错误消息
115
- if (fieldConfig.errorMessages) {
116
- errorMessagesToAdd[fieldName] = fieldConfig.errorMessages;
224
+ else {
225
+ // 创建普通 FormControl
226
+ const controlOptions = {
227
+ validators: (_c = (_b = fieldConfig.validators) === null || _b === void 0 ? void 0 : _b.call(fieldConfig)) !== null && _c !== void 0 ? _c : [],
228
+ };
229
+ control = this.fb.control(fieldConfig.value, controlOptions);
230
+ // 设置 disabled 状态
231
+ if (fieldConfig.disabled) {
232
+ control.disable();
233
+ }
234
+ // 存储错误消息
235
+ if (fieldConfig.errorMessages) {
236
+ const errorMessageKey = targetPath
237
+ ? `${targetPath}.${fieldName}`
238
+ : fieldName;
239
+ errorMessagesToAdd[errorMessageKey] = fieldConfig.errorMessages;
240
+ }
117
241
  }
242
+ controlsToAdd[fieldName] = control;
118
243
  result.added.push(fieldName);
119
244
  (_d = options === null || options === void 0 ? void 0 : options.onFieldAdded) === null || _d === void 0 ? void 0 : _d.call(options, fieldName, true);
120
245
  }
@@ -127,18 +252,18 @@ export class AntdFormService {
127
252
  (_e = options === null || options === void 0 ? void 0 : options.onFieldAdded) === null || _e === void 0 ? void 0 : _e.call(options, fieldName, false, errorMessage);
128
253
  }
129
254
  });
130
- // 5. 批量添加到 FormGroup
255
+ // 6. 批量添加到目标 FormGroup
131
256
  if (Object.keys(controlsToAdd).length > 0) {
132
257
  Object.entries(controlsToAdd).forEach(([fieldName, control]) => {
133
- formGroup.addControl(fieldName, control);
258
+ targetFormGroup.addControl(fieldName, control);
134
259
  });
135
- // 6. 批量存储错误消息
260
+ // 7. 批量存储错误消息
136
261
  Object.entries(errorMessagesToAdd).forEach(([key, messages]) => {
137
262
  this.errorMessageStore[formName][key] = messages;
138
263
  });
139
- // 7. 更新表单验证状态
264
+ // 8. 更新表单验证状态
140
265
  if (options === null || options === void 0 ? void 0 : options.updateValueAndValidity) {
141
- formGroup.updateValueAndValidity({
266
+ targetFormGroup.updateValueAndValidity({
142
267
  emitEvent: (_a = options === null || options === void 0 ? void 0 : options.emitEvent) !== null && _a !== void 0 ? _a : true,
143
268
  });
144
269
  }
@@ -334,10 +459,17 @@ export class AntdFormService {
334
459
  let appliedCount = 0;
335
460
  dom.forEach((item) => {
336
461
  const target = item;
337
- if (target.style.width !== this.labelWidth ||
338
- target.style.textAlign !== this.labelAlign) {
339
- target.style.width = this.labelWidth;
340
- target.style.textAlign = this.labelAlign;
462
+ if (target.closest(".pro-table-container")) {
463
+ return;
464
+ }
465
+ const customWidth = target.getAttribute("custom-width");
466
+ const customAlign = target.getAttribute("custom-align");
467
+ const finalWidth = customWidth || this.labelWidth;
468
+ const finalTextAlign = customAlign || this.labelAlign;
469
+ if (target.style.width !== finalWidth ||
470
+ target.style.textAlign !== finalTextAlign) {
471
+ target.style.width = finalWidth;
472
+ target.style.textAlign = finalTextAlign;
341
473
  appliedCount++;
342
474
  }
343
475
  });
@@ -406,4 +538,4 @@ AntdFormService.decorators = [
406
538
  AntdFormService.ctorParameters = () => [
407
539
  { type: FormBuilder }
408
540
  ];
409
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50ZC1mb3JtLmpzIiwic291cmNlUm9vdCI6IkQ6L3Byb2plY3RzL3Zwcy1mcm9udC9Gcm9udC9EYXNQTVNXZWIvbGliL3Byby10YWJsZS9zcmMvIiwic291cmNlcyI6WyJsaWIvcGFnZS1wdWJsaWMvYW50ZC1mb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUdMLFdBQVcsRUFDWCxTQUFTLEdBRVYsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQTREcEUsZ0RBQWdEO0FBR2hELE1BQU0sT0FBTyxlQUFlO0lBc0IxQixpREFBaUQ7SUFDakQsWUFBb0IsRUFBZTtRQUFmLE9BQUUsR0FBRixFQUFFLENBQWE7UUF0Qm5DLGlEQUFpRDtRQUNqRCxjQUFTLEdBQThCLEVBQUUsQ0FBQztRQUMxQyxtQkFBYyxHQUFtQixRQUFRLENBQUM7UUFFMUMsaURBQWlEO1FBQ3pDLGVBQVUsR0FBVyxPQUFPLENBQUM7UUFDN0IsZUFBVSxHQUFXLE9BQU8sQ0FBQztRQUM3QixtQkFBYyxHQUFxQyxFQUFFLENBQUM7UUFDdEQsc0JBQWlCLEdBR3JCLEVBQUUsQ0FBQztRQUNDLGdCQUFXLEdBQUcsV0FBVyxDQUFDO1FBQ2pCLHlCQUFvQixHQUF1QjtZQUMxRCxRQUFRLEVBQUUsU0FBUztZQUNuQixTQUFTLEVBQUUsUUFBUTtZQUNuQixTQUFTLEVBQUUsUUFBUTtZQUNuQixLQUFLLEVBQUUsWUFBWTtZQUNuQixPQUFPLEVBQUUsU0FBUztTQUNuQixDQUFDO0lBR29DLENBQUM7SUFFdkMscURBQXFEO0lBRXJELFFBQVE7SUFDUixlQUFlLENBQ2IsSUFBWSxFQUNaLE1BQWtCLEVBQ2xCLE9BQXNEO1FBRXRELE1BQU0sV0FBVyxHQUF3QixFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLGlCQUFpQixD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RyxDQUFDLEVBQUUsRUFBRTtZQUMzQyxpQkFBaUI7WUFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3pCLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDakQ7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxVQUFVO0lBQ0YsNEJBQTRCLENBQ2xDLE1BQXlDLEVBQ3pDLE9BQTJCLEVBQzNCLE9BQXNCO1FBRXRCLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFFeEMsSUFBSSxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxRQUFRLEtBQUksSUFBSSxFQUFFO1lBQzdCLGFBQWEsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUNwRTtRQUVELElBQUksQ0FBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsb0JBQW9CLE1BQUssS0FBSyxFQUFFO1lBQzNDLGFBQWEsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztTQUM1RDtRQUVELElBQUksT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFdBQVcsRUFBRTtZQUN4QixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3ZCO1FBRUQsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLENBQUM7Ozs7WUFyZkYsVUFBVSxTQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7O1lBbkVoQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7XHJcbiAgQWJzdHJhY3RDb250cm9sLFxyXG4gIEFic3RyYWN0Q29udHJvbE9wdGlvbnMsXHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIFZhbGlkYXRvckZuLFxyXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcblxyXG4vLyA9PT09PT09PT09PT09PT09PT09PSDnsbvlnovlrprkuYkgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbi8vIOWtl+autemUmeivr+a2iOaBr+exu+Wei++8iOWtl+espuS4suaIluWHveaVsO+8iVxyXG5leHBvcnQgdHlwZSBGaWVsZEVycm9yTWVzc2FnZSA9XHJcbiAgfCBzdHJpbmdcclxuICB8ICgoY29udGV4dDogeyBjb250cm9sOiBBYnN0cmFjdENvbnRyb2w7IGNvbnRyb2xOYW1lOiBzdHJpbmcgfSkgPT4gc3RyaW5nKTtcclxuXHJcbi8vIOWtl+autemUmeivr+a2iOaBr+mbhuWQiFxyXG5leHBvcnQgdHlwZSBGaWVsZEVycm9yTWVzc2FnZXMgPSBSZWNvcmQ8c3RyaW5nLCBGaWVsZEVycm9yTWVzc2FnZT47XHJcblxyXG4vLyDlrZfmrrXphY3nva5cclxuZXhwb3J0IHR5cGUgRmllbGRDb25maWcgPSB7XHJcbiAgdmFsdWU6IGFueTtcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgdmFsaWRhdG9ycz86ICgpID0+IFZhbGlkYXRvckZuW107XHJcbiAgZXJyb3JNZXNzYWdlcz86IEZpZWxkRXJyb3JNZXNzYWdlcztcclxufTtcclxuXHJcbi8vIOihqOWNleS/ruaUueexu+Wei1xyXG5leHBvcnQgdHlwZSBGb3JtTW9kaWZ5VHlwZSA9IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiO1xyXG5cclxuLy8g6KGo5Y2V6YWN572uXHJcbmV4cG9ydCB0eXBlIEZvcm1Db25maWcgPSBSZWNvcmQ8c3RyaW5nLCBGaWVsZENvbmZpZz47XHJcblxyXG4vLyDnm5HlkKzpgInpoblcclxuZXhwb3J0IHR5cGUgV2F0Y2hPcHRpb25zID0ge1xyXG4gIGRlYm91bmNlPzogbnVtYmVyO1xyXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkPzogYm9vbGVhbjtcclxuICBlbWl0SW5pdGlhbD86IGJvb2xlYW47XHJcbn07XHJcblxyXG4vLyDmibnph4/mt7vliqDlrZfmrrXphY3nva7pgInpoblcclxuZXhwb3J0IHR5cGUgQWRkRmllbGRzQ29uZmlnT3B0aW9ucyA9IHtcclxuICBlbWl0RXZlbnQ/OiBib29sZWFuO1xyXG4gIHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHk/OiBib29sZWFuO1xyXG4gIG9uRmllbGRBZGRlZD86IChmaWVsZE5hbWU6IHN0cmluZywgc3VjY2VzczogYm9vbGVhbiwgZXJyb3I/OiBzdHJpbmcpID0+IHZvaWQ7IC8vIOavj+S4quWtl+autea3u+WKoOeahOWbnuiwg1xyXG59O1xyXG5cclxuLy8g5om56YeP5re75Yqg5a2X5q616YWN572u57uT5p6cXHJcbmV4cG9ydCB0eXBlIEFkZEZpZWxkc0NvbmZpZ1Jlc3VsdCA9IHtcclxuICBzdWNjZXNzOiBib29sZWFuO1xyXG4gIGFkZGVkOiBzdHJpbmdbXTsgLy8g5oiQ5Yqf5re75Yqg55qE5a2X5q615ZCN5YiX6KGoXHJcbiAgZmFpbGVkOiBBcnJheTx7IGZpZWxkTmFtZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH0+OyAvLyDlpLHotKXnmoTlrZfmrrXlj4rplJnor6/kv6Hmga9cclxufTtcclxuXHJcbi8vIOaJuemHj+WIoOmZpOWtl+autemFjee9rumAiemhuVxyXG5leHBvcnQgdHlwZSBSZW1vdmVGaWVsZHNDb25maWdPcHRpb25zID0ge1xyXG4gIGVtaXRFdmVudD86IGJvb2xlYW47XHJcbiAgb25GaWVsZFJlbW92ZWQ/OiAoZmllbGROYW1lOiBzdHJpbmcsIHN1Y2Nlc3M6IGJvb2xlYW4sIGVycm9yPzogc3RyaW5nKSA9PiB2b2lkOyAvLyDmr4/kuKrlrZfmrrXliKDpmaTnmoTlm57osINcclxufTtcclxuXHJcbi8vIOaJuemHj+WIoOmZpOWtl+autemFjee9rue7k+aenFxyXG5leHBvcnQgdHlwZSBSZW1vdmVGaWVsZHNDb25maWdSZXN1bHQgPSB7XHJcbiAgc3VjY2VzczogYm9vbGVhbjtcclxuICByZW1vdmVkOiBzdHJpbmdbXTsgLy8g5oiQ5Yqf5Yig6Zmk55qE5a2X5q615ZCN5YiX6KGoXHJcbiAgZmFpbGVkOiBBcnJheTx7IGZpZWxkTmFtZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH0+OyAvLyDlpLHotKXnmoTlrZfmrrXlj4rplJnor6/kv6Hmga9cclxufTtcclxuXHJcbi8vID09PT09PT09PT09PT09PT09PT09IOacjeWKoeexuyA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiBcInJvb3RcIiB9KVxyXG5leHBvcnQgY2xhc3MgQW50ZEZvcm1TZXJ2aWNlIHtcclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSDlhazlhbHlsZ7mgKcgPT09PT09PT09PT09PT09PT09PT1cclxuICBmb3JtU3RvcmU6IFJlY29yZDxzdHJpbmcsIEZvcm1Hcm91cD4gPSB7fTtcclxuICBmb3JtTW9kaWZ5VHlwZTogRm9ybU1vZGlmeVR5cGUgPSBcImNyZWF0ZVwiO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSDnp4HmnInlsZ7mgKcgPT09PT09PT09PT09PT09PT09PT1cclxuICBwcml2YXRlIGxhYmVsV2lkdGg6IHN0cmluZyA9IFwiMTIwcHhcIjtcclxuICBwcml2YXRlIGxhYmVsQWxpZ246IHN0cmluZyA9IFwicmlnaHRcIjtcclxuICBwcml2YXRlIGxhYmVsT2JzZXJ2ZXJzOiBSZWNvcmQ8c3RyaW5nLCBNdXRhdGlvbk9ic2VydmVyPiA9IHt9O1xyXG4gIHByaXZhdGUgZXJyb3JNZXNzYWdlU3RvcmU6IFJlY29yZDxcclxuICAgIHN0cmluZyxcclxuICAgIFJlY29yZDxzdHJpbmcsIEZpZWxkRXJyb3JNZXNzYWdlcz5cclxuICA+ID0ge307XHJcbiAgcHJpdmF0ZSBjbGFzc1ByZWZpeCA9IFwiYW50LWZvcm0tXCI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0RXJyb3JNZXNzYWdlczogRmllbGRFcnJvck1lc3NhZ2VzID0ge1xyXG4gICAgcmVxdWlyZWQ6IFwi6K+l5a2X5q615Li65b+F5aGr6aG5XCIsXHJcbiAgICBtaW5sZW5ndGg6IFwi6L6T5YWl6ZW/5bqm5LiN6LazXCIsXHJcbiAgICBtYXhsZW5ndGg6IFwi6L6T5YWl6ZW/5bqm6LaF6ZmQXCIsXHJcbiAgICBlbWFpbDogXCLor7fovpPlhaXlkIjms5XnmoTpgq7nrrHlnLDlnYBcIixcclxuICAgIHBhdHRlcm46IFwi6L6T5YWl5qC85byP5LiN5q2j56GuXCIsXHJcbiAgfTtcclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0g5p6E6YCg5Ye95pWwID09PT09PT09PT09PT09PT09PT09XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHt9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IOihqOWNleWIm+W7uuWSjOWIneWni+WMliA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvLyDliJ3lp4vljJbooajljZVcclxuICBjcmVhdGVGb3JtR3JvdXAoXHJcbiAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICBjb25maWc6IEZvcm1Db25maWcsXHJcbiAgICBvcHRpb25zPzogeyBsYWJlbFdpZHRoPzogc3RyaW5nOyBsYWJlbEFsaWduPzogc3RyaW5nIH1cclxuICApOiBGb3JtR3JvdXAge1xyXG4gICAgY29uc3QgZ3JvdXBDb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlU3RvcmVbbmFtZV0gPSB7fTtcclxuXHJcbiAgICBPYmplY3QuZW50cmllcyhjb25maWcpLmZvckVhY2goKFtrZXksIGZpZWxkQ29uZmlnXSkgPT4ge1xyXG4gICAgICBncm91cENvbmZpZ1trZXldID0gW1xyXG4gICAgICAgIHsgdmFsdWU6IGZpZWxkQ29uZmlnLnZhbHVlLCBkaXNhYmxlZDogZmllbGRDb25maWcuZGlzYWJsZWQgPz8gZmFsc2UgfSxcclxuICAgICAgICBmaWVsZENvbmZpZy52YWxpZGF0b3JzPy4oKSA/PyBbXSxcclxuICAgICAgXTtcclxuICAgICAgaWYgKGZpZWxkQ29uZmlnLmVycm9yTWVzc2FnZXMpIHtcclxuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZVN0b3JlW25hbWVdW2tleV0gPSBmaWVsZENvbmZpZy5lcnJvck1lc3NhZ2VzO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAob3B0aW9ucz8ubGFiZWxXaWR0aCkge1xyXG4gICAgICB0aGlzLmxhYmVsV2lkdGggPSBvcHRpb25zLmxhYmVsV2lkdGg7XHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9ucz8ubGFiZWxBbGlnbikge1xyXG4gICAgICB0aGlzLmxhYmVsQWxpZ24gPSBvcHRpb25zLmxhYmVsQWxpZ247XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm1TdG9yZVtuYW1lXSA9IHRoaXMuZmIuZ3JvdXAoZ3JvdXBDb25maWcpO1xyXG4gICAgdGhpcy5zZXRDU1NWYXJpYWJsZXNUb1RhcmdldChuYW1lKTtcclxuICAgIHJldHVybiB0aGlzLmZvcm1TdG9yZVtuYW1lXTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IOihqOWNleaTjeS9nCA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvLyDph43nva7ooajljZVcclxuICByZXNldEZvcm1Hcm91cChuYW1lOiBzdHJpbmcsIHZhbHVlPzogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmZvcm1TdG9yZVtuYW1lXT8ucmVzZXQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLy8g5om56YeP5re75Yqg5a2X5q616YWN572uXHJcbiAgYWRkRmllbGRzQ29uZmlnKFxyXG4gICAgZm9ybU5hbWU6IHN0cmluZyxcclxuICAgIGZpZWxkc0NvbmZpZzogRm9ybUNvbmZpZyxcclxuICAgIG9wdGlvbnM/OiBBZGRGaWVsZHNDb25maWdPcHRpb25zXHJcbiAgKTogQWRkRmllbGRzQ29uZmlnUmVzdWx0IHtcclxuICAgIGNvbnN0IHJlc3VsdDogQWRkRmllbGRzQ29uZmlnUmVzdWx0ID0ge1xyXG4gICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICBhZGRlZDogW10sXHJcbiAgICAgIGZhaWxlZDogW10sXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIDEuIOmqjOivgeihqOWNleaYr+WQpuWtmOWcqFxyXG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5mb3JtU3RvcmVbZm9ybU5hbWVdO1xyXG4gICAgaWYgKCFmb3JtR3JvdXApIHtcclxuICAgICAgLy8g5aaC5p6c6KGo5Y2V5LiN5a2Y5Zyo77yM5omA5pyJ5a2X5q616YO95aSx6LSlXHJcbiAgICAgIE9iamVjdC5rZXlzKGZpZWxkc0NvbmZpZykuZm9yRWFjaCgoZmllbGROYW1lKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSBgRm9ybSBcIiR7Zm9ybU5hbWV9XCIgbm90IGZvdW5kYDtcclxuICAgICAgICByZXN1bHQuZmFpbGVkLnB1c2goe1xyXG4gICAgICAgICAgZmllbGROYW1lLFxyXG4gICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb3B0aW9ucz8ub25GaWVsZEFkZGVkPy4oZmllbGROYW1lLCBmYWxzZSwgZXJyb3IpO1xyXG4gICAgICB9KTtcclxuICAgICAgcmVzdWx0LnN1Y2Nlc3MgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyAyLiDliJ3lp4vljJYgZXJyb3JNZXNzYWdlU3RvcmXvvIjlpoLmnpzkuI3lrZjlnKjvvIlcclxuICAgIGlmICghdGhpcy5lcnJvck1lc3NhZ2VTdG9yZVtmb3JtTmFtZV0pIHtcclxuICAgICAgdGhpcy5lcnJvck1lc3NhZ2VTdG9yZVtmb3JtTmFtZV0gPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAzLiDmibnph4/mnoTlu7rmjqfku7bphY3nva5cclxuICAgIGNvbnN0IGNvbnRyb2xzVG9BZGQ6IFJlY29yZDxzdHJpbmcsIEFic3RyYWN0Q29udHJvbD4gPSB7fTtcclxuICAgIGNvbnN0IGVycm9yTWVzc2FnZXNUb0FkZDogUmVjb3JkPHN0cmluZywgRmllbGRFcnJvck1lc3NhZ2VzPiA9IHt9O1xyXG5cclxuICAgIC8vIDQuIOmBjeWOhuaJgOacieWtl+autemFjee9ru+8jOi/m+ihjOmqjOivgeWSjOaehOW7ulxyXG4gICAgT2JqZWN0LmVudHJpZXMoZmllbGRzQ29uZmlnKS5mb3JFYWNoKChbZmllbGROYW1lLCBmaWVsZENvbmZpZ10pID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAvLyA0LjEg5qOA5p+l5a2X5q615piv5ZCm5bey5a2Y5ZyoXHJcbiAgICAgICAgaWYgKGZvcm1Hcm91cC5nZXQoZmllbGROYW1lKSkge1xyXG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBgRmllbGQgXCIke2ZpZWxkTmFtZX1cIiBhbHJlYWR5IGV4aXN0c2A7XHJcbiAgICAgICAgICByZXN1bHQuZmFpbGVkLnB1c2goe1xyXG4gICAgICAgICAgICBmaWVsZE5hbWUsXHJcbiAgICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBvcHRpb25zPy5vbkZpZWxkQWRkZWQ/LihmaWVsZE5hbWUsIGZhbHNlLCBlcnJvcik7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyA0LjIg5Yib5bu65o6n5Lu2XHJcbiAgICAgICAgY29uc3QgY29udHJvbE9wdGlvbnM6IEFic3RyYWN0Q29udHJvbE9wdGlvbnMgPSB7XHJcbiAgICAgICAgICB2YWxpZGF0b3JzOiBmaWVsZENvbmZpZy52YWxpZGF0b3JzPy4oKSA/PyBbXSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZiLmNvbnRyb2woXHJcbiAgICAgICAgICBmaWVsZENvbmZpZy52YWx1ZSxcclxuICAgICAgICAgIGNvbnRyb2xPcHRpb25zXHJcbiAgICAgICAgKTtcclxuICAgICAgICAvLyDorr7nva4gZGlzYWJsZWQg54q25oCBXHJcbiAgICAgICAgaWYgKGZpZWxkQ29uZmlnLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICBjb250cm9sLmRpc2FibGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29udHJvbHNUb0FkZFtmaWVsZE5hbWVdID0gY29udHJvbDtcclxuXHJcbiAgICAgICAgLy8g5a2Y5YKo6ZSZ6K+v5raI5oGvXHJcbiAgICAgICAgaWYgKGZpZWxkQ29uZmlnLmVycm9yTWVzc2FnZXMpIHtcclxuICAgICAgICAgIGVycm9yTWVzc2FnZXNUb0FkZFtmaWVsZE5hbWVdID0gZmllbGRDb25maWcuZXJyb3JNZXNzYWdlcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlc3VsdC5hZGRlZC5wdXNoKGZpZWxkTmFtZSk7XHJcbiAgICAgICAgb3B0aW9ucz8ub25GaWVsZEFkZGVkPy4oZmllbGROYW1lLCB0cnVlKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9XHJcbiAgICAgICAgICBlcnJvcj8ubWVzc2FnZSB8fCBlcnJvcj8udG9TdHJpbmcoKSB8fCBcIlVua25vd24gZXJyb3JcIjtcclxuICAgICAgICByZXN1bHQuZmFpbGVkLnB1c2goe1xyXG4gICAgICAgICAgZmllbGROYW1lLFxyXG4gICAgICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBvcHRpb25zPy5vbkZpZWxkQWRkZWQ/LihmaWVsZE5hbWUsIGZhbHNlLCBlcnJvck1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyA1LiDmibnph4/mt7vliqDliLAgRm9ybUdyb3VwXHJcbiAgICBpZiAoT2JqZWN0LmtleXMoY29udHJvbHNUb0FkZCkubGVuZ3RoID4gMCkge1xyXG4gICAgICBPYmplY3QuZW50cmllcyhjb250cm9sc1RvQWRkKS5mb3JFYWNoKChbZmllbGROYW1lLCBjb250cm9sXSkgPT4ge1xyXG4gICAgICAgIGZvcm1Hcm91cC5hZGRDb250cm9sKGZpZWxkTmFtZSwgY29udHJvbCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gNi4g5om56YeP5a2Y5YKo6ZSZ6K+v5raI5oGvXHJcbiAgICAgIE9iamVjdC5lbnRyaWVzKGVycm9yTWVzc2FnZXNUb0FkZCkuZm9yRWFjaCgoW2tleSwgbWVzc2FnZXNdKSA9PiB7XHJcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VTdG9yZVtmb3JtTmFtZV1ba2V5XSA9IG1lc3NhZ2VzO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIDcuIOabtOaWsOihqOWNlemqjOivgeeKtuaAgVxyXG4gICAgICBpZiAob3B0aW9ucz8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSkge1xyXG4gICAgICAgIGZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtcclxuICAgICAgICAgIGVtaXRFdmVudDogb3B0aW9ucz8uZW1pdEV2ZW50ID8/IHRydWUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyA5LiDliKTmlq3mlbTkvZPmmK/lkKbmiJDlip9cclxuICAgIHJlc3VsdC5zdWNjZXNzID0gcmVzdWx0LmZhaWxlZC5sZW5ndGggPT09IDA7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vIOaJuemHj+WIoOmZpOWtl+autemFjee9rlxyXG4gIHJlbW92ZUZpZWxkc0NvbmZpZyhcclxuICAgIGZvcm1OYW1lOiBzdHJpbmcsXHJcbiAgICBmaWVsZE5hbWVzOiBzdHJpbmdbXSxcclxuICAgIG9wdGlvbnM/OiBSZW1vdmVGaWVsZHNDb25maWdPcHRpb25zXHJcbiAgKTogUmVtb3ZlRmllbGRzQ29uZmlnUmVzdWx0IHtcclxuICAgIGNvbnN0IHJlc3VsdDogUmVtb3ZlRmllbGRzQ29uZmlnUmVzdWx0ID0ge1xyXG4gICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICByZW1vdmVkOiBbXSxcclxuICAgICAgZmFpbGVkOiBbXSxcclxuICAgIH07XHJcblxyXG4gICAgLy8gMS4g6aqM6K+B6KGo5Y2V5piv5ZCm5a2Y5ZyoXHJcbiAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmZvcm1TdG9yZVtmb3JtTmFtZV07XHJcbiAgICBpZiAoIWZvcm1Hcm91cCkge1xyXG4gICAgICBmaWVsZE5hbWVzLmZvckVhY2goKGZpZWxkTmFtZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gYEZvcm0gXCIke2Zvcm1OYW1lfVwiIG5vdCBmb3VuZGA7XHJcbiAgICAgICAgcmVzdWx0LmZhaWxlZC5wdXNoKHtcclxuICAgICAgICAgIGZpZWxkTmFtZSxcclxuICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9wdGlvbnM/Lm9uRmllbGRSZW1vdmVkPy4oZmllbGROYW1lLCBmYWxzZSwgZXJyb3IpO1xyXG4gICAgICB9KTtcclxuICAgICAgcmVzdWx0LnN1Y2Nlc3MgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyAyLiDmibnph4/mlLbpm4bpnIDopoHmuIXnkIbnmoTkv6Hmga9cclxuICAgIGNvbnN0IGZpZWxkc1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgY29uc3QgZXJyb3JNZXNzYWdlS2V5c1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIC8vIDMuIOmqjOivgeavj+S4quWtl+auteW5tuaUtumbhuS/oeaBr1xyXG4gICAgZmllbGROYW1lcy5mb3JFYWNoKChmaWVsZE5hbWUpID0+IHtcclxuICAgICAgY29uc3QgY29udHJvbCA9IGZvcm1Hcm91cC5nZXQoZmllbGROYW1lKTtcclxuXHJcbiAgICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gYEZpZWxkIFwiJHtmaWVsZE5hbWV9XCIgbm90IGZvdW5kYDtcclxuICAgICAgICByZXN1bHQuZmFpbGVkLnB1c2goe1xyXG4gICAgICAgICAgZmllbGROYW1lLFxyXG4gICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb3B0aW9ucz8ub25GaWVsZFJlbW92ZWQ/LihmaWVsZE5hbWUsIGZhbHNlLCBlcnJvcik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyDmlLbpm4bplJnor6/mtojmga/plK5cclxuICAgICAgZXJyb3JNZXNzYWdlS2V5c1RvUmVtb3ZlLnB1c2goZmllbGROYW1lKTtcclxuICAgICAgZmllbGRzVG9SZW1vdmUucHVzaChmaWVsZE5hbWUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gNC4g5om56YeP5omn6KGM5Yig6Zmk5pON5L2cXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyA0LjEg5LuOIEZvcm1Hcm91cCDkuK3np7vpmaTmjqfku7ZcclxuICAgICAgZmllbGRzVG9SZW1vdmUuZm9yRWFjaCgoZmllbGROYW1lKSA9PiB7XHJcbiAgICAgICAgZm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woZmllbGROYW1lKTtcclxuICAgICAgICByZXN1bHQucmVtb3ZlZC5wdXNoKGZpZWxkTmFtZSk7XHJcbiAgICAgICAgb3B0aW9ucz8ub25GaWVsZFJlbW92ZWQ/LihmaWVsZE5hbWUsIHRydWUpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIDQuMiDmibnph4/liKDpmaTplJnor6/mtojmga9cclxuICAgICAgaWYgKHRoaXMuZXJyb3JNZXNzYWdlU3RvcmVbZm9ybU5hbWVdKSB7XHJcbiAgICAgICAgZXJyb3JNZXNzYWdlS2V5c1RvUmVtb3ZlLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgZGVsZXRlIHRoaXMuZXJyb3JNZXNzYWdlU3RvcmVbZm9ybU5hbWVdW2tleV07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgLy8g5aaC5p6c5om56YeP5Yig6Zmk6L+H56iL5Lit5Ye66ZSZ77yM5qCH6K6w5Li65aSx6LSlXHJcbiAgICAgIGZpZWxkc1RvUmVtb3ZlLmZvckVhY2goKGZpZWxkTmFtZSkgPT4ge1xyXG4gICAgICAgIGlmICghcmVzdWx0LnJlbW92ZWQuaW5jbHVkZXMoZmllbGROYW1lKSkge1xyXG4gICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID1cclxuICAgICAgICAgICAgZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3I/LnRvU3RyaW5nKCkgfHwgXCJGYWlsZWQgdG8gcmVtb3ZlIGZpZWxkXCI7XHJcbiAgICAgICAgICByZXN1bHQuZmFpbGVkLnB1c2goe1xyXG4gICAgICAgICAgICBmaWVsZE5hbWUsXHJcbiAgICAgICAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIG9wdGlvbnM/Lm9uRmllbGRSZW1vdmVkPy4oZmllbGROYW1lLCBmYWxzZSwgZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDUuIOWIpOaWreaVtOS9k+aYr+WQpuaIkOWKn1xyXG4gICAgcmVzdWx0LnN1Y2Nlc3MgPSByZXN1bHQuZmFpbGVkLmxlbmd0aCA9PT0gMDtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8g5bGA6YOo6LWL5YC8XHJcbiAgcGF0Y2hGb3JtVmFsdWVzKFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxyXG4gICAgb3B0aW9ucz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9XHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmZvcm1TdG9yZVtuYW1lXTtcclxuICAgIGlmICghZm9ybUdyb3VwKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBgW0FudGRGb3JtU2VydmljZV0gcGF0Y2hGb3JtVmFsdWVzOiBmb3JtIFwiJHtuYW1lfVwiIG5vdCBmb3VuZC5gXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBmb3JtR3JvdXAucGF0Y2hWYWx1ZSh2YWx1ZXMsIHtcclxuICAgICAgZW1pdEV2ZW50OiBvcHRpb25zPy5lbWl0RXZlbnQgPz8gdHJ1ZSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g6KGo5Y2V5qCh6aqM77yI6Ieq5Yqo6L+H5ruk5YaF6YOo5a2X5q6177yJXHJcbiAgdmFsaWRhdGVGb3JtKFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgb3B0aW9ucz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbjsgb25seVNlbGY/OiBib29sZWFuIH1cclxuICApOiBib29sZWFuIHwgUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICBpZiAodGhpcy5mb3JtU3RvcmVbbmFtZV0udmFsaWQpIHtcclxuICAgICAgY29uc3QgcmF3VmFsdWUgPSB0aGlzLmZvcm1TdG9yZVtuYW1lXS5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgICByZXR1cm4gdGhpcy5leGNsdWRlSW50ZXJuYWxGaWVsZHMocmF3VmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g6YCS5b2S5qCh6aqM5omA5pyJ5o6n5Lu2XHJcbiAgICAgIHRoaXMubWFya0FsbENvbnRyb2xzQXNEaXJ0eShcclxuICAgICAgICB0aGlzLmZvcm1TdG9yZVtuYW1lXSxcclxuICAgICAgICBvcHRpb25zPy5lbWl0RXZlbnQgPz8gdHJ1ZSxcclxuICAgICAgICBvcHRpb25zPy5vbmx5U2VsZiA/PyBmYWxzZVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDpgJLlvZLmoIforrDmiYDmnInml6DmlYjmjqfku7bkuLogZGlydHlcclxuICBwcml2YXRlIG1hcmtBbGxDb250cm9sc0FzRGlydHkoXHJcbiAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsXHJcbiAgICBlbWl0RXZlbnQ6IGJvb2xlYW4sXHJcbiAgICBvbmx5U2VsZjogYm9vbGVhblxyXG4gICk6IHZvaWQge1xyXG4gICAgaWYgKGNvbnRyb2wuaW52YWxpZCkge1xyXG4gICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7XHJcbiAgICAgICAgZW1pdEV2ZW50LFxyXG4gICAgICAgIG9ubHlTZWxmLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlpoLmnpzmmK8gRm9ybUdyb3Vw77yM6YCS5b2S5aSE55CG5omA5pyJ5a2Q5o6n5Lu2XHJcbiAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xyXG4gICAgICBPYmplY3QudmFsdWVzKGNvbnRyb2wuY29udHJvbHMpLmZvckVhY2goKGNoaWxkQ29udHJvbCkgPT4ge1xyXG4gICAgICAgIHRoaXMubWFya0FsbENvbnRyb2xzQXNEaXJ0eShjaGlsZENvbnRyb2wsIGVtaXRFdmVudCwgb25seVNlbGYpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IOmUmeivr+a2iOaBr+ebuOWFsyA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvLyDojrflj5blrZfmrrXpppbmnaHplJnor6/mj5DnpLpcclxuICBnZXRGaWVsZEVycm9yTWVzc2FnZShuYW1lOiBzdHJpbmcsIGNvbnRyb2xOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5mb3JtU3RvcmVbbmFtZV07XHJcbiAgICBpZiAoIWZvcm1Hcm91cCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFtBbnRkRm9ybVNlcnZpY2VdIGdldEZpZWxkRXJyb3JNZXNzYWdlOiBmb3JtIFwiJHtuYW1lfVwiIG5vdCBmb3VuZC5gXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY29udHJvbCA9IGZvcm1Hcm91cC5nZXQoY29udHJvbE5hbWUpO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBgW0FudGRGb3JtU2VydmljZV0gZ2V0RmllbGRFcnJvck1lc3NhZ2U6IGNvbnRyb2wgXCIke2NvbnRyb2xOYW1lfVwiIG5vdCBmb3VuZCBpbiBmb3JtIFwiJHtuYW1lfVwiLmBcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgICBpZiAoIWNvbnRyb2wuZXJyb3JzKSB7XHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOS7jiBlcnJvck1lc3NhZ2VTdG9yZSDojrflj5bplJnor6/mtojmga/phY3nva5cclxuICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSB0aGlzLmVycm9yTWVzc2FnZVN0b3JlW25hbWVdPy5bY29udHJvbE5hbWVdO1xyXG4gICAgY29uc3QgbWVyZ2VkTWVzc2FnZXMgPSB7XHJcbiAgICAgIC4uLnRoaXMuZGVmYXVsdEVycm9yTWVzc2FnZXMsXHJcbiAgICAgIC4uLihlcnJvck1lc3NhZ2VzID8/IHt9KSxcclxuICAgIH07XHJcblxyXG4gICAgZm9yIChjb25zdCBlcnJvcktleSBvZiBPYmplY3Qua2V5cyhjb250cm9sLmVycm9ycykpIHtcclxuICAgICAgY29uc3QgbWVzc2FnZSA9IG1lcmdlZE1lc3NhZ2VzW2Vycm9yS2V5XTtcclxuICAgICAgaWYgKG1lc3NhZ2UpIHtcclxuICAgICAgICAvLyDkuI3lho3mlK/mjIHlh73mlbDlvaLlvI/vvIzlj6rov5Tlm57lrZfnrKbkuLJcclxuICAgICAgICByZXR1cm4gdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlIDogXCJcIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSDnm5HlkKznm7jlhbMgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgLy8g55uR5ZCs6KGo5Y2V5omA5pyJ5a2X5q615Y+Y5pu0XHJcbiAgd2F0Y2hGb3JtQ2hhbmdlczxUID0gYW55PihcclxuICAgIG5hbWU6IHN0cmluZyxcclxuICAgIGhhbmRsZXI6ICh2YWx1ZTogVCkgPT4gdm9pZCxcclxuICAgIG9wdGlvbnM/OiBXYXRjaE9wdGlvbnNcclxuICApOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5mb3JtU3RvcmVbbmFtZV07XHJcbiAgICBpZiAoIWZvcm1Hcm91cCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFtBbnRkRm9ybVNlcnZpY2VdIHdhdGNoRm9ybUNoYW5nZXM6IGZvcm0gXCIke25hbWV9XCIgbm90IGZvdW5kLmBcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zZXR1cFZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uKGZvcm1Hcm91cCwgaGFuZGxlciwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvLyDnm5HlkKzmjIflrprlrZfmrrXlj5jmm7RcclxuICB3YXRjaEZpZWxkQ2hhbmdlczxUID0gYW55PihcclxuICAgIG5hbWU6IHN0cmluZyxcclxuICAgIGNvbnRyb2xOYW1lOiBzdHJpbmcsXHJcbiAgICBoYW5kbGVyOiAodmFsdWU6IFQpID0+IHZvaWQsXHJcbiAgICBvcHRpb25zPzogV2F0Y2hPcHRpb25zXHJcbiAgKTogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZm9ybVN0b3JlW25hbWVdO1xyXG4gICAgaWYgKCFmb3JtR3JvdXApIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIGBbQW50ZEZvcm1TZXJ2aWNlXSB3YXRjaEZpZWxkQ2hhbmdlczogZm9ybSBcIiR7bmFtZX1cIiBub3QgZm91bmQuYFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGNvbnRyb2xOYW1lKTtcclxuICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFtBbnRkRm9ybVNlcnZpY2VdIHdhdGNoRmllbGRDaGFuZ2VzOiBjb250cm9sIFwiJHtjb250cm9sTmFtZX1cIiBub3QgZm91bmQgaW4gZm9ybSBcIiR7bmFtZX1cIi5gXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc2V0dXBWYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbihjb250cm9sLCBoYW5kbGVyLCBvcHRpb25zKTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IOW3peWFt+aWueazlSA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvLyDojrflj5booajljZXnsbvlkI1cclxuICBnZXRGb3JtQ2xhc3NOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7dGhpcy5jbGFzc1ByZWZpeH0ke25hbWV9YDtcclxuICB9XHJcblxyXG4gIC8vIOiuvue9riBDU1Mg5Y+Y6YeP5Yiw55uu5qCH5YWD57Sg77yI5pSv5oyB5oyB5LmF5YyW55uR5ZCs5Yqo5oCB5re75Yqg55qE5YWD57Sg77yJXHJcbiAgc2V0Q1NTVmFyaWFibGVzVG9UYXJnZXQobmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWxlY3RvciA9IGAuJHt0aGlzLmdldEZvcm1DbGFzc05hbWUobmFtZSl9IC5hbnQtZm9ybS1pdGVtLWxhYmVsYDtcclxuICAgIGNvbnN0IGZvcm1Db250YWluZXJTZWxlY3RvciA9IGAuJHt0aGlzLmdldEZvcm1DbGFzc05hbWUobmFtZSl9YDtcclxuICAgIGNvbnN0IGFwcGx5U3R5bGVzID0gKCk6IGJvb2xlYW4gPT4ge1xyXG4gICAgICBjb25zdCBkb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcclxuICAgICAgaWYgKCFkb20ubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBhcHBsaWVkQ291bnQgPSAwO1xyXG4gICAgICBkb20uZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGl0ZW0gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGFyZ2V0LnN0eWxlLndpZHRoICE9PSB0aGlzLmxhYmVsV2lkdGggfHxcclxuICAgICAgICAgIHRhcmdldC5zdHlsZS50ZXh0QWxpZ24gIT09IHRoaXMubGFiZWxBbGlnblxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGFyZ2V0LnN0eWxlLndpZHRoID0gdGhpcy5sYWJlbFdpZHRoO1xyXG4gICAgICAgICAgdGFyZ2V0LnN0eWxlLnRleHRBbGlnbiA9IHRoaXMubGFiZWxBbGlnbjtcclxuICAgICAgICAgIGFwcGxpZWRDb3VudCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBhcHBsaWVkQ291bnQgPiAwO1xyXG4gICAgfTtcclxuICAgIGlmICh0aGlzLmxhYmVsT2JzZXJ2ZXJzW25hbWVdKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCB0aW1lb3V0OiBhbnkgPSBudWxsO1xyXG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XHJcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRpbWVvdXQpO1xyXG4gICAgICB0aW1lb3V0ID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGFwcGx5U3R5bGVzKCk7XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBmb3JtQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihmb3JtQ29udGFpbmVyU2VsZWN0b3IpO1xyXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShmb3JtQ29udGFpbmVyIHx8IGRvY3VtZW50LmJvZHksIHtcclxuICAgICAgY2hpbGRMaXN0OiB0cnVlLFxyXG4gICAgICBzdWJ0cmVlOiB0cnVlLFxyXG4gICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmxhYmVsT2JzZXJ2ZXJzW25hbWVdID0gb2JzZXJ2ZXI7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSDnp4HmnInmlrnms5UgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgLy8g6L+H5ruk5YaF6YOo5a2X5q6177yI6YCS5b2S5aSE55CG5a+56LGh5ZKM5pWw57uE77yJXHJcbiAgcHJpdmF0ZSBleGNsdWRlSW50ZXJuYWxGaWVsZHModmFsdWU6IGFueSk6IGFueSB7XHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHRoaXMuZXhjbHVkZUludGVybmFsRmllbGRzKGl0ZW0pKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaWx0ZXJlZDogYW55ID0ge307XHJcbiAgICBPYmplY3QuZW50cmllcyh2YWx1ZSkuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xyXG4gICAgICAvLyDov4fmu6Tku6UgX18g5byA5aS055qE5YaF6YOo5a2X5q61XHJcbiAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoXCJfX1wiKSkge1xyXG4gICAgICAgIGZpbHRlcmVkW2tleV0gPSB0aGlzLmV4Y2x1ZGVJbnRlcm5hbEZpZWxkcyh2YWwpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmaWx0ZXJlZDtcclxuICB9XHJcblxyXG4gIC8vIOiuvue9ruWAvOWPmOabtOiuoumYhVxyXG4gIHByaXZhdGUgc2V0dXBWYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbjxUPihcclxuICAgIHRhcmdldDogeyB2YWx1ZUNoYW5nZXM6IGFueTsgdmFsdWU6IGFueSB9LFxyXG4gICAgaGFuZGxlcjogKHZhbHVlOiBUKSA9PiB2b2lkLFxyXG4gICAgb3B0aW9ucz86IFdhdGNoT3B0aW9uc1xyXG4gICk6IFN1YnNjcmlwdGlvbiB7XHJcbiAgICBsZXQgdmFsdWVDaGFuZ2VzJCA9IHRhcmdldC52YWx1ZUNoYW5nZXM7XHJcblxyXG4gICAgaWYgKG9wdGlvbnM/LmRlYm91bmNlICE9IG51bGwpIHtcclxuICAgICAgdmFsdWVDaGFuZ2VzJCA9IHZhbHVlQ2hhbmdlcyQucGlwZShkZWJvdW5jZVRpbWUob3B0aW9ucy5kZWJvdW5jZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvcHRpb25zPy5kaXN0aW5jdFVudGlsQ2hhbmdlZCAhPT0gZmFsc2UpIHtcclxuICAgICAgdmFsdWVDaGFuZ2VzJCA9IHZhbHVlQ2hhbmdlcyQucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAob3B0aW9ucz8uZW1pdEluaXRpYWwpIHtcclxuICAgICAgaGFuZGxlcih0YXJnZXQudmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2YWx1ZUNoYW5nZXMkLnN1YnNjcmliZShoYW5kbGVyKTtcclxuICB9XHJcbn0iXX0=
541
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50ZC1mb3JtLmpzIiwic291cmNlUm9vdCI6IkQ6L3Byb2plY3RzL3Zwcy1mcm9udC9Gcm9udC9EYXNQTVNXZWIvbGliL3Byby10YWJsZS9zcmMvIiwic291cmNlcyI6WyJsaWIvcGFnZS1wdWJsaWMvYW50ZC1mb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUdMLFdBQVcsRUFDWCxTQUFTLEdBRVYsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQTBFcEUsZ0RBQWdEO0FBR2hELE1BQU0sT0FBTyxlQUFlO0lBdUIxQixpREFBaUQ7SUFDakQsWUFBb0IsRUFBZTtRQUFmLE9BQUUsR0FBRixFQUFFLENBQWE7UUF2Qm5DLGlEQUFpRDtRQUNqRCxjQUFTLEdBQThCLEVBQUUsQ0FBQztRQUMxQyxtQkFBYyxHQUFtQixRQUFRLENBQUM7UUFFMUMsaURBQWlEO1FBQ3pDLHNCQUFpQixHQUE0QixFQUFFLENBQUM7UUFDaEQsZUFBVSxHQUFXLE9BQU8sQ0FBQztRQUM3QixlQUFVLEdBQVcsT0FBTyxDQUFDO1FBQzdCLG1CQUFjLEdBQXFDLEVBQUUsQ0FBQztRQUN0RCxzQkFBaUIsR0FHckIsRUFBRSxDQUFDO1FBQ0MsZ0JBQVcsR0FBRyxXQUFXLENBQUM7UUFDakIseUJBQW9CLEdBQXVCO1lBQzFELFFBQVEsRUFBRSxTQUFTO1lBQ25CLFNBQVMsRUFBRSxRQUFRO1lBQ25CLFNBQVMsRUFBRSxRQUFRO1lBQ25CLEtBQUssRUFBRSxZQUFZO1lBQ25CLE9BQU8sRUFBRSxTQUFTO1NBQ25CLENBQUM7SUFHb0MsQ0FBQztJQUV2QyxxREFBcUQ7SUFFckQsdUJBQXVCO0lBQ2YsaUJBQWlCLENBQ3ZCLE1BQXFDO1FBRXJDLE9BQU8sQ0FDTCxPQUFPLE1BQU0sS0FBSyxRQUFRO1lBQzFCLE1B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UCxPQUFPLENBQUUsV0FBVyxFQUFFO1lBQ3hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdkI7UUFFRCxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUMsQ0FBQzs7OztZQXRwQkYsVUFBVSxTQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7O1lBakZoQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7XHJcbiAgQWJzdHJhY3RDb250cm9sLFxyXG4gIEFic3RyYWN0Q29udHJvbE9wdGlvbnMsXHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIFZhbGlkYXRvckZuLFxyXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcblxyXG4vLyA9PT09PT09PT09PT09PT09PT09PSDnsbvlnovlrprkuYkgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbi8vIOWtl+autemUmeivr+a2iOaBr+exu+Wei++8iOWtl+espuS4suaIluWHveaVsO+8iVxyXG5leHBvcnQgdHlwZSBGaWVsZEVycm9yTWVzc2FnZSA9XHJcbiAgfCBzdHJpbmdcclxuICB8ICgoY29udGV4dDogeyBjb250cm9sOiBBYnN0cmFjdENvbnRyb2w7IGNvbnRyb2xOYW1lOiBzdHJpbmcgfSkgPT4gc3RyaW5nKTtcclxuXHJcbi8vIOWtl+autemUmeivr+a2iOaBr+mbhuWQiFxyXG5leHBvcnQgdHlwZSBGaWVsZEVycm9yTWVzc2FnZXMgPSBSZWNvcmQ8c3RyaW5nLCBGaWVsZEVycm9yTWVzc2FnZT47XHJcblxyXG4vLyDlrZfmrrXphY3nva5cclxuZXhwb3J0IHR5cGUgRmllbGRDb25maWcgPSB7XHJcbiAgdmFsdWU6IGFueTtcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgdmFsaWRhdG9ycz86ICgpID0+IFZhbGlkYXRvckZuW107XHJcbiAgZXJyb3JNZXNzYWdlcz86IEZpZWxkRXJyb3JNZXNzYWdlcztcclxufTtcclxuXHJcbi8vIOW1jOWllyBGb3JtR3JvdXAg6YWN572uXHJcbmV4cG9ydCB0eXBlIEZvcm1Hcm91cENvbmZpZyA9IHtcclxuICB0eXBlOiBcImdyb3VwXCI7XHJcbiAgZmllbGRzOiBGb3JtQ29uZmlnO1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICB2YWxpZGF0b3JzPzogKCkgPT4gVmFsaWRhdG9yRm5bXTtcclxuICBlcnJvck1lc3NhZ2VzPzogRmllbGRFcnJvck1lc3NhZ2VzO1xyXG59O1xyXG5cclxuLy8g6KGo5Y2V5L+u5pS557G75Z6LXHJcbmV4cG9ydCB0eXBlIEZvcm1Nb2RpZnlUeXBlID0gXCJjcmVhdGVcIiB8IFwidXBkYXRlXCI7XHJcblxyXG4vLyDooajljZXphY3nva7vvIjmlK/mjIHmma7pgJrlrZfmrrXlkozltYzlpZcgRm9ybUdyb3Vw77yJXHJcbmV4cG9ydCB0eXBlIEZvcm1Db25maWcgPSBSZWNvcmQ8c3RyaW5nLCBGaWVsZENvbmZpZyB8IEZvcm1Hcm91cENvbmZpZz47XHJcblxyXG4vLyDnm5HlkKzpgInpoblcclxuZXhwb3J0IHR5cGUgV2F0Y2hPcHRpb25zID0ge1xyXG4gIGRlYm91bmNlPzogbnVtYmVyO1xyXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkPzogYm9vbGVhbjtcclxuICBlbWl0SW5pdGlhbD86IGJvb2xlYW47XHJcbn07XHJcblxyXG4vLyDmibnph4/mt7vliqDlrZfmrrXphY3nva7pgInpoblcclxuZXhwb3J0IHR5cGUgQWRkRmllbGRzQ29uZmlnT3B0aW9ucyA9IHtcclxuICBlbWl0RXZlbnQ/OiBib29sZWFuO1xyXG4gIHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHk/OiBib29sZWFuO1xyXG4gIG9uRmllbGRBZGRlZD86IChmaWVsZE5hbWU6IHN0cmluZywgc3VjY2VzczogYm9vbGVhbiwgZXJyb3I/OiBzdHJpbmcpID0+IHZvaWQ7IC8vIOavj+S4quWtl+autea3u+WKoOeahOWbnuiwg1xyXG4gIHRhcmdldFBhdGg/OiBzdHJpbmc7IC8vIOebruagh+i3r+W+hO+8jOeUqOS6juWcqOW1jOWllyBGb3JtR3JvdXAg5YaF6YOo5re75Yqg5a2X5q6177yM5L6L5aaCOiBcImNhcmRCYXNlSW5mb1wiIOaIliBcInVzZXJJbmZvLmFkZHJlc3NJbmZvXCJcclxufTtcclxuXHJcbi8vIOaJuemHj+a3u+WKoOWtl+autemFjee9rue7k+aenFxyXG5leHBvcnQgdHlwZSBBZGRGaWVsZHNDb25maWdSZXN1bHQgPSB7XHJcbiAgc3VjY2VzczogYm9vbGVhbjtcclxuICBhZGRlZDogc3RyaW5nW107IC8vIOaIkOWKn+a3u+WKoOeahOWtl+auteWQjeWIl+ihqFxyXG4gIGZhaWxlZDogQXJyYXk8eyBmaWVsZE5hbWU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PjsgLy8g5aSx6LSl55qE5a2X5q615Y+K6ZSZ6K+v5L+h5oGvXHJcbn07XHJcblxyXG4vLyDmibnph4/liKDpmaTlrZfmrrXphY3nva7pgInpoblcclxuZXhwb3J0IHR5cGUgUmVtb3ZlRmllbGRzQ29uZmlnT3B0aW9ucyA9IHtcclxuICBlbWl0RXZlbnQ/OiBib29sZWFuO1xyXG4gIG9uRmllbGRSZW1vdmVkPzogKFxyXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXHJcbiAgICBzdWNjZXNzOiBib29sZWFuLFxyXG4gICAgZXJyb3I/OiBzdHJpbmdcclxuICApID0+IHZvaWQ7IC8vIOavj+S4quWtl+auteWIoOmZpOeahOWbnuiwg1xyXG59O1xyXG5cclxuLy8g5om56YeP5Yig6Zmk5a2X5q616YWN572u57uT5p6cXHJcbmV4cG9ydCB0eXBlIFJlbW92ZUZpZWxkc0NvbmZpZ1Jlc3VsdCA9IHtcclxuICBzdWNjZXNzOiBib29sZWFuO1xyXG4gIHJlbW92ZWQ6IHN0cmluZ1tdOyAvLyDmiJDlip/liKDpmaTnmoTlrZfmrrXlkI3liJfooahcclxuICBmYWlsZWQ6IEFycmF5PHsgZmllbGROYW1lOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT47IC8vIOWksei0peeahOWtl+auteWPiumUmeivr+S/oeaBr1xyXG59O1xyXG5cclxuLy8gPT09PT09PT09PT09PT09PT09PT0g5pyN5Yqh57G7ID09PT09PT09PT09PT09PT09PT09XHJcblxyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXHJcbmV4cG9ydCBjbGFzcyBBbnRkRm9ybVNlcnZpY2Uge1xyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IOWFrOWFseWxnuaApyA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGZvcm1TdG9yZTogUmVjb3JkPHN0cmluZywgRm9ybUdyb3VwPiA9IHt9O1xyXG4gIGZvcm1Nb2RpZnlUeXBlOiBGb3JtTW9kaWZ5VHlwZSA9IFwiY3JlYXRlXCI7XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IOengeacieWxnuaApyA9PT09PT09PT09PT09PT09PT09PVxyXG4gIHByaXZhdGUgZm9ybVJlZ2lzdGVyU3RvcmU6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XHJcbiAgcHJpdmF0ZSBsYWJlbFdpZHRoOiBzdHJpbmcgPSBcIjEyMHB4XCI7XHJcbiAgcHJpdmF0ZSBsYWJlbEFsaWduOiBzdHJpbmcgPSBcInJpZ2h0XCI7XHJcbiAgcHJpdmF0ZSBsYWJlbE9ic2VydmVyczogUmVjb3JkPHN0cmluZywgTXV0YXRpb25PYnNlcnZlcj4gPSB7fTtcclxuICBwcml2YXRlIGVycm9yTWVzc2FnZVN0b3JlOiBSZWNvcmQ8XHJcbiAgICBzdHJpbmcsXHJcbiAgICBSZWNvcmQ8c3RyaW5nLCBGaWVsZEVycm9yTWVzc2FnZXM+XHJcbiAgPiA9IHt9O1xyXG4gIHByaXZhdGUgY2xhc3NQcmVmaXggPSBcImFudC1mb3JtLVwiO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdEVycm9yTWVzc2FnZXM6IEZpZWxkRXJyb3JNZXNzYWdlcyA9IHtcclxuICAgIHJlcXVpcmVkOiBcIuivpeWtl+auteS4uuW/heWhq+mhuVwiLFxyXG4gICAgbWlubGVuZ3RoOiBcIui+k+WFpemVv+W6puS4jei2s1wiLFxyXG4gICAgbWF4bGVuZ3RoOiBcIui+k+WFpemVv+W6pui2hemZkFwiLFxyXG4gICAgZW1haWw6IFwi6K+36L6T5YWl5ZCI5rOV55qE6YKu566x5Zyw5Z2AXCIsXHJcbiAgICBwYXR0ZXJuOiBcIui+k+WFpeagvOW8j+S4jeato+ehrlwiLFxyXG4gIH07XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IOaehOmAoOWHveaVsCA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7fVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSDooajljZXliJvlu7rlkozliJ3lp4vljJYgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgLy8g5Yik5pat5piv5ZCm5Li65bWM5aWXIEZvcm1Hcm91cCDphY3nva5cclxuICBwcml2YXRlIGlzRm9ybUdyb3VwQ29uZmlnKFxyXG4gICAgY29uZmlnOiBGaWVsZENvbmZpZyB8IEZvcm1Hcm91cENvbmZpZ1xyXG4gICk6IGNvbmZpZyBpcyBGb3JtR3JvdXBDb25maWcge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdHlwZW9mIGNvbmZpZyA9PT0gXCJvYmplY3RcIiAmJlxyXG4gICAgICBjb25maWcgIT09IG51bGwgJiZcclxuICAgICAgXCJ0eXBlXCIgaW4gY29uZmlnICYmXHJcbiAgICAgIGNvbmZpZy50eXBlID09PSBcImdyb3VwXCJcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyDpgJLlvZLliJvlu7rltYzlpZcgRm9ybUdyb3VwXHJcbiAgcHJpdmF0ZSBjcmVhdGVOZXN0ZWRGb3JtR3JvdXAoXHJcbiAgICBmaWVsZHM6IEZvcm1Db25maWcsXHJcbiAgICBkaXNhYmxlZD86IGJvb2xlYW5cclxuICApOiBGb3JtR3JvdXAge1xyXG4gICAgY29uc3QgZ3JvdXBDb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcclxuXHJcbiAgICBPYmplY3QuZW50cmllcyhmaWVsZHMpLmZvckVhY2goKFtrZXksIGZpZWxkQ29uZmlnXSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5pc0Zvcm1Hcm91cENvbmZpZyhmaWVsZENvbmZpZykpIHtcclxuICAgICAgICAvLyDpgJLlvZLliJvlu7rltYzlpZfnmoQgRm9ybUdyb3VwXHJcbiAgICAgICAgZ3JvdXBDb25maWdba2V5XSA9IHRoaXMuY3JlYXRlTmVzdGVkRm9ybUdyb3VwKFxyXG4gICAgICAgICAgZmllbGRDb25maWcuZmllbGRzLFxyXG4gICAgICAgICAgZmllbGRDb25maWcuZGlzYWJsZWQgPz8gZGlzYWJsZWRcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIOWIm+W7uuaZrumAmiBGb3JtQ29udHJvbFxyXG4gICAgICAgIGdyb3VwQ29uZmlnW2tleV0gPSBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhbHVlOiBmaWVsZENvbmZpZy52YWx1ZSxcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IGZpZWxkQ29uZmlnLmRpc2FibGVkID8/IGRpc2FibGVkID8/IGZhbHNlLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGZpZWxkQ29uZmlnLnZhbGlkYXRvcnM/LigpID8/IFtdLFxyXG4gICAgICAgIF07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKGdyb3VwQ29uZmlnKTtcclxuICB9XHJcblxyXG4gIC8vIOWIneWni+WMluihqOWNlVxyXG4gIGNyZWF0ZUZvcm1Hcm91cChcclxuICAgIG5hbWU6IHN0cmluZyxcclxuICAgIGNvbmZpZzogRm9ybUNvbmZpZyxcclxuICAgIG9wdGlvbnM/OiB7IGxhYmVsV2lkdGg/OiBzdHJpbmc7IGxhYmVsQWxpZ24/OiBzdHJpbmcgfVxyXG4gICk6IEZvcm1Hcm91cCB7XHJcbiAgICBjb25zdCBncm91cENvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2VTdG9yZVtuYW1lXSA9IHt9O1xyXG5cclxuICAgIE9iamVjdC5lbnRyaWVzKGNvbmZpZykuZm9yRWFjaCgoW2tleSwgZmllbGRDb25maWddKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmlzRm9ybUdyb3VwQ29uZmlnKGZpZWxkQ29uZmlnKSkge1xyXG4gICAgICAgIC8vIOWkhOeQhuW1jOWllyBGb3JtR3JvdXBcclxuICAgICAgICBjb25zdCBuZXN0ZWRHcm91cCA9IHRoaXMuY3JlYXRlTmVzdGVkRm9ybUdyb3VwKFxyXG4gICAgICAgICAgZmllbGRDb25maWcuZmllbGRzLFxyXG4gICAgICAgICAgZmllbGRDb25maWcuZGlzYWJsZWRcclxuICAgICAgICApO1xyXG4gICAgICAgIGdyb3VwQ29uZmlnW2tleV0gPSBuZXN0ZWRHcm91cDtcclxuXHJcbiAgICAgICAgLy8g5a2Y5YKo5bWM5aWXIEZvcm1Hcm91cCDnmoTplJnor6/mtojmga/vvIjlpoLmnpzpnIDopoHvvIlcclxuICAgICAgICBpZiAoZmllbGRDb25maWcuZXJyb3JNZXNzYWdlcykge1xyXG4gICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VTdG9yZVtuYW1lXVtrZXldID0gZmllbGRDb25maWcuZXJyb3JNZXNzYWdlcztcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8g5aSE55CG5pmu6YCa5a2X5q61XHJcbiAgICAgICAgZ3JvdXBDb25maWdba2V5XSA9IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdmFsdWU6IGZpZWxkQ29uZmlnLnZhbHVlLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogZmllbGRDb25maWcuZGlzYWJsZWQgPz8gZmFsc2UsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZmllbGRDb25maWcudmFsaWRhdG9ycz8uKCkgPz8gW10sXHJcbiAgICAgICAgXTtcclxuICAgICAgICBpZiAoZmllbGRDb25maWcuZXJyb3JNZXNzYWdlcykge1xyXG4gICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VTdG9yZVtuYW1lXVtrZXldID0gZmllbGRDb25maWcuZXJyb3JNZXNzYWdlcztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChvcHRpb25zPy5sYWJlbFdpZHRoKSB7XHJcbiAgICAgIHRoaXMubGFiZWxXaWR0aCA9IG9wdGlvbnMubGFiZWxXaWR0aDtcclxuICAgIH1cclxuICAgIGlmIChvcHRpb25zPy5sYWJlbEFsaWduKSB7XHJcbiAgICAgIHRoaXMubGFiZWxBbGlnbiA9IG9wdGlvbnMubGFiZWxBbGlnbjtcclxuICAgIH1cclxuICAgIHRoaXMuZm9ybVN0b3JlW25hbWVdID0gdGhpcy5mYi5ncm91cChncm91cENvbmZpZyk7XHJcbiAgICB0aGlzLmZvcm1SZWdpc3RlclN0b3JlW25hbWVdID0gdHJ1ZTtcclxuICAgIHRoaXMuc2V0Q1NTVmFyaWFibGVzVG9UYXJnZXQobmFtZSk7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtU3RvcmVbbmFtZV07XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSDooajljZXmk43kvZwgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgLy8g6YeN572u6KGo5Y2VXHJcbiAgcmVzZXRGb3JtR3JvdXAobmFtZTogc3RyaW5nLCB2YWx1ZT86IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JtU3RvcmVbbmFtZV0/LnJlc2V0KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8vIOajgOa1i+ihqOWNleaYr+WQpuWujOaIkOazqOWGjFxyXG4gIGlzRm9ybVJlZ2lzdGVyZWQobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtUmVnaXN0ZXJTdG9yZVtuYW1lXSA/PyBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIOmUgOavgeWvueW6lOeahOihqOWNlVxyXG4gIGRlc3RvcnkobmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICBuYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XHJcbiAgICAgIC8vIDIuIOa4heeQhumUmeivr+a2iOaBr+WtmOWCqFxyXG4gICAgICBpZiAodGhpcy5lcnJvck1lc3NhZ2VTdG9yZVtuYW1lXSkge1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmVycm9yTWVzc2FnZVN0b3JlW25hbWVdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyAzLiDmuIXnkIbooajljZXms6jlhozmoIforrBcclxuICAgICAgaWYgKHRoaXMuZm9ybVJlZ2lzdGVyU3RvcmVbbmFtZV0pIHtcclxuICAgICAgICBkZWxldGUgdGhpcy5mb3JtUmVnaXN0ZXJTdG9yZVtuYW1lXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gNC4g5riF55CG6KGo5Y2V57uE77yIQW5ndWxhciDkvJroh6rliqjlpITnkIYgRm9ybUdyb3VwIOeahOa4heeQhu+8iVxyXG4gICAgICBpZiAodGhpcy5mb3JtU3RvcmVbbmFtZV0pIHtcclxuICAgICAgICBkZWxldGUgdGhpcy5mb3JtU3RvcmVbbmFtZV07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g5qC55o2u6Lev5b6E6I635Y+W5bWM5aWX55qEIEZvcm1Hcm91cFxyXG4gIHByaXZhdGUgZ2V0TmVzdGVkRm9ybUdyb3VwKFxyXG4gICAgZm9ybUdyb3VwOiBGb3JtR3JvdXAsXHJcbiAgICBwYXRoOiBzdHJpbmdcclxuICApOiBGb3JtR3JvdXAgfCBudWxsIHtcclxuICAgIGlmICghcGF0aCB8fCBwYXRoLnRyaW0oKSA9PT0gXCJcIikge1xyXG4gICAgICByZXR1cm4gZm9ybUdyb3VwO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpLmZpbHRlcigocCkgPT4gcC50cmltKCkgIT09IFwiXCIpO1xyXG4gICAgbGV0IGN1cnJlbnRHcm91cDogQWJzdHJhY3RDb250cm9sIHwgbnVsbCA9IGZvcm1Hcm91cDtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGF0aFBhcnRzKSB7XHJcbiAgICAgIGlmICghY3VycmVudEdyb3VwIHx8ICEoY3VycmVudEdyb3VwIGluc3RhbmNlb2YgRm9ybUdyb3VwKSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGN1cnJlbnRHcm91cCA9IGN1cnJlbnRHcm91cC5nZXQocGFydCk7XHJcbiAgICAgIGlmICghY3VycmVudEdyb3VwIHx8ICEoY3VycmVudEdyb3VwIGluc3RhbmNlb2YgRm9ybUdyb3VwKSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGN1cnJlbnRHcm91cCBpbnN0YW5jZW9mIEZvcm1Hcm91cCA/IGN1cnJlbnRHcm91cCA6IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyDmibnph4/mt7vliqDlrZfmrrXphY3nva5cclxuICBhZGRGaWVsZHNDb25maWcoXHJcbiAgICBmb3JtTmFtZTogc3RyaW5nLFxyXG4gICAgZmllbGRzQ29uZmlnOiBGb3JtQ29uZmlnLFxyXG4gICAgb3B0aW9ucz86IEFkZEZpZWxkc0NvbmZpZ09wdGlvbnNcclxuICApOiBBZGRGaWVsZHNDb25maWdSZXN1bHQge1xyXG4gICAgY29uc3QgcmVzdWx0OiBBZGRGaWVsZHNDb25maWdSZXN1bHQgPSB7XHJcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgIGFkZGVkOiBbXSxcclxuICAgICAgZmFpbGVkOiBbXSxcclxuICAgIH07XHJcblxyXG4gICAgLy8gMS4g6aqM6K+B6KGo5Y2V5piv5ZCm5a2Y5ZyoXHJcbiAgICBjb25zdCByb290Rm9ybUdyb3VwID0gdGhpcy5mb3JtU3RvcmVbZm9ybU5hbWVdO1xyXG4gICAgaWYgKCFyb290Rm9ybUdyb3VwKSB7XHJcbiAgICAgIC8vIOWmguaenOihqOWNleS4jeWtmOWcqO+8jOaJgOacieWtl+autemDveWksei0pVxyXG4gICAgICBPYmplY3Qua2V5cyhmaWVsZHNDb25maWcpLmZvckVhY2goKGZpZWxkTmFtZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gYEZvcm0gXCIke2Zvcm1OYW1lfVwiIG5vdCBmb3VuZGA7XHJcbiAgICAgICAgcmVzdWx0LmZhaWxlZC5wdXNoKHtcclxuICAgICAgICAgIGZpZWxkTmFtZSxcclxuICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9wdGlvbnM/Lm9uRmllbGRBZGRlZD8uKGZpZWxkTmFtZSwgZmFsc2UsIGVycm9yKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJlc3VsdC5zdWNjZXNzID0gZmFsc2U7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMi4g6I635Y+W55uu5qCHIEZvcm1Hcm91cO+8iOaUr+aMgeW1jOWll+i3r+W+hO+8iVxyXG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IG9wdGlvbnM/LnRhcmdldFBhdGg7XHJcbiAgICBjb25zdCB0YXJnZXRGb3JtR3JvdXAgPSB0YXJnZXRQYXRoXHJcbiAgICAgID8gdGhpcy5nZXROZXN0ZWRGb3JtR3JvdXAocm9vdEZvcm1Hcm91cCwgdGFyZ2V0UGF0aClcclxuICAgICAgOiByb290Rm9ybUdyb3VwO1xyXG5cclxuICAgIGlmICghdGFyZ2V0Rm9ybUdyb3VwKSB7XHJcbiAgICAgIC8vIOWmguaenOebruaghyBGb3JtR3JvdXAg5LiN5a2Y5Zyo77yM5omA5pyJ5a2X5q616YO95aSx6LSlXHJcbiAgICAgIE9iamVjdC5rZXlzKGZpZWxkc0NvbmZpZykuZm9yRWFjaCgoZmllbGROYW1lKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0YXJnZXRQYXRoXHJcbiAgICAgICAgICA/IGBUYXJnZXQgRm9ybUdyb3VwIGF0IHBhdGggXCIke3RhcmdldFBhdGh9XCIgbm90IGZvdW5kYFxyXG4gICAgICAgICAgOiBgRm9ybUdyb3VwIG5vdCBmb3VuZGA7XHJcbiAgICAgICAgcmVzdWx0LmZhaWxlZC5wdXNoKHtcclxuICAgICAgICAgIGZpZWxkTmFtZSxcclxuICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9wdGlvbnM/Lm9uRmllbGRBZGRlZD8uKGZpZWxkTmFtZSwgZmFsc2UsIGVycm9yKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJlc3VsdC5zdWNjZXNzID0gZmFsc2U7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMy4g5Yid5aeL5YyWIGVycm9yTWVzc2FnZVN0b3Jl77yI5aaC5p6c5LiN5a2Y5Zyo77yJXHJcbiAgICBpZiAoIXRoaXMuZXJyb3JNZXNzYWdlU3RvcmVbZm9ybU5hbWVdKSB7XHJcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlU3RvcmVbZm9ybU5hbWVdID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgLy8gNC4g5om56YeP5p6E5bu65o6n5Lu26YWN572uXHJcbiAgICBjb25zdCBjb250cm9sc1RvQWRkOiBSZWNvcmQ8c3RyaW5nLCBBYnN0cmFjdENvbnRyb2w+ID0ge307XHJcbiAgICBjb25zdCBlcnJvck1lc3NhZ2VzVG9BZGQ6IFJlY29yZDxzdHJpbmcsIEZpZWxkRXJyb3JNZXNzYWdlcz4gPSB7fTtcclxuXHJcbiAgICAvLyA1LiDpgY3ljobmiYDmnInlrZfmrrXphY3nva7vvIzov5vooYzpqozor4HlkozmnoTlu7pcclxuICAgIE9iamVjdC5lbnRyaWVzKGZpZWxkc0NvbmZpZykuZm9yRWFjaCgoW2ZpZWxkTmFtZSwgZmllbGRDb25maWddKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gNS4xIOajgOafpeWtl+auteaYr+WQpuW3suWtmOWcqFxyXG4gICAgICAgIGlmICh0YXJnZXRGb3JtR3JvdXAuZ2V0KGZpZWxkTmFtZSkpIHtcclxuICAgICAgICAgIGNvbnN0IGVycm9yID0gYEZpZWxkIFwiJHtmaWVsZE5hbWV9XCIgYWxyZWFkeSBleGlzdHMke1xyXG4gICAgICAgICAgICB0YXJnZXRQYXRoID8gYCBpbiBcIiR7dGFyZ2V0UGF0aH1cImAgOiBcIlwiXHJcbiAgICAgICAgICB9YDtcclxuICAgICAgICAgIHJlc3VsdC5mYWlsZWQucHVzaCh7XHJcbiAgICAgICAgICAgIGZpZWxkTmFtZSxcclxuICAgICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIG9wdGlvbnM/Lm9uRmllbGRBZGRlZD8uKGZpZWxkTmFtZSwgZmFsc2UsIGVycm9yKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIDUuMiDliJvlu7rmjqfku7ZcclxuICAgICAgICBsZXQgY29udHJvbDogQWJzdHJhY3RDb250cm9sO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0Zvcm1Hcm91cENvbmZpZyhmaWVsZENvbmZpZykpIHtcclxuICAgICAgICAgIC8vIOWIm+W7uuW1jOWllyBGb3JtR3JvdXBcclxuICAgICAgICAgIGNvbnRyb2wgPSB0aGlzLmNyZWF0ZU5lc3RlZEZvcm1Hcm91cChcclxuICAgICAgICAgICAgZmllbGRDb25maWcuZmllbGRzLFxyXG4gICAgICAgICAgICBmaWVsZENvbmZpZy5kaXNhYmxlZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIC8vIOWtmOWCqOW1jOWllyBGb3JtR3JvdXAg55qE6ZSZ6K+v5raI5oGv77yI5aaC5p6c6ZyA6KaB77yJXHJcbiAgICAgICAgICBpZiAoZmllbGRDb25maWcuZXJyb3JNZXNzYWdlcykge1xyXG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2VLZXkgPSB0YXJnZXRQYXRoXHJcbiAgICAgICAgICAgICAgPyBgJHt0YXJnZXRQYXRofS4ke2ZpZWxkTmFtZX1gXHJcbiAgICAgICAgICAgICAgOiBmaWVsZE5hbWU7XHJcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZXNUb0FkZFtlcnJvck1lc3NhZ2VLZXldID0gZmllbGRDb25maWcuZXJyb3JNZXNzYWdlcztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8g5Yib5bu65pmu6YCaIEZvcm1Db250cm9sXHJcbiAgICAgICAgICBjb25zdCBjb250cm9sT3B0aW9uczogQWJzdHJhY3RDb250cm9sT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgdmFsaWRhdG9yczogZmllbGRDb25maWcudmFsaWRhdG9ycz8uKCkgPz8gW10sXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgY29udHJvbCA9IHRoaXMuZmIuY29udHJvbChmaWVsZENvbmZpZy52YWx1ZSwgY29udHJvbE9wdGlvbnMpO1xyXG4gICAgICAgICAgLy8g6K6+572uIGRpc2FibGVkIOeKtuaAgVxyXG4gICAgICAgICAgaWYgKGZpZWxkQ29uZmlnLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgIGNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8g5a2Y5YKo6ZSZ6K+v5raI5oGvXHJcbiAgICAgICAgICBpZiAoZmllbGRDb25maWcuZXJyb3JNZXNzYWdlcykge1xyXG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2VLZXkgPSB0YXJnZXRQYXRoXHJcbiAgICAgICAgICAgICAgPyBgJHt0YXJnZXRQYXRofS4ke2ZpZWxkTmFtZX1gXHJcbiAgICAgICAgICAgICAgOiBmaWVsZE5hbWU7XHJcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZXNUb0FkZFtlcnJvck1lc3NhZ2VLZXldID0gZmllbGRDb25maWcuZXJyb3JNZXNzYWdlcztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnRyb2xzVG9BZGRbZmllbGROYW1lXSA9IGNvbnRyb2w7XHJcblxyXG4gICAgICAgIHJlc3VsdC5hZGRlZC5wdXNoKGZpZWxkTmFtZSk7XHJcbiAgICAgICAgb3B0aW9ucz8ub25GaWVsZEFkZGVkPy4oZmllbGROYW1lLCB0cnVlKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9XHJcbiAgICAgICAgICBlcnJvcj8ubWVzc2FnZSB8fCBlcnJvcj8udG9TdHJpbmcoKSB8fCBcIlVua25vd24gZXJyb3JcIjtcclxuICAgICAgICByZXN1bHQuZmFpbGVkLnB1c2goe1xyXG4gICAgICAgICAgZmllbGROYW1lLFxyXG4gICAgICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBvcHRpb25zPy5vbkZpZWxkQWRkZWQ/LihmaWVsZE5hbWUsIGZhbHNlLCBlcnJvck1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyA2LiDmibnph4/mt7vliqDliLDnm67moIcgRm9ybUdyb3VwXHJcbiAgICBpZiAoT2JqZWN0LmtleXMoY29udHJvbHNUb0FkZCkubGVuZ3RoID4gMCkge1xyXG4gICAgICBPYmplY3QuZW50cmllcyhjb250cm9sc1RvQWRkKS5mb3JFYWNoKChbZmllbGROYW1lLCBjb250cm9sXSkgPT4ge1xyXG4gICAgICAgIHRhcmdldEZvcm1Hcm91cC5hZGRDb250cm9sKGZpZWxkTmFtZSwgY29udHJvbCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gNy4g5om56YeP5a2Y5YKo6ZSZ6K+v5raI5oGvXHJcbiAgICAgIE9iamVjdC5lbnRyaWVzKGVycm9yTWVzc2FnZXNUb0FkZCkuZm9yRWFjaCgoW2tleSwgbWVzc2FnZXNdKSA9PiB7XHJcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VTdG9yZVtmb3JtTmFtZV1ba2V5XSA9IG1lc3NhZ2VzO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIDguIOabtOaWsOihqOWNlemqjOivgeeKtuaAgVxyXG4gICAgICBpZiAob3B0aW9ucz8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSkge1xyXG4gICAgICAgIHRhcmdldEZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtcclxuICAgICAgICAgIGVtaXRFdmVudDogb3B0aW9ucz8uZW1pdEV2ZW50ID8/IHRydWUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyA5LiDliKTmlq3mlbTkvZPmmK/lkKbmiJDlip9cclxuICAgIHJlc3VsdC5zdWNjZXNzID0gcmVzdWx0LmZhaWxlZC5sZW5ndGggPT09IDA7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vIOaJuemHj+WIoOmZpOWtl+autemFjee9rlxyXG4gIHJlbW92ZUZpZWxkc0NvbmZpZyhcclxuICAgIGZvcm1OYW1lOiBzdHJpbmcsXHJcbiAgICBmaWVsZE5hbWVzOiBzdHJpbmdbXSxcclxuICAgIG9wdGlvbnM/OiBSZW1vdmVGaWVsZHNDb25maWdPcHRpb25zXHJcbiAgKTogUmVtb3ZlRmllbGRzQ29uZmlnUmVzdWx0IHtcclxuICAgIGNvbnN0IHJlc3VsdDogUmVtb3ZlRmllbGRzQ29uZmlnUmVzdWx0ID0ge1xyXG4gICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICByZW1vdmVkOiBbXSxcclxuICAgICAgZmFpbGVkOiBbXSxcclxuICAgIH07XHJcblxyXG4gICAgLy8gMS4g6aqM6K+B6KGo5Y2V5piv5ZCm5a2Y5ZyoXHJcbiAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmZvcm1TdG9yZVtmb3JtTmFtZV07XHJcbiAgICBpZiAoIWZvcm1Hcm91cCkge1xyXG4gICAgICBmaWVsZE5hbWVzLmZvckVhY2goKGZpZWxkTmFtZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gYEZvcm0gXCIke2Zvcm1OYW1lfVwiIG5vdCBmb3VuZGA7XHJcbiAgICAgICAgcmVzdWx0LmZhaWxlZC5wdXNoKHtcclxuICAgICAgICAgIGZpZWxkTmFtZSxcclxuICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9wdGlvbnM/Lm9uRmllbGRSZW1vdmVkPy4oZmllbGROYW1lLCBmYWxzZSwgZXJyb3IpO1xyXG4gICAgICB9KTtcclxuICAgICAgcmVzdWx0LnN1Y2Nlc3MgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyAyLiDmibnph4/mlLbpm4bpnIDopoHmuIXnkIbnmoTkv6Hmga9cclxuICAgIGNvbnN0IGZpZWxkc1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgY29uc3QgZXJyb3JNZXNzYWdlS2V5c1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIC8vIDMuIOmqjOivgeavj+S4quWtl+auteW5tuaUtumbhuS/oeaBr1xyXG4gICAgZmllbGROYW1lcy5mb3JFYWNoKChmaWVsZE5hbWUpID0+IHtcclxuICAgICAgY29uc3QgY29udHJvbCA9IGZvcm1Hcm91cC5nZXQoZmllbGROYW1lKTtcclxuXHJcbiAgICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gYEZpZWxkIFwiJHtmaWVsZE5hbWV9XCIgbm90IGZvdW5kYDtcclxuICAgICAgICByZXN1bHQuZmFpbGVkLnB1c2goe1xyXG4gICAgICAgICAgZmllbGROYW1lLFxyXG4gICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb3B0aW9ucz8ub25GaWVsZFJlbW92ZWQ/LihmaWVsZE5hbWUsIGZhbHNlLCBlcnJvcik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyDmlLbpm4bplJnor6/mtojmga/plK5cclxuICAgICAgZXJyb3JNZXNzYWdlS2V5c1RvUmVtb3ZlLnB1c2goZmllbGROYW1lKTtcclxuICAgICAgZmllbGRzVG9SZW1vdmUucHVzaChmaWVsZE5hbWUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gNC4g5om56YeP5omn6KGM5Yig6Zmk5pON5L2cXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyA0LjEg5LuOIEZvcm1Hcm91cCDkuK3np7vpmaTmjqfku7ZcclxuICAgICAgZmllbGRzVG9SZW1vdmUuZm9yRWFjaCgoZmllbGROYW1lKSA9PiB7XHJcbiAgICAgICAgZm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woZmllbGROYW1lKTtcclxuICAgICAgICByZXN1bHQucmVtb3ZlZC5wdXNoKGZpZWxkTmFtZSk7XHJcbiAgICAgICAgb3B0aW9ucz8ub25GaWVsZFJlbW92ZWQ/LihmaWVsZE5hbWUsIHRydWUpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIDQuMiDmibnph4/liKDpmaTplJnor6/mtojmga9cclxuICAgICAgaWYgKHRoaXMuZXJyb3JNZXNzYWdlU3RvcmVbZm9ybU5hbWVdKSB7XHJcbiAgICAgICAgZXJyb3JNZXNzYWdlS2V5c1RvUmVtb3ZlLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgZGVsZXRlIHRoaXMuZXJyb3JNZXNzYWdlU3RvcmVbZm9ybU5hbWVdW2tleV07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgLy8g5aaC5p6c5om56YeP5Yig6Zmk6L+H56iL5Lit5Ye66ZSZ77yM5qCH6K6w5Li65aSx6LSlXHJcbiAgICAgIGZpZWxkc1RvUmVtb3ZlLmZvckVhY2goKGZpZWxkTmFtZSkgPT4ge1xyXG4gICAgICAgIGlmICghcmVzdWx0LnJlbW92ZWQuaW5jbHVkZXMoZmllbGROYW1lKSkge1xyXG4gICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID1cclxuICAgICAgICAgICAgZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3I/LnRvU3RyaW5nKCkgfHwgXCJGYWlsZWQgdG8gcmVtb3ZlIGZpZWxkXCI7XHJcbiAgICAgICAgICByZXN1bHQuZmFpbGVkLnB1c2goe1xyXG4gICAgICAgICAgICBmaWVsZE5hbWUsXHJcbiAgICAgICAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIG9wdGlvbnM/Lm9uRmllbGRSZW1vdmVkPy4oZmllbGROYW1lLCBmYWxzZSwgZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDUuIOWIpOaWreaVtOS9k+aYr+WQpuaIkOWKn1xyXG4gICAgcmVzdWx0LnN1Y2Nlc3MgPSByZXN1bHQuZmFpbGVkLmxlbmd0aCA9PT0gMDtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8g5bGA6YOo6LWL5YC8XHJcbiAgcGF0Y2hGb3JtVmFsdWVzKFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxyXG4gICAgb3B0aW9ucz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9XHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmZvcm1TdG9yZVtuYW1lXTtcclxuICAgIGlmICghZm9ybUdyb3VwKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBgW0FudGRGb3JtU2VydmljZV0gcGF0Y2hGb3JtVmFsdWVzOiBmb3JtIFwiJHtuYW1lfVwiIG5vdCBmb3VuZC5gXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBmb3JtR3JvdXAucGF0Y2hWYWx1ZSh2YWx1ZXMsIHtcclxuICAgICAgZW1pdEV2ZW50OiBvcHRpb25zPy5lbWl0RXZlbnQgPz8gdHJ1ZSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g6KGo5Y2V5qCh6aqM77yI6Ieq5Yqo6L+H5ruk5YaF6YOo5a2X5q6177yJXHJcbiAgdmFsaWRhdGVGb3JtKFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgb3B0aW9ucz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbjsgb25seVNlbGY/OiBib29sZWFuIH1cclxuICApOiBib29sZWFuIHwgUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICBpZiAodGhpcy5mb3JtU3RvcmVbbmFtZV0udmFsaWQpIHtcclxuICAgICAgY29uc3QgcmF3VmFsdWUgPSB0aGlzLmZvcm1TdG9yZVtuYW1lXS5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgICByZXR1cm4gdGhpcy5leGNsdWRlSW50ZXJuYWxGaWVsZHMocmF3VmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g6YCS5b2S5qCh6aqM5omA5pyJ5o6n5Lu2XHJcbiAgICAgIHRoaXMubWFya0FsbENvbnRyb2xzQXNEaXJ0eShcclxuICAgICAgICB0aGlzLmZvcm1TdG9yZVtuYW1lXSxcclxuICAgICAgICBvcHRpb25zPy5lbWl0RXZlbnQgPz8gdHJ1ZSxcclxuICAgICAgICBvcHRpb25zPy5vbmx5U2VsZiA/PyBmYWxzZVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDpgJLlvZLmoIforrDmiYDmnInml6DmlYjmjqfku7bkuLogZGlydHlcclxuICBwcml2YXRlIG1hcmtBbGxDb250cm9sc0FzRGlydHkoXHJcbiAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsXHJcbiAgICBlbWl0RXZlbnQ6IGJvb2xlYW4sXHJcbiAgICBvbmx5U2VsZjogYm9vbGVhblxyXG4gICk6IHZvaWQge1xyXG4gICAgaWYgKGNvbnRyb2wuaW52YWxpZCkge1xyXG4gICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7XHJcbiAgICAgICAgZW1pdEV2ZW50LFxyXG4gICAgICAgIG9ubHlTZWxmLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlpoLmnpzmmK8gRm9ybUdyb3Vw77yM6YCS5b2S5aSE55CG5omA5pyJ5a2Q5o6n5Lu2XHJcbiAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xyXG4gICAgICBPYmplY3QudmFsdWVzKGNvbnRyb2wuY29udHJvbHMpLmZvckVhY2goKGNoaWxkQ29udHJvbCkgPT4ge1xyXG4gICAgICAgIHRoaXMubWFya0FsbENvbnRyb2xzQXNEaXJ0eShjaGlsZENvbnRyb2wsIGVtaXRFdmVudCwgb25seVNlbGYpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IOmUmeivr+a2iOaBr+ebuOWFsyA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvLyDojrflj5blrZfmrrXpppbmnaHplJnor6/mj5DnpLpcclxuICBnZXRGaWVsZEVycm9yTWVzc2FnZShuYW1lOiBzdHJpbmcsIGNvbnRyb2xOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5mb3JtU3RvcmVbbmFtZV07XHJcbiAgICBpZiAoIWZvcm1Hcm91cCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFtBbnRkRm9ybVNlcnZpY2VdIGdldEZpZWxkRXJyb3JNZXNzYWdlOiBmb3JtIFwiJHtuYW1lfVwiIG5vdCBmb3VuZC5gXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY29udHJvbCA9IGZvcm1Hcm91cC5nZXQoY29udHJvbE5hbWUpO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBgW0FudGRGb3JtU2VydmljZV0gZ2V0RmllbGRFcnJvck1lc3NhZ2U6IGNvbnRyb2wgXCIke2NvbnRyb2xOYW1lfVwiIG5vdCBmb3VuZCBpbiBmb3JtIFwiJHtuYW1lfVwiLmBcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgICBpZiAoIWNvbnRyb2wuZXJyb3JzKSB7XHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOS7jiBlcnJvck1lc3NhZ2VTdG9yZSDojrflj5bplJnor6/mtojmga/phY3nva5cclxuICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSB0aGlzLmVycm9yTWVzc2FnZVN0b3JlW25hbWVdPy5bY29udHJvbE5hbWVdO1xyXG4gICAgY29uc3QgbWVyZ2VkTWVzc2FnZXMgPSB7XHJcbiAgICAgIC4uLnRoaXMuZGVmYXVsdEVycm9yTWVzc2FnZXMsXHJcbiAgICAgIC4uLihlcnJvck1lc3NhZ2VzID8/IHt9KSxcclxuICAgIH07XHJcblxyXG4gICAgZm9yIChjb25zdCBlcnJvcktleSBvZiBPYmplY3Qua2V5cyhjb250cm9sLmVycm9ycykpIHtcclxuICAgICAgY29uc3QgbWVzc2FnZSA9IG1lcmdlZE1lc3NhZ2VzW2Vycm9yS2V5XTtcclxuICAgICAgaWYgKG1lc3NhZ2UpIHtcclxuICAgICAgICAvLyDkuI3lho3mlK/mjIHlh73mlbDlvaLlvI/vvIzlj6rov5Tlm57lrZfnrKbkuLJcclxuICAgICAgICByZXR1cm4gdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlIDogXCJcIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSDnm5HlkKznm7jlhbMgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgLy8g55uR5ZCs6KGo5Y2V5omA5pyJ5a2X5q615Y+Y5pu0XHJcbiAgd2F0Y2hGb3JtQ2hhbmdlczxUID0gYW55PihcclxuICAgIG5hbWU6IHN0cmluZyxcclxuICAgIGhhbmRsZXI6ICh2YWx1ZTogVCkgPT4gdm9pZCxcclxuICAgIG9wdGlvbnM/OiBXYXRjaE9wdGlvbnNcclxuICApOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5mb3JtU3RvcmVbbmFtZV07XHJcbiAgICBpZiAoIWZvcm1Hcm91cCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFtBbnRkRm9ybVNlcnZpY2VdIHdhdGNoRm9ybUNoYW5nZXM6IGZvcm0gXCIke25hbWV9XCIgbm90IGZvdW5kLmBcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zZXR1cFZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uKGZvcm1Hcm91cCwgaGFuZGxlciwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvLyDnm5HlkKzmjIflrprlrZfmrrXlj5jmm7RcclxuICB3YXRjaEZpZWxkQ2hhbmdlczxUID0gYW55PihcclxuICAgIG5hbWU6IHN0cmluZyxcclxuICAgIGNvbnRyb2xOYW1lOiBzdHJpbmcsXHJcbiAgICBoYW5kbGVyOiAodmFsdWU6IFQpID0+IHZvaWQsXHJcbiAgICBvcHRpb25zPzogV2F0Y2hPcHRpb25zXHJcbiAgKTogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZm9ybVN0b3JlW25hbWVdO1xyXG4gICAgaWYgKCFmb3JtR3JvdXApIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIGBbQW50ZEZvcm1TZXJ2aWNlXSB3YXRjaEZpZWxkQ2hhbmdlczogZm9ybSBcIiR7bmFtZX1cIiBub3QgZm91bmQuYFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGNvbnRyb2xOYW1lKTtcclxuICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFtBbnRkRm9ybVNlcnZpY2VdIHdhdGNoRmllbGRDaGFuZ2VzOiBjb250cm9sIFwiJHtjb250cm9sTmFtZX1cIiBub3QgZm91bmQgaW4gZm9ybSBcIiR7bmFtZX1cIi5gXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc2V0dXBWYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbihjb250cm9sLCBoYW5kbGVyLCBvcHRpb25zKTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IOW3peWFt+aWueazlSA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvLyDojrflj5booajljZXnsbvlkI1cclxuICBnZXRGb3JtQ2xhc3NOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7dGhpcy5jbGFzc1ByZWZpeH0ke25hbWV9YDtcclxuICB9XHJcblxyXG4gIC8vIOiuvue9riBDU1Mg5Y+Y6YeP5Yiw55uu5qCH5YWD57Sg77yI5pSv5oyB5oyB5LmF5YyW55uR5ZCs5Yqo5oCB5re75Yqg55qE5YWD57Sg77yJXHJcbiAgc2V0Q1NTVmFyaWFibGVzVG9UYXJnZXQobmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWxlY3RvciA9IGAuJHt0aGlzLmdldEZvcm1DbGFzc05hbWUobmFtZSl9IC5hbnQtZm9ybS1pdGVtLWxhYmVsYDtcclxuICAgIGNvbnN0IGZvcm1Db250YWluZXJTZWxlY3RvciA9IGAuJHt0aGlzLmdldEZvcm1DbGFzc05hbWUobmFtZSl9YDtcclxuICAgIGNvbnN0IGFwcGx5U3R5bGVzID0gKCk6IGJvb2xlYW4gPT4ge1xyXG4gICAgICBjb25zdCBkb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcclxuICAgICAgaWYgKCFkb20ubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBhcHBsaWVkQ291bnQgPSAwO1xyXG5cclxuICAgICAgZG9tLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICBjb25zdCB0YXJnZXQgPSBpdGVtIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGlmICh0YXJnZXQuY2xvc2VzdChcIi5wcm8tdGFibGUtY29udGFpbmVyXCIpKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGN1c3RvbVdpZHRoID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShcImN1c3RvbS13aWR0aFwiKTtcclxuICAgICAgICBjb25zdCBjdXN0b21BbGlnbiA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJjdXN0b20tYWxpZ25cIik7XHJcbiAgICAgICAgY29uc3QgZmluYWxXaWR0aCA9IGN1c3RvbVdpZHRoIHx8IHRoaXMubGFiZWxXaWR0aDtcclxuICAgICAgICBjb25zdCBmaW5hbFRleHRBbGlnbiA9IGN1c3RvbUFsaWduIHx8IHRoaXMubGFiZWxBbGlnbjtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB0YXJnZXQuc3R5bGUud2lkdGggIT09IGZpbmFsV2lkdGggfHxcclxuICAgICAgICAgIHRhcmdldC5zdHlsZS50ZXh0QWxpZ24gIT09IGZpbmFsVGV4dEFsaWduXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0YXJnZXQuc3R5bGUud2lkdGggPSBmaW5hbFdpZHRoO1xyXG4gICAgICAgICAgdGFyZ2V0LnN0eWxlLnRleHRBbGlnbiA9IGZpbmFsVGV4dEFsaWduO1xyXG4gICAgICAgICAgYXBwbGllZENvdW50Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGFwcGxpZWRDb3VudCA+IDA7XHJcbiAgICB9O1xyXG4gICAgaWYgKHRoaXMubGFiZWxPYnNlcnZlcnNbbmFtZV0pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IHRpbWVvdXQ6IGFueSA9IG51bGw7XHJcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcclxuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGltZW91dCk7XHJcbiAgICAgIHRpbWVvdXQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgYXBwbHlTdHlsZXMoKTtcclxuICAgICAgICB9LCAwKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGZvcm1Db250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGZvcm1Db250YWluZXJTZWxlY3Rvcik7XHJcbiAgICBvYnNlcnZlci5vYnNlcnZlKGZvcm1Db250YWluZXIgfHwgZG9jdW1lbnQuYm9keSwge1xyXG4gICAgICBjaGlsZExpc3Q6IHRydWUsXHJcbiAgICAgIHN1YnRyZWU6IHRydWUsXHJcbiAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMubGFiZWxPYnNlcnZlcnNbbmFtZV0gPSBvYnNlcnZlcjtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IOengeacieaWueazlSA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvLyDov4fmu6TlhoXpg6jlrZfmrrXvvIjpgJLlvZLlpITnkIblr7nosaHlkozmlbDnu4TvvIlcclxuICBwcml2YXRlIGV4Y2x1ZGVJbnRlcm5hbEZpZWxkcyh2YWx1ZTogYW55KTogYW55IHtcclxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlLm1hcCgoaXRlbSkgPT4gdGhpcy5leGNsdWRlSW50ZXJuYWxGaWVsZHMoaXRlbSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZpbHRlcmVkOiBhbnkgPSB7fTtcclxuICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XHJcbiAgICAgIC8vIOi/h+a7pOS7pSBfXyDlvIDlpLTnmoTlhoXpg6jlrZfmrrVcclxuICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChcIl9fXCIpKSB7XHJcbiAgICAgICAgZmlsdGVyZWRba2V5XSA9IHRoaXMuZXhjbHVkZUludGVybmFsRmllbGRzKHZhbCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZpbHRlcmVkO1xyXG4gIH1cclxuXHJcbiAgLy8g6K6+572u5YC85Y+Y5pu06K6i6ZiFXHJcbiAgcHJpdmF0ZSBzZXR1cFZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uPFQ+KFxyXG4gICAgdGFyZ2V0OiB7IHZhbHVlQ2hhbmdlczogYW55OyB2YWx1ZTogYW55IH0sXHJcbiAgICBoYW5kbGVyOiAodmFsdWU6IFQpID0+IHZvaWQsXHJcbiAgICBvcHRpb25zPzogV2F0Y2hPcHRpb25zXHJcbiAgKTogU3Vic2NyaXB0aW9uIHtcclxuICAgIGxldCB2YWx1ZUNoYW5nZXMkID0gdGFyZ2V0LnZhbHVlQ2hhbmdlcztcclxuXHJcbiAgICBpZiAob3B0aW9ucz8uZGVib3VuY2UgIT0gbnVsbCkge1xyXG4gICAgICB2YWx1ZUNoYW5nZXMkID0gdmFsdWVDaGFuZ2VzJC5waXBlKGRlYm91bmNlVGltZShvcHRpb25zLmRlYm91bmNlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9wdGlvbnM/LmRpc3RpbmN0VW50aWxDaGFuZ2VkICE9PSBmYWxzZSkge1xyXG4gICAgICB2YWx1ZUNoYW5nZXMkID0gdmFsdWVDaGFuZ2VzJC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvcHRpb25zPy5lbWl0SW5pdGlhbCkge1xyXG4gICAgICBoYW5kbGVyKHRhcmdldC52YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZhbHVlQ2hhbmdlcyQuc3Vic2NyaWJlKGhhbmRsZXIpO1xyXG4gIH1cclxufVxyXG4iXX0=