@meshmakers/shared-ui 2.1.17-0 → 3.1.25-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/esm2022/lib/breadcrumb/breadcrumb.module.mjs +22 -0
  2. package/esm2022/lib/breadcrumb/mat-breadcrumb/mat-breadcrumb.component.mjs +109 -0
  3. package/esm2022/lib/breadcrumb/model/breadcrumb.mjs +2 -0
  4. package/esm2022/lib/breadcrumb/services/breadcrumb.service.mjs +22 -0
  5. package/esm2022/lib/confirmation-dialog/confirmation-dialog.module.mjs +26 -0
  6. package/esm2022/lib/confirmation-dialog/confirmation-window/confirmation-window.component.mjs +75 -0
  7. package/esm2022/lib/confirmation-dialog/services/confirmation.service.mjs +69 -0
  8. package/esm2022/lib/ia-shared-ui/ia-autocomplete-input/ia-autocomplete-input.mjs +295 -0
  9. package/esm2022/lib/ia-shared-ui/ia-entity-select-input/ia-entity-select-input.component.mjs +288 -0
  10. package/esm2022/lib/ia-shared-ui/ia-multiple-entity-select-input/ia-multiple-entity-select-input.component.mjs +311 -0
  11. package/esm2022/lib/ia-shared-ui/ia-notification-bar/ia-notification-bar.component.mjs +39 -0
  12. package/esm2022/lib/ia-shared-ui/ia-shared-ui.module.mjs +74 -0
  13. package/esm2022/lib/ia-shared-ui/message-details/message-details.component.mjs +26 -0
  14. package/esm2022/lib/progress-notifier/progress-notifier.module.mjs +27 -0
  15. package/esm2022/lib/progress-notifier/progress-window/progress-window.component.mjs +35 -0
  16. package/esm2022/lib/progress-notifier/services/progress-notifier.service.mjs +63 -0
  17. package/esm2022/lib/progress-notifier/shared/progressValue.mjs +9 -0
  18. package/esm2022/lib/shared/abstractDetailsComponent.mjs +53 -0
  19. package/esm2022/lib/shared/commonValidators.mjs +36 -0
  20. package/esm2022/public-api.mjs +19 -0
  21. package/fesm2022/meshmakers-shared-ui.mjs +1499 -0
  22. package/fesm2022/meshmakers-shared-ui.mjs.map +1 -0
  23. package/lib/breadcrumb/breadcrumb.module.d.ts +12 -0
  24. package/lib/breadcrumb/mat-breadcrumb/mat-breadcrumb.component.d.ts +21 -0
  25. package/lib/breadcrumb/model/breadcrumb.d.ts +4 -0
  26. package/lib/breadcrumb/services/breadcrumb.service.d.ts +11 -0
  27. package/lib/confirmation-dialog/confirmation-dialog.module.d.ts +2 -3
  28. package/lib/confirmation-dialog/confirmation-window/confirmation-window.component.d.ts +3 -3
  29. package/lib/confirmation-dialog/services/confirmation.service.d.ts +4 -4
  30. package/lib/ia-shared-ui/ia-autocomplete-input/ia-autocomplete-input.d.ts +13 -13
  31. package/lib/ia-shared-ui/ia-entity-select-input/ia-entity-select-input.component.d.ts +12 -12
  32. package/lib/ia-shared-ui/ia-multiple-entity-select-input/ia-multiple-entity-select-input.component.d.ts +16 -16
  33. package/lib/ia-shared-ui/ia-notification-bar/ia-notification-bar.component.d.ts +4 -4
  34. package/lib/ia-shared-ui/message-details/message-details.component.d.ts +2 -2
  35. package/lib/progress-notifier/progress-notifier.module.d.ts +3 -4
  36. package/lib/progress-notifier/progress-window/progress-window.component.d.ts +2 -2
  37. package/lib/progress-notifier/services/progress-notifier.service.d.ts +2 -2
  38. package/lib/shared/abstractDetailsComponent.d.ts +8 -4
  39. package/lib/shared/commonValidators.d.ts +2 -4
  40. package/package.json +6 -12
  41. package/public-api.d.ts +3 -0
  42. package/esm2020/lib/confirmation-dialog/confirmation-dialog.module.mjs +0 -40
  43. package/esm2020/lib/confirmation-dialog/confirmation-window/confirmation-window.component.mjs +0 -69
  44. package/esm2020/lib/confirmation-dialog/services/confirmation.service.mjs +0 -68
  45. package/esm2020/lib/ia-shared-ui/ia-autocomplete-input/ia-autocomplete-input.mjs +0 -276
  46. package/esm2020/lib/ia-shared-ui/ia-entity-select-input/ia-entity-select-input.component.mjs +0 -276
  47. package/esm2020/lib/ia-shared-ui/ia-multiple-entity-select-input/ia-multiple-entity-select-input.component.mjs +0 -300
  48. package/esm2020/lib/ia-shared-ui/ia-notification-bar/ia-notification-bar.component.mjs +0 -36
  49. package/esm2020/lib/ia-shared-ui/ia-shared-ui.module.mjs +0 -88
  50. package/esm2020/lib/ia-shared-ui/message-details/message-details.component.mjs +0 -24
  51. package/esm2020/lib/progress-notifier/progress-notifier.module.mjs +0 -44
  52. package/esm2020/lib/progress-notifier/progress-window/progress-window.component.mjs +0 -34
  53. package/esm2020/lib/progress-notifier/services/progress-notifier.service.mjs +0 -59
  54. package/esm2020/lib/progress-notifier/shared/progressValue.mjs +0 -7
  55. package/esm2020/lib/shared/abstractDetailsComponent.mjs +0 -38
  56. package/esm2020/lib/shared/commonValidators.mjs +0 -36
  57. package/esm2020/public-api.mjs +0 -16
  58. package/fesm2015/meshmakers-shared-ui.mjs +0 -1352
  59. package/fesm2015/meshmakers-shared-ui.mjs.map +0 -1
  60. package/fesm2020/meshmakers-shared-ui.mjs +0 -1329
  61. package/fesm2020/meshmakers-shared-ui.mjs.map +0 -1
  62. /package/{esm2020 → esm2022}/lib/confirmation-dialog/shared/confirmation.mjs +0 -0
  63. /package/{esm2020 → esm2022}/meshmakers-shared-ui.mjs +0 -0
