@rangertechnologies/ngnxt 2.1.241 → 2.1.242-beta

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.
Files changed (90) hide show
  1. package/fesm2022/rangertechnologies-ngnxt.mjs +159 -193
  2. package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
  3. package/lib/components/image-cropper/component/image-cropper.component.d.ts +1 -1
  4. package/lib/components/pick-location/pick-location.component.d.ts +0 -1
  5. package/package.json +4 -6
  6. package/rangertechnologies-ngnxt-2.1.242-beta.tgz +0 -0
  7. package/esm2022/environments/version.mjs +0 -15
  8. package/esm2022/lib/ar.i18n.mjs +0 -29
  9. package/esm2022/lib/components/button/nxt-button.component.mjs +0 -165
  10. package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +0 -371
  11. package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +0 -274
  12. package/esm2022/lib/components/custom-model/custom-model.component.mjs +0 -51
  13. package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +0 -156
  14. package/esm2022/lib/components/datatable/datatable.component.mjs +0 -1625
  15. package/esm2022/lib/components/file-upload/file-upload.component.mjs +0 -283
  16. package/esm2022/lib/components/icon-selector/icon-selector.component.mjs +0 -104
  17. package/esm2022/lib/components/image-cropper/component/cropper.state.mjs +0 -208
  18. package/esm2022/lib/components/image-cropper/component/image-cropper.component.mjs +0 -562
  19. package/esm2022/lib/components/image-cropper/interfaces/basic-event.interface.mjs +0 -2
  20. package/esm2022/lib/components/image-cropper/interfaces/cropper-options.interface.mjs +0 -2
  21. package/esm2022/lib/components/image-cropper/interfaces/cropper-position.interface.mjs +0 -2
  22. package/esm2022/lib/components/image-cropper/interfaces/dimensions.interface.mjs +0 -2
  23. package/esm2022/lib/components/image-cropper/interfaces/exif-transform.interface.mjs +0 -2
  24. package/esm2022/lib/components/image-cropper/interfaces/image-cropped-event.interface.mjs +0 -2
  25. package/esm2022/lib/components/image-cropper/interfaces/image-transform.interface.mjs +0 -2
  26. package/esm2022/lib/components/image-cropper/interfaces/index.mjs +0 -2
  27. package/esm2022/lib/components/image-cropper/interfaces/loaded-image.interface.mjs +0 -2
  28. package/esm2022/lib/components/image-cropper/interfaces/move-start.interface.mjs +0 -8
  29. package/esm2022/lib/components/image-cropper/services/crop.service.mjs +0 -139
  30. package/esm2022/lib/components/image-cropper/services/load-image.service.mjs +0 -194
  31. package/esm2022/lib/components/image-cropper/utils/cropper-position.utils.mjs +0 -239
  32. package/esm2022/lib/components/image-cropper/utils/exif.utils.mjs +0 -79
  33. package/esm2022/lib/components/image-cropper/utils/keyboard.utils.mjs +0 -40
  34. package/esm2022/lib/components/image-cropper/utils/percentage.utils.mjs +0 -4
  35. package/esm2022/lib/components/image-cropper/utils/resize.utils.mjs +0 -75
  36. package/esm2022/lib/components/list-view-filter/list-view-filter.component.mjs +0 -403
  37. package/esm2022/lib/components/nxt-input/nxt-input.component.mjs +0 -2925
  38. package/esm2022/lib/components/pagination/pagination.component.mjs +0 -101
  39. package/esm2022/lib/components/pick-location/pick-location.component.mjs +0 -234
  40. package/esm2022/lib/components/search-box/search-box.component.mjs +0 -415
  41. package/esm2022/lib/country.json +0 -43237
  42. package/esm2022/lib/en.i18n.mjs +0 -29
  43. package/esm2022/lib/i18n-config.service.mjs +0 -4
  44. package/esm2022/lib/i18n.component.mjs +0 -47
  45. package/esm2022/lib/i18n.module.mjs +0 -38
  46. package/esm2022/lib/i18n.pipe.mjs +0 -26
  47. package/esm2022/lib/i18n.service.mjs +0 -56
  48. package/esm2022/lib/interfaces/actionMeta.mjs +0 -2
  49. package/esm2022/lib/interfaces/apimeta.mjs +0 -2
  50. package/esm2022/lib/interfaces/dependencyMeta.mjs +0 -2
  51. package/esm2022/lib/model/bookletWrapper.mjs +0 -9
  52. package/esm2022/lib/model/changeWrapper.mjs +0 -11
  53. package/esm2022/lib/model/errorWrapper.mjs +0 -6
  54. package/esm2022/lib/nxt-app.component.mjs +0 -22
  55. package/esm2022/lib/nxt-app.module.mjs +0 -139
  56. package/esm2022/lib/nxt-app.service.mjs +0 -14
  57. package/esm2022/lib/pages/booklet/booklet.component.mjs +0 -675
  58. package/esm2022/lib/pages/builder/element/element.component.mjs +0 -466
  59. package/esm2022/lib/pages/builder/form/form.component.mjs +0 -45
  60. package/esm2022/lib/pages/builder/properties/common-fields.constants.mjs +0 -89
  61. package/esm2022/lib/pages/builder/properties/properties.component.mjs +0 -1021
  62. package/esm2022/lib/pages/builder/templates/templates.component.mjs +0 -34
  63. package/esm2022/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.mjs +0 -676
  64. package/esm2022/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.mjs +0 -1126
  65. package/esm2022/lib/pages/questionbook/questionbook.component.mjs +0 -841
  66. package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +0 -2405
  67. package/esm2022/lib/pipe/custom-translate.pipe.mjs +0 -27
  68. package/esm2022/lib/pipe/date/date.pipe.mjs +0 -28
  69. package/esm2022/lib/pipe/editColumnCheck/edit-column-check.pipe.mjs +0 -28
  70. package/esm2022/lib/pipe/editColumnDropdown/edit-column-dropdown.pipe.mjs +0 -20
  71. package/esm2022/lib/pipe/editColumnType/edit-column-type.pipe.mjs +0 -20
  72. package/esm2022/lib/pipe/get-value.pipe.mjs +0 -48
  73. package/esm2022/lib/pipe/search-filter/search-filter.pipe.mjs +0 -39
  74. package/esm2022/lib/pipe/time/time.pipe.mjs +0 -26
  75. package/esm2022/lib/sample.mjs +0 -3715
  76. package/esm2022/lib/services/change.service.mjs +0 -50
  77. package/esm2022/lib/services/country.service.mjs +0 -135
  78. package/esm2022/lib/services/data.service.mjs +0 -103
  79. package/esm2022/lib/services/form-builder.service.mjs +0 -375
  80. package/esm2022/lib/services/pdf-designer.service.mjs +0 -401
  81. package/esm2022/lib/services/salesforce.service.mjs +0 -46
  82. package/esm2022/lib/services/shared.service.mjs +0 -100
  83. package/esm2022/lib/services/storage.service.mjs +0 -44
  84. package/esm2022/lib/services/template.service.mjs +0 -351
  85. package/esm2022/lib/services/translation.service.mjs +0 -62
  86. package/esm2022/lib/tam.i18n.mjs +0 -29
  87. package/esm2022/lib/wrapper.mjs +0 -175
  88. package/esm2022/public-api.mjs +0 -25
  89. package/esm2022/rangertechnologies-ngnxt.mjs +0 -5
  90. package/rangertechnologies-ngnxt-2.1.241.tgz +0 -0
