@tuki-io/tuki-widgets 0.0.190 → 0.0.192

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 (30) hide show
  1. package/esm2020/user-creation/src/app.constants.mjs +9 -2
  2. package/esm2020/user-creation/src/interfaces/user-creation-wizard.interfaces.mjs +19 -0
  3. package/esm2020/user-creation/src/shared/material.module.mjs +35 -7
  4. package/esm2020/user-creation/src/shared/services/user-creation-api.service.mjs +42 -19
  5. package/esm2020/user-creation/src/user-creation.module.mjs +4 -1
  6. package/esm2020/user-creation/src/utils/app-loader/app-loader.mjs +14 -0
  7. package/esm2020/user-creation/src/utils/build-savable-end-user.mjs +147 -0
  8. package/esm2020/user-creation/src/utils/validation.mjs +14 -0
  9. package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-details-step/user-details-step.component.mjs +429 -20
  10. package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-overview-step/user-overview-step.component.mjs +3 -3
  11. package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-template-step/user-template-step.component.mjs +80 -34
  12. package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.component.mjs +61 -11
  13. package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.service.mjs +509 -130
  14. package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs +1446 -300
  15. package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
  16. package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs +1408 -287
  17. package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
  18. package/package.json +1 -1
  19. package/user-creation/src/app.constants.d.ts +7 -0
  20. package/user-creation/src/interfaces/user-creation-wizard.interfaces.d.ts +483 -0
  21. package/user-creation/src/shared/material.module.d.ts +5 -1
  22. package/user-creation/src/shared/services/user-creation-api.service.d.ts +8 -2
  23. package/user-creation/src/user-creation.module.d.ts +11 -10
  24. package/user-creation/src/utils/app-loader/app-loader.d.ts +6 -0
  25. package/user-creation/src/utils/build-savable-end-user.d.ts +23 -0
  26. package/user-creation/src/utils/validation.d.ts +4 -0
  27. package/user-creation/src/widgets/user-creation-wizard/components/user-details-step/user-details-step.component.d.ts +75 -7
  28. package/user-creation/src/widgets/user-creation-wizard/components/user-template-step/user-template-step.component.d.ts +11 -4
  29. package/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.component.d.ts +13 -0
  30. package/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.service.d.ts +57 -56
@@ -1,29 +1,438 @@
1
- import { Component } from "@angular/core";
1
+ import { Component, EventEmitter, Output } from '@angular/core';
2
+ import { Validators, } from '@angular/forms';
3
+ import { catchError, debounceTime, finalize, map, of, startWith, Subject, switchMap, take, takeUntil, tap, timer, } from 'rxjs';
4
+ import { Validation } from '../../../../utils/validation';
2
5
  import * as i0 from "@angular/core";