@@ -1,276 +0,0 @@
1
- import { Component, EventEmitter, forwardRef, HostBinding, Input, ViewChild } from '@angular/core';
2
- import { FormControl, NG_VALIDATORS, NG_VALUE_ACCESSOR, NgControl } from "@angular/forms";
3
- import { MatFormFieldControl } from "@angular/material/form-field";
4
- import { of, Subject } from "rxjs";
5
- import { debounceTime, filter, switchMap, tap } from "rxjs/operators";
6
- import { coerceBooleanProperty } from "@angular/cdk/coercion";
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/cdk/a11y";
9
- import * as i2 from "@angular/common";
10
- import * as i3 from "@angular/material/autocomplete";
11
- import * as i4 from "@angular/material/core";
12
- import * as i5 from "@angular/material/input";
13
- import * as i6 from "@angular/material/progress-spinner";
14
- import * as i7 from "@angular/forms";
15
- export class IaEntitySelectInput {
16
- constructor(elRef, injector, fm) {
17
- this.elRef = elRef;
18
- this.injector = injector;
19
- this.fm = fm;
20
- this.filteredEntities = [];
21
- this.stateChanges = new Subject();
22
- this.id = `ia-entity-select-${IaEntitySelectInput.nextId++}`;
23
- this.valueChange = new EventEmitter();
24
- this.describedBy = '';
25
- this._disabled = false;
26
- this._required = false;
27
- this._propagateChange = (_) => {
28
- };
29
- this._onTouched = () => {
30
- };
31
- this.ngControl = null;
32
- this.errorState = false;
33
- this.inputField = null;
34
- this._dataSource = null;
35
- this._placeholder = "";
36
- this._prefix = "";
37
- this.searchFormControl = new FormControl();
38
- this.isLoading = false;
39
- this._disabled = false;
40
- this.focused = false;
41
- fm.monitor(elRef.nativeElement, true).subscribe(origin => {
42
- this.focused = !!origin;
43
- this.stateChanges.next();
44
- });
45
- }
46
- get dataSource() {
47
- return this._dataSource;
48
- }
49
- set dataSource(value) {
50
- this._dataSource = value;
51
- }
52
- get disabled() {
53
- return this._disabled;
54
- }
55
- set disabled(dis) {
56
- this._disabled = coerceBooleanProperty(dis);
57
- this._disabled ? this.searchFormControl.disable() : this.searchFormControl.enable();
58
- this.stateChanges.next();
59
- }
60
- get placeholder() {
61
- return this._placeholder;
62
- }
63
- set placeholder(plh) {
64
- this._placeholder = plh;
65
- this.stateChanges.next();
66
- }
67
- get required() {
68
- return this._required;
69
- }
70
- set required(req) {
71
- this._required = coerceBooleanProperty(req);
72
- if (this.inputField) {
73
- this.inputField.required = this._required;
74
- }
75
- this.stateChanges.next();
76
- }
77
- get prefix() {
78
- return this._prefix;
79
- }
80
- set prefix(value) {
81
- if (value !== this._prefix) {
82
- this._prefix = value;
83
- }
84
- }
85
- get value() {
86
- return this._selectedEntity;
87
- }
88
- set value(value) {
89
- if (value !== this._selectedEntity) {
90
- this.searchFormControl.setValue(value);
91
- this.setValue(value);
92
- }
93
- }
94
- get empty() {
95
- let n = this.searchFormControl.value;
96
- return !n;
97
- }
98
- get shouldLabelFloat() {
99
- return this.focused || !this.empty;
100
- }
101
- ngOnInit() {
102
- this.ngControl = this.injector.get(NgControl, null);
103
- if (this.ngControl != null) {
104
- this.ngControl.valueAccessor = this;
105
- }
106
- // If prefix defined, usually this is used for a code scanner.
107
- // The goal is to select the entity in direct way.
108
- if (this._prefix) {
109
- this.searchFormControl
110
- .valueChanges
111
- .pipe(debounceTime(300), filter(value => typeof value === 'string'), filter(value => value.startsWith(this._prefix)), tap(() => this.value = null), tap(() => this.isLoading = true), switchMap(value => this._dataSource?.onFilter(value.replace(this._prefix, "").trim()) ?? of(null)))
112
- .subscribe(resultSet => {
113
- if (resultSet && resultSet.list) {
114
- if (resultSet.list.length === 1) {
115
- this.value = resultSet.list[0];
116
- }
117
- else {
118
- this.filteredEntities = resultSet.list;
119
- }
120
- }
121
- this.isLoading = false;
122
- });
123
- }
124
- // This is the search functionality when search by human.
125
- this.searchFormControl
126
- .valueChanges
127
- .pipe(debounceTime(300), tap(() => this.filteredEntities = []), filter(value => typeof value === 'string'), tap(() => this.setValue(null)), filter(value => value.toString().length >= 3), tap(() => this.isLoading = true), switchMap(value => this._dataSource?.onFilter(value) ?? of(null)))
128
- .subscribe(resultSet => {
129
- if (resultSet && resultSet.list) {
130
- this.filteredEntities = resultSet.list;
131
- }
132
- this.isLoading = false;
133
- });
134
- }
135
- ngOnDestroy() {
136
- this.stateChanges.complete();
137
- this.fm.stopMonitoring(this.elRef.nativeElement);
138
- }
139
- ngDoCheck() {
140
- if (this.ngControl) {
141
- this.errorState = (this.ngControl.invalid && this.ngControl.touched) ?? false;
142
- this.stateChanges.next();
143
- }
144
- }
145
- clear() {
146
- this.filteredEntities = [];
147
- this.searchFormControl.reset(null);
148
- }
149
- focus() {
150
- this.elRef.nativeElement.querySelector('input').focus();
151
- }
152
- onEntitySelected(event) {
153
- this.value = event.option.value;
154
- this.filteredEntities = [];
155
- }
156
- onEntityActivated(event) {
157
- this.activatedValue = event.option?.value;
158
- }
159
- onEntityClosed() {
160
- if (this.activatedValue) {
161
- this.value = this.activatedValue;
162
- this.activatedValue = null;
163
- }
164
- }
165
- reset() {
166
- this.value = null;
167
- }
168
- onFocusOut() {
169
- if (this.filteredEntities.length === 1) {
170
- this.activatedValue = this.filteredEntities[0];
171
- this.value = this.filteredEntities[0];
172
- }
173
- }
174
- onTouched() {
175
- this._onTouched();
176
- this.stateChanges.next();
177
- }
178
- registerOnChange(fn) {
179
- this._propagateChange = fn;
180
- }
181
- registerOnTouched(fn) {
182
- this.onTouched = fn;
183
- }
184
- writeValue(obj) {
185
- this.clear();
186
- this.value = obj;
187
- }
188
- setDisabledState(isDisabled) {
189
- this.disabled = isDisabled;
190
- }
191
- onContainerClick(event) {
192
- if (event.target.tagName.toLowerCase() != 'input') {
193
- this.focus();
194
- }
195
- }
196
- setDescribedByIds(ids) {
197
- this.describedBy = ids.join(' ');
198
- }
199
- validate(control) {
200
- const selection = control.value;
201
- if (typeof selection === 'string') {
202
- return { incorrect: true };
203
- }
204
- return null;
205
- }
206
- setValue(value) {
207
- if (value !== this._selectedEntity) {
208
- this._selectedEntity = value;
209
- this.valueChange.emit(value);
210
- this._propagateChange(this._selectedEntity);
211
- this.stateChanges.next();
212
- }
213
- }
214
- }
215
- IaEntitySelectInput.nextId = 0;
216
- IaEntitySelectInput.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: IaEntitySelectInput, deps: [{ token: i0.ElementRef }, { token: i0.Injector }, { token: i1.FocusMonitor }], target: i0.ɵɵFactoryTarget.Component });
217
- IaEntitySelectInput.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: IaEntitySelectInput, selector: "ia-entity-select", inputs: { dataSource: "dataSource", disabled: "disabled", placeholder: "placeholder", required: "required", prefix: "prefix" }, host: { properties: { "id": "this.id", "attr.aria-describedby": "this.describedBy", "class.floating": "this.shouldLabelFloat" } }, providers: [
218
- {
219
- provide: NG_VALUE_ACCESSOR,
220
- useExisting: forwardRef(() => IaEntitySelectInput),
221
- multi: true
222
- },
223
- {
224
- provide: MatFormFieldControl,
225
- useExisting: IaEntitySelectInput
226
- },
227
- {
228
- provide: NG_VALIDATORS,
229
- useExisting: forwardRef(() => IaEntitySelectInput),
230
- multi: true
231
- }
232
- ], viewQueries: [{ propertyName: "inputField", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<input #input (blur)=\"onTouched()\" (focusout)=\"onFocusOut()\" [formControl]=\"searchFormControl\" [matAutocomplete]=\"auto\"\n [placeholder]=\"placeholder\" matInput>\n<mat-autocomplete #auto=\"matAutocomplete\" (closed)=\"onEntityClosed()\"\n (optionActivated)=\"onEntityActivated($event)\" (optionSelected)=\"onEntitySelected($event)\"\n [displayWith]=\"dataSource?.onDisplayEntity ?? null\">\n <mat-option *ngIf=\"isLoading\" class=\"is-loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n </mat-option>\n <ng-container *ngIf=\"!isLoading\">\n <mat-option *ngFor=\"let entity of filteredEntities\" [value]=\"entity\">\n {{dataSource?.onDisplayEntity(entity) ?? null}}\n </mat-option>\n </ng-container>\n</mat-autocomplete>\n", styles: ["span{opacity:0;transition:opacity .2s}:host.floating span{opacity:1}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i4.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i3.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
233
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: IaEntitySelectInput, decorators: [{
234
- type: Component,
235
- args: [{ selector: 'ia-entity-select', host: {
236
- '[id]': 'id',
237
- '[attr.aria-describedby]': 'describedBy'
238
- }, providers: [
239
- {
240
- provide: NG_VALUE_ACCESSOR,
241
- useExisting: forwardRef(() => IaEntitySelectInput),
242
- multi: true
243
- },
244
- {
245
- provide: MatFormFieldControl,
246
- useExisting: IaEntitySelectInput
247
- },
248
- {
249
- provide: NG_VALIDATORS,
250
- useExisting: forwardRef(() => IaEntitySelectInput),
251
- multi: true
252
- }
253
- ], template: "<input #input (blur)=\"onTouched()\" (focusout)=\"onFocusOut()\" [formControl]=\"searchFormControl\" [matAutocomplete]=\"auto\"\n [placeholder]=\"placeholder\" matInput>\n<mat-autocomplete #auto=\"matAutocomplete\" (closed)=\"onEntityClosed()\"\n (optionActivated)=\"onEntityActivated($event)\" (optionSelected)=\"onEntitySelected($event)\"\n [displayWith]=\"dataSource?.onDisplayEntity ?? null\">\n <mat-option *ngIf=\"isLoading\" class=\"is-loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n </mat-option>\n <ng-container *ngIf=\"!isLoading\">\n <mat-option *ngFor=\"let entity of filteredEntities\" [value]=\"entity\">\n {{dataSource?.onDisplayEntity(entity) ?? null}}\n </mat-option>\n </ng-container>\n</mat-autocomplete>\n", styles: ["span{opacity:0;transition:opacity .2s}:host.floating span{opacity:1}\n"] }]
254
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Injector }, { type: i1.FocusMonitor }]; }, propDecorators: { id: [{
255
- type: HostBinding
256
- }], inputField: [{
257
- type: ViewChild,
258
- args: ['input']
259
- }], describedBy: [{
260
- type: HostBinding,
261
- args: ['attr.aria-describedby']
262
- }], dataSource: [{
263
- type: Input
264
- }], disabled: [{
265
- type: Input
266
- }], placeholder: [{
267
- type: Input
268
- }], required: [{
269
- type: Input
270
- }], prefix: [{
271
- type: Input
272
- }], shouldLabelFloat: [{
273
- type: HostBinding,
274
- args: ['class.floating']
275
- }] } });
276
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWEtZW50aXR5LXNlbGVjdC1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXNobWFrZXJzL3NoYXJlZC11aS9zcmMvbGliL2lhLXNoYXJlZC11aS9pYS1lbnRpdHktc2VsZWN0LWlucHV0L2lhLWVudGl0eS1zZWxlY3QtaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVzaG1ha2Vycy9zaGFyZWQtdWkvc3JjL2xpYi9pYS1zaGFyZWQtdWkvaWEtZW50aXR5LXNlbGVjdC1pbnB1dC9pYS1lbnRpdHktc2VsZWN0LWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBR1QsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBRVgsS0FBSyxFQUdMLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBR0wsV0FBVyxFQUNYLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsU0FBUyxFQUdWLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFHakUsT0FBTyxFQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFakMsT0FBTyxFQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXBFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7QUEyQjVELE1BQU0sT0FBTyxtQkFBbUI7SUFpQjlCLFlBQW1CLEtBQWlCLEVBQVUsUUFBa0IsRUFBVSxFQUFnQjtRQUF2RSxVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUFVLE9BQUUsR0FBRixFQUFF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RCxXQUFXO3VCQUFDLHVCQUF1QjtnQkE0QnpCLFVBQVU7c0JBRHBCLEtBQUs7Z0JBUUssUUFBUTtzQkFEbEIsS0FBSztnQkFjSyxXQUFXO3NCQURyQixLQUFLO2dCQWFLLFFBQVE7c0JBRGxCLEtBQUs7Z0JBZ0JLLE1BQU07c0JBRGhCLEtBQUs7Z0JBNEJLLGdCQUFnQjtzQkFEMUIsV0FBVzt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIERvQ2hlY2ssXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIEZvcm1Db250cm9sLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgTmdDb250cm9sLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3Jcbn0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQge01hdEZvcm1GaWVsZENvbnRyb2x9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkXCI7XG5pbXBvcnQge01hdElucHV0fSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXRcIjtcbmltcG9ydCB7RW50aXR5U2VsZWN0RGF0YVNvdXJjZX0gZnJvbSBcIkBtZXNobWFrZXJzL3NoYXJlZC1zZXJ2aWNlc1wiO1xuaW1wb3J0IHtvZiwgU3ViamVjdH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7Rm9jdXNNb25pdG9yfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2ExMXlcIjtcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBmaWx0ZXIsIHN3aXRjaE1hcCwgdGFwfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7TWF0QXV0b2NvbXBsZXRlQWN0aXZhdGVkRXZlbnQsIE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnR9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGVcIjtcbmltcG9ydCB7Y29lcmNlQm9vbGVhblByb3BlcnR5fSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2NvZXJjaW9uXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lhLWVudGl0eS1zZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vaWEtZW50aXR5LXNlbGVjdC1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2lhLWVudGl0eS1zZWxlY3QtaW5wdXQuY29tcG9uZW50LmNzcyddLFxuICBob3N0OiB7XG4gICAgJ1tpZF0nOiAnaWQnLFxuICAgICdbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XSc6ICdkZXNjcmliZWRCeSdcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJYUVudGl0eVNlbGVjdElucHV0KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBNYXRGb3JtRmllbGRDb250cm9sLFxuICAgICAgdXNlRXhpc3Rpbmc6IElhRW50aXR5U2VsZWN0SW5wdXRcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJYUVudGl0eVNlbGVjdElucHV0KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIElhRW50aXR5U2VsZWN0SW5wdXQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgRG9DaGVjaywgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE1hdEZvcm1GaWVsZENvbnRyb2w8YW55PiwgVmFsaWRhdG9yIHtcblxuICBwcml2YXRlIHN0YXRpYyBuZXh0SWQgPSAwO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VhcmNoRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xuICBwdWJsaWMgaXNMb2FkaW5nOiBib29sZWFuO1xuICBwdWJsaWMgZmlsdGVyZWRFbnRpdGllczogYW55W10gPSBbXTtcbiAgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sIHwgbnVsbDtcbiAgcHVibGljIGVycm9yU3RhdGU6IGJvb2xlYW47XG4gIHB1YmxpYyBmb2N1c2VkOiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgQEhvc3RCaW5kaW5nKCkgcHVibGljIHJlYWRvbmx5IGlkID0gYGlhLWVudGl0eS1zZWxlY3QtJHtJYUVudGl0eVNlbGVjdElucHV0Lm5leHRJZCsrfWA7XG4gIHB1YmxpYyB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRFbnRpdHk6IGFueTtcbiAgQFZpZXdDaGlsZCgnaW5wdXQnKSBwcml2YXRlIHJlYWRvbmx5IGlucHV0RmllbGQ6IE1hdElucHV0IHwgbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZGVzY3JpYmVkYnknKSBwcml2YXRlIGRlc2NyaWJlZEJ5ID0gJyc7XG4gIHByaXZhdGUgYWN0aXZhdGVkVmFsdWU6IGFueTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLCBwcml2YXRlIGZtOiBGb2N1c01vbml0b3IpIHtcbiAgICB0aGlzLm5nQ29udHJvbCA9IG51bGw7XG4gICAgdGhpcy5lcnJvclN0YXRlID0gZmFsc2U7XG4gICAgdGhpcy5pbnB1dEZpZWxkID0gbnVsbDtcbiAgICB0aGlzLl9kYXRhU291cmNlID0gbnVsbDtcbiAgICB0aGlzLl9wbGFjZWhvbGRlciA9IFwiXCI7XG4gICAgdGhpcy5fcHJlZml4ID0gXCJcIjtcblxuICAgIHRoaXMuc2VhcmNoRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcbiAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX2Rpc2FibGVkID0gZmFsc2U7XG4gICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgZm0ubW9uaXRvcihlbFJlZi5uYXRpdmVFbGVtZW50LCB0cnVlKS5zdWJzY3JpYmUob3JpZ2luID0+IHtcbiAgICAgIHRoaXMuZm9jdXNlZCA9ICEhb3JpZ2luO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGF0YVNvdXJjZTogRW50aXR5U2VsZWN0RGF0YVNvdXJjZTxhbnk+IHwgbnVsbDtcblxuICBwdWJsaWMgZ2V0IGRhdGFTb3VyY2UoKTogRW50aXR5U2VsZWN0RGF0YVNvdXJjZTxhbnk+IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2U7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRhdGFTb3VyY2UodmFsdWU6IEVudGl0eVNlbGVjdERhdGFTb3VyY2U8YW55PiB8IG51bGwpIHtcbiAgICB0aGlzLl9kYXRhU291cmNlID0gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG5cbiAgcHVibGljIHNldCBkaXNhYmxlZChkaXMpIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShkaXMpO1xuICAgIHRoaXMuX2Rpc2FibGVkID8gdGhpcy5zZWFyY2hGb3JtQ29udHJvbC5kaXNhYmxlKCkgOiB0aGlzLnNlYXJjaEZvcm1Db250cm9sLmVuYWJsZSgpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3BsYWNlaG9sZGVyOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGdldCBwbGFjZWhvbGRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0IHBsYWNlaG9sZGVyKHBsaCkge1xuICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gcGxoO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlcXVpcmVkID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGdldCByZXF1aXJlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IHJlcXVpcmVkKHJlcSkge1xuICAgIHRoaXMuX3JlcXVpcmVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHJlcSk7XG4gICAgaWYgKHRoaXMuaW5wdXRGaWVsZCkge1xuICAgICAgdGhpcy5pbnB1dEZpZWxkLnJlcXVpcmVkID0gdGhpcy5fcmVxdWlyZWQ7XG4gICAgfVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3ByZWZpeDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgcHJlZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZWZpeDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgcHJlZml4KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuX3ByZWZpeCkge1xuICAgICAgdGhpcy5fcHJlZml4ID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEVudGl0eTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fc2VsZWN0ZWRFbnRpdHkpIHtcbiAgICAgIHRoaXMuc2VhcmNoRm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgdGhpcy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBlbXB0eSgpIHtcbiAgICBsZXQgbiA9IHRoaXMuc2VhcmNoRm9ybUNvbnRyb2wudmFsdWU7XG4gICAgcmV0dXJuICFuO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mbG9hdGluZycpXG4gIHB1YmxpYyBnZXQgc2hvdWxkTGFiZWxGbG9hdCgpIHtcbiAgICByZXR1cm4gdGhpcy5mb2N1c2VkIHx8ICF0aGlzLmVtcHR5O1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5uZ0NvbnRyb2wgPSB0aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wsIG51bGwpO1xuICAgIGlmICh0aGlzLm5nQ29udHJvbCAhPSBudWxsKSB7XG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG5cbiAgICAvLyBJZiBwcmVmaXggZGVmaW5lZCwgdXN1YWxseSB0aGlzIGlzIHVzZWQgZm9yIGEgY29kZSBzY2FubmVyLlxuICAgIC8vIFRoZSBnb2FsIGlzIHRvIHNlbGVjdCB0aGUgZW50aXR5IGluIGRpcmVjdCB3YXkuXG4gICAgaWYgKHRoaXMuX3ByZWZpeCkge1xuICAgICAgdGhpcy5zZWFyY2hGb3JtQ29udHJvbFxuICAgICAgICAudmFsdWVDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICAgIGZpbHRlcih2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSxcbiAgICAgICAgICBmaWx0ZXIodmFsdWUgPT4gdmFsdWUuc3RhcnRzV2l0aCh0aGlzLl9wcmVmaXgpKSxcbiAgICAgICAgICB0YXAoKCkgPT4gdGhpcy52YWx1ZSA9IG51bGwpLFxuICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLmlzTG9hZGluZyA9IHRydWUpLFxuICAgICAgICAgIHN3aXRjaE1hcCh2YWx1ZSA9PiB0aGlzLl9kYXRhU291cmNlPy5vbkZpbHRlcih2YWx1ZS5yZXBsYWNlKHRoaXMuX3ByZWZpeCwgXCJcIikudHJpbSgpKSA/PyBvZihudWxsKSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHJlc3VsdFNldCA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdFNldCAmJiByZXN1bHRTZXQubGlzdCkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdFNldC5saXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gcmVzdWx0U2V0Lmxpc3RbMF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkRW50aXRpZXMgPSByZXN1bHRTZXQubGlzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyB0aGUgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgd2hlbiBzZWFyY2ggYnkgaHVtYW4uXG4gICAgdGhpcy5zZWFyY2hGb3JtQ29udHJvbFxuICAgICAgLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5maWx0ZXJlZEVudGl0aWVzID0gW10pLFxuICAgICAgICBmaWx0ZXIodmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLnNldFZhbHVlKG51bGwpKSxcbiAgICAgICAgZmlsdGVyKHZhbHVlID0+IHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoID49IDMpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5pc0xvYWRpbmcgPSB0cnVlKSxcbiAgICAgICAgc3dpdGNoTWFwKHZhbHVlID0+IHRoaXMuX2RhdGFTb3VyY2U/Lm9uRmlsdGVyKHZhbHVlKSA/PyBvZihudWxsKSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUocmVzdWx0U2V0ID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0U2V0ICYmIHJlc3VsdFNldC5saXN0KSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkRW50aXRpZXMgPSByZXN1bHRTZXQubGlzdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5mbS5zdG9wTW9uaXRvcmluZyh0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgdGhpcy5lcnJvclN0YXRlID0gKHRoaXMubmdDb250cm9sLmludmFsaWQgJiYgdGhpcy5uZ0NvbnRyb2wudG91Y2hlZCkgPz8gZmFsc2U7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMuZmlsdGVyZWRFbnRpdGllcyA9IFtdO1xuICAgIHRoaXMuc2VhcmNoRm9ybUNvbnRyb2wucmVzZXQobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXMoKSB7XG4gICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykuZm9jdXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkVudGl0eVNlbGVjdGVkKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KSB7XG4gICAgdGhpcy52YWx1ZSA9IGV2ZW50Lm9wdGlvbi52YWx1ZTtcbiAgICB0aGlzLmZpbHRlcmVkRW50aXRpZXMgPSBbXTtcbiAgfVxuXG4gIHB1YmxpYyBvbkVudGl0eUFjdGl2YXRlZChldmVudDogTWF0QXV0b2NvbXBsZXRlQWN0aXZhdGVkRXZlbnQpIHtcbiAgICB0aGlzLmFjdGl2YXRlZFZhbHVlID0gZXZlbnQub3B0aW9uPy52YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBvbkVudGl0eUNsb3NlZCgpIHtcblxuICAgIGlmICh0aGlzLmFjdGl2YXRlZFZhbHVlKSB7XG5cbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmFjdGl2YXRlZFZhbHVlO1xuICAgICAgdGhpcy5hY3RpdmF0ZWRWYWx1ZSA9IG51bGw7XG5cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gIH1cblxuICBwdWJsaWMgb25Gb2N1c091dCgpIHtcblxuICAgIGlmICh0aGlzLmZpbHRlcmVkRW50aXRpZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLmFjdGl2YXRlZFZhbHVlID0gdGhpcy5maWx0ZXJlZEVudGl0aWVzWzBdO1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuZmlsdGVyZWRFbnRpdGllc1swXTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25Ub3VjaGVkKCkge1xuXG4gICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX3Byb3BhZ2F0ZUNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgcHVibGljIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyKCk7XG4gICAgdGhpcy52YWx1ZSA9IG9iajtcbiAgfVxuXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIHB1YmxpYyBvbkNvbnRhaW5lckNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKChldmVudC50YXJnZXQgYXMgRWxlbWVudCkudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9ICdpbnB1dCcpIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0RGVzY3JpYmVkQnlJZHMoaWRzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuZGVzY3JpYmVkQnkgPSBpZHMuam9pbignICcpO1xuICB9XG5cbiAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IHNlbGVjdGlvbjogYW55ID0gY29udHJvbC52YWx1ZTtcbiAgICBpZiAodHlwZW9mIHNlbGVjdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB7aW5jb3JyZWN0OiB0cnVlfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9wcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7XG4gIH07XG5cbiAgcHJpdmF0ZSBfb25Ub3VjaGVkID0gKCkgPT4ge1xuICB9O1xuXG4gIHByaXZhdGUgc2V0VmFsdWUodmFsdWU6IGFueSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fc2VsZWN0ZWRFbnRpdHkpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkRW50aXR5ID0gdmFsdWU7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlKHRoaXMuX3NlbGVjdGVkRW50aXR5KTtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxufVxuIiwiPGlucHV0ICNpbnB1dCAoYmx1cik9XCJvblRvdWNoZWQoKVwiIChmb2N1c291dCk9XCJvbkZvY3VzT3V0KClcIiBbZm9ybUNvbnRyb2xdPVwic2VhcmNoRm9ybUNvbnRyb2xcIiBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxuICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiIG1hdElucHV0PlxuPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiAoY2xvc2VkKT1cIm9uRW50aXR5Q2xvc2VkKClcIlxuICAgICAgICAgICAgICAgICAgKG9wdGlvbkFjdGl2YXRlZCk9XCJvbkVudGl0eUFjdGl2YXRlZCgkZXZlbnQpXCIgKG9wdGlvblNlbGVjdGVkKT1cIm9uRW50aXR5U2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBbZGlzcGxheVdpdGhdPVwiZGF0YVNvdXJjZT8ub25EaXNwbGF5RW50aXR5ID8/IG51bGxcIj5cbiAgPG1hdC1vcHRpb24gKm5nSWY9XCJpc0xvYWRpbmdcIiBjbGFzcz1cImlzLWxvYWRpbmdcIj5cbiAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG4gIDwvbWF0LW9wdGlvbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRpbmdcIj5cbiAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgZW50aXR5IG9mIGZpbHRlcmVkRW50aXRpZXNcIiBbdmFsdWVdPVwiZW50aXR5XCI+XG4gICAgICB7e2RhdGFTb3VyY2U/Lm9uRGlzcGxheUVudGl0eShlbnRpdHkpID8/IG51bGx9fVxuICAgIDwvbWF0LW9wdGlvbj5cbiAgPC9uZy1jb250YWluZXI+XG48L21hdC1hdXRvY29tcGxldGU+XG4iXX0=