@ieeesa-npm/tenants 0.4.4 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/ieeesa-npm-tenants.mjs +5 -0
- package/esm2022/lib/assets/constants.json +454 -0
- package/esm2022/lib/assets/tenant-validations.mjs +17 -0
- package/esm2022/lib/components/create-modify-group-type/create-modify-group-type.component.mjs +476 -0
- package/esm2022/lib/components/create-modify-role/create-modify-role.component.mjs +279 -0
- package/esm2022/lib/components/create-tenant-application/create-tenant-application.component.mjs +512 -0
- package/esm2022/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.mjs +391 -0
- package/esm2022/lib/components/tenant-basic-details/tenant-basic-details.component.mjs +94 -0
- package/esm2022/lib/components/view-tenant-details/view-tenant-details.component.mjs +733 -0
- package/esm2022/lib/components/view-tenant-group-types/view-tenant-group-types.component.mjs +194 -0
- package/esm2022/lib/components/view-tenants-list/view-tenants-list.component.mjs +335 -0
- package/esm2022/lib/models/app-type-config.model.mjs +2 -0
- package/esm2022/lib/models/app-type.model.mjs +7 -0
- package/esm2022/lib/models/create-group-type-config.model.mjs +22 -0
- package/esm2022/lib/models/create-group-type.model.mjs +2 -0
- package/esm2022/lib/models/feature-permission-id.model.mjs +8 -0
- package/esm2022/lib/models/features.model.mjs +2 -0
- package/esm2022/lib/models/permission-type.model.mjs +12 -0
- package/esm2022/lib/models/role-menu-action.model.mjs +7 -0
- package/esm2022/lib/models/role-type.model.mjs +2 -0
- package/esm2022/lib/models/roles-and-permissions-table-type.model.mjs +7 -0
- package/esm2022/lib/models/roles-and-permissions.model.mjs +2 -0
- package/esm2022/lib/models/route-config.model.mjs +2 -0
- package/esm2022/lib/models/table-column-schema-view-tenant-list.model.mjs +16 -0
- package/esm2022/lib/models/tenant-function-type.model.mjs +12 -0
- package/esm2022/lib/models/tenant.model.mjs +2 -0
- package/esm2022/lib/models/tenants-permission.model.mjs +2 -0
- package/esm2022/lib/models/update-tenant-status.model.mjs +2 -0
- package/esm2022/lib/models/view-tenant-group-types.model.mjs +11 -0
- package/esm2022/lib/services/tenant-applications.service.mjs +618 -0
- package/esm2022/lib/services/tenant-permissions-map.service.mjs +36 -0
- package/esm2022/lib/services/tenant-permissions.service.mjs +38 -0
- package/esm2022/lib/tenant-applications.component.mjs +14 -0
- package/esm2022/lib/tenant-applications.module.mjs +16 -0
- package/esm2022/public-api.mjs +36 -0
- package/fesm2022/ieeesa-npm-tenants.mjs +4233 -0
- package/fesm2022/ieeesa-npm-tenants.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/assets/tenant-validations.d.ts +15 -0
- package/lib/components/create-modify-group-type/create-modify-group-type.component.d.ts +129 -0
- package/lib/components/create-modify-role/create-modify-role.component.d.ts +103 -0
- package/lib/components/create-tenant-application/create-tenant-application.component.d.ts +128 -0
- package/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.d.ts +106 -0
- package/lib/components/tenant-basic-details/tenant-basic-details.component.d.ts +471 -0
- package/lib/components/view-tenant-details/view-tenant-details.component.d.ts +223 -0
- package/lib/components/view-tenant-group-types/view-tenant-group-types.component.d.ts +63 -0
- package/lib/components/view-tenants-list/view-tenants-list.component.d.ts +134 -0
- package/lib/models/app-type-config.model.d.ts +14 -0
- package/lib/models/app-type.model.d.ts +4 -0
- package/lib/models/create-group-type-config.model.d.ts +16 -0
- package/lib/models/create-group-type.model.d.ts +49 -0
- package/lib/models/feature-permission-id.model.d.ts +4 -0
- package/lib/models/features.model.d.ts +15 -0
- package/lib/models/permission-type.model.d.ts +8 -0
- package/lib/models/role-menu-action.model.d.ts +4 -0
- package/lib/models/role-type.model.d.ts +27 -0
- package/lib/models/roles-and-permissions-table-type.model.d.ts +4 -0
- package/lib/models/roles-and-permissions.model.d.ts +119 -0
- package/lib/models/route-config.model.d.ts +4 -0
- package/lib/models/table-column-schema-view-tenant-list.model.d.ts +20 -0
- package/lib/models/tenant-function-type.model.d.ts +9 -0
- package/lib/models/tenant.model.d.ts +51 -0
- package/lib/models/tenants-permission.model.d.ts +9 -0
- package/lib/models/update-tenant-status.model.d.ts +14 -0
- package/lib/models/view-tenant-group-types.model.d.ts +29 -0
- package/lib/services/tenant-applications.service.d.ts +399 -0
- package/lib/services/tenant-permissions-map.service.d.ts +13 -0
- package/lib/services/tenant-permissions.service.d.ts +22 -0
- package/lib/tenant-applications.component.d.ts +5 -0
- package/lib/tenant-applications.module.d.ts +6 -0
- package/package.json +25 -12
- package/{src/public-api.ts → public-api.d.ts} +32 -40
- package/.eslintrc.json +0 -31
- package/ng-package.json +0 -8
- package/src/lib/assets/constants.json +0 -454
- package/src/lib/assets/tenant-validations.ts +0 -18
- package/src/lib/assets/tenants-mock.ts +0 -1240
- package/src/lib/components/create-modify-group-type/create-modify-group-type.component.html +0 -15
- package/src/lib/components/create-modify-group-type/create-modify-group-type.component.scss +0 -44
- package/src/lib/components/create-modify-group-type/create-modify-group-type.component.spec.ts +0 -574
- package/src/lib/components/create-modify-group-type/create-modify-group-type.component.ts +0 -602
- package/src/lib/components/create-modify-role/create-modify-role.component.html +0 -15
- package/src/lib/components/create-modify-role/create-modify-role.component.scss +0 -83
- package/src/lib/components/create-modify-role/create-modify-role.component.spec.ts +0 -346
- package/src/lib/components/create-modify-role/create-modify-role.component.ts +0 -321
- package/src/lib/components/create-tenant-application/create-tenant-application.component.html +0 -18
- package/src/lib/components/create-tenant-application/create-tenant-application.component.scss +0 -73
- package/src/lib/components/create-tenant-application/create-tenant-application.component.spec.ts +0 -775
- package/src/lib/components/create-tenant-application/create-tenant-application.component.ts +0 -638
- package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.html +0 -22
- package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.scss +0 -79
- package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.spec.ts +0 -716
- package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.ts +0 -504
- package/src/lib/components/tenant-basic-details/tenant-basic-details.component.html +0 -44
- package/src/lib/components/tenant-basic-details/tenant-basic-details.component.scss +0 -16
- package/src/lib/components/tenant-basic-details/tenant-basic-details.component.spec.ts +0 -115
- package/src/lib/components/tenant-basic-details/tenant-basic-details.component.ts +0 -109
- package/src/lib/components/view-tenant-details/view-tenant-details.component.html +0 -195
- package/src/lib/components/view-tenant-details/view-tenant-details.component.scss +0 -163
- package/src/lib/components/view-tenant-details/view-tenant-details.component.spec.ts +0 -1221
- package/src/lib/components/view-tenant-details/view-tenant-details.component.ts +0 -876
- package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.html +0 -10
- package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.scss +0 -44
- package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.spec.ts +0 -410
- package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.ts +0 -219
- package/src/lib/components/view-tenants-list/view-tenants-list.component.html +0 -32
- package/src/lib/components/view-tenants-list/view-tenants-list.component.scss +0 -35
- package/src/lib/components/view-tenants-list/view-tenants-list.component.spec.ts +0 -464
- package/src/lib/components/view-tenants-list/view-tenants-list.component.ts +0 -388
- package/src/lib/models/app-type-config.model.ts +0 -14
- package/src/lib/models/app-type.model.ts +0 -5
- package/src/lib/models/create-group-type-config.model.ts +0 -18
- package/src/lib/models/create-group-type.model.ts +0 -46
- package/src/lib/models/feature-permission-id.model.ts +0 -6
- package/src/lib/models/features.model.ts +0 -15
- package/src/lib/models/form-status.model.ts +0 -5
- package/src/lib/models/permission-type.model.ts +0 -9
- package/src/lib/models/role-menu-action.model.ts +0 -5
- package/src/lib/models/role-type.model.ts +0 -34
- package/src/lib/models/roles-and-permissions-table-type.model.ts +0 -5
- package/src/lib/models/roles-and-permissions.model.ts +0 -113
- package/src/lib/models/route-config.model.ts +0 -4
- package/src/lib/models/table-column-schema-view-tenant-list.model.ts +0 -21
- package/src/lib/models/tenant-function-type.model.ts +0 -10
- package/src/lib/models/tenant.model.ts +0 -47
- package/src/lib/models/tenants-permission.model.ts +0 -9
- package/src/lib/models/update-tenant-status.model.ts +0 -12
- package/src/lib/models/view-tenant-group-types.model.ts +0 -34
- package/src/lib/services/tenant-applications.service.spec.ts +0 -1245
- package/src/lib/services/tenant-applications.service.ts +0 -798
- package/src/lib/services/tenant-permissions-map.service.spec.ts +0 -25
- package/src/lib/services/tenant-permissions-map.service.ts +0 -28
- package/src/lib/services/tenant-permissions.service.spec.ts +0 -62
- package/src/lib/services/tenant-permissions.service.ts +0 -49
- package/src/lib/tenant-applications.component.html +0 -0
- package/src/lib/tenant-applications.component.scss +0 -0
- package/src/lib/tenant-applications.component.spec.ts +0 -28
- package/src/lib/tenant-applications.component.ts +0 -12
- package/src/lib/tenant-applications.module.ts +0 -8
- package/tsconfig.lib.json +0 -14
- package/tsconfig.lib.prod.json +0 -10
- package/tsconfig.spec.json +0 -14
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Subject, catchError, map } from 'rxjs';
|
|
3
|
+
import * as screenTexts from '../assets/constants.json';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@ieeesa-npm/utility";
|
|
6
|
+
import * as i2 from "./tenant-permissions.service";
|
|
7
|
+
import * as i3 from "./tenant-permissions-map.service";
|
|
8
|
+
export class TenantApplicationsService {
|
|
9
|
+
constructor(
|
|
10
|
+
// eslint-disable-next-line no-unused-vars
|
|
11
|
+
httpService,
|
|
12
|
+
// eslint-disable-next-line no-unused-vars
|
|
13
|
+
tenantPermissionsService,
|
|
14
|
+
// eslint-disable-next-line no-unused-vars
|
|
15
|
+
tenantPermissionsMapService // eslint-disable-next-line no-empty-function
|
|
16
|
+
) {
|
|
17
|
+
this.httpService = httpService;
|
|
18
|
+
this.tenantPermissionsService = tenantPermissionsService;
|
|
19
|
+
this.tenantPermissionsMapService = tenantPermissionsMapService;
|
|
20
|
+
this.tenantsText = screenTexts?.viewTenants?.errors;
|
|
21
|
+
this.createTenantsText = screenTexts?.createTenant?.errors;
|
|
22
|
+
this.radioOptions = [];
|
|
23
|
+
this.checkBoxOptions = [];
|
|
24
|
+
this.appTypeInfo = [];
|
|
25
|
+
this.featureList = [];
|
|
26
|
+
this.roleTypeOptions = [];
|
|
27
|
+
this.isGroupTypeAddedOrModified = new Subject();
|
|
28
|
+
}
|
|
29
|
+
setAppConfig(apiBaseUrl, userPermission) {
|
|
30
|
+
this.apiBaseUrl = apiBaseUrl;
|
|
31
|
+
this.userPermission = userPermission;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Gets tenant details from server using HttpService
|
|
35
|
+
* @param {string} appId
|
|
36
|
+
* @return {Observable<TenantDetailsResponse>}
|
|
37
|
+
* @memberof TenantApplicationsService
|
|
38
|
+
*/
|
|
39
|
+
getTenantDetails(appId) {
|
|
40
|
+
return this.httpService
|
|
41
|
+
.getData(`${this.apiBaseUrl}/configurations/app/details/${appId}`)
|
|
42
|
+
.pipe(map((response) => {
|
|
43
|
+
return response;
|
|
44
|
+
}), catchError((error) => {
|
|
45
|
+
throw error;
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Sets the user tenants permissions
|
|
50
|
+
* @param {TenantsPermissions[]} TenantsPermissions
|
|
51
|
+
* @memberof TenantApplicationsService
|
|
52
|
+
*/
|
|
53
|
+
setUserTenantsPermissions(userTenantsPermissions) {
|
|
54
|
+
this.userTenantsPermissions = userTenantsPermissions;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Returns the user tenants permissions
|
|
58
|
+
* @return {TenantsPermissions[]}
|
|
59
|
+
* @memberof TenantApplicationsService
|
|
60
|
+
*/
|
|
61
|
+
getUserTenantsPermissions() {
|
|
62
|
+
return this.userTenantsPermissions;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Sets the user tenants information
|
|
66
|
+
* @param {TenantBasicInfo} tenantInfo
|
|
67
|
+
* @memberof TenantApplicationsService
|
|
68
|
+
*/
|
|
69
|
+
setSelectedTenantInformation(tenantInfo) {
|
|
70
|
+
this.selectedTenantInfo = tenantInfo;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Returns the tenants information
|
|
74
|
+
* @return {TenantBasicInfo}
|
|
75
|
+
* @memberof TenantApplicationsService
|
|
76
|
+
*/
|
|
77
|
+
getSelectedTenantInformation() {
|
|
78
|
+
return this.selectedTenantInfo;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Sets the roles informations
|
|
82
|
+
* @param {Role} roles
|
|
83
|
+
* @memberof TenantApplicationsService
|
|
84
|
+
*/
|
|
85
|
+
setRolesInfo(roles) {
|
|
86
|
+
this.roles = roles;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Returns the roles information
|
|
90
|
+
* @return {Role}
|
|
91
|
+
* @memberof TenantApplicationsService
|
|
92
|
+
*/
|
|
93
|
+
getRolesInfo() {
|
|
94
|
+
return this.roles;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Sets the selected role information.
|
|
98
|
+
* @param {RoleDetails} roleInfo
|
|
99
|
+
* @memberof TenantApplicationsService
|
|
100
|
+
*/
|
|
101
|
+
setSelectedRoleInformation(roleInfo) {
|
|
102
|
+
this.selectedRoleInfo = roleInfo;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Returns the selected role information.
|
|
106
|
+
* @return {RoleDetails}
|
|
107
|
+
* @memberof TenantApplicationsService
|
|
108
|
+
*/
|
|
109
|
+
getSelectedRoleInformation() {
|
|
110
|
+
return this.selectedRoleInfo;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Sets the tenant role type options.
|
|
114
|
+
* @param {RoleTypeOption} roleTypeOptions
|
|
115
|
+
* @memberof TenantApplicationsService
|
|
116
|
+
*/
|
|
117
|
+
setRoleTypeOption(roleTypeOptions) {
|
|
118
|
+
this.roleTypeOption = roleTypeOptions;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Returns the tenant role type options.
|
|
122
|
+
* @return {RoleTypeOption}
|
|
123
|
+
* @memberof TenantApplicationsService
|
|
124
|
+
*/
|
|
125
|
+
getRoleTypeOption() {
|
|
126
|
+
return this.roleTypeOption;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Sets the list of application type information
|
|
130
|
+
* @param {RadioOption} appTypeInfo
|
|
131
|
+
* @memberof TenantApplicationsService
|
|
132
|
+
*/
|
|
133
|
+
setApplicationType(appTypeInfo) {
|
|
134
|
+
this.appTypeInfo = appTypeInfo;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Returns the list of application type information
|
|
138
|
+
* @return {RadioOption}
|
|
139
|
+
* @memberof TenantApplicationsService
|
|
140
|
+
*/
|
|
141
|
+
getApplicationType() {
|
|
142
|
+
return this.appTypeInfo;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Filter permissions
|
|
146
|
+
* @param usersPermissions
|
|
147
|
+
* @returns @memberof TenantApplicationsService
|
|
148
|
+
*/
|
|
149
|
+
filterPermission(usersPermissions) {
|
|
150
|
+
return this.tenantPermissionsService?.filterTenantsPermissions(usersPermissions, this.tenantPermissionsMapService?.getGlobalTenantsPermissions());
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Validating access for tenants
|
|
154
|
+
* @param permissionType Permission Type to validate permission
|
|
155
|
+
* @param mappedUserPermissions Permission which are mapped with tenants
|
|
156
|
+
* @returns true if permission is granted
|
|
157
|
+
*/
|
|
158
|
+
validateAccess(permissionType, permissions) {
|
|
159
|
+
return this.tenantPermissionsService.validateAccessPermission(permissionType, permissions);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Gets the tenants.
|
|
163
|
+
* @param {GetTenantsPayload} payload
|
|
164
|
+
* @return {Observable<GetTenantsResponse>}
|
|
165
|
+
* @memberof TenantApplicationsService
|
|
166
|
+
*/
|
|
167
|
+
getTenantsList(payload) {
|
|
168
|
+
return this.httpService
|
|
169
|
+
.postData(`${this.apiBaseUrl}/configurations/app/config`, payload)
|
|
170
|
+
.pipe(map((response) => {
|
|
171
|
+
return response;
|
|
172
|
+
}), catchError((error) => {
|
|
173
|
+
throw error;
|
|
174
|
+
}));
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Gets list of features from server using HttpService.
|
|
178
|
+
* @return {Observable<GetFeaturesResponse>}
|
|
179
|
+
* @memberof TenantApplicationsService
|
|
180
|
+
*/
|
|
181
|
+
getFeatures() {
|
|
182
|
+
return this.httpService
|
|
183
|
+
.getData(`${this.apiBaseUrl}/configurations/app/features`)
|
|
184
|
+
.pipe(map((response) => {
|
|
185
|
+
return response;
|
|
186
|
+
}), catchError((error) => {
|
|
187
|
+
throw error;
|
|
188
|
+
}));
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Gets list of roles from server using HttpService.
|
|
192
|
+
* @param {string} appId
|
|
193
|
+
* @return {*} {Observable<GetRolesResponse>}
|
|
194
|
+
* @memberof TenantApplicationsService
|
|
195
|
+
*/
|
|
196
|
+
getRoles(appId) {
|
|
197
|
+
return this.httpService
|
|
198
|
+
.getData(`${this.apiBaseUrl}/groups/role/${appId}`)
|
|
199
|
+
.pipe(map((response) => {
|
|
200
|
+
return response;
|
|
201
|
+
}), catchError((error) => {
|
|
202
|
+
throw error;
|
|
203
|
+
}));
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Gets the list of permissions based on the appId and return the success or error response as Observable.
|
|
207
|
+
* @param {string} appId
|
|
208
|
+
* @return {Observable<GetPermissionsResponse>}
|
|
209
|
+
* @memberof TenantApplicationsService
|
|
210
|
+
*/
|
|
211
|
+
getPermissions(appId) {
|
|
212
|
+
return this.httpService
|
|
213
|
+
.getData(`${this.apiBaseUrl}/groups/permissions/${appId}`)
|
|
214
|
+
.pipe(map((response) => {
|
|
215
|
+
return response;
|
|
216
|
+
}), catchError((error) => {
|
|
217
|
+
throw error;
|
|
218
|
+
}));
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Gets the list of roles or permissions based on the roleId or permissionId in the payload and return the success or error response as Observable.
|
|
222
|
+
* @param {RolePermissionMappingRequestPayload} payload
|
|
223
|
+
* @returns {Observable<RolePermissionMappingResponse>}
|
|
224
|
+
* @memberof TenantApplicationsService
|
|
225
|
+
*/
|
|
226
|
+
getRolePermissionMapping(payload) {
|
|
227
|
+
return this.httpService
|
|
228
|
+
.postData(`${this.apiBaseUrl}/groups/users/rolePermissionMapping`, payload)
|
|
229
|
+
.pipe(map((response) => {
|
|
230
|
+
return response;
|
|
231
|
+
}), catchError((error) => {
|
|
232
|
+
throw error;
|
|
233
|
+
}));
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Submit the new mappings of roles to permissions to the server.
|
|
237
|
+
* @param {RolesAndPermissionsRequestPayload} payload
|
|
238
|
+
* @returns {Observable<RolesAndPermissionsResponse>}
|
|
239
|
+
* @memberof TenantApplicationsService
|
|
240
|
+
*/
|
|
241
|
+
saveRolePermissionMapping(payload) {
|
|
242
|
+
return this.httpService
|
|
243
|
+
.postData(`${this.apiBaseUrl}/groups/users/rolePermission`, payload)
|
|
244
|
+
.pipe(map((response) => {
|
|
245
|
+
return response;
|
|
246
|
+
}), catchError((error) => {
|
|
247
|
+
throw error;
|
|
248
|
+
}));
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Gets list of roles and permissions mappings from server using HttpService.
|
|
252
|
+
* @param {string} appId
|
|
253
|
+
* @param {GetRolesAndPermissionsPayload} payload
|
|
254
|
+
* @return {*} {Observable<GetRolesAndPermissionsResponse>}
|
|
255
|
+
* @memberof TenantApplicationsService
|
|
256
|
+
*/
|
|
257
|
+
getRolesAndPermissionsMappings(appId, payload) {
|
|
258
|
+
return this.httpService
|
|
259
|
+
.postData(`${this.apiBaseUrl}/groups/roleBasedPermissions/${appId}`, payload)
|
|
260
|
+
.pipe(map((response) => {
|
|
261
|
+
return response;
|
|
262
|
+
}), catchError((error) => {
|
|
263
|
+
throw error;
|
|
264
|
+
}));
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Gets list of application types from server using HttpService.
|
|
268
|
+
* @return {Observable<GetAppTypesResponse>}
|
|
269
|
+
* @memberof TenantApplicationsService
|
|
270
|
+
*/
|
|
271
|
+
getApplicationTypes() {
|
|
272
|
+
return this.httpService
|
|
273
|
+
.getData(`${this.apiBaseUrl}/configurations/config/app_type`)
|
|
274
|
+
.pipe(map((response) => {
|
|
275
|
+
return response;
|
|
276
|
+
}), catchError((error) => {
|
|
277
|
+
throw error;
|
|
278
|
+
}));
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Posts create role form data to server using HttpService to create a new role.
|
|
282
|
+
* @param {CreateModifyRoleRequestPayload} createModifyRolePayload
|
|
283
|
+
* @return {Observable<CreateModifyRoleResponse>}
|
|
284
|
+
* @memberof TenantApplicationsService
|
|
285
|
+
*/
|
|
286
|
+
createRole(createModifyRolePayload) {
|
|
287
|
+
return this.httpService
|
|
288
|
+
.postData(`${this.apiBaseUrl}/groups/role`, createModifyRolePayload)
|
|
289
|
+
.pipe(map((response) => {
|
|
290
|
+
return response;
|
|
291
|
+
}), catchError((error) => {
|
|
292
|
+
throw error;
|
|
293
|
+
}));
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Posts the edited role form data to server using HttpService for updating the role information.
|
|
297
|
+
* @param {CreateModifyRoleRequestPayload} createModifyRolePayload
|
|
298
|
+
* @return {Observable<CreateModifyRoleResponse>}
|
|
299
|
+
* @memberof TenantApplicationsService
|
|
300
|
+
*/
|
|
301
|
+
editRole(createModifyRolePayload) {
|
|
302
|
+
return this.httpService
|
|
303
|
+
.putData(`${this.apiBaseUrl}/groups/role`, createModifyRolePayload)
|
|
304
|
+
.pipe(map((response) => {
|
|
305
|
+
return response;
|
|
306
|
+
}), catchError((error) => {
|
|
307
|
+
throw error;
|
|
308
|
+
}));
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Gets list of role types from server using HttpService.
|
|
312
|
+
* @param {GetRoleTypesPayload} payload
|
|
313
|
+
* @return {Observable<RoleTypeResponse>}
|
|
314
|
+
* @memberof TenantApplicationsService
|
|
315
|
+
*/
|
|
316
|
+
getRoleTypes(payload) {
|
|
317
|
+
return this.httpService
|
|
318
|
+
.postData(`${this.apiBaseUrl}/configurations/config/configField`, payload)
|
|
319
|
+
.pipe(map((response) => {
|
|
320
|
+
return response;
|
|
321
|
+
}), catchError((error) => {
|
|
322
|
+
throw error;
|
|
323
|
+
}));
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Constructs the select/dropdown options from the role types received from server.
|
|
327
|
+
* @param {RoleTypeConfiguration[]} roleTypeResponse
|
|
328
|
+
* @return {RoleTypeOption[]}
|
|
329
|
+
* @memberof TenantApplicationsService
|
|
330
|
+
*/
|
|
331
|
+
getRoleTypeOptions(roleTypeResponse) {
|
|
332
|
+
this.roleTypeOptions = [];
|
|
333
|
+
roleTypeResponse.forEach((item) => {
|
|
334
|
+
this.roleTypeOptions?.push({
|
|
335
|
+
id: item?.configFieldId,
|
|
336
|
+
name: item?.configFieldValue?.roleTypeName,
|
|
337
|
+
order: item?.configFieldValue?.viewOrder,
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
this.roleTypeOptions.sort((a, b) => a.order - b.order);
|
|
341
|
+
return this.roleTypeOptions;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Posts tenant application form data to server using HttpService for creating new tenant application.
|
|
345
|
+
* @param {CreateTenantPayload} createTenantPayload
|
|
346
|
+
* @return {Observable<CreateTenantResponse>}
|
|
347
|
+
* @memberof TenantApplicationsService
|
|
348
|
+
*/
|
|
349
|
+
createTenant(createTenantPayload) {
|
|
350
|
+
return this.httpService
|
|
351
|
+
.postData(`${this.apiBaseUrl}/configurations/app/createTenant`, createTenantPayload)
|
|
352
|
+
.pipe(map((response) => {
|
|
353
|
+
return response;
|
|
354
|
+
}), catchError((error) => {
|
|
355
|
+
throw error;
|
|
356
|
+
}));
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Constructs the checkbox options from features list from server.
|
|
360
|
+
* @param {FeaturesList[]} features
|
|
361
|
+
* @returns {CheckboxOption[]}
|
|
362
|
+
*/
|
|
363
|
+
getFeatureOptions(features) {
|
|
364
|
+
this.checkBoxOptions = [];
|
|
365
|
+
features?.forEach((feature) => {
|
|
366
|
+
this.checkBoxOptions?.push({
|
|
367
|
+
id: feature?.featureId,
|
|
368
|
+
name: feature?.featureName,
|
|
369
|
+
checked: feature?.isDefault,
|
|
370
|
+
disabled: feature?.isDefault,
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
return this.checkBoxOptions;
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Constructs the radio options from application types from server.
|
|
377
|
+
* @param {AppTypeConfig[]} appTypeOptions
|
|
378
|
+
* @returns {RadioOption[]}
|
|
379
|
+
*/
|
|
380
|
+
getApplicationTypeOptions(appTypeOptions) {
|
|
381
|
+
this.radioOptions = [];
|
|
382
|
+
appTypeOptions?.forEach((appType) => {
|
|
383
|
+
this.radioOptions?.push({
|
|
384
|
+
id: appType?.configFieldId,
|
|
385
|
+
label: appType?.configFieldValue?.type,
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
return this.radioOptions;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Constructs the selected features id's.
|
|
392
|
+
* @param {CheckboxOption[]} featureOptions
|
|
393
|
+
* @returns {FeatureId[]}
|
|
394
|
+
*/
|
|
395
|
+
getFeatureIds(featureOptions) {
|
|
396
|
+
const featureIds = [];
|
|
397
|
+
featureOptions?.forEach((featureOption) => {
|
|
398
|
+
if (featureOption?.checked) {
|
|
399
|
+
featureIds.push({
|
|
400
|
+
featureId: featureOption.id,
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
return featureIds;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Sets the newly created tenant information.
|
|
408
|
+
* @param {NewTenantInfo} newTenantInfo
|
|
409
|
+
*/
|
|
410
|
+
setNewTenantInfo(newTenantInfo) {
|
|
411
|
+
this.newTenantInfo = newTenantInfo;
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Returns the newly created tenant information.
|
|
415
|
+
*/
|
|
416
|
+
get getNewTenantInfo() {
|
|
417
|
+
return this.newTenantInfo;
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Sets tenant function type.
|
|
421
|
+
* @param {TenantFunctionType} tenantFunctionType -tenant function type.
|
|
422
|
+
*/
|
|
423
|
+
setTenantFunctionType(tenantFunctionType) {
|
|
424
|
+
this.tenantFunctionType = tenantFunctionType;
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Returns tenant function type.
|
|
428
|
+
* @return {TenantFunctionType} -tenant function type.
|
|
429
|
+
*/
|
|
430
|
+
getTenantFunctionType() {
|
|
431
|
+
return this.tenantFunctionType;
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Stores the newly created role information.
|
|
435
|
+
* @param {RoleInfo} newlyCreatedRole -create role information.
|
|
436
|
+
*/
|
|
437
|
+
setNewlyCreatedRoleInfo(newlyCreatedRole) {
|
|
438
|
+
this.newlyCreatedRole = newlyCreatedRole;
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Returns the newly created role information.
|
|
442
|
+
* @return {RoleInfo} -create role information.
|
|
443
|
+
*/
|
|
444
|
+
getNewlyCreatedRoleInfo() {
|
|
445
|
+
return this.newlyCreatedRole;
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Stores the newly created group type information.
|
|
449
|
+
* @param {CreatedOrModifiedGroupTypeInfo} newlyCreatedGroupType
|
|
450
|
+
* @memberof TenantApplicationsService
|
|
451
|
+
*/
|
|
452
|
+
setNewlyCreatedGroupTypeInfo(newlyCreatedGroupType) {
|
|
453
|
+
this.newlyCreatedGroupType = newlyCreatedGroupType;
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Returns the newly created group type information.
|
|
457
|
+
* @return {*} {CreatedOrModifiedGroupTypeInfo}
|
|
458
|
+
* @memberof TenantApplicationsService
|
|
459
|
+
*/
|
|
460
|
+
getNewlyCreatedGroupTypeInfo() {
|
|
461
|
+
return this.newlyCreatedGroupType;
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Posts the edited tenant application form data to server using HttpService for updating the tenant information.
|
|
465
|
+
* @param {CreateTenantPayload} editTenantPayload
|
|
466
|
+
* @return {Observable<CreateTenantResponse>}
|
|
467
|
+
* @memberof TenantApplicationsService
|
|
468
|
+
*/
|
|
469
|
+
editTenant(editTenantPayload) {
|
|
470
|
+
return this.httpService
|
|
471
|
+
.putData(`${this.apiBaseUrl}/configurations/app/editTenant`, editTenantPayload)
|
|
472
|
+
.pipe(map((response) => {
|
|
473
|
+
return response;
|
|
474
|
+
}), catchError((error) => {
|
|
475
|
+
throw error;
|
|
476
|
+
}));
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Sends update request to the server to update the tenant application status to active/inactive using HttpService and returns the success or failure response.
|
|
480
|
+
* @param {UpdateTenantStatusRequestPayload} updateTenantStatusPayload
|
|
481
|
+
* @return {Observable<UpdateTenantStatusResponse>}
|
|
482
|
+
* @memberof TenantApplicationsService
|
|
483
|
+
*/
|
|
484
|
+
updateTenantStatus(updateTenantStatusPayload) {
|
|
485
|
+
return this.httpService
|
|
486
|
+
.putData(`${this.apiBaseUrl}/configurations/app/updateStatus`, updateTenantStatusPayload)
|
|
487
|
+
.pipe(map((response) => {
|
|
488
|
+
return response;
|
|
489
|
+
}), catchError((error) => {
|
|
490
|
+
throw error;
|
|
491
|
+
}));
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* It generates Feature list from checkbox options generated in form array.
|
|
495
|
+
* @param {CheckboxOption[]} features
|
|
496
|
+
* @return {Features[]}
|
|
497
|
+
* @memberof TenantApplicationsService
|
|
498
|
+
*/
|
|
499
|
+
getFeaturesList(features) {
|
|
500
|
+
this.featureList = [];
|
|
501
|
+
features?.forEach((feature) => {
|
|
502
|
+
if (feature.checked)
|
|
503
|
+
this.featureList?.push({
|
|
504
|
+
featureId: feature?.id,
|
|
505
|
+
featureName: feature?.name,
|
|
506
|
+
isDefault: feature?.checked,
|
|
507
|
+
});
|
|
508
|
+
});
|
|
509
|
+
return this.featureList;
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Gets roster type from server using HttpService.
|
|
513
|
+
* @return {*} {Observable<GetRosterTypeOrSettingsResponse>}
|
|
514
|
+
* @memberof TenantApplicationsService
|
|
515
|
+
*/
|
|
516
|
+
getRosterType() {
|
|
517
|
+
return this.httpService
|
|
518
|
+
.getData(`${this.apiBaseUrl}/configurations/lookup/RosterType`)
|
|
519
|
+
.pipe(map((response) => {
|
|
520
|
+
return response;
|
|
521
|
+
}), catchError((error) => {
|
|
522
|
+
throw error;
|
|
523
|
+
}));
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* Gets group type settings from server using HttpService.
|
|
527
|
+
* @return {*} {Observable<GetRosterTypeOrSettingsResponse>}
|
|
528
|
+
* @memberof TenantApplicationsService
|
|
529
|
+
*/
|
|
530
|
+
getGroupTypeSettings() {
|
|
531
|
+
return this.httpService
|
|
532
|
+
.getData(`${this.apiBaseUrl}/configurations/lookup/GT_Settings`)
|
|
533
|
+
.pipe(map((response) => {
|
|
534
|
+
return response;
|
|
535
|
+
}), catchError((error) => {
|
|
536
|
+
throw error;
|
|
537
|
+
}));
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* Posts the group type details to server using HttpService to create new group type.
|
|
541
|
+
* @param {CreateGroupTypeRequestPayload} createGroupTypePayload
|
|
542
|
+
* @return {*} {Observable<CreateGroupTypeResponse>}
|
|
543
|
+
* @memberof TenantApplicationsService
|
|
544
|
+
*/
|
|
545
|
+
createGroupType(createGroupTypePayload) {
|
|
546
|
+
return this.httpService
|
|
547
|
+
.postData(`${this.apiBaseUrl}/configurations/config/groupType`, createGroupTypePayload)
|
|
548
|
+
.pipe(map((response) => {
|
|
549
|
+
return response;
|
|
550
|
+
}), catchError((error) => {
|
|
551
|
+
throw error;
|
|
552
|
+
}));
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Returns sorted role list data.
|
|
556
|
+
* @param {Role[]} roleList
|
|
557
|
+
* @return {Role[]}
|
|
558
|
+
* @memberof TenantApplicationsService
|
|
559
|
+
*/
|
|
560
|
+
sortRolesByRoleType(roleList) {
|
|
561
|
+
return roleList.sort((a, b) => a?.viewOrder - b?.viewOrder);
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* Posts the role details to server using HttpService for deleting the role.
|
|
565
|
+
* @param {DeleteRoleRequestPayload} deleteRoleRequestPayload
|
|
566
|
+
* @return {Observable<DeleteRoleResponse>}
|
|
567
|
+
* @memberof TenantApplicationsService
|
|
568
|
+
*/
|
|
569
|
+
deleteRole(deleteRolePayload) {
|
|
570
|
+
return this.httpService
|
|
571
|
+
.putData(`${this.apiBaseUrl}/groups/role/deleteRole`, deleteRolePayload)
|
|
572
|
+
.pipe(map((response) => {
|
|
573
|
+
return response;
|
|
574
|
+
}), catchError((error) => {
|
|
575
|
+
throw error;
|
|
576
|
+
}));
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
* Gets group types from server using HttpService.
|
|
580
|
+
* @param {string} appId
|
|
581
|
+
* @return {Observable<ViewGroupTypeResponse>}
|
|
582
|
+
* @memberof TenantApplicationsService
|
|
583
|
+
*/
|
|
584
|
+
getGroupTypes(appId) {
|
|
585
|
+
return this.httpService
|
|
586
|
+
.getData(`${this.apiBaseUrl}/configurations/config/appGroupTypeDetails/${appId}`)
|
|
587
|
+
.pipe(map((response) => {
|
|
588
|
+
return response;
|
|
589
|
+
}), catchError((error) => {
|
|
590
|
+
throw error;
|
|
591
|
+
}));
|
|
592
|
+
}
|
|
593
|
+
/**
|
|
594
|
+
* Sets group type details.
|
|
595
|
+
* @param {ViewGroupTypeResponse} groupTypes
|
|
596
|
+
* @memberof TenantApplicationsService
|
|
597
|
+
*/
|
|
598
|
+
setGroupTypeDetails(groupTypes) {
|
|
599
|
+
this.groupTypes = groupTypes;
|
|
600
|
+
}
|
|
601
|
+
/**
|
|
602
|
+
* Returns group type details.
|
|
603
|
+
* @return {ViewGroupTypeResponse}
|
|
604
|
+
* @memberof TenantApplicationsService
|
|
605
|
+
*/
|
|
606
|
+
getGroupTypeDetails() {
|
|
607
|
+
return this.groupTypes;
|
|
608
|
+
}
|
|
609
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TenantApplicationsService, deps: [{ token: i1.HttpService }, { token: i2.TenantPermissionsService }, { token: i3.TenantPermissionsMapService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
610
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TenantApplicationsService, providedIn: 'root' }); }
|
|
611
|
+
}
|
|
612
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TenantApplicationsService, decorators: [{
|
|
613
|
+
type: Injectable,
|
|
614
|
+
args: [{
|
|
615
|
+
providedIn: 'root',
|
|
616
|
+
}]
|
|
617
|
+
}], ctorParameters: function () { return [{ type: i1.HttpService }, { type: i2.TenantPermissionsService }, { type: i3.TenantPermissionsMapService }]; } });
|
|
618
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW50LWFwcGxpY2F0aW9ucy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGVuYW50cy9zcmMvbGliL3NlcnZpY2VzL3RlbmFudC1hcHBsaWNhdGlvbnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBYyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEtBQUssV0FBVyxNQUFNLDBCQUEwQixDQUFDOzs7OztBQWtFeEQsTUFBTSxPQUFPLHlCQUF5QjtJQXFCcEM7SUFDRSwwQ0FBMEM7SUFDbEMsV0FBd0I7SUFDaEMsMENBQTBDO0lBQ2xDLHdCQUFrRDtJQUMxRCwwQ0FBMEM7SUFDbEMsMkJBQXdELENBQUMsNkNBQTZDOztRQUp0RyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUV4Qiw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBRWxELGdDQUEyQixHQUEzQiwyQkFBMkIsQ0FBNkI7UUExQmxFLGdCQUFXLEdBQUcsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUM7UUFLL0Msc0JBQWlCLEdBQUcsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUM7UUFHdEQsaUJBQVksR0FBa0IsRUFBRSxDQUFDO1FBQ2pDLG9CQUFlLEdBQXFCLEVBQUUsQ0FBQztRQUN2QyxnQkFBVyxHQUFrQixFQUFFLENBQUM7UUFDaEMsZ0JBQVcsR0FBZSxFQUFFLENBQUM7UUFDN0Isb0JBQWUsR0FBcUIsRUFBRSxDQUFDO1FBT3ZDLCtCQUEwQixHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7SUFRakQsQ0FBQztJQUNKLFlBQVksQ0FBQyxVQUFrQixFQUFFLGNBQWdDO1FBQy9ELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElB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Ozs7T0FLRztJQUNILFVBQVUsQ0FDUixpQkFBMkM7UUFFM0MsT0FBTyxJQUFJLENBQUMsV0FBVzthQUNwQixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSx5QkFBeUIsRUFBRSxpQkFBaUIsQ0FBQzthQUN2RSxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDZixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixNQUFNLEtBQUssQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBQ0Q7Ozs7O09BS0c7SUFDSCxhQUFhLENBQUMsS0FBYTtRQUN6QixPQUFPLElBQUksQ0FBQyxXQUFXO2FBQ3BCLE9BQU8sQ0FDTixHQUFHLElBQUksQ0FBQyxVQUFVLDhDQUE4QyxLQUFLLEVBQUUsQ0FDeEU7YUFDQSxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDZixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixNQUFNLEtBQUssQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNILG1CQUFtQixDQUFDLFVBQWlDO1FBQ25ELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDOytHQXh0QlUseUJBQXlCO21IQUF6Qix5QkFBeUIsY0FGeEIsTUFBTTs7NEZBRVAseUJBQXlCO2tCQUhyQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cFNlcnZpY2UgfSBmcm9tICdAaWVlZXNhLW5wbS91dGlsaXR5JztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCAqIGFzIHNjcmVlblRleHRzIGZyb20gJy4uL2Fzc2V0cy9jb25zdGFudHMuanNvbic7XHJcbmltcG9ydCB7IEdldFRlbmFudHNQYXlsb2FkIH0gZnJvbSAnLi4vbW9kZWxzL3RhYmxlLWNvbHVtbi1zY2hlbWEtdmlldy10ZW5hbnQtbGlzdC5tb2RlbCc7XHJcbmltcG9ydCB7XHJcbiAgVGVuYW50c1Blcm1pc3Npb25zLFxyXG4gIFVzZXJQZXJtaXNzaW9uLFxyXG59IGZyb20gJy4uL21vZGVscy90ZW5hbnRzLXBlcm1pc3Npb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBQZXJtaXNzaW9uVHlwZSB9IGZyb20gJy4uL21vZGVscy9wZXJtaXNzaW9uLXR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBUZW5hbnRQZXJtaXNzaW9uc01hcFNlcnZpY2UgfSBmcm9tICcuL3RlbmFudC1wZXJtaXNzaW9ucy1tYXAuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQ3JlYXRlVGVuYW50UmVxdWVzdFBheWxvYWQsXHJcbiAgQ3JlYXRlVGVuYW50UmVzcG9uc2UsXHJcbiAgR2V0VGVuYW50c1Jlc3BvbnNlLFxyXG4gIE5ld1RlbmFudEluZm8sXHJcbiAgVGVuYW50QmFzaWNJbmZvLFxyXG4gIFRlbmFudERldGFpbHNSZXNwb25zZSxcclxufSBmcm9tICcuLi9tb2RlbHMvdGVuYW50Lm1vZGVsJztcclxuaW1wb3J0IHsgUmFkaW9PcHRpb24gfSBmcm9tICdAaWVlZXNhLW5wbS9wcmVzZW50YXRpb24nO1xyXG5pbXBvcnQgeyBDaGVja2JveE9wdGlvbiB9IGZyb20gJ0BpZWVlc2EtbnBtL21vZGVscyc7XHJcbmltcG9ydCB7XHJcbiAgRmVhdHVyZUlkLFxyXG4gIEZlYXR1cmVzLFxyXG4gIEdldEZlYXR1cmVzUmVzcG9uc2UsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL2ZlYXR1cmVzLm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBBcHBUeXBlQ29uZmlnLFxyXG4gIEdldEFwcFR5cGVzUmVzcG9uc2UsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL2FwcC10eXBlLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IFRlbmFudFBlcm1pc3Npb25zU2VydmljZSB9IGZyb20gJy4vdGVuYW50LXBlcm1pc3Npb25zLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUZW5hbnRGdW5jdGlvblR5cGUgfSBmcm9tICcuLi9tb2RlbHMvdGVuYW50LWZ1bmN0aW9uLXR5cGUubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIEdldFJvbGVzQW5kUGVybWlzc2lvbnNQYXlsb2FkLFxyXG4gIEdldFJvbGVzQW5kUGVybWlzc2lvbnNSZXNwb25zZSxcclxuICBHZXRSb2xlc1Jlc3BvbnNlLFxyXG4gIFJvbGVJbmZvLFxyXG4gIERlbGV0ZVJvbGVSZXF1ZXN0UGF5bG9hZCxcclxuICBEZWxldGVSb2xlUmVzcG9uc2UsXHJcbiAgUm9sZSxcclxuICBHZXRQZXJtaXNzaW9uc1Jlc3BvbnNlLFxyXG4gIFJvbGVQZXJtaXNzaW9uTWFwcGluZ1JlcXVlc3RQYXlsb2FkLFxyXG4gIFJvbGVQZXJtaXNzaW9uTWFwcGluZ1Jlc3BvbnNlLFxyXG4gIFJvbGVzQW5kUGVybWlzc2lvbnNSZXF1ZXN0UGF5bG9hZCxcclxuICBSb2xlc0FuZFBlcm1pc3Npb25zUmVzcG9uc2UsXHJcbiAgUm9sZURldGFpbHMsXHJcbiAgQ3JlYXRlTW9kaWZ5Um9sZVJlcXVlc3RQYXlsb2FkLFxyXG4gIENyZWF0ZU1vZGlmeVJvbGVSZXNwb25zZSxcclxufSBmcm9tICcuLi9tb2RlbHMvcm9sZXMtYW5kLXBlcm1pc3Npb25zLm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBVcGRhdGVUZW5hbnRTdGF0dXNSZXF1ZXN0UGF5bG9hZCxcclxuICBVcGRhdGVUZW5hbnRTdGF0dXNSZXNwb25zZSxcclxufSBmcm9tICcuLi9tb2RlbHMvdXBkYXRlLXRlbmFudC1zdGF0dXMubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIEdldFJvbGVUeXBlc1BheWxvYWQsXHJcbiAgUm9sZVR5cGVDb25maWd1cmF0aW9uLFxyXG4gIFJvbGVUeXBlT3B0aW9uLFxyXG4gIFJvbGVUeXBlUmVzcG9uc2UsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL3JvbGUtdHlwZS5tb2RlbCc7XHJcbmltcG9ydCB7IFZpZXdHcm91cFR5cGVSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy92aWV3LXRlbmFudC1ncm91cC10eXBlcy5tb2RlbCc7XHJcbmltcG9ydCB7XHJcbiAgQ3JlYXRlR3JvdXBUeXBlUmVxdWVzdFBheWxvYWQsXHJcbiAgQ3JlYXRlR3JvdXBUeXBlUmVzcG9uc2UsXHJcbiAgQ3JlYXRlZE9yTW9kaWZpZWRHcm91cFR5cGVJbmZvLFxyXG4gIEdldFJvc3RlclR5cGVPclNldHRpbmdzUmVzcG9uc2UsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL2NyZWF0ZS1ncm91cC10eXBlLm1vZGVsJztcclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2Uge1xyXG4gIHRlbmFudHNUZXh0ID0gc2NyZWVuVGV4dHM/LnZpZXdUZW5hbnRzPy5lcnJvcnM7XHJcbiAgYXBpQmFzZVVybCE6IHN0cmluZztcclxuICB1c2VyUGVybWlzc2lvbiE6IFVzZXJQZXJtaXNzaW9uW107XHJcbiAgc2VsZWN0ZWRUZW5hbnRJbmZvITogVGVuYW50QmFzaWNJbmZvIHwgdW5kZWZpbmVkO1xyXG4gIHVzZXJUZW5hbnRzUGVybWlzc2lvbnMhOiBUZW5hbnRzUGVybWlzc2lvbnNbXTtcclxuICBjcmVhdGVUZW5hbnRzVGV4dCA9IHNjcmVlblRleHRzPy5jcmVhdGVUZW5hbnQ/LmVycm9ycztcclxuICBuZXdUZW5hbnRJbmZvITogTmV3VGVuYW50SW5mbztcclxuICB0ZW5hbnRGdW5jdGlvblR5cGUhOiBUZW5hbnRGdW5jdGlvblR5cGU7XHJcbiAgcmFkaW9PcHRpb25zOiBSYWRpb09wdGlvbltdID0gW107XHJcbiAgY2hlY2tCb3hPcHRpb25zOiBDaGVja2JveE9wdGlvbltdID0gW107XHJcbiAgYXBwVHlwZUluZm86IFJhZGlvT3B0aW9uW10gPSBbXTtcclxuICBmZWF0dXJlTGlzdDogRmVhdHVyZXNbXSA9IFtdO1xyXG4gIHJvbGVUeXBlT3B0aW9uczogUm9sZVR5cGVPcHRpb25bXSA9IFtdO1xyXG4gIG5ld2x5Q3JlYXRlZFJvbGUhOiBSb2xlSW5mbztcclxuICByb2xlVHlwZU9wdGlvbiE6IFJvbGVUeXBlT3B0aW9uW107XHJcbiAgc2VsZWN0ZWRSb2xlSW5mbyE6IFJvbGVEZXRhaWxzO1xyXG4gIHJvbGVzITogUm9sZVtdO1xyXG4gIGdyb3VwVHlwZXMhOiBWaWV3R3JvdXBUeXBlUmVzcG9uc2U7XHJcbiAgbmV3bHlDcmVhdGVkR3JvdXBUeXBlITogQ3JlYXRlZE9yTW9kaWZpZWRHcm91cFR5cGVJbmZvO1xyXG4gIGlzR3JvdXBUeXBlQWRkZWRPck1vZGlmaWVkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSBodHRwU2VydmljZTogSHR0cFNlcnZpY2UsXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHByaXZhdGUgdGVuYW50UGVybWlzc2lvbnNTZXJ2aWNlOiBUZW5hbnRQZXJtaXNzaW9uc1NlcnZpY2UsXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHByaXZhdGUgdGVuYW50UGVybWlzc2lvbnNNYXBTZXJ2aWNlOiBUZW5hbnRQZXJtaXNzaW9uc01hcFNlcnZpY2UgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5LWZ1bmN0aW9uXHJcbiAgKSB7fVxyXG4gIHNldEFwcENvbmZpZyhhcGlCYXNlVXJsOiBzdHJpbmcsIHVzZXJQZXJtaXNzaW9uOiBVc2VyUGVybWlzc2lvbltdKTogdm9pZCB7XHJcbiAgICB0aGlzLmFwaUJhc2VVcmwgPSBhcGlCYXNlVXJsO1xyXG4gICAgdGhpcy51c2VyUGVybWlzc2lvbiA9IHVzZXJQZXJtaXNzaW9uO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0ZW5hbnQgZGV0YWlscyBmcm9tIHNlcnZlciB1c2luZyBIdHRwU2VydmljZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8VGVuYW50RGV0YWlsc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFRlbmFudERldGFpbHMoYXBwSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8VGVuYW50RGV0YWlsc1Jlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAuZ2V0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2NvbmZpZ3VyYXRpb25zL2FwcC9kZXRhaWxzLyR7YXBwSWR9YClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSB1c2VyIHRlbmFudHMgcGVybWlzc2lvbnNcclxuICAgKiBAcGFyYW0ge1RlbmFudHNQZXJtaXNzaW9uc1tdfSBUZW5hbnRzUGVybWlzc2lvbnNcclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIHNldFVzZXJUZW5hbnRzUGVybWlzc2lvbnModXNlclRlbmFudHNQZXJtaXNzaW9uczogVGVuYW50c1Blcm1pc3Npb25zW10pIHtcclxuICAgIHRoaXMudXNlclRlbmFudHNQZXJtaXNzaW9ucyA9IHVzZXJUZW5hbnRzUGVybWlzc2lvbnM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHVzZXIgdGVuYW50cyBwZXJtaXNzaW9uc1xyXG4gICAqIEByZXR1cm4ge1RlbmFudHNQZXJtaXNzaW9uc1tdfVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0VXNlclRlbmFudHNQZXJtaXNzaW9ucygpOiBUZW5hbnRzUGVybWlzc2lvbnNbXSB7XHJcbiAgICByZXR1cm4gdGhpcy51c2VyVGVuYW50c1Blcm1pc3Npb25zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgdXNlciB0ZW5hbnRzIGluZm9ybWF0aW9uXHJcbiAgICogQHBhcmFtIHtUZW5hbnRCYXNpY0luZm99IHRlbmFudEluZm9cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIHNldFNlbGVjdGVkVGVuYW50SW5mb3JtYXRpb24odGVuYW50SW5mbzogVGVuYW50QmFzaWNJbmZvKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkVGVuYW50SW5mbyA9IHRlbmFudEluZm87XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHRlbmFudHMgaW5mb3JtYXRpb25cclxuICAgKiBAcmV0dXJuIHtUZW5hbnRCYXNpY0luZm99XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRTZWxlY3RlZFRlbmFudEluZm9ybWF0aW9uKCk6IFRlbmFudEJhc2ljSW5mbyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFRlbmFudEluZm87XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHJvbGVzIGluZm9ybWF0aW9uc1xyXG4gICAqIEBwYXJhbSB7Um9sZX0gcm9sZXNcclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIHNldFJvbGVzSW5mbyhyb2xlczogUm9sZVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvbGVzID0gcm9sZXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHJvbGVzIGluZm9ybWF0aW9uXHJcbiAgICogQHJldHVybiB7Um9sZX1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFJvbGVzSW5mbygpOiBSb2xlW10gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMucm9sZXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHNlbGVjdGVkIHJvbGUgaW5mb3JtYXRpb24uXHJcbiAgICogQHBhcmFtIHtSb2xlRGV0YWlsc30gcm9sZUluZm9cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIHNldFNlbGVjdGVkUm9sZUluZm9ybWF0aW9uKHJvbGVJbmZvOiBSb2xlRGV0YWlscyk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZFJvbGVJbmZvID0gcm9sZUluZm87XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHNlbGVjdGVkIHJvbGUgaW5mb3JtYXRpb24uXHJcbiAgICogQHJldHVybiB7Um9sZURldGFpbHN9XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRTZWxlY3RlZFJvbGVJbmZvcm1hdGlvbigpOiBSb2xlRGV0YWlscyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJvbGVJbmZvO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSB0ZW5hbnQgcm9sZSB0eXBlIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIHtSb2xlVHlwZU9wdGlvbn0gcm9sZVR5cGVPcHRpb25zXHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBzZXRSb2xlVHlwZU9wdGlvbihyb2xlVHlwZU9wdGlvbnM6IFJvbGVUeXBlT3B0aW9uW10pOiB2b2lkIHtcclxuICAgIHRoaXMucm9sZVR5cGVPcHRpb24gPSByb2xlVHlwZU9wdGlvbnM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHRlbmFudCByb2xlIHR5cGUgb3B0aW9ucy5cclxuICAgKiBAcmV0dXJuIHtSb2xlVHlwZU9wdGlvbn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFJvbGVUeXBlT3B0aW9uKCk6IFJvbGVUeXBlT3B0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMucm9sZVR5cGVPcHRpb247XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGxpc3Qgb2YgYXBwbGljYXRpb24gdHlwZSBpbmZvcm1hdGlvblxyXG4gICAqIEBwYXJhbSB7UmFkaW9PcHRpb259IGFwcFR5cGVJbmZvXHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBzZXRBcHBsaWNhdGlvblR5cGUoYXBwVHlwZUluZm86IFJhZGlvT3B0aW9uW10pOiB2b2lkIHtcclxuICAgIHRoaXMuYXBwVHlwZUluZm8gPSBhcHBUeXBlSW5mbztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhcHBsaWNhdGlvbiB0eXBlIGluZm9ybWF0aW9uXHJcbiAgICogQHJldHVybiB7UmFkaW9PcHRpb259XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRBcHBsaWNhdGlvblR5cGUoKTogUmFkaW9PcHRpb25bXSB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5hcHBUeXBlSW5mbztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogRmlsdGVyIHBlcm1pc3Npb25zXHJcbiAgICogQHBhcmFtIHVzZXJzUGVybWlzc2lvbnNcclxuICAgKiBAcmV0dXJucyBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGZpbHRlclBlcm1pc3Npb24odXNlcnNQZXJtaXNzaW9uczogVXNlclBlcm1pc3Npb25bXSk6IFRlbmFudHNQZXJtaXNzaW9uc1tdIHtcclxuICAgIHJldHVybiB0aGlzLnRlbmFudFBlcm1pc3Npb25zU2VydmljZT8uZmlsdGVyVGVuYW50c1Blcm1pc3Npb25zKFxyXG4gICAgICB1c2Vyc1Blcm1pc3Npb25zLFxyXG4gICAgICB0aGlzLnRlbmFudFBlcm1pc3Npb25zTWFwU2VydmljZT8uZ2V0R2xvYmFsVGVuYW50c1Blcm1pc3Npb25zKClcclxuICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRpbmcgYWNjZXNzIGZvciB0ZW5hbnRzXHJcbiAgICogQHBhcmFtIHBlcm1pc3Npb25UeXBlIFBlcm1pc3Npb24gVHlwZSB0byB2YWxpZGF0ZSBwZXJtaXNzaW9uXHJcbiAgICogQHBhcmFtIG1hcHBlZFVzZXJQZXJtaXNzaW9ucyBQZXJtaXNzaW9uIHdoaWNoIGFyZSBtYXBwZWQgd2l0aCB0ZW5hbnRzXHJcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBwZXJtaXNzaW9uIGlzIGdyYW50ZWRcclxuICAgKi9cclxuICB2YWxpZGF0ZUFjY2VzcyhcclxuICAgIHBlcm1pc3Npb25UeXBlOiBQZXJtaXNzaW9uVHlwZSxcclxuICAgIHBlcm1pc3Npb25zOiBUZW5hbnRzUGVybWlzc2lvbnNbXVxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudGVuYW50UGVybWlzc2lvbnNTZXJ2aWNlLnZhbGlkYXRlQWNjZXNzUGVybWlzc2lvbihcclxuICAgICAgcGVybWlzc2lvblR5cGUsXHJcbiAgICAgIHBlcm1pc3Npb25zXHJcbiAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSB0ZW5hbnRzLlxyXG4gICAqIEBwYXJhbSB7R2V0VGVuYW50c1BheWxvYWR9IHBheWxvYWRcclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEdldFRlbmFudHNSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRUZW5hbnRzTGlzdChwYXlsb2FkOiBHZXRUZW5hbnRzUGF5bG9hZCk6IE9ic2VydmFibGU8R2V0VGVuYW50c1Jlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucG9zdERhdGEoYCR7dGhpcy5hcGlCYXNlVXJsfS9jb25maWd1cmF0aW9ucy9hcHAvY29uZmlnYCwgcGF5bG9hZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIGxpc3Qgb2YgZmVhdHVyZXMgZnJvbSBzZXJ2ZXIgdXNpbmcgSHR0cFNlcnZpY2UuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxHZXRGZWF0dXJlc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldEZlYXR1cmVzKCk6IE9ic2VydmFibGU8R2V0RmVhdHVyZXNSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLmdldERhdGEoYCR7dGhpcy5hcGlCYXNlVXJsfS9jb25maWd1cmF0aW9ucy9hcHAvZmVhdHVyZXNgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgbGlzdCBvZiByb2xlcyBmcm9tIHNlcnZlciB1c2luZyBIdHRwU2VydmljZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwSWRcclxuICAgKiBAcmV0dXJuIHsqfSAge09ic2VydmFibGU8R2V0Um9sZXNSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRSb2xlcyhhcHBJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxHZXRSb2xlc1Jlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAuZ2V0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9yb2xlLyR7YXBwSWR9YClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHBlcm1pc3Npb25zIGJhc2VkIG9uIHRoZSBhcHBJZCBhbmQgcmV0dXJuIHRoZSBzdWNjZXNzIG9yIGVycm9yIHJlc3BvbnNlIGFzIE9ic2VydmFibGUuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcElkXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxHZXRQZXJtaXNzaW9uc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFBlcm1pc3Npb25zKGFwcElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEdldFBlcm1pc3Npb25zUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5nZXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL3Blcm1pc3Npb25zLyR7YXBwSWR9YClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHJvbGVzIG9yIHBlcm1pc3Npb25zIGJhc2VkIG9uIHRoZSByb2xlSWQgb3IgcGVybWlzc2lvbklkIGluIHRoZSBwYXlsb2FkIGFuZCByZXR1cm4gdGhlIHN1Y2Nlc3Mgb3IgZXJyb3IgcmVzcG9uc2UgYXMgT2JzZXJ2YWJsZS5cclxuICAgKiBAcGFyYW0ge1JvbGVQZXJtaXNzaW9uTWFwcGluZ1JlcXVlc3RQYXlsb2FkfSBwYXlsb2FkXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8Um9sZVBlcm1pc3Npb25NYXBwaW5nUmVzcG9uc2U+fVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0Um9sZVBlcm1pc3Npb25NYXBwaW5nKFxyXG4gICAgcGF5bG9hZDogUm9sZVBlcm1pc3Npb25NYXBwaW5nUmVxdWVzdFBheWxvYWRcclxuICApOiBPYnNlcnZhYmxlPFJvbGVQZXJtaXNzaW9uTWFwcGluZ1Jlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucG9zdERhdGEoXHJcbiAgICAgICAgYCR7dGhpcy5hcGlCYXNlVXJsfS9ncm91cHMvdXNlcnMvcm9sZVBlcm1pc3Npb25NYXBwaW5nYCxcclxuICAgICAgICBwYXlsb2FkXHJcbiAgICAgIClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTdWJtaXQgdGhlIG5ldyBtYXBwaW5ncyBvZiByb2xlcyB0byBwZXJtaXNzaW9ucyB0byB0aGUgc2VydmVyLlxyXG4gICAqIEBwYXJhbSB7Um9sZXNBbmRQZXJtaXNzaW9uc1JlcXVlc3RQYXlsb2FkfSBwYXlsb2FkXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8Um9sZXNBbmRQZXJtaXNzaW9uc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIHNhdmVSb2xlUGVybWlzc2lvbk1hcHBpbmcoXHJcbiAgICBwYXlsb2FkOiBSb2xlc0FuZFBlcm1pc3Npb25zUmVxdWVzdFBheWxvYWRcclxuICApOiBPYnNlcnZhYmxlPFJvbGVzQW5kUGVybWlzc2lvbnNSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLnBvc3REYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL3VzZXJzL3JvbGVQZXJtaXNzaW9uYCwgcGF5bG9hZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIGxpc3Qgb2Ygcm9sZXMgYW5kIHBlcm1pc3Npb25zIG1hcHBpbmdzIGZyb20gc2VydmVyIHVzaW5nIEh0dHBTZXJ2aWNlLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZFxyXG4gICAqIEBwYXJhbSB7R2V0Um9sZXNBbmRQZXJtaXNzaW9uc1BheWxvYWR9IHBheWxvYWRcclxuICAgKiBAcmV0dXJuIHsqfSAge09ic2VydmFibGU8R2V0Um9sZXNBbmRQZXJtaXNzaW9uc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFJvbGVzQW5kUGVybWlzc2lvbnNNYXBwaW5ncyhcclxuICAgIGFwcElkOiBzdHJpbmcsXHJcbiAgICBwYXlsb2FkOiBHZXRSb2xlc0FuZFBlcm1pc3Npb25zUGF5bG9hZFxyXG4gICk6IE9ic2VydmFibGU8R2V0Um9sZXNBbmRQZXJtaXNzaW9uc1Jlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucG9zdERhdGEoXHJcbiAgICAgICAgYCR7dGhpcy5hcGlCYXNlVXJsfS9ncm91cHMvcm9sZUJhc2VkUGVybWlzc2lvbnMvJHthcHBJZH1gLFxyXG4gICAgICAgIHBheWxvYWRcclxuICAgICAgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgbGlzdCBvZiBhcHBsaWNhdGlvbiB0eXBlcyBmcm9tIHNlcnZlciB1c2luZyBIdHRwU2VydmljZS5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEdldEFwcFR5cGVzUmVzcG9uc2U+fVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0QXBwbGljYXRpb25UeXBlcygpOiBPYnNlcnZhYmxlPEdldEFwcFR5cGVzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5nZXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vY29uZmlndXJhdGlvbnMvY29uZmlnL2FwcF90eXBlYClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBQb3N0cyBjcmVhdGUgcm9sZSBmb3JtIGRhdGEgdG8gc2VydmVyIHVzaW5nIEh0dHBTZXJ2aWNlIHRvIGNyZWF0ZSBhIG5ldyByb2xlLlxyXG4gICAqIEBwYXJhbSB7Q3JlYXRlTW9kaWZ5Um9sZVJlcXVlc3RQYXlsb2FkfSBjcmVhdGVNb2RpZnlSb2xlUGF5bG9hZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Q3JlYXRlTW9kaWZ5Um9sZVJlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGNyZWF0ZVJvbGUoXHJcbiAgICBjcmVhdGVNb2RpZnlSb2xlUGF5bG9hZDogQ3JlYXRlTW9kaWZ5Um9sZVJlcXVlc3RQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxDcmVhdGVNb2RpZnlSb2xlUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wb3N0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9yb2xlYCwgY3JlYXRlTW9kaWZ5Um9sZVBheWxvYWQpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUG9zdHMgdGhlIGVkaXRlZCByb2xlIGZvcm0gZGF0YSB0byBzZXJ2ZXIgdXNpbmcgSHR0cFNlcnZpY2UgZm9yIHVwZGF0aW5nIHRoZSByb2xlIGluZm9ybWF0aW9uLlxyXG4gICAqIEBwYXJhbSB7Q3JlYXRlTW9kaWZ5Um9sZVJlcXVlc3RQYXlsb2FkfSBjcmVhdGVNb2RpZnlSb2xlUGF5bG9hZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Q3JlYXRlTW9kaWZ5Um9sZVJlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGVkaXRSb2xlKFxyXG4gICAgY3JlYXRlTW9kaWZ5Um9sZVBheWxvYWQ6IENyZWF0ZU1vZGlmeVJvbGVSZXF1ZXN0UGF5bG9hZFxyXG4gICk6IE9ic2VydmFibGU8Q3JlYXRlTW9kaWZ5Um9sZVJlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucHV0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9yb2xlYCwgY3JlYXRlTW9kaWZ5Um9sZVBheWxvYWQpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgbGlzdCBvZiByb2xlIHR5cGVzIGZyb20gc2VydmVyIHVzaW5nIEh0dHBTZXJ2aWNlLlxyXG4gICAqIEBwYXJhbSB7R2V0Um9sZVR5cGVzUGF5bG9hZH0gcGF5bG9hZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Um9sZVR5cGVSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRSb2xlVHlwZXMocGF5bG9hZDogR2V0Um9sZVR5cGVzUGF5bG9hZCk6IE9ic2VydmFibGU8Um9sZVR5cGVSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLnBvc3REYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vY29uZmlndXJhdGlvbnMvY29uZmlnL2NvbmZpZ0ZpZWxkYCwgcGF5bG9hZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIHRoZSBzZWxlY3QvZHJvcGRvd24gb3B0aW9ucyBmcm9tIHRoZSByb2xlIHR5cGVzIHJlY2VpdmVkIGZyb20gc2VydmVyLlxyXG4gICAqIEBwYXJhbSB7Um9sZVR5cGVDb25maWd1cmF0aW9uW119IHJvbGVUeXBlUmVzcG9uc2VcclxuICAgKiBAcmV0dXJuIHtSb2xlVHlwZU9wdGlvbltdfVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0Um9sZVR5cGVPcHRpb25zKFxyXG4gICAgcm9sZVR5cGVSZXNwb25zZTogUm9sZVR5cGVDb25maWd1cmF0aW9uW11cclxuICApOiBSb2xlVHlwZU9wdGlvbltdIHtcclxuICAgIHRoaXMucm9sZVR5cGVPcHRpb25zID0gW107XHJcbiAgICByb2xlVHlwZVJlc3BvbnNlLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgdGhpcy5yb2xlVHlwZU9wdGlvbnM/LnB1c2goe1xyXG4gICAgICAgIGlkOiBpdGVtPy5jb25maWdGaWVsZElkLFxyXG4gICAgICAgIG5hbWU6IGl0ZW0/LmNvbmZpZ0ZpZWxkVmFsdWU/LnJvbGVUeXBlTmFtZSxcclxuICAgICAgICBvcmRlcjogaXRlbT8uY29uZmlnRmllbGRWYWx1ZT8udmlld09yZGVyLFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5yb2xlVHlwZU9wdGlvbnMuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xyXG4gICAgcmV0dXJuIHRoaXMucm9sZVR5cGVPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUG9zdHMgdGVuYW50IGFwcGxpY2F0aW9uIGZvcm0gZGF0YSB0byBzZXJ2ZXIgdXNpbmcgSHR0cFNlcnZpY2UgZm9yIGNyZWF0aW5nIG5ldyB0ZW5hbnQgYXBwbGljYXRpb24uXHJcbiAgICogQHBhcmFtIHtDcmVhdGVUZW5hbnRQYXlsb2FkfSBjcmVhdGVUZW5hbnRQYXlsb2FkXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDcmVhdGVUZW5hbnRSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBjcmVhdGVUZW5hbnQoXHJcbiAgICBjcmVhdGVUZW5hbnRQYXlsb2FkOiBDcmVhdGVUZW5hbnRSZXF1ZXN0UGF5bG9hZFxyXG4gICk6IE9ic2VydmFibGU8Q3JlYXRlVGVuYW50UmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wb3N0RGF0YShcclxuICAgICAgICBgJHt0aGlzLmFwaUJhc2VVcmx9L2NvbmZpZ3VyYXRpb25zL2FwcC9jcmVhdGVUZW5hbnRgLFxyXG4gICAgICAgIGNyZWF0ZVRlbmFudFBheWxvYWRcclxuICAgICAgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIHRoZSBjaGVja2JveCBvcHRpb25zIGZyb20gZmVhdHVyZXMgbGlzdCBmcm9tIHNlcnZlci5cclxuICAgKiBAcGFyYW0ge0ZlYXR1cmVzTGlzdFtdfSBmZWF0dXJlc1xyXG4gICAqIEByZXR1cm5zIHtDaGVja2JveE9wdGlvbltdfVxyXG4gICAqL1xyXG4gIGdldEZlYXR1cmVPcHRpb25zKGZlYXR1cmVzOiBGZWF0dXJlc1tdKTogQ2hlY2tib3hPcHRpb25bXSB7XHJcbiAgICB0aGlzLmNoZWNrQm94T3B0aW9ucyA9IFtdO1xyXG4gICAgZmVhdHVyZXM/LmZvckVhY2goKGZlYXR1cmU6IEZlYXR1cmVzKSA9PiB7XHJcbiAgICAgIHRoaXMuY2hlY2tCb3hPcHRpb25zPy5wdXNoKHtcclxuICAgICAgICBpZDogZmVhdHVyZT8uZmVhdHVyZUlkLFxyXG4gICAgICAgIG5hbWU6IGZlYXR1cmU/LmZlYXR1cmVOYW1lLFxyXG4gICAgICAgIGNoZWNrZWQ6IGZlYXR1cmU/LmlzRGVmYXVsdCxcclxuICAgICAgICBkaXNhYmxlZDogZmVhdHVyZT8uaXNEZWZhdWx0LFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXMuY2hlY2tCb3hPcHRpb25zO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIHRoZSByYWRpbyBvcHRpb25zIGZyb20gYXBwbGljYXRpb24gdHlwZXMgZnJvbSBzZXJ2ZXIuXHJcbiAgICogQHBhcmFtIHtBcHBUeXBlQ29uZmlnW119IGFwcFR5cGVPcHRpb25zXHJcbiAgICogQHJldHVybnMge1JhZGlvT3B0aW9uW119XHJcbiAgICovXHJcbiAgZ2V0QXBwbGljYXRpb25UeXBlT3B0aW9ucyhhcHBUeXBlT3B0aW9uczogQXBwVHlwZUNvbmZpZ1tdKTogUmFkaW9PcHRpb25bXSB7XHJcbiAgICB0aGlzLnJhZGlvT3B0aW9ucyA9IFtdO1xyXG4gICAgYXBwVHlwZU9wdGlvbnM/LmZvckVhY2goKGFwcFR5cGU6IEFwcFR5cGVDb25maWcpID0+IHtcclxuICAgICAgdGhpcy5yYWRpb09wdGlvbnM/LnB1c2goe1xyXG4gICAgICAgIGlkOiBhcHBUeXBlPy5jb25maWdGaWVsZElkLFxyXG4gICAgICAgIGxhYmVsOiBhcHBUeXBlPy5jb25maWdGaWVsZFZhbHVlPy50eXBlLFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXMucmFkaW9PcHRpb25zO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIHRoZSBzZWxlY3RlZCBmZWF0dXJlcyBpZCdzLlxyXG4gICAqIEBwYXJhbSB7Q2hlY2tib3hPcHRpb25bXX0gZmVhdHVyZU9wdGlvbnNcclxuICAgKiBAcmV0dXJucyB7RmVhdHVyZUlkW119XHJcbiAgICovXHJcbiAgZ2V0RmVhdHVyZUlkcyhmZWF0dXJlT3B0aW9uczogQ2hlY2tib3hPcHRpb25bXSk6IEZlYXR1cmVJZFtdIHtcclxuICAgIGNvbnN0IGZlYXR1cmVJZHM6IEZlYXR1cmVJZFtdID0gW107XHJcbiAgICBmZWF0dXJlT3B0aW9ucz8uZm9yRWFjaCgoZmVhdHVyZU9wdGlvbjogQ2hlY2tib3hPcHRpb24pID0+IHtcclxuICAgICAgaWYgKGZlYXR1cmVPcHRpb24/LmNoZWNrZWQpIHtcclxuICAgICAgICBmZWF0dXJlSWRzLnB1c2goe1xyXG4gICAgICAgICAgZmVhdHVyZUlkOiBmZWF0dXJlT3B0aW9uLmlkIGFzIHN0cmluZyxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZmVhdHVyZUlkcztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgbmV3bHkgY3JlYXRlZCB0ZW5hbnQgaW5mb3JtYXRpb24uXHJcbiAgICogQHBhcmFtIHtOZXdUZW5hbnRJbmZvfSBuZXdUZW5hbnRJbmZvXHJcbiAgICovXHJcbiAgc2V0TmV3VGVuYW50SW5mbyhuZXdUZW5hbnRJbmZvOiBOZXdUZW5hbnRJbmZvKTogdm9pZCB7XHJcbiAgICB0aGlzLm5ld1RlbmFudEluZm8gPSBuZXdUZW5hbnRJbmZvO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBuZXdseSBjcmVhdGVkIHRlbmFudCBpbmZvcm1hdGlvbi5cclxuICAgKi9cclxuICBnZXQgZ2V0TmV3VGVuYW50SW5mbygpOiBOZXdUZW5hbnRJbmZvIHtcclxuICAgIHJldHVybiB0aGlzLm5ld1RlbmFudEluZm87XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRlbmFudCBmdW5jdGlvbiB0eXBlLlxyXG4gICAqIEBwYXJhbSB7VGVuYW50RnVuY3Rpb25UeXBlfSB0ZW5hbnRGdW5jdGlvblR5cGUgLXRlbmFudCBmdW5jdGlvbiB0eXBlLlxyXG4gICAqL1xyXG4gIHNldFRlbmFudEZ1bmN0aW9uVHlwZSh0ZW5hbnRGdW5jdGlvblR5cGU6IFRlbmFudEZ1bmN0aW9uVHlwZSk6IHZvaWQge1xyXG4gICAgdGhpcy50ZW5hbnRGdW5jdGlvblR5cGUgPSB0ZW5hbnRGdW5jdGlvblR5cGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRlbmFudCBmdW5jdGlvbiB0eXBlLlxyXG4gICAqIEByZXR1cm4ge1RlbmFudEZ1bmN0aW9uVHlwZX0gLXRlbmFudCBmdW5jdGlvbiB0eXBlLlxyXG4gICAqL1xyXG4gIGdldFRlbmFudEZ1bmN0aW9uVHlwZSgpOiBUZW5hbnRGdW5jdGlvblR5cGUge1xyXG4gICAgcmV0dXJuIHRoaXMudGVuYW50RnVuY3Rpb25UeXBlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTdG9yZXMgdGhlIG5ld2x5IGNyZWF0ZWQgcm9sZSBpbmZvcm1hdGlvbi5cclxuICAgKiBAcGFyYW0ge1JvbGVJbmZvfSBuZXdseUNyZWF0ZWRSb2xlIC1jcmVhdGUgcm9sZSBpbmZvcm1hdGlvbi5cclxuICAgKi9cclxuICBzZXROZXdseUNyZWF0ZWRSb2xlSW5mbyhuZXdseUNyZWF0ZWRSb2xlOiBSb2xlSW5mbyk6IHZvaWQge1xyXG4gICAgdGhpcy5uZXdseUNyZWF0ZWRSb2xlID0gbmV3bHlDcmVhdGVkUm9sZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgbmV3bHkgY3JlYXRlZCByb2xlIGluZm9ybWF0aW9uLlxyXG4gICAqIEByZXR1cm4ge1JvbGVJbmZvfSAtY3JlYXRlIHJvbGUgaW5mb3JtYXRpb24uXHJcbiAgICovXHJcbiAgZ2V0TmV3bHlDcmVhdGVkUm9sZUluZm8oKTogUm9sZUluZm8ge1xyXG4gICAgcmV0dXJuIHRoaXMubmV3bHlDcmVhdGVkUm9sZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU3RvcmVzIHRoZSBuZXdseSBjcmVhdGVkIGdyb3VwIHR5cGUgaW5mb3JtYXRpb24uXHJcbiAgICogQHBhcmFtIHtDcmVhdGVkT3JNb2RpZmllZEdyb3VwVHlwZUluZm99IG5ld2x5Q3JlYXRlZEdyb3VwVHlwZVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgc2V0TmV3bHlDcmVhdGVkR3JvdXBUeXBlSW5mbyhuZXdseUNyZWF0ZWRHcm91cFR5cGU6IENyZWF0ZWRPck1vZGlmaWVkR3JvdXBUeXBlSW5mbyk6IHZvaWQge1xyXG4gICAgdGhpcy5uZXdseUNyZWF0ZWRHcm91cFR5cGUgPSBuZXdseUNyZWF0ZWRHcm91cFR5cGU7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIG5ld2x5IGNyZWF0ZWQgZ3JvdXAgdHlwZSBpbmZvcm1hdGlvbi5cclxuICAgKiBAcmV0dXJuIHsqfSAge0NyZWF0ZWRPck1vZGlmaWVkR3JvdXBUeXBlSW5mb31cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldE5ld2x5Q3JlYXRlZEdyb3VwVHlwZUluZm8oKTogQ3JlYXRlZE9yTW9kaWZpZWRHcm91cFR5cGVJbmZvIHtcclxuICAgIHJldHVybiB0aGlzLm5ld2x5Q3JlYXRlZEdyb3VwVHlwZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUG9zdHMgdGhlIGVkaXRlZCB0ZW5hbnQgYXBwbGljYXRpb24gZm9ybSBkYXRhIHRvIHNlcnZlciB1c2luZyBIdHRwU2VydmljZSBmb3IgdXBkYXRpbmcgdGhlIHRlbmFudCBpbmZvcm1hdGlvbi5cclxuICAgKiBAcGFyYW0ge0NyZWF0ZVRlbmFudFBheWxvYWR9IGVkaXRUZW5hbnRQYXlsb2FkXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDcmVhdGVUZW5hbnRSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBlZGl0VGVuYW50KFxyXG4gICAgZWRpdFRlbmFudFBheWxvYWQ6IENyZWF0ZVRlbmFudFJlcXVlc3RQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxDcmVhdGVUZW5hbnRSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLnB1dERhdGEoXHJcbiAgICAgICAgYCR7dGhpcy5hcGlCYXNlVXJsfS9jb25maWd1cmF0aW9ucy9hcHAvZWRpdFRlbmFudGAsXHJcbiAgICAgICAgZWRpdFRlbmFudFBheWxvYWRcclxuICAgICAgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNlbmRzIHVwZGF0ZSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgdG8gdXBkYXRlIHRoZSB0ZW5hbnQgYXBwbGljYXRpb24gc3RhdHVzIHRvIGFjdGl2ZS9pbmFjdGl2ZSB1c2luZyBIdHRwU2VydmljZSBhbmQgcmV0dXJucyB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIHJlc3BvbnNlLlxyXG4gICAqIEBwYXJhbSB7VXBkYXRlVGVuYW50U3RhdHVzUmVxdWVzdFBheWxvYWR9IHVwZGF0ZVRlbmFudFN0YXR1c1BheWxvYWRcclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFVwZGF0ZVRlbmFudFN0YXR1c1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIHVwZGF0ZVRlbmFudFN0YXR1cyhcclxuICAgIHVwZGF0ZVRlbmFudFN0YXR1c1BheWxvYWQ6IFVwZGF0ZVRlbmFudFN0YXR1c1JlcXVlc3RQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxVcGRhdGVUZW5hbnRTdGF0dXNSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLnB1dERhdGEoXHJcbiAgICAgICAgYCR7dGhpcy5hcGlCYXNlVXJsfS9jb25maWd1cmF0aW9ucy9hcHAvdXBkYXRlU3RhdHVzYCxcclxuICAgICAgICB1cGRhdGVUZW5hbnRTdGF0dXNQYXlsb2FkXHJcbiAgICAgIClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBJdCBnZW5lcmF0ZXMgRmVhdHVyZSBsaXN0IGZyb20gY2hlY2tib3ggb3B0aW9ucyBnZW5lcmF0ZWQgaW4gZm9ybSBhcnJheS5cclxuICAgKiBAcGFyYW0ge0NoZWNrYm94T3B0aW9uW119IGZlYXR1cmVzXHJcbiAgICogQHJldHVybiB7RmVhdHVyZXNbXX1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldEZlYXR1cmVzTGlzdChmZWF0dXJlczogQ2hlY2tib3hPcHRpb25bXSk6IEZlYXR1cmVzW10ge1xyXG4gICAgdGhpcy5mZWF0dXJlTGlzdCA9IFtdO1xyXG4gICAgZmVhdHVyZXM/LmZvckVhY2goKGZlYXR1cmU6IENoZWNrYm94T3B0aW9uKSA9PiB7XHJcbiAgICAgIGlmIChmZWF0dXJlLmNoZWNrZWQpXHJcbiAgICAgICAgdGhpcy5mZWF0dXJlTGlzdD8ucHVzaCh7XHJcbiAgICAgICAgICBmZWF0dXJlSWQ6IGZlYXR1cmU/LmlkIGFzIHN0cmluZyxcclxuICAgICAgICAgIGZlYXR1cmVOYW1lOiBmZWF0dXJlPy5uYW1lIGFzIHN0cmluZyxcclxuICAgICAgICAgIGlzRGVmYXVsdDogZmVhdHVyZT8uY2hlY2tlZCxcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXMuZmVhdHVyZUxpc3Q7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgcm9zdGVyIHR5cGUgZnJvbSBzZXJ2ZXIgdXNpbmcgSHR0cFNlcnZpY2UuXHJcbiAgICogQHJldHVybiB7Kn0gIHtPYnNlcnZhYmxlPEdldFJvc3RlclR5cGVPclNldHRpbmdzUmVzcG9uc2U+fVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0Um9zdGVyVHlwZSgpOiBPYnNlcnZhYmxlPEdldFJvc3RlclR5cGVPclNldHRpbmdzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5nZXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vY29uZmlndXJhdGlvbnMvbG9va3VwL1Jvc3RlclR5cGVgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgZ3JvdXAgdHlwZSBzZXR0aW5ncyBmcm9tIHNlcnZlciB1c2luZyBIdHRwU2VydmljZS5cclxuICAgKiBAcmV0dXJuIHsqfSAge09ic2VydmFibGU8R2V0Um9zdGVyVHlwZU9yU2V0dGluZ3NSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRHcm91cFR5cGVTZXR0aW5ncygpOiBPYnNlcnZhYmxlPEdldFJvc3RlclR5cGVPclNldHRpbmdzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5nZXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vY29uZmlndXJhdGlvbnMvbG9va3VwL0dUX1NldHRpbmdzYClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBQb3N0cyB0aGUgZ3JvdXAgdHlwZSBkZXRhaWxzIHRvIHNlcnZlciB1c2luZyBIdHRwU2VydmljZSB0byBjcmVhdGUgbmV3IGdyb3VwIHR5cGUuXHJcbiAgICogQHBhcmFtIHtDcmVhdGVHcm91cFR5cGVSZXF1ZXN0UGF5bG9hZH0gY3JlYXRlR3JvdXBUeXBlUGF5bG9hZFxyXG4gICAqIEByZXR1cm4geyp9ICB7T2JzZXJ2YWJsZTxDcmVhdGVHcm91cFR5cGVSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBjcmVhdGVHcm91cFR5cGUoXHJcbiAgICBjcmVhdGVHcm91cFR5cGVQYXlsb2FkOiBDcmVhdGVHcm91cFR5cGVSZXF1ZXN0UGF5bG9hZFxyXG4gICk6IE9ic2VydmFibGU8Q3JlYXRlR3JvdXBUeXBlUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wb3N0RGF0YShcclxuICAgICAgICBgJHt0aGlzLmFwaUJhc2VVcmx9L2NvbmZpZ3VyYXRpb25zL2NvbmZpZy9ncm91cFR5cGVgLFxyXG4gICAgICAgIGNyZWF0ZUdyb3VwVHlwZVBheWxvYWRcclxuICAgICAgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgc29ydGVkIHJvbGUgbGlzdCBkYXRhLlxyXG4gICAqIEBwYXJhbSB7Um9sZVtdfSByb2xlTGlzdFxyXG4gICAqIEByZXR1cm4ge1JvbGVbXX1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIHNvcnRSb2xlc0J5Um9sZVR5cGUocm9sZUxpc3Q6IFJvbGVbXSk6IFJvbGVbXSB7XHJcbiAgICByZXR1cm4gcm9sZUxpc3Quc29ydCgoYSwgYikgPT4gYT8udmlld09yZGVyIC0gYj8udmlld09yZGVyKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUG9zdHMgdGhlIHJvbGUgZGV0YWlscyB0byBzZXJ2ZXIgdXNpbmcgSHR0cFNlcnZpY2UgZm9yIGRlbGV0aW5nIHRoZSByb2xlLlxyXG4gICAqIEBwYXJhbSB7RGVsZXRlUm9sZVJlcXVlc3RQYXlsb2FkfSBkZWxldGVSb2xlUmVxdWVzdFBheWxvYWRcclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPERlbGV0ZVJvbGVSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBkZWxldGVSb2xlKFxyXG4gICAgZGVsZXRlUm9sZVBheWxvYWQ6IERlbGV0ZVJvbGVSZXF1ZXN0UGF5bG9hZFxyXG4gICk6IE9ic2VydmFibGU8RGVsZXRlUm9sZVJlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucHV0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9yb2xlL2RlbGV0ZVJvbGVgLCBkZWxldGVSb2xlUGF5bG9hZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIGdyb3VwIHR5cGVzIGZyb20gc2VydmVyIHVzaW5nIEh0dHBTZXJ2aWNlLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Vmlld0dyb3VwVHlwZVJlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldEdyb3VwVHlwZXMoYXBwSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Vmlld0dyb3VwVHlwZVJlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAuZ2V0RGF0YShcclxuICAgICAgICBgJHt0aGlzLmFwaUJhc2VVcmx9L2NvbmZpZ3VyYXRpb25zL2NvbmZpZy9hcHBHcm91cFR5cGVEZXRhaWxzLyR7YXBwSWR9YFxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0cyBncm91cCB0eXBlIGRldGFpbHMuXHJcbiAgICogQHBhcmFtIHtWaWV3R3JvdXBUeXBlUmVzcG9uc2V9IGdyb3VwVHlwZXNcclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIHNldEdyb3VwVHlwZURldGFpbHMoZ3JvdXBUeXBlczogVmlld0dyb3VwVHlwZVJlc3BvbnNlKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyb3VwVHlwZXMgPSBncm91cFR5cGVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBncm91cCB0eXBlIGRldGFpbHMuXHJcbiAgICogQHJldHVybiB7Vmlld0dyb3VwVHlwZVJlc3BvbnNlfVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0R3JvdXBUeXBlRGV0YWlscygpOiBWaWV3R3JvdXBUeXBlUmVzcG9uc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBUeXBlcztcclxuICB9XHJcbn1cclxuIl19
|