@@ -1,415 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, ViewChild, signal, HostListener } from "@angular/core";
2
- import { ChangeWrapper } from "../../model/changeWrapper";
3
- import { CommonModule } from "@angular/common";
4
- import { FormsModule } from "@angular/forms";
5
- import { NxtInput } from "../nxt-input/nxt-input.component";
6
- import { Subject, debounceTime, distinctUntilChanged, takeUntil } from "rxjs";
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "../../services/data.service";
9
- import * as i2 from "../../i18n.service";
10
- import * as i3 from "../../services/country.service";
11
- import * as i4 from "@angular/common";
12
- export class NxtSearchBox {
13
- dataService;
14
- i18nService;
15
- countryService;
16
- elementRef;
17
- placeHolderText = '';
18
- question;
19
- apiMeta;
20
- id = '';
21
- readOnly = false;
22
- mode = 'edit';
23
- searchValueChange = new EventEmitter();
24
- searchWrapper;
25
- SearchItem;
26
- finalResults = signal([]);
27
- searchKeyWord = '';
28
- newResult;
29
- showResult = false;
30
- noResult = false;
31
- showSuggestion = false;
32
- isLoading = false;
33
- viewFilterName = '';
34
- isSingleFieldChange = false;
35
- valueObj;
36
- inputFocused = false;
37
- lastSearchLength = 0;
38
- filterName = '';
39
- destroy$ = new Subject();
40
- searchSubject = new Subject();
41
- // TrackBy function for performance optimization
42
- trackByFn = (index, item) => {
43
- return item.id || item.name || index;
44
- };
45
- constructor(dataService, i18nService, countryService, elementRef) {
46
- this.dataService = dataService;
47
- this.i18nService = i18nService;
48
- this.countryService = countryService;
49
- this.elementRef = elementRef;
50
- if (this.question?.input && typeof this.question?.input === 'object' && !Array.isArray(this.question?.input)) {
51
- this.clickItem(this.question?.input);
52
- }
53
- else {
54
- this.filterName = this.question?.input;
55
- }
56
- // Setup debounced search
57
- this.searchSubject
58
- .pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$))
59
- .subscribe(keyword => {
60
- if (this.lastSearchLength > 2)
61
- this.performSearch(keyword);
62
- });
63
- }
64
- ngOnInit() {
65
- if (this.question?.input && typeof this.question?.input === 'object' && !Array.isArray(this.question?.input)) {
66
- this.clickItem(this.question?.input);
67
- }
68
- else {
69
- this.filterName = this.question?.input;
70
- }
71
- this.parseApiMeta();
72
- }
73
- ngOnChanges(changes) {
74
- if (changes['mode']) {
75
- this.mode = changes['mode'].currentValue;
76
- }
77
- if (this.mode !== 'edit' && this.isSingleFieldChange && changes['filterName']) {
78
- const previous = changes['filterName'].previousValue;
79
- const current = changes['filterName'].currentValue;
80
- if (previous !== current) {
81
- this.filterName = previous;
82
- }
83
- }
84
- if (changes['apiMeta'] && this.apiMeta) {
85
- this.parseApiMeta();
86
- }
87
- }
88
- ngOnDestroy() {
89
- this.destroy$.next();
90
- this.destroy$.complete();
91
- this.resetComponentState();
92
- }
93
- // Handle clicks outside the search component
94
- onDocumentClick(event) {
95
- if (!this.elementRef.nativeElement.contains(event.target)) {
96
- this.hideSuggestions();
97
- }
98
- }
99
- // Handle escape key to close suggestions
100
- onEscapeKey(event) {
101
- this.hideSuggestions();
102
- }
103
- parseApiMeta() {
104
- if (this.apiMeta) {
105
- this.apiMeta = typeof this.apiMeta === 'object' ? this.apiMeta : JSON.parse(this.apiMeta || '{}');
106
- this.SearchItem = this.apiMeta.field || [];
107
- }
108
- }
109
- resetComponentState() {
110
- this.finalResults.set([]);
111
- this.searchKeyWord = '';
112
- this.showSuggestion = false;
113
- this.noResult = false;
114
- this.isLoading = false;
115
- this.inputFocused = false;
116
- this.lastSearchLength = 0;
117
- }
118
- hideSuggestions() {
119
- this.showSuggestion = false;
120
- this.inputFocused = false;
121
- }
122
- onInputFocus() {
123
- this.inputFocused = true;
124
- // Trigger a search with an empty keyword to show all data
125
- if (!this.searchKeyWord) {
126
- this.performSearch('');
127
- }
128
- else if (this.finalResults().length > 0) {
129
- this.showSuggestion = true;
130
- }
131
- }
132
- onInputBlur() {
133
- // Don't immediately hide suggestions to allow for clicking
134
- // The document click handler will handle hiding
135
- }
136
- clearList() {
137
- // Remove the setTimeout delay that was causing issues
138
- this.hideSuggestions();
139
- }
140
- getSourceDataLocal(event) {
141
- if (!event?.value) {
142
- this.resetComponentState();
143
- return;
144
- }
145
- const searchValue = event.value.includes('|') ? event.value.split('|')[0].trim() : event.value.trim();
146
- const currentLength = searchValue.length;
147
- // Always update the search keyword
148
- this.searchKeyWord = searchValue;
149
- // Handle the case where user types 3+ characters
150
- if (currentLength > 2 && !this.isSingleFieldChange) {
151
- this.showSuggestion = !event.question?.singleFieldChange;
152
- this.showResult = false;
153
- this.noResult = false;
154
- // Always perform search when we have 3+ characters
155
- this.lastSearchLength = currentLength;
156
- this.searchSubject.next(searchValue);
157
- }
158
- else if (currentLength <= 2) {
159
- // When length is 2 or less, hide suggestions but keep the search keyword
160
- this.isSingleFieldChange = false;
161
- this.showSuggestion = false;
162
- this.noResult = false;
163
- this.lastSearchLength = currentLength;
164
- this.searchSubject.next(searchValue);
165
- this.finalResults.set([]);
166
- }
167
- }
168
- performSearch(keyword) {
169
- if (!this.apiMeta)
170
- return;
171
- this.parseApiMeta();
172
- if (!this.apiMeta.isStaticData) {
173
- this.searchFromApi(keyword);
174
- }
175
- else {
176
- this.searchFromStaticData(keyword);
177
- }
178
- }
179
- searchFromApi(keyword) {
180
- this.isLoading = true;
181
- this.finalResults.set([]);
182
- let finalGetCall = this.apiMeta.endpoint;
183
- // SKS18JUL25 query params creation
184
- // const isFieldArray = Array.isArray(this.apiMeta?.field);
185
- // const fields = isFieldArray ? this.apiMeta.field : [this.apiMeta.field]; // always an array now
186
- // // Build query params string
187
- // const queryParams = fields
188
- // .map(field => `${field}=${this.searchKeyWord}`)
189
- // .join('&');
190
- // // Check if endpoint already has query params
191
- // if (this.apiMeta.endpoint.includes('?')) {
192
- // finalGetCall += `&${queryParams}`;
193
- // } else {
194
- // finalGetCall += `?${queryParams}`;
195
- // }
196
- this.dataService.apiResponse(finalGetCall)
197
- .pipe(takeUntil(this.destroy$))
198
- .subscribe({
199
- next: (apiResponse) => {
200
- this.isLoading = false;
201
- this.processSearchResults(apiResponse, keyword);
202
- },
203
- error: (error) => {
204
- this.isLoading = false;
205
- this.noResult = true;
206
- this.finalResults.set([]);
207
- }
208
- });
209
- }
210
- searchFromStaticData(keyword) {
211
- const response = this.countryService.getCountryData(this.apiMeta.field);
212
- this.processSearchResults(response, keyword);
213
- }
214
- processSearchResults(apiResponse, keyword) {
215
- let response;
216
- if (this.apiMeta.variable) {
217
- response = this.dataService.getValue(apiResponse, this.apiMeta.variable);
218
- }
219
- else {
220
- response = apiResponse;
221
- }
222
- if (!Array.isArray(response)) {
223
- this.noResult = true;
224
- this.finalResults.set([]);
225
- return;
226
- }
227
- if (!keyword) {
228
- // If no keyword, show all results
229
- this.finalResults.set(response);
230
- this.noResult = response.length === 0;
231
- this.showSuggestion = true; // Ensure suggestions are visible
232
- }
233
- else {
234
- // Filter results based on the keyword
235
- const searchTerms = keyword.toLowerCase().split(" ").filter(term => term.length > 0);
236
- const results = response.filter(obj => {
237
- const combinedValues = this.getCombinedValuesFromColumns(obj, this.apiMeta.field);
238
- return searchTerms.every(term => combinedValues.includes(term));
239
- });
240
- this.noResult = results.length === 0;
241
- this.finalResults.set(results);
242
- this.showSuggestion = results.length > 0; // Show suggestions only if there are results
243
- }
244
- }
245
- getNestedValue(obj, path) {
246
- if (!obj || !path)
247
- return '';
248
- const processedPath = path.replace(/\[(\d+)\]/g, '.$1');
249
- const parts = processedPath.split('.');
250
- let current = obj;
251
- for (const part of parts) {
252
- if (!current || typeof current !== 'object')
253
- return '';
254
- current = current[part];
255
- }
256
- return current !== null && current !== undefined
257
- ? String(current).toLowerCase().trim()
258
- : '';
259
- }
260
- getCombinedValuesFromColumns(obj, columns) {
261
- if (!obj || !columns)
262
- return '';
263
- const columnArray = Array.isArray(columns) ? columns : [columns];
264
- const values = [];
265
- for (const column of columnArray) {
266
- const value = this.getNestedValue(obj, column);
267
- if (value) {
268
- values.push(value);
269
- }
270
- }
271
- return values.join(' ');
272
- }
273
- getValues(element, columns) {
274
- const result = {};
275
- if (!element || !columns)
276
- return result;
277
- const columnArray = Array.isArray(columns) ? columns : [columns];
278
- columnArray.forEach((column) => {
279
- if (!column)
280
- return;
281
- let tempElement = element;
282
- const fields = column.split('.');
283
- for (const field of fields) {
284
- if (!tempElement)
285
- break;
286
- const splitFields = field.split('[');
287
- if (splitFields.length === 1) {
288
- tempElement = tempElement[field];
289
- }
290
- else {
291
- const indexMatch = splitFields[1]?.match(/(\d+)\]/);
292
- if (indexMatch) {
293
- const index = Number(indexMatch[1]);
294
- tempElement = tempElement[splitFields[0]]?.[index];
295
- }
296
- }
297
- }
298
- result[column] = tempElement || '';
299
- });
300
- return result;
301
- }
302
- getKeys(obj) {
303
- return obj ? Object.keys(obj) : [];
304
- }
305
- clickItem(event) {
306
- if (!this.apiMeta)
307
- return;
308
- this.parseApiMeta();
309
- const values = this.getValues(event, this.SearchItem);
310
- const displayValue = Object.values(values)
311
- .filter(val => val)
312
- .join(' | ');
313
- if (this.mode !== 'edit') {
314
- this.viewFilterName = displayValue;
315
- }
316
- else {
317
- this.filterName = displayValue;
318
- }
319
- this.ngOnChanges({});
320
- const defaultField = this.apiMeta.defaultField ||
321
- (Array.isArray(this.apiMeta?.field) ? this.apiMeta?.field?.[0] : this.apiMeta.field);
322
- const change = new ChangeWrapper();
323
- change.fromQuestionId = this.id;
324
- change.valueObj = event;
325
- change.field = defaultField;
326
- this.valueObj = event;
327
- this.hideSuggestions();
328
- this.searchValueChange.emit({
329
- question: this.question,
330
- value: change
331
- });
332
- }
333
- removeCharacters(questionText) {
334
- if (!questionText)
335
- return '';
336
- return questionText.replace(/<[^>]*>/g, '');
337
- }
338
- inputValue(event, ques) {
339
- this.filterName = event.trim();
340
- if (!ques?.singleFieldChange || !this.apiMeta)
341
- return;
342
- this.isSingleFieldChange = true;
343
- this.parseApiMeta();
344
- const defaultField = this.apiMeta.defaultField ||
345
- (Array.isArray(this.apiMeta?.field) ? this.apiMeta?.field?.[0] : this.apiMeta.field);
346
- const change = new ChangeWrapper();
347
- change.fromQuestionId = this.id;
348
- change.valueObj = this.valueObj;
349
- change.field = defaultField;
350
- change.referenceField = this.question.referenceField;
351
- this.filterName = this.viewFilterName;
352
- this.searchValueChange.emit({
353
- question: ques,
354
- value: change
355
- });
356
- }
357
- highlightText(text, searchTerm) {
358
- if (!text || !searchTerm)
359
- return text || '';
360
- // Sanitize the input text
361
- const sanitizedText = this.sanitizeHtml(text);
362
- const terms = searchTerm.toLowerCase().split(' ').filter(term => term.length > 0);
363
- if (terms.length === 0)
364
- return sanitizedText;
365
- // Escape special regex characters
366
- const escapedTerms = terms.map(term => term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
367
- const regex = new RegExp(`(${escapedTerms.join('|')})`, 'gi');
368
- return sanitizedText.replace(regex, '<span class="highlight">$1</span>');
369
- }
370
- sanitizeHtml(text) {
371
- return text
372
- .replace(/&/g, '&amp;')
373
- .replace(/</g, '&lt;')
374
- .replace(/>/g, '&gt;')
375
- .replace(/"/g, '&quot;')
376
- .replace(/'/g, '&#39;');
377
- }
378
- removeValueEmit() {
379
- this.clickItem(null);
380
- }
381
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NxtSearchBox, deps: [{ token: i1.DataService }, { token: i2.I18nService }, { token: i3.CountryService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
382
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NxtSearchBox, isStandalone: true, selector: "nxt-search-box", inputs: { placeHolderText: "placeHolderText", question: "question", apiMeta: "apiMeta", id: "id", readOnly: "readOnly", mode: "mode" }, outputs: { searchValueChange: "searchValueChange" }, host: { listeners: { "document:click": "onDocumentClick($event)", "document:keydown.escape": "onEscapeKey($event)" } }, viewQueries: [{ propertyName: "searchWrapper", first: true, predicate: ["searchWrapper"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<!-- VD 12Jun24 - readonly change -->\n<div class=\"search-wrapper\" #searchWrapper>\n <nxt-input \n [type]=\"'list'\" \n [mode]=\"mode\" \n [value]=\"mode === 'edit' ? filterName : viewFilterName\"\n [labelFont]=\"question.font\" \n [label]=\"removeCharacters(question?.questionText)\" \n [labelColor]=\"question.fontColor\"\n [labelSize]=\"question.fontSize\" \n [inputValueSize]=\"question.fontSize\" \n [labelWeight]=\"question.fontWeight\"\n [inputWeight]=\"question.fontWeight\" \n [showLabel]=\"question.style?.showLabel\" \n inputBorder=\"none\" \n svgHeight=\"20px\"\n svgWidth=\"20px\" \n [placeholder]=\"placeHolderText\" \n [required]=\"question.isOptional\" \n inputBgColor=\"#FAFAFA\"\n [inputId]=\"question.trackingId\" \n [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"question.iconLeftSrc\" \n (inputValue)=\"getSourceDataLocal($event); inputValue($event.value, $event.question)\" \n (onFocus)=\"onInputFocus()\"\n (onBlur)=\"onInputBlur()\"\n [showSuggestion]=\"showSuggestion\" \n ariaOwns=\"selectList\" \n ariaHasPopup=\"listbox\" \n [isLoading]=\"isLoading\" \n [question]=\"question\"\n (removeValueEmit)=\"removeValueEmit()\">\n </nxt-input>\n\n <div id=\"selectList\" class=\"suggestion-wrapper\" role=\"listbox\" *ngIf=\"showSuggestion\">\n <div *ngIf=\"finalResults().length > 0\" class=\"suggestions-container\">\n <div *ngFor=\"let item of finalResults(); trackBy: trackByFn\" \n (click)=\"clickItem(item)\" \n class=\"suggestion-item\" \n role=\"option\"\n tabindex=\"0\"\n (keydown.enter)=\"clickItem(item)\"\n (keydown.space)=\"clickItem(item)\">\n <div class=\"item-content\">\n <div class=\"item-details\">\n <div *ngIf=\"item.thumbnail\" class=\"thumbnail-wrapper\">\n <img [src]=\"item.thumbnail\" [alt]=\"item.name + ' avatar'\" />\n </div>\n <div class=\"item-text\">\n <!-- Primary text (first key) -->\n <ng-container *ngIf=\"getKeys(getValues(item, SearchItem)).length > 0\">\n <div class=\"item-name primary\" \n [innerHTML]=\"highlightText(getValues(item, SearchItem)[getKeys(getValues(item, SearchItem))[0]], searchKeyWord)\">\n </div>\n </ng-container>\n \n <!-- Secondary text (remaining keys) -->\n <div class=\"item-secondary\" *ngIf=\"getKeys(getValues(item, SearchItem)).length > 1\">\n <ng-container *ngFor=\"let key of getKeys(getValues(item, SearchItem)); let i = index\">\n <ng-container *ngIf=\"i > 0\">\n <span class=\"secondary-text\" \n [innerHTML]=\"highlightText(getValues(item, SearchItem)[key], searchKeyWord)\">\n </span>\n <span class=\"separator\" *ngIf=\"i < getKeys(getValues(item, SearchItem)).length - 1\"> | </span>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n \n <div *ngIf=\"noResult && searchKeyWord\" class=\"no-results\">\n <div class=\"no-results-content\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <path d=\"m21 21-4.35-4.35\"></path>\n </svg>\n <p>No results found for \"{{searchKeyWord}}\"</p>\n </div>\n </div>\n </div>\n</div>", styles: [".search-wrapper{position:relative;width:100%}.suggestion-wrapper{position:absolute;top:100%;left:0;right:0;background:#fff;border:1px solid #e0e0e0;border-top:none;border-radius:0 0 4px 4px;box-shadow:0 2px 8px #0000001a;z-index:1000;max-height:300px;overflow:hidden}.suggestions-container{max-height:300px;overflow-y:auto;min-width:100%}.suggestion-item{cursor:pointer;border-bottom:1px solid #f0f0f0;transition:background-color .2s ease;outline:none}.suggestion-item:hover,.suggestion-item:focus{background-color:#f5f5f5}.suggestion-item:last-child{border-bottom:none}.item-content{padding:5px}.item-details{display:flex;align-items:flex-start;gap:12px;text-align:left}.thumbnail-wrapper{flex-shrink:0}.thumbnail-wrapper img{width:40px;height:40px;border-radius:50%;object-fit:cover;border:1px solid #e0e0e0}.item-text{flex:1;min-width:0}.item-name{font-size:14px;font-weight:500;color:#333;line-height:1.4;margin-bottom:2px;word-wrap:break-word;overflow-wrap:break-word}.item-secondary{font-size:12px;color:#666;line-height:1.3;display:flex}.secondary-text{display:inline}.separator{color:#999;margin:0 3px}.no-results{padding:20px;text-align:center;color:#666}.no-results-content{display:flex;align-items:center;justify-content:center;gap:8px;flex-direction:column}.no-results-content svg{color:#d1d5db;margin-bottom:8px}.no-results-content p{color:#6b7280;margin:0;font-size:14px;font-weight:500}:host ::ng-deep .highlight{font-weight:700;display:inline}.suggestions-container::-webkit-scrollbar{width:6px}.suggestions-container::-webkit-scrollbar-track{background:#f1f1f1}.suggestions-container::-webkit-scrollbar-thumb{background:#c1c1c1;border-radius:3px}.suggestions-container::-webkit-scrollbar-thumb:hover{background:#a8a8a8}@media (max-width: 768px){.suggestion-wrapper,.suggestions-container{max-height:250px}.item-content{padding:10px 12px}.item-details{gap:8px}.thumbnail-wrapper img{width:32px;height:32px}.item-name{font-size:13px}.item-secondary{font-size:11px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: NxtInput, selector: "nxt-input", inputs: ["label", "labelFont", "labelWeight", "inputWeight", "labelSize", "inputValueSize", "labelColor", "showLabel", "svgHeight", "svgWidth", "type", "inputIconRightSrc", "inputIconLeftSrc", "required", "minLength", "pattern", "errorMessages", "maxLength", "placeholder", "inputBgColor", "inputBorder", "placeholderColor", "placeholderFont", "placeholderWeight", "placeholderSize", "inputTextColor", "inputHeight", "inputWidth", "inputId", "inputBorderSize", "inputConfig", "confPassVal", "confPass", "mode", "value", "question", "showSuggestion", "ariaOwns", "ariaHasPopup", "isLoading", "options", "minDate", "maxDate", "rows", "size"], outputs: ["valueChange", "inputValue", "onBlur", "onFocus", "toggleEmit", "nativeInputRef", "removeValueEmit"] }] });
383
- }
384
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NxtSearchBox, decorators: [{
385
- type: Component,
386
- args: [{ selector: 'nxt-search-box', standalone: true, imports: [
387
- CommonModule,
388
- FormsModule,
389
- NxtInput
390
- ], template: "<!-- VD 12Jun24 - readonly change -->\n<div class=\"search-wrapper\" #searchWrapper>\n <nxt-input \n [type]=\"'list'\" \n [mode]=\"mode\" \n [value]=\"mode === 'edit' ? filterName : viewFilterName\"\n [labelFont]=\"question.font\" \n [label]=\"removeCharacters(question?.questionText)\" \n [labelColor]=\"question.fontColor\"\n [labelSize]=\"question.fontSize\" \n [inputValueSize]=\"question.fontSize\" \n [labelWeight]=\"question.fontWeight\"\n [inputWeight]=\"question.fontWeight\" \n [showLabel]=\"question.style?.showLabel\" \n inputBorder=\"none\" \n svgHeight=\"20px\"\n svgWidth=\"20px\" \n [placeholder]=\"placeHolderText\" \n [required]=\"question.isOptional\" \n inputBgColor=\"#FAFAFA\"\n [inputId]=\"question.trackingId\" \n [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"question.iconLeftSrc\" \n (inputValue)=\"getSourceDataLocal($event); inputValue($event.value, $event.question)\" \n (onFocus)=\"onInputFocus()\"\n (onBlur)=\"onInputBlur()\"\n [showSuggestion]=\"showSuggestion\" \n ariaOwns=\"selectList\" \n ariaHasPopup=\"listbox\" \n [isLoading]=\"isLoading\" \n [question]=\"question\"\n (removeValueEmit)=\"removeValueEmit()\">\n </nxt-input>\n\n <div id=\"selectList\" class=\"suggestion-wrapper\" role=\"listbox\" *ngIf=\"showSuggestion\">\n <div *ngIf=\"finalResults().length > 0\" class=\"suggestions-container\">\n <div *ngFor=\"let item of finalResults(); trackBy: trackByFn\" \n (click)=\"clickItem(item)\" \n class=\"suggestion-item\" \n role=\"option\"\n tabindex=\"0\"\n (keydown.enter)=\"clickItem(item)\"\n (keydown.space)=\"clickItem(item)\">\n <div class=\"item-content\">\n <div class=\"item-details\">\n <div *ngIf=\"item.thumbnail\" class=\"thumbnail-wrapper\">\n <img [src]=\"item.thumbnail\" [alt]=\"item.name + ' avatar'\" />\n </div>\n <div class=\"item-text\">\n <!-- Primary text (first key) -->\n <ng-container *ngIf=\"getKeys(getValues(item, SearchItem)).length > 0\">\n <div class=\"item-name primary\" \n [innerHTML]=\"highlightText(getValues(item, SearchItem)[getKeys(getValues(item, SearchItem))[0]], searchKeyWord)\">\n </div>\n </ng-container>\n \n <!-- Secondary text (remaining keys) -->\n <div class=\"item-secondary\" *ngIf=\"getKeys(getValues(item, SearchItem)).length > 1\">\n <ng-container *ngFor=\"let key of getKeys(getValues(item, SearchItem)); let i = index\">\n <ng-container *ngIf=\"i > 0\">\n <span class=\"secondary-text\" \n [innerHTML]=\"highlightText(getValues(item, SearchItem)[key], searchKeyWord)\">\n </span>\n <span class=\"separator\" *ngIf=\"i < getKeys(getValues(item, SearchItem)).length - 1\"> | </span>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n \n <div *ngIf=\"noResult && searchKeyWord\" class=\"no-results\">\n <div class=\"no-results-content\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <path d=\"m21 21-4.35-4.35\"></path>\n </svg>\n <p>No results found for \"{{searchKeyWord}}\"</p>\n </div>\n </div>\n </div>\n</div>", styles: [".search-wrapper{position:relative;width:100%}.suggestion-wrapper{position:absolute;top:100%;left:0;right:0;background:#fff;border:1px solid #e0e0e0;border-top:none;border-radius:0 0 4px 4px;box-shadow:0 2px 8px #0000001a;z-index:1000;max-height:300px;overflow:hidden}.suggestions-container{max-height:300px;overflow-y:auto;min-width:100%}.suggestion-item{cursor:pointer;border-bottom:1px solid #f0f0f0;transition:background-color .2s ease;outline:none}.suggestion-item:hover,.suggestion-item:focus{background-color:#f5f5f5}.suggestion-item:last-child{border-bottom:none}.item-content{padding:5px}.item-details{display:flex;align-items:flex-start;gap:12px;text-align:left}.thumbnail-wrapper{flex-shrink:0}.thumbnail-wrapper img{width:40px;height:40px;border-radius:50%;object-fit:cover;border:1px solid #e0e0e0}.item-text{flex:1;min-width:0}.item-name{font-size:14px;font-weight:500;color:#333;line-height:1.4;margin-bottom:2px;word-wrap:break-word;overflow-wrap:break-word}.item-secondary{font-size:12px;color:#666;line-height:1.3;display:flex}.secondary-text{display:inline}.separator{color:#999;margin:0 3px}.no-results{padding:20px;text-align:center;color:#666}.no-results-content{display:flex;align-items:center;justify-content:center;gap:8px;flex-direction:column}.no-results-content svg{color:#d1d5db;margin-bottom:8px}.no-results-content p{color:#6b7280;margin:0;font-size:14px;font-weight:500}:host ::ng-deep .highlight{font-weight:700;display:inline}.suggestions-container::-webkit-scrollbar{width:6px}.suggestions-container::-webkit-scrollbar-track{background:#f1f1f1}.suggestions-container::-webkit-scrollbar-thumb{background:#c1c1c1;border-radius:3px}.suggestions-container::-webkit-scrollbar-thumb:hover{background:#a8a8a8}@media (max-width: 768px){.suggestion-wrapper,.suggestions-container{max-height:250px}.item-content{padding:10px 12px}.item-details{gap:8px}.thumbnail-wrapper img{width:32px;height:32px}.item-name{font-size:13px}.item-secondary{font-size:11px}}\n"] }]
391
- }], ctorParameters: () => [{ type: i1.DataService }, { type: i2.I18nService }, { type: i3.CountryService }, { type: i0.ElementRef }], propDecorators: { placeHolderText: [{
392
- type: Input
393
- }], question: [{
394
- type: Input
395
- }], apiMeta: [{
396
- type: Input
397
- }], id: [{
398
- type: Input
399
- }], readOnly: [{
400
- type: Input
401
- }], mode: [{
402
- type: Input
403
- }], searchValueChange: [{
404
- type: Output
405
- }], searchWrapper: [{
406
- type: ViewChild,
407
- args: ['searchWrapper', { static: true }]
408
- }], onDocumentClick: [{
409
- type: HostListener,
410
- args: ['document:click', ['$event']]
411
- }], onEscapeKey: [{
412
- type: HostListener,
413
- args: ['document:keydown.escape', ['$event']]
414
- }] } });
415
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvY29tcG9uZW50cy9zZWFyY2gtYm94L3NlYXJjaC1ib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvc2VhcmNoLWJveC9zZWFyY2gtYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWdDLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBNkIsTUFBTSxFQUFtQyxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFak0sT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRTVELE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7O0FBYTlFLE1BQU0sT0FBTyxZQUFZO0lBa0NIO0lBQWlDO0lBQWtDO0lBQXdDO0lBakN0SCxlQUFlLEdBQVcsRUFBRSxDQUFDO0lBQzdCLFFBQVEsQ0FBTTtJQUNkLE9BQU8sQ0FBTTtJQUNiLEVBQUUsR0FBVyxFQUFFLENBQUM7SUFDaEIsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixJQUFJLEdBQThCLE1BQU0sQ0FBQztJQUV4QyxpQkFBaUIsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUMzQixhQUFhLENBQWM7SUFFekUsVUFBVSxDQUFNO0lBQ1QsWUFBWSxHQUEwQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakQsYUFBYSxHQUFXLEVBQUUsQ0FBQztJQUMzQixTQUFTLENBQU07SUFDZixVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQ25CLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakIsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUN2QixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLGNBQWMsR0FBVyxFQUFFLENBQUM7SUFDNUIsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBQzVCLFFBQVEsQ0FBTTtJQUNkLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDckIsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLFVBQVUsR0FBRSxFQUFFLENBQUE7SUFFYixRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUMvQixhQUFhLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztJQUU5QyxnREFBZ0Q7SUFDaEQsU0FBUyxHQUF5QixDQUFDLEtBQWEsRUFBRSxJQUFTLEVBQUUsRUFBRTtRQUM3RCxPQUFPLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUM7SUFDdkMsQ0FBQyxDQUFDO0lBRUYsWUFBb0IsV0FBd0IsRUFBUyxXQUF3QixFQUFVLGNBQThCLEVBQVUsVUFBc0I7UUFBakksZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBUyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUFVLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDbkosSUFBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBQyxDQUFDO1lBQzNHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUN0QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUE7UUFDeEMsQ0FBQztRQUNELHlCQUF5QjtRQUN6QixJQUFJLENBQUMsYUFBYTthQUNmLElBQUksQ0FDSCxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQ2pCLG9CQUFvQixFQUFFLEVBQ3RCLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ3pCO2FBQ0EsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ25CLElBQUcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUM7Z0JBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBQyxDQUFDO1lBQzNHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUN0QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUE7UUFDeEMsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQzNDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUM5RSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsYUFBYSxDQUFDO1lBQ3JELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxZQUFZLENBQUM7WUFDbkQsSUFBSSxRQUFRLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELDZDQUE2QztJQUU3QyxlQUFlLENBQUMsS0FBWTtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFjLENBQUMsRUFBRSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVELHlDQUF5QztJQUV6QyxXQUFXLENBQUMsS0FBb0I7UUFDOUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxZQUFZO1FBQ2xCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDO1lBQ2xHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzdDLENBQUM7SUFDSCxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDNUIsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QiwwREFBMEQ7UUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsMkRBQTJEO1FBQzNELGdEQUFnRDtJQUNsRCxDQUFDO0lBRUQsU0FBUztRQUNQLHNEQUFzRDtRQUN0RCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELGtCQUFrQixDQUFDLEtBQVU7UUFDM0IsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2RyxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBRXpDLG1DQUFtQztRQUNuQyxJQUFJLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQztRQUVqQyxpREFBaUQ7UUFDakQsSUFBSSxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUM7WUFDekQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDdEIsbURBQW1EO1lBQ25ELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxhQUFhLENBQUM7WUFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFdkMsQ0FBQzthQUFNLElBQUksYUFBYSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzlCLHlFQUF5RTtZQUN6RSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1lBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxhQUFhLENBQUM7WUFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFTyxhQUFhLENBQUMsT0FBZTtRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBRTFCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLENBQUM7SUFDSCxDQUFDO0lBRU8sYUFBYSxDQUFDLE9BQWU7UUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDekMsbUNBQW1DO1FBQ25DLDJEQUEyRDtRQUMzRCxrR0FBa0c7UUFDbEcsK0JBQStCO1FBQy9CLDZCQUE2QjtRQUM3QixvREFBb0Q7UUFDcEQsZ0JBQWdCO1FBQ2hCLGdEQUFnRDtRQUNoRCw2Q0FBNkM7UUFDN0MsdUNBQXVDO1FBQ3ZDLFdBQVc7UUFDWCx1Q0FBdUM7UUFDdkMsSUFBSTtRQUVKLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQzthQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QixTQUFTLENBQUM7WUFDVCxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDbEQsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNmLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUIsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxPQUFlO1FBQzFDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRU8sb0JBQW9CLENBQUMsV0FBZ0IsRUFBRSxPQUFlO1FBQzVELElBQUksUUFBUSxDQUFDO1FBRWIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzFCLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzRSxDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVEsR0FBRyxXQUFXLENBQUM7UUFDekIsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixrQ0FBa0M7WUFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxDQUFDLGlDQUFpQztRQUMvRCxDQUFDO2FBQU0sQ0FBQztZQUNOLHNDQUFzQztZQUN0QyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDckYsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDcEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNsRixPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbEUsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyw2Q0FBNkM7UUFDekYsQ0FBQztJQUNILENBQUM7SUFFTyxjQUFjLENBQUMsR0FBUSxFQUFFLElBQVk7UUFDM0MsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUU3QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4RCxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUVsQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUTtnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUN2RCxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFFRCxPQUFPLE9BQU8sS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLFNBQVM7WUFDOUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUU7WUFDdEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNULENBQUM7SUFFTyw0QkFBNEIsQ0FBQyxHQUFRLEVBQUUsT0FBaUI7UUFDOUQsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUVoQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakUsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO1FBRTVCLEtBQUssTUFBTSxNQUFNLElBQUksV0FBVyxFQUFFLENBQUM7WUFDakMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDL0MsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFTSxTQUFTLENBQUMsT0FBWSxFQUFFLE9BQVk7UUFDekMsTUFBTSxNQUFNLEdBQVEsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFFeEMsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWpFLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUM3QixJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPO1lBRXBCLElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQztZQUMxQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWpDLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxXQUFXO29CQUFFLE1BQU07Z0JBRXhCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDN0IsV0FBVyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3BELElBQUksVUFBVSxFQUFFLENBQUM7d0JBQ2YsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNwQyxXQUFXLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3JELENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsV0FBVyxJQUFJLEVBQUUsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBUTtRQUNkLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVNLFNBQVMsQ0FBQyxLQUFVO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFFMUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXBCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0RCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQzthQUN2QyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7YUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWYsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsWUFBWSxDQUFDO1FBQ3JDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFcEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZO1lBQzVDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXZGLE1BQU0sTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFDbkMsTUFBTSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO1FBRTVCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBRXRCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDO1lBQzFCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixLQUFLLEVBQUUsTUFBTTtTQUNkLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxZQUFvQjtRQUNuQyxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzdCLE9BQU8sWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFVLEVBQUUsSUFBUztRQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUM5QixJQUFJLENBQUMsSUFBSSxFQUFFLGlCQUFpQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBRXRELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXBCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWTtZQUM1QyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV2RixNQUFNLE1BQU0sR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNoQyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDaEMsTUFBTSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUM7UUFDNUIsTUFBTSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztRQUVyRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFFdEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQztZQUMxQixRQUFRLEVBQUUsSUFBSTtZQUNkLEtBQUssRUFBRSxNQUFNO1NBQ2QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFZLEVBQUUsVUFBa0I7UUFDNUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7UUFFNUMsMEJBQTBCO1FBQzFCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRWxGLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxhQUFhLENBQUM7UUFFN0Msa0NBQWtDO1FBQ2xDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FDNUMsQ0FBQztRQUVGLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlELE9BQU8sYUFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRU8sWUFBWSxDQUFDLElBQVk7UUFDL0IsT0FBTyxJQUFJO2FBQ1IsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7YUFDdEIsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7YUFDckIsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7YUFDckIsT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUM7YUFDdkIsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQ0QsZUFBZTtRQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDdEIsQ0FBQzt3R0FqYVUsWUFBWTs0RkFBWixZQUFZLGtoQkNyQnpCLG1vSEFtRk0sdS9ERHJFRixZQUFZLCtQQUNaLFdBQVcsK0JBQ1gsUUFBUTs7NEZBS0MsWUFBWTtrQkFYeEIsU0FBUzsrQkFDRSxnQkFBZ0IsY0FDZCxJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLFFBQVE7cUJBQ1Q7Z0tBS1EsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUksaUJBQWlCO3NCQUExQixNQUFNO2dCQUN1QyxhQUFhO3NCQUExRCxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBNEU1QyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBUzFDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyx5QkFBeUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIFNpbXBsZUNoYW5nZXMsIHNpZ25hbCwgV3JpdGFibGVTaWduYWwsIFRyYWNrQnlGdW5jdGlvbiwgSG9zdExpc3RlbmVyfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhbmdlV3JhcHBlciB9IGZyb20gXCIuLi8uLi9tb2RlbC9jaGFuZ2VXcmFwcGVyXCI7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gXCIuLi8uLi9pMThuLnNlcnZpY2VcIjtcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBOeHRJbnB1dCB9IGZyb20gXCIuLi9ueHQtaW5wdXQvbnh0LWlucHV0LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQ291bnRyeVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvY291bnRyeS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBTdWJqZWN0LCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCB0YWtlVW50aWwgfSBmcm9tIFwicnhqc1wiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdueHQtc2VhcmNoLWJveCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTnh0SW5wdXRcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlYXJjaC1ib3guY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zZWFyY2gtYm94LmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOeHRTZWFyY2hCb3ggaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQElucHV0KCkgcGxhY2VIb2xkZXJUZXh0OiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgcXVlc3Rpb246IGFueTtcbiAgQElucHV0KCkgYXBpTWV0YTogYW55O1xuICBASW5wdXQoKSBpZDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHJlYWRPbmx5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1vZGU6ICd2aWV3JyB8ICdlZGl0JyB8ICdwcmludCcgPSAnZWRpdCc7XG4gIFxuICBAT3V0cHV0KCkgc2VhcmNoVmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaFdyYXBwZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBzZWFyY2hXcmFwcGVyITogRWxlbWVudFJlZjtcblxuICBTZWFyY2hJdGVtOiBhbnk7XG4gIHB1YmxpYyBmaW5hbFJlc3VsdHM6IFdyaXRhYmxlU2lnbmFsPGFueVtdPiA9IHNpZ25hbChbXSk7XG4gIHB1YmxpYyBzZWFyY2hLZXlXb3JkOiBzdHJpbmcgPSAnJztcbiAgcHVibGljIG5ld1Jlc3VsdDogYW55O1xuICBwdWJsaWMgc2hvd1Jlc3VsdCA9IGZhbHNlO1xuICBwdWJsaWMgbm9SZXN1bHQgPSBmYWxzZTtcbiAgcHVibGljIHNob3dTdWdnZXN0aW9uID0gZmFsc2U7XG4gIHB1YmxpYyBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgcHVibGljIHZpZXdGaWx0ZXJOYW1lOiBzdHJpbmcgPSAnJztcbiAgcHVibGljIGlzU2luZ2xlRmllbGRDaGFuZ2UgPSBmYWxzZTtcbiAgcHVibGljIHZhbHVlT2JqOiBhbnk7XG4gIHB1YmxpYyBpbnB1dEZvY3VzZWQgPSBmYWxzZTtcbiAgcHVibGljIGxhc3RTZWFyY2hMZW5ndGggPSAwO1xuICBwdWJsaWMgZmlsdGVyTmFtZSA9JydcblxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBzZWFyY2hTdWJqZWN0ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIC8vIFRyYWNrQnkgZnVuY3Rpb24gZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxuICB0cmFja0J5Rm46IFRyYWNrQnlGdW5jdGlvbjxhbnk+ID0gKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkgPT4ge1xuICAgIHJldHVybiBpdGVtLmlkIHx8IGl0ZW0ubmFtZSB8fCBpbmRleDtcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZSwgcHVibGljIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSwgcHJpdmF0ZSBjb3VudHJ5U2VydmljZTogQ291bnRyeVNlcnZpY2UsIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xuICAgIGlmKHRoaXMucXVlc3Rpb24/LmlucHV0ICYmIHR5cGVvZiB0aGlzLnF1ZXN0aW9uPy5pbnB1dCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodGhpcy5xdWVzdGlvbj8uaW5wdXQpKXtcbiAgICAgIHRoaXMuY2xpY2tJdGVtKHRoaXMucXVlc3Rpb24/LmlucHV0KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbHRlck5hbWUgPSB0aGlzLnF1ZXN0aW9uPy5pbnB1dFxuICAgIH0gICAgXG4gICAgLy8gU2V0dXAgZGVib3VuY2VkIHNlYXJjaFxuICAgIHRoaXMuc2VhcmNoU3ViamVjdFxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoa2V5d29yZCA9PiB7XG4gICAgICAgIGlmKHRoaXMubGFzdFNlYXJjaExlbmd0aCA+IDIpIHRoaXMucGVyZm9ybVNlYXJjaChrZXl3b3JkKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYodGhpcy5xdWVzdGlvbj8uaW5wdXQgJiYgdHlwZW9mIHRoaXMucXVlc3Rpb24/LmlucHV0ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh0aGlzLnF1ZXN0aW9uPy5pbnB1dCkpe1xuICAgICAgdGhpcy5jbGlja0l0ZW0odGhpcy5xdWVzdGlvbj8uaW5wdXQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsdGVyTmFtZSA9IHRoaXMucXVlc3Rpb24/LmlucHV0XG4gICAgfVxuICAgIHRoaXMucGFyc2VBcGlNZXRhKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ21vZGUnXSkge1xuICAgICAgdGhpcy5tb2RlID0gY2hhbmdlc1snbW9kZSddLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMubW9kZSAhPT0gJ2VkaXQnICYmIHRoaXMuaXNTaW5nbGVGaWVsZENoYW5nZSAmJiBjaGFuZ2VzWydmaWx0ZXJOYW1lJ10pIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gY2hhbmdlc1snZmlsdGVyTmFtZSddLnByZXZpb3VzVmFsdWU7XG4gICAgICBjb25zdCBjdXJyZW50ID0gY2hhbmdlc1snZmlsdGVyTmFtZSddLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGlmIChwcmV2aW91cyAhPT0gY3VycmVudCkge1xuICAgICAgICB0aGlzLmZpbHRlck5hbWUgPSBwcmV2aW91cztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2FwaU1ldGEnXSAmJiB0aGlzLmFwaU1ldGEpIHtcbiAgICAgIHRoaXMucGFyc2VBcGlNZXRhKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIHRoaXMucmVzZXRDb21wb25lbnRTdGF0ZSgpO1xuICB9XG5cbiAgLy8gSGFuZGxlIGNsaWNrcyBvdXRzaWRlIHRoZSBzZWFyY2ggY29tcG9uZW50XG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICB0aGlzLmhpZGVTdWdnZXN0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBlc2NhcGUga2V5IHRvIGNsb3NlIHN1Z2dlc3Rpb25zXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJywgWyckZXZlbnQnXSlcbiAgb25Fc2NhcGVLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmhpZGVTdWdnZXN0aW9ucygpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUFwaU1ldGEoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXBpTWV0YSkge1xuICAgICAgdGhpcy5hcGlNZXRhID0gdHlwZW9mIHRoaXMuYXBpTWV0YSA9PT0gJ29iamVjdCcgPyB0aGlzLmFwaU1ldGEgOiBKU09OLnBhcnNlKHRoaXMuYXBpTWV0YSB8fCAne30nKTtcbiAgICAgIHRoaXMuU2VhcmNoSXRlbSA9IHRoaXMuYXBpTWV0YS5maWVsZCB8fCBbXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0Q29tcG9uZW50U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5maW5hbFJlc3VsdHMuc2V0KFtdKTtcbiAgICB0aGlzLnNlYXJjaEtleVdvcmQgPSAnJztcbiAgICB0aGlzLnNob3dTdWdnZXN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5ub1Jlc3VsdCA9IGZhbHNlO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5pbnB1dEZvY3VzZWQgPSBmYWxzZTtcbiAgICB0aGlzLmxhc3RTZWFyY2hMZW5ndGggPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBoaWRlU3VnZ2VzdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93U3VnZ2VzdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuaW5wdXRGb2N1c2VkID0gZmFsc2U7XG4gIH1cblxuICBvbklucHV0Rm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dEZvY3VzZWQgPSB0cnVlO1xuICAgIC8vIFRyaWdnZXIgYSBzZWFyY2ggd2l0aCBhbiBlbXB0eSBrZXl3b3JkIHRvIHNob3cgYWxsIGRhdGFcbiAgICBpZiAoIXRoaXMuc2VhcmNoS2V5V29yZCkge1xuICAgICAgdGhpcy5wZXJmb3JtU2VhcmNoKCcnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZmluYWxSZXN1bHRzKCkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zaG93U3VnZ2VzdGlvbiA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgb25JbnB1dEJsdXIoKTogdm9pZCB7XG4gICAgLy8gRG9uJ3QgaW1tZWRpYXRlbHkgaGlkZSBzdWdnZXN0aW9ucyB0byBhbGxvdyBmb3IgY2xpY2tpbmdcbiAgICAvLyBUaGUgZG9jdW1lbnQgY2xpY2sgaGFuZGxlciB3aWxsIGhhbmRsZSBoaWRpbmdcbiAgfVxuXG4gIGNsZWFyTGlzdCgpOiB2b2lkIHtcbiAgICAvLyBSZW1vdmUgdGhlIHNldFRpbWVvdXQgZGVsYXkgdGhhdCB3YXMgY2F1c2luZyBpc3N1ZXNcbiAgICB0aGlzLmhpZGVTdWdnZXN0aW9ucygpO1xuICB9XG5cbiAgZ2V0U291cmNlRGF0YUxvY2FsKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWV2ZW50Py52YWx1ZSkge1xuICAgICAgdGhpcy5yZXNldENvbXBvbmVudFN0YXRlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoVmFsdWUgPSAgZXZlbnQudmFsdWUuaW5jbHVkZXMoJ3wnKSA/IGV2ZW50LnZhbHVlLnNwbGl0KCd8JylbMF0udHJpbSgpIDogZXZlbnQudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IGN1cnJlbnRMZW5ndGggPSBzZWFyY2hWYWx1ZS5sZW5ndGg7XG4gICAgXG4gICAgLy8gQWx3YXlzIHVwZGF0ZSB0aGUgc2VhcmNoIGtleXdvcmRcbiAgICB0aGlzLnNlYXJjaEtleVdvcmQgPSBzZWFyY2hWYWx1ZTtcbiAgICBcbiAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdXNlciB0eXBlcyAzKyBjaGFyYWN0ZXJzXG4gICAgaWYgKGN1cnJlbnRMZW5ndGggPiAyICYmICF0aGlzLmlzU2luZ2xlRmllbGRDaGFuZ2UpIHtcbiAgICAgIHRoaXMuc2hvd1N1Z2dlc3Rpb24gPSAhZXZlbnQucXVlc3Rpb24/LnNpbmdsZUZpZWxkQ2hhbmdlO1xuICAgICAgdGhpcy5zaG93UmVzdWx0ID0gZmFsc2U7XG4gICAgICB0aGlzLm5vUmVzdWx0ID0gZmFsc2U7XG4gICAgICAvLyBBbHdheXMgcGVyZm9ybSBzZWFyY2ggd2hlbiB3ZSBoYXZlIDMrIGNoYXJhY3RlcnNcbiAgICAgIHRoaXMubGFzdFNlYXJjaExlbmd0aCA9IGN1cnJlbnRMZW5ndGg7XG4gICAgICB0aGlzLnNlYXJjaFN1YmplY3QubmV4dChzZWFyY2hWYWx1ZSk7XG4gICAgICBcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRMZW5ndGggPD0gMikge1xuICAgICAgLy8gV2hlbiBsZW5ndGggaXMgMiBvciBsZXNzLCBoaWRlIHN1Z2dlc3Rpb25zIGJ1dCBrZWVwIHRoZSBzZWFyY2gga2V5d29yZFxuICAgICAgdGhpcy5pc1NpbmdsZUZpZWxkQ2hhbmdlID0gZmFsc2U7XG4gICAgICB0aGlzLnNob3dTdWdnZXN0aW9uID0gZmFsc2U7XG4gICAgICB0aGlzLm5vUmVzdWx0ID0gZmFsc2U7XG4gICAgICB0aGlzLmxhc3RTZWFyY2hMZW5ndGggPSBjdXJyZW50TGVuZ3RoO1xuICAgICAgdGhpcy5zZWFyY2hTdWJqZWN0Lm5leHQoc2VhcmNoVmFsdWUpO1xuICAgICAgdGhpcy5maW5hbFJlc3VsdHMuc2V0KFtdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBlcmZvcm1TZWFyY2goa2V5d29yZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFwaU1ldGEpIHJldHVybjtcblxuICAgIHRoaXMucGFyc2VBcGlNZXRhKCk7XG4gICAgXG4gICAgaWYgKCF0aGlzLmFwaU1ldGEuaXNTdGF0aWNEYXRhKSB7XG4gICAgICB0aGlzLnNlYXJjaEZyb21BcGkoa2V5d29yZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VhcmNoRnJvbVN0YXRpY0RhdGEoa2V5d29yZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZWFyY2hGcm9tQXBpKGtleXdvcmQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmZpbmFsUmVzdWx0cy5zZXQoW10pO1xuICAgIGxldCBmaW5hbEdldENhbGwgPSB0aGlzLmFwaU1ldGEuZW5kcG9pbnQ7XG4gICAgLy8gU0tTMThKVUwyNSBxdWVyeSBwYXJhbXMgY3JlYXRpb25cbiAgICAvLyBjb25zdCBpc0ZpZWxkQXJyYXkgPSBBcnJheS5pc0FycmF5KHRoaXMuYXBpTWV0YT8uZmllbGQpO1xuICAgIC8vIGNvbnN0IGZpZWxkcyA9IGlzRmllbGRBcnJheSA/IHRoaXMuYXBpTWV0YS5maWVsZCA6IFt0aGlzLmFwaU1ldGEuZmllbGRdOyAvLyBhbHdheXMgYW4gYXJyYXkgbm93XG4gICAgLy8gLy8gQnVpbGQgcXVlcnkgcGFyYW1zIHN0cmluZ1xuICAgIC8vIGNvbnN0IHF1ZXJ5UGFyYW1zID0gZmllbGRzXG4gICAgLy8gICAubWFwKGZpZWxkID0+IGAke2ZpZWxkfT0ke3RoaXMuc2VhcmNoS2V5V29yZH1gKVxuICAgIC8vICAgLmpvaW4oJyYnKTtcbiAgICAvLyAvLyBDaGVjayBpZiBlbmRwb2ludCBhbHJlYWR5IGhhcyBxdWVyeSBwYXJhbXNcbiAgICAvLyBpZiAodGhpcy5hcGlNZXRhLmVuZHBvaW50LmluY2x1ZGVzKCc/JykpIHtcbiAgICAvLyAgIGZpbmFsR2V0Q2FsbCArPSBgJiR7cXVlcnlQYXJhbXN9YDtcbiAgICAvLyB9IGVsc2Uge1xuICAgIC8vICAgZmluYWxHZXRDYWxsICs9IGA/JHtxdWVyeVBhcmFtc31gO1xuICAgIC8vIH1cblxuICAgIHRoaXMuZGF0YVNlcnZpY2UuYXBpUmVzcG9uc2UoZmluYWxHZXRDYWxsKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChhcGlSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzU2VhcmNoUmVzdWx0cyhhcGlSZXNwb25zZSwga2V5d29yZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMubm9SZXN1bHQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuZmluYWxSZXN1bHRzLnNldChbXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWFyY2hGcm9tU3RhdGljRGF0YShrZXl3b3JkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuY291bnRyeVNlcnZpY2UuZ2V0Q291bnRyeURhdGEodGhpcy5hcGlNZXRhLmZpZWxkKTtcbiAgICB0aGlzLnByb2Nlc3NTZWFyY2hSZXN1bHRzKHJlc3BvbnNlLCBrZXl3b3JkKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc1NlYXJjaFJlc3VsdHMoYXBpUmVzcG9uc2U6IGFueSwga2V5d29yZDogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IHJlc3BvbnNlO1xuICBcbiAgICBpZiAodGhpcy5hcGlNZXRhLnZhcmlhYmxlKSB7XG4gICAgICByZXNwb25zZSA9IHRoaXMuZGF0YVNlcnZpY2UuZ2V0VmFsdWUoYXBpUmVzcG9uc2UsIHRoaXMuYXBpTWV0YS52YXJpYWJsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3BvbnNlID0gYXBpUmVzcG9uc2U7XG4gICAgfVxuICBcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVzcG9uc2UpKSB7XG4gICAgICB0aGlzLm5vUmVzdWx0ID0gdHJ1ZTtcbiAgICAgIHRoaXMuZmluYWxSZXN1bHRzLnNldChbXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICBcbiAgICBpZiAoIWtleXdvcmQpIHtcbiAgICAgIC8vIElmIG5vIGtleXdvcmQsIHNob3cgYWxsIHJlc3VsdHNcbiAgICAgIHRoaXMuZmluYWxSZXN1bHRzLnNldChyZXNwb25zZSk7XG4gICAgICB0aGlzLm5vUmVzdWx0ID0gcmVzcG9uc2UubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5zaG93U3VnZ2VzdGlvbiA9IHRydWU7IC8vIEVuc3VyZSBzdWdnZXN0aW9ucyBhcmUgdmlzaWJsZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaWx0ZXIgcmVzdWx0cyBiYXNlZCBvbiB0aGUga2V5d29yZFxuICAgICAgY29uc3Qgc2VhcmNoVGVybXMgPSBrZXl3b3JkLnRvTG93ZXJDYXNlKCkuc3BsaXQoXCIgXCIpLmZpbHRlcih0ZXJtID0+IHRlcm0ubGVuZ3RoID4gMCk7XG4gICAgICBjb25zdCByZXN1bHRzID0gcmVzcG9uc2UuZmlsdGVyKG9iaiA9PiB7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkVmFsdWVzID0gdGhpcy5nZXRDb21iaW5lZFZhbHVlc0Zyb21Db2x1bW5zKG9iaiwgdGhpcy5hcGlNZXRhLmZpZWxkKTtcbiAgICAgICAgcmV0dXJuIHNlYXJjaFRlcm1zLmV2ZXJ5KHRlcm0gPT4gY29tYmluZWRWYWx1ZXMuaW5jbHVkZXModGVybSkpO1xuICAgICAgfSk7XG4gIFxuICAgICAgdGhpcy5ub1Jlc3VsdCA9IHJlc3VsdHMubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5maW5hbFJlc3VsdHMuc2V0KHJlc3VsdHMpO1xuICAgICAgdGhpcy5zaG93U3VnZ2VzdGlvbiA9IHJlc3VsdHMubGVuZ3RoID4gMDsgLy8gU2hvdyBzdWdnZXN0aW9ucyBvbmx5IGlmIHRoZXJlIGFyZSByZXN1bHRzXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXROZXN0ZWRWYWx1ZShvYmo6IGFueSwgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIW9iaiB8fCAhcGF0aCkgcmV0dXJuICcnO1xuICAgIFxuICAgIGNvbnN0IHByb2Nlc3NlZFBhdGggPSBwYXRoLnJlcGxhY2UoL1xcWyhcXGQrKVxcXS9nLCAnLiQxJyk7XG4gICAgY29uc3QgcGFydHMgPSBwcm9jZXNzZWRQYXRoLnNwbGl0KCcuJyk7XG4gICAgbGV0IGN1cnJlbnQgPSBvYmo7XG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgIGlmICghY3VycmVudCB8fCB0eXBlb2YgY3VycmVudCAhPT0gJ29iamVjdCcpIHJldHVybiAnJztcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRdO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQgIT09IHVuZGVmaW5lZCBcbiAgICAgID8gU3RyaW5nKGN1cnJlbnQpLnRvTG93ZXJDYXNlKCkudHJpbSgpIFxuICAgICAgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29tYmluZWRWYWx1ZXNGcm9tQ29sdW1ucyhvYmo6IGFueSwgY29sdW1uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGlmICghb2JqIHx8ICFjb2x1bW5zKSByZXR1cm4gJyc7XG4gICAgXG4gICAgY29uc3QgY29sdW1uQXJyYXkgPSBBcnJheS5pc0FycmF5KGNvbHVtbnMpID8gY29sdW1ucyA6IFtjb2x1bW5zXTtcbiAgICBjb25zdCB2YWx1ZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5BcnJheSkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldE5lc3RlZFZhbHVlKG9iaiwgY29sdW1uKTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlcy5qb2luKCcgJyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmFsdWVzKGVsZW1lbnQ6IGFueSwgY29sdW1uczogYW55KTogYW55IHtcbiAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICghZWxlbWVudCB8fCAhY29sdW1ucykgcmV0dXJuIHJlc3VsdDtcblxuICAgIGNvbnN0IGNvbHVtbkFycmF5ID0gQXJyYXkuaXNBcnJheShjb2x1bW5zKSA/IGNvbHVtbnMgOiBbY29sdW1uc107XG4gICAgXG4gICAgY29sdW1uQXJyYXkuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICBpZiAoIWNvbHVtbikgcmV0dXJuO1xuICAgICAgXG4gICAgICBsZXQgdGVtcEVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgY29uc3QgZmllbGRzID0gY29sdW1uLnNwbGl0KCcuJyk7XG4gICAgICBcbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICAgIGlmICghdGVtcEVsZW1lbnQpIGJyZWFrO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgc3BsaXRGaWVsZHMgPSBmaWVsZC5zcGxpdCgnWycpO1xuICAgICAgICBpZiAoc3BsaXRGaWVsZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgdGVtcEVsZW1lbnQgPSB0ZW1wRWxlbWVudFtmaWVsZF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaW5kZXhNYXRjaCA9IHNwbGl0RmllbGRzWzFdPy5tYXRjaCgvKFxcZCspXFxdLyk7XG4gICAgICAgICAgaWYgKGluZGV4TWF0Y2gpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKGluZGV4TWF0Y2hbMV0pO1xuICAgICAgICAgICAgdGVtcEVsZW1lbnQgPSB0ZW1wRWxlbWVudFtzcGxpdEZpZWxkc1swXV0/LltpbmRleF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJlc3VsdFtjb2x1bW5dID0gdGVtcEVsZW1lbnQgfHwgJyc7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZ2V0S2V5cyhvYmo6IGFueSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gb2JqID8gT2JqZWN0LmtleXMob2JqKSA6IFtdO1xuICB9XG5cbiAgcHVibGljIGNsaWNrSXRlbShldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFwaU1ldGEpIHJldHVybjtcbiAgXG4gICAgdGhpcy5wYXJzZUFwaU1ldGEoKTtcbiAgICBcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhbHVlcyhldmVudCwgdGhpcy5TZWFyY2hJdGVtKTtcbiAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSBPYmplY3QudmFsdWVzKHZhbHVlcylcbiAgICAgIC5maWx0ZXIodmFsID0+IHZhbClcbiAgICAgIC5qb2luKCcgfCAnKTtcbiAgICBcbiAgICBpZiAodGhpcy5tb2RlICE9PSAnZWRpdCcpIHtcbiAgICAgIHRoaXMudmlld0ZpbHRlck5hbWUgPSBkaXNwbGF5VmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsdGVyTmFtZSA9IGRpc3BsYXlWYWx1ZTtcbiAgICB9XG4gICAgdGhpcy5uZ09uQ2hhbmdlcyh7fSlcbiAgXG4gICAgY29uc3QgZGVmYXVsdEZpZWxkID0gdGhpcy5hcGlNZXRhLmRlZmF1bHRGaWVsZCB8fCBcbiAgICAgIChBcnJheS5pc0FycmF5KHRoaXMuYXBpTWV0YT8uZmllbGQpID8gdGhpcy5hcGlNZXRhPy5maWVsZD8uWzBdIDogdGhpcy5hcGlNZXRhLmZpZWxkKTtcbiAgICBcbiAgICBjb25zdCBjaGFuZ2UgPSBuZXcgQ2hhbmdlV3JhcHBlcigpO1xuICAgIGNoYW5nZS5mcm9tUXVlc3Rpb25JZCA9IHRoaXMuaWQ7XG4gICAgY2hhbmdlLnZhbHVlT2JqID0gZXZlbnQ7XG4gICAgY2hhbmdlLmZpZWxkID0gZGVmYXVsdEZpZWxkO1xuICAgIFxuICAgIHRoaXMudmFsdWVPYmogPSBldmVudDtcbiAgICBcbiAgICB0aGlzLmhpZGVTdWdnZXN0aW9ucygpO1xuICAgIFxuICAgIHRoaXMuc2VhcmNoVmFsdWVDaGFuZ2UuZW1pdCh7XG4gICAgICBxdWVzdGlvbjogdGhpcy5xdWVzdGlvbixcbiAgICAgIHZhbHVlOiBjaGFuZ2VcbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZUNoYXJhY3RlcnMocXVlc3Rpb25UZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghcXVlc3Rpb25UZXh0KSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIHF1ZXN0aW9uVGV4dC5yZXBsYWNlKC88W14+XSo+L2csICcnKTtcbiAgfVxuXG4gIGlucHV0VmFsdWUoZXZlbnQ6IGFueSwgcXVlczogYW55KTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJOYW1lID0gZXZlbnQudHJpbSgpXG4gICAgaWYgKCFxdWVzPy5zaW5nbGVGaWVsZENoYW5nZSB8fCAhdGhpcy5hcGlNZXRhKSByZXR1cm47XG5cbiAgICB0aGlzLmlzU2luZ2xlRmllbGRDaGFuZ2UgPSB0cnVlO1xuICAgIHRoaXMucGFyc2VBcGlNZXRhKCk7XG5cbiAgICBjb25zdCBkZWZhdWx0RmllbGQgPSB0aGlzLmFwaU1ldGEuZGVmYXVsdEZpZWxkIHx8IFxuICAgICAgKEFycmF5LmlzQXJyYXkodGhpcy5hcGlNZXRhPy5maWVsZCkgPyB0aGlzLmFwaU1ldGE/LmZpZWxkPy5bMF0gOiB0aGlzLmFwaU1ldGEuZmllbGQpO1xuXG4gICAgY29uc3QgY2hhbmdlID0gbmV3IENoYW5nZVdyYXBwZXIoKTtcbiAgICBjaGFuZ2UuZnJvbVF1ZXN0aW9uSWQgPSB0aGlzLmlkO1xuICAgIGNoYW5nZS52YWx1ZU9iaiA9IHRoaXMudmFsdWVPYmo7XG4gICAgY2hhbmdlLmZpZWxkID0gZGVmYXVsdEZpZWxkO1xuICAgIGNoYW5nZS5yZWZlcmVuY2VGaWVsZCA9IHRoaXMucXVlc3Rpb24ucmVmZXJlbmNlRmllbGQ7XG4gICAgXG4gICAgdGhpcy5maWx0ZXJOYW1lID0gdGhpcy52aWV3RmlsdGVyTmFtZTtcbiAgICBcbiAgICB0aGlzLnNlYXJjaFZhbHVlQ2hhbmdlLmVtaXQoe1xuICAgICAgcXVlc3Rpb246IHF1ZXMsXG4gICAgICB2YWx1ZTogY2hhbmdlXG4gICAgfSk7XG4gIH1cblxuICBoaWdobGlnaHRUZXh0KHRleHQ6IHN0cmluZywgc2VhcmNoVGVybTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRleHQgfHwgIXNlYXJjaFRlcm0pIHJldHVybiB0ZXh0IHx8ICcnO1xuXG4gICAgLy8gU2FuaXRpemUgdGhlIGlucHV0IHRleHRcbiAgICBjb25zdCBzYW5pdGl6ZWRUZXh0ID0gdGhpcy5zYW5pdGl6ZUh0bWwodGV4dCk7XG4gICAgY29uc3QgdGVybXMgPSBzZWFyY2hUZXJtLnRvTG93ZXJDYXNlKCkuc3BsaXQoJyAnKS5maWx0ZXIodGVybSA9PiB0ZXJtLmxlbmd0aCA+IDApO1xuICAgIFxuICAgIGlmICh0ZXJtcy5sZW5ndGggPT09IDApIHJldHVybiBzYW5pdGl6ZWRUZXh0O1xuXG4gICAgLy8gRXNjYXBlIHNwZWNpYWwgcmVnZXggY2hhcmFjdGVyc1xuICAgIGNvbnN0IGVzY2FwZWRUZXJtcyA9IHRlcm1zLm1hcCh0ZXJtID0+IFxuICAgICAgdGVybS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpXG4gICAgKTtcblxuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgKCR7ZXNjYXBlZFRlcm1zLmpvaW4oJ3wnKX0pYCwgJ2dpJyk7XG4gICAgcmV0dXJuIHNhbml0aXplZFRleHQucmVwbGFjZShyZWdleCwgJzxzcGFuIGNsYXNzPVwiaGlnaGxpZ2h0XCI+JDE8L3NwYW4+Jyk7XG4gIH1cblxuICBwcml2YXRlIHNhbml0aXplSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0ZXh0XG4gICAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKVxuICAgICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKVxuICAgICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKVxuICAgICAgLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKVxuICAgICAgLnJlcGxhY2UoLycvZywgJyYjMzk7Jyk7XG4gIH1cbiAgcmVtb3ZlVmFsdWVFbWl0KCl7XG4gICAgdGhpcy5jbGlja0l0ZW0obnVsbClcbiAgfVxufSIsIjwhLS0gVkQgMTJKdW4yNCAtIHJlYWRvbmx5IGNoYW5nZSAtLT5cbjxkaXYgY2xhc3M9XCJzZWFyY2gtd3JhcHBlclwiICNzZWFyY2hXcmFwcGVyPlxuICA8bnh0LWlucHV0IFxuICAgIFt0eXBlXT1cIidsaXN0J1wiIFxuICAgIFttb2RlXT1cIm1vZGVcIiBcbiAgICBbdmFsdWVdPVwibW9kZSA9PT0gJ2VkaXQnID8gZmlsdGVyTmFtZSA6IHZpZXdGaWx0ZXJOYW1lXCJcbiAgICBbbGFiZWxGb250XT1cInF1ZXN0aW9uLmZvbnRcIiBcbiAgICBbbGFiZWxdPVwicmVtb3ZlQ2hhcmFjdGVycyhxdWVzdGlvbj8ucXVlc3Rpb25UZXh0KVwiIFxuICAgIFtsYWJlbENvbG9yXT1cInF1ZXN0aW9uLmZvbnRDb2xvclwiXG4gICAgW2xhYmVsU2l6ZV09XCJxdWVzdGlvbi5mb250U2l6ZVwiIFxuICAgIFtpbnB1dFZhbHVlU2l6ZV09XCJxdWVzdGlvbi5mb250U2l6ZVwiIFxuICAgIFtsYWJlbFdlaWdodF09XCJxdWVzdGlvbi5mb250V2VpZ2h0XCJcbiAgICBbaW5wdXRXZWlnaHRdPVwicXVlc3Rpb24uZm9udFdlaWdodFwiIFxuICAgIFtzaG93TGFiZWxdPVwicXVlc3Rpb24uc3R5bGU/LnNob3dMYWJlbFwiIFxuICAgIGlucHV0Qm9yZGVyPVwibm9uZVwiIFxuICAgIHN2Z0hlaWdodD1cIjIwcHhcIlxuICAgIHN2Z1dpZHRoPVwiMjBweFwiIFxuICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZUhvbGRlclRleHRcIiBcbiAgICBbcmVxdWlyZWRdPVwicXVlc3Rpb24uaXNPcHRpb25hbFwiIFxuICAgIGlucHV0QmdDb2xvcj1cIiNGQUZBRkFcIlxuICAgIFtpbnB1dElkXT1cInF1ZXN0aW9uLnRyYWNraW5nSWRcIiBcbiAgICBbZXJyb3JNZXNzYWdlc109XCJ7IHJlcXVpcmVkOiAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcgfVwiXG4gICAgW2lucHV0SWNvbkxlZnRTcmNdPVwicXVlc3Rpb24uaWNvbkxlZnRTcmNcIiBcbiAgICAoaW5wdXRWYWx1ZSk9XCJnZXRTb3VyY2VEYXRhTG9jYWwoJGV2ZW50KTsgaW5wdXRWYWx1ZSgkZXZlbnQudmFsdWUsICRldmVudC5xdWVzdGlvbilcIiBcbiAgICAob25Gb2N1cyk9XCJvbklucHV0Rm9jdXMoKVwiXG4gICAgKG9uQmx1cik9XCJvbklucHV0Qmx1cigpXCJcbiAgICBbc2hvd1N1Z2dlc3Rpb25dPVwic2hvd1N1Z2dlc3Rpb25cIiBcbiAgICBhcmlhT3ducz1cInNlbGVjdExpc3RcIiBcbiAgICBhcmlhSGFzUG9wdXA9XCJsaXN0Ym94XCIgXG4gICAgW2lzTG9hZGluZ109XCJpc0xvYWRpbmdcIiBcbiAgICBbcXVlc3Rpb25dPVwicXVlc3Rpb25cIlxuICAgIChyZW1vdmVWYWx1ZUVtaXQpPVwicmVtb3ZlVmFsdWVFbWl0KClcIj5cbiAgPC9ueHQtaW5wdXQ+XG5cbiAgPGRpdiBpZD1cInNlbGVjdExpc3RcIiBjbGFzcz1cInN1Z2dlc3Rpb24td3JhcHBlclwiIHJvbGU9XCJsaXN0Ym94XCIgKm5nSWY9XCJzaG93U3VnZ2VzdGlvblwiPlxuICAgIDxkaXYgKm5nSWY9XCJmaW5hbFJlc3VsdHMoKS5sZW5ndGggPiAwXCIgY2xhc3M9XCJzdWdnZXN0aW9ucy1jb250YWluZXJcIj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmluYWxSZXN1bHRzKCk7IHRyYWNrQnk6IHRyYWNrQnlGblwiIFxuICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tJdGVtKGl0ZW0pXCIgXG4gICAgICAgICAgIGNsYXNzPVwic3VnZ2VzdGlvbi1pdGVtXCIgXG4gICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJjbGlja0l0ZW0oaXRlbSlcIlxuICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJjbGlja0l0ZW0oaXRlbSlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLWRldGFpbHNcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLnRodW1ibmFpbFwiIGNsYXNzPVwidGh1bWJuYWlsLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgPGltZyBbc3JjXT1cIml0ZW0udGh1bWJuYWlsXCIgW2FsdF09XCJpdGVtLm5hbWUgKyAnIGF2YXRhcidcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS10ZXh0XCI+XG4gICAgICAgICAgICAgIDwhLS0gUHJpbWFyeSB0ZXh0IChmaXJzdCBrZXkpIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0S2V5cyhnZXRWYWx1ZXMoaXRlbSwgU2VhcmNoSXRlbSkpLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1uYW1lIHByaW1hcnlcIiBcbiAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiaGlnaGxpZ2h0VGV4dChnZXRWYWx1ZXMoaXRlbSwgU2VhcmNoSXRlbSlbZ2V0S2V5cyhnZXRWYWx1ZXMoaXRlbSwgU2VhcmNoSXRlbSkpWzBdXSwgc2VhcmNoS2V5V29yZClcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8IS0tIFNlY29uZGFyeSB0ZXh0IChyZW1haW5pbmcga2V5cykgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLXNlY29uZGFyeVwiICpuZ0lmPVwiZ2V0S2V5cyhnZXRWYWx1ZXMoaXRlbSwgU2VhcmNoSXRlbSkpLmxlbmd0aCA+IDFcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBrZXkgb2YgZ2V0S2V5cyhnZXRWYWx1ZXMoaXRlbSwgU2VhcmNoSXRlbSkpOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaSA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWNvbmRhcnktdGV4dFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImhpZ2hsaWdodFRleHQoZ2V0VmFsdWVzKGl0ZW0sIFNlYXJjaEl0ZW0pW2tleV0sIHNlYXJjaEtleVdvcmQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXBhcmF0b3JcIiAqbmdJZj1cImkgPCBnZXRLZXlzKGdldFZhbHVlcyhpdGVtLCBTZWFyY2hJdGVtKSkubGVuZ3RoIC0gMVwiPiB8IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIFxuICAgIDxkaXYgKm5nSWY9XCJub1Jlc3VsdCAmJiBzZWFyY2hLZXlXb3JkXCIgY2xhc3M9XCJuby1yZXN1bHRzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibm8tcmVzdWx0cy1jb250ZW50XCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMVwiPlxuICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiOFwiPjwvY2lyY2xlPlxuICAgICAgICAgIDxwYXRoIGQ9XCJtMjEgMjEtNC4zNS00LjM1XCI+PC9wYXRoPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPHA+Tm8gcmVzdWx0cyBmb3VuZCBmb3IgXCJ7e3NlYXJjaEtleVdvcmR9fVwiPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19