@libs-ui/components-preview-text-data 0.2.350-1 → 0.2.352-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,168 +1,222 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import { ChangeDetectionStrategy, Component, computed, inject, input, model, output, signal, viewChild } from '@angular/core';
3
- import { cpp } from '@codemirror/lang-cpp';
4
- import { css } from '@codemirror/lang-css';
5
- import { go } from '@codemirror/lang-go';
6
- import { html } from '@codemirror/lang-html';
7
- import { java } from '@codemirror/lang-java';
8
- import { javascript } from '@codemirror/lang-javascript';
9
- import { json } from '@codemirror/lang-json';
10
- import { markdown } from '@codemirror/lang-markdown';
11
- import { php } from '@codemirror/lang-php';
12
- import { python } from '@codemirror/lang-python';
13
- import { sql } from '@codemirror/lang-sql';
14
- import { xml } from '@codemirror/lang-xml';
15
- import { yaml } from '@codemirror/lang-yaml';
16
- import { StreamLanguage } from '@codemirror/language';
1
+ import { ChangeDetectionStrategy, Component, computed, DestroyRef, effect, inject, input, model, output, signal, viewChild } from '@angular/core';
17
2
  import { linter, lintGutter } from '@codemirror/lint';
18
- import { Compartment, EditorState } from '@codemirror/state';
19
- import { lineNumbers } from '@codemirror/view';
3
+ import { Compartment } from '@codemirror/state';
4
+ import { EditorView, lineNumbers } from '@codemirror/view';
20
5
  import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
