@alfresco/adf-core 7.0.0-alpha.8-13005755934 → 7.0.0-alpha.8-13009426269

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.
@@ -0,0 +1,364 @@
1
+ /*!
2
+ * @license
3
+ * Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import { By } from '@angular/platform-browser';
18
+ import { MatSelectHarness } from '@angular/material/select/testing';
19
+ import { MatChipGridHarness, MatChipHarness, MatChipListboxHarness } from '@angular/material/chips/testing';
20
+ import { MatButtonHarness } from '@angular/material/button/testing';
21
+ import { MatIconHarness } from '@angular/material/icon/testing';
22
+ import { MatCheckboxHarness } from '@angular/material/checkbox/testing';
23
+ import { MatErrorHarness, MatFormFieldHarness } from '@angular/material/form-field/testing';
24
+ import { MatInputHarness } from '@angular/material/input/testing';
25
+ import { MatAutocompleteHarness } from '@angular/material/autocomplete/testing';
26
+ import { MatTabGroupHarness } from '@angular/material/tabs/testing';
27
+ import { MatToolbarHarness } from '@angular/material/toolbar/testing';
28
+ import { MatSnackBarHarness } from '@angular/material/snack-bar/testing';
29
+ import { MatProgressBarHarness } from '@angular/material/progress-bar/testing';
30
+ export class UnitTestingUtils {
31
+ constructor(debugElement, loader) {
32
+ this.debugElement = debugElement;
33
+ this.loader = loader;
34
+ this.debugElement = debugElement;
35
+ this.loader = loader;
36
+ }
37
+ setDebugElement(debugElement) {
38
+ this.debugElement = debugElement;
39
+ }
40
+ setLoader(loader) {
41
+ this.loader = loader;
42
+ }
43
+ getByCSS(selector) {
44
+ return this.debugElement.query(By.css(selector));
45
+ }
46
+ getAllByCSS(selector) {
47
+ return this.debugElement.queryAll(By.css(selector));
48
+ }
49
+ getInnerTextByCSS(selector) {
50
+ return this.getByCSS(selector).nativeElement.innerText;
51
+ }
52
+ getByDataAutomationId(dataAutomationId) {
53
+ return this.getByCSS(`[data-automation-id="${dataAutomationId}"]`);
54
+ }
55
+ getByDataAutomationClass(dataAutomationClass) {
56
+ return this.getByCSS(`[data-automation-class="${dataAutomationClass}"]`);
57
+ }
58
+ getInnerTextByDataAutomationId(dataAutomationId) {
59
+ return this.getByDataAutomationId(dataAutomationId).nativeElement.innerText;
60
+ }
61
+ getByDirective(directive) {
62
+ return this.debugElement.query(By.directive(directive));
63
+ }
64
+ /** Perform actions */
65
+ clickByCSS(selector) {
66
+ const element = this.getByCSS(selector);
67
+ element.triggerEventHandler('click', new MouseEvent('click'));
68
+ }
69
+ clickByDataAutomationId(dataAutomationId) {
70
+ this.getByDataAutomationId(dataAutomationId).nativeElement.click();
71
+ }
72
+ doubleClickByDataAutomationId(dataAutomationId) {
73
+ const element = this.getByDataAutomationId(dataAutomationId);
74
+ element.triggerEventHandler('dblclick', new MouseEvent('dblclick'));
75
+ }
76
+ blurByCSS(selector) {
77
+ const element = this.getByCSS(selector);
78
+ element.triggerEventHandler('blur', new FocusEvent('blur'));
79
+ }
80
+ hoverOverByCSS(selector) {
81
+ const element = this.getByCSS(selector);
82
+ element.triggerEventHandler('mouseenter', new MouseEvent('mouseenter'));
83
+ }
84
+ hoverOverByDataAutomationId(dataAutomationId) {
85
+ const element = this.getByDataAutomationId(dataAutomationId);
86
+ element.triggerEventHandler('mouseenter', new MouseEvent('mouseenter'));
87
+ }
88
+ mouseLeaveByCSS(selector) {
89
+ const element = this.getByCSS(selector);
90
+ element.triggerEventHandler('mouseleave', new MouseEvent('mouseleave'));
91
+ }
92
+ mouseLeaveByDataAutomationId(dataAutomationId) {
93
+ const element = this.getByDataAutomationId(dataAutomationId);
94
+ element.triggerEventHandler('mouseleave', new MouseEvent('mouseleave'));
95
+ }
96
+ keyBoardEventByCSS(selector, event, code, key) {
97
+ const element = this.getByCSS(selector);
98
+ element.nativeElement.dispatchEvent(new KeyboardEvent(event, { code, key }));
99
+ }
100
+ dispatchCustomEventByCSS(selector, eventName) {
101
+ const element = this.getByCSS(selector);
102
+ element.nativeElement.dispatchEvent(new CustomEvent(eventName));
103
+ }
104
+ /** Input related methods */
105
+ getInputByCSS(selector) {
106
+ return this.getByCSS(selector)?.nativeElement;
107
+ }
108
+ getInputByDataAutomationId(dataAutomationId) {
109
+ return this.getByDataAutomationId(dataAutomationId)?.nativeElement;
110
+ }
111
+ fillInputByCSS(selector, value) {
112
+ const input = this.getInputByCSS(selector);
113
+ input.value = value;
114
+ input.dispatchEvent(new Event('input'));
115
+ }
116
+ fillInputByDataAutomationId(dataAutomationId, value) {
117
+ const input = this.getInputByDataAutomationId(dataAutomationId);
118
+ input.value = value;
119
+ input.dispatchEvent(new Event('input'));
120
+ }
121
+ /** MatButton related methods */
122
+ async getMatButton() {
123
+ return this.loader.getHarness(MatButtonHarness);
124
+ }
125
+ async getMatButtonByCSS(selector) {
126
+ return this.loader.getHarness(MatButtonHarness.with({ selector }));
127
+ }
128
+ async getMatButtonByDataAutomationId(dataAutomationId) {
129
+ return this.loader.getHarness(MatButtonHarness.with({ selector: `[data-automation-id="${dataAutomationId}"]` }));
130
+ }
131
+ async checkIfMatButtonExists() {
132
+ return this.loader.hasHarness(MatButtonHarness);
133
+ }
134
+ async checkIfMatButtonExistsWithDataAutomationId(dataAutomationId) {
135
+ return this.loader.hasHarness(MatButtonHarness.with({ selector: `[data-automation-id="${dataAutomationId}"]` }));
136
+ }
137
+ async clickMatButton() {
138
+ const button = await this.getMatButton();
139
+ await button.click();
140
+ }
141
+ async clickMatButtonByCSS(selector) {
142
+ const button = await this.getMatButtonByCSS(selector);
143
+ await button.click();
144
+ }
145
+ async clickMatButtonByDataAutomationId(dataAutomationId) {
146
+ const button = await this.getMatButtonByDataAutomationId(dataAutomationId);
147
+ await button.click();
148
+ }
149
+ async sendKeysToMatButton(keys) {
150
+ const button = await this.getMatButton();
151
+ const host = await button.host();
152
+ await host.sendKeys(...keys);
153
+ }
154
+ /** MatCheckbox related methods */
155
+ async getMatCheckbox() {
156
+ return this.loader.getHarness(MatCheckboxHarness);
157
+ }
158
+ async getMatCheckboxByDataAutomationId(dataAutomationId) {
159
+ return this.loader.getHarness(MatCheckboxHarness.with({ selector: `[data-automation-id="${dataAutomationId}"]` }));
160
+ }
161
+ async getMatCheckboxHost() {
162
+ const checkbox = await this.getMatCheckbox();
163
+ return checkbox.host();
164
+ }
165
+ async getAllMatCheckboxes() {
166
+ return this.loader.getAllHarnesses(MatCheckboxHarness);
167
+ }
168
+ async checkIfMatCheckboxIsChecked() {
169
+ const checkbox = await this.getMatCheckbox();
170
+ return checkbox.isChecked();
171
+ }
172
+ async checkIfMatCheckboxesHaveClass(className) {
173
+ const checkboxes = await this.getAllMatCheckboxes();
174
+ return checkboxes.every(async (checkbox) => (await checkbox.host()).hasClass(className));
175
+ }
176
+ async hoverOverMatCheckbox() {
177
+ const host = await this.getMatCheckboxHost();
178
+ await host.hover();
179
+ }
180
+ /** MatIcon related methods */
181
+ async getMatIconOrNull() {
182
+ return this.loader.getHarnessOrNull(MatIconHarness);
183
+ }
184
+ async getMatIconWithAncestorByDataAutomationId(dataAutomationId) {
185
+ return this.loader.getHarness(MatIconHarness.with({ ancestor: `[data-automation-id="${dataAutomationId}"]` }));
186
+ }
187
+ async getMatIconWithAncestorByCSS(selector) {
188
+ return this.loader.getHarness(MatIconHarness.with({ ancestor: selector }));
189
+ }
190
+ async getMatIconWithAncestorByCSSAndName(selector, name) {
191
+ return this.loader.getHarness(MatIconHarness.with({ ancestor: selector, name }));
192
+ }
193
+ async checkIfMatIconExistsWithAncestorByDataAutomationId(dataAutomationId) {
194
+ return this.loader.hasHarness(MatIconHarness.with({ ancestor: `[data-automation-id="${dataAutomationId}"]` }));
195
+ }
196
+ async checkIfMatIconExistsWithAncestorByCSSAndName(selector, name) {
197
+ return this.loader.hasHarness(MatIconHarness.with({ ancestor: selector, name }));
198
+ }
199
+ async clickMatIconWithAncestorByDataAutomationId(dataAutomationId) {
200
+ const icon = await this.getMatIconWithAncestorByDataAutomationId(dataAutomationId);
201
+ const host = await icon.host();
202
+ await host.click();
203
+ }
204
+ /** MatSelect related methods */
205
+ async getMatSelectOptions(isOpened = false) {
206
+ const select = await this.loader.getHarness(MatSelectHarness);
207
+ if (!isOpened) {
208
+ await select.open();
209
+ }
210
+ return select.getOptions();
211
+ }
212
+ async getMatSelectHost() {
213
+ const select = await this.loader.getHarness(MatSelectHarness);
214
+ return select.host();
215
+ }
216
+ async checkIfMatSelectExists() {
217
+ return this.loader.hasHarness(MatSelectHarness);
218
+ }
219
+ async openMatSelect() {
220
+ const select = await this.loader.getHarness(MatSelectHarness);
221
+ await select.open();
222
+ }
223
+ /** MatChips related methods */
224
+ async getMatChipByDataAutomationId(dataAutomationId) {
225
+ return this.loader.getHarness(MatChipHarness.with({ selector: `[data-automation-id="${dataAutomationId}"]` }));
226
+ }
227
+ async checkIfMatChipExistsWithDataAutomationId(dataAutomationId) {
228
+ return this.loader.hasHarness(MatChipHarness.with({ selector: `[data-automation-id="${dataAutomationId}"]` }));
229
+ }
230
+ async clickMatChip(dataAutomationId) {
231
+ const chip = await this.getMatChipByDataAutomationId(dataAutomationId);
232
+ const host = await chip.host();
233
+ await host.click();
234
+ }
235
+ async getMatChips() {
236
+ return this.loader.getAllHarnesses(MatChipHarness);
237
+ }
238
+ /** MatChipListbox related methods */
239
+ async getMatChipListboxByDataAutomationId(dataAutomationId) {
240
+ return this.loader.getHarness(MatChipListboxHarness.with({ selector: `[data-automation-id="${dataAutomationId}"]` }));
241
+ }
242
+ async clickMatChipListbox(dataAutomationId) {
243
+ const chipList = await this.getMatChipListboxByDataAutomationId(dataAutomationId);
244
+ const host = await chipList.host();
245
+ await host.click();
246
+ }
247
+ /** MatChipGrid related methods */
248
+ async checkIfMatChipGridExists() {
249
+ return this.loader.hasHarness(MatChipGridHarness);
250
+ }
251
+ /** MatFromField related methods */
252
+ async getMatFormField() {
253
+ return this.loader.getHarness(MatFormFieldHarness);
254
+ }
255
+ async getMatFormFieldByCSS(selector) {
256
+ return this.loader.getHarness(MatFormFieldHarness.with({ selector }));
257
+ }
258
+ /** MatInput related methods */
259
+ async getMatInput() {
260
+ return this.loader.getHarness(MatInputHarness);
261
+ }
262
+ async getMatInputByCSS(selector) {
263
+ return this.loader.getHarness(MatInputHarness.with({ selector }));
264
+ }
265
+ async getMatInputByDataAutomationId(dataAutomationId) {
266
+ return this.loader.getHarness(MatInputHarness.with({ selector: `[data-automation-id="${dataAutomationId}"]` }));
267
+ }
268
+ async getMatInputByPlaceholder(placeholder) {
269
+ return this.loader.getHarness(MatInputHarness.with({ placeholder }));
270
+ }
271
+ async getMatInputHost() {
272
+ const input = await this.getMatInput();
273
+ return input.host();
274
+ }
275
+ async checkIfMatInputExists() {
276
+ return this.loader.hasHarness(MatInputHarness);
277
+ }
278
+ async checkIfMatInputExistsWithCSS(selector) {
279
+ return this.loader.hasHarness(MatInputHarness.with({ selector }));
280
+ }
281
+ async checkIfMatInputExistsWithDataAutomationId(dataAutomationId) {
282
+ return this.loader.hasHarness(MatInputHarness.with({ selector: `[data-automation-id="${dataAutomationId}"]` }));
283
+ }
284
+ async checkIfMatInputExistsWithPlaceholder(placeholder) {
285
+ return this.loader.hasHarness(MatInputHarness.with({ placeholder }));
286
+ }
287
+ async clickMatInput() {
288
+ const input = await this.getMatInput();
289
+ const host = await input.host();
290
+ await host.click();
291
+ }
292
+ async fillMatInput(value) {
293
+ const input = await this.getMatInput();
294
+ await input.setValue(value);
295
+ }
296
+ async fillMatInputByCSS(selector, value) {
297
+ const input = await this.getMatInputByCSS(selector);
298
+ await input.setValue(value);
299
+ }
300
+ async fillMatInputByDataAutomationId(dataAutomationId, value) {
301
+ const input = await this.getMatInputByDataAutomationId(dataAutomationId);
302
+ await input.setValue(value);
303
+ await (await input.host()).dispatchEvent('input');
304
+ }
305
+ async focusMatInput() {
306
+ const input = await this.getMatInput();
307
+ await input.focus();
308
+ }
309
+ async blurMatInput() {
310
+ const input = await this.getMatInput();
311
+ await input.blur();
312
+ }
313
+ async getMatInputValue() {
314
+ const input = await this.getMatInput();
315
+ return input.getValue();
316
+ }
317
+ async getMatInputValueByDataAutomationId(dataAutomationId) {
318
+ const input = await this.getMatInputByDataAutomationId(dataAutomationId);
319
+ return input.getValue();
320
+ }
321
+ async sendKeysToMatInput(keys) {
322
+ const input = await this.getMatInput();
323
+ const host = await input.host();
324
+ await host.sendKeys(...keys);
325
+ }
326
+ /** MatAutoComplete related methods */
327
+ async typeAndGetOptionsForMatAutoComplete(fixture, value) {
328
+ const autocomplete = await this.loader.getHarness(MatAutocompleteHarness);
329
+ await autocomplete.enterText(value);
330
+ fixture.detectChanges();
331
+ return autocomplete.getOptions();
332
+ }
333
+ /** MatError related methods */
334
+ async getMatErrorByCSS(selector) {
335
+ return this.loader.getHarness(MatErrorHarness.with({ selector }));
336
+ }
337
+ async getMatErrorByDataAutomationId(dataAutomationId) {
338
+ return this.loader.getHarness(MatErrorHarness.with({ selector: `[data-automation-id="${dataAutomationId}"]` }));
339
+ }
340
+ /** MatTabGroup related methods */
341
+ async getSelectedTabFromMatTabGroup() {
342
+ const tabs = await this.loader.getHarness(MatTabGroupHarness);
343
+ return tabs.getSelectedTab();
344
+ }
345
+ async getSelectedTabLabelFromMatTabGroup() {
346
+ const tab = await this.getSelectedTabFromMatTabGroup();
347
+ return tab.getLabel();
348
+ }
349
+ /** MatToolbar related methods */
350
+ async getMatToolbarHost() {
351
+ const toolbar = await this.loader.getHarness(MatToolbarHarness);
352
+ return toolbar.host();
353
+ }
354
+ /** MatSnackbar related methods */
355
+ async checkIfMatSnackbarExists() {
356
+ return this.loader.hasHarness(MatSnackBarHarness);
357
+ }
358
+ /** MatProgressBar related methods */
359
+ async getMatProgressBarHost() {
360
+ const progress = await this.loader.getHarness(MatProgressBarHarness);
361
+ return progress.host();
362
+ }
363
+ }
364
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdC10ZXN0aW5nLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGliL2NvcmUvc3JjL2xpYi90ZXN0aW5nL3VuaXQtdGVzdGluZy11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzVHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDNUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRWhGLE9BQU8sRUFBRSxrQkFBa0IsRUFBaUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUUvRSxNQUFNLE9BQU8sZ0JBQWdCO0lBQ3pCLFlBQW9CLFlBQTJCLEVBQVUsTUFBc0I7UUFBM0QsaUJBQVksR0FBWixZQUFZLENBQWU7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFn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TyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELEtBQUssQ0FBQyxrQ0FBa0M7UUFDcEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztRQUN2RCxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsaUNBQWlDO0lBRWpDLEtBQUssQ0FBQyxpQkFBaUI7UUFDbkIsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxrQ0FBa0M7SUFFbEMsS0FBSyxDQUFDLHdCQUF3QjtRQUMxQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELHFDQUFxQztJQUVyQyxLQUFLLENBQUMscUJBQXFCO1FBQ3ZCLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNyRSxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI0IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEhhcm5lc3NMb2FkZXIsIFRlc3RFbGVtZW50LCBUZXN0S2V5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Rlc3RpbmcnO1xuaW1wb3J0IHsgRGVidWdFbGVtZW50LCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCeSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgTWF0U2VsZWN0SGFybmVzcyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdC90ZXN0aW5nJztcbmltcG9ydCB7IE1hdE9wdGlvbkhhcm5lc3MgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlL3Rlc3RpbmcnO1xuaW1wb3J0IHsgTWF0Q2hpcEdyaWRIYXJuZXNzLCBNYXRDaGlwSGFybmVzcywgTWF0Q2hpcExpc3Rib3hIYXJuZXNzIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMvdGVzdGluZyc7XG5pbXBvcnQgeyBNYXRCdXR0b25IYXJuZXNzIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uL3Rlc3RpbmcnO1xuaW1wb3J0IHsgTWF0SWNvbkhhcm5lc3MgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uL3Rlc3RpbmcnO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hIYXJuZXNzIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gvdGVzdGluZyc7XG5pbXBvcnQgeyBNYXRFcnJvckhhcm5lc3MsIE1hdEZvcm1GaWVsZEhhcm5lc3MgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkL3Rlc3RpbmcnO1xuaW1wb3J0IHsgTWF0SW5wdXRIYXJuZXNzIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQvdGVzdGluZyc7XG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGVIYXJuZXNzIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlL3Rlc3RpbmcnO1xuaW1wb3J0IHsgQ29tcG9uZW50Rml4dHVyZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvdGVzdGluZyc7XG5pbXBvcnQgeyBNYXRUYWJHcm91cEhhcm5lc3MsIE1hdFRhYkhhcm5lc3MgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzL3Rlc3RpbmcnO1xuaW1wb3J0IHsgTWF0VG9vbGJhckhhcm5lc3MgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sYmFyL3Rlc3RpbmcnO1xuaW1wb3J0IHsgTWF0U25hY2tCYXJIYXJuZXNzIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyL3Rlc3RpbmcnO1xuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NCYXJIYXJuZXNzIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3MtYmFyL3Rlc3RpbmcnO1xuXG5leHBvcnQgY2xhc3MgVW5pdFRlc3RpbmdVdGlscyB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBkZWJ1Z0VsZW1lbnQ/OiBEZWJ1Z0VsZW1lbnQsIHByaXZhdGUgbG9hZGVyPzogSGFybmVzc0xvYWRlcikge1xuICAgICAgICB0aGlzLmRlYnVnRWxlbWVudCA9IGRlYnVnRWxlbWVudDtcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXI7XG4gICAgfVxuXG4gICAgc2V0RGVidWdFbGVtZW50KGRlYnVnRWxlbWVudDogRGVidWdFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVidWdFbGVtZW50ID0gZGVidWdFbGVtZW50O1xuICAgIH1cblxuICAgIHNldExvYWRlcihsb2FkZXI6IEhhcm5lc3NMb2FkZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXI7XG4gICAgfVxuXG4gICAgZ2V0QnlDU1Moc2VsZWN0b3I6IHN0cmluZyk6IERlYnVnRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlYnVnRWxlbWVudC5xdWVyeShCeS5jc3Moc2VsZWN0b3IpKTtcbiAgICB9XG5cbiAgICBnZXRBbGxCeUNTUyhzZWxlY3Rvcjogc3RyaW5nKTogRGVidWdFbGVtZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWJ1Z0VsZW1lbnQucXVlcnlBbGwoQnkuY3NzKHNlbGVjdG9yKSk7XG4gICAgfVxuXG4gICAgZ2V0SW5uZXJUZXh0QnlDU1Moc2VsZWN0b3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ5Q1NTKHNlbGVjdG9yKS5uYXRpdmVFbGVtZW50LmlubmVyVGV4dDtcbiAgICB9XG5cbiAgICBnZXRCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogRGVidWdFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnlDU1MoYFtkYXRhLWF1dG9tYXRpb24taWQ9XCIke2RhdGFBdXRvbWF0aW9uSWR9XCJdYCk7XG4gICAgfVxuXG4gICAgZ2V0QnlEYXRhQXV0b21hdGlvbkNsYXNzKGRhdGFBdXRvbWF0aW9uQ2xhc3M6IHN0cmluZyk6IERlYnVnRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ5Q1NTKGBbZGF0YS1hdXRvbWF0aW9uLWNsYXNzPVwiJHtkYXRhQXV0b21hdGlvbkNsYXNzfVwiXWApO1xuICAgIH1cblxuICAgIGdldElubmVyVGV4dEJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZCkubmF0aXZlRWxlbWVudC5pbm5lclRleHQ7XG4gICAgfVxuXG4gICAgZ2V0QnlEaXJlY3RpdmUoZGlyZWN0aXZlOiBUeXBlPGFueT4pOiBEZWJ1Z0VsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWJ1Z0VsZW1lbnQucXVlcnkoQnkuZGlyZWN0aXZlKGRpcmVjdGl2ZSkpO1xuICAgIH1cblxuICAgIC8qKiBQZXJmb3JtIGFjdGlvbnMgKi9cblxuICAgIGNsaWNrQnlDU1Moc2VsZWN0b3I6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRCeUNTUyhzZWxlY3Rvcik7XG4gICAgICAgIGVsZW1lbnQudHJpZ2dlckV2ZW50SGFuZGxlcignY2xpY2snLCBuZXcgTW91c2VFdmVudCgnY2xpY2snKSk7XG4gICAgfVxuXG4gICAgY2xpY2tCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZ2V0QnlEYXRhQXV0b21hdGlvbklkKGRhdGFBdXRvbWF0aW9uSWQpLm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICB9XG5cbiAgICBkb3VibGVDbGlja0J5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0QnlEYXRhQXV0b21hdGlvbklkKGRhdGFBdXRvbWF0aW9uSWQpO1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJFdmVudEhhbmRsZXIoJ2RibGNsaWNrJywgbmV3IE1vdXNlRXZlbnQoJ2RibGNsaWNrJykpO1xuICAgIH1cblxuICAgIGJsdXJCeUNTUyhzZWxlY3Rvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEJ5Q1NTKHNlbGVjdG9yKTtcbiAgICAgICAgZWxlbWVudC50cmlnZ2VyRXZlbnRIYW5kbGVyKCdibHVyJywgbmV3IEZvY3VzRXZlbnQoJ2JsdXInKSk7XG4gICAgfVxuXG4gICAgaG92ZXJPdmVyQnlDU1Moc2VsZWN0b3I6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRCeUNTUyhzZWxlY3Rvcik7XG4gICAgICAgIGVsZW1lbnQudHJpZ2dlckV2ZW50SGFuZGxlcignbW91c2VlbnRlcicsIG5ldyBNb3VzZUV2ZW50KCdtb3VzZWVudGVyJykpO1xuICAgIH1cblxuICAgIGhvdmVyT3ZlckJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0QnlEYXRhQXV0b21hdGlvbklkKGRhdGFBdXRvbWF0aW9uSWQpO1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJFdmVudEhhbmRsZXIoJ21vdXNlZW50ZXInLCBuZXcgTW91c2VFdmVudCgnbW91c2VlbnRlcicpKTtcbiAgICB9XG5cbiAgICBtb3VzZUxlYXZlQnlDU1Moc2VsZWN0b3I6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRCeUNTUyhzZWxlY3Rvcik7XG4gICAgICAgIGVsZW1lbnQudHJpZ2dlckV2ZW50SGFuZGxlcignbW91c2VsZWF2ZScsIG5ldyBNb3VzZUV2ZW50KCdtb3VzZWxlYXZlJykpO1xuICAgIH1cblxuICAgIG1vdXNlTGVhdmVCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkKTtcbiAgICAgICAgZWxlbWVudC50cmlnZ2VyRXZlbnRIYW5kbGVyKCdtb3VzZWxlYXZlJywgbmV3IE1vdXNlRXZlbnQoJ21vdXNlbGVhdmUnKSk7XG4gICAgfVxuXG4gICAga2V5Qm9hcmRFdmVudEJ5Q1NTKHNlbGVjdG9yOiBzdHJpbmcsIGV2ZW50OiAna2V5dXAnIHwgJ2tleWRvd24nLCBjb2RlOiBzdHJpbmcsIGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEJ5Q1NTKHNlbGVjdG9yKTtcbiAgICAgICAgZWxlbWVudC5uYXRpdmVFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEtleWJvYXJkRXZlbnQoZXZlbnQsIHsgY29kZSwga2V5IH0pKTtcbiAgICB9XG5cbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50QnlDU1Moc2VsZWN0b3I6IHN0cmluZywgZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0QnlDU1Moc2VsZWN0b3IpO1xuICAgICAgICBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lKSk7XG4gICAgfVxuXG4gICAgLyoqIElucHV0IHJlbGF0ZWQgbWV0aG9kcyAqL1xuXG4gICAgZ2V0SW5wdXRCeUNTUyhzZWxlY3Rvcjogc3RyaW5nKTogSFRNTElucHV0RWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ5Q1NTKHNlbGVjdG9yKT8ubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBnZXRJbnB1dEJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBIVE1MSW5wdXRFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnlEYXRhQXV0b21hdGlvbklkKGRhdGFBdXRvbWF0aW9uSWQpPy5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIGZpbGxJbnB1dEJ5Q1NTKHNlbGVjdG9yOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmdldElucHV0QnlDU1Moc2VsZWN0b3IpO1xuICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBpbnB1dC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnaW5wdXQnKSk7XG4gICAgfVxuXG4gICAgZmlsbElucHV0QnlEYXRhQXV0b21hdGlvbklkKGRhdGFBdXRvbWF0aW9uSWQ6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuZ2V0SW5wdXRCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZCk7XG4gICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIGlucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcpKTtcbiAgICB9XG5cbiAgICAvKiogTWF0QnV0dG9uIHJlbGF0ZWQgbWV0aG9kcyAqL1xuXG4gICAgYXN5bmMgZ2V0TWF0QnV0dG9uKCk6IFByb21pc2U8TWF0QnV0dG9uSGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRCdXR0b25IYXJuZXNzKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNYXRCdXR0b25CeUNTUyhzZWxlY3Rvcjogc3RyaW5nKTogUHJvbWlzZTxNYXRCdXR0b25IYXJuZXNzPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5nZXRIYXJuZXNzKE1hdEJ1dHRvbkhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNYXRCdXR0b25CeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxNYXRCdXR0b25IYXJuZXNzPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5nZXRIYXJuZXNzKE1hdEJ1dHRvbkhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yOiBgW2RhdGEtYXV0b21hdGlvbi1pZD1cIiR7ZGF0YUF1dG9tYXRpb25JZH1cIl1gIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBjaGVja0lmTWF0QnV0dG9uRXhpc3RzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuaGFzSGFybmVzcyhNYXRCdXR0b25IYXJuZXNzKTtcbiAgICB9XG5cbiAgICBhc3luYyBjaGVja0lmTWF0QnV0dG9uRXhpc3RzV2l0aERhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5oYXNIYXJuZXNzKE1hdEJ1dHRvbkhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yOiBgW2RhdGEtYXV0b21hdGlvbi1pZD1cIiR7ZGF0YUF1dG9tYXRpb25JZH1cIl1gIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBjbGlja01hdEJ1dHRvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgYnV0dG9uID0gYXdhaXQgdGhpcy5nZXRNYXRCdXR0b24oKTtcbiAgICAgICAgYXdhaXQgYnV0dG9uLmNsaWNrKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2xpY2tNYXRCdXR0b25CeUNTUyhzZWxlY3Rvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IGF3YWl0IHRoaXMuZ2V0TWF0QnV0dG9uQnlDU1Moc2VsZWN0b3IpO1xuICAgICAgICBhd2FpdCBidXR0b24uY2xpY2soKTtcbiAgICB9XG5cbiAgICBhc3luYyBjbGlja01hdEJ1dHRvbkJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgYnV0dG9uID0gYXdhaXQgdGhpcy5nZXRNYXRCdXR0b25CeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZCk7XG4gICAgICAgIGF3YWl0IGJ1dHRvbi5jbGljaygpO1xuICAgIH1cblxuICAgIGFzeW5jIHNlbmRLZXlzVG9NYXRCdXR0b24oa2V5czogKHN0cmluZyB8IFRlc3RLZXkpW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgYnV0dG9uID0gYXdhaXQgdGhpcy5nZXRNYXRCdXR0b24oKTtcbiAgICAgICAgY29uc3QgaG9zdCA9IGF3YWl0IGJ1dHRvbi5ob3N0KCk7XG4gICAgICAgIGF3YWl0IGhvc3Quc2VuZEtleXMoLi4ua2V5cyk7XG4gICAgfVxuXG4gICAgLyoqIE1hdENoZWNrYm94IHJlbGF0ZWQgbWV0aG9kcyAqL1xuXG4gICAgYXN5bmMgZ2V0TWF0Q2hlY2tib3goKTogUHJvbWlzZTxNYXRDaGVja2JveEhhcm5lc3M+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmdldEhhcm5lc3MoTWF0Q2hlY2tib3hIYXJuZXNzKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNYXRDaGVja2JveEJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1hdENoZWNrYm94SGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRDaGVja2JveEhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yOiBgW2RhdGEtYXV0b21hdGlvbi1pZD1cIiR7ZGF0YUF1dG9tYXRpb25JZH1cIl1gIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNYXRDaGVja2JveEhvc3QoKTogUHJvbWlzZTxUZXN0RWxlbWVudD4ge1xuICAgICAgICBjb25zdCBjaGVja2JveCA9IGF3YWl0IHRoaXMuZ2V0TWF0Q2hlY2tib3goKTtcbiAgICAgICAgcmV0dXJuIGNoZWNrYm94Lmhvc3QoKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRBbGxNYXRDaGVja2JveGVzKCk6IFByb21pc2U8TWF0Q2hlY2tib3hIYXJuZXNzW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmdldEFsbEhhcm5lc3NlcyhNYXRDaGVja2JveEhhcm5lc3MpO1xuICAgIH1cblxuICAgIGFzeW5jIGNoZWNrSWZNYXRDaGVja2JveElzQ2hlY2tlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgY2hlY2tib3ggPSBhd2FpdCB0aGlzLmdldE1hdENoZWNrYm94KCk7XG4gICAgICAgIHJldHVybiBjaGVja2JveC5pc0NoZWNrZWQoKTtcbiAgICB9XG5cbiAgICBhc3luYyBjaGVja0lmTWF0Q2hlY2tib3hlc0hhdmVDbGFzcyhjbGFzc05hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBjaGVja2JveGVzID0gYXdhaXQgdGhpcy5nZXRBbGxNYXRDaGVja2JveGVzKCk7XG4gICAgICAgIHJldHVybiBjaGVja2JveGVzLmV2ZXJ5KGFzeW5jIChjaGVja2JveCkgPT4gKGF3YWl0IGNoZWNrYm94Lmhvc3QoKSkuaGFzQ2xhc3MoY2xhc3NOYW1lKSk7XG4gICAgfVxuXG4gICAgYXN5bmMgaG92ZXJPdmVyTWF0Q2hlY2tib3goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGhvc3QgPSBhd2FpdCB0aGlzLmdldE1hdENoZWNrYm94SG9zdCgpO1xuICAgICAgICBhd2FpdCBob3N0LmhvdmVyKCk7XG4gICAgfVxuXG4gICAgLyoqIE1hdEljb24gcmVsYXRlZCBtZXRob2RzICovXG5cbiAgICBhc3luYyBnZXRNYXRJY29uT3JOdWxsKCk6IFByb21pc2U8TWF0SWNvbkhhcm5lc3M+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmdldEhhcm5lc3NPck51bGwoTWF0SWNvbkhhcm5lc3MpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldE1hdEljb25XaXRoQW5jZXN0b3JCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxNYXRJY29uSGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRJY29uSGFybmVzcy53aXRoKHsgYW5jZXN0b3I6IGBbZGF0YS1hdXRvbWF0aW9uLWlkPVwiJHtkYXRhQXV0b21hdGlvbklkfVwiXWAgfSkpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldE1hdEljb25XaXRoQW5jZXN0b3JCeUNTUyhzZWxlY3Rvcjogc3RyaW5nKTogUHJvbWlzZTxNYXRJY29uSGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRJY29uSGFybmVzcy53aXRoKHsgYW5jZXN0b3I6IHNlbGVjdG9yIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNYXRJY29uV2l0aEFuY2VzdG9yQnlDU1NBbmROYW1lKHNlbGVjdG9yOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8TWF0SWNvbkhhcm5lc3M+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmdldEhhcm5lc3MoTWF0SWNvbkhhcm5lc3Mud2l0aCh7IGFuY2VzdG9yOiBzZWxlY3RvciwgbmFtZSB9KSk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tJZk1hdEljb25FeGlzdHNXaXRoQW5jZXN0b3JCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5oYXNIYXJuZXNzKE1hdEljb25IYXJuZXNzLndpdGgoeyBhbmNlc3RvcjogYFtkYXRhLWF1dG9tYXRpb24taWQ9XCIke2RhdGFBdXRvbWF0aW9uSWR9XCJdYCB9KSk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tJZk1hdEljb25FeGlzdHNXaXRoQW5jZXN0b3JCeUNTU0FuZE5hbWUoc2VsZWN0b3I6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5oYXNIYXJuZXNzKE1hdEljb25IYXJuZXNzLndpdGgoeyBhbmNlc3Rvcjogc2VsZWN0b3IsIG5hbWUgfSkpO1xuICAgIH1cblxuICAgIGFzeW5jIGNsaWNrTWF0SWNvbldpdGhBbmNlc3RvckJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaWNvbiA9IGF3YWl0IHRoaXMuZ2V0TWF0SWNvbldpdGhBbmNlc3RvckJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkKTtcbiAgICAgICAgY29uc3QgaG9zdCA9IGF3YWl0IGljb24uaG9zdCgpO1xuICAgICAgICBhd2FpdCBob3N0LmNsaWNrKCk7XG4gICAgfVxuXG4gICAgLyoqIE1hdFNlbGVjdCByZWxhdGVkIG1ldGhvZHMgKi9cblxuICAgIGFzeW5jIGdldE1hdFNlbGVjdE9wdGlvbnMoaXNPcGVuZWQgPSBmYWxzZSk6IFByb21pc2U8TWF0T3B0aW9uSGFybmVzc1tdPiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdCA9IGF3YWl0IHRoaXMubG9hZGVyLmdldEhhcm5lc3MoTWF0U2VsZWN0SGFybmVzcyk7XG4gICAgICAgIGlmICghaXNPcGVuZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHNlbGVjdC5vcGVuKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlbGVjdC5nZXRPcHRpb25zKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0TWF0U2VsZWN0SG9zdCgpOiBQcm9taXNlPFRlc3RFbGVtZW50PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdCA9IGF3YWl0IHRoaXMubG9hZGVyLmdldEhhcm5lc3MoTWF0U2VsZWN0SGFybmVzcyk7XG4gICAgICAgIHJldHVybiBzZWxlY3QuaG9zdCgpO1xuICAgIH1cblxuICAgIGFzeW5jIGNoZWNrSWZNYXRTZWxlY3RFeGlzdHMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5oYXNIYXJuZXNzKE1hdFNlbGVjdEhhcm5lc3MpO1xuICAgIH1cblxuICAgIGFzeW5jIG9wZW5NYXRTZWxlY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdCA9IGF3YWl0IHRoaXMubG9hZGVyLmdldEhhcm5lc3MoTWF0U2VsZWN0SGFybmVzcyk7XG4gICAgICAgIGF3YWl0IHNlbGVjdC5vcGVuKCk7XG4gICAgfVxuXG4gICAgLyoqIE1hdENoaXBzIHJlbGF0ZWQgbWV0aG9kcyAqL1xuXG4gICAgYXN5bmMgZ2V0TWF0Q2hpcEJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1hdENoaXBIYXJuZXNzPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5nZXRIYXJuZXNzKE1hdENoaXBIYXJuZXNzLndpdGgoeyBzZWxlY3RvcjogYFtkYXRhLWF1dG9tYXRpb24taWQ9XCIke2RhdGFBdXRvbWF0aW9uSWR9XCJdYCB9KSk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tJZk1hdENoaXBFeGlzdHNXaXRoRGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmhhc0hhcm5lc3MoTWF0Q2hpcEhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yOiBgW2RhdGEtYXV0b21hdGlvbi1pZD1cIiR7ZGF0YUF1dG9tYXRpb25JZH1cIl1gIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBjbGlja01hdENoaXAoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGNoaXAgPSBhd2FpdCB0aGlzLmdldE1hdENoaXBCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZCk7XG4gICAgICAgIGNvbnN0IGhvc3QgPSBhd2FpdCBjaGlwLmhvc3QoKTtcbiAgICAgICAgYXdhaXQgaG9zdC5jbGljaygpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldE1hdENoaXBzKCk6IFByb21pc2U8TWF0Q2hpcEhhcm5lc3NbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0QWxsSGFybmVzc2VzKE1hdENoaXBIYXJuZXNzKTtcbiAgICB9XG5cbiAgICAvKiogTWF0Q2hpcExpc3Rib3ggcmVsYXRlZCBtZXRob2RzICovXG5cbiAgICBhc3luYyBnZXRNYXRDaGlwTGlzdGJveEJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1hdENoaXBMaXN0Ym94SGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRDaGlwTGlzdGJveEhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yOiBgW2RhdGEtYXV0b21hdGlvbi1pZD1cIiR7ZGF0YUF1dG9tYXRpb25JZH1cIl1gIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBjbGlja01hdENoaXBMaXN0Ym94KGRhdGFBdXRvbWF0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjaGlwTGlzdCA9IGF3YWl0IHRoaXMuZ2V0TWF0Q2hpcExpc3Rib3hCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZCk7XG4gICAgICAgIGNvbnN0IGhvc3QgPSBhd2FpdCBjaGlwTGlzdC5ob3N0KCk7XG4gICAgICAgIGF3YWl0IGhvc3QuY2xpY2soKTtcbiAgICB9XG5cbiAgICAvKiogTWF0Q2hpcEdyaWQgcmVsYXRlZCBtZXRob2RzICovXG5cbiAgICBhc3luYyBjaGVja0lmTWF0Q2hpcEdyaWRFeGlzdHMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5oYXNIYXJuZXNzKE1hdENoaXBHcmlkSGFybmVzcyk7XG4gICAgfVxuXG4gICAgLyoqIE1hdEZyb21GaWVsZCByZWxhdGVkIG1ldGhvZHMgKi9cblxuICAgIGFzeW5jIGdldE1hdEZvcm1GaWVsZCgpOiBQcm9taXNlPE1hdEZvcm1GaWVsZEhhcm5lc3M+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmdldEhhcm5lc3MoTWF0Rm9ybUZpZWxkSGFybmVzcyk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0TWF0Rm9ybUZpZWxkQnlDU1Moc2VsZWN0b3I6IHN0cmluZyk6IFByb21pc2U8TWF0Rm9ybUZpZWxkSGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRGb3JtRmllbGRIYXJuZXNzLndpdGgoeyBzZWxlY3RvciB9KSk7XG4gICAgfVxuXG4gICAgLyoqIE1hdElucHV0IHJlbGF0ZWQgbWV0aG9kcyAqL1xuXG4gICAgYXN5bmMgZ2V0TWF0SW5wdXQoKTogUHJvbWlzZTxNYXRJbnB1dEhhcm5lc3M+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmdldEhhcm5lc3MoTWF0SW5wdXRIYXJuZXNzKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNYXRJbnB1dEJ5Q1NTKHNlbGVjdG9yOiBzdHJpbmcpOiBQcm9taXNlPE1hdElucHV0SGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRJbnB1dEhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNYXRJbnB1dEJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1hdElucHV0SGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRJbnB1dEhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yOiBgW2RhdGEtYXV0b21hdGlvbi1pZD1cIiR7ZGF0YUF1dG9tYXRpb25JZH1cIl1gIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNYXRJbnB1dEJ5UGxhY2Vob2xkZXIocGxhY2Vob2xkZXI6IHN0cmluZyk6IFByb21pc2U8TWF0SW5wdXRIYXJuZXNzPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5nZXRIYXJuZXNzKE1hdElucHV0SGFybmVzcy53aXRoKHsgcGxhY2Vob2xkZXIgfSkpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldE1hdElucHV0SG9zdCgpOiBQcm9taXNlPFRlc3RFbGVtZW50PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gYXdhaXQgdGhpcy5nZXRNYXRJbnB1dCgpO1xuICAgICAgICByZXR1cm4gaW5wdXQuaG9zdCgpO1xuICAgIH1cblxuICAgIGFzeW5jIGNoZWNrSWZNYXRJbnB1dEV4aXN0cygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmhhc0hhcm5lc3MoTWF0SW5wdXRIYXJuZXNzKTtcbiAgICB9XG5cbiAgICBhc3luYyBjaGVja0lmTWF0SW5wdXRFeGlzdHNXaXRoQ1NTKHNlbGVjdG9yOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmhhc0hhcm5lc3MoTWF0SW5wdXRIYXJuZXNzLndpdGgoeyBzZWxlY3RvciB9KSk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tJZk1hdElucHV0RXhpc3RzV2l0aERhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5oYXNIYXJuZXNzKE1hdElucHV0SGFybmVzcy53aXRoKHsgc2VsZWN0b3I6IGBbZGF0YS1hdXRvbWF0aW9uLWlkPVwiJHtkYXRhQXV0b21hdGlvbklkfVwiXWAgfSkpO1xuICAgIH1cblxuICAgIGFzeW5jIGNoZWNrSWZNYXRJbnB1dEV4aXN0c1dpdGhQbGFjZWhvbGRlcihwbGFjZWhvbGRlcjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5oYXNIYXJuZXNzKE1hdElucHV0SGFybmVzcy53aXRoKHsgcGxhY2Vob2xkZXIgfSkpO1xuICAgIH1cblxuICAgIGFzeW5jIGNsaWNrTWF0SW5wdXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gYXdhaXQgdGhpcy5nZXRNYXRJbnB1dCgpO1xuICAgICAgICBjb25zdCBob3N0ID0gYXdhaXQgaW5wdXQuaG9zdCgpO1xuICAgICAgICBhd2FpdCBob3N0LmNsaWNrKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZmlsbE1hdElucHV0KHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLmdldE1hdElucHV0KCk7XG4gICAgICAgIGF3YWl0IGlucHV0LnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBhc3luYyBmaWxsTWF0SW5wdXRCeUNTUyhzZWxlY3Rvcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gYXdhaXQgdGhpcy5nZXRNYXRJbnB1dEJ5Q1NTKHNlbGVjdG9yKTtcbiAgICAgICAgYXdhaXQgaW5wdXQuc2V0VmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIGFzeW5jIGZpbGxNYXRJbnB1dEJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLmdldE1hdElucHV0QnlEYXRhQXV0b21hdGlvbklkKGRhdGFBdXRvbWF0aW9uSWQpO1xuICAgICAgICBhd2FpdCBpbnB1dC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGF3YWl0IChhd2FpdCBpbnB1dC5ob3N0KCkpLmRpc3BhdGNoRXZlbnQoJ2lucHV0Jyk7XG4gICAgfVxuXG4gICAgYXN5bmMgZm9jdXNNYXRJbnB1dCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLmdldE1hdElucHV0KCk7XG4gICAgICAgIGF3YWl0IGlucHV0LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgYmx1ck1hdElucHV0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGF3YWl0IHRoaXMuZ2V0TWF0SW5wdXQoKTtcbiAgICAgICAgYXdhaXQgaW5wdXQuYmx1cigpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldE1hdElucHV0VmFsdWUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLmdldE1hdElucHV0KCk7XG4gICAgICAgIHJldHVybiBpbnB1dC5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldE1hdElucHV0VmFsdWVCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLmdldE1hdElucHV0QnlEYXRhQXV0b21hdGlvbklkKGRhdGFBdXRvbWF0aW9uSWQpO1xuICAgICAgICByZXR1cm4gaW5wdXQuZ2V0VmFsdWUoKTtcbiAgICB9XG5cbiAgICBhc3luYyBzZW5kS2V5c1RvTWF0SW5wdXQoa2V5czogKHN0cmluZyB8IFRlc3RLZXkpW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLmdldE1hdElucHV0KCk7XG4gICAgICAgIGNvbnN0IGhvc3QgPSBhd2FpdCBpbnB1dC5ob3N0KCk7XG4gICAgICAgIGF3YWl0IGhvc3Quc2VuZEtleXMoLi4ua2V5cyk7XG4gICAgfVxuXG4gICAgLyoqIE1hdEF1dG9Db21wbGV0ZSByZWxhdGVkIG1ldGhvZHMgKi9cblxuICAgIGFzeW5jIHR5cGVBbmRHZXRPcHRpb25zRm9yTWF0QXV0b0NvbXBsZXRlKGZpeHR1cmU6IENvbXBvbmVudEZpeHR1cmU8YW55PiwgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8TWF0T3B0aW9uSGFybmVzc1tdPiB7XG4gICAgICAgIGNvbnN0IGF1dG9jb21wbGV0ZSA9IGF3YWl0IHRoaXMubG9hZGVyLmdldEhhcm5lc3MoTWF0QXV0b2NvbXBsZXRlSGFybmVzcyk7XG4gICAgICAgIGF3YWl0IGF1dG9jb21wbGV0ZS5lbnRlclRleHQodmFsdWUpO1xuICAgICAgICBmaXh0dXJlLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICByZXR1cm4gYXV0b2NvbXBsZXRlLmdldE9wdGlvbnMoKTtcbiAgICB9XG5cbiAgICAvKiogTWF0RXJyb3IgcmVsYXRlZCBtZXRob2RzICovXG5cbiAgICBhc3luYyBnZXRNYXRFcnJvckJ5Q1NTKHNlbGVjdG9yOiBzdHJpbmcpOiBQcm9taXNlPE1hdEVycm9ySGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRFcnJvckhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNYXRFcnJvckJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1hdEVycm9ySGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRFcnJvckhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yOiBgW2RhdGEtYXV0b21hdGlvbi1pZD1cIiR7ZGF0YUF1dG9tYXRpb25JZH1cIl1gIH0pKTtcbiAgICB9XG5cbiAgICAvKiogTWF0VGFiR3JvdXAgcmVsYXRlZCBtZXRob2RzICovXG5cbiAgICBhc3luYyBnZXRTZWxlY3RlZFRhYkZyb21NYXRUYWJHcm91cCgpOiBQcm9taXNlPE1hdFRhYkhhcm5lc3M+IHtcbiAgICAgICAgY29uc3QgdGFicyA9IGF3YWl0IHRoaXMubG9hZGVyLmdldEhhcm5lc3MoTWF0VGFiR3JvdXBIYXJuZXNzKTtcbiAgICAgICAgcmV0dXJuIHRhYnMuZ2V0U2VsZWN0ZWRUYWIoKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRTZWxlY3RlZFRhYkxhYmVsRnJvbU1hdFRhYkdyb3VwKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHRhYiA9IGF3YWl0IHRoaXMuZ2V0U2VsZWN0ZWRUYWJGcm9tTWF0VGFiR3JvdXAoKTtcbiAgICAgICAgcmV0dXJuIHRhYi5nZXRMYWJlbCgpO1xuICAgIH1cblxuICAgIC8qKiBNYXRUb29sYmFyIHJlbGF0ZWQgbWV0aG9kcyAqL1xuXG4gICAgYXN5bmMgZ2V0TWF0VG9vbGJhckhvc3QoKTogUHJvbWlzZTxUZXN0RWxlbWVudD4ge1xuICAgICAgICBjb25zdCB0b29sYmFyID0gYXdhaXQgdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRUb29sYmFySGFybmVzcyk7XG4gICAgICAgIHJldHVybiB0b29sYmFyLmhvc3QoKTtcbiAgICB9XG5cbiAgICAvKiogTWF0U25hY2tiYXIgcmVsYXRlZCBtZXRob2RzICovXG5cbiAgICBhc3luYyBjaGVja0lmTWF0U25hY2tiYXJFeGlzdHMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5oYXNIYXJuZXNzKE1hdFNuYWNrQmFySGFybmVzcyk7XG4gICAgfVxuXG4gICAgLyoqIE1hdFByb2dyZXNzQmFyIHJlbGF0ZWQgbWV0aG9kcyAqL1xuXG4gICAgYXN5bmMgZ2V0TWF0UHJvZ3Jlc3NCYXJIb3N0KCk6IFByb21pc2U8VGVzdEVsZW1lbnQ+IHtcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBhd2FpdCB0aGlzLmxvYWRlci5nZXRIYXJuZXNzKE1hdFByb2dyZXNzQmFySGFybmVzcyk7XG4gICAgICAgIHJldHVybiBwcm9ncmVzcy5ob3N0KCk7XG4gICAgfVxufVxuIl19