@tuki-io/tuki-widgets 0.0.191 → 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.
- package/README.md +24 -24
- package/esm2020/contact-center/cc-readiness/cc-readiness.module.mjs +1 -1
- package/esm2020/contact-center/cc-readiness/cc-readiness.service.mjs +1 -1
- package/esm2020/contact-center/cc-readiness/widgets/licences-requirement/licences-requirement.component.mjs +3 -3
- package/esm2020/di2mt/widgets/site-upgrade/progress-bar/progress-bar.component.mjs +3 -3
- package/esm2020/di2mt/widgets/site-upgrade/site-upgrade-data-table/site-upgrade-data-table.component.mjs +2 -2
- package/esm2020/di2mt/widgets/upgrade-overview/cards/pending-activation-users/pending-activation-users.component.mjs +17 -17
- package/esm2020/lib/widgets.component.mjs +9 -9
- package/esm2020/lib/widgets.module.mjs +1 -1
- package/esm2020/lib/widgets.service.mjs +1 -1
- package/esm2020/public-api.mjs +1 -1
- package/esm2020/user-creation/src/app.constants.mjs +9 -2
- package/esm2020/user-creation/src/classes/notification.mjs +1 -1
- package/esm2020/user-creation/src/classes/site.mjs +1 -1
- package/esm2020/user-creation/src/environments/environment.mjs +1 -1
- package/esm2020/user-creation/src/interfaces/user-creation-wizard.interfaces.mjs +19 -0
- package/esm2020/user-creation/src/shared/components/notification/notification.component.mjs +3 -3
- package/esm2020/user-creation/src/shared/material.module.mjs +35 -7
- package/esm2020/user-creation/src/shared/pipes/truncate.pipe.mjs +1 -1
- package/esm2020/user-creation/src/shared/services/notification.service.mjs +1 -1
- package/esm2020/user-creation/src/shared/services/user-creation-api.service.mjs +42 -19
- package/esm2020/user-creation/src/shared/services/utils.mjs +1 -1
- package/esm2020/user-creation/src/user-creation.module.mjs +4 -1
- package/esm2020/user-creation/src/utils/app-loader/app-loader.mjs +14 -0
- package/esm2020/user-creation/src/utils/build-savable-end-user.mjs +147 -0
- package/esm2020/user-creation/src/utils/validation.mjs +14 -0
- package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-details-step/user-details-step.component.mjs +429 -20
- package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-overview-step/user-overview-step.component.mjs +3 -3
- package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-template-step/user-template-step.component.mjs +80 -34
- package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.component.mjs +61 -11
- package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.service.mjs +509 -130
- package/esm2020/user-device-manage/public-api.mjs +1 -1
- package/esm2020/user-device-manage/src/app.constants.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/device.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/deviceProfile.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line-association-interface.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line-association.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line-call-info-display.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line-directory.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/notification.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/recording-options.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/simplified-user.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/site-defaults.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/translation-pattern.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/types.mjs +1 -1
- package/esm2020/user-device-manage/src/common-functions.mjs +1 -1
- package/esm2020/user-device-manage/src/confirm-dialog/info-dialog.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-associated-line/associated-line-row/associated-line-row.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-associated-line/device-associated-line-details-box/device-associated-line-details-box.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-associated-line/device-associated-line-extension/device-associated-line-extension.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-associated-line/device-associated-line.component.mjs +1 -1
- package/esm2020/user-device-manage/src/device-info/device-info.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-manage-widget.component.mjs +2 -2
- package/esm2020/user-device-manage/src/environments/environment.mjs +1 -1
- package/esm2020/user-device-manage/src/interseptors/auth.interceptor.mjs +1 -1
- package/esm2020/user-device-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +3 -3
- package/esm2020/user-device-manage/src/material.module.mjs +1 -1
- package/esm2020/user-device-manage/src/notifications/notification.component.mjs +3 -3
- package/esm2020/user-device-manage/src/pipes/mac-address.pipe.mjs +1 -1
- package/esm2020/user-device-manage/src/services/api.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/device.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/dns.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/line.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/notification.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/removeKynFromIBM.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/site-settings.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/sorting-utils.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/user.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/utils.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/validation.service.mjs +1 -1
- package/esm2020/user-device-manage/src/shared/tk-page-section/page-section.component.mjs +1 -1
- package/esm2020/user-device-manage/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/user-manage/public-api.mjs +1 -1
- package/esm2020/user-manage/src/app.constants.mjs +1 -1
- package/esm2020/user-manage/src/classes/device.mjs +1 -1
- package/esm2020/user-manage/src/classes/line-association-interface.mjs +1 -1
- package/esm2020/user-manage/src/classes/line-association.mjs +1 -1
- package/esm2020/user-manage/src/classes/line-call-info-display.mjs +1 -1
- package/esm2020/user-manage/src/classes/line-directory.mjs +1 -1
- package/esm2020/user-manage/src/classes/line.mjs +1 -1
- package/esm2020/user-manage/src/classes/notification.mjs +1 -1
- package/esm2020/user-manage/src/classes/pagination.mjs +1 -1
- package/esm2020/user-manage/src/classes/recording-options.mjs +1 -1
- package/esm2020/user-manage/src/classes/simplified-user.mjs +1 -1
- package/esm2020/user-manage/src/classes/table-data.mjs +1 -1
- package/esm2020/user-manage/src/classes/translation-pattern.mjs +1 -1
- package/esm2020/user-manage/src/classes/user-list.mjs +1 -1
- package/esm2020/user-manage/src/common-functions.mjs +1 -1
- package/esm2020/user-manage/src/device-list/device-list.component.mjs +3 -3
- package/esm2020/user-manage/src/device-list/device-row/device-row.component.mjs +3 -3
- package/esm2020/user-manage/src/environments/environment.mjs +1 -1
- package/esm2020/user-manage/src/interseptors/auth.interceptor.mjs +1 -1
- package/esm2020/user-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +3 -3
- package/esm2020/user-manage/src/material.module.mjs +1 -1
- package/esm2020/user-manage/src/notifications/notification.component.mjs +3 -3
- package/esm2020/user-manage/src/removeKynFromIBM.service.mjs +1 -1
- package/esm2020/user-manage/src/services/api.service.mjs +1 -1
- package/esm2020/user-manage/src/services/dns.service.mjs +1 -1
- package/esm2020/user-manage/src/services/line.service.mjs +1 -1
- package/esm2020/user-manage/src/services/notification.service.mjs +1 -1
- package/esm2020/user-manage/src/services/removeKynFromIBM.service.mjs +1 -1
- package/esm2020/user-manage/src/services/site-settings.service.mjs +1 -1
- package/esm2020/user-manage/src/services/sorting-utils.service.mjs +1 -1
- package/esm2020/user-manage/src/services/user.service.mjs +1 -1
- package/esm2020/user-manage/src/services/utils.service.mjs +1 -1
- package/esm2020/user-manage/src/user-calling/user-calling-extension/user-calling-extension.component.mjs +3 -3
- package/esm2020/user-manage/src/user-info/user-info.component.mjs +3 -3
- package/esm2020/user-manage/src/user-manage-widget.component.mjs +2 -2
- package/esm2020/user-manage/src/user-manage.module.mjs +1 -1
- package/esm2020/user-manage/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/user-manage/src/utils/pagination/pagination.component.mjs +3 -3
- package/esm2020/users-list/public-api.mjs +1 -1
- package/esm2020/users-list/src/app.constants.mjs +1 -1
- package/esm2020/users-list/src/classes/app-location.mjs +1 -1
- package/esm2020/users-list/src/classes/device.mjs +1 -1
- package/esm2020/users-list/src/classes/line.mjs +1 -1
- package/esm2020/users-list/src/classes/move-user.mjs +1 -1
- package/esm2020/users-list/src/classes/notification.mjs +1 -1
- package/esm2020/users-list/src/classes/simlified-user.mjs +1 -1
- package/esm2020/users-list/src/classes/table-data.mjs +1 -1
- package/esm2020/users-list/src/classes/user-list.mjs +1 -1
- package/esm2020/users-list/src/move-user-wizard/move-user-stepper/device-move-user/device-move-user-wizard.component.mjs +3 -3
- package/esm2020/users-list/src/move-user-wizard/move-user-stepper/device-move-user-tab/devices-move-user-wizard-tab.component.mjs +3 -3
- package/esm2020/users-list/src/move-user-wizard/move-user-wizard.component.mjs +3 -3
- package/esm2020/users-list/src/services/api-webex.service.mjs +1 -1
- package/esm2020/users-list/src/services/api.service.mjs +1 -1
- package/esm2020/users-list/src/services/dns.service.mjs +1 -1
- package/esm2020/users-list/src/services/events-communication.service.mjs +1 -1
- package/esm2020/users-list/src/services/notification.service.mjs +1 -1
- package/esm2020/users-list/src/services/removeKynFromIBM.service.mjs +1 -1
- package/esm2020/users-list/src/services/site-settings.service.mjs +1 -1
- package/esm2020/users-list/src/services/user.service.mjs +1 -1
- package/esm2020/users-list/src/user-list-confirm-dialog/user-list-confirm-dialog.component.mjs +3 -3
- package/esm2020/users-list/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/users-list/src/utils/common-functions.mjs +1 -1
- package/esm2020/users-list/src/utils/utils.service.mjs +1 -1
- package/fesm2015/tuki-io-tuki-widgets-contact-center.mjs +2 -2
- package/fesm2015/tuki-io-tuki-widgets-contact-center.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs +20 -20
- package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs +1448 -302
- package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs +18 -18
- package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs +18 -18
- package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-users-list.mjs +10 -10
- package/fesm2015/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets.mjs +8 -8
- package/fesm2015/tuki-io-tuki-widgets.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-contact-center.mjs +2 -2
- package/fesm2020/tuki-io-tuki-widgets-contact-center.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs +20 -20
- package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs +1410 -289
- package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs +18 -18
- package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs +18 -18
- package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-users-list.mjs +10 -10
- package/fesm2020/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets.mjs +8 -8
- package/fesm2020/tuki-io-tuki-widgets.mjs.map +1 -1
- package/package.json +1 -1
- package/user-creation/src/app.constants.d.ts +7 -0
- package/user-creation/src/interfaces/user-creation-wizard.interfaces.d.ts +483 -0
- package/user-creation/src/shared/material.module.d.ts +5 -1
- package/user-creation/src/shared/services/user-creation-api.service.d.ts +8 -2
- package/user-creation/src/user-creation.module.d.ts +11 -10
- package/user-creation/src/utils/app-loader/app-loader.d.ts +6 -0
- package/user-creation/src/utils/build-savable-end-user.d.ts +23 -0
- package/user-creation/src/utils/validation.d.ts +4 -0
- package/user-creation/src/widgets/user-creation-wizard/components/user-details-step/user-details-step.component.d.ts +75 -7
- package/user-creation/src/widgets/user-creation-wizard/components/user-template-step/user-template-step.component.d.ts +11 -4
- package/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.component.d.ts +13 -0
- package/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.service.d.ts +57 -56
|
@@ -1,29 +1,438 @@
|
|
|
1
|
-
import { Component } from
|
|
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 "
|
|
4
|
-
import * as i2 from "
|
|
5
|
-
import * as i3 from "
|
|
6
|
-
import * as i4 from "@angular/
|
|
7
|
-
import * as i5 from "@angular/material/
|
|
8
|
-
import * as i6 from "@angular/material/
|
|
9
|
-
import * as i7 from "@angular/material/
|
|
10
|
-
import * as i8 from "@angular/material/
|
|
11
|
-
import * as i9 from "@angular/material/
|
|
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
|
-
|
|
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
|
-
|
|
17
|
-
|
|
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
|
-
|
|
20
|
-
return
|
|
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=
|