3
- import * as i1 from "../../user-creation-wizard.service";
4
- import * as i2 from "@angular/common";
5
- import * as i3 from "@angular/material/table";
6
- import * as i4 from "@angular/material/button";
7
- import * as i5 from "@angular/material/form-field";
8
- import * as i6 from "@angular/material/input";
9
- import * as i7 from "@angular/material/select";
10
- import * as i8 from "@angular/material/core";
11
- import * as i9 from "@angular/material/expansion";
6
+ import * as i1 from "@angular/forms";
7
+ import * as i2 from "../../../../shared/services/user-creation-api.service";
8
+ import * as i3 from "../../user-creation-wizard.service";
9
+ import * as i4 from "@angular/common";
10
+ import * as i5 from "@angular/material/table";
11
+ import * as i6 from "@angular/material/button";
12
+ import * as i7 from "@angular/material/icon";
13
+ import * as i8 from "@angular/material/form-field";
14
+ import * as i9 from "@angular/material/input";
15
+ import * as i10 from "@angular/material/select";
16
+ import * as i11 from "@angular/material/core";
17
+ import * as i12 from "@angular/material/autocomplete";
18
+ import * as i13 from "@angular/material/paginator";
19
+ import * as i14 from "@angular/material/chips";
20
+ import * as i15 from "@angular/material/expansion";
21
+ import * as i16 from "../../../../utils/app-loader/app-loader";
22
+ const LDAP_PAGE_SIZE = 10;
12
23
  export class UserDetailsStepComponent {
13
- constructor(userCreationWizardService) {
24
+ get linesFormArray() {
25
+ return this.userDetailsForm.get('lines');
26
+ }
27
+ get devicesFormArray() {
28
+ return this.userDetailsForm.get('devices');
29
+ }
30
+ get deviceProfilesFormArray() {
31
+ return this.userDetailsForm.get('deviceProfiles');
32
+ }
33
+ get selectedLdapUser() {
34
+ return this.userCreationWizardService.selectedLdapUser;
35
+ }
36
+ get ldapTotalCount() {
37
+ return this.userCreationWizardService.ldapUsersTotal;
38
+ }
39
+ get hasLdapUsers() {
40
+ return this.userCreationWizardService.ldapUsers.length > 0;
41
+ }
42
+ constructor(fb, userCreationApiService, userCreationWizardService) {
43
+ this.fb = fb;
44
+ this.userCreationApiService = userCreationApiService;
14
45
  this.userCreationWizardService = userCreationWizardService;
46
+ this.validityChange = new EventEmitter();
47
+ this.userIdCheckPending = false;
48
+ this.loadingAvailableNumbers = false;
49
+ this.ldapLoading = false;
50
+ this.ldapSearchAttempted = false;
51
+ this.ldapPageSize = LDAP_PAGE_SIZE;
52
+ this.ldapPageIndex = 0;
53
+ this.ldapQueryTypeOptions = [
54
+ { label: 'User ID', value: 'userId' },
55
+ { label: 'First Name', value: 'firstName' },
56
+ { label: 'Last Name', value: 'lastName' },
57
+ ];
58
+ this.filteredAvailableNumbersByLine = [];
59
+ this.filteredRoutePartitionsByLine = [];
60
+ this.destroy$ = new Subject();
61
+ this.userIdAsyncValidator = this.createUserIdAsyncValidator();
62
+ this.ldapSearchForm = this.fb.group({
63
+ queryValue: [''],
64
+ queryType: ['userId'],
65
+ });
66
+ this.userDetailsForm = this.fb.group({
67
+ userId: ['', [Validators.required], [this.userIdAsyncValidator]],
68
+ firstName: ['', Validators.required],
69
+ lastName: ['', Validators.required],
70
+ email: ['', [Validators.required, Validators.email]],
71
+ lines: this.fb.array([]),
72
+ devices: this.fb.array([]),
73
+ deviceProfiles: this.fb.array([]),
74
+ });
75
+ }
76
+ ngOnInit() {
77
+ this.buildDynamicFormArrays();
78
+ this.patchUserFieldsFromService();
79
+ this.initLineFilters();
80
+ this.setupFormSync();
81
+ this.setupValidityEmitter();
82
+ this.fetchInitialAvailableNumbers();
83
+ this.userCreationWizardService.applyUserDetailsFormValue(this.userDetailsForm.getRawValue());
84
+ if (this.userCreationWizardService.isLdapIntegrated && this.selectedLdapUser) {
85
+ this.applyLdapIntegratedFormState();
86
+ }
87
+ this.emitValidity();
88
+ }
89
+ ngOnDestroy() {
90
+ this.destroy$.next();
91
+ this.destroy$.complete();
92
+ }
93
+ isStepValid() {
94
+ return this.userDetailsForm.valid && !this.userIdCheckPending;
95
+ }
96
+ markAllAsTouched() {
97
+ this.userDetailsForm.markAllAsTouched();
98
+ this.emitValidity();
99
+ }
100
+ syncToService() {
101
+ this.userCreationWizardService.applyUserDetailsFormValue(this.userDetailsForm.getRawValue());
102
+ }
103
+ getLineGroup(index) {
104
+ return this.linesFormArray.at(index);
105
+ }
106
+ getDeviceGroup(index) {
107
+ return this.devicesFormArray.at(index);
108
+ }
109
+ getDeviceProfileGroup(index) {
110
+ return this.deviceProfilesFormArray.at(index);
111
+ }
112
+ getFilteredNumbers(lineIndex) {
113
+ return this.filteredAvailableNumbersByLine[lineIndex] ?? [];
114
+ }
115
+ getFilteredRoutePartitions(lineIndex) {
116
+ return this.filteredRoutePartitionsByLine[lineIndex] ?? [];
117
+ }
118
+ filterAvailableNumbers(lineIndex, event) {
119
+ const raw = event.target?.value || '';
120
+ this.applyNumberFilter(lineIndex, raw);
121
+ }
122
+ filterRoutePartitions(lineIndex, event) {
123
+ const raw = event.target?.value || '';
124
+ this.applyRoutePartitionFilter(lineIndex, raw);
125
+ }
126
+ onRoutePartitionSelected(lineIndex, routePartition) {
127
+ const lineGroup = this.linesFormArray.at(lineIndex);
128
+ lineGroup.get('routePartition')?.setValue(routePartition, { emitEvent: false });
129
+ lineGroup.get('number')?.setValue('');
130
+ this.applyRoutePartitionFilter(lineIndex, routePartition);
131
+ this.loadAvailableNumbersForLine(lineIndex, routePartition);
132
+ }
133
+ onNumberSelected(lineIndex, number) {
134
+ const lineGroup = this.linesFormArray.at(lineIndex);
135
+ const displayNumber = this.extractDirectoryNumber(number);
136
+ lineGroup.get('number')?.setValue(displayNumber, { emitEvent: true });
137
+ }
138
+ searchLdapUsers(pageIndex = 0) {
139
+ const queryValue = String(this.ldapSearchForm.get('queryValue')?.value).trim() || undefined;
140
+ const siteId = this.userCreationWizardService.selectedSite;
141
+ if (!siteId) {
142
+ this.userCreationWizardService.setLdapUsersResult([], 0);
143
+ this.ldapPageIndex = 0;
144
+ this.ldapSearchAttempted = false;
145
+ return;
146
+ }
147
+ this.ldapPageIndex = pageIndex;
148
+ const queryType = this.ldapSearchForm.get('queryType')?.value;
149
+ const params = {
150
+ size: String(LDAP_PAGE_SIZE),
151
+ page: String(pageIndex),
152
+ deviceless: 'true',
153
+ querytype: queryType,
154
+ withEmailOnly: 'true',
155
+ queryvalue: queryValue,
156
+ };
157
+ this.ldapLoading = true;
158
+ this.userCreationApiService
159
+ .getLdapUsers(String(siteId), params)
160
+ .pipe(take(1), map((res) => ({
161
+ users: res?.pageData ?? [],
162
+ total: res?.total ?? 0,
163
+ })), catchError(() => of({ users: [], total: 0 })), finalize(() => {
164
+ this.ldapLoading = false;
165
+ }))
166
+ .subscribe(({ users, total }) => {
167
+ this.ldapSearchAttempted = true;
168
+ this.userCreationWizardService.setLdapUsersResult(users, total);
169
+ });
170
+ }
171
+ onLdapPageChange(event) {
172
+ this.searchLdapUsers(event.pageIndex);
173
+ }
174
+ onAddLdapUser(row) {
175
+ this.userCreationWizardService.selectLdapUser(row);
176
+ this.userDetailsForm.patchValue({
177
+ userId: row.userid,
178
+ firstName: row.firstName ?? '',
179
+ lastName: row.lastName ?? '',
180
+ email: row.email ?? '',
181
+ });
182
+ this.applyLdapIntegratedFormState();
183
+ this.emitValidity();
184
+ }
185
+ onDeleteLdapUser(row) {
186
+ if (!this.userCreationWizardService.isLdapUserRowSelected(row)) {
187
+ return;
188
+ }
189
+ this.clearLdapSelection();
190
+ }
191
+ onRemoveLdapTag() {
192
+ this.clearLdapSelection();
193
+ }
194
+ isLdapUserRowSelected(row) {
195
+ return this.userCreationWizardService.isLdapUserRowSelected(row);
196
+ }
197
+ clearLdapSelection() {
198
+ this.userCreationWizardService.clearLdapUserSelection();
199
+ this.userDetailsForm.patchValue({
200
+ userId: '',
201
+ firstName: '',
202
+ lastName: '',
203
+ email: '',
204
+ });
205
+ this.restoreManualEntryFormState();
206
+ this.emitValidity();
207
+ }
208
+ applyLdapIntegratedFormState() {
209
+ this.setUserIdentityFieldsReadonly(true);
210
+ this.toggleUserIdAsyncValidator(false);
211
+ this.userDetailsForm.get('userId')?.updateValueAndValidity({ emitEvent: false });
212
+ }
213
+ restoreManualEntryFormState() {
214
+ this.setUserIdentityFieldsReadonly(false);
215
+ this.toggleUserIdAsyncValidator(true);
216
+ this.userDetailsForm.get('userId')?.updateValueAndValidity();
217
+ }
218
+ setUserIdentityFieldsReadonly(readonly) {
219
+ ['userId', 'firstName', 'lastName', 'email'].forEach(fieldName => {
220
+ const control = this.userDetailsForm.get(fieldName);
221
+ if (!control) {
222
+ return;
223
+ }
224
+ if (readonly) {
225
+ control.disable({ emitEvent: false });
226
+ }
227
+ else {
228
+ control.enable({ emitEvent: false });
229
+ }
230
+ });
231
+ }
232
+ toggleUserIdAsyncValidator(enabled) {
233
+ const control = this.userDetailsForm.get('userId');
234
+ if (!control) {
235
+ return;
236
+ }
237
+ if (enabled) {
238
+ control.setAsyncValidators([this.userIdAsyncValidator]);
239
+ }
240
+ else {
241
+ control.clearAsyncValidators();
242
+ }
243
+ control.updateValueAndValidity({ emitEvent: false });
244
+ }
245
+ setupValidityEmitter() {
246
+ this.userDetailsForm.statusChanges
247
+ .pipe(startWith(this.userDetailsForm.status), takeUntil(this.destroy$))
248
+ .subscribe(() => this.emitValidity());
249
+ }
250
+ emitValidity() {
251
+ this.validityChange.emit(this.isStepValid());
252
+ }
253
+ buildDynamicFormArrays() {
254
+ const service = this.userCreationWizardService;
255
+ const linesArray = this.linesFormArray;
256
+ const devicesArray = this.devicesFormArray;
257
+ const profilesArray = this.deviceProfilesFormArray;
258
+ while (linesArray.length) {
259
+ linesArray.removeAt(0);
260
+ }
261
+ while (devicesArray.length) {
262
+ devicesArray.removeAt(0);
263
+ }
264
+ while (profilesArray.length) {
265
+ profilesArray.removeAt(0);
266
+ }
267
+ service.lines.forEach((line, index) => {
268
+ const lineGroup = this.fb.group({
269
+ lineNumber: [
270
+ {
271
+ value: line.directoryNumber?.templateDirectoryNumber || '',
272
+ disabled: true,
273
+ },
274
+ ],
275
+ number: [line.directoryNumber?.directoryNumber || '', Validators.required],
276
+ routePartition: [
277
+ line.directoryNumber?.routePartitionName || '',
278
+ Validators.required,
279
+ ],
280
+ });
281
+ linesArray.push(lineGroup);
282
+ this.setupLineListeners(index, lineGroup);
283
+ });
284
+ service.devices.forEach(device => {
285
+ devicesArray.push(this.fb.group({
286
+ deviceType: [{ value: device.deviceType || '', disabled: true }],
287
+ protocol: [{ value: device.protocol || '', disabled: true }],
288
+ buttonTemplate: [{ value: device.buttonTemplate || '', disabled: true }],
289
+ name: ['', [Validators.required, Validation.macAddress()]],
290
+ }));
291
+ });
292
+ service.deviceProfiles.forEach(profile => {
293
+ profilesArray.push(this.fb.group({
294
+ deviceType: [{ value: profile.deviceType || '', disabled: true }],
295
+ protocol: [{ value: profile.protocol || '', disabled: true }],
296
+ buttonTemplate: [{ value: profile.buttonTemplate || '', disabled: true }],
297
+ name: ['', [Validation.macAddress()]],
298
+ }));
299
+ });
300
+ }
301
+ patchUserFieldsFromService() {
302
+ const endUser = this.userCreationWizardService.endUser;
303
+ this.userDetailsForm.patchValue({
304
+ userId: endUser?.userid || this.userCreationWizardService.userDetailsForm.userId || '',
305
+ firstName: endUser?.firstName || this.userCreationWizardService.userDetailsForm.firstName || '',
306
+ lastName: endUser?.lastName || this.userCreationWizardService.userDetailsForm.lastName || '',
307
+ email: endUser?.email || this.userCreationWizardService.userDetailsForm.email || '',
308
+ });
309
+ }
310
+ setupLineListeners(lineIndex, lineGroup) {
311
+ lineGroup
312
+ .get('routePartition')
313
+ ?.valueChanges.pipe(debounceTime(300), takeUntil(this.destroy$))
314
+ .subscribe(value => {
315
+ this.applyRoutePartitionFilter(lineIndex, String(value ?? ''));
316
+ });
317
+ lineGroup
318
+ .get('number')
319
+ ?.valueChanges.pipe(debounceTime(150), takeUntil(this.destroy$))
320
+ .subscribe(value => {
321
+ this.applyNumberFilter(lineIndex, String(value ?? ''));
322
+ });
323
+ }
324
+ initLineFilters() {
325
+ const partitions = this.userCreationWizardService.routePartitionOptions;
326
+ const numbers = this.userCreationWizardService.availableNumbers;
327
+ this.filteredRoutePartitionsByLine = this.linesFormArray.controls.map((_, index) => {
328
+ const current = String(this.linesFormArray.at(index).get('routePartition')?.value ?? '');
329
+ return this.filterOptions(partitions, current);
330
+ });
331
+ this.filteredAvailableNumbersByLine = this.linesFormArray.controls.map((_, index) => {
332
+ const current = String(this.linesFormArray.at(index).get('number')?.value ?? '');
333
+ return this.filterOptions(numbers, current);
334
+ });
335
+ }
336
+ setupFormSync() {
337
+ this.userDetailsForm.valueChanges
338
+ .pipe(debounceTime(200), takeUntil(this.destroy$))
339
+ .subscribe(() => {
340
+ this.userCreationWizardService.applyUserDetailsFormValue(this.userDetailsForm.getRawValue());
341
+ });
342
+ }
343
+ fetchInitialAvailableNumbers() {
344
+ const firstPartition = this.linesFormArray.length > 0
345
+ ? String(this.linesFormArray.at(0).get('routePartition')?.value ?? '').trim()
346
+ : this.userCreationWizardService.firstLineRoutePartition ||
347
+ this.userCreationWizardService.siteDefaultRoutePartition ||
348
+ '';
349
+ if (firstPartition) {
350
+ this.loadAvailableNumbersForLine(0, firstPartition, false);
351
+ }
352
+ }
353
+ loadAvailableNumbersForLine(lineIndex, routePartition, clearNumber = true) {
354
+ const siteId = this.userCreationWizardService.selectedSite;
355
+ if (!siteId || !routePartition.trim()) {
356
+ return;
357
+ }
358
+ if (clearNumber) {
359
+ this.linesFormArray.at(lineIndex).get('number')?.setValue('');
360
+ }
361
+ this.loadingAvailableNumbers = true;
362
+ this.userCreationWizardService
363
+ .getNumberRange(String(siteId), routePartition)
364
+ .pipe(take(1), catchError(() => of(null)), finalize(() => {
365
+ this.loadingAvailableNumbers = false;
366
+ this.refreshNumberFilters();
367
+ }))
368
+ .subscribe();
369
+ }
370
+ refreshNumberFilters() {
371
+ const numbers = this.userCreationWizardService.availableNumbers;
372
+ this.filteredAvailableNumbersByLine = this.linesFormArray.controls.map((_, index) => {
373
+ const current = String(this.linesFormArray.at(index).get('number')?.value ?? '');
374
+ return this.filterOptions(numbers, current);
375
+ });
376
+ }
377
+ applyNumberFilter(lineIndex, raw) {
378
+ const value = raw.trim().toLowerCase();
379
+ const source = this.userCreationWizardService.availableNumbers || [];
380
+ this.filteredAvailableNumbersByLine[lineIndex] = value.length
381
+ ? source.filter(n => !!n && n.toLowerCase().includes(value))
382
+ : [...source];
383
+ }
384
+ applyRoutePartitionFilter(lineIndex, raw) {
385
+ const value = raw.trim().toLowerCase();
386
+ const source = this.userCreationWizardService.routePartitionOptions || [];
387
+ this.filteredRoutePartitionsByLine[lineIndex] = value.length
388
+ ? source.filter(n => !!n && n.toLowerCase().includes(value))
389
+ : [...source];
390
+ }
391
+ filterOptions(source, raw) {
392
+ const value = raw.trim().toLowerCase();
393
+ if (!value.length) {
394
+ return [...source];
395
+ }
396
+ return source.filter(item => !!item && item.toLowerCase().includes(value));
15
397
  }
16
- onAddUser(row) {
17
- this.userCreationWizardService.addLdapUser(row);
398
+ extractDirectoryNumber(value) {
399
+ const trimmed = value.trim();
400
+ const spaceIndex = trimmed.indexOf(' ');
401
+ return spaceIndex > -1 ? trimmed.substring(0, spaceIndex) : trimmed;
18
402
  }
19
- getDeviceName(index) {
20
- return this.userCreationWizardService.getDeviceDisplayName(index);
403
+ createUserIdAsyncValidator() {
404
+ return (control) => {
405
+ if (this.userCreationWizardService.isLdapIntegrated) {
406
+ this.userIdCheckPending = false;
407
+ return of(null);
408
+ }
409
+ const userId = String(control.value ?? '').trim();
410
+ const siteId = this.userCreationWizardService.selectedSite;
411
+ if (!userId || !siteId) {
412
+ this.userIdCheckPending = false;
413
+ this.emitValidity();
414
+ return of(null);
415
+ }
416
+ this.userIdCheckPending = true;
417
+ this.emitValidity();
418
+ return timer(500).pipe(switchMap(() => this.userCreationApiService
419
+ .checkUserIdExisting(String(siteId), encodeURIComponent(encodeURIComponent(userId)))
420
+ .pipe(map(() => ({ userIdExists: true })), catchError(() => of(null)))), tap(() => {
421
+ this.userIdCheckPending = false;
422
+ this.emitValidity();
423
+ }), finalize(() => {
424
+ this.userIdCheckPending = false;
425
+ this.emitValidity();
426
+ }));
427
+ };
21
428
  }
22
429
  }
23
- UserDetailsStepComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserDetailsStepComponent, deps: [{ token: i1.UserCreationWizardService }], target: i0.ɵɵFactoryTarget.Component });
24
- UserDetailsStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: UserDetailsStepComponent, selector: "tk-user-details-step", ngImport: i0, template: "<section class=\"details-step-content\">\r\n <div class=\"details-step-sections\">\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">User details</h3>\r\n <div class=\"details-step-section__content\">\r\n <div class=\"details-step-section__part\">\r\n <div class=\"details-inline-fields\">\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">User ID</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"User ID\"\r\n [value]=\"userCreationWizardService.userDetailsForm.userId\"\r\n (input)=\"\r\n userCreationWizardService.setUserDetailsField(\r\n 'userId',\r\n $any($event.target).value\r\n )\r\n \"\r\n />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">First Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"First Name\"\r\n [value]=\"userCreationWizardService.userDetailsForm.firstName\"\r\n (input)=\"\r\n userCreationWizardService.setUserDetailsField(\r\n 'firstName',\r\n $any($event.target).value\r\n )\r\n \"\r\n />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Last Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"Last Name\"\r\n [value]=\"userCreationWizardService.userDetailsForm.lastName\"\r\n (input)=\"\r\n userCreationWizardService.setUserDetailsField(\r\n 'lastName',\r\n $any($event.target).value\r\n )\r\n \"\r\n />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Email</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"Email\"\r\n [value]=\"userCreationWizardService.userDetailsForm.email\"\r\n (input)=\"\r\n userCreationWizardService.setUserDetailsField(\r\n 'email',\r\n $any($event.target).value\r\n )\r\n \"\r\n />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">User Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"User Template\"\r\n [value]=\"userCreationWizardService.selectedTemplate || ''\"\r\n [disabled]=\"true\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"details-step-section__part\">\r\n <mat-accordion class=\"details-user-accordion\">\r\n <mat-expansion-panel togglePosition=\"before\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n >Choose an existing or a LDAP user</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <div class=\"details-user-accordion__content\">\r\n <table\r\n mat-table\r\n [dataSource]=\"userCreationWizardService.ldapUsers\"\r\n class=\"details-ldap-table\"\r\n >\r\n <ng-container matColumnDef=\"userId\">\r\n <th mat-header-cell *matHeaderCellDef>User ID</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.userId }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"firstName\">\r\n <th mat-header-cell *matHeaderCellDef>First Name</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.firstName }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"lastName\">\r\n <th mat-header-cell *matHeaderCellDef>Last Name</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.lastName }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"email\">\r\n <th mat-header-cell *matHeaderCellDef>Email</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.email }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"add\">\r\n <th mat-header-cell *matHeaderCellDef>Add</th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <button\r\n mat-button\r\n class=\"details-ldap-table__add-btn\"\r\n type=\"button\"\r\n [disabled]=\"\r\n userCreationWizardService.isLdapUserAdded(row)\r\n \"\r\n (click)=\"onAddUser(row)\"\r\n >\r\n Add user\r\n </button>\r\n </td>\r\n </ng-container>\r\n\r\n <tr\r\n mat-header-row\r\n *matHeaderRowDef=\"\r\n userCreationWizardService.ldapTableColumns\r\n \"\r\n ></tr>\r\n <tr\r\n mat-row\r\n *matRowDef=\"\r\n let row;\r\n columns: userCreationWizardService.ldapTableColumns\r\n \"\r\n [class.details-ldap-table__row--disabled]=\"\r\n userCreationWizardService.isLdapUserAdded(row)\r\n \"\r\n ></tr>\r\n </table>\r\n </div>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">Lines</h3>\r\n <div class=\"details-step-section__content\">\r\n <div class=\"line-route-list\">\r\n <div\r\n class=\"line-route-row\"\r\n *ngFor=\"\r\n let lineSelection of userCreationWizardService.lineSelections;\r\n let idx = index\r\n \"\r\n >\r\n <div class=\"line-route-field\">\r\n <mat-form-field\r\n class=\"details-step-select line-route-select\"\r\n appearance=\"outline\"\r\n >\r\n <mat-select\r\n placeholder=\"Select line\"\r\n [value]=\"lineSelection.lineNumber\"\r\n (selectionChange)=\"\r\n userCreationWizardService.setLineSelection(\r\n idx,\r\n $event.value\r\n )\r\n \"\r\n >\r\n <mat-option\r\n *ngFor=\"let line of userCreationWizardService.lineOptions\"\r\n [value]=\"line.number\"\r\n >\r\n {{ line.number }} - {{ line.did }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"line-route-field\">\r\n <mat-form-field\r\n class=\"details-step-select line-route-select\"\r\n appearance=\"outline\"\r\n >\r\n <mat-select\r\n placeholder=\"Select route partition\"\r\n [value]=\"lineSelection.routePartitionName\"\r\n (selectionChange)=\"\r\n userCreationWizardService.setRoutePartitionSelection(\r\n idx,\r\n $event.value\r\n )\r\n \"\r\n >\r\n <mat-option\r\n *ngFor=\"\r\n let partition of userCreationWizardService.routePartitionOptions\r\n \"\r\n [value]=\"partition\"\r\n >\r\n {{ partition }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">Devices</h3>\r\n <div class=\"details-step-section__content\">\r\n <div class=\"devices-rows\">\r\n <div\r\n class=\"details-inline-fields details-inline-fields--four\"\r\n *ngFor=\"\r\n let _row of userCreationWizardService.deviceRows;\r\n let idx = index\r\n \"\r\n >\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Device type</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"Device type\"\r\n [value]=\"\r\n userCreationWizardService.deviceEntries[idx].deviceType ||\r\n ''\r\n \"\r\n [disabled]=\"true\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Protocol</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"Protocol\"\r\n [value]=\"\r\n userCreationWizardService.deviceEntries[idx].protocol || ''\r\n \"\r\n [disabled]=\"true\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Button Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"Button Template\"\r\n [value]=\"\r\n userCreationWizardService.deviceEntries[idx]\r\n .buttonTemplate || ''\r\n \"\r\n [disabled]=\"true\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"Name\"\r\n [value]=\"getDeviceName(idx)\"\r\n (input)=\"\r\n userCreationWizardService.setDeviceName(\r\n idx,\r\n $any($event.target).value\r\n )\r\n \"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n</section>\r\n", styles: [".details-step-content{display:flex;flex-direction:column;gap:0}.details-step-dropdowns{display:flex;flex-direction:column;gap:1rem}.details-step-field{display:flex;flex-direction:column;gap:8px}.details-step-label{font-size:16px;font-weight:400;line-height:100%;letter-spacing:0;color:#333}.details-step-select{width:333px}.details-step-divider{border-top:1px solid #d9d9d9;margin-top:24px}.details-step-sections{display:flex;flex-direction:column}.details-step-section{display:flex;flex-direction:column;gap:0;padding:24px 0}.details-step-sections>.details-step-section:first-child{padding-top:0}.details-step-section+.details-step-section{border-top:1px solid #d9d9d9}.details-step-section__title{margin:0;font-family:Inter,sans-serif;font-size:16px;font-weight:600;line-height:100%;letter-spacing:0;color:#333}.details-step-section__content{margin-top:24px}.details-step-section__part+.details-step-section__part{margin-top:24px}.details-user-accordion{width:100%}.details-user-accordion__content{padding:12px 0 0}.details-ldap-table{width:100%}.details-ldap-table__row--disabled{opacity:.35}.details-ldap-table__add-btn{min-width:0;padding:0;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;letter-spacing:0;color:#0d56aa}:host ::ng-deep .details-ldap-table .mat-header-cell{font-family:Inter,sans-serif;font-size:12px;font-weight:500;line-height:16px;letter-spacing:0;color:#737480;height:30px;padding:7px 8px}:host ::ng-deep .details-ldap-table .mat-cell{font-family:Inter,sans-serif;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0;color:#333;height:40px;padding:8px}.details-inline-fields{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:16px}.details-inline-fields--four{grid-template-columns:repeat(4,minmax(0,1fr))}.devices-rows{display:flex;flex-direction:column;gap:24px}.details-inline-field{display:flex;flex-direction:column;gap:4px}.details-inline-field__label{color:#c0c2ce;font-size:12px;font-weight:400;line-height:16px;letter-spacing:0}.details-step-input{width:100%}.line-route-list{display:flex;flex-direction:column;gap:16px}.line-route-row{display:flex;gap:16px}.line-route-field{display:flex;flex-direction:column;gap:0}.line-route-field:nth-of-type(1) .line-route-select{width:230px}.line-route-field .line-route-select{width:185px}:host ::ng-deep .details-step-select .mat-form-field-wrapper{padding-bottom:0}:host ::ng-deep .details-step-input .mat-form-field-wrapper{padding-bottom:0}:host ::ng-deep .details-step-select .mat-form-field-flex{align-items:center;height:32px;border:1px solid #767676;border-radius:6px;padding:0 12px}:host ::ng-deep .details-step-input .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:4px;padding:10px 8px}:host ::ng-deep .details-step-select .mat-form-field-outline,:host ::ng-deep .details-step-select .mat-form-field-outline-start,:host ::ng-deep .details-step-select .mat-form-field-outline-end,:host ::ng-deep .details-step-select .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-step-input .mat-form-field-outline,:host ::ng-deep .details-step-input .mat-form-field-outline-start,:host ::ng-deep .details-step-input .mat-form-field-outline-end,:host ::ng-deep .details-step-input .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-step-select .mat-form-field-infix{width:100%;border-top:0;padding:0}:host ::ng-deep .details-step-input .mat-form-field-infix{width:100%;border-top:0;padding:0}:host ::ng-deep .details-step-select .mat-select-trigger{display:flex;align-items:center;justify-content:space-between;height:100%}:host ::ng-deep .details-step-input .mat-input-element{height:100%;margin:0}:host ::ng-deep .details-step-input.mat-form-field-disabled .mat-form-field-flex{background-color:#f5f6fa;border-color:#b8beca;opacity:.55;cursor:not-allowed}:host ::ng-deep .details-step-input .mat-input-element:disabled{color:#7f8694;-webkit-text-fill-color:#7f8694;cursor:not-allowed}:host ::ng-deep .details-user-accordion .mat-expansion-panel{border:0;border-radius:0!important;background:transparent;box-shadow:none!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header{padding:0 0 0 8px;min-height:32px;height:32px}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header-title{margin:0;display:flex;align-items:center;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;letter-spacing:0;color:#333}:host ::ng-deep .details-user-accordion .mat-expansion-panel-body{padding:0!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-content{display:flex;align-items:center}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-expansion-indicator{display:block!important;opacity:1!important;color:#333!important;align-self:center;margin:0 8px 0 0!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-expansion-indicator:after{color:#333!important;border-color:#333!important;position:relative;top:-4px}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i3.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i3.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i3.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i3.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i3.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i3.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i3.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i3.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i4.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.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: i7.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i9.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i9.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i9.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i9.MatExpansionPanelTitle, selector: "mat-panel-title" }] });
430
+ UserDetailsStepComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserDetailsStepComponent, deps: [{ token: i1.FormBuilder }, { token: i2.UserCreationApiService }, { token: i3.UserCreationWizardService }], target: i0.ɵɵFactoryTarget.Component });
431
+ UserDetailsStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: UserDetailsStepComponent, selector: "tk-user-details-step", outputs: { validityChange: "validityChange" }, ngImport: i0, template: "<app-loader *ngIf=\"loadingAvailableNumbers\"></app-loader>\r\n<section class=\"details-step-content\">\r\n <form [formGroup]=\"userDetailsForm\">\r\n <div class=\"details-step-sections\">\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">User details</h3>\r\n <div class=\"details-step-section__content\">\r\n <div class=\"details-step-section__part\">\r\n <div class=\"details-inline-fields\">\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">User ID</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"User ID\" formControlName=\"userId\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('userId')?.hasError('required') && userDetailsForm.get('userId')?.touched\">\r\n User ID is required\r\n </mat-error>\r\n <mat-error *ngIf=\"userDetailsForm.get('userId')?.hasError('userIdExists') && userDetailsForm.get('userId')?.touched\">\r\n User ID already exists\r\n </mat-error>\r\n <mat-hint *ngIf=\"userIdCheckPending\">Checking user ID...</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">First Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"First Name\" formControlName=\"firstName\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('firstName')?.hasError('required') && userDetailsForm.get('firstName')?.touched\">\r\n First name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Last Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"Last Name\" formControlName=\"lastName\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('lastName')?.hasError('required') && userDetailsForm.get('lastName')?.touched\">\r\n Last name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Email</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"Email\" formControlName=\"email\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('email')?.invalid && userDetailsForm.get('email')?.touched\">\r\n <span *ngIf=\"userDetailsForm.get('email')?.hasError('required')\">Email is required</span>\r\n <span *ngIf=\"userDetailsForm.get('email')?.hasError('email')\">Please enter a valid email</span>\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">User Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"User Template\"\r\n [value]=\"userCreationWizardService.selectedTemplateName || ''\"\r\n [disabled]=\"true\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"details-step-section__part\">\r\n <mat-accordion class=\"details-user-accordion\">\r\n <mat-expansion-panel togglePosition=\"before\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>Choose an existing or a LDAP user</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div class=\"details-user-accordion__content\">\r\n <div class=\"details-ldap-search\" [formGroup]=\"ldapSearchForm\">\r\n <mat-form-field\r\n class=\"details-ldap-search__input\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n >\r\n <input\r\n matInput\r\n placeholder=\"Search\"\r\n formControlName=\"queryValue\"\r\n (keyup.enter)=\"searchLdapUsers()\"\r\n />\r\n </mat-form-field>\r\n\r\n <mat-form-field\r\n class=\"details-ldap-search__select\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n >\r\n <mat-select formControlName=\"queryType\">\r\n <mat-option *ngFor=\"let option of ldapQueryTypeOptions\" [value]=\"option.value\">\r\n {{ option.label }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-chip-list *ngIf=\"selectedLdapUser\" class=\"details-ldap-search__chip\">\r\n <mat-chip removable (removed)=\"onRemoveLdapTag()\">\r\n {{ selectedLdapUser.userid }}\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n </mat-chip-list>\r\n\r\n <button\r\n mat-button\r\n class=\"details-ldap-search__btn\"\r\n type=\"button\"\r\n [disabled]=\"ldapLoading\"\r\n (click)=\"searchLdapUsers()\"\r\n >\r\n Search\r\n </button>\r\n </div>\r\n\r\n <app-loader *ngIf=\"ldapLoading\"></app-loader>\r\n\r\n <p\r\n *ngIf=\"!ldapLoading && ldapSearchAttempted && !hasLdapUsers\"\r\n class=\"details-ldap-table__empty\"\r\n >\r\n No users found\r\n </p>\r\n\r\n <table\r\n *ngIf=\"!ldapLoading && hasLdapUsers\"\r\n mat-table\r\n [dataSource]=\"userCreationWizardService.ldapUsers\"\r\n class=\"details-ldap-table\"\r\n >\r\n <ng-container matColumnDef=\"userId\">\r\n <th mat-header-cell *matHeaderCellDef>User Id</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.userid }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"firstName\">\r\n <th mat-header-cell *matHeaderCellDef>First Name</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.firstName }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"lastName\">\r\n <th mat-header-cell *matHeaderCellDef>Last Name</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.lastName }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"email\">\r\n <th mat-header-cell *matHeaderCellDef>Email</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.email }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"add\">\r\n <th mat-header-cell *matHeaderCellDef>Add</th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <button\r\n *ngIf=\"!isLdapUserRowSelected(row); else deleteLdapUserBtn\"\r\n mat-button\r\n class=\"details-ldap-table__add-btn\"\r\n type=\"button\"\r\n (click)=\"onAddLdapUser(row)\"\r\n >\r\n Add User\r\n </button>\r\n <ng-template #deleteLdapUserBtn>\r\n <button\r\n mat-button\r\n class=\"details-ldap-table__add-btn details-ldap-table__add-btn--delete\"\r\n type=\"button\"\r\n (click)=\"onDeleteLdapUser(row)\"\r\n >\r\n Delete user\r\n </button>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"userCreationWizardService.ldapTableColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: userCreationWizardService.ldapTableColumns\"></tr>\r\n </table>\r\n\r\n <mat-paginator\r\n *ngIf=\"!ldapLoading && hasLdapUsers\"\r\n class=\"details-ldap-paginator\"\r\n [length]=\"ldapTotalCount\"\r\n [pageSize]=\"ldapPageSize\"\r\n [pageIndex]=\"ldapPageIndex\"\r\n [pageSizeOptions]=\"[ldapPageSize]\"\r\n [hidePageSize]=\"true\"\r\n [disabled]=\"ldapLoading\"\r\n (page)=\"onLdapPageChange($event)\"\r\n ></mat-paginator>\r\n </div>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">Lines</h3>\r\n <div class=\"details-step-section__content\" formArrayName=\"lines\">\r\n <div class=\"line-route-list\">\r\n <div\r\n class=\"line-route-row\"\r\n *ngFor=\"let lineGroup of linesFormArray.controls; let idx = index\"\r\n [formGroupName]=\"idx\"\r\n >\r\n <div class=\"line-info\">\r\n <mat-form-field\r\n class=\"details-step-input line-route-field\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n hideRequiredMarker\r\n >\r\n <input matInput placeholder=\"Line number\" formControlName=\"lineNumber\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field\r\n class=\"details-step-input line-route-field\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n hideRequiredMarker\r\n >\r\n <input\r\n matInput\r\n placeholder=\"Search for a number\"\r\n formControlName=\"number\"\r\n [matAutocomplete]=\"numberAuto\"\r\n (input)=\"filterAvailableNumbers(idx, $event)\"\r\n />\r\n <mat-autocomplete\r\n #numberAuto=\"matAutocomplete\"\r\n [panelWidth]=\"'auto'\"\r\n (optionSelected)=\"onNumberSelected(idx, $event.option.value)\"\r\n >\r\n <mat-option *ngFor=\"let option of getFilteredNumbers(idx)\" [value]=\"option\">\r\n {{ option }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-error *ngIf=\"getLineGroup(idx).get('number')?.invalid && getLineGroup(idx).get('number')?.touched\">\r\n Number is required\r\n </mat-error>\r\n </mat-form-field>\r\n\r\n <mat-form-field\r\n class=\"details-step-input line-route-field\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n hideRequiredMarker\r\n >\r\n <input\r\n matInput\r\n placeholder=\"Select route partition\"\r\n formControlName=\"routePartition\"\r\n [matAutocomplete]=\"routePartitionAuto\"\r\n (input)=\"filterRoutePartitions(idx, $event)\"\r\n />\r\n <mat-autocomplete\r\n #routePartitionAuto=\"matAutocomplete\"\r\n (optionSelected)=\"onRoutePartitionSelected(idx, $event.option.value)\"\r\n >\r\n <mat-option\r\n *ngFor=\"let routePartition of getFilteredRoutePartitions(idx)\"\r\n [value]=\"routePartition\"\r\n >\r\n {{ routePartition }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-error *ngIf=\"getLineGroup(idx).get('routePartition')?.invalid && getLineGroup(idx).get('routePartition')?.touched\">\r\n Route partition is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">Devices</h3>\r\n <div class=\"details-step-section__content\" formArrayName=\"devices\">\r\n <div class=\"devices-rows\">\r\n <div\r\n class=\"details-inline-fields details-inline-fields--four\"\r\n *ngFor=\"let deviceGroup of devicesFormArray.controls; let idx = index\"\r\n [formGroupName]=\"idx\"\r\n >\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Device type</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"deviceType\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Protocol</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"protocol\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Button Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"buttonTemplate\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"Name\" formControlName=\"name\" />\r\n <mat-error *ngIf=\"getDeviceGroup(idx).get('name')?.hasError('macAddress') && getDeviceGroup(idx).get('name')?.touched\">\r\n Please enter a valid MAC address\r\n </mat-error>\r\n <mat-error *ngIf=\"getDeviceGroup(idx).get('name')?.hasError('required') && getDeviceGroup(idx).get('name')?.touched\">\r\n Name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\" *ngIf=\"deviceProfilesFormArray.length\">\r\n <h3 class=\"details-step-section__title\">Device profiles</h3>\r\n <div class=\"details-step-section__content\" formArrayName=\"deviceProfiles\">\r\n <div class=\"devices-rows\">\r\n <div\r\n class=\"details-inline-fields details-inline-fields--four\"\r\n *ngFor=\"let profileGroup of deviceProfilesFormArray.controls; let idx = index\"\r\n [formGroupName]=\"idx\"\r\n >\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Device type</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"deviceType\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Protocol</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"protocol\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Button Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"buttonTemplate\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"Name\" formControlName=\"name\" />\r\n <mat-error *ngIf=\"getDeviceProfileGroup(idx).get('name')?.hasError('macAddress') && getDeviceProfileGroup(idx).get('name')?.touched\">\r\n Please enter a valid MAC address\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n </form>\r\n</section>\r\n", styles: [".details-step-content{display:flex;flex-direction:column;gap:0}.details-step-dropdowns{display:flex;flex-direction:column;gap:1rem}.details-step-field{display:flex;flex-direction:column;gap:8px}.details-step-label{font-size:16px;font-weight:400;line-height:100%;letter-spacing:0;color:#333}.details-step-select{width:333px}.details-step-divider{border-top:1px solid #d9d9d9;margin-top:24px}.details-step-sections{display:flex;flex-direction:column}.details-step-section{display:flex;flex-direction:column;gap:0;padding:24px 0}.details-step-sections>.details-step-section:first-child{padding-top:0}.details-step-section+.details-step-section{border-top:1px solid #d9d9d9}.details-step-section__title{margin:0;font-family:Inter,sans-serif;font-size:16px;font-weight:600;line-height:100%;letter-spacing:0;color:#333}.details-step-section__content{margin-top:24px}.details-step-section__part+.details-step-section__part{margin-top:24px}.details-user-accordion{width:100%}.details-user-accordion__content{padding:12px 0 0}.details-ldap-search{display:flex;flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:16px}.details-ldap-search__input{min-width:180px;width:180px}.details-ldap-search__select{flex:0 1 180px;min-width:160px}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-wrapper,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-wrapper{padding-bottom:0;margin:0}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-flex,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:4px;padding:0 12px}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline,:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline-start,:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline-end,:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline-gap,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline-start,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline-end,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-infix,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-infix{width:100%;border-top:0;padding:0;display:flex;align-items:center;min-height:unset}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-input-element,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-input-element{margin:0;line-height:20px}:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-select-trigger{display:flex;align-items:center;width:100%;height:100%}:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-select-value{display:flex;align-items:center;max-width:100%}:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-select-arrow-wrapper{display:flex;align-items:center}.details-ldap-search__chip{flex:0 0 auto}.details-ldap-search__btn{flex:0 0 auto;min-width:0;padding:0 12px;font-family:Inter,sans-serif;font-size:14px;font-weight:500;color:#0d56aa}.details-ldap-paginator{margin-top:8px}.details-ldap-table__add-btn--delete{color:#c62828}.details-ldap-table{width:100%}.details-ldap-table__empty{margin:16px 0 8px;font-family:Inter,sans-serif;font-size:14px;line-height:20px;color:#737480;text-align:center}.details-ldap-table__row--disabled{opacity:.35}.details-ldap-table__add-btn{min-width:0;padding:0;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;letter-spacing:0;color:#0d56aa}:host ::ng-deep .details-ldap-table .mat-header-cell{font-family:Inter,sans-serif;font-size:12px;font-weight:500;line-height:16px;letter-spacing:0;color:#737480;height:30px;padding:7px 8px}:host ::ng-deep .details-ldap-table .mat-cell{font-family:Inter,sans-serif;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0;color:#333;height:40px;padding:8px}.details-inline-fields{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:16px}.details-inline-fields--four{grid-template-columns:repeat(4,minmax(0,1fr))}.devices-rows{display:flex;flex-direction:column;gap:24px}.details-inline-field{display:flex;flex-direction:column;gap:4px}.details-inline-field__label{color:#c0c2ce;font-size:12px;font-weight:400;line-height:16px;letter-spacing:0}.details-step-input{width:100%}.line-route-list{display:flex;flex-direction:column;gap:16px}.line-route-row{display:flex;gap:16px}.line-info{display:flex;align-items:flex-start;gap:16px}.line-route-field{flex:1 1 180px;min-width:160px}.line-route-field{display:flex;flex-direction:column;gap:0}.line-route-field:nth-of-type(1) .line-route-select{width:230px}.line-route-field .line-route-select{width:185px}:host ::ng-deep .details-step-select .mat-form-field-wrapper{padding-bottom:0}:host ::ng-deep .details-step-input .mat-form-field-wrapper{padding-bottom:0}:host ::ng-deep .details-step-select .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:6px;padding:0 12px}:host ::ng-deep .details-step-input .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:4px;padding:10px 8px}:host ::ng-deep .details-step-select .mat-form-field-outline,:host ::ng-deep .details-step-select .mat-form-field-outline-start,:host ::ng-deep .details-step-select .mat-form-field-outline-end,:host ::ng-deep .details-step-select .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-step-input .mat-form-field-outline,:host ::ng-deep .details-step-input .mat-form-field-outline-start,:host ::ng-deep .details-step-input .mat-form-field-outline-end,:host ::ng-deep .details-step-input .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-step-select .mat-form-field-infix{width:100%;border-top:0;padding:0}:host ::ng-deep .details-step-input .mat-form-field-infix{width:100%;border-top:0;padding:0}:host ::ng-deep .details-step-select .mat-select-trigger{display:flex;align-items:center;justify-content:space-between;height:100%}:host ::ng-deep .details-step-input .mat-input-element{height:100%;margin:0}:host ::ng-deep .details-step-input.mat-form-field-disabled .mat-form-field-flex{background-color:#f5f6fa;border-color:#b8beca;opacity:.55;cursor:not-allowed}:host ::ng-deep .details-step-input .mat-input-element:disabled{color:#7f8694;-webkit-text-fill-color:#7f8694;cursor:not-allowed}:host ::ng-deep .line-info .details-step-input .mat-form-field-flex{height:36px;padding:0 8px}:host ::ng-deep .line-info .details-step-input .mat-form-field-infix{padding:0}:host ::ng-deep .line-info .details-step-input .mat-input-element{font-size:14px;line-height:20px}:host ::ng-deep .mat-form-field-subscript-wrapper{position:relative}:host ::ng-deep .line-info .details-step-input .mat-form-field-subscript-wrapper{margin-top:4px;position:relative}:host ::ng-deep .details-user-accordion .mat-expansion-panel{border:0;border-radius:0!important;background:transparent;box-shadow:none!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header{padding:0 0 0 8px;min-height:32px;height:32px}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header-title{margin:0;display:flex;align-items:center;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;letter-spacing:0;color:#333}:host ::ng-deep .details-user-accordion .mat-expansion-panel-body{padding:0!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-content{display:flex;align-items:center}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-expansion-indicator{display:block!important;opacity:1!important;color:#333!important;align-self:center;margin:0 8px 0 0!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-expansion-indicator:after{color:#333!important;border-color:#333!important;position:relative;top:-4px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i5.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i5.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i5.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i5.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i5.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i5.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i5.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i5.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i5.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i9.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: i10.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i12.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i12.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i13.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i14.MatChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i14.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i14.MatChipRemove, selector: "[matChipRemove]" }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i15.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i15.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i15.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i15.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i16.AppLoaderComponent, selector: "app-loader" }] });
25
432
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserDetailsStepComponent, decorators: [{
26
433
  type: Component,
27
- args: [{ selector: 'tk-user-details-step', template: "<section class=\"details-step-content\">\r\n <div class=\"details-step-sections\">\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">User details</h3>\r\n <div class=\"details-step-section__content\">\r\n <div class=\"details-step-section__part\">\r\n <div class=\"details-inline-fields\">\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">User ID</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"User ID\"\r\n [value]=\"userCreationWizardService.userDetailsForm.userId\"\r\n (input)=\"\r\n userCreationWizardService.setUserDetailsField(\r\n 'userId',\r\n $any($event.target).value\r\n )\r\n \"\r\n />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">First Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"First Name\"\r\n [value]=\"userCreationWizardService.userDetailsForm.firstName\"\r\n (input)=\"\r\n userCreationWizardService.setUserDetailsField(\r\n 'firstName',\r\n $any($event.target).value\r\n )\r\n \"\r\n />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Last Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"Last Name\"\r\n [value]=\"userCreationWizardService.userDetailsForm.lastName\"\r\n (input)=\"\r\n userCreationWizardService.setUserDetailsField(\r\n 'lastName',\r\n $any($event.target).value\r\n )\r\n \"\r\n />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Email</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"Email\"\r\n [value]=\"userCreationWizardService.userDetailsForm.email\"\r\n (input)=\"\r\n userCreationWizardService.setUserDetailsField(\r\n 'email',\r\n $any($event.target).value\r\n )\r\n \"\r\n />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">User Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"User Template\"\r\n [value]=\"userCreationWizardService.selectedTemplate || ''\"\r\n [disabled]=\"true\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"details-step-section__part\">\r\n <mat-accordion class=\"details-user-accordion\">\r\n <mat-expansion-panel togglePosition=\"before\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n >Choose an existing or a LDAP user</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <div class=\"details-user-accordion__content\">\r\n <table\r\n mat-table\r\n [dataSource]=\"userCreationWizardService.ldapUsers\"\r\n class=\"details-ldap-table\"\r\n >\r\n <ng-container matColumnDef=\"userId\">\r\n <th mat-header-cell *matHeaderCellDef>User ID</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.userId }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"firstName\">\r\n <th mat-header-cell *matHeaderCellDef>First Name</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.firstName }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"lastName\">\r\n <th mat-header-cell *matHeaderCellDef>Last Name</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.lastName }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"email\">\r\n <th mat-header-cell *matHeaderCellDef>Email</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.email }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"add\">\r\n <th mat-header-cell *matHeaderCellDef>Add</th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <button\r\n mat-button\r\n class=\"details-ldap-table__add-btn\"\r\n type=\"button\"\r\n [disabled]=\"\r\n userCreationWizardService.isLdapUserAdded(row)\r\n \"\r\n (click)=\"onAddUser(row)\"\r\n >\r\n Add user\r\n </button>\r\n </td>\r\n </ng-container>\r\n\r\n <tr\r\n mat-header-row\r\n *matHeaderRowDef=\"\r\n userCreationWizardService.ldapTableColumns\r\n \"\r\n ></tr>\r\n <tr\r\n mat-row\r\n *matRowDef=\"\r\n let row;\r\n columns: userCreationWizardService.ldapTableColumns\r\n \"\r\n [class.details-ldap-table__row--disabled]=\"\r\n userCreationWizardService.isLdapUserAdded(row)\r\n \"\r\n ></tr>\r\n </table>\r\n </div>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">Lines</h3>\r\n <div class=\"details-step-section__content\">\r\n <div class=\"line-route-list\">\r\n <div\r\n class=\"line-route-row\"\r\n *ngFor=\"\r\n let lineSelection of userCreationWizardService.lineSelections;\r\n let idx = index\r\n \"\r\n >\r\n <div class=\"line-route-field\">\r\n <mat-form-field\r\n class=\"details-step-select line-route-select\"\r\n appearance=\"outline\"\r\n >\r\n <mat-select\r\n placeholder=\"Select line\"\r\n [value]=\"lineSelection.lineNumber\"\r\n (selectionChange)=\"\r\n userCreationWizardService.setLineSelection(\r\n idx,\r\n $event.value\r\n )\r\n \"\r\n >\r\n <mat-option\r\n *ngFor=\"let line of userCreationWizardService.lineOptions\"\r\n [value]=\"line.number\"\r\n >\r\n {{ line.number }} - {{ line.did }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"line-route-field\">\r\n <mat-form-field\r\n class=\"details-step-select line-route-select\"\r\n appearance=\"outline\"\r\n >\r\n <mat-select\r\n placeholder=\"Select route partition\"\r\n [value]=\"lineSelection.routePartitionName\"\r\n (selectionChange)=\"\r\n userCreationWizardService.setRoutePartitionSelection(\r\n idx,\r\n $event.value\r\n )\r\n \"\r\n >\r\n <mat-option\r\n *ngFor=\"\r\n let partition of userCreationWizardService.routePartitionOptions\r\n \"\r\n [value]=\"partition\"\r\n >\r\n {{ partition }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">Devices</h3>\r\n <div class=\"details-step-section__content\">\r\n <div class=\"devices-rows\">\r\n <div\r\n class=\"details-inline-fields details-inline-fields--four\"\r\n *ngFor=\"\r\n let _row of userCreationWizardService.deviceRows;\r\n let idx = index\r\n \"\r\n >\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Device type</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"Device type\"\r\n [value]=\"\r\n userCreationWizardService.deviceEntries[idx].deviceType ||\r\n ''\r\n \"\r\n [disabled]=\"true\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Protocol</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"Protocol\"\r\n [value]=\"\r\n userCreationWizardService.deviceEntries[idx].protocol || ''\r\n \"\r\n [disabled]=\"true\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Button Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"Button Template\"\r\n [value]=\"\r\n userCreationWizardService.deviceEntries[idx]\r\n .buttonTemplate || ''\r\n \"\r\n [disabled]=\"true\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"Name\"\r\n [value]=\"getDeviceName(idx)\"\r\n (input)=\"\r\n userCreationWizardService.setDeviceName(\r\n idx,\r\n $any($event.target).value\r\n )\r\n \"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n</section>\r\n", styles: [".details-step-content{display:flex;flex-direction:column;gap:0}.details-step-dropdowns{display:flex;flex-direction:column;gap:1rem}.details-step-field{display:flex;flex-direction:column;gap:8px}.details-step-label{font-size:16px;font-weight:400;line-height:100%;letter-spacing:0;color:#333}.details-step-select{width:333px}.details-step-divider{border-top:1px solid #d9d9d9;margin-top:24px}.details-step-sections{display:flex;flex-direction:column}.details-step-section{display:flex;flex-direction:column;gap:0;padding:24px 0}.details-step-sections>.details-step-section:first-child{padding-top:0}.details-step-section+.details-step-section{border-top:1px solid #d9d9d9}.details-step-section__title{margin:0;font-family:Inter,sans-serif;font-size:16px;font-weight:600;line-height:100%;letter-spacing:0;color:#333}.details-step-section__content{margin-top:24px}.details-step-section__part+.details-step-section__part{margin-top:24px}.details-user-accordion{width:100%}.details-user-accordion__content{padding:12px 0 0}.details-ldap-table{width:100%}.details-ldap-table__row--disabled{opacity:.35}.details-ldap-table__add-btn{min-width:0;padding:0;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;letter-spacing:0;color:#0d56aa}:host ::ng-deep .details-ldap-table .mat-header-cell{font-family:Inter,sans-serif;font-size:12px;font-weight:500;line-height:16px;letter-spacing:0;color:#737480;height:30px;padding:7px 8px}:host ::ng-deep .details-ldap-table .mat-cell{font-family:Inter,sans-serif;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0;color:#333;height:40px;padding:8px}.details-inline-fields{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:16px}.details-inline-fields--four{grid-template-columns:repeat(4,minmax(0,1fr))}.devices-rows{display:flex;flex-direction:column;gap:24px}.details-inline-field{display:flex;flex-direction:column;gap:4px}.details-inline-field__label{color:#c0c2ce;font-size:12px;font-weight:400;line-height:16px;letter-spacing:0}.details-step-input{width:100%}.line-route-list{display:flex;flex-direction:column;gap:16px}.line-route-row{display:flex;gap:16px}.line-route-field{display:flex;flex-direction:column;gap:0}.line-route-field:nth-of-type(1) .line-route-select{width:230px}.line-route-field .line-route-select{width:185px}:host ::ng-deep .details-step-select .mat-form-field-wrapper{padding-bottom:0}:host ::ng-deep .details-step-input .mat-form-field-wrapper{padding-bottom:0}:host ::ng-deep .details-step-select .mat-form-field-flex{align-items:center;height:32px;border:1px solid #767676;border-radius:6px;padding:0 12px}:host ::ng-deep .details-step-input .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:4px;padding:10px 8px}:host ::ng-deep .details-step-select .mat-form-field-outline,:host ::ng-deep .details-step-select .mat-form-field-outline-start,:host ::ng-deep .details-step-select .mat-form-field-outline-end,:host ::ng-deep .details-step-select .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-step-input .mat-form-field-outline,:host ::ng-deep .details-step-input .mat-form-field-outline-start,:host ::ng-deep .details-step-input .mat-form-field-outline-end,:host ::ng-deep .details-step-input .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-step-select .mat-form-field-infix{width:100%;border-top:0;padding:0}:host ::ng-deep .details-step-input .mat-form-field-infix{width:100%;border-top:0;padding:0}:host ::ng-deep .details-step-select .mat-select-trigger{display:flex;align-items:center;justify-content:space-between;height:100%}:host ::ng-deep .details-step-input .mat-input-element{height:100%;margin:0}:host ::ng-deep .details-step-input.mat-form-field-disabled .mat-form-field-flex{background-color:#f5f6fa;border-color:#b8beca;opacity:.55;cursor:not-allowed}:host ::ng-deep .details-step-input .mat-input-element:disabled{color:#7f8694;-webkit-text-fill-color:#7f8694;cursor:not-allowed}:host ::ng-deep .details-user-accordion .mat-expansion-panel{border:0;border-radius:0!important;background:transparent;box-shadow:none!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header{padding:0 0 0 8px;min-height:32px;height:32px}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header-title{margin:0;display:flex;align-items:center;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;letter-spacing:0;color:#333}:host ::ng-deep .details-user-accordion .mat-expansion-panel-body{padding:0!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-content{display:flex;align-items:center}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-expansion-indicator{display:block!important;opacity:1!important;color:#333!important;align-self:center;margin:0 8px 0 0!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-expansion-indicator:after{color:#333!important;border-color:#333!important;position:relative;top:-4px}\n"] }]
28
- }], ctorParameters: function () { return [{ type: i1.UserCreationWizardService }]; } });
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1kZXRhaWxzLXN0ZXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVraS93aWRnZXRzL3VzZXItY3JlYXRpb24vc3JjL3dpZGdldHMvdXNlci1jcmVhdGlvbi13aXphcmQvY29tcG9uZW50cy91c2VyLWRldGFpbHMtc3RlcC91c2VyLWRldGFpbHMtc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWtpL3dpZGdldHMvdXNlci1jcmVhdGlvbi9zcmMvd2lkZ2V0cy91c2VyLWNyZWF0aW9uLXdpemFyZC9jb21wb25lbnRzL3VzZXItZGV0YWlscy1zdGVwL3VzZXItZGV0YWlscy1zdGVwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7O0FBUTFDLE1BQU0sT0FBTyx3QkFBd0I7SUFDakMsWUFDVyx5QkFBb0Q7UUFBcEQsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUEyQjtJQUMzRCxDQUFDO0lBRUwsU0FBUyxDQUFDLEdBQWdCO1FBQ3RCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFhO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RFLENBQUM7O3NIQVhRLHdCQUF3QjswR0FBeEIsd0JBQXdCLDREQ1JyQywwM1lBb1RBOzRGRDVTYSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0ksc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTGRhcFVzZXJSb3csIFVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vdXNlci1jcmVhdGlvbi13aXphcmQuc2VydmljZVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3RrLXVzZXItZGV0YWlscy1zdGVwJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi91c2VyLWRldGFpbHMtc3RlcC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi91c2VyLWRldGFpbHMtc3RlcC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVc2VyRGV0YWlsc1N0ZXBDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHVibGljIHVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2U6IFVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2VcclxuICAgICkgeyB9XHJcblxyXG4gICAgb25BZGRVc2VyKHJvdzogTGRhcFVzZXJSb3cpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UuYWRkTGRhcFVzZXIocm93KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXREZXZpY2VOYW1lKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UuZ2V0RGV2aWNlRGlzcGxheU5hbWUoaW5kZXgpO1xyXG4gICAgfVxyXG59IiwiPHNlY3Rpb24gY2xhc3M9XCJkZXRhaWxzLXN0ZXAtY29udGVudFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtc2VjdGlvbnNcIj5cclxuICAgIDxzZWN0aW9uIGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25cIj5cclxuICAgICAgPGgzIGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25fX3RpdGxlXCI+VXNlciBkZXRhaWxzPC9oMz5cclxuICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtc3RlcC1zZWN0aW9uX19jb250ZW50XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtc3RlcC1zZWN0aW9uX19wYXJ0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZFwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkX19sYWJlbFwiPlVzZXIgSUQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJVc2VyIElEXCJcclxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UudXNlckRldGFpbHNGb3JtLnVzZXJJZFwiXHJcbiAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJcclxuICAgICAgICAgICAgICAgICAgICB1c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLnNldFVzZXJEZXRhaWxzRmllbGQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAndXNlcklkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWVcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRfX2xhYmVsXCI+Rmlyc3QgTmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGV0YWlscy1zdGVwLWlucHV0XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZpcnN0IE5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS51c2VyRGV0YWlsc0Zvcm0uZmlyc3ROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIlxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2Uuc2V0VXNlckRldGFpbHNGaWVsZChcclxuICAgICAgICAgICAgICAgICAgICAgICdmaXJzdE5hbWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5MYXN0IE5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJMYXN0IE5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS51c2VyRGV0YWlsc0Zvcm0ubGFzdE5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5zZXRVc2VyRGV0YWlsc0ZpZWxkKFxyXG4gICAgICAgICAgICAgICAgICAgICAgJ2xhc3ROYW1lJyxcclxuICAgICAgICAgICAgICAgICAgICAgICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWVcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRfX2xhYmVsXCI+RW1haWw8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbWFpbFwiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ1c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLnVzZXJEZXRhaWxzRm9ybS5lbWFpbFwiXHJcbiAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJcclxuICAgICAgICAgICAgICAgICAgICB1c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLnNldFVzZXJEZXRhaWxzRmllbGQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAnZW1haWwnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5Vc2VyIFRlbXBsYXRlPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVXNlciBUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ1c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLnNlbGVjdGVkVGVtcGxhdGUgfHwgJydcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtc2VjdGlvbl9fcGFydFwiPlxyXG4gICAgICAgICAgPG1hdC1hY2NvcmRpb24gY2xhc3M9XCJkZXRhaWxzLXVzZXItYWNjb3JkaW9uXCI+XHJcbiAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsIHRvZ2dsZVBvc2l0aW9uPVwiYmVmb3JlXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZVxyXG4gICAgICAgICAgICAgICAgICA+Q2hvb3NlIGFuIGV4aXN0aW5nIG9yIGEgTERBUCB1c2VyPC9tYXQtcGFuZWwtdGl0bGVcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLXVzZXItYWNjb3JkaW9uX19jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8dGFibGVcclxuICAgICAgICAgICAgICAgICAgbWF0LXRhYmxlXHJcbiAgICAgICAgICAgICAgICAgIFtkYXRhU291cmNlXT1cInVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UubGRhcFVzZXJzXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWxzLWxkYXAtdGFibGVcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInVzZXJJZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+VXNlciBJRDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPnt7IHJvdy51c2VySWQgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZmlyc3ROYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5GaXJzdCBOYW1lPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+e3sgcm93LmZpcnN0TmFtZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJsYXN0TmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+TGFzdCBOYW1lPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+e3sgcm93Lmxhc3ROYW1lIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImVtYWlsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5FbWFpbDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPnt7IHJvdy5lbWFpbCB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhZGRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkFkZDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlscy1sZGFwLXRhYmxlX19hZGQtYnRuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmlzTGRhcFVzZXJBZGRlZChyb3cpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkFkZFVzZXIocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFkZCB1c2VyXHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDx0clxyXG4gICAgICAgICAgICAgICAgICAgIG1hdC1oZWFkZXItcm93XHJcbiAgICAgICAgICAgICAgICAgICAgKm1hdEhlYWRlclJvd0RlZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgdXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5sZGFwVGFibGVDb2x1bW5zXHJcbiAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgPjwvdHI+XHJcbiAgICAgICAgICAgICAgICAgIDx0clxyXG4gICAgICAgICAgICAgICAgICAgIG1hdC1yb3dcclxuICAgICAgICAgICAgICAgICAgICAqbWF0Um93RGVmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcm93O1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29sdW1uczogdXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5sZGFwVGFibGVDb2x1bW5zXHJcbiAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGV0YWlscy1sZGFwLXRhYmxlX19yb3ctLWRpc2FibGVkXT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgdXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5pc0xkYXBVc2VyQWRkZWQocm93KVxyXG4gICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgID48L3RyPlxyXG4gICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgICAgICAgPC9tYXQtYWNjb3JkaW9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvc2VjdGlvbj5cclxuXHJcbiAgICA8c2VjdGlvbiBjbGFzcz1cImRldGFpbHMtc3RlcC1zZWN0aW9uXCI+XHJcbiAgICAgIDxoMyBjbGFzcz1cImRldGFpbHMtc3RlcC1zZWN0aW9uX190aXRsZVwiPkxpbmVzPC9oMz5cclxuICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtc3RlcC1zZWN0aW9uX19jb250ZW50XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxpbmUtcm91dGUtbGlzdFwiPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzcz1cImxpbmUtcm91dGUtcm93XCJcclxuICAgICAgICAgICAgKm5nRm9yPVwiXHJcbiAgICAgICAgICAgICAgbGV0IGxpbmVTZWxlY3Rpb24gb2YgdXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5saW5lU2VsZWN0aW9ucztcclxuICAgICAgICAgICAgICBsZXQgaWR4ID0gaW5kZXhcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpbmUtcm91dGUtZmllbGRcIj5cclxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlbGVjdCBsaW5lLXJvdXRlLXNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgbGluZVwiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJsaW5lU2VsZWN0aW9uLmxpbmVOdW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIlxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2Uuc2V0TGluZVNlbGVjdGlvbihcclxuICAgICAgICAgICAgICAgICAgICAgIGlkeCxcclxuICAgICAgICAgICAgICAgICAgICAgICRldmVudC52YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbGluZSBvZiB1c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmxpbmVPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwibGluZS5udW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgbGluZS5udW1iZXIgfX0gLSB7eyBsaW5lLmRpZCB9fVxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluZS1yb3V0ZS1maWVsZFwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtc2VsZWN0IGxpbmUtcm91dGUtc2VsZWN0XCJcclxuICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCByb3V0ZSBwYXJ0aXRpb25cIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwibGluZVNlbGVjdGlvbi5yb3V0ZVBhcnRpdGlvbk5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIlxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2Uuc2V0Um91dGVQYXJ0aXRpb25TZWxlY3Rpb24oXHJcbiAgICAgICAgICAgICAgICAgICAgICBpZHgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQudmFsdWVcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFydGl0aW9uIG9mIHVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2Uucm91dGVQYXJ0aXRpb25PcHRpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicGFydGl0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHBhcnRpdGlvbiB9fVxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3NlY3Rpb24+XHJcblxyXG4gICAgPHNlY3Rpb24gY2xhc3M9XCJkZXRhaWxzLXN0ZXAtc2VjdGlvblwiPlxyXG4gICAgICA8aDMgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtc2VjdGlvbl9fdGl0bGVcIj5EZXZpY2VzPC9oMz5cclxuICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtc3RlcC1zZWN0aW9uX19jb250ZW50XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRldmljZXMtcm93c1wiPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkcyBkZXRhaWxzLWlubGluZS1maWVsZHMtLWZvdXJcIlxyXG4gICAgICAgICAgICAqbmdGb3I9XCJcclxuICAgICAgICAgICAgICBsZXQgX3JvdyBvZiB1c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmRldmljZVJvd3M7XHJcbiAgICAgICAgICAgICAgbGV0IGlkeCA9IGluZGV4XHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZFwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkX19sYWJlbFwiPkRldmljZSB0eXBlPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRGV2aWNlIHR5cGVcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5kZXZpY2VFbnRyaWVzW2lkeF0uZGV2aWNlVHlwZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICcnXHJcbiAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5Qcm90b2NvbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGV0YWlscy1zdGVwLWlucHV0XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlByb3RvY29sXCJcclxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIlxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UuZGV2aWNlRW50cmllc1tpZHhdLnByb3RvY29sIHx8ICcnXHJcbiAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5CdXR0b24gVGVtcGxhdGU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJCdXR0b24gVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5kZXZpY2VFbnRyaWVzW2lkeF1cclxuICAgICAgICAgICAgICAgICAgICAgIC5idXR0b25UZW1wbGF0ZSB8fCAnJ1xyXG4gICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRfX2xhYmVsXCI+TmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGV0YWlscy1zdGVwLWlucHV0XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0RGV2aWNlTmFtZShpZHgpXCJcclxuICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIlxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2Uuc2V0RGV2aWNlTmFtZShcclxuICAgICAgICAgICAgICAgICAgICAgIGlkeCxcclxuICAgICAgICAgICAgICAgICAgICAgICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWVcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9zZWN0aW9uPlxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcbiJdfQ==
434
+ args: [{ selector: 'tk-user-details-step', template: "<app-loader *ngIf=\"loadingAvailableNumbers\"></app-loader>\r\n<section class=\"details-step-content\">\r\n <form [formGroup]=\"userDetailsForm\">\r\n <div class=\"details-step-sections\">\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">User details</h3>\r\n <div class=\"details-step-section__content\">\r\n <div class=\"details-step-section__part\">\r\n <div class=\"details-inline-fields\">\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">User ID</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"User ID\" formControlName=\"userId\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('userId')?.hasError('required') && userDetailsForm.get('userId')?.touched\">\r\n User ID is required\r\n </mat-error>\r\n <mat-error *ngIf=\"userDetailsForm.get('userId')?.hasError('userIdExists') && userDetailsForm.get('userId')?.touched\">\r\n User ID already exists\r\n </mat-error>\r\n <mat-hint *ngIf=\"userIdCheckPending\">Checking user ID...</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">First Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"First Name\" formControlName=\"firstName\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('firstName')?.hasError('required') && userDetailsForm.get('firstName')?.touched\">\r\n First name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Last Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"Last Name\" formControlName=\"lastName\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('lastName')?.hasError('required') && userDetailsForm.get('lastName')?.touched\">\r\n Last name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Email</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"Email\" formControlName=\"email\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('email')?.invalid && userDetailsForm.get('email')?.touched\">\r\n <span *ngIf=\"userDetailsForm.get('email')?.hasError('required')\">Email is required</span>\r\n <span *ngIf=\"userDetailsForm.get('email')?.hasError('email')\">Please enter a valid email</span>\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">User Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"User Template\"\r\n [value]=\"userCreationWizardService.selectedTemplateName || ''\"\r\n [disabled]=\"true\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"details-step-section__part\">\r\n <mat-accordion class=\"details-user-accordion\">\r\n <mat-expansion-panel togglePosition=\"before\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>Choose an existing or a LDAP user</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div class=\"details-user-accordion__content\">\r\n <div class=\"details-ldap-search\" [formGroup]=\"ldapSearchForm\">\r\n <mat-form-field\r\n class=\"details-ldap-search__input\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n >\r\n <input\r\n matInput\r\n placeholder=\"Search\"\r\n formControlName=\"queryValue\"\r\n (keyup.enter)=\"searchLdapUsers()\"\r\n />\r\n </mat-form-field>\r\n\r\n <mat-form-field\r\n class=\"details-ldap-search__select\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n >\r\n <mat-select formControlName=\"queryType\">\r\n <mat-option *ngFor=\"let option of ldapQueryTypeOptions\" [value]=\"option.value\">\r\n {{ option.label }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-chip-list *ngIf=\"selectedLdapUser\" class=\"details-ldap-search__chip\">\r\n <mat-chip removable (removed)=\"onRemoveLdapTag()\">\r\n {{ selectedLdapUser.userid }}\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n </mat-chip-list>\r\n\r\n <button\r\n mat-button\r\n class=\"details-ldap-search__btn\"\r\n type=\"button\"\r\n [disabled]=\"ldapLoading\"\r\n (click)=\"searchLdapUsers()\"\r\n >\r\n Search\r\n </button>\r\n </div>\r\n\r\n <app-loader *ngIf=\"ldapLoading\"></app-loader>\r\n\r\n <p\r\n *ngIf=\"!ldapLoading && ldapSearchAttempted && !hasLdapUsers\"\r\n class=\"details-ldap-table__empty\"\r\n >\r\n No users found\r\n </p>\r\n\r\n <table\r\n *ngIf=\"!ldapLoading && hasLdapUsers\"\r\n mat-table\r\n [dataSource]=\"userCreationWizardService.ldapUsers\"\r\n class=\"details-ldap-table\"\r\n >\r\n <ng-container matColumnDef=\"userId\">\r\n <th mat-header-cell *matHeaderCellDef>User Id</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.userid }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"firstName\">\r\n <th mat-header-cell *matHeaderCellDef>First Name</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.firstName }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"lastName\">\r\n <th mat-header-cell *matHeaderCellDef>Last Name</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.lastName }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"email\">\r\n <th mat-header-cell *matHeaderCellDef>Email</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.email }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"add\">\r\n <th mat-header-cell *matHeaderCellDef>Add</th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <button\r\n *ngIf=\"!isLdapUserRowSelected(row); else deleteLdapUserBtn\"\r\n mat-button\r\n class=\"details-ldap-table__add-btn\"\r\n type=\"button\"\r\n (click)=\"onAddLdapUser(row)\"\r\n >\r\n Add User\r\n </button>\r\n <ng-template #deleteLdapUserBtn>\r\n <button\r\n mat-button\r\n class=\"details-ldap-table__add-btn details-ldap-table__add-btn--delete\"\r\n type=\"button\"\r\n (click)=\"onDeleteLdapUser(row)\"\r\n >\r\n Delete user\r\n </button>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"userCreationWizardService.ldapTableColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: userCreationWizardService.ldapTableColumns\"></tr>\r\n </table>\r\n\r\n <mat-paginator\r\n *ngIf=\"!ldapLoading && hasLdapUsers\"\r\n class=\"details-ldap-paginator\"\r\n [length]=\"ldapTotalCount\"\r\n [pageSize]=\"ldapPageSize\"\r\n [pageIndex]=\"ldapPageIndex\"\r\n [pageSizeOptions]=\"[ldapPageSize]\"\r\n [hidePageSize]=\"true\"\r\n [disabled]=\"ldapLoading\"\r\n (page)=\"onLdapPageChange($event)\"\r\n ></mat-paginator>\r\n </div>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">Lines</h3>\r\n <div class=\"details-step-section__content\" formArrayName=\"lines\">\r\n <div class=\"line-route-list\">\r\n <div\r\n class=\"line-route-row\"\r\n *ngFor=\"let lineGroup of linesFormArray.controls; let idx = index\"\r\n [formGroupName]=\"idx\"\r\n >\r\n <div class=\"line-info\">\r\n <mat-form-field\r\n class=\"details-step-input line-route-field\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n hideRequiredMarker\r\n >\r\n <input matInput placeholder=\"Line number\" formControlName=\"lineNumber\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field\r\n class=\"details-step-input line-route-field\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n hideRequiredMarker\r\n >\r\n <input\r\n matInput\r\n placeholder=\"Search for a number\"\r\n formControlName=\"number\"\r\n [matAutocomplete]=\"numberAuto\"\r\n (input)=\"filterAvailableNumbers(idx, $event)\"\r\n />\r\n <mat-autocomplete\r\n #numberAuto=\"matAutocomplete\"\r\n [panelWidth]=\"'auto'\"\r\n (optionSelected)=\"onNumberSelected(idx, $event.option.value)\"\r\n >\r\n <mat-option *ngFor=\"let option of getFilteredNumbers(idx)\" [value]=\"option\">\r\n {{ option }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-error *ngIf=\"getLineGroup(idx).get('number')?.invalid && getLineGroup(idx).get('number')?.touched\">\r\n Number is required\r\n </mat-error>\r\n </mat-form-field>\r\n\r\n <mat-form-field\r\n class=\"details-step-input line-route-field\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n hideRequiredMarker\r\n >\r\n <input\r\n matInput\r\n placeholder=\"Select route partition\"\r\n formControlName=\"routePartition\"\r\n [matAutocomplete]=\"routePartitionAuto\"\r\n (input)=\"filterRoutePartitions(idx, $event)\"\r\n />\r\n <mat-autocomplete\r\n #routePartitionAuto=\"matAutocomplete\"\r\n (optionSelected)=\"onRoutePartitionSelected(idx, $event.option.value)\"\r\n >\r\n <mat-option\r\n *ngFor=\"let routePartition of getFilteredRoutePartitions(idx)\"\r\n [value]=\"routePartition\"\r\n >\r\n {{ routePartition }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-error *ngIf=\"getLineGroup(idx).get('routePartition')?.invalid && getLineGroup(idx).get('routePartition')?.touched\">\r\n Route partition is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">Devices</h3>\r\n <div class=\"details-step-section__content\" formArrayName=\"devices\">\r\n <div class=\"devices-rows\">\r\n <div\r\n class=\"details-inline-fields details-inline-fields--four\"\r\n *ngFor=\"let deviceGroup of devicesFormArray.controls; let idx = index\"\r\n [formGroupName]=\"idx\"\r\n >\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Device type</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"deviceType\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Protocol</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"protocol\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Button Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"buttonTemplate\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"Name\" formControlName=\"name\" />\r\n <mat-error *ngIf=\"getDeviceGroup(idx).get('name')?.hasError('macAddress') && getDeviceGroup(idx).get('name')?.touched\">\r\n Please enter a valid MAC address\r\n </mat-error>\r\n <mat-error *ngIf=\"getDeviceGroup(idx).get('name')?.hasError('required') && getDeviceGroup(idx).get('name')?.touched\">\r\n Name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\" *ngIf=\"deviceProfilesFormArray.length\">\r\n <h3 class=\"details-step-section__title\">Device profiles</h3>\r\n <div class=\"details-step-section__content\" formArrayName=\"deviceProfiles\">\r\n <div class=\"devices-rows\">\r\n <div\r\n class=\"details-inline-fields details-inline-fields--four\"\r\n *ngFor=\"let profileGroup of deviceProfilesFormArray.controls; let idx = index\"\r\n [formGroupName]=\"idx\"\r\n >\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Device type</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"deviceType\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Protocol</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"protocol\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Button Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"buttonTemplate\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"Name\" formControlName=\"name\" />\r\n <mat-error *ngIf=\"getDeviceProfileGroup(idx).get('name')?.hasError('macAddress') && getDeviceProfileGroup(idx).get('name')?.touched\">\r\n Please enter a valid MAC address\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n </form>\r\n</section>\r\n", styles: [".details-step-content{display:flex;flex-direction:column;gap:0}.details-step-dropdowns{display:flex;flex-direction:column;gap:1rem}.details-step-field{display:flex;flex-direction:column;gap:8px}.details-step-label{font-size:16px;font-weight:400;line-height:100%;letter-spacing:0;color:#333}.details-step-select{width:333px}.details-step-divider{border-top:1px solid #d9d9d9;margin-top:24px}.details-step-sections{display:flex;flex-direction:column}.details-step-section{display:flex;flex-direction:column;gap:0;padding:24px 0}.details-step-sections>.details-step-section:first-child{padding-top:0}.details-step-section+.details-step-section{border-top:1px solid #d9d9d9}.details-step-section__title{margin:0;font-family:Inter,sans-serif;font-size:16px;font-weight:600;line-height:100%;letter-spacing:0;color:#333}.details-step-section__content{margin-top:24px}.details-step-section__part+.details-step-section__part{margin-top:24px}.details-user-accordion{width:100%}.details-user-accordion__content{padding:12px 0 0}.details-ldap-search{display:flex;flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:16px}.details-ldap-search__input{min-width:180px;width:180px}.details-ldap-search__select{flex:0 1 180px;min-width:160px}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-wrapper,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-wrapper{padding-bottom:0;margin:0}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-flex,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:4px;padding:0 12px}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline,:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline-start,:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline-end,:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline-gap,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline-start,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline-end,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-infix,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-infix{width:100%;border-top:0;padding:0;display:flex;align-items:center;min-height:unset}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-input-element,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-input-element{margin:0;line-height:20px}:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-select-trigger{display:flex;align-items:center;width:100%;height:100%}:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-select-value{display:flex;align-items:center;max-width:100%}:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-select-arrow-wrapper{display:flex;align-items:center}.details-ldap-search__chip{flex:0 0 auto}.details-ldap-search__btn{flex:0 0 auto;min-width:0;padding:0 12px;font-family:Inter,sans-serif;font-size:14px;font-weight:500;color:#0d56aa}.details-ldap-paginator{margin-top:8px}.details-ldap-table__add-btn--delete{color:#c62828}.details-ldap-table{width:100%}.details-ldap-table__empty{margin:16px 0 8px;font-family:Inter,sans-serif;font-size:14px;line-height:20px;color:#737480;text-align:center}.details-ldap-table__row--disabled{opacity:.35}.details-ldap-table__add-btn{min-width:0;padding:0;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;letter-spacing:0;color:#0d56aa}:host ::ng-deep .details-ldap-table .mat-header-cell{font-family:Inter,sans-serif;font-size:12px;font-weight:500;line-height:16px;letter-spacing:0;color:#737480;height:30px;padding:7px 8px}:host ::ng-deep .details-ldap-table .mat-cell{font-family:Inter,sans-serif;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0;color:#333;height:40px;padding:8px}.details-inline-fields{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:16px}.details-inline-fields--four{grid-template-columns:repeat(4,minmax(0,1fr))}.devices-rows{display:flex;flex-direction:column;gap:24px}.details-inline-field{display:flex;flex-direction:column;gap:4px}.details-inline-field__label{color:#c0c2ce;font-size:12px;font-weight:400;line-height:16px;letter-spacing:0}.details-step-input{width:100%}.line-route-list{display:flex;flex-direction:column;gap:16px}.line-route-row{display:flex;gap:16px}.line-info{display:flex;align-items:flex-start;gap:16px}.line-route-field{flex:1 1 180px;min-width:160px}.line-route-field{display:flex;flex-direction:column;gap:0}.line-route-field:nth-of-type(1) .line-route-select{width:230px}.line-route-field .line-route-select{width:185px}:host ::ng-deep .details-step-select .mat-form-field-wrapper{padding-bottom:0}:host ::ng-deep .details-step-input .mat-form-field-wrapper{padding-bottom:0}:host ::ng-deep .details-step-select .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:6px;padding:0 12px}:host ::ng-deep .details-step-input .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:4px;padding:10px 8px}:host ::ng-deep .details-step-select .mat-form-field-outline,:host ::ng-deep .details-step-select .mat-form-field-outline-start,:host ::ng-deep .details-step-select .mat-form-field-outline-end,:host ::ng-deep .details-step-select .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-step-input .mat-form-field-outline,:host ::ng-deep .details-step-input .mat-form-field-outline-start,:host ::ng-deep .details-step-input .mat-form-field-outline-end,:host ::ng-deep .details-step-input .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-step-select .mat-form-field-infix{width:100%;border-top:0;padding:0}:host ::ng-deep .details-step-input .mat-form-field-infix{width:100%;border-top:0;padding:0}:host ::ng-deep .details-step-select .mat-select-trigger{display:flex;align-items:center;justify-content:space-between;height:100%}:host ::ng-deep .details-step-input .mat-input-element{height:100%;margin:0}:host ::ng-deep .details-step-input.mat-form-field-disabled .mat-form-field-flex{background-color:#f5f6fa;border-color:#b8beca;opacity:.55;cursor:not-allowed}:host ::ng-deep .details-step-input .mat-input-element:disabled{color:#7f8694;-webkit-text-fill-color:#7f8694;cursor:not-allowed}:host ::ng-deep .line-info .details-step-input .mat-form-field-flex{height:36px;padding:0 8px}:host ::ng-deep .line-info .details-step-input .mat-form-field-infix{padding:0}:host ::ng-deep .line-info .details-step-input .mat-input-element{font-size:14px;line-height:20px}:host ::ng-deep .mat-form-field-subscript-wrapper{position:relative}:host ::ng-deep .line-info .details-step-input .mat-form-field-subscript-wrapper{margin-top:4px;position:relative}:host ::ng-deep .details-user-accordion .mat-expansion-panel{border:0;border-radius:0!important;background:transparent;box-shadow:none!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header{padding:0 0 0 8px;min-height:32px;height:32px}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header-title{margin:0;display:flex;align-items:center;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;letter-spacing:0;color:#333}:host ::ng-deep .details-user-accordion .mat-expansion-panel-body{padding:0!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-content{display:flex;align-items:center}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-expansion-indicator{display:block!important;opacity:1!important;color:#333!important;align-self:center;margin:0 8px 0 0!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-expansion-indicator:after{color:#333!important;border-color:#333!important;position:relative;top:-4px}\n"] }]
435
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.UserCreationApiService }, { type: i3.UserCreationWizardService }]; }, propDecorators: { validityChange: [{
436
+ type: Output
437
+ }] } });
438
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1kZXRhaWxzLXN0ZXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVraS93aWRnZXRzL3VzZXItY3JlYXRpb24vc3JjL3dpZGdldHMvdXNlci1jcmVhdGlvbi13aXphcmQvY29tcG9uZW50cy91c2VyLWRldGFpbHMtc3RlcC91c2VyLWRldGFpbHMtc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWtpL3dpZGdldHMvdXNlci1jcmVhdGlvbi9zcmMvd2lkZ2V0cy91c2VyLWNyZWF0aW9uLXdpemFyZC9jb21wb25lbnRzL3VzZXItZGV0YWlscy1zdGVwL3VzZXItZGV0YWlscy1zdGVwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFxQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQU9ILFVBQVUsR0FDYixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFDSCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFFBQVEsRUFDUixHQUFHLEVBRUgsRUFBRSxFQUNGLFNBQVMsRUFDVCxPQUFPLEVBQ1AsU0FBUyxFQUNULElBQUksRUFDSixTQUFTLEVBQ1QsR0FBRyxFQUNILEtBQUssR0FDUixNQUFNLE1BQU0sQ0FBQztBQU9kLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRzFELE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQztBQU8xQixNQUFNLE9BQU8sd0JBQXdCO0lBMEJqQyxJQUFJLGNBQWM7UUFDZCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBYyxDQUFDO0lBQzFELENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNo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QUFHLEtBQUssQ0FBQztnQkFDaEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxFQUNGLFFBQVEsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztnQkFDaEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxDQUNMLENBQUM7UUFDTixDQUFDLENBQUM7SUFDTixDQUFDOztzSEEvZlEsd0JBQXdCOzBHQUF4Qix3QkFBd0IsMkdDMUNyQyxxMmtCQXNYQTs0RkQ1VWEsd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNJLHNCQUFzQjsrS0FLdEIsY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgICBBc3luY1ZhbGlkYXRvckZuLFxyXG4gICAgRm9ybUFycmF5LFxyXG4gICAgRm9ybUJ1aWxkZXIsXHJcbiAgICBGb3JtR3JvdXAsXHJcbiAgICBWYWxpZGF0aW9uRXJyb3JzLFxyXG4gICAgVmFsaWRhdG9ycyxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFBhZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7XHJcbiAgICBjYXRjaEVycm9yLFxyXG4gICAgZGVib3VuY2VUaW1lLFxyXG4gICAgZmluYWxpemUsXHJcbiAgICBtYXAsXHJcbiAgICBPYnNlcnZhYmxlLFxyXG4gICAgb2YsXHJcbiAgICBzdGFydFdpdGgsXHJcbiAgICBTdWJqZWN0LFxyXG4gICAgc3dpdGNoTWFwLFxyXG4gICAgdGFrZSxcclxuICAgIHRha2VVbnRpbCxcclxuICAgIHRhcCxcclxuICAgIHRpbWVyLFxyXG59IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge1xyXG4gICAgTGRhcFF1ZXJ5VHlwZSxcclxuICAgIExkYXBVc2Vyc1RhYmxlUmVzcG9uc2UsXHJcbiAgICBMaXN0VXNlckludGVyZmFjZSxcclxufSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL3VzZXItY3JlYXRpb24td2l6YXJkLmludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBVc2VyQ3JlYXRpb25BcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3VzZXItY3JlYXRpb24tYXBpLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMvdmFsaWRhdGlvbic7XHJcbmltcG9ydCB7IFVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UgfSBmcm9tICcuLi8uLi91c2VyLWNyZWF0aW9uLXdpemFyZC5zZXJ2aWNlJztcclxuXHJcbmNvbnN0IExEQVBfUEFHRV9TSVpFID0gMTA7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAndGstdXNlci1kZXRhaWxzLXN0ZXAnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3VzZXItZGV0YWlscy1zdGVwLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3VzZXItZGV0YWlscy1zdGVwLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVc2VyRGV0YWlsc1N0ZXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgICBAT3V0cHV0KCkgdmFsaWRpdHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gICAgdXNlckRldGFpbHNGb3JtOiBGb3JtR3JvdXA7XHJcbiAgICBsZGFwU2VhcmNoRm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICAgIHVzZXJJZENoZWNrUGVuZGluZyA9IGZhbHNlO1xyXG4gICAgbG9hZGluZ0F2YWlsYWJsZU51bWJlcnMgPSBmYWxzZTtcclxuICAgIGxkYXBMb2FkaW5nID0gZmFsc2U7XHJcbiAgICBsZGFwU2VhcmNoQXR0ZW1wdGVkID0gZmFsc2U7XHJcblxyXG4gICAgcmVhZG9ubHkgbGRhcFBhZ2VTaXplID0gTERBUF9QQUdFX1NJWkU7XHJcbiAgICBsZGFwUGFnZUluZGV4ID0gMDtcclxuXHJcbiAgICByZWFkb25seSBsZGFwUXVlcnlUeXBlT3B0aW9uczogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogTGRhcFF1ZXJ5VHlwZSB9W10gPSBbXHJcbiAgICAgICAgeyBsYWJlbDogJ1VzZXIgSUQnLCB2YWx1ZTogJ3VzZXJJZCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnRmlyc3QgTmFtZScsIHZhbHVlOiAnZmlyc3ROYW1lJyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdMYXN0IE5hbWUnLCB2YWx1ZTogJ2xhc3ROYW1lJyB9LFxyXG4gICAgXTtcclxuXHJcbiAgICBmaWx0ZXJlZEF2YWlsYWJsZU51bWJlcnNCeUxpbmU6IHN0cmluZ1tdW10gPSBbXTtcclxuICAgIGZpbHRlcmVkUm91dGVQYXJ0aXRpb25zQnlMaW5lOiBzdHJpbmdbXVtdID0gW107XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVzZXJJZEFzeW5jVmFsaWRhdG9yID0gdGhpcy5jcmVhdGVVc2VySWRBc3luY1ZhbGlkYXRvcigpO1xyXG5cclxuICAgIGdldCBsaW5lc0Zvcm1BcnJheSgpOiBGb3JtQXJyYXkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ2xpbmVzJykgYXMgRm9ybUFycmF5O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkZXZpY2VzRm9ybUFycmF5KCk6IEZvcm1BcnJheSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgnZGV2aWNlcycpIGFzIEZvcm1BcnJheTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGV2aWNlUHJvZmlsZXNGb3JtQXJyYXkoKTogRm9ybUFycmF5IHtcclxuICAgICAgICByZXR1cm4gdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0KCdkZXZpY2VQcm9maWxlcycpIGFzIEZvcm1BcnJheTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2VsZWN0ZWRMZGFwVXNlcigpOiBMaXN0VXNlckludGVyZmFjZSB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2Uuc2VsZWN0ZWRMZGFwVXNlcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbGRhcFRvdGFsQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmxkYXBVc2Vyc1RvdGFsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBoYXNMZGFwVXNlcnMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5sZGFwVXNlcnMubGVuZ3RoID4gMDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGZiOiBGb3JtQnVpbGRlcixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHVzZXJDcmVhdGlvbkFwaVNlcnZpY2U6IFVzZXJDcmVhdGlvbkFwaVNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2U6IFVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2VcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMubGRhcFNlYXJjaEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgcXVlcnlWYWx1ZTogWycnXSxcclxuICAgICAgICAgICAgcXVlcnlUeXBlOiBbJ3VzZXJJZCcgYXMgTGRhcFF1ZXJ5VHlwZV0sXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgIHVzZXJJZDogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLnVzZXJJZEFzeW5jVmFsaWRhdG9yXV0sXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgbGFzdE5hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICAgIGVtYWlsOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLmVtYWlsXV0sXHJcbiAgICAgICAgICAgIGxpbmVzOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgICAgICAgICAgZGV2aWNlczogdGhpcy5mYi5hcnJheShbXSksXHJcbiAgICAgICAgICAgIGRldmljZVByb2ZpbGVzOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmJ1aWxkRHluYW1pY0Zvcm1BcnJheXMoKTtcclxuICAgICAgICB0aGlzLnBhdGNoVXNlckZpZWxkc0Zyb21TZXJ2aWNlKCk7XHJcbiAgICAgICAgdGhpcy5pbml0TGluZUZpbHRlcnMoKTtcclxuICAgICAgICB0aGlzLnNldHVwRm9ybVN5bmMoKTtcclxuICAgICAgICB0aGlzLnNldHVwVmFsaWRpdHlFbWl0dGVyKCk7XHJcbiAgICAgICAgdGhpcy5mZXRjaEluaXRpYWxBdmFpbGFibGVOdW1iZXJzKCk7XHJcbiAgICAgICAgdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmFwcGx5VXNlckRldGFpbHNGb3JtVmFsdWUodGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0UmF3VmFsdWUoKSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UuaXNMZGFwSW50ZWdyYXRlZCAmJiB0aGlzLnNlbGVjdGVkTGRhcFVzZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5hcHBseUxkYXBJbnRlZ3JhdGVkRm9ybVN0YXRlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVtaXRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBpc1N0ZXBWYWxpZCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy51c2VyRGV0YWlsc0Zvcm0udmFsaWQgJiYgIXRoaXMudXNlcklkQ2hlY2tQZW5kaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIG1hcmtBbGxBc1RvdWNoZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICAgIHRoaXMuZW1pdFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3luY1RvU2VydmljZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UuYXBwbHlVc2VyRGV0YWlsc0Zvcm1WYWx1ZSh0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXRSYXdWYWx1ZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRMaW5lR3JvdXAoaW5kZXg6IG51bWJlcik6IEZvcm1Hcm91cCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGluZXNGb3JtQXJyYXkuYXQoaW5kZXgpIGFzIEZvcm1Hcm91cDtcclxuICAgIH1cclxuXHJcbiAgICBnZXREZXZpY2VHcm91cChpbmRleDogbnVtYmVyKTogRm9ybUdyb3VwIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kZXZpY2VzRm9ybUFycmF5LmF0KGluZGV4KSBhcyBGb3JtR3JvdXA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGV2aWNlUHJvZmlsZUdyb3VwKGluZGV4OiBudW1iZXIpOiBGb3JtR3JvdXAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRldmljZVByb2ZpbGVzRm9ybUFycmF5LmF0KGluZGV4KSBhcyBGb3JtR3JvdXA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsdGVyZWROdW1iZXJzKGxpbmVJbmRleDogbnVtYmVyKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcmVkQXZhaWxhYmxlTnVtYmVyc0J5TGluZVtsaW5lSW5kZXhdID8/IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZpbHRlcmVkUm91dGVQYXJ0aXRpb25zKGxpbmVJbmRleDogbnVtYmVyKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcmVkUm91dGVQYXJ0aXRpb25zQnlMaW5lW2xpbmVJbmRleF0gPz8gW107XHJcbiAgICB9XHJcblxyXG4gICAgZmlsdGVyQXZhaWxhYmxlTnVtYmVycyhsaW5lSW5kZXg6IG51bWJlciwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgcmF3ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbCk/LnZhbHVlIHx8ICcnO1xyXG4gICAgICAgIHRoaXMuYXBwbHlOdW1iZXJGaWx0ZXIobGluZUluZGV4LCByYXcpO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbHRlclJvdXRlUGFydGl0aW9ucyhsaW5lSW5kZXg6IG51bWJlciwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgcmF3ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbCk/LnZhbHVlIHx8ICcnO1xyXG4gICAgICAgIHRoaXMuYXBwbHlSb3V0ZVBhcnRpdGlvbkZpbHRlcihsaW5lSW5kZXgsIHJhdyk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Sb3V0ZVBhcnRpdGlvblNlbGVjdGVkKGxpbmVJbmRleDogbnVtYmVyLCByb3V0ZVBhcnRpdGlvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbGluZUdyb3VwID0gdGhpcy5saW5lc0Zvcm1BcnJheS5hdChsaW5lSW5kZXgpIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICBsaW5lR3JvdXAuZ2V0KCdyb3V0ZVBhcnRpdGlvbicpPy5zZXRWYWx1ZShyb3V0ZVBhcnRpdGlvbiwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIGxpbmVHcm91cC5nZXQoJ251bWJlcicpPy5zZXRWYWx1ZSgnJyk7XHJcbiAgICAgICAgdGhpcy5hcHBseVJvdXRlUGFydGl0aW9uRmlsdGVyKGxpbmVJbmRleCwgcm91dGVQYXJ0aXRpb24pO1xyXG4gICAgICAgIHRoaXMubG9hZEF2YWlsYWJsZU51bWJlcnNGb3JMaW5lKGxpbmVJbmRleCwgcm91dGVQYXJ0aXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uTnVtYmVyU2VsZWN0ZWQobGluZUluZGV4OiBudW1iZXIsIG51bWJlcjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbGluZUdyb3VwID0gdGhpcy5saW5lc0Zvcm1BcnJheS5hdChsaW5lSW5kZXgpIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICBjb25zdCBkaXNwbGF5TnVtYmVyID0gdGhpcy5leHRyYWN0RGlyZWN0b3J5TnVtYmVyKG51bWJlcik7XHJcbiAgICAgICAgbGluZUdyb3VwLmdldCgnbnVtYmVyJyk/LnNldFZhbHVlKGRpc3BsYXlOdW1iZXIsIHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNlYXJjaExkYXBVc2VycyhwYWdlSW5kZXggPSAwKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgcXVlcnlWYWx1ZSA9IFN0cmluZyh0aGlzLmxkYXBTZWFyY2hGb3JtLmdldCgncXVlcnlWYWx1ZScpPy52YWx1ZSkudHJpbSgpIHx8IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBzaXRlSWQgPSB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2Uuc2VsZWN0ZWRTaXRlO1xyXG5cclxuICAgICAgICBpZiAoIXNpdGVJZCkge1xyXG4gICAgICAgICAgICB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2Uuc2V0TGRhcFVzZXJzUmVzdWx0KFtdLCAwKTtcclxuICAgICAgICAgICAgdGhpcy5sZGFwUGFnZUluZGV4ID0gMDtcclxuICAgICAgICAgICAgdGhpcy5sZGFwU2VhcmNoQXR0ZW1wdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubGRhcFBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcclxuICAgICAgICBjb25zdCBxdWVyeVR5cGUgPSB0aGlzLmxkYXBTZWFyY2hGb3JtLmdldCgncXVlcnlUeXBlJyk/LnZhbHVlIGFzIExkYXBRdWVyeVR5cGU7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgc2l6ZTogU3RyaW5nKExEQVBfUEFHRV9TSVpFKSxcclxuICAgICAgICAgICAgcGFnZTogU3RyaW5nKHBhZ2VJbmRleCksXHJcbiAgICAgICAgICAgIGRldmljZWxlc3M6ICd0cnVlJyxcclxuICAgICAgICAgICAgcXVlcnl0eXBlOiBxdWVyeVR5cGUsXHJcbiAgICAgICAgICAgIHdpdGhFbWFpbE9ubHk6ICd0cnVlJyxcclxuICAgICAgICAgICAgcXVlcnl2YWx1ZTogcXVlcnlWYWx1ZSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmxkYXBMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnVzZXJDcmVhdGlvbkFwaVNlcnZpY2VcclxuICAgICAgICAgICAgLmdldExkYXBVc2VycyhTdHJpbmcoc2l0ZUlkKSwgcGFyYW1zKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICAgICAgICBtYXAoKHJlczogTGRhcFVzZXJzVGFibGVSZXNwb25zZSkgPT4gKHtcclxuICAgICAgICAgICAgICAgICAgICB1c2VyczogcmVzPy5wYWdlRGF0YSA/PyBbXSxcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbDogcmVzPy50b3RhbCA/PyAwLFxyXG4gICAgICAgICAgICAgICAgfSkpLFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZih7IHVzZXJzOiBbXSwgdG90YWw6IDAgfSkpLFxyXG4gICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGRhcExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoeyB1c2VycywgdG90YWwgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sZGFwU2VhcmNoQXR0ZW1wdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5zZXRMZGFwVXNlcnNSZXN1bHQodXNlcnMsIHRvdGFsKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25MZGFwUGFnZUNoYW5nZShldmVudDogUGFnZUV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hMZGFwVXNlcnMoZXZlbnQucGFnZUluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkFkZExkYXBVc2VyKHJvdzogTGlzdFVzZXJJbnRlcmZhY2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2Uuc2VsZWN0TGRhcFVzZXIocm93KTtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgICAgICAgdXNlcklkOiByb3cudXNlcmlkLFxyXG4gICAgICAgICAgICBmaXJzdE5hbWU6IHJvdy5maXJzdE5hbWUgPz8gJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiByb3cubGFzdE5hbWUgPz8gJycsXHJcbiAgICAgICAgICAgIGVtYWlsOiByb3cuZW1haWwgPz8gJycsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5hcHBseUxkYXBJbnRlZ3JhdGVkRm9ybVN0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5lbWl0VmFsaWRpdHkoKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkRlbGV0ZUxkYXBVc2VyKHJvdzogTGlzdFVzZXJJbnRlcmZhY2UpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5pc0xkYXBVc2VyUm93U2VsZWN0ZWQocm93KSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2xlYXJMZGFwU2VsZWN0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25SZW1vdmVMZGFwVGFnKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2xlYXJMZGFwU2VsZWN0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNMZGFwVXNlclJvd1NlbGVjdGVkKHJvdzogTGlzdFVzZXJJbnRlcmZhY2UpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmlzTGRhcFVzZXJSb3dTZWxlY3RlZChyb3cpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2xlYXJMZGFwU2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5jbGVhckxkYXBVc2VyU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgICAgIHVzZXJJZDogJycsXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiAnJyxcclxuICAgICAgICAgICAgZW1haWw6ICcnLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucmVzdG9yZU1hbnVhbEVudHJ5Rm9ybVN0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5lbWl0VmFsaWRpdHkoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFwcGx5TGRhcEludGVncmF0ZWRGb3JtU3RhdGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRVc2VySWRlbnRpdHlGaWVsZHNSZWFkb25seSh0cnVlKTtcclxuICAgICAgICB0aGlzLnRvZ2dsZVVzZXJJZEFzeW5jVmFsaWRhdG9yKGZhbHNlKTtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ3VzZXJJZCcpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlc3RvcmVNYW51YWxFbnRyeUZvcm1TdGF0ZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldFVzZXJJZGVudGl0eUZpZWxkc1JlYWRvbmx5KGZhbHNlKTtcclxuICAgICAgICB0aGlzLnRvZ2dsZVVzZXJJZEFzeW5jVmFsaWRhdG9yKHRydWUpO1xyXG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgndXNlcklkJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldFVzZXJJZGVudGl0eUZpZWxkc1JlYWRvbmx5KHJlYWRvbmx5OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgWyd1c2VySWQnLCAnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJywgJ2VtYWlsJ10uZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0KGZpZWxkTmFtZSk7XHJcbiAgICAgICAgICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChyZWFkb25seSkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdG9nZ2xlVXNlcklkQXN5bmNWYWxpZGF0b3IoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ3VzZXJJZCcpO1xyXG4gICAgICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlbmFibGVkKSB7XHJcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0QXN5bmNWYWxpZGF0b3JzKFt0aGlzLnVzZXJJZEFzeW5jVmFsaWRhdG9yXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29udHJvbC5jbGVhckFzeW5jVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0dXBWYWxpZGl0eUVtaXR0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0uc3RhdHVzQ2hhbmdlc1xyXG4gICAgICAgICAgICAucGlwZShzdGFydFdpdGgodGhpcy51c2VyRGV0YWlsc0Zvcm0uc3RhdHVzKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuZW1pdFZhbGlkaXR5KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZW1pdFZhbGlkaXR5KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudmFsaWRpdHlDaGFuZ2UuZW1pdCh0aGlzLmlzU3RlcFZhbGlkKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYnVpbGREeW5hbWljRm9ybUFycmF5cygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlO1xyXG4gICAgICAgIGNvbnN0IGxpbmVzQXJyYXkgPSB0aGlzLmxpbmVzRm9ybUFycmF5O1xyXG4gICAgICAgIGNvbnN0IGRldmljZXNBcnJheSA9IHRoaXMuZGV2aWNlc0Zvcm1BcnJheTtcclxuICAgICAgICBjb25zdCBwcm9maWxlc0FycmF5ID0gdGhpcy5kZXZpY2VQcm9maWxlc0Zvcm1BcnJheTtcclxuXHJcbiAgICAgICAgd2hpbGUgKGxpbmVzQXJyYXkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGxpbmVzQXJyYXkucmVtb3ZlQXQoMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdoaWxlIChkZXZpY2VzQXJyYXkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGRldmljZXNBcnJheS5yZW1vdmVBdCgwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgd2hpbGUgKHByb2ZpbGVzQXJyYXkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHByb2ZpbGVzQXJyYXkucmVtb3ZlQXQoMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXJ2aWNlLmxpbmVzLmZvckVhY2goKGxpbmUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICAgICAgbGluZU51bWJlcjogW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGxpbmUuZGlyZWN0b3J5TnVtYmVyPy50ZW1wbGF0ZURpcmVjdG9yeU51bWJlciB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICBudW1iZXI6IFtsaW5lLmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyIHx8ICcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgICAgIHJvdXRlUGFydGl0aW9uOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgbGluZS5kaXJlY3RvcnlOdW1iZXI/LnJvdXRlUGFydGl0aW9uTmFtZSB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGxpbmVzQXJyYXkucHVzaChsaW5lR3JvdXApO1xyXG4gICAgICAgICAgICB0aGlzLnNldHVwTGluZUxpc3RlbmVycyhpbmRleCwgbGluZUdyb3VwKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc2VydmljZS5kZXZpY2VzLmZvckVhY2goZGV2aWNlID0+IHtcclxuICAgICAgICAgICAgZGV2aWNlc0FycmF5LnB1c2goXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgICAgICAgICBkZXZpY2VUeXBlOiBbeyB2YWx1ZTogZGV2aWNlLmRldmljZVR5cGUgfHwgJycsIGRpc2FibGVkOiB0cnVlIH1dLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb3RvY29sOiBbeyB2YWx1ZTogZGV2aWNlLnByb3RvY29sIHx8ICcnLCBkaXNhYmxlZDogdHJ1ZSB9XSxcclxuICAgICAgICAgICAgICAgICAgICBidXR0b25UZW1wbGF0ZTogW3sgdmFsdWU6IGRldmljZS5idXR0b25UZW1wbGF0ZSB8fCAnJywgZGlzYWJsZWQ6IHRydWUgfV0sXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdGlvbi5tYWNBZGRyZXNzKCldXSxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNlcnZpY2UuZGV2aWNlUHJvZmlsZXMuZm9yRWFjaChwcm9maWxlID0+IHtcclxuICAgICAgICAgICAgcHJvZmlsZXNBcnJheS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlVHlwZTogW3sgdmFsdWU6IHByb2ZpbGUuZGV2aWNlVHlwZSB8fCAnJywgZGlzYWJsZWQ6IHRydWUgfV0sXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2w6IFt7IHZhbHVlOiBwcm9maWxlLnByb3RvY29sIHx8ICcnLCBkaXNhYmxlZDogdHJ1ZSB9XSxcclxuICAgICAgICAgICAgICAgICAgICBidXR0b25UZW1wbGF0ZTogW3sgdmFsdWU6IHByb2ZpbGUuYnV0dG9uVGVtcGxhdGUgfHwgJycsIGRpc2FibGVkOiB0cnVlIH1dLFxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFsnJywgW1ZhbGlkYXRpb24ubWFjQWRkcmVzcygpXV0sXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcGF0Y2hVc2VyRmllbGRzRnJvbVNlcnZpY2UoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZW5kVXNlciA9IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5lbmRVc2VyO1xyXG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtLnBhdGNoVmFsdWUoe1xyXG4gICAgICAgICAgICB1c2VySWQ6IGVuZFVzZXI/LnVzZXJpZCB8fCB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UudXNlckRldGFpbHNGb3JtLnVzZXJJZCB8fCAnJyxcclxuICAgICAgICAgICAgZmlyc3ROYW1lOiBlbmRVc2VyPy5maXJzdE5hbWUgfHwgdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLnVzZXJEZXRhaWxzRm9ybS5maXJzdE5hbWUgfHwgJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiBlbmRVc2VyPy5sYXN0TmFtZSB8fCB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UudXNlckRldGFpbHNGb3JtLmxhc3ROYW1lIHx8ICcnLFxyXG4gICAgICAgICAgICBlbWFpbDogZW5kVXNlcj8uZW1haWwgfHwgdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLnVzZXJEZXRhaWxzRm9ybS5lbWFpbCB8fCAnJyxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldHVwTGluZUxpc3RlbmVycyhsaW5lSW5kZXg6IG51bWJlciwgbGluZUdyb3VwOiBGb3JtR3JvdXApOiB2b2lkIHtcclxuICAgICAgICBsaW5lR3JvdXBcclxuICAgICAgICAgICAgLmdldCgncm91dGVQYXJ0aXRpb24nKVxyXG4gICAgICAgICAgICA/LnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSgzMDApLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodmFsdWUgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseVJvdXRlUGFydGl0aW9uRmlsdGVyKGxpbmVJbmRleCwgU3RyaW5nKHZhbHVlID8/ICcnKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsaW5lR3JvdXBcclxuICAgICAgICAgICAgLmdldCgnbnVtYmVyJylcclxuICAgICAgICAgICAgPy52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMTUwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlOdW1iZXJGaWx0ZXIobGluZUluZGV4LCBTdHJpbmcodmFsdWUgPz8gJycpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0TGluZUZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgcGFydGl0aW9ucyA9IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5yb3V0ZVBhcnRpdGlvbk9wdGlvbnM7XHJcbiAgICAgICAgY29uc3QgbnVtYmVycyA9IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5hdmFpbGFibGVOdW1iZXJzO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRSb3V0ZVBhcnRpdGlvbnNCeUxpbmUgPSB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLm1hcCgoXywgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IFN0cmluZyhcclxuICAgICAgICAgICAgICAgICh0aGlzLmxpbmVzRm9ybUFycmF5LmF0KGluZGV4KSBhcyBGb3JtR3JvdXApLmdldCgncm91dGVQYXJ0aXRpb24nKT8udmFsdWUgPz8gJydcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyT3B0aW9ucyhwYXJ0aXRpb25zLCBjdXJyZW50KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkQXZhaWxhYmxlTnVtYmVyc0J5TGluZSA9IHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubWFwKChfLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gU3RyaW5nKCh0aGlzLmxpbmVzRm9ybUFycmF5LmF0KGluZGV4KSBhcyBGb3JtR3JvdXApLmdldCgnbnVtYmVyJyk/LnZhbHVlID8/ICcnKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyT3B0aW9ucyhudW1iZXJzLCBjdXJyZW50KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldHVwRm9ybVN5bmMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0udmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgyMDApLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmFwcGx5VXNlckRldGFpbHNGb3JtVmFsdWUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0UmF3VmFsdWUoKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmZXRjaEluaXRpYWxBdmFpbGFibGVOdW1iZXJzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0UGFydGl0aW9uID1cclxuICAgICAgICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICA/IFN0cmluZygodGhpcy5saW5lc0Zvcm1BcnJheS5hdCgwKSBhcyBGb3JtR3JvdXApLmdldCgncm91dGVQYXJ0aXRpb24nKT8udmFsdWUgPz8gJycpLnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UuZmlyc3RMaW5lUm91dGVQYXJ0aXRpb24gfHxcclxuICAgICAgICAgICAgICAgICAgdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLnNpdGVEZWZhdWx0Um91dGVQYXJ0aXRpb24gfHxcclxuICAgICAgICAgICAgICAgICAgJyc7XHJcblxyXG4gICAgICAgIGlmIChmaXJzdFBhcnRpdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRBdmFpbGFibGVOdW1iZXJzRm9yTGluZSgwLCBmaXJzdFBhcnRpdGlvbiwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvYWRBdmFpbGFibGVOdW1iZXJzRm9yTGluZShcclxuICAgICAgICBsaW5lSW5kZXg6IG51bWJlcixcclxuICAgICAgICByb3V0ZVBhcnRpdGlvbjogc3RyaW5nLFxyXG4gICAgICAgIGNsZWFyTnVtYmVyID0gdHJ1ZVxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2l0ZUlkID0gdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLnNlbGVjdGVkU2l0ZTtcclxuICAgICAgICBpZiAoIXNpdGVJZCB8fCAhcm91dGVQYXJ0aXRpb24udHJpbSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjbGVhck51bWJlcikge1xyXG4gICAgICAgICAgICAodGhpcy5saW5lc0Zvcm1BcnJheS5hdChsaW5lSW5kZXgpIGFzIEZvcm1Hcm91cCkuZ2V0KCdudW1iZXInKT8uc2V0VmFsdWUoJycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sb2FkaW5nQXZhaWxhYmxlTnVtYmVycyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5nZXROdW1iZXJSYW5nZShTdHJpbmcoc2l0ZUlkKSwgcm91dGVQYXJ0aXRpb24pXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpLFxyXG4gICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ0F2YWlsYWJsZU51bWJlcnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hOdW1iZXJGaWx0ZXJzKCk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlZnJlc2hOdW1iZXJGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG51bWJlcnMgPSB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UuYXZhaWxhYmxlTnVtYmVycztcclxuICAgICAgICB0aGlzLmZpbHRlcmVkQXZhaWxhYmxlTnVtYmVyc0J5TGluZSA9IHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubWFwKChfLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gU3RyaW5nKCh0aGlzLmxpbmVzRm9ybUFycmF5LmF0KGluZGV4KSBhcyBGb3JtR3JvdXApLmdldCgnbnVtYmVyJyk/LnZhbHVlID8/ICcnKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyT3B0aW9ucyhudW1iZXJzLCBjdXJyZW50KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFwcGx5TnVtYmVyRmlsdGVyKGxpbmVJbmRleDogbnVtYmVyLCByYXc6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmF3LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5hdmFpbGFibGVOdW1iZXJzIHx8IFtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRBdmFpbGFibGVOdW1iZXJzQnlMaW5lW2xpbmVJbmRleF0gPSB2YWx1ZS5sZW5ndGhcclxuICAgICAgICAgICAgPyBzb3VyY2UuZmlsdGVyKG4gPT4gISFuICYmIG4udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh2YWx1ZSkpXHJcbiAgICAgICAgICAgIDogWy4uLnNvdXJjZV07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhcHBseVJvdXRlUGFydGl0aW9uRmlsdGVyKGxpbmVJbmRleDogbnVtYmVyLCByYXc6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmF3LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5yb3V0ZVBhcnRpdGlvbk9wdGlvbnMgfHwgW107XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZFJvdXRlUGFydGl0aW9uc0J5TGluZVtsaW5lSW5kZXhdID0gdmFsdWUubGVuZ3RoXHJcbiAgICAgICAgICAgID8gc291cmNlLmZpbHRlcihuID0+ICEhbiAmJiBuLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModmFsdWUpKVxyXG4gICAgICAgICAgICA6IFsuLi5zb3VyY2VdO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZmlsdGVyT3B0aW9ucyhzb3VyY2U6IHN0cmluZ1tdLCByYXc6IHN0cmluZyk6IHN0cmluZ1tdIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHJhdy50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAoIXZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gWy4uLnNvdXJjZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzb3VyY2UuZmlsdGVyKGl0ZW0gPT4gISFpdGVtICYmIGl0ZW0udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh2YWx1ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZXh0cmFjdERpcmVjdG9yeU51bWJlcih2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpO1xyXG4gICAgICAgIGNvbnN0IHNwYWNlSW5kZXggPSB0cmltbWVkLmluZGV4T2YoJyAnKTtcclxuICAgICAgICByZXR1cm4gc3BhY2VJbmRleCA+IC0xID8gdHJpbW1lZC5zdWJzdHJpbmcoMCwgc3BhY2VJbmRleCkgOiB0cmltbWVkO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlVXNlcklkQXN5bmNWYWxpZGF0b3IoKTogQXN5bmNWYWxpZGF0b3JGbiB7XHJcbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPiA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UuaXNMZGFwSW50ZWdyYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51c2VySWRDaGVja1BlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvZihudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdXNlcklkID0gU3RyaW5nKGNvbnRyb2wudmFsdWUgPz8gJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgY29uc3Qgc2l0ZUlkID0gdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLnNlbGVjdGVkU2l0ZTtcclxuICAgICAgICAgICAgaWYgKCF1c2VySWQgfHwgIXNpdGVJZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51c2VySWRDaGVja1BlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMudXNlcklkQ2hlY2tQZW5kaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0VmFsaWRpdHkoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aW1lcig1MDApLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXJDcmVhdGlvbkFwaVNlcnZpY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmNoZWNrVXNlcklkRXhpc3RpbmcoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcoc2l0ZUlkKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChlbmNvZGVVUklDb21wb25lbnQodXNlcklkKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiAoeyB1c2VySWRFeGlzdHM6IHRydWUgfSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VySWRDaGVja1BlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VySWRDaGVja1BlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbiIsIjxhcHAtbG9hZGVyICpuZ0lmPVwibG9hZGluZ0F2YWlsYWJsZU51bWJlcnNcIj48L2FwcC1sb2FkZXI+XHJcbjxzZWN0aW9uIGNsYXNzPVwiZGV0YWlscy1zdGVwLWNvbnRlbnRcIj5cclxuICA8Zm9ybSBbZm9ybUdyb3VwXT1cInVzZXJEZXRhaWxzRm9ybVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImRldGFpbHMtc3RlcC1zZWN0aW9uc1wiPlxyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImRldGFpbHMtc3RlcC1zZWN0aW9uXCI+XHJcbiAgICAgICAgPGgzIGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25fX3RpdGxlXCI+VXNlciBkZXRhaWxzPC9oMz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25fX2NvbnRlbnRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtc2VjdGlvbl9fcGFydFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5Vc2VyIElEPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIlVzZXIgSURcIiBmb3JtQ29udHJvbE5hbWU9XCJ1c2VySWRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwidXNlckRldGFpbHNGb3JtLmdldCgndXNlcklkJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIHVzZXJEZXRhaWxzRm9ybS5nZXQoJ3VzZXJJZCcpPy50b3VjaGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgVXNlciBJRCBpcyByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInVzZXJEZXRhaWxzRm9ybS5nZXQoJ3VzZXJJZCcpPy5oYXNFcnJvcigndXNlcklkRXhpc3RzJykgJiYgdXNlckRldGFpbHNGb3JtLmdldCgndXNlcklkJyk/LnRvdWNoZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICBVc2VyIElEIGFscmVhZHkgZXhpc3RzXHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ1c2VySWRDaGVja1BlbmRpbmdcIj5DaGVja2luZyB1c2VyIElELi4uPC9tYXQtaGludD5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRfX2xhYmVsXCI+Rmlyc3QgTmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJGaXJzdCBOYW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwiZmlyc3ROYW1lXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInVzZXJEZXRhaWxzRm9ybS5nZXQoJ2ZpcnN0TmFtZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKSAmJiB1c2VyRGV0YWlsc0Zvcm0uZ2V0KCdmaXJzdE5hbWUnKT8udG91Y2hlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIEZpcnN0IG5hbWUgaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkX19sYWJlbFwiPkxhc3QgTmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJMYXN0IE5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJsYXN0TmFtZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJ1c2VyRGV0YWlsc0Zvcm0uZ2V0KCdsYXN0TmFtZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKSAmJiB1c2VyRGV0YWlsc0Zvcm0uZ2V0KCdsYXN0TmFtZScpPy50b3VjaGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgTGFzdCBuYW1lIGlzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5FbWFpbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJFbWFpbFwiIGZvcm1Db250cm9sTmFtZT1cImVtYWlsXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInVzZXJEZXRhaWxzRm9ybS5nZXQoJ2VtYWlsJyk/LmludmFsaWQgJiYgdXNlckRldGFpbHNGb3JtLmdldCgnZW1haWwnKT8udG91Y2hlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidXNlckRldGFpbHNGb3JtLmdldCgnZW1haWwnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5FbWFpbCBpcyByZXF1aXJlZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInVzZXJEZXRhaWxzRm9ybS5nZXQoJ2VtYWlsJyk/Lmhhc0Vycm9yKCdlbWFpbCcpXCI+UGxlYXNlIGVudGVyIGEgdmFsaWQgZW1haWw8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5Vc2VyIFRlbXBsYXRlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJVc2VyIFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5zZWxlY3RlZFRlbXBsYXRlTmFtZSB8fCAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25fX3BhcnRcIj5cclxuICAgICAgICAgICAgPG1hdC1hY2NvcmRpb24gY2xhc3M9XCJkZXRhaWxzLXVzZXItYWNjb3JkaW9uXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgdG9nZ2xlUG9zaXRpb249XCJiZWZvcmVcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5DaG9vc2UgYW4gZXhpc3Rpbmcgb3IgYSBMREFQIHVzZXI8L21hdC1wYW5lbC10aXRsZT5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy11c2VyLWFjY29yZGlvbl9fY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1sZGFwLXNlYXJjaFwiIFtmb3JtR3JvdXBdPVwibGRhcFNlYXJjaEZvcm1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlscy1sZGFwLXNlYXJjaF9faW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZmxvYXRMYWJlbD1cIm5ldmVyXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJxdWVyeVZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInNlYXJjaExkYXBVc2VycygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRldGFpbHMtbGRhcC1zZWFyY2hfX3NlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBmbG9hdExhYmVsPVwibmV2ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cInF1ZXJ5VHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGxkYXBRdWVyeVR5cGVPcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbi5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwLWxpc3QgKm5nSWY9XCJzZWxlY3RlZExkYXBVc2VyXCIgY2xhc3M9XCJkZXRhaWxzLWxkYXAtc2VhcmNoX19jaGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAgcmVtb3ZhYmxlIChyZW1vdmVkKT1cIm9uUmVtb3ZlTGRhcFRhZygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNlbGVjdGVkTGRhcFVzZXIudXNlcmlkIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRDaGlwUmVtb3ZlPmNhbmNlbDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtbGlzdD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWxzLWxkYXAtc2VhcmNoX19idG5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibGRhcExvYWRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlYXJjaExkYXBVc2VycygpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8YXBwLWxvYWRlciAqbmdJZj1cImxkYXBMb2FkaW5nXCI+PC9hcHAtbG9hZGVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPHBcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFsZGFwTG9hZGluZyAmJiBsZGFwU2VhcmNoQXR0ZW1wdGVkICYmICFoYXNMZGFwVXNlcnNcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlscy1sZGFwLXRhYmxlX19lbXB0eVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICBObyB1c2VycyBmb3VuZFxyXG4gICAgICAgICAgICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8dGFibGVcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFsZGFwTG9hZGluZyAmJiBoYXNMZGFwVXNlcnNcIlxyXG4gICAgICAgICAgICAgICAgICAgIG1hdC10YWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIFtkYXRhU291cmNlXT1cInVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UubGRhcFVzZXJzXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRldGFpbHMtbGRhcC10YWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInVzZXJJZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5Vc2VyIElkPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj57eyByb3cudXNlcmlkIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJmaXJzdE5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+Rmlyc3QgTmFtZTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+e3sgcm93LmZpcnN0TmFtZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibGFzdE5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+TGFzdCBOYW1lPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj57eyByb3cubGFzdE5hbWUgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImVtYWlsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkVtYWlsPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj57eyByb3cuZW1haWwgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFkZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5BZGQ8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNMZGFwVXNlclJvd1NlbGVjdGVkKHJvdyk7IGVsc2UgZGVsZXRlTGRhcFVzZXJCdG5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRldGFpbHMtbGRhcC10YWJsZV9fYWRkLWJ0blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWRkTGRhcFVzZXIocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgVXNlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWxldGVMZGFwVXNlckJ0bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRldGFpbHMtbGRhcC10YWJsZV9fYWRkLWJ0biBkZXRhaWxzLWxkYXAtdGFibGVfX2FkZC1idG4tLWRlbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRlbGV0ZUxkYXBVc2VyKHJvdylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZSB1c2VyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cInVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UubGRhcFRhYmxlQ29sdW1uc1wiPjwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IHVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UubGRhcFRhYmxlQ29sdW1uc1wiPjwvdHI+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bWF0LXBhZ2luYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWxkYXBMb2FkaW5nICYmIGhhc0xkYXBVc2Vyc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWxzLWxkYXAtcGFnaW5hdG9yXCJcclxuICAgICAgICAgICAgICAgICAgICBbbGVuZ3RoXT1cImxkYXBUb3RhbENvdW50XCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFnZVNpemVdPVwibGRhcFBhZ2VTaXplXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFnZUluZGV4XT1cImxkYXBQYWdlSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwiW2xkYXBQYWdlU2l6ZV1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtoaWRlUGFnZVNpemVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxkYXBMb2FkaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAocGFnZSk9XCJvbkxkYXBQYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICA+PC9tYXQtcGFnaW5hdG9yPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgICAgICAgICA8L21hdC1hY2NvcmRpb24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9zZWN0aW9uPlxyXG5cclxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJkZXRhaWxzLXN0ZXAtc2VjdGlvblwiPlxyXG4gICAgICAgIDxoMyBjbGFzcz1cImRldGFpbHMtc3RlcC1zZWN0aW9uX190aXRsZVwiPkxpbmVzPC9oMz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25fX2NvbnRlbnRcIiBmb3JtQXJyYXlOYW1lPVwibGluZXNcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lLXJvdXRlLWxpc3RcIj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwibGluZS1yb3V0ZS1yb3dcIlxyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBsaW5lR3JvdXAgb2YgbGluZXNGb3JtQXJyYXkuY29udHJvbHM7IGxldCBpZHggPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaWR4XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lLWluZm9cIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dCBsaW5lLXJvdXRlLWZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICBmbG9hdExhYmVsPVwibmV2ZXJcIlxyXG4gICAgICAgICAgICAgICAgICBoaWRlUmVxdWlyZWRNYXJrZXJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiTGluZSBudW1iZXJcIiBmb3JtQ29udHJvbE5hbWU9XCJsaW5lTnVtYmVyXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlscy1zdGVwLWlucHV0IGxpbmUtcm91dGUtZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgICAgICAgICAgIGZsb2F0TGFiZWw9XCJuZXZlclwiXHJcbiAgICAgICAgICAgICAgICAgIGhpZGVSZXF1aXJlZE1hcmtlclxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGZvciBhIG51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cIm51bWJlckF1dG9cIlxyXG4gICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJmaWx0ZXJBdmFpbGFibGVOdW1iZXJzKGlkeCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlXHJcbiAgICAgICAgICAgICAgICAgICAgI251bWJlckF1dG89XCJtYXRBdXRvY29tcGxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYW5lbFdpZHRoXT1cIidhdXRvJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cIm9uTnVtYmVyU2VsZWN0ZWQoaWR4LCAkZXZlbnQub3B0aW9uLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGdldEZpbHRlcmVkTnVtYmVycyhpZHgpXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgb3B0aW9uIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJnZXRMaW5lR3JvdXAoaWR4KS5nZXQoJ251bWJlcicpPy5pbnZhbGlkICYmIGdldExpbmVHcm91cChpZHgpLmdldCgnbnVtYmVyJyk/LnRvdWNoZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICBOdW1iZXIgaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dCBsaW5lLXJvdXRlLWZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICBmbG9hdExhYmVsPVwibmV2ZXJcIlxyXG4gICAgICAgICAgICAgICAgICBoaWRlUmVxdWlyZWRNYXJrZXJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCByb3V0ZSBwYXJ0aXRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJvdXRlUGFydGl0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cInJvdXRlUGFydGl0aW9uQXV0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cImZpbHRlclJvdXRlUGFydGl0aW9ucyhpZHgsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZVxyXG4gICAgICAgICAgICAgICAgICAgICNyb3V0ZVBhcnRpdGlvbkF1dG89XCJtYXRBdXRvY29tcGxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvblJvdXRlUGFydGl0aW9uU2VsZWN0ZWQoaWR4LCAkZXZlbnQub3B0aW9uLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHJvdXRlUGFydGl0aW9uIG9mIGdldEZpbHRlcmVkUm91dGVQYXJ0aXRpb25zKGlkeClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInJvdXRlUGFydGl0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyByb3V0ZVBhcnRpdGlvbiB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZ2V0TGluZUdyb3VwKGlkeCkuZ2V0KCdyb3V0ZVBhcnRpdGlvbicpPy5pbnZhbGlkICYmIGdldExpbmVHcm91cChpZHgpLmdldCgncm91dGVQYXJ0aXRpb24nKT8udG91Y2hlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFJvdXRlIHBhcnRpdGlvbiBpcyByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuXHJcbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25cIj5cclxuICAgICAgICA8aDMgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtc2VjdGlvbl9fdGl0bGVcIj5EZXZpY2VzPC9oMz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25fX2NvbnRlbnRcIiBmb3JtQXJyYXlOYW1lPVwiZGV2aWNlc1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRldmljZXMtcm93c1wiPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZHMgZGV0YWlscy1pbmxpbmUtZmllbGRzLS1mb3VyXCJcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGV2aWNlR3JvdXAgb2YgZGV2aWNlc0Zvcm1BcnJheS5jb250cm9sczsgbGV0IGlkeCA9IGluZGV4XCJcclxuICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpZHhcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5EZXZpY2UgdHlwZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZGV2aWNlVHlwZVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkX19sYWJlbFwiPlByb3RvY29sPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm90b2NvbFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkX19sYWJlbFwiPkJ1dHRvbiBUZW1wbGF0ZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiYnV0dG9uVGVtcGxhdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5OYW1lPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIk5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImdldERldmljZUdyb3VwKGlkeCkuZ2V0KCduYW1lJyk/Lmhhc0Vycm9yKCdtYWNBZGRyZXNzJykgJiYgZ2V0RGV2aWNlR3JvdXAoaWR4KS5nZXQoJ25hbWUnKT8udG91Y2hlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFBsZWFzZSBlbnRlciBhIHZhbGlkIE1BQyBhZGRyZXNzXHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZ2V0RGV2aWNlR3JvdXAoaWR4KS5nZXQoJ25hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgZ2V0RGV2aWNlR3JvdXAoaWR4KS5nZXQoJ25hbWUnKT8udG91Y2hlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIE5hbWUgaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L3NlY3Rpb24+XHJcblxyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImRldGFpbHMtc3RlcC1zZWN0aW9uXCIgKm5nSWY9XCJkZXZpY2VQcm9maWxlc0Zvcm1BcnJheS5sZW5ndGhcIj5cclxuICAgICAgICA8aDMgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtc2VjdGlvbl9fdGl0bGVcIj5EZXZpY2UgcHJvZmlsZXM8L2gzPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtc2VjdGlvbl9fY29udGVudFwiIGZvcm1BcnJheU5hbWU9XCJkZXZpY2VQcm9maWxlc1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRldmljZXMtcm93c1wiPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZHMgZGV0YWlscy1pbmxpbmUtZmllbGRzLS1mb3VyXCJcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcHJvZmlsZUdyb3VwIG9mIGRldmljZVByb2ZpbGVzRm9ybUFycmF5LmNvbnRyb2xzOyBsZXQgaWR4ID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cImlkeFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkX19sYWJlbFwiPkRldmljZSB0eXBlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJkZXZpY2VUeXBlXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRfX2xhYmVsXCI+UHJvdG9jb2w8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGV0YWlscy1zdGVwLWlucHV0XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInByb3RvY29sXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRfX2xhYmVsXCI+QnV0dG9uIFRlbXBsYXRlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJidXR0b25UZW1wbGF0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkX19sYWJlbFwiPk5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGV0YWlscy1zdGVwLWlucHV0XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiTmFtZVwiIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZ2V0RGV2aWNlUHJvZmlsZUdyb3VwKGlkeCkuZ2V0KCduYW1lJyk/Lmhhc0Vycm9yKCdtYWNBZGRyZXNzJykgJiYgZ2V0RGV2aWNlUHJvZmlsZUdyb3VwKGlkeCkuZ2V0KCduYW1lJyk/LnRvdWNoZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICBQbGVhc2UgZW50ZXIgYSB2YWxpZCBNQUMgYWRkcmVzc1xyXG4gICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZm9ybT5cclxuPC9zZWN0aW9uPlxyXG4iXX0=