@igo2/context 18.0.1-next.2 → 18.0.1

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 (68) hide show
  1. package/esm2022/igo2-context.mjs +5 -0
  2. package/esm2022/lib/context-import-export/context-import-export/context-import-export.component.mjs +156 -0
  3. package/esm2022/lib/context-import-export/context-import-export.module.mjs +24 -0
  4. package/esm2022/lib/context-import-export/index.mjs +3 -0
  5. package/esm2022/lib/context-import-export/shared/context-export.errors.mjs +15 -0
  6. package/esm2022/lib/context-import-export/shared/context-export.interface.mjs +2 -0
  7. package/esm2022/lib/context-import-export/shared/context-export.service.mjs +38 -0
  8. package/esm2022/lib/context-import-export/shared/context-export.utils.mjs +15 -0
  9. package/esm2022/lib/context-import-export/shared/context-import.errors.mjs +33 -0
  10. package/esm2022/lib/context-import-export/shared/context-import.service.mjs +82 -0
  11. package/esm2022/lib/context-import-export/shared/context-import.utils.mjs +148 -0
  12. package/esm2022/lib/context-import-export/shared/index.mjs +8 -0
  13. package/esm2022/lib/context-manager/context-edit/context-edit-binding.directive.mjs +56 -0
  14. package/esm2022/lib/context-manager/context-edit/context-edit.component.mjs +35 -0
  15. package/esm2022/lib/context-manager/context-edit/index.mjs +3 -0
  16. package/esm2022/lib/context-manager/context-form/context-form.component.mjs +117 -0
  17. package/esm2022/lib/context-manager/context-form/index.mjs +2 -0
  18. package/esm2022/lib/context-manager/context-item/context-item.component.mjs +96 -0
  19. package/esm2022/lib/context-manager/context-item/index.mjs +2 -0
  20. package/esm2022/lib/context-manager/context-list/context-list-binding.directive.mjs +259 -0
  21. package/esm2022/lib/context-manager/context-list/context-list.component.mjs +424 -0
  22. package/esm2022/lib/context-manager/context-list/context-list.enum.mjs +7 -0
  23. package/esm2022/lib/context-manager/context-list/index.mjs +3 -0
  24. package/esm2022/lib/context-manager/context-manager.directive.mjs +19 -0
  25. package/esm2022/lib/context-manager/context-manager.module.mjs +77 -0
  26. package/esm2022/lib/context-manager/context-permissions/context-permissions-binding.directive.mjs +109 -0
  27. package/esm2022/lib/context-manager/context-permissions/context-permissions.component.mjs +170 -0
  28. package/esm2022/lib/context-manager/context-permissions/index.mjs +3 -0
  29. package/esm2022/lib/context-manager/index.mjs +8 -0
  30. package/esm2022/lib/context-manager/shared/context.enum.mjs +13 -0
  31. package/esm2022/lib/context-manager/shared/context.interface.mjs +2 -0
  32. package/esm2022/lib/context-manager/shared/context.service.mjs +616 -0
  33. package/esm2022/lib/context-manager/shared/index.mjs +6 -0
  34. package/esm2022/lib/context-manager/shared/layer-context.directive.mjs +176 -0
  35. package/esm2022/lib/context-manager/shared/map-context.directive.mjs +68 -0
  36. package/esm2022/lib/context-map-button/bookmark-button/bookmark-button.component.mjs +69 -0
  37. package/esm2022/lib/context-map-button/bookmark-button/bookmark-dialog.component.mjs +37 -0
  38. package/esm2022/lib/context-map-button/bookmark-button/index.mjs +3 -0
  39. package/esm2022/lib/context-map-button/context-map-button.directive.mjs +10 -0
  40. package/esm2022/lib/context-map-button/context-map-button.module.mjs +48 -0
  41. package/esm2022/lib/context-map-button/index.mjs +5 -0
  42. package/esm2022/lib/context-map-button/poi-button/index.mjs +4 -0
  43. package/esm2022/lib/context-map-button/poi-button/poi-button.component.mjs +160 -0
  44. package/esm2022/lib/context-map-button/poi-button/poi-dialog.component.mjs +37 -0
  45. package/esm2022/lib/context-map-button/poi-button/shared/index.mjs +3 -0
  46. package/esm2022/lib/context-map-button/poi-button/shared/poi.interface.mjs +2 -0
  47. package/esm2022/lib/context-map-button/poi-button/shared/poi.service.mjs +38 -0
  48. package/esm2022/lib/context-map-button/user-button/index.mjs +3 -0
  49. package/esm2022/lib/context-map-button/user-button/user-button.animation.mjs +17 -0
  50. package/esm2022/lib/context-map-button/user-button/user-button.component.mjs +82 -0
  51. package/esm2022/lib/context-map-button/user-button/user-dialog.component.mjs +43 -0
  52. package/esm2022/lib/context.module.mjs +42 -0
  53. package/esm2022/lib/environment/environment.interface.mjs +2 -0
  54. package/esm2022/lib/environment/index.mjs +2 -0
  55. package/esm2022/lib/share-map/index.mjs +6 -0
  56. package/esm2022/lib/share-map/share-map/share-map-api.component.mjs +111 -0
  57. package/esm2022/lib/share-map/share-map/share-map-url.component.mjs +78 -0
  58. package/esm2022/lib/share-map/share-map/share-map.component.mjs +35 -0
  59. package/esm2022/lib/share-map/share-map.module.mjs +31 -0
  60. package/esm2022/lib/share-map/shared/index.mjs +2 -0
  61. package/esm2022/lib/share-map/shared/share-map.service.mjs +223 -0
  62. package/esm2022/lib/sidenav/index.mjs +2 -0
  63. package/esm2022/lib/sidenav/sidenav.component.mjs +122 -0
  64. package/esm2022/lib/sidenav/sidenav.module.mjs +24 -0
  65. package/esm2022/public_api.mjs +16 -0
  66. package/fesm2022/igo2-context.mjs +118 -118
  67. package/fesm2022/igo2-context.mjs.map +1 -1
  68. package/package.json +14 -12