21
6
  import { LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';
22
7
  import { LibsUiNotificationService } from '@libs-ui/services-notification';
23
8
  import { get } from '@libs-ui/utils';
24
- import { basicSetup, EditorView } from 'codemirror';
25
- import { Parser } from 'node-sql-parser';
26
- import { httpRequestConfigGetOptionsLang, optionsLang } from './preview-text-data.define';
9
+ import { basicSetup } from 'codemirror6';
10
+ import { createDefaultLanguage, httpRequestConfigGetOptionsLang, languageRegistry, optionsLangData } from './preview-text-data.define';
27
11
  import * as i0 from "@angular/core";
28
- const sqlParser = new Parser();
29
12
  export class LibsUiComponentsPreviewTextDataComponent {
13
+ // ==========================================================================
14
+ // PRIVATE PROPERTIES
15
+ // ==========================================================================
30
16
  editorViewInstance;
31
17
  wrapCompartment = new Compartment();
32
18
  languageCompartment = new Compartment();
33
19
  lineNumberCompartment = new Compartment();
20
+ linterCompartment = new Compartment();
21
+ /** Cache để tránh load lại language đã load */
22
+ languageCache = new Map();
23
+ /** Flag để tránh update editor khi đang khởi tạo */
24
+ isInitialized = false;
25
+ // ==========================================================================
26
+ // INJECTED SERVICES
27
+ // ==========================================================================
28
+ notificationService = inject(LibsUiNotificationService);
29
+ destroyRef = inject(DestroyRef);
30
+ // ==========================================================================
31
+ // PROTECTED SIGNALS
32
+ // ==========================================================================
34
33
  isWrap = signal(true);
35
34
  configLoadDataIsHttpConfig = httpRequestConfigGetOptionsLang();
36
- labelLang = computed(() => optionsLang().find((item) => item.id === this.langSelected())?.label);
37
- content = input('', { transform: (value) => value ?? '' });
35
+ labelLang = computed(() => optionsLangData.find((item) => item.id === this.langSelected())?.label);
36
+ // ==========================================================================
37
+ // INPUTS
38
+ // ==========================================================================
39
+ content = input('', {
40
+ transform: (value) => value ?? '',
41
+ });
38
42
  langSelected = model.required();
39
- editable = input(false, { transform: (value) => value ?? false });
40
- hiddenAction = input(false, { transform: (value) => value ?? false });
43
+ editable = input(false, {
44
+ transform: (value) => value ?? false,
45
+ });
46
+ hiddenAction = input(false, {
47
+ transform: (value) => value ?? false,
48
+ });
41
49
  lintIgnorePatterns = input(['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'], {
42
50
  transform: (value) => value ?? ['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'],
43
51
  });
44
- background = input('#f8f9fa', { transform: (value) => value ?? '#f8f9fa' });
52
+ background = input('#f8f9fa', {
53
+ transform: (value) => value ?? '#f8f9fa',
54
+ });
55
+ // ==========================================================================
56
+ // OUTPUTS
57
+ // ==========================================================================
45
58
  outChange = output();
46
59
  syntaxErrors = output();
60
+ // ==========================================================================
61
+ // VIEW CHILDREN
62
+ // ==========================================================================
47
63
  containerPreview = viewChild.required('containerPreview');
48
- notificationService = inject(LibsUiNotificationService);
49
- ngAfterViewInit() {
50
- this.editorViewInstance = new EditorView({ ...this.getExtensionsByLanguage(this.langSelected()), doc: this.content(), parent: this.containerPreview().nativeElement });
64
+ // ==========================================================================
65
+ // CONSTRUCTOR - Setup effects
66
+ // ==========================================================================
67
+ constructor() {
68
+ // Effect để sync content từ input vào editor
69
+ effect(() => {
70
+ const newContent = this.content();
71
+ if (this.isInitialized && this.editorViewInstance) {
72
+ const currentContent = this.editorViewInstance.state.doc.toString();
73
+ if (newContent !== currentContent) {
74
+ this.editorViewInstance.dispatch({
75
+ changes: {
76
+ from: 0,
77
+ to: currentContent.length,
78
+ insert: newContent,
79
+ },
80
+ });
81
+ }
82
+ }
83
+ });
84
+ // Cleanup khi component bị destroy
85
+ this.destroyRef.onDestroy(() => {
86
+ this.editorViewInstance?.destroy();
87
+ this.languageCache.clear();
88
+ });
51
89
  }
52
- getExtensionsByLanguage(lang) {
53
- let formatByLangFunction = StreamLanguage.define({
54
- token(stream) {
55
- stream.skipToEnd();
56
- return null;
57
- },
90
+ // ==========================================================================
91
+ // LIFECYCLE HOOKS
92
+ // ==========================================================================
93
+ async ngAfterViewInit() {
94
+ await this.initializeEditor();
95
+ this.isInitialized = true;
96
+ }
97
+ // ==========================================================================
98
+ // PRIVATE METHODS - Editor initialization
99
+ // ==========================================================================
100
+ /**
101
+ * Khởi tạo editor với các extensions cơ bản
102
+ * Language được load async để tối ưu bundle size
103
+ */
104
+ async initializeEditor() {
105
+ const languageExtension = await this.loadLanguageExtension(this.langSelected());
106
+ const linterExtension = await this.loadLinterExtension(this.langSelected());
107
+ this.editorViewInstance = new EditorView({
108
+ doc: this.content(),
109
+ parent: this.containerPreview().nativeElement,
110
+ extensions: this.createExtensions(languageExtension, linterExtension),
58
111
  });
59
- let lintFunction = linter(() => []);
112
+ }
113
+ /**
114
+ * Tạo danh sách extensions cho editor
115
+ */
116
+ createExtensions(languageExtension, linterExtension) {
117
+ return [
118
+ basicSetup,
119
+ this.languageCompartment.of(languageExtension),
120
+ this.linterCompartment.of(linterExtension),
121
+ this.createLightTheme(),
122
+ EditorView.editable.of(this.editable()),
123
+ this.wrapCompartment.of(EditorView.lineWrapping),
124
+ this.lineNumberCompartment.of(lineNumbers()),
125
+ lintGutter(),
126
+ this.createBracketTheme(),
127
+ this.createUpdateListener(),
128
+ ];
129
+ }
130
+ /**
131
+ * Load language extension với caching
132
+ * Mỗi language chỉ được load 1 lần
133
+ */
134
+ async loadLanguageExtension(lang) {
60
135
  const lowerLang = lang.toLowerCase();
61
- switch (lowerLang) {
62
- case 'javascript':
63
- formatByLangFunction = javascript({ jsx: true, typescript: true });
64
- lintFunction = this.jsLinterFn();
65
- break;
66
- case 'html':
67
- formatByLangFunction = html();
68
- break;
69
- case 'css':
70
- formatByLangFunction = css();
71
- break;
72
- case 'markdown':
73
- formatByLangFunction = markdown();
74
- break;
75
- case 'json':
76
- formatByLangFunction = json();
77
- lintFunction = this.jsonLinterFn();
78
- break;
79
- case 'sql':
80
- formatByLangFunction = sql();
81
- lintFunction = this.sqlLinterFn();
82
- break;
83
- case 'xml':
84
- formatByLangFunction = xml();
85
- break;
86
- case 'yaml':
87
- formatByLangFunction = yaml();
88
- break;
89
- case 'python':
90
- formatByLangFunction = python();
91
- break;
92
- case 'java':
93
- formatByLangFunction = java();
94
- break;
95
- case 'cpp':
96
- formatByLangFunction = cpp();
97
- break;
98
- case 'php':
99
- formatByLangFunction = php();
100
- break;
101
- case 'go':
102
- formatByLangFunction = go();
103
- break;
136
+ const cached = this.languageCache.get(lowerLang);
137
+ if (cached) {
138
+ return cached;
104
139
  }
105
- return {
106
- extensions: [
107
- basicSetup,
108
- this.languageCompartment.of(formatByLangFunction),
109
- this.lightTheme(),
110
- EditorView.editable.of(this.editable()),
111
- this.wrapCompartment.of(EditorView.lineWrapping),
112
- this.lineNumberCompartment.of(lineNumbers()),
113
- lintGutter(),
114
- this.customBracketTheme(),
115
- lintFunction,
116
- EditorView.updateListener.of((update) => {
117
- if (update.docChanged && this.editable()) {
118
- const newValue = update.state.doc.toString();
119
- this.outChange.emit({
120
- content: newValue,
121
- isWrap: this.isWrap(),
122
- language: this.langSelected(),
123
- contextChange: 'content',
124
- });
125
- }
126
- }),
127
- ],
128
- };
140
+ const registryItem = languageRegistry[lowerLang];
141
+ const extension = registryItem ? await registryItem.loader() : await createDefaultLanguage();
142
+ this.languageCache.set(lowerLang, extension);
143
+ return extension;
129
144
  }
130
- lightTheme() {
145
+ /**
146
+ * Load linter extension nếu có
147
+ */
148
+ async loadLinterExtension(lang) {
149
+ const lowerLang = lang.toLowerCase();
150
+ const registryItem = languageRegistry[lowerLang];
151
+ if (registryItem?.linter) {
152
+ return registryItem.linter(this);
153
+ }
154
+ return linter(() => []);
155
+ }
156
+ // ==========================================================================
157
+ // PRIVATE METHODS - Theme configuration
158
+ // ==========================================================================
159
+ createLightTheme() {
131
160
  return EditorView.theme({
132
161
  '&': { backgroundColor: this.background(), color: '#333' },
133
162
  '.cm-content': { caretColor: '#111' },
134
163
  '.cm-activeLine': { backgroundColor: '#f0f0f0' },
135
164
  });
136
165
  }
137
- customBracketTheme() {
166
+ createBracketTheme() {
138
167
  return EditorView.theme({
139
168
  '.cm-matchingBracket': {
140
- backgroundColor: 'rgba(100, 200, 255, 0.15)', // xanh nhẹ trong suốt
169
+ backgroundColor: 'rgba(100, 200, 255, 0.15)',
141
170
  border: '1px solid rgba(100, 200, 255, 0.4)',
142
171
  borderRadius: '3px',
143
172
  transition: 'all 0.2s ease',
144
173
  },
145
174
  '.cm-nonmatchingBracket': {
146
- backgroundColor: 'rgba(255, 100, 100, 0.15)', // đỏ nhẹ
175
+ backgroundColor: 'rgba(255, 100, 100, 0.15)',
147
176
  border: '1px solid rgba(255, 100, 100, 0.3)',
148
177
  borderRadius: '3px',
149
178
  },
150
179
  });
151
180
  }
152
- jsLinterFn() {
181
+ // ==========================================================================
182
+ // PRIVATE METHODS - Update listener
183
+ // ==========================================================================
184
+ createUpdateListener() {
185
+ return EditorView.updateListener.of((update) => {
186
+ if (update.docChanged && this.editable()) {
187
+ const newValue = update.state.doc.toString();
188
+ this.outChange.emit({
189
+ content: newValue,
190
+ isWrap: this.isWrap(),
191
+ language: this.langSelected(),
192
+ contextChange: 'content',
193
+ });
194
+ }
195
+ });
196
+ }
197
+ // ==========================================================================
198
+ // PUBLIC METHODS - Linter factories (được gọi từ registry)
199
+ // ==========================================================================
200
+ /**
201
+ * Tạo JavaScript linter
202
+ * Sử dụng Function constructor để validate syntax
203
+ */
204
+ createJsLinter() {
153
205
  return linter((view) => {
154
206
  const text = view.state.doc.toString();
155
207
  const diagnostics = [];
156
208
  try {
157
- new Function(text); // test parse code
209
+ new Function(text);
158
210
  }
159
211
  catch (err) {
160
- if (!this.lintIgnorePatterns().some((pattern) => err.message.includes(pattern))) {
212
+ const message = get(err, 'message', '');
213
+ const shouldIgnore = this.lintIgnorePatterns().some((pattern) => message.includes(pattern));
214
+ if (!shouldIgnore) {
161
215
  diagnostics.push({
162
216
  from: 0,
163
217
  to: text.length,
164
218
  severity: 'error',
165
- message: err.message,
219
+ message,
166
220
  });
167
221
  this.syntaxErrors.emit(diagnostics);
168
222
  }
@@ -170,7 +224,11 @@ export class LibsUiComponentsPreviewTextDataComponent {
170
224
  return diagnostics;
171
225
  });
172
226
  }
173
- jsonLinterFn() {
227
+ /**
228
+ * Tạo JSON linter
229
+ * Sử dụng JSON.parse để validate
230
+ */
231
+ createJsonLinter() {
174
232
  return linter((view) => {
175
233
  const text = view.state.doc.toString();
176
234
  const diagnostics = [];
@@ -189,11 +247,18 @@ export class LibsUiComponentsPreviewTextDataComponent {
189
247
  return diagnostics;
190
248
  });
191
249
  }
192
- sqlLinterFn() {
193
- return linter((view) => {
250
+ /**
251
+ * Tạo SQL linter
252
+ * Lazy load node-sql-parser chỉ khi cần
253
+ */
254
+ createSqlLinter() {
255
+ return linter(async (view) => {
194
256
  const text = view.state.doc.toString();
195
257
  const diagnostics = [];
196
258
  try {
259
+ // Lazy load SQL parser chỉ khi thực sự cần
260
+ const { Parser } = await import('node-sql-parser');
261
+ const sqlParser = new Parser();
197
262
  sqlParser.astify(text);
198
263
  }
199
264
  catch (err) {
@@ -208,36 +273,50 @@ export class LibsUiComponentsPreviewTextDataComponent {
208
273
  return diagnostics;
209
274
  });
210
275
  }
276
+ // ==========================================================================
277
+ // PROTECTED METHODS - Event handlers
278
+ // ==========================================================================
211
279
  handlerCopy() {
212
280
  navigator.clipboard.writeText(this.content() || '');
213
281
  this.notificationService.showCompTypeTextInfo('Sao chép thành công');
214
282
  }
215
283
  handlerLineWrap() {
284
+ console.log('handlerLineWrap', this.isWrap());
285
+ // Lấy nội dung mới nhất từ editor sau khi đã xóa newlines
286
+ const currentContent = this.editorViewInstance?.state.doc.toString() || '';
287
+ const updatedContent = this.isWrap() && currentContent ? currentContent.replace(/\n/g, ' ') : this.content();
216
288
  this.isWrap.update((val) => !val);
289
+ console.log('updatedContent', this.isWrap());
290
+ console.log('currentContent', currentContent);
291
+ console.log('updatedContent', updatedContent);
292
+ if (currentContent !== updatedContent) {
293
+ this.editorViewInstance?.dispatch({
294
+ changes: { from: 0, to: currentContent.length, insert: updatedContent },
295
+ });
296
+ }
297
+ // Batch cả 2 dispatch thành 1 để tối ưu performance
217
298
  this.editorViewInstance?.dispatch({
218
- effects: this.wrapCompartment.reconfigure(this.isWrap() ? EditorView.lineWrapping : []),
219
- });
220
- this.editorViewInstance?.dispatch({
221
- effects: this.lineNumberCompartment.reconfigure(this.isWrap() ? lineNumbers() : [] // 👈 nếu tắt thì remove extension
222
- ),
299
+ effects: [this.wrapCompartment.reconfigure(this.isWrap() ? EditorView.lineWrapping : []), this.lineNumberCompartment.reconfigure(this.isWrap() ? lineNumbers() : [])],
223
300
  });
224
301
  this.outChange.emit({
225
- content: this.content(),
302
+ content: updatedContent,
226
303
  isWrap: this.isWrap(),
227
304
  language: this.langSelected(),
228
305
  contextChange: 'isWrap',
229
306
  });
230
307
  }
231
- handlerSelectKey(data) {
232
- if (!data || !data.key) {
308
+ async handlerSelectKey(data) {
309
+ if (!data?.key) {
233
310
  return;
234
311
  }
235
- this.langSelected.set(data.key);
236
- const extensions = this.getExtensionsByLanguage(this.langSelected());
237
- this.editorViewInstance?.setState(EditorState.create({
238
- doc: this.editorViewInstance?.state.doc.toString(),
239
- ...extensions,
240
- }));
312
+ const newLang = data.key;
313
+ this.langSelected.set(newLang);
314
+ // Load language và linter mới
315
+ const [languageExtension, linterExtension] = await Promise.all([this.loadLanguageExtension(newLang), this.loadLinterExtension(newLang)]);
316
+ // Reconfigure thay vì tạo mới state để giữ lại document content
317
+ this.editorViewInstance?.dispatch({
318
+ effects: [this.languageCompartment.reconfigure(languageExtension), this.linterCompartment.reconfigure(linterExtension)],
319
+ });
241
320
  this.outChange.emit({
242
321
  content: this.content(),
243
322
  isWrap: this.isWrap(),
@@ -251,5 +330,5 @@ export class LibsUiComponentsPreviewTextDataComponent {
251
330
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPreviewTextDataComponent, decorators: [{
252
331
  type: Component,
253
332
  args: [{ selector: 'libs_ui-components-preview_text_data', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [LibsUiComponentsDropdownComponent, LibsUiComponentsButtonsButtonComponent], template: "<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig\"\n [listMaxItemShow]=\"5\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n", styles: [":host ::ng-deep .libs-ui-preview-data-container{background-color:var(--background-color)!important}:host ::ng-deep .libs-ui-preview-data-container .cm-line{white-space:pre-wrap}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-error{background-color:#ff323233;border-bottom:2px solid red}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-warning{background-color:#ffc80026}:host ::ng-deep .libs-ui-preview-data-container .cm-tooltip-lint{background:#fff8f8;color:#d32f2f;border:1px solid #f44336;padding:8px 10px;font-size:13px;font-family:Inter,sans-serif;border-radius:6px;box-shadow:0 2px 8px #ff000026}:host ::ng-deep .libs-ui-preview-data-container .cm-focused{outline:none!important}:host ::ng-deep .libs-ui-preview-data-container .cm-gutters{background-color:var(--background-color)!important}\n"] }]
254
- }] });
255
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3ByZXZpZXctdGV4dC1kYXRhL3NyYy9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcHJldmlldy10ZXh0LWRhdGEvc3JjL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQWMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekosT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDekQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzQyxP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Q0FBQztZQUN2QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUF5QyxDQUFDLENBQUM7UUFDdEUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQy9CLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDakIsR0FBRyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRTtZQUNsRCxHQUFHLFVBQVU7U0FDZCxDQUFDLENBQ0gsQ0FBQztRQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3JCLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQzdCLGFBQWEsRUFBRSxVQUFVO1NBQzFCLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBMVBVLHdDQUF3Qzs0RkFBeEMsd0NBQXdDLHVwQ0N2Q3JELGcwREF5Q0EsbzNCREpZLGlDQUFpQyxpMURBQUUsc0NBQXNDOzs0RkFFeEUsd0NBQXdDO2tCQVRwRCxTQUFTOytCQUVFLHNDQUFzQyxjQUdwQyxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxpQ0FBaUMsRUFBRSxzQ0FBc0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBtb2RlbCwgb3V0cHV0LCBzaWduYWwsIHZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY3BwIH0gZnJvbSAnQGNvZGVtaXJyb3IvbGFuZy1jcHAnO1xuaW1wb3J0IHsgY3NzIH0gZnJvbSAnQGNvZGVtaXJyb3IvbGFuZy1jc3MnO1xuaW1wb3J0IHsgZ28gfSBmcm9tICdAY29kZW1pcnJvci9sYW5nLWdvJztcbmltcG9ydCB7IGh0bWwgfSBmcm9tICdAY29kZW1pcnJvci9sYW5nLWh0bWwnO1xuaW1wb3J0IHsgamF2YSB9IGZyb20gJ0Bjb2RlbWlycm9yL2xhbmctamF2YSc7XG5pbXBvcnQgeyBqYXZhc2NyaXB0IH0gZnJvbSAnQGNvZGVtaXJyb3IvbGFuZy1qYXZhc2NyaXB0JztcbmltcG9ydCB7IGpzb24gfSBmcm9tICdAY29kZW1pcnJvci9sYW5nLWpzb24nO1xuaW1wb3J0IHsgbWFya2Rvd24gfSBmcm9tICdAY29kZW1pcnJvci9sYW5nLW1hcmtkb3duJztcbmltcG9ydCB7IHBocCB9IGZyb20gJ0Bjb2RlbWlycm9yL2xhbmctcGhwJztcbmltcG9ydCB7IHB5dGhvbiB9IGZyb20gJ0Bjb2RlbWlycm9yL2xhbmctcHl0aG9uJztcbmltcG9ydCB7IHNxbCB9IGZyb20gJ0Bjb2RlbWlycm9yL2xhbmctc3FsJztcbmltcG9ydCB7IHhtbCB9IGZyb20gJ0Bjb2RlbWlycm9yL2xhbmcteG1sJztcbmltcG9ydCB7IHlhbWwgfSBmcm9tICdAY29kZW1pcnJvci9sYW5nLXlhbWwnO1xuaW1wb3J0IHsgU3RyZWFtTGFuZ3VhZ2UgfSBmcm9tICdAY29kZW1pcnJvci9sYW5ndWFnZSc7XG5pbXBvcnQgeyBEaWFnbm9zdGljLCBsaW50ZXIsIGxpbnRHdXR0ZXIgfSBmcm9tICdAY29kZW1pcnJvci9saW50JztcbmltcG9ydCB7IENvbXBhcnRtZW50LCBFZGl0b3JTdGF0ZSB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IGxpbmVOdW1iZXJzIH0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgTGlic1VpTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJ0BsaWJzLXVpL3NlcnZpY2VzLW5vdGlmaWNhdGlvbic7XG5pbXBvcnQgeyBnZXQgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBiYXNpY1NldHVwLCBFZGl0b3JWaWV3IH0gZnJvbSAnY29kZW1pcnJvcic7XG5pbXBvcnQgeyBQYXJzZXIgfSBmcm9tICdub2RlLXNxbC1wYXJzZXInO1xuaW1wb3J0IHsgaHR0cFJlcXVlc3RDb25maWdHZXRPcHRpb25zTGFuZywgb3B0aW9uc0xhbmcgfSBmcm9tICcuL3ByZXZpZXctdGV4dC1kYXRhLmRlZmluZSc7XG5pbXBvcnQgeyBJUHJldmlld1RleHREYXRhQ2hhbmdlLCBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUIH0gZnJvbSAnLi9wcmV2aWV3LXRleHQtZGF0YS5pbnRlcmZhY2VzJztcblxuY29uc3Qgc3FsUGFyc2VyID0gbmV3IFBhcnNlcigpO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtcHJldmlld190ZXh0X2RhdGEnLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0xpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzUHJldmlld1RleHREYXRhQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIHByaXZhdGUgZWRpdG9yVmlld0luc3RhbmNlPzogRWRpdG9yVmlldztcbiAgcHJpdmF0ZSB3cmFwQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSBsYW5ndWFnZUNvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KCk7XG4gIHByaXZhdGUgbGluZU51bWJlckNvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KCk7XG5cbiAgcHJvdGVjdGVkIGlzV3JhcCA9IHNpZ25hbDxib29sZWFuPih0cnVlKTtcbiAgcHJvdGVjdGVkIGNvbmZpZ0xvYWREYXRhSXNIdHRwQ29uZmlnID0gaHR0cFJlcXVlc3RDb25maWdHZXRPcHRpb25zTGFuZygpO1xuICBwcm90ZWN0ZWQgbGFiZWxMYW5nID0gY29tcHV0ZWQoKCkgPT4gb3B0aW9uc0xhbmcoKS5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSB0aGlzLmxhbmdTZWxlY3RlZCgpKT8ubGFiZWwpO1xuXG4gIHJlYWRvbmx5IGNvbnRlbnQgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiAodmFsdWU/OiBzdHJpbmcpID0+IHZhbHVlID8/ICcnIH0pO1xuICByZWFkb25seSBsYW5nU2VsZWN0ZWQgPSBtb2RlbC5yZXF1aXJlZDxQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUPigpO1xuICByZWFkb25seSBlZGl0YWJsZSA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogKHZhbHVlPzogYm9vbGVhbikgPT4gdmFsdWUgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGhpZGRlbkFjdGlvbiA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogKHZhbHVlPzogYm9vbGVhbikgPT4gdmFsdWUgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGxpbnRJZ25vcmVQYXR0ZXJucyA9IGlucHV0PEFycmF5PHN0cmluZz4sIEFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQ+KFsnQ2Fubm90IHVzZSBpbXBvcnQgc3RhdGVtZW50IG91dHNpZGUgYSBtb2R1bGUnLCAnVW5leHBlY3RlZCB0b2tlbiBleHBvcnQnLCAnaW1wb3J0ICcsICdAYW5ndWxhci9jb3JlJ10sIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IEFycmF5PHN0cmluZz4pID0+IHZhbHVlID8/IFsnQ2Fubm90IHVzZSBpbXBvcnQgc3RhdGVtZW50IG91dHNpZGUgYSBtb2R1bGUnLCAnVW5leHBlY3RlZCB0b2tlbiBleHBvcnQnLCAnaW1wb3J0ICcsICdAYW5ndWxhci9jb3JlJ10sXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGJhY2tncm91bmQgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJyNmOGY5ZmEnLCB7IHRyYW5zZm9ybTogKHZhbHVlPzogc3RyaW5nKSA9PiB2YWx1ZSA/PyAnI2Y4ZjlmYScgfSk7XG5cbiAgcmVhZG9ubHkgb3V0Q2hhbmdlID0gb3V0cHV0PElQcmV2aWV3VGV4dERhdGFDaGFuZ2U+KCk7XG4gIHJlYWRvbmx5IHN5bnRheEVycm9ycyA9IG91dHB1dDxEaWFnbm9zdGljW10+KCk7XG5cbiAgcHJpdmF0ZSBjb250YWluZXJQcmV2aWV3ID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignY29udGFpbmVyUHJldmlldycpO1xuXG4gIHByaXZhdGUgbm90aWZpY2F0aW9uU2VydmljZSA9IGluamVjdChMaWJzVWlOb3RpZmljYXRpb25TZXJ2aWNlKTtcbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlID0gbmV3IEVkaXRvclZpZXcoeyAuLi50aGlzLmdldEV4dGVuc2lvbnNCeUxhbmd1YWdlKHRoaXMubGFuZ1NlbGVjdGVkKCkpLCBkb2M6IHRoaXMuY29udGVudCgpLCBwYXJlbnQ6IHRoaXMuY29udGFpbmVyUHJldmlldygpLm5hdGl2ZUVsZW1lbnQgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldEV4dGVuc2lvbnNCeUxhbmd1YWdlKGxhbmc6IFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQpOiBhbnkge1xuICAgIGxldCBmb3JtYXRCeUxhbmdGdW5jdGlvbjogYW55ID0gU3RyZWFtTGFuZ3VhZ2UuZGVmaW5lKHtcbiAgICAgIHRva2VuKHN0cmVhbTogYW55KSB7XG4gICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGxldCBsaW50RnVuY3Rpb24gPSBsaW50ZXIoKCkgPT4gW10pO1xuXG4gICAgY29uc3QgbG93ZXJMYW5nID0gbGFuZy50b0xvd2VyQ2FzZSgpO1xuXG4gICAgc3dpdGNoIChsb3dlckxhbmcpIHtcbiAgICAgIGNhc2UgJ2phdmFzY3JpcHQnOlxuICAgICAgICBmb3JtYXRCeUxhbmdGdW5jdGlvbiA9IGphdmFzY3JpcHQoeyBqc3g6IHRydWUsIHR5cGVzY3JpcHQ6IHRydWUgfSk7XG4gICAgICAgIGxpbnRGdW5jdGlvbiA9IHRoaXMuanNMaW50ZXJGbigpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICAgIGZvcm1hdEJ5TGFuZ0Z1bmN0aW9uID0gaHRtbCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnY3NzJzpcbiAgICAgICAgZm9ybWF0QnlMYW5nRnVuY3Rpb24gPSBjc3MoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ21hcmtkb3duJzpcbiAgICAgICAgZm9ybWF0QnlMYW5nRnVuY3Rpb24gPSBtYXJrZG93bigpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgIGZvcm1hdEJ5TGFuZ0Z1bmN0aW9uID0ganNvbigpO1xuICAgICAgICBsaW50RnVuY3Rpb24gPSB0aGlzLmpzb25MaW50ZXJGbigpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnc3FsJzpcbiAgICAgICAgZm9ybWF0QnlMYW5nRnVuY3Rpb24gPSBzcWwoKTtcbiAgICAgICAgbGludEZ1bmN0aW9uID0gdGhpcy5zcWxMaW50ZXJGbigpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAneG1sJzpcbiAgICAgICAgZm9ybWF0QnlMYW5nRnVuY3Rpb24gPSB4bWwoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3lhbWwnOlxuICAgICAgICBmb3JtYXRCeUxhbmdGdW5jdGlvbiA9IHlhbWwoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3B5dGhvbic6XG4gICAgICAgIGZvcm1hdEJ5TGFuZ0Z1bmN0aW9uID0gcHl0aG9uKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdqYXZhJzpcbiAgICAgICAgZm9ybWF0QnlMYW5nRnVuY3Rpb24gPSBqYXZhKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdjcHAnOlxuICAgICAgICBmb3JtYXRCeUxhbmdGdW5jdGlvbiA9IGNwcCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncGhwJzpcbiAgICAgICAgZm9ybWF0QnlMYW5nRnVuY3Rpb24gPSBwaHAoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2dvJzpcbiAgICAgICAgZm9ybWF0QnlMYW5nRnVuY3Rpb24gPSBnbygpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZXh0ZW5zaW9uczogW1xuICAgICAgICBiYXNpY1NldHVwLFxuICAgICAgICB0aGlzLmxhbmd1YWdlQ29tcGFydG1lbnQub2YoZm9ybWF0QnlMYW5nRnVuY3Rpb24pLFxuICAgICAgICB0aGlzLmxpZ2h0VGhlbWUoKSxcbiAgICAgICAgRWRpdG9yVmlldy5lZGl0YWJsZS5vZih0aGlzLmVkaXRhYmxlKCkpLFxuICAgICAgICB0aGlzLndyYXBDb21wYXJ0bWVudC5vZihFZGl0b3JWaWV3LmxpbmVXcmFwcGluZyksXG4gICAgICAgIHRoaXMubGluZU51bWJlckNvbXBhcnRtZW50Lm9mKGxpbmVOdW1iZXJzKCkpLFxuICAgICAgICBsaW50R3V0dGVyKCksXG4gICAgICAgIHRoaXMuY3VzdG9tQnJhY2tldFRoZW1lKCksXG4gICAgICAgIGxpbnRGdW5jdGlvbixcbiAgICAgICAgRWRpdG9yVmlldy51cGRhdGVMaXN0ZW5lci5vZigodXBkYXRlOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQgJiYgdGhpcy5lZGl0YWJsZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHVwZGF0ZS5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgdGhpcy5vdXRDaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IG5ld1ZhbHVlLFxuICAgICAgICAgICAgICBpc1dyYXA6IHRoaXMuaXNXcmFwKCksXG4gICAgICAgICAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmdTZWxlY3RlZCgpLFxuICAgICAgICAgICAgICBjb250ZXh0Q2hhbmdlOiAnY29udGVudCcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBsaWdodFRoZW1lKCkge1xuICAgIHJldHVybiBFZGl0b3JWaWV3LnRoZW1lKHtcbiAgICAgICcmJzogeyBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuYmFja2dyb3VuZCgpLCBjb2xvcjogJyMzMzMnIH0sXG4gICAgICAnLmNtLWNvbnRlbnQnOiB7IGNhcmV0Q29sb3I6ICcjMTExJyB9LFxuICAgICAgJy5jbS1hY3RpdmVMaW5lJzogeyBiYWNrZ3JvdW5kQ29sb3I6ICcjZjBmMGYwJyB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjdXN0b21CcmFja2V0VGhlbWUoKSB7XG4gICAgcmV0dXJuIEVkaXRvclZpZXcudGhlbWUoe1xuICAgICAgJy5jbS1tYXRjaGluZ0JyYWNrZXQnOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMTAwLCAyMDAsIDI1NSwgMC4xNSknLCAvLyB4YW5oIG5o4bq5IHRyb25nIHN14buRdFxuICAgICAgICBib3JkZXI6ICcxcHggc29saWQgcmdiYSgxMDAsIDIwMCwgMjU1LCAwLjQpJyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgdHJhbnNpdGlvbjogJ2FsbCAwLjJzIGVhc2UnLFxuICAgICAgfSxcbiAgICAgICcuY20tbm9ubWF0Y2hpbmdCcmFja2V0Jzoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMTAwLCAxMDAsIDAuMTUpJywgLy8gxJHhu48gbmjhurlcbiAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkIHJnYmEoMjU1LCAxMDAsIDEwMCwgMC4zKScsXG4gICAgICAgIGJvcmRlclJhZGl1czogJzNweCcsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBqc0xpbnRlckZuKCkge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXc6IGFueSkgPT4ge1xuICAgICAgY29uc3QgdGV4dCA9IHZpZXcuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdID0gW107XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgRnVuY3Rpb24odGV4dCk7IC8vIHRlc3QgcGFyc2UgY29kZVxuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpbnRJZ25vcmVQYXR0ZXJucygpLnNvbWUoKHBhdHRlcm46IGFueSkgPT4gZXJyLm1lc3NhZ2UuaW5jbHVkZXMocGF0dGVybikpKSB7XG4gICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgICBmcm9tOiAwLFxuICAgICAgICAgICAgdG86IHRleHQubGVuZ3RoLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnN5bnRheEVycm9ycy5lbWl0KGRpYWdub3N0aWNzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRpYWdub3N0aWNzO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBqc29uTGludGVyRm4oKSB7XG4gICAgcmV0dXJuIGxpbnRlcigodmlldzogYW55KSA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gdmlldy5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIEpTT04ucGFyc2UodGV4dCk7XG4gICAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgZnJvbTogMCxcbiAgICAgICAgICB0bzogdGV4dC5sZW5ndGgsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgbWVzc2FnZTogZ2V0KGVyciwgJ21lc3NhZ2UnLCAnJyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNxbExpbnRlckZuKCkge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXc6IGFueSkgPT4ge1xuICAgICAgY29uc3QgdGV4dCA9IHZpZXcuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdID0gW107XG4gICAgICB0cnkge1xuICAgICAgICBzcWxQYXJzZXIuYXN0aWZ5KHRleHQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgIGZyb206IDAsXG4gICAgICAgICAgdG86IHRleHQubGVuZ3RoLFxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgIG1lc3NhZ2U6IGdldChlcnIsICdtZXNzYWdlJywgJycpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3ludGF4RXJyb3JzLmVtaXQoZGlhZ25vc3RpY3MpO1xuICAgICAgcmV0dXJuIGRpYWdub3N0aWNzO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDb3B5KCkge1xuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRoaXMuY29udGVudCgpIHx8ICcnKTtcbiAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0NvbXBUeXBlVGV4dEluZm8oJ1NhbyBjaMOpcCB0aMOgbmggY8O0bmcnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTGluZVdyYXAoKSB7XG4gICAgdGhpcy5pc1dyYXAudXBkYXRlKCh2YWw6IGFueSkgPT4gIXZhbCk7XG4gICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LmRpc3BhdGNoKHtcbiAgICAgIGVmZmVjdHM6IHRoaXMud3JhcENvbXBhcnRtZW50LnJlY29uZmlndXJlKHRoaXMuaXNXcmFwKCkgPyBFZGl0b3JWaWV3LmxpbmVXcmFwcGluZyA6IFtdKSxcbiAgICB9KTtcblxuICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5kaXNwYXRjaCh7XG4gICAgICBlZmZlY3RzOiB0aGlzLmxpbmVOdW1iZXJDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZShcbiAgICAgICAgdGhpcy5pc1dyYXAoKSA/IGxpbmVOdW1iZXJzKCkgOiBbXSAvLyDwn5GIIG7hur91IHThuq90IHRow6wgcmVtb3ZlIGV4dGVuc2lvblxuICAgICAgKSxcbiAgICB9KTtcbiAgICB0aGlzLm91dENoYW5nZS5lbWl0KHtcbiAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudCgpLFxuICAgICAgaXNXcmFwOiB0aGlzLmlzV3JhcCgpLFxuICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ1NlbGVjdGVkKCksXG4gICAgICBjb250ZXh0Q2hhbmdlOiAnaXNXcmFwJyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2VsZWN0S2V5KGRhdGE/OiBJRW1pdFNlbGVjdEtleSkge1xuICAgIGlmICghZGF0YSB8fCAhZGF0YS5rZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sYW5nU2VsZWN0ZWQuc2V0KGRhdGEua2V5IGFzIFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQpO1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSB0aGlzLmdldEV4dGVuc2lvbnNCeUxhbmd1YWdlKHRoaXMubGFuZ1NlbGVjdGVkKCkpO1xuICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5zZXRTdGF0ZShcbiAgICAgIEVkaXRvclN0YXRlLmNyZWF0ZSh7XG4gICAgICAgIGRvYzogdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LnN0YXRlLmRvYy50b1N0cmluZygpLFxuICAgICAgICAuLi5leHRlbnNpb25zLFxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMub3V0Q2hhbmdlLmVtaXQoe1xuICAgICAgY29udGVudDogdGhpcy5jb250ZW50KCksXG4gICAgICBpc1dyYXA6IHRoaXMuaXNXcmFwKCksXG4gICAgICBsYW5ndWFnZTogdGhpcy5sYW5nU2VsZWN0ZWQoKSxcbiAgICAgIGNvbnRleHRDaGFuZ2U6ICdsYW5ndWFnZScsXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJsaWJzLXVpLXByZXZpZXctZGF0YS1jb250YWluZXIgZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1hdXRvIHJvdW5kZWQtWzhweF0gbGlicy11aS1ib3JkZXItZ2VuZXJhbCBweC1bOHB4XVwiXG4gIFtzdHlsZS4tLWJhY2tncm91bmQtY29sb3JdPVwiYmFja2dyb3VuZCgpXCJcbiAgW2NsYXNzLnB0LVs4cHhdXT1cIiFoaWRkZW5BY3Rpb24oKVwiPlxuICBAaWYgKCFoaWRkZW5BY3Rpb24oKSkge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBjb250ZW50LWJldHdlZW4gY29sb3ItWyM2YTczODNdXCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duXG4gICAgICAgIGNsYXNzSW5jbHVkZT1cInctWzIwMHB4XVwiXG4gICAgICAgIFtsaXN0Q29uZmlnXT1cImNvbmZpZ0xvYWREYXRhSXNIdHRwQ29uZmlnXCJcbiAgICAgICAgW2xpc3RNYXhJdGVtU2hvd109XCI1XCJcbiAgICAgICAgW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICBbcmVhZG9ubHldPVwiIWVkaXRhYmxlKClcIlxuICAgICAgICBbbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0S2V5KCRldmVudClcIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgIFtsYWJlbF09XCJsYWJlbExhbmcoKSB8fCAnJ1wiXG4gICAgICAgICAgW3NpemVCdXR0b25dPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW2NsYXNzSWNvblJpZ2h0XT1cImVkaXRhYmxlKCkgPyAnbGlicy11aS1pY29uLW1vdmUtcmlnaHQgcm90YXRlLTkwJyA6ICcnXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC1bMHB4XScgKyAoZWRpdGFibGUoKSA/ICcnIDogJyFwb2ludGVyLWV2ZW50cy1ub25lICFjdXJzb3ItZGVmYXVsdCBob3ZlcjohdGV4dC1bIzZBNzM4M10nKVwiIC8+XG4gICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXRoaXJkJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cImlzV3JhcCgpID8gJ2kxOG5fcmVtb3ZlX2xpbmVfd3JhcCcgOiAnaTE4bl9saW5lX3dyYXAnXCJcbiAgICAgICAgICBbc2l6ZUJ1dHRvbl09XCInc21hbGwnXCJcbiAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJpc1dyYXAoKSA/ICdsaWJzLXVpLWljb24tdW53cmFwJyA6ICdsaWJzLXVpLWljb24td3JhcCdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ21vLWxpYi1wLTBweCBtby1saWItbXItMTZweCdcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyTGluZVdyYXAoKVwiIC8+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICBbbGFiZWxdPVwiJ2kxOG5fY29weSdcIlxuICAgICAgICAgIFtzaXplQnV0dG9uXT1cIidzbWFsbCdcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tY29weSdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ21vLWxpYi1wLTBweCdcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ29weSgpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG4gIDxkaXYgI2NvbnRhaW5lclByZXZpZXc+PC9kaXY+XG48L2Rpdj5cbiJdfQ==
333
+ }], ctorParameters: () => [] });
334
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3ByZXZpZXctdGV4dC1kYXRhL3NyYy9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcHJldmlldy10ZXh0LWRhdGEvc3JjL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdLLE9BQU8sRUFBYyxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBYSxNQUFNLG1CQUFtQixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFjLE1BQU0sa0JBQWtCLENBQUM7QUFDdkUsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFrQixpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSwrQkFBK0IsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFXdkksTUFBTSxPQUFPLHdDQUF3QztJ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QUVILElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3JCLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQzdCLGFBQWEsRUFBRSxVQUFVO1NBQzFCLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBblhVLHdDQUF3Qzs0RkFBeEMsd0NBQXdDLHVwQ0NwQnJELGcwREF5Q0EsbzNCRHZCWSxpQ0FBaUMsaTFEQUFFLHNDQUFzQzs7NEZBRXhFLHdDQUF3QztrQkFUcEQsU0FBUzsrQkFFRSxzQ0FBc0MsY0FHcEMsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDLENBQUMsaUNBQWlDLEVBQUUsc0NBQXNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgRGVzdHJveVJlZiwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBtb2RlbCwgb3V0cHV0LCBzaWduYWwsIHZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGlhZ25vc3RpYywgbGludGVyLCBsaW50R3V0dGVyIH0gZnJvbSAnQGNvZGVtaXJyb3IvbGludCc7XG5pbXBvcnQgeyBDb21wYXJ0bWVudCwgRXh0ZW5zaW9uIH0gZnJvbSAnQGNvZGVtaXJyb3Ivc3RhdGUnO1xuaW1wb3J0IHsgRWRpdG9yVmlldywgbGluZU51bWJlcnMsIFZpZXdVcGRhdGUgfSBmcm9tICdAY29kZW1pcnJvci92aWV3JztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJRW1pdFNlbGVjdEtleSwgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1kcm9wZG93bic7XG5pbXBvcnQgeyBMaWJzVWlOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnQGxpYnMtdWkvc2VydmljZXMtbm90aWZpY2F0aW9uJztcbmltcG9ydCB7IGdldCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IGJhc2ljU2V0dXAgfSBmcm9tICdjb2RlbWlycm9yNic7XG5pbXBvcnQgeyBjcmVhdGVEZWZhdWx0TGFuZ3VhZ2UsIGh0dHBSZXF1ZXN0Q29uZmlnR2V0T3B0aW9uc0xhbmcsIGxhbmd1YWdlUmVnaXN0cnksIG9wdGlvbnNMYW5nRGF0YSB9IGZyb20gJy4vcHJldmlldy10ZXh0LWRhdGEuZGVmaW5lJztcbmltcG9ydCB7IElQcmV2aWV3VGV4dERhdGFDaGFuZ2UsIFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQgfSBmcm9tICcuL3ByZXZpZXctdGV4dC1kYXRhLmludGVyZmFjZXMnO1xuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXByZXZpZXdfdGV4dF9kYXRhJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1ByZXZpZXdUZXh0RGF0YUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIFBST1BFUlRJRVNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIGVkaXRvclZpZXdJbnN0YW5jZT86IEVkaXRvclZpZXc7XG4gIHByaXZhdGUgcmVhZG9ubHkgd3JhcENvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGFuZ3VhZ2VDb21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxpbmVOdW1iZXJDb21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxpbnRlckNvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KCk7XG5cbiAgLyoqIENhY2hlIMSR4buDIHRyw6FuaCBsb2FkIGzhuqFpIGxhbmd1YWdlIMSRw6MgbG9hZCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGxhbmd1YWdlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgRXh0ZW5zaW9uPigpO1xuXG4gIC8qKiBGbGFnIMSR4buDIHRyw6FuaCB1cGRhdGUgZWRpdG9yIGtoaSDEkWFuZyBraOG7n2kgdOG6oW8gKi9cbiAgcHJpdmF0ZSBpc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSU5KRUNURUQgU0VSVklDRVNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmaWNhdGlvblNlcnZpY2UgPSBpbmplY3QoTGlic1VpTm90aWZpY2F0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUk9URUNURUQgU0lHTkFMU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBpc1dyYXAgPSBzaWduYWw8Ym9vbGVhbj4odHJ1ZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBjb25maWdMb2FkRGF0YUlzSHR0cENvbmZpZyA9IGh0dHBSZXF1ZXN0Q29uZmlnR2V0T3B0aW9uc0xhbmcoKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxhYmVsTGFuZyA9IGNvbXB1dGVkKCgpID0+IG9wdGlvbnNMYW5nRGF0YS5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSB0aGlzLmxhbmdTZWxlY3RlZCgpKT8ubGFiZWwpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElOUFVUU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHJlYWRvbmx5IGNvbnRlbnQgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IHN0cmluZykgPT4gdmFsdWUgPz8gJycsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGxhbmdTZWxlY3RlZCA9IG1vZGVsLnJlcXVpcmVkPFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQ+KCk7XG5cbiAgcmVhZG9ubHkgZWRpdGFibGUgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogYm9vbGVhbikgPT4gdmFsdWUgPz8gZmFsc2UsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGhpZGRlbkFjdGlvbiA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU/OiBib29sZWFuKSA9PiB2YWx1ZSA/PyBmYWxzZSxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgbGludElnbm9yZVBhdHRlcm5zID0gaW5wdXQ8QXJyYXk8c3RyaW5nPiwgQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZD4oWydDYW5ub3QgdXNlIGltcG9ydCBzdGF0ZW1lbnQgb3V0c2lkZSBhIG1vZHVsZScsICdVbmV4cGVjdGVkIHRva2VuIGV4cG9ydCcsICdpbXBvcnQgJywgJ0Bhbmd1bGFyL2NvcmUnXSwge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogQXJyYXk8c3RyaW5nPikgPT4gdmFsdWUgPz8gWydDYW5ub3QgdXNlIGltcG9ydCBzdGF0ZW1lbnQgb3V0c2lkZSBhIG1vZHVsZScsICdVbmV4cGVjdGVkIHRva2VuIGV4cG9ydCcsICdpbXBvcnQgJywgJ0Bhbmd1bGFyL2NvcmUnXSxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYmFja2dyb3VuZCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignI2Y4ZjlmYScsIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IHN0cmluZykgPT4gdmFsdWUgPz8gJyNmOGY5ZmEnLFxuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBPVVRQVVRTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcmVhZG9ubHkgb3V0Q2hhbmdlID0gb3V0cHV0PElQcmV2aWV3VGV4dERhdGFDaGFuZ2U+KCk7XG4gIHJlYWRvbmx5IHN5bnRheEVycm9ycyA9IG91dHB1dDxEaWFnbm9zdGljW10+KCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVklFVyBDSElMRFJFTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGFpbmVyUHJldmlldyA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ2NvbnRhaW5lclByZXZpZXcnKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDT05TVFJVQ1RPUiAtIFNldHVwIGVmZmVjdHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBFZmZlY3QgxJHhu4Mgc3luYyBjb250ZW50IHThu6sgaW5wdXQgdsOgbyBlZGl0b3JcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IHRoaXMuY29udGVudCgpO1xuICAgICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCAmJiB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZSkge1xuICAgICAgICBjb25zdCBjdXJyZW50Q29udGVudCA9IHRoaXMuZWRpdG9yVmlld0luc3RhbmNlLnN0YXRlLmRvYy50b1N0cmluZygpO1xuICAgICAgICBpZiAobmV3Q29udGVudCAhPT0gY3VycmVudENvbnRlbnQpIHtcbiAgICAgICAgICB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZS5kaXNwYXRjaCh7XG4gICAgICAgICAgICBjaGFuZ2VzOiB7XG4gICAgICAgICAgICAgIGZyb206IDAsXG4gICAgICAgICAgICAgIHRvOiBjdXJyZW50Q29udGVudC5sZW5ndGgsXG4gICAgICAgICAgICAgIGluc2VydDogbmV3Q29udGVudCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENsZWFudXAga2hpIGNvbXBvbmVudCBi4buLIGRlc3Ryb3lcbiAgICB0aGlzLmRlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IHtcbiAgICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5kZXN0cm95KCk7XG4gICAgICB0aGlzLmxhbmd1YWdlQ2FjaGUuY2xlYXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIExJRkVDWUNMRSBIT09LU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVFZGl0b3IoKTtcbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTIC0gRWRpdG9yIGluaXRpYWxpemF0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEto4bufaSB04bqhbyBlZGl0b3IgduG7m2kgY8OhYyBleHRlbnNpb25zIGPGoSBi4bqjblxuICAgKiBMYW5ndWFnZSDEkcaw4bujYyBsb2FkIGFzeW5jIMSR4buDIHThu5FpIMawdSBidW5kbGUgc2l6ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplRWRpdG9yKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxhbmd1YWdlRXh0ZW5zaW9uID0gYXdhaXQgdGhpcy5sb2FkTGFuZ3VhZ2VFeHRlbnNpb24odGhpcy5sYW5nU2VsZWN0ZWQoKSk7XG4gICAgY29uc3QgbGludGVyRXh0ZW5zaW9uID0gYXdhaXQgdGhpcy5sb2FkTGludGVyRXh0ZW5zaW9uKHRoaXMubGFuZ1NlbGVjdGVkKCkpO1xuXG4gICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UgPSBuZXcgRWRpdG9yVmlldyh7XG4gICAgICBkb2M6IHRoaXMuY29udGVudCgpLFxuICAgICAgcGFyZW50OiB0aGlzLmNvbnRhaW5lclByZXZpZXcoKS5uYXRpdmVFbGVtZW50LFxuICAgICAgZXh0ZW5zaW9uczogdGhpcy5jcmVhdGVFeHRlbnNpb25zKGxhbmd1YWdlRXh0ZW5zaW9uLCBsaW50ZXJFeHRlbnNpb24pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFThuqFvIGRhbmggc8OhY2ggZXh0ZW5zaW9ucyBjaG8gZWRpdG9yXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUV4dGVuc2lvbnMobGFuZ3VhZ2VFeHRlbnNpb246IEV4dGVuc2lvbiwgbGludGVyRXh0ZW5zaW9uOiBFeHRlbnNpb24pOiBFeHRlbnNpb25bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGJhc2ljU2V0dXAsXG4gICAgICB0aGlzLmxhbmd1YWdlQ29tcGFydG1lbnQub2YobGFuZ3VhZ2VFeHRlbnNpb24pLFxuICAgICAgdGhpcy5saW50ZXJDb21wYXJ0bWVudC5vZihsaW50ZXJFeHRlbnNpb24pLFxuICAgICAgdGhpcy5jcmVhdGVMaWdodFRoZW1lKCksXG4gICAgICBFZGl0b3JWaWV3LmVkaXRhYmxlLm9mKHRoaXMuZWRpdGFibGUoKSksXG4gICAgICB0aGlzLndyYXBDb21wYXJ0bWVudC5vZihFZGl0b3JWaWV3LmxpbmVXcmFwcGluZyksXG4gICAgICB0aGlzLmxpbmVOdW1iZXJDb21wYXJ0bWVudC5vZihsaW5lTnVtYmVycygpKSxcbiAgICAgIGxpbnRHdXR0ZXIoKSxcbiAgICAgIHRoaXMuY3JlYXRlQnJhY2tldFRoZW1lKCksXG4gICAgICB0aGlzLmNyZWF0ZVVwZGF0ZUxpc3RlbmVyKCksXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGxhbmd1YWdlIGV4dGVuc2lvbiB24bubaSBjYWNoaW5nXG4gICAqIE3hu5dpIGxhbmd1YWdlIGNo4buJIMSRxrDhu6NjIGxvYWQgMSBs4bqnblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkTGFuZ3VhZ2VFeHRlbnNpb24obGFuZzogUFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVCk6IFByb21pc2U8RXh0ZW5zaW9uPiB7XG4gICAgY29uc3QgbG93ZXJMYW5nID0gbGFuZy50b0xvd2VyQ2FzZSgpO1xuXG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5sYW5ndWFnZUNhY2hlLmdldChsb3dlckxhbmcpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIGNvbnN0IHJlZ2lzdHJ5SXRlbSA9IGxhbmd1YWdlUmVnaXN0cnlbbG93ZXJMYW5nXTtcbiAgICBjb25zdCBleHRlbnNpb24gPSByZWdpc3RyeUl0ZW0gPyBhd2FpdCByZWdpc3RyeUl0ZW0ubG9hZGVyKCkgOiBhd2FpdCBjcmVhdGVEZWZhdWx0TGFuZ3VhZ2UoKTtcblxuICAgIHRoaXMubGFuZ3VhZ2VDYWNoZS5zZXQobG93ZXJMYW5nLCBleHRlbnNpb24pO1xuICAgIHJldHVybiBleHRlbnNpb247XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBsaW50ZXIgZXh0ZW5zaW9uIG7hur91IGPDs1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkTGludGVyRXh0ZW5zaW9uKGxhbmc6IFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQpOiBQcm9taXNlPEV4dGVuc2lvbj4ge1xuICAgIGNvbnN0IGxvd2VyTGFuZyA9IGxhbmcudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCByZWdpc3RyeUl0ZW0gPSBsYW5ndWFnZVJlZ2lzdHJ5W2xvd2VyTGFuZ107XG5cbiAgICBpZiAocmVnaXN0cnlJdGVtPy5saW50ZXIpIHtcbiAgICAgIHJldHVybiByZWdpc3RyeUl0ZW0ubGludGVyKHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW50ZXIoKCkgPT4gW10pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTIC0gVGhlbWUgY29uZmlndXJhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgY3JlYXRlTGlnaHRUaGVtZSgpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBFZGl0b3JWaWV3LnRoZW1lKHtcbiAgICAgICcmJzogeyBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuYmFja2dyb3VuZCgpLCBjb2xvcjogJyMzMzMnIH0sXG4gICAgICAnLmNtLWNvbnRlbnQnOiB7IGNhcmV0Q29sb3I6ICcjMTExJyB9LFxuICAgICAgJy5jbS1hY3RpdmVMaW5lJzogeyBiYWNrZ3JvdW5kQ29sb3I6ICcjZjBmMGYwJyB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCcmFja2V0VGhlbWUoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gRWRpdG9yVmlldy50aGVtZSh7XG4gICAgICAnLmNtLW1hdGNoaW5nQnJhY2tldCc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgxMDAsIDIwMCwgMjU1LCAwLjE1KScsXG4gICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCByZ2JhKDEwMCwgMjAwLCAyNTUsIDAuNCknLFxuICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgICB0cmFuc2l0aW9uOiAnYWxsIDAuMnMgZWFzZScsXG4gICAgICB9LFxuICAgICAgJy5jbS1ub25tYXRjaGluZ0JyYWNrZXQnOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMjU1LCAxMDAsIDEwMCwgMC4xNSknLFxuICAgICAgICBib3JkZXI6ICcxcHggc29saWQgcmdiYSgyNTUsIDEwMCwgMTAwLCAwLjMpJyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIE1FVEhPRFMgLSBVcGRhdGUgbGlzdGVuZXJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIGNyZWF0ZVVwZGF0ZUxpc3RlbmVyKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIEVkaXRvclZpZXcudXBkYXRlTGlzdGVuZXIub2YoKHVwZGF0ZTogVmlld1VwZGF0ZSkgPT4ge1xuICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkICYmIHRoaXMuZWRpdGFibGUoKSkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHVwZGF0ZS5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5vdXRDaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgY29udGVudDogbmV3VmFsdWUsXG4gICAgICAgICAgaXNXcmFwOiB0aGlzLmlzV3JhcCgpLFxuICAgICAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmdTZWxlY3RlZCgpLFxuICAgICAgICAgIGNvbnRleHRDaGFuZ2U6ICdjb250ZW50JyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQVUJMSUMgTUVUSE9EUyAtIExpbnRlciBmYWN0b3JpZXMgKMSRxrDhu6NjIGfhu41pIHThu6sgcmVnaXN0cnkpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFThuqFvIEphdmFTY3JpcHQgbGludGVyXG4gICAqIFPhu60gZOG7pW5nIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIMSR4buDIHZhbGlkYXRlIHN5bnRheFxuICAgKi9cbiAgY3JlYXRlSnNMaW50ZXIoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gbGludGVyKCh2aWV3KSA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gdmlldy5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IEZ1bmN0aW9uKHRleHQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnZXQoZXJyLCAnbWVzc2FnZScsICcnKTtcbiAgICAgICAgY29uc3Qgc2hvdWxkSWdub3JlID0gdGhpcy5saW50SWdub3JlUGF0dGVybnMoKS5zb21lKChwYXR0ZXJuKSA9PiBtZXNzYWdlLmluY2x1ZGVzKHBhdHRlcm4pKTtcblxuICAgICAgICBpZiAoIXNob3VsZElnbm9yZSkge1xuICAgICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgICAgZnJvbTogMCxcbiAgICAgICAgICAgIHRvOiB0ZXh0Lmxlbmd0aCxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnN5bnRheEVycm9ycy5lbWl0KGRpYWdub3N0aWNzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVOG6oW8gSlNPTiBsaW50ZXJcbiAgICogU+G7rSBk4bulbmcgSlNPTi5wYXJzZSDEkeG7gyB2YWxpZGF0ZVxuICAgKi9cbiAgY3JlYXRlSnNvbkxpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSB2aWV3LnN0YXRlLmRvYy50b1N0cmluZygpO1xuICAgICAgY29uc3QgZGlhZ25vc3RpY3M6IERpYWdub3N0aWNbXSA9IFtdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBKU09OLnBhcnNlKHRleHQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgIGZyb206IDAsXG4gICAgICAgICAgdG86IHRleHQubGVuZ3RoLFxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgIG1lc3NhZ2U6IGdldChlcnIsICdtZXNzYWdlJywgJycpLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVOG6oW8gU1FMIGxpbnRlclxuICAgKiBMYXp5IGxvYWQgbm9kZS1zcWwtcGFyc2VyIGNo4buJIGtoaSBj4bqnblxuICAgKi9cbiAgY3JlYXRlU3FsTGludGVyKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIGxpbnRlcihhc3luYyAodmlldykgPT4ge1xuICAgICAgY29uc3QgdGV4dCA9IHZpZXcuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdID0gW107XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIExhenkgbG9hZCBTUUwgcGFyc2VyIGNo4buJIGtoaSB0aOG7sWMgc+G7sSBj4bqnblxuICAgICAgICBjb25zdCB7IFBhcnNlciB9ID0gYXdhaXQgaW1wb3J0KCdub2RlLXNxbC1wYXJzZXInKTtcbiAgICAgICAgY29uc3Qgc3FsUGFyc2VyID0gbmV3IFBhcnNlcigpO1xuICAgICAgICBzcWxQYXJzZXIuYXN0aWZ5KHRleHQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgIGZyb206IDAsXG4gICAgICAgICAgdG86IHRleHQubGVuZ3RoLFxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgIG1lc3NhZ2U6IGdldChlcnIsICdtZXNzYWdlJywgJycpLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUk9URUNURUQgTUVUSE9EUyAtIEV2ZW50IGhhbmRsZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDb3B5KCk6IHZvaWQge1xuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRoaXMuY29udGVudCgpIHx8ICcnKTtcbiAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0NvbXBUeXBlVGV4dEluZm8oJ1NhbyBjaMOpcCB0aMOgbmggY8O0bmcnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTGluZVdyYXAoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ2hhbmRsZXJMaW5lV3JhcCcsIHRoaXMuaXNXcmFwKCkpO1xuICAgIC8vIEzhuqV5IG7hu5lpIGR1bmcgbeG7m2kgbmjhuqV0IHThu6sgZWRpdG9yIHNhdSBraGkgxJHDoyB4w7NhIG5ld2xpbmVzXG4gICAgY29uc3QgY3VycmVudENvbnRlbnQgPSB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZT8uc3RhdGUuZG9jLnRvU3RyaW5nKCkgfHwgJyc7XG4gICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSB0aGlzLmlzV3JhcCgpICYmIGN1cnJlbnRDb250ZW50ID8gY3VycmVudENvbnRlbnQucmVwbGFjZSgvXFxuL2csICcgJykgOiB0aGlzLmNvbnRlbnQoKTtcbiAgICB0aGlzLmlzV3JhcC51cGRhdGUoKHZhbCkgPT4gIXZhbCk7XG4gICAgY29uc29sZS5sb2coJ3VwZGF0ZWRDb250ZW50JywgdGhpcy5pc1dyYXAoKSk7XG4gICAgY29uc29sZS5sb2coJ2N1cnJlbnRDb250ZW50JywgY3VycmVudENvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKCd1cGRhdGVkQ29udGVudCcsIHVwZGF0ZWRDb250ZW50KTtcblxuICAgIGlmIChjdXJyZW50Q29udGVudCAhPT0gdXBkYXRlZENvbnRlbnQpIHtcbiAgICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5kaXNwYXRjaCh7XG4gICAgICAgIGNoYW5nZXM6IHsgZnJvbTogMCwgdG86IGN1cnJlbnRDb250ZW50Lmxlbmd0aCwgaW5zZXJ0OiB1cGRhdGVkQ29udGVudCB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQmF0Y2ggY+G6oyAyIGRpc3BhdGNoIHRow6BuaCAxIMSR4buDIHThu5FpIMawdSBwZXJmb3JtYW5jZVxuICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5kaXNwYXRjaCh7XG4gICAgICBlZmZlY3RzOiBbdGhpcy53cmFwQ29tcGFydG1lbnQucmVjb25maWd1cmUodGhpcy5pc1dyYXAoKSA/IEVkaXRvclZpZXcubGluZVdyYXBwaW5nIDogW10pLCB0aGlzLmxpbmVOdW1iZXJDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZSh0aGlzLmlzV3JhcCgpID8gbGluZU51bWJlcnMoKSA6IFtdKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLm91dENoYW5nZS5lbWl0KHtcbiAgICAgIGNvbnRlbnQ6IHVwZGF0ZWRDb250ZW50LFxuICAgICAgaXNXcmFwOiB0aGlzLmlzV3JhcCgpLFxuICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ1NlbGVjdGVkKCksXG4gICAgICBjb250ZXh0Q2hhbmdlOiAnaXNXcmFwJyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2VsZWN0S2V5KGRhdGE/OiBJRW1pdFNlbGVjdEtleSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghZGF0YT8ua2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3TGFuZyA9IGRhdGEua2V5IGFzIFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQ7XG4gICAgdGhpcy5sYW5nU2VsZWN0ZWQuc2V0KG5ld0xhbmcpO1xuXG4gICAgLy8gTG9hZCBsYW5ndWFnZSB2w6AgbGludGVyIG3hu5tpXG4gICAgY29uc3QgW2xhbmd1YWdlRXh0ZW5zaW9uLCBsaW50ZXJFeHRlbnNpb25dID0gYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMubG9hZExhbmd1YWdlRXh0ZW5zaW9uKG5ld0xhbmcpLCB0aGlzLmxvYWRMaW50ZXJFeHRlbnNpb24obmV3TGFuZyldKTtcblxuICAgIC8vIFJlY29uZmlndXJlIHRoYXkgdsOsIHThuqFvIG3hu5tpIHN0YXRlIMSR4buDIGdp4buvIGzhuqFpIGRvY3VtZW50IGNvbnRlbnRcbiAgICB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZT8uZGlzcGF0Y2goe1xuICAgICAgZWZmZWN0czogW3RoaXMubGFuZ3VhZ2VDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZShsYW5ndWFnZUV4dGVuc2lvbiksIHRoaXMubGludGVyQ29tcGFydG1lbnQucmVjb25maWd1cmUobGludGVyRXh0ZW5zaW9uKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLm91dENoYW5nZS5lbWl0KHtcbiAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudCgpLFxuICAgICAgaXNXcmFwOiB0aGlzLmlzV3JhcCgpLFxuICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ1NlbGVjdGVkKCksXG4gICAgICBjb250ZXh0Q2hhbmdlOiAnbGFuZ3VhZ2UnLFxuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwibGlicy11aS1wcmV2aWV3LWRhdGEtY29udGFpbmVyIGZsZXggZmxleC1jb2wgdy1mdWxsIGgtYXV0byByb3VuZGVkLVs4cHhdIGxpYnMtdWktYm9yZGVyLWdlbmVyYWwgcHgtWzhweF1cIlxuICBbc3R5bGUuLS1iYWNrZ3JvdW5kLWNvbG9yXT1cImJhY2tncm91bmQoKVwiXG4gIFtjbGFzcy5wdC1bOHB4XV09XCIhaGlkZGVuQWN0aW9uKClcIj5cbiAgQGlmICghaGlkZGVuQWN0aW9uKCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgY29udGVudC1iZXR3ZWVuIGNvbG9yLVsjNmE3MzgzXVwiPlxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93blxuICAgICAgICBjbGFzc0luY2x1ZGU9XCJ3LVsyMDBweF1cIlxuICAgICAgICBbbGlzdENvbmZpZ109XCJjb25maWdMb2FkRGF0YUlzSHR0cENvbmZpZ1wiXG4gICAgICAgIFtsaXN0TWF4SXRlbVNob3ddPVwiNVwiXG4gICAgICAgIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cIiFlZGl0YWJsZSgpXCJcbiAgICAgICAgW2xpc3RIYXNCdXR0b25VblNlbGVjdE9wdGlvbl09XCJmYWxzZVwiXG4gICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdEtleSgkZXZlbnQpXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICBbbGFiZWxdPVwibGFiZWxMYW5nKCkgfHwgJydcIlxuICAgICAgICAgIFtzaXplQnV0dG9uXT1cIidzbWFsbCdcIlxuICAgICAgICAgIFtjbGFzc0ljb25SaWdodF09XCJlZGl0YWJsZSgpID8gJ2xpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCcgOiAnJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtWzBweF0nICsgKGVkaXRhYmxlKCkgPyAnJyA6ICchcG9pbnRlci1ldmVudHMtbm9uZSAhY3Vyc29yLWRlZmF1bHQgaG92ZXI6IXRleHQtWyM2QTczODNdJylcIiAvPlxuICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgIFtsYWJlbF09XCJpc1dyYXAoKSA/ICdpMThuX3JlbW92ZV9saW5lX3dyYXAnIDogJ2kxOG5fbGluZV93cmFwJ1wiXG4gICAgICAgICAgW3NpemVCdXR0b25dPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiaXNXcmFwKCkgPyAnbGlicy11aS1pY29uLXVud3JhcCcgOiAnbGlicy11aS1pY29uLXdyYXAnXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIidtby1saWItcC0wcHggbW8tbGliLW1yLTE2cHgnXCJcbiAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckxpbmVXcmFwKClcIiAvPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXRoaXJkJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cIidpMThuX2NvcHknXCJcbiAgICAgICAgICBbc2l6ZUJ1dHRvbl09XCInc21hbGwnXCJcbiAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWNvcHknXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIidtby1saWItcC0wcHgnXCJcbiAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNvcHkoKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuICA8ZGl2ICNjb250YWluZXJQcmV2aWV3PjwvZGl2PlxuPC9kaXY+XG4iXX0=