@@ -0,0 +1,259 @@
1
+ import { ChangeDetectorRef, Directive, HostListener, Self } from '@angular/core';
2
+ import { AuthService } from '@igo2/auth';
3
+ import { ConfirmDialogService } from '@igo2/common/confirm-dialog';
4
+ import { LanguageService } from '@igo2/core/language';
5
+ import { MessageService } from '@igo2/core/message';
6
+ import { StorageService } from '@igo2/core/storage';
7
+ import { MapService } from '@igo2/geo';
8
+ import { debounceTime } from 'rxjs/operators';
9
+ import { ContextService } from '../shared/context.service';
10
+ import { ContextListComponent } from './context-list.component';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "./context-list.component";
13
+ import * as i2 from "../shared/context.service";
14
+ import * as i3 from "@igo2/geo";
15
+ import * as i4 from "@igo2/core/language";
16
+ import * as i5 from "@igo2/common/confirm-dialog";
17
+ import * as i6 from "@igo2/core/message";
18
+ import * as i7 from "@igo2/auth";
19
+ import * as i8 from "@igo2/core/storage";
20
+ export class ContextListBindingDirective {
21
+ contextService;
22
+ mapService;
23
+ languageService;
24
+ confirmDialogService;
25
+ messageService;
26
+ auth;
27
+ storageService;
28
+ cdRef;
29
+ component;
30
+ contexts$$;
31
+ selectedContext$$;
32
+ defaultContextId$$;
33
+ previousMessageId;
34
+ onSelect(context) {
35
+ this.contextService.loadContext(context.uri);
36
+ }
37
+ onEdit(context) {
38
+ this.contextService.loadEditedContext(context.uri);
39
+ }
40
+ onSave(context) {
41
+ const map = this.mapService.getMap();
42
+ const contextFromMap = this.contextService.getContextFromMap(map);
43
+ const msgSuccess = () => {
44
+ this.messageService.success('igo.context.contextManager.dialog.saveMsg', 'igo.context.contextManager.dialog.saveTitle', undefined, {
45
+ value: context.title
46
+ });
47
+ };
48
+ if (context.imported) {
49
+ contextFromMap.title = context.title;
50
+ this.contextService.delete(context.id, true);
51
+ this.contextService.create(contextFromMap).subscribe((contextCreated) => {
52
+ this.contextService.loadContext(contextCreated.uri);
53
+ msgSuccess();
54
+ });
55
+ return;
56
+ }
57
+ const changes = {
58
+ layers: contextFromMap.layers,
59
+ map: {
60
+ view: contextFromMap.map.view
61
+ }
62
+ };
63
+ this.contextService.update(context.id, changes).subscribe(() => {
64
+ msgSuccess();
65
+ });
66
+ }
67
+ onFavorite(context) {
68
+ if (!context.id) {
69
+ context.id = context.uri;
70
+ }
71
+ this.contextService.setDefault(context.id).subscribe(() => {
72
+ if (this.previousMessageId) {
73
+ this.messageService.remove(this.previousMessageId);
74
+ }
75
+ this.contextService.defaultContextId$.next(context.id);
76
+ const messageObj = this.messageService.success('igo.context.contextManager.dialog.favoriteMsg', 'igo.context.contextManager.dialog.favoriteTitle', undefined, {
77
+ value: context.title
78
+ });
79
+ this.previousMessageId = messageObj.toastId;
80
+ this.cdRef.detectChanges();
81
+ });
82
+ }
83
+ onManageTools(context) {
84
+ this.contextService.loadEditedContext(context.uri);
85
+ }
86
+ onManagePermissions(context) {
87
+ this.contextService.loadEditedContext(context.uri);
88
+ }
89
+ onDelete(context) {
90
+ const translate = this.languageService.translate;
91
+ this.confirmDialogService
92
+ .open(translate.instant('igo.context.contextManager.dialog.confirmDelete'))
93
+ .subscribe((confirm) => {
94
+ if (confirm) {
95
+ this.contextService
96
+ .delete(context.id, context.imported)
97
+ .subscribe(() => {
98
+ this.messageService.info('igo.context.contextManager.dialog.deleteMsg', 'igo.context.contextManager.dialog.deleteTitle', undefined, { value: context.title });
99
+ });
100
+ }
101
+ });
102
+ }
103
+ onClone(context) {
104
+ const properties = {
105
+ title: context.title + '-copy',
106
+ uri: context.uri + '-copy'
107
+ };
108
+ this.contextService.clone(context.id, properties).subscribe(() => {
109
+ this.messageService.success('igo.context.contextManager.dialog.cloneMsg', 'igo.context.contextManager.dialog.cloneTitle', undefined, { value: context.title });
110
+ });
111
+ }
112
+ onCreate(opts) {
113
+ const { title, empty } = opts;
114
+ const context = this.contextService.getContextFromMap(this.component.map, empty);
115
+ context.title = title;
116
+ this.contextService.create(context).subscribe(() => {
117
+ this.messageService.success('igo.context.bookmarkButton.dialog.createMsg', 'igo.context.bookmarkButton.dialog.createTitle', undefined, { value: context.title });
118
+ this.contextService.loadContext(context.uri);
119
+ });
120
+ }
121
+ loadContexts() {
122
+ const permissions = ['none'];
123
+ for (const p of this.component.permissions) {
124
+ if (p.checked === true || p.indeterminate === true) {
125
+ permissions.push(p.name);
126
+ }
127
+ }
128
+ this.contextService.loadContexts(permissions, this.component.showHidden);
129
+ }
130
+ showHiddenContexts() {
131
+ this.component.showHidden = !this.component.showHidden;
132
+ this.storageService.set('contexts.showHidden', this.component.showHidden);
133
+ this.loadContexts();
134
+ }
135
+ onShowContext(context) {
136
+ this.contextService.showContext(context.id).subscribe();
137
+ }
138
+ onHideContext(context) {
139
+ this.contextService.hideContext(context.id).subscribe();
140
+ }
141
+ constructor(component, contextService, mapService, languageService, confirmDialogService, messageService, auth, storageService, cdRef) {
142
+ this.contextService = contextService;
143
+ this.mapService = mapService;
144
+ this.languageService = languageService;
145
+ this.confirmDialogService = confirmDialogService;
146
+ this.messageService = messageService;
147
+ this.auth = auth;
148
+ this.storageService = storageService;
149
+ this.cdRef = cdRef;
150
+ this.component = component;
151
+ }
152
+ ngOnInit() {
153
+ // Override input contexts
154
+ this.component.contexts = { ours: [] };
155
+ this.component.showHidden = this.storageService.get('contexts.showHidden');
156
+ this.contexts$$ = this.contextService.contexts$.subscribe((contexts) => this.handleContextsChange(contexts));
157
+ this.defaultContextId$$ = this.contextService.defaultContextId$.subscribe((id) => {
158
+ this.component.defaultContextId = id;
159
+ });
160
+ const storedContextUri = this.storageService.get('favorite.context.uri');
161
+ if (storedContextUri && !this.auth.authenticated) {
162
+ this.contextService.defaultContextId$.next(storedContextUri);
163
+ }
164
+ // See feature-list.component for an explanation about the debounce time
165
+ this.selectedContext$$ = this.contextService.context$
166
+ .pipe(debounceTime(100))
167
+ .subscribe((context) => (this.component.selectedContext = context));
168
+ this.auth.authenticate$.subscribe((authenticate) => {
169
+ if (authenticate) {
170
+ this.contextService.getProfilByUser().subscribe((profils) => {
171
+ this.component.users = profils;
172
+ this.component.permissions = [];
173
+ const profilsAcc = this.component.users.reduce((acc, cur) => {
174
+ acc = acc.concat(cur);
175
+ acc = cur.childs ? acc.concat(cur.childs) : acc;
176
+ return acc;
177
+ }, []);
178
+ for (const user of profilsAcc) {
179
+ const permission = {
180
+ name: user.name,
181
+ checked: this.storageService.get('contexts.permissions.' + user.name)
182
+ };
183
+ if (permission.checked === null) {
184
+ permission.checked = true;
185
+ }
186
+ this.component.permissions.push(permission);
187
+ }
188
+ const permissions = ['none'];
189
+ for (const p of this.component.permissions) {
190
+ if (p.checked === true || p.indeterminate === true) {
191
+ permissions.push(p.name);
192
+ }
193
+ }
194
+ this.contextService.loadContexts(permissions, this.component.showHidden);
195
+ });
196
+ }
197
+ });
198
+ }
199
+ ngOnDestroy() {
200
+ this.contexts$$.unsubscribe();
201
+ this.selectedContext$$.unsubscribe();
202
+ this.defaultContextId$$.unsubscribe();
203
+ }
204
+ handleContextsChange(contexts) {
205
+ this.component.contexts = contexts;
206
+ }
207
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ContextListBindingDirective, deps: [{ token: i1.ContextListComponent, self: true }, { token: i2.ContextService }, { token: i3.MapService }, { token: i4.LanguageService }, { token: i5.ConfirmDialogService }, { token: i6.MessageService }, { token: i7.AuthService }, { token: i8.StorageService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
208
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: ContextListBindingDirective, isStandalone: true, selector: "[igoContextListBinding]", host: { listeners: { "select": "onSelect($event)", "edit": "onEdit($event)", "save": "onSave($event)", "favorite": "onFavorite($event)", "manageTools": "onManageTools($event)", "managePermissions": "onManagePermissions($event)", "delete": "onDelete($event)", "clone": "onClone($event)", "create": "onCreate($event)", "filterPermissionsChanged": "loadContexts()", "showHiddenContexts": "showHiddenContexts()", "show": "onShowContext($event)", "hide": "onHideContext($event)" } }, providers: [ConfirmDialogService], ngImport: i0 });
209
+ }
210
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ContextListBindingDirective, decorators: [{
211
+ type: Directive,
212
+ args: [{
213
+ selector: '[igoContextListBinding]',
214
+ standalone: true,
215
+ providers: [ConfirmDialogService]
216
+ }]
217
+ }], ctorParameters: () => [{ type: i1.ContextListComponent, decorators: [{
218
+ type: Self
219
+ }] }, { type: i2.ContextService }, { type: i3.MapService }, { type: i4.LanguageService }, { type: i5.ConfirmDialogService }, { type: i6.MessageService }, { type: i7.AuthService }, { type: i8.StorageService }, { type: i0.ChangeDetectorRef }], propDecorators: { onSelect: [{
220
+ type: HostListener,
221
+ args: ['select', ['$event']]
222
+ }], onEdit: [{
223
+ type: HostListener,
224
+ args: ['edit', ['$event']]
225
+ }], onSave: [{
226
+ type: HostListener,
227
+ args: ['save', ['$event']]
228
+ }], onFavorite: [{
229
+ type: HostListener,
230
+ args: ['favorite', ['$event']]
231
+ }], onManageTools: [{
232
+ type: HostListener,
233
+ args: ['manageTools', ['$event']]
234
+ }], onManagePermissions: [{
235
+ type: HostListener,
236
+ args: ['managePermissions', ['$event']]
237
+ }], onDelete: [{
238
+ type: HostListener,
239
+ args: ['delete', ['$event']]
240
+ }], onClone: [{
241
+ type: HostListener,
242
+ args: ['clone', ['$event']]
243
+ }], onCreate: [{
244
+ type: HostListener,
245
+ args: ['create', ['$event']]
246
+ }], loadContexts: [{
247
+ type: HostListener,
248
+ args: ['filterPermissionsChanged']
249
+ }], showHiddenContexts: [{
250
+ type: HostListener,
251
+ args: ['showHiddenContexts']
252
+ }], onShowContext: [{
253
+ type: HostListener,
254
+ args: ['show', ['$event']]
255
+ }], onHideContext: [{
256
+ type: HostListener,
257
+ args: ['hide', ['$event']]
258
+ }] } });
259
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1saXN0LWJpbmRpbmcuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29udGV4dC9zcmMvbGliL2NvbnRleHQtbWFuYWdlci9jb250ZXh0LWxpc3QvY29udGV4dC1saXN0LWJpbmRpbmcuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFHWixJQUFJLEVBQ0wsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN6QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBR3ZDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVE5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7QUFPaEUsTUFBTSxPQUFPLDJCQUEyQjtJQWlMNUI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQXZMRixTQUFTLENBQXVCO0lBQ2hDLFVBQVUsQ0FBZTtJQUN6QixpQkFBaUIsQ0FBZTtJQUNoQyxrQkFBa0IsQ0FBZTtJQUNqQyxpQkFBaUIsQ0FBQztJQUcxQixRQUFRLENBQUMsT0FBZ0I7UUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsT0FBTyxD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QUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXdCcEMsYUFBYTtzQkFEWixZQUFZO3VCQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFNdkMsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLG1CQUFtQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU03QyxRQUFRO3NCQURQLFlBQVk7dUJBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXdCbEMsT0FBTztzQkFETixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFpQmpDLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBb0JsQyxZQUFZO3NCQURYLFlBQVk7dUJBQUMsMEJBQTBCO2dCQWF4QyxrQkFBa0I7c0JBRGpCLFlBQVk7dUJBQUMsb0JBQW9CO2dCQVFsQyxhQUFhO3NCQURaLFlBQVk7dUJBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU1oQyxhQUFhO3NCQURaLFlBQVk7dUJBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIERpcmVjdGl2ZSxcbiAgSG9zdExpc3RlbmVyLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgU2VsZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICdAaWdvMi9hdXRoJztcbmltcG9ydCB7IENvbmZpcm1EaWFsb2dTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29tbW9uL2NvbmZpcm0tZGlhbG9nJztcbmltcG9ydCB7IExhbmd1YWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUvbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL21lc3NhZ2UnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL3N0b3JhZ2UnO1xuaW1wb3J0IHsgTWFwU2VydmljZSB9IGZyb20gJ0BpZ28yL2dlbyc7XG5cbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICBDb250ZXh0LFxuICBDb250ZXh0VXNlclBlcm1pc3Npb24sXG4gIENvbnRleHRzTGlzdCxcbiAgRGV0YWlsZWRDb250ZXh0XG59IGZyb20gJy4uL3NoYXJlZC9jb250ZXh0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb250ZXh0U2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29udGV4dExpc3RDb21wb25lbnQgfSBmcm9tICcuL2NvbnRleHQtbGlzdC5jb21wb25lbnQnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbaWdvQ29udGV4dExpc3RCaW5kaW5nXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHByb3ZpZGVyczogW0NvbmZpcm1EaWFsb2dTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBDb250ZXh0TGlzdEJpbmRpbmdEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgY29tcG9uZW50OiBDb250ZXh0TGlzdENvbXBvbmVudDtcbiAgcHJpdmF0ZSBjb250ZXh0cyQkOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgc2VsZWN0ZWRDb250ZXh0JCQ6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBkZWZhdWx0Q29udGV4dElkJCQ6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBwcmV2aW91c01lc3NhZ2VJZDtcblxuICBASG9zdExpc3RlbmVyKCdzZWxlY3QnLCBbJyRldmVudCddKVxuICBvblNlbGVjdChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgdGhpcy5jb250ZXh0U2VydmljZS5sb2FkQ29udGV4dChjb250ZXh0LnVyaSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdlZGl0JywgWyckZXZlbnQnXSlcbiAgb25FZGl0KGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmxvYWRFZGl0ZWRDb250ZXh0KGNvbnRleHQudXJpKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3NhdmUnLCBbJyRldmVudCddKVxuICBvblNhdmUoY29udGV4dDogQ29udGV4dCkge1xuICAgIGNvbnN0IG1hcCA9IHRoaXMubWFwU2VydmljZS5nZXRNYXAoKTtcbiAgICBjb25zdCBjb250ZXh0RnJvbU1hcCA9IHRoaXMuY29udGV4dFNlcnZpY2UuZ2V0Q29udGV4dEZyb21NYXAobWFwKTtcblxuICAgIGNvbnN0IG1zZ1N1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnN1Y2Nlc3MoXG4gICAgICAgICdpZ28uY29udGV4dC5jb250ZXh0TWFuYWdlci5kaWFsb2cuc2F2ZU1zZycsXG4gICAgICAgICdpZ28uY29udGV4dC5jb250ZXh0TWFuYWdlci5kaWFsb2cuc2F2ZVRpdGxlJyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IGNvbnRleHQudGl0bGVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgaWYgKGNvbnRleHQuaW1wb3J0ZWQpIHtcbiAgICAgIGNvbnRleHRGcm9tTWFwLnRpdGxlID0gY29udGV4dC50aXRsZTtcbiAgICAgIHRoaXMuY29udGV4dFNlcnZpY2UuZGVsZXRlKGNvbnRleHQuaWQsIHRydWUpO1xuICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5jcmVhdGUoY29udGV4dEZyb21NYXApLnN1YnNjcmliZSgoY29udGV4dENyZWF0ZWQpID0+IHtcbiAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5sb2FkQ29udGV4dChjb250ZXh0Q3JlYXRlZC51cmkpO1xuICAgICAgICBtc2dTdWNjZXNzKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjaGFuZ2VzOiBEZXRhaWxlZENvbnRleHQgPSB7XG4gICAgICBsYXllcnM6IGNvbnRleHRGcm9tTWFwLmxheWVycyxcbiAgICAgIG1hcDoge1xuICAgICAgICB2aWV3OiBjb250ZXh0RnJvbU1hcC5tYXAudmlld1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLnVwZGF0ZShjb250ZXh0LmlkLCBjaGFuZ2VzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgbXNnU3VjY2VzcygpO1xuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZmF2b3JpdGUnLCBbJyRldmVudCddKVxuICBvbkZhdm9yaXRlKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICBpZiAoIWNvbnRleHQuaWQpIHtcbiAgICAgIGNvbnRleHQuaWQgPSBjb250ZXh0LnVyaTtcbiAgICB9XG4gICAgdGhpcy5jb250ZXh0U2VydmljZS5zZXREZWZhdWx0KGNvbnRleHQuaWQpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wcmV2aW91c01lc3NhZ2VJZCkge1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnJlbW92ZSh0aGlzLnByZXZpb3VzTWVzc2FnZUlkKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGV4dFNlcnZpY2UuZGVmYXVsdENvbnRleHRJZCQubmV4dChjb250ZXh0LmlkKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VPYmogPSB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnN1Y2Nlc3MoXG4gICAgICAgICdpZ28uY29udGV4dC5jb250ZXh0TWFuYWdlci5kaWFsb2cuZmF2b3JpdGVNc2cnLFxuICAgICAgICAnaWdvLmNvbnRleHQuY29udGV4dE1hbmFnZXIuZGlhbG9nLmZhdm9yaXRlVGl0bGUnLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogY29udGV4dC50aXRsZVxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgdGhpcy5wcmV2aW91c01lc3NhZ2VJZCA9IG1lc3NhZ2VPYmoudG9hc3RJZDtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbWFuYWdlVG9vbHMnLCBbJyRldmVudCddKVxuICBvbk1hbmFnZVRvb2xzKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmxvYWRFZGl0ZWRDb250ZXh0KGNvbnRleHQudXJpKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ21hbmFnZVBlcm1pc3Npb25zJywgWyckZXZlbnQnXSlcbiAgb25NYW5hZ2VQZXJtaXNzaW9ucyhjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgdGhpcy5jb250ZXh0U2VydmljZS5sb2FkRWRpdGVkQ29udGV4dChjb250ZXh0LnVyaSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkZWxldGUnLCBbJyRldmVudCddKVxuICBvbkRlbGV0ZShjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgY29uc3QgdHJhbnNsYXRlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlO1xuICAgIHRoaXMuY29uZmlybURpYWxvZ1NlcnZpY2VcbiAgICAgIC5vcGVuKFxuICAgICAgICB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmNvbnRleHQuY29udGV4dE1hbmFnZXIuZGlhbG9nLmNvbmZpcm1EZWxldGUnKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoY29uZmlybSkgPT4ge1xuICAgICAgICBpZiAoY29uZmlybSkge1xuICAgICAgICAgIHRoaXMuY29udGV4dFNlcnZpY2VcbiAgICAgICAgICAgIC5kZWxldGUoY29udGV4dC5pZCwgY29udGV4dC5pbXBvcnRlZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmluZm8oXG4gICAgICAgICAgICAgICAgJ2lnby5jb250ZXh0LmNvbnRleHRNYW5hZ2VyLmRpYWxvZy5kZWxldGVNc2cnLFxuICAgICAgICAgICAgICAgICdpZ28uY29udGV4dC5jb250ZXh0TWFuYWdlci5kaWFsb2cuZGVsZXRlVGl0bGUnLFxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB7IHZhbHVlOiBjb250ZXh0LnRpdGxlIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2Nsb25lJywgWyckZXZlbnQnXSlcbiAgb25DbG9uZShjb250ZXh0OiBEZXRhaWxlZENvbnRleHQpIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0ge1xuICAgICAgdGl0bGU6IGNvbnRleHQudGl0bGUgKyAnLWNvcHknLFxuICAgICAgdXJpOiBjb250ZXh0LnVyaSArICctY29weSdcbiAgICB9O1xuICAgIHRoaXMuY29udGV4dFNlcnZpY2UuY2xvbmUoY29udGV4dC5pZCwgcHJvcGVydGllcykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2Uuc3VjY2VzcyhcbiAgICAgICAgJ2lnby5jb250ZXh0LmNvbnRleHRNYW5hZ2VyLmRpYWxvZy5jbG9uZU1zZycsXG4gICAgICAgICdpZ28uY29udGV4dC5jb250ZXh0TWFuYWdlci5kaWFsb2cuY2xvbmVUaXRsZScsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgeyB2YWx1ZTogY29udGV4dC50aXRsZSB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY3JlYXRlJywgWyckZXZlbnQnXSlcbiAgb25DcmVhdGUob3B0czogeyB0aXRsZTogc3RyaW5nOyBlbXB0eTogYm9vbGVhbiB9KSB7XG4gICAgY29uc3QgeyB0aXRsZSwgZW1wdHkgfSA9IG9wdHM7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dFNlcnZpY2UuZ2V0Q29udGV4dEZyb21NYXAoXG4gICAgICB0aGlzLmNvbXBvbmVudC5tYXAsXG4gICAgICBlbXB0eVxuICAgICk7XG4gICAgY29udGV4dC50aXRsZSA9IHRpdGxlO1xuICAgIHRoaXMuY29udGV4dFNlcnZpY2UuY3JlYXRlKGNvbnRleHQpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnN1Y2Nlc3MoXG4gICAgICAgICdpZ28uY29udGV4dC5ib29rbWFya0J1dHRvbi5kaWFsb2cuY3JlYXRlTXNnJyxcbiAgICAgICAgJ2lnby5jb250ZXh0LmJvb2ttYXJrQnV0dG9uLmRpYWxvZy5jcmVhdGVUaXRsZScsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgeyB2YWx1ZTogY29udGV4dC50aXRsZSB9XG4gICAgICApO1xuICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5sb2FkQ29udGV4dChjb250ZXh0LnVyaSk7XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdmaWx0ZXJQZXJtaXNzaW9uc0NoYW5nZWQnKVxuICBsb2FkQ29udGV4dHMoKSB7XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSBbJ25vbmUnXTtcbiAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy5jb21wb25lbnQucGVybWlzc2lvbnMpIHtcbiAgICAgIGlmIChwLmNoZWNrZWQgPT09IHRydWUgfHwgcC5pbmRldGVybWluYXRlID09PSB0cnVlKSB7XG4gICAgICAgIHBlcm1pc3Npb25zLnB1c2gocC5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmxvYWRDb250ZXh0cyhwZXJtaXNzaW9ucywgdGhpcy5jb21wb25lbnQuc2hvd0hpZGRlbik7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdzaG93SGlkZGVuQ29udGV4dHMnKVxuICBzaG93SGlkZGVuQ29udGV4dHMoKSB7XG4gICAgdGhpcy5jb21wb25lbnQuc2hvd0hpZGRlbiA9ICF0aGlzLmNvbXBvbmVudC5zaG93SGlkZGVuO1xuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KCdjb250ZXh0cy5zaG93SGlkZGVuJywgdGhpcy5jb21wb25lbnQuc2hvd0hpZGRlbik7XG4gICAgdGhpcy5sb2FkQ29udGV4dHMoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3Nob3cnLCBbJyRldmVudCddKVxuICBvblNob3dDb250ZXh0KGNvbnRleHQ6IERldGFpbGVkQ29udGV4dCkge1xuICAgIHRoaXMuY29udGV4dFNlcnZpY2Uuc2hvd0NvbnRleHQoY29udGV4dC5pZCkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdoaWRlJywgWyckZXZlbnQnXSlcbiAgb25IaWRlQ29udGV4dChjb250ZXh0OiBEZXRhaWxlZENvbnRleHQpIHtcbiAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmhpZGVDb250ZXh0KGNvbnRleHQuaWQpLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQFNlbGYoKSBjb21wb25lbnQ6IENvbnRleHRMaXN0Q29tcG9uZW50LFxuICAgIHByaXZhdGUgY29udGV4dFNlcnZpY2U6IENvbnRleHRTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWFwU2VydmljZTogTWFwU2VydmljZSxcbiAgICBwcml2YXRlIGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlybURpYWxvZ1NlcnZpY2U6IENvbmZpcm1EaWFsb2dTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXV0aDogQXV0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyBPdmVycmlkZSBpbnB1dCBjb250ZXh0c1xuICAgIHRoaXMuY29tcG9uZW50LmNvbnRleHRzID0geyBvdXJzOiBbXSB9O1xuICAgIHRoaXMuY29tcG9uZW50LnNob3dIaWRkZW4gPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldChcbiAgICAgICdjb250ZXh0cy5zaG93SGlkZGVuJ1xuICAgICkgYXMgYm9vbGVhbjtcblxuICAgIHRoaXMuY29udGV4dHMkJCA9IHRoaXMuY29udGV4dFNlcnZpY2UuY29udGV4dHMkLnN1YnNjcmliZSgoY29udGV4dHMpID0+XG4gICAgICB0aGlzLmhhbmRsZUNvbnRleHRzQ2hhbmdlKGNvbnRleHRzKVxuICAgICk7XG5cbiAgICB0aGlzLmRlZmF1bHRDb250ZXh0SWQkJCA9IHRoaXMuY29udGV4dFNlcnZpY2UuZGVmYXVsdENvbnRleHRJZCQuc3Vic2NyaWJlKFxuICAgICAgKGlkKSA9PiB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50LmRlZmF1bHRDb250ZXh0SWQgPSBpZDtcbiAgICAgIH1cbiAgICApO1xuICAgIGNvbnN0IHN0b3JlZENvbnRleHRVcmkgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldChcbiAgICAgICdmYXZvcml0ZS5jb250ZXh0LnVyaSdcbiAgICApIGFzIHN0cmluZztcbiAgICBpZiAoc3RvcmVkQ29udGV4dFVyaSAmJiAhdGhpcy5hdXRoLmF1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIHRoaXMuY29udGV4dFNlcnZpY2UuZGVmYXVsdENvbnRleHRJZCQubmV4dChzdG9yZWRDb250ZXh0VXJpKTtcbiAgICB9XG5cbiAgICAvLyBTZWUgZmVhdHVyZS1saXN0LmNvbXBvbmVudCBmb3IgYW4gZXhwbGFuYXRpb24gYWJvdXQgdGhlIGRlYm91bmNlIHRpbWVcbiAgICB0aGlzLnNlbGVjdGVkQ29udGV4dCQkID0gdGhpcy5jb250ZXh0U2VydmljZS5jb250ZXh0JFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDEwMCkpXG4gICAgICAuc3Vic2NyaWJlKChjb250ZXh0KSA9PiAodGhpcy5jb21wb25lbnQuc2VsZWN0ZWRDb250ZXh0ID0gY29udGV4dCkpO1xuXG4gICAgdGhpcy5hdXRoLmF1dGhlbnRpY2F0ZSQuc3Vic2NyaWJlKChhdXRoZW50aWNhdGUpID0+IHtcbiAgICAgIGlmIChhdXRoZW50aWNhdGUpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5nZXRQcm9maWxCeVVzZXIoKS5zdWJzY3JpYmUoKHByb2ZpbHMpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudC51c2VycyA9IHByb2ZpbHM7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnQucGVybWlzc2lvbnMgPSBbXTtcbiAgICAgICAgICBjb25zdCBwcm9maWxzQWNjID0gdGhpcy5jb21wb25lbnQudXNlcnMucmVkdWNlKChhY2MsIGN1cikgPT4ge1xuICAgICAgICAgICAgYWNjID0gYWNjLmNvbmNhdChjdXIpO1xuICAgICAgICAgICAgYWNjID0gY3VyLmNoaWxkcyA/IGFjYy5jb25jYXQoY3VyLmNoaWxkcykgOiBhY2M7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sIFtdKTtcblxuICAgICAgICAgIGZvciAoY29uc3QgdXNlciBvZiBwcm9maWxzQWNjKSB7XG4gICAgICAgICAgICBjb25zdCBwZXJtaXNzaW9uOiBDb250ZXh0VXNlclBlcm1pc3Npb24gPSB7XG4gICAgICAgICAgICAgIG5hbWU6IHVzZXIubmFtZSxcbiAgICAgICAgICAgICAgY2hlY2tlZDogdGhpcy5zdG9yYWdlU2VydmljZS5nZXQoXG4gICAgICAgICAgICAgICAgJ2NvbnRleHRzLnBlcm1pc3Npb25zLicgKyB1c2VyLm5hbWVcbiAgICAgICAgICAgICAgKSBhcyBib29sZWFuXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHBlcm1pc3Npb24uY2hlY2tlZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBwZXJtaXNzaW9uLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnQucGVybWlzc2lvbnMucHVzaChwZXJtaXNzaW9uKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IFsnbm9uZSddO1xuICAgICAgICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLmNvbXBvbmVudC5wZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgaWYgKHAuY2hlY2tlZCA9PT0gdHJ1ZSB8fCBwLmluZGV0ZXJtaW5hdGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChwLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuY29udGV4dFNlcnZpY2UubG9hZENvbnRleHRzKFxuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudC5zaG93SGlkZGVuXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmNvbnRleHRzJCQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnNlbGVjdGVkQ29udGV4dCQkLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kZWZhdWx0Q29udGV4dElkJCQudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ29udGV4dHNDaGFuZ2UoY29udGV4dHM6IENvbnRleHRzTGlzdCkge1xuICAgIHRoaXMuY29tcG9uZW50LmNvbnRleHRzID0gY29udGV4dHM7XG4gIH1cbn1cbiJdfQ==