@csmart/ngc-smart-core 0.7.95 → 1.13.2
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/csmart-ngc-smart-core.d.ts +1 -5
- package/esm2020/csmart-ngc-smart-core.mjs +5 -0
- package/esm2020/lib/ngc-smart-core.module.mjs +97 -0
- package/esm2020/lib/smart-auth/smart-access-control-config.mjs +12 -0
- package/esm2020/lib/smart-auth/smart-access-control.directive.mjs +40 -0
- package/esm2020/lib/smart-auth/smart-auth.service.mjs +479 -0
- package/esm2020/lib/smart-auth/smart-authorization-guard.service.mjs +35 -0
- package/esm2020/lib/smart-auth/smart-error.component.mjs +37 -0
- package/esm2020/lib/smart-auth/smart-login-staff-resolver.service.mjs +59 -0
- package/esm2020/lib/smart-auth/smart-selected-offender-resolver.service.mjs +49 -0
- package/esm2020/lib/smart-navbar/smart-navbar-config.mjs +2 -0
- package/esm2020/lib/smart-navbar/smart-navbar.component.mjs +132 -0
- package/esm2020/lib/smart-navbar/smart-navbar.service.mjs +63 -0
- package/esm2020/lib/smart-offender-header/smart-offender-header.component.mjs +151 -0
- package/esm2020/lib/smart-offender-header/smart-offender-header.service.mjs +41 -0
- package/esm2020/lib/smart-staff-offender-options/smart-staff-offender-options-resolver.service.mjs +25 -0
- package/esm2020/lib/smart-staff-offender-options/smart-staff-offender-options.component.mjs +78 -0
- package/esm2020/lib/smart-staff-offender-options/smart-staff-offender-options.service.mjs +134 -0
- package/esm2020/lib/smart-storage/smart-storage-model.mjs +30 -0
- package/esm2020/lib/smart-storage/xdm.service.mjs +158 -0
- package/esm2020/public-api.mjs +20 -0
- package/fesm2015/csmart-ngc-smart-core.mjs +1529 -0
- package/fesm2015/csmart-ngc-smart-core.mjs.map +1 -0
- package/fesm2020/csmart-ngc-smart-core.mjs +1514 -0
- package/fesm2020/csmart-ngc-smart-core.mjs.map +1 -0
- package/lib/ngc-smart-core.module.d.ts +18 -0
- package/lib/smart-auth/smart-access-control.directive.d.ts +3 -0
- package/lib/smart-auth/smart-auth.service.d.ts +4 -0
- package/lib/smart-auth/smart-authorization-guard.service.d.ts +3 -0
- package/lib/smart-auth/smart-error.component.d.ts +3 -0
- package/lib/smart-auth/smart-login-staff-resolver.service.d.ts +3 -0
- package/lib/smart-auth/smart-selected-offender-resolver.service.d.ts +3 -0
- package/lib/smart-navbar/smart-navbar.component.d.ts +6 -3
- package/lib/smart-navbar/smart-navbar.service.d.ts +3 -0
- package/lib/smart-offender-header/smart-offender-header.component.d.ts +4 -1
- package/lib/smart-offender-header/smart-offender-header.service.d.ts +3 -0
- package/lib/smart-staff-offender-options/smart-staff-offender-options-resolver.service.d.ts +3 -0
- package/lib/smart-staff-offender-options/smart-staff-offender-options.component.d.ts +3 -0
- package/lib/smart-staff-offender-options/smart-staff-offender-options.service.d.ts +6 -3
- package/lib/smart-storage/xdm.service.d.ts +3 -0
- package/package.json +25 -14
- package/public-api.d.ts +3 -0
- package/bundles/csmart-ngc-smart-core.umd.js +0 -2620
- package/bundles/csmart-ngc-smart-core.umd.js.map +0 -1
- package/bundles/csmart-ngc-smart-core.umd.min.js +0 -2
- package/bundles/csmart-ngc-smart-core.umd.min.js.map +0 -1
- package/csmart-ngc-smart-core.metadata.json +0 -1
- package/esm2015/csmart-ngc-smart-core.js +0 -15
- package/esm2015/lib/ngc-smart-core.module.js +0 -59
- package/esm2015/lib/smart-auth/smart-access-control-config.js +0 -32
- package/esm2015/lib/smart-auth/smart-access-control.directive.js +0 -70
- package/esm2015/lib/smart-auth/smart-auth.service.js +0 -693
- package/esm2015/lib/smart-auth/smart-authorization-guard.service.js +0 -63
- package/esm2015/lib/smart-auth/smart-error.component.js +0 -77
- package/esm2015/lib/smart-auth/smart-login-staff-resolver.service.js +0 -94
- package/esm2015/lib/smart-auth/smart-selected-offender-resolver.service.js +0 -101
- package/esm2015/lib/smart-navbar/smart-navbar-config.js +0 -22
- package/esm2015/lib/smart-navbar/smart-navbar.component.js +0 -224
- package/esm2015/lib/smart-navbar/smart-navbar.service.js +0 -89
- package/esm2015/lib/smart-offender-header/smart-offender-header.component.js +0 -253
- package/esm2015/lib/smart-offender-header/smart-offender-header.service.js +0 -85
- package/esm2015/lib/smart-staff-offender-options/smart-staff-offender-options-resolver.service.js +0 -49
- package/esm2015/lib/smart-staff-offender-options/smart-staff-offender-options.component.js +0 -151
- package/esm2015/lib/smart-staff-offender-options/smart-staff-offender-options.service.js +0 -222
- package/esm2015/lib/smart-storage/smart-storage-model.js +0 -131
- package/esm2015/lib/smart-storage/xdm.service.js +0 -317
- package/esm2015/public-api.js +0 -22
- package/esm5/csmart-ngc-smart-core.js +0 -15
- package/esm5/lib/ngc-smart-core.module.js +0 -63
- package/esm5/lib/smart-auth/smart-access-control-config.js +0 -32
- package/esm5/lib/smart-auth/smart-access-control.directive.js +0 -74
- package/esm5/lib/smart-auth/smart-auth.service.js +0 -762
- package/esm5/lib/smart-auth/smart-authorization-guard.service.js +0 -67
- package/esm5/lib/smart-auth/smart-error.component.js +0 -83
- package/esm5/lib/smart-auth/smart-login-staff-resolver.service.js +0 -98
- package/esm5/lib/smart-auth/smart-selected-offender-resolver.service.js +0 -108
- package/esm5/lib/smart-navbar/smart-navbar-config.js +0 -22
- package/esm5/lib/smart-navbar/smart-navbar.component.js +0 -251
- package/esm5/lib/smart-navbar/smart-navbar.service.js +0 -114
- package/esm5/lib/smart-offender-header/smart-offender-header.component.js +0 -283
- package/esm5/lib/smart-offender-header/smart-offender-header.service.js +0 -76
- package/esm5/lib/smart-staff-offender-options/smart-staff-offender-options-resolver.service.js +0 -52
- package/esm5/lib/smart-staff-offender-options/smart-staff-offender-options.component.js +0 -165
- package/esm5/lib/smart-staff-offender-options/smart-staff-offender-options.service.js +0 -232
- package/esm5/lib/smart-storage/smart-storage-model.js +0 -155
- package/esm5/lib/smart-storage/xdm.service.js +0 -389
- package/esm5/public-api.js +0 -22
- package/fesm2015/csmart-ngc-smart-core.js +0 -2231
- package/fesm2015/csmart-ngc-smart-core.js.map +0 -1
- package/fesm5/csmart-ngc-smart-core.js +0 -2502
- package/fesm5/csmart-ngc-smart-core.js.map +0 -1
|
@@ -1,693 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview added by tsickle
|
|
3
|
-
* Generated from: lib/smart-auth/smart-auth.service.ts
|
|
4
|
-
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
5
|
-
*/
|
|
6
|
-
import * as tslib_1 from "tslib";
|
|
7
|
-
import { Injectable, Inject, isDevMode } from '@angular/core';
|
|
8
|
-
import { HttpClient } from '@angular/common/http';
|
|
9
|
-
import { of, from, throwError } from 'rxjs';
|
|
10
|
-
import { map, switchMap, take, catchError } from 'rxjs/operators';
|
|
11
|
-
import { MsalService } from '@azure/msal-angular';
|
|
12
|
-
import { SMART_DATA_SERVICE_URL, SMART_DOMAIN_FORMAT, } from '../smart-storage/smart-storage-model';
|
|
13
|
-
import { XdmService } from '../smart-storage/xdm.service';
|
|
14
|
-
import * as i0 from "@angular/core";
|
|
15
|
-
import * as i1 from "@angular/common/http";
|
|
16
|
-
import * as i2 from "@azure/msal-angular";
|
|
17
|
-
import * as i3 from "../smart-storage/xdm.service";
|
|
18
|
-
import * as i4 from "../smart-storage/smart-storage-model";
|
|
19
|
-
// import { stringify } from 'querystring';
|
|
20
|
-
export class SmartAuthService {
|
|
21
|
-
/**
|
|
22
|
-
* @param {?} http
|
|
23
|
-
* @param {?} authnService
|
|
24
|
-
* @param {?} xdmService
|
|
25
|
-
* @param {?} smartDataServiceUrl
|
|
26
|
-
* @param {?} smartDomainFormatUrl
|
|
27
|
-
*/
|
|
28
|
-
constructor(http, authnService, xdmService, smartDataServiceUrl, smartDomainFormatUrl) {
|
|
29
|
-
this.http = http;
|
|
30
|
-
this.authnService = authnService;
|
|
31
|
-
this.xdmService = xdmService;
|
|
32
|
-
this.smartDataServiceUrl = smartDataServiceUrl;
|
|
33
|
-
this.smartDomainFormatUrl = smartDomainFormatUrl;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* @return {?}
|
|
37
|
-
*/
|
|
38
|
-
getLoginStaff() {
|
|
39
|
-
if (isDevMode) {
|
|
40
|
-
console.log('SmartAuthService - getLoginStaff()');
|
|
41
|
-
}
|
|
42
|
-
if (!isDevMode && this.loginStaff) {
|
|
43
|
-
if (this.loginStaff.staffId) {
|
|
44
|
-
if (isDevMode) {
|
|
45
|
-
console.log('##### getLoginStaff(): get internal instance in service', this.loginStaff);
|
|
46
|
-
}
|
|
47
|
-
return of(this.loginStaff);
|
|
48
|
-
}
|
|
49
|
-
else if (this.loginStaff.userName) {
|
|
50
|
-
if (isDevMode) {
|
|
51
|
-
console.log('##### getLoginStaff(): get using preset user name', this.loginStaff);
|
|
52
|
-
}
|
|
53
|
-
return this.getStaff(this.loginStaff.userName);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return from(this.xdmService.getLoginStaff()).pipe(switchMap((/**
|
|
57
|
-
* @param {?} storedResult
|
|
58
|
-
* @return {?}
|
|
59
|
-
*/
|
|
60
|
-
(storedResult) => {
|
|
61
|
-
if (storedResult && storedResult.staffId) {
|
|
62
|
-
if (isDevMode) {
|
|
63
|
-
console.log('##### getLoginStaff(): get from session.', storedResult);
|
|
64
|
-
}
|
|
65
|
-
this.loginStaff = storedResult;
|
|
66
|
-
return of(storedResult);
|
|
67
|
-
}
|
|
68
|
-
else if (storedResult && storedResult.userName) {
|
|
69
|
-
if (isDevMode) {
|
|
70
|
-
console.log('##### getLoginStaff(): get using preset user name', this.loginStaff);
|
|
71
|
-
}
|
|
72
|
-
return this.getStaff(storedResult.userName);
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
/** @type {?} */
|
|
76
|
-
const userName = this.authnService.getAccount().userName;
|
|
77
|
-
/** @type {?} */
|
|
78
|
-
const staffName = userName.substring(0, userName.indexOf('@'));
|
|
79
|
-
if (isDevMode) {
|
|
80
|
-
console.log('##### loginLoginStaff(): get using login staff name ', staffName);
|
|
81
|
-
}
|
|
82
|
-
return this.getStaff(staffName);
|
|
83
|
-
}
|
|
84
|
-
})));
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* @private
|
|
88
|
-
* @param {?} app
|
|
89
|
-
* @param {?} afterHash
|
|
90
|
-
* @return {?}
|
|
91
|
-
*/
|
|
92
|
-
getTeamUrl(app, afterHash) {
|
|
93
|
-
return this.smartDomainFormatUrl.replace('${APP}', app) + afterHash;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* @private
|
|
97
|
-
* @param {?} url
|
|
98
|
-
* @param {?} app
|
|
99
|
-
* @return {?}
|
|
100
|
-
*/
|
|
101
|
-
isSameHost(url, app) {
|
|
102
|
-
return this.smartDomainFormatUrl.replace('${APP}', app) === url;
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* @param {?} loginStaff
|
|
106
|
-
* @return {?}
|
|
107
|
-
*/
|
|
108
|
-
redirectToTeam(loginStaff) {
|
|
109
|
-
if (loginStaff.roles.findIndex((/**
|
|
110
|
-
* @param {?} role
|
|
111
|
-
* @return {?}
|
|
112
|
-
*/
|
|
113
|
-
(role) => role.roleId === 'EUUSPC')) > -1) {
|
|
114
|
-
if (!this.isSameHost(window.location.origin, 'investigation')) {
|
|
115
|
-
window.location.href = this.getTeamUrl('investigation', '/assignment');
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
else if (loginStaff.roles.findIndex((/**
|
|
119
|
-
* @param {?} role
|
|
120
|
-
* @return {?}
|
|
121
|
-
*/
|
|
122
|
-
(role) => role.roleId.substring(0, 3) === 'RSC')) > -1) {
|
|
123
|
-
if (!this.isSameHost(window.location.origin, 'rsc')) {
|
|
124
|
-
window.location.href = this.getTeamUrl('rsc', '/offender-list');
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* @param {?} selectedOffender
|
|
130
|
-
* @return {?}
|
|
131
|
-
*/
|
|
132
|
-
setSelectedOffender(selectedOffender) {
|
|
133
|
-
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
134
|
-
if (selectedOffender) {
|
|
135
|
-
// if (!selectedOffender.assignmentStaffRelationId) {
|
|
136
|
-
/** @type {?} */
|
|
137
|
-
const relation = yield this.getStaffOffenderRelation(this.loginStaff.staffId, selectedOffender.offenderId).toPromise();
|
|
138
|
-
if (relation) {
|
|
139
|
-
selectedOffender.assignmentStaffRelationId = relation;
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
selectedOffender.assignmentStaffRelationId = 'NOASSIGN';
|
|
143
|
-
}
|
|
144
|
-
// }
|
|
145
|
-
}
|
|
146
|
-
this.xdmService.setSelectedOffender(selectedOffender);
|
|
147
|
-
this.selectedOffender = selectedOffender;
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* @return {?}
|
|
152
|
-
*/
|
|
153
|
-
logout() {
|
|
154
|
-
this.xdmService.clearAll();
|
|
155
|
-
this.authnService.logout();
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* @param {?} appModuleId
|
|
159
|
-
* @param {?} route
|
|
160
|
-
* @return {?}
|
|
161
|
-
*/
|
|
162
|
-
setPermission(appModuleId, route) {
|
|
163
|
-
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
164
|
-
if (!this.loginStaff) {
|
|
165
|
-
this.loginStaff = yield this.xdmService.getLoginStaff();
|
|
166
|
-
}
|
|
167
|
-
/** @type {?} */
|
|
168
|
-
const permissions = this.loginStaff.permissions;
|
|
169
|
-
/** @type {?} */
|
|
170
|
-
const resource = route.url[0].path;
|
|
171
|
-
if (!this.selectedOffender) {
|
|
172
|
-
this.selectedOffender = yield this.xdmService.getSelectedOffender();
|
|
173
|
-
}
|
|
174
|
-
if (this.selectedOffender) {
|
|
175
|
-
// if (!this.selectedOffender.assignmentStaffRelationId) {
|
|
176
|
-
/** @type {?} */
|
|
177
|
-
const relation = yield this.getStaffOffenderRelation(this.loginStaff.staffId, this.selectedOffender.offenderId).toPromise();
|
|
178
|
-
if (relation) {
|
|
179
|
-
this.selectedOffender.assignmentStaffRelationId = relation;
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
182
|
-
this.selectedOffender.assignmentStaffRelationId = 'NOASSIGN';
|
|
183
|
-
}
|
|
184
|
-
this.xdmService.setSelectedOffender(this.selectedOffender);
|
|
185
|
-
// }
|
|
186
|
-
}
|
|
187
|
-
/** @type {?} */
|
|
188
|
-
const assignmentStaffRelationId = this.selectedOffender
|
|
189
|
-
.assignmentStaffRelationId;
|
|
190
|
-
/** @type {?} */
|
|
191
|
-
const elements = document.querySelectorAll('[class^="sac-"]');
|
|
192
|
-
/** @type {?} */
|
|
193
|
-
const pattern = /^sac-(\S+)-(\S+)$/i;
|
|
194
|
-
Array.from(elements).forEach((/**
|
|
195
|
-
* @param {?} element
|
|
196
|
-
* @return {?}
|
|
197
|
-
*/
|
|
198
|
-
(element) => {
|
|
199
|
-
/** @type {?} */
|
|
200
|
-
let hide;
|
|
201
|
-
/** @type {?} */
|
|
202
|
-
let disable;
|
|
203
|
-
element.classList.forEach((/**
|
|
204
|
-
* @param {?} c
|
|
205
|
-
* @return {?}
|
|
206
|
-
*/
|
|
207
|
-
(c) => {
|
|
208
|
-
/** @type {?} */
|
|
209
|
-
const results = c.match(pattern);
|
|
210
|
-
// console.log(results);
|
|
211
|
-
if (results && results.length > 2) {
|
|
212
|
-
/** @type {?} */
|
|
213
|
-
const roleId = results[1] ? results[1].toUpperCase() : null;
|
|
214
|
-
/** @type {?} */
|
|
215
|
-
const right = results[2];
|
|
216
|
-
// console.log(results[0]);
|
|
217
|
-
// console.log(results[1]);
|
|
218
|
-
// console.log(results[2]);
|
|
219
|
-
/** @type {?} */
|
|
220
|
-
const permission = permissions.find((/**
|
|
221
|
-
* @param {?} p
|
|
222
|
-
* @return {?}
|
|
223
|
-
*/
|
|
224
|
-
function (p) {
|
|
225
|
-
return (p.appModuleId === appModuleId &&
|
|
226
|
-
p.resource === resource &&
|
|
227
|
-
p.roleId === roleId &&
|
|
228
|
-
p.assignmentStaffRelationId === assignmentStaffRelationId);
|
|
229
|
-
}));
|
|
230
|
-
/*
|
|
231
|
-
console.log('##### setPermission() resource: ', resource);
|
|
232
|
-
console.log('##### setPermission() appModuleId: ', appModuleId);
|
|
233
|
-
console.log('##### setPermission() roleId: ', roleId);
|
|
234
|
-
console.log(
|
|
235
|
-
'##### setPermission() assignment relation: ',
|
|
236
|
-
assignmentStaffRelationId,
|
|
237
|
-
);
|
|
238
|
-
*/
|
|
239
|
-
console.log('##### Matched permission: ', permission);
|
|
240
|
-
if (permission) {
|
|
241
|
-
if (right === 'read') {
|
|
242
|
-
if (!permission.readFlag) {
|
|
243
|
-
if (hide !== false) {
|
|
244
|
-
hide = true;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
hide = false;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
else if ((right === 'create' && !permission.createFlag) ||
|
|
252
|
-
(right === 'update' && !permission.updateFlag) ||
|
|
253
|
-
(right === 'delete' && !permission.deleteFlag) ||
|
|
254
|
-
(right === 'assign' && !permission.assignFlag) ||
|
|
255
|
-
(right === 'close' && !permission.closeFlag) ||
|
|
256
|
-
(right === 'expunge' && !permission.expungeFlag) ||
|
|
257
|
-
(right === 'reopen' && !permission.reopenFlag)) {
|
|
258
|
-
if (element.nodeName === 'BUTTON') {
|
|
259
|
-
if (hide !== false) {
|
|
260
|
-
hide = true;
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
else {
|
|
264
|
-
if (disable !== false) {
|
|
265
|
-
disable = true;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
else {
|
|
270
|
-
if (element.nodeName === 'BUTTON') {
|
|
271
|
-
hide = false;
|
|
272
|
-
}
|
|
273
|
-
else {
|
|
274
|
-
disable = false;
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
else {
|
|
279
|
-
if (right === 'read') {
|
|
280
|
-
if (hide !== false) {
|
|
281
|
-
hide = true;
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
else if (element.nodeName === 'BUTTON') {
|
|
285
|
-
if (hide !== false) {
|
|
286
|
-
hide = true;
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
else if (disable !== false) {
|
|
290
|
-
disable = true;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
}));
|
|
295
|
-
console.log('hide: ', hide);
|
|
296
|
-
console.log('disable: ', disable);
|
|
297
|
-
if (hide === true) {
|
|
298
|
-
this.hideHtmlElement(element);
|
|
299
|
-
}
|
|
300
|
-
else if (disable === true) {
|
|
301
|
-
this.disableHtmlElement(element);
|
|
302
|
-
}
|
|
303
|
-
}));
|
|
304
|
-
});
|
|
305
|
-
}
|
|
306
|
-
/**
|
|
307
|
-
* @param {?} accessControlConfig
|
|
308
|
-
* @return {?}
|
|
309
|
-
*/
|
|
310
|
-
checkPermission(accessControlConfig) {
|
|
311
|
-
/** @type {?} */
|
|
312
|
-
const selData = accessControlConfig.route.data;
|
|
313
|
-
this.loginStaff = selData.loginStaff;
|
|
314
|
-
this.selectedOffender = selData.selectedOffender;
|
|
315
|
-
/** @type {?} */
|
|
316
|
-
const permissions = this.loginStaff.permissions;
|
|
317
|
-
/** @type {?} */
|
|
318
|
-
const resource = accessControlConfig.route.url[0].path;
|
|
319
|
-
/** @type {?} */
|
|
320
|
-
const roleId = accessControlConfig.roleId
|
|
321
|
-
? accessControlConfig.roleId.toUpperCase()
|
|
322
|
-
: null;
|
|
323
|
-
/** @type {?} */
|
|
324
|
-
const accessType = accessControlConfig.accessType;
|
|
325
|
-
/** @type {?} */
|
|
326
|
-
const assignmentStaffRelationId = !this.selectedOffender
|
|
327
|
-
.assignmentStaffRelationId
|
|
328
|
-
? 'N/A'
|
|
329
|
-
: this.selectedOffender.assignmentStaffRelationId;
|
|
330
|
-
/** @type {?} */
|
|
331
|
-
const permission = permissions.find((/**
|
|
332
|
-
* @param {?} p
|
|
333
|
-
* @return {?}
|
|
334
|
-
*/
|
|
335
|
-
(p) => {
|
|
336
|
-
return (p.appModuleId === accessControlConfig.appModuleId
|
|
337
|
-
&& p.resource === resource
|
|
338
|
-
&& (!roleId || p.roleId === roleId)
|
|
339
|
-
&& (p.assignmentStaffRelationId === 'N/A' ||
|
|
340
|
-
p.assignmentStaffRelationId === assignmentStaffRelationId));
|
|
341
|
-
}));
|
|
342
|
-
if (permission) {
|
|
343
|
-
if (accessType === 'read') {
|
|
344
|
-
if (!permission.readFlag) {
|
|
345
|
-
return false;
|
|
346
|
-
}
|
|
347
|
-
else {
|
|
348
|
-
return true;
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
else if ((accessType === 'create' && !permission.createFlag) ||
|
|
352
|
-
(accessType === 'update' && !permission.updateFlag) ||
|
|
353
|
-
(accessType === 'delete' && !permission.deleteFlag) ||
|
|
354
|
-
(accessType === 'assign' && !permission.assignFlag) ||
|
|
355
|
-
(accessType === 'close' && !permission.closeFlag) ||
|
|
356
|
-
(accessType === 'expunge' && !permission.expungeFlag) ||
|
|
357
|
-
(accessType === 'reopen' && !permission.reopenFlag)) {
|
|
358
|
-
return false;
|
|
359
|
-
}
|
|
360
|
-
else {
|
|
361
|
-
return true;
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
else {
|
|
365
|
-
if (accessType === 'read') {
|
|
366
|
-
return false;
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
return false;
|
|
370
|
-
}
|
|
371
|
-
/**
|
|
372
|
-
* @param {?} loginStaff
|
|
373
|
-
* @param {?} feature
|
|
374
|
-
* @param {?=} appModuleId
|
|
375
|
-
* @return {?}
|
|
376
|
-
*/
|
|
377
|
-
canAppFeatureActivate(loginStaff, feature, appModuleId = null) {
|
|
378
|
-
// if (!this.isAuthEnable(loginStaff.roles, appModuleId)) {
|
|
379
|
-
// return true;
|
|
380
|
-
// }
|
|
381
|
-
return this.hasAppFeaturePermission(loginStaff.permissions, feature, appModuleId);
|
|
382
|
-
}
|
|
383
|
-
// public isAuthEnable(roles: Role[], appModuleId: string) {
|
|
384
|
-
// if (roles && roles.length > 0) {
|
|
385
|
-
// return roles.map(r => r.roleId).findIndex(this.isExternalRole) > -1 || appModuleId === 'RR';
|
|
386
|
-
// }
|
|
387
|
-
// return false;
|
|
388
|
-
// }
|
|
389
|
-
/**
|
|
390
|
-
* @param {?} roles
|
|
391
|
-
* @return {?}
|
|
392
|
-
*/
|
|
393
|
-
hasIntakeRole(roles) {
|
|
394
|
-
if (roles && roles.length > 0) {
|
|
395
|
-
return roles.findIndex(this.isIntakeRole) > -1;
|
|
396
|
-
}
|
|
397
|
-
return false;
|
|
398
|
-
}
|
|
399
|
-
/**
|
|
400
|
-
* @private
|
|
401
|
-
* @param {?} permissions
|
|
402
|
-
* @param {?} feature
|
|
403
|
-
* @param {?} appModuleId
|
|
404
|
-
* @return {?}
|
|
405
|
-
*/
|
|
406
|
-
hasAppFeaturePermission(permissions, feature, appModuleId) {
|
|
407
|
-
if (permissions && permissions.length > 0) {
|
|
408
|
-
if (appModuleId) {
|
|
409
|
-
return (permissions.findIndex((/**
|
|
410
|
-
* @param {?} p
|
|
411
|
-
* @return {?}
|
|
412
|
-
*/
|
|
413
|
-
(p) => p.resource === feature && p.appModuleId === appModuleId)) > -1);
|
|
414
|
-
}
|
|
415
|
-
else {
|
|
416
|
-
return permissions.findIndex((/**
|
|
417
|
-
* @param {?} p
|
|
418
|
-
* @return {?}
|
|
419
|
-
*/
|
|
420
|
-
(p) => p.resource === feature)) > -1;
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
return false;
|
|
424
|
-
}
|
|
425
|
-
/**
|
|
426
|
-
* @private
|
|
427
|
-
* @param {?} roleId
|
|
428
|
-
* @return {?}
|
|
429
|
-
*/
|
|
430
|
-
isExternalRole(roleId) {
|
|
431
|
-
switch (roleId) {
|
|
432
|
-
case 'EUDTL':
|
|
433
|
-
case 'EUDUSM':
|
|
434
|
-
case 'EUJDG':
|
|
435
|
-
case 'EUMPD':
|
|
436
|
-
case 'EUSOTV':
|
|
437
|
-
case 'EUUSA2':
|
|
438
|
-
case 'EUUSAO':
|
|
439
|
-
case 'EUUSPC':
|
|
440
|
-
return true;
|
|
441
|
-
default:
|
|
442
|
-
return false;
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
/**
|
|
446
|
-
* @private
|
|
447
|
-
* @param {?} role
|
|
448
|
-
* @return {?}
|
|
449
|
-
*/
|
|
450
|
-
isIntakeRole(role) {
|
|
451
|
-
switch (role.roleId) {
|
|
452
|
-
case 'OPA':
|
|
453
|
-
case 'OPS':
|
|
454
|
-
case 'SOPS':
|
|
455
|
-
return true;
|
|
456
|
-
default:
|
|
457
|
-
return false;
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
/**
|
|
461
|
-
* @private
|
|
462
|
-
* @param {?} element
|
|
463
|
-
* @return {?}
|
|
464
|
-
*/
|
|
465
|
-
disableHtmlElement(element) {
|
|
466
|
-
// console.log(element);
|
|
467
|
-
switch (element.nodeName) {
|
|
468
|
-
case 'A':
|
|
469
|
-
element.setAttribute('style', 'pointer-events: none;cursor: not-allowed;');
|
|
470
|
-
element.setAttribute('tabIndex', '-1');
|
|
471
|
-
break;
|
|
472
|
-
default:
|
|
473
|
-
element.setAttribute('disabled', 'disabled');
|
|
474
|
-
break;
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
/**
|
|
478
|
-
* @private
|
|
479
|
-
* @param {?} element
|
|
480
|
-
* @return {?}
|
|
481
|
-
*/
|
|
482
|
-
hideHtmlElement(element) {
|
|
483
|
-
// element.setAttribute('hidden', 'hidden');
|
|
484
|
-
element.setAttribute('style', 'display: none;');
|
|
485
|
-
}
|
|
486
|
-
/**
|
|
487
|
-
* @private
|
|
488
|
-
* @param {?} userName
|
|
489
|
-
* @return {?}
|
|
490
|
-
*/
|
|
491
|
-
getStaff(userName) {
|
|
492
|
-
/** @type {?} */
|
|
493
|
-
const queryString = `
|
|
494
|
-
{
|
|
495
|
-
findvStaffs(input: {where: {userName: "${userName}", activeFlag: true}}) {
|
|
496
|
-
totalCount
|
|
497
|
-
message
|
|
498
|
-
data {
|
|
499
|
-
staffId
|
|
500
|
-
userName
|
|
501
|
-
lastName
|
|
502
|
-
firstName
|
|
503
|
-
phone
|
|
504
|
-
email
|
|
505
|
-
roles {
|
|
506
|
-
roleId
|
|
507
|
-
role
|
|
508
|
-
}
|
|
509
|
-
permissions {
|
|
510
|
-
roleId
|
|
511
|
-
appModuleId
|
|
512
|
-
resource
|
|
513
|
-
assignmentStaffRelationId
|
|
514
|
-
readFlag
|
|
515
|
-
createFlag
|
|
516
|
-
updateFlag
|
|
517
|
-
deleteFlag
|
|
518
|
-
assignFlag
|
|
519
|
-
reopenFlag
|
|
520
|
-
closeFlag
|
|
521
|
-
expungeFlag
|
|
522
|
-
}
|
|
523
|
-
options {
|
|
524
|
-
offenderListOptionId
|
|
525
|
-
name
|
|
526
|
-
serviceApiFieldName
|
|
527
|
-
selectedFlag
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
}`;
|
|
532
|
-
return this.http
|
|
533
|
-
.post(this.smartDataServiceUrl, { query: queryString })
|
|
534
|
-
.pipe(take(1), map((/**
|
|
535
|
-
* @param {?} result
|
|
536
|
-
* @return {?}
|
|
537
|
-
*/
|
|
538
|
-
(result) => {
|
|
539
|
-
if (isDevMode) {
|
|
540
|
-
console.log('##### getStaff() from service ', result);
|
|
541
|
-
}
|
|
542
|
-
if (result.data.findvStaffs.data.length > 0) {
|
|
543
|
-
/** @type {?} */
|
|
544
|
-
const data = result.data.findvStaffs.data[0];
|
|
545
|
-
this.xdmService.setLoginStaff(data);
|
|
546
|
-
this.loginStaff = data;
|
|
547
|
-
return data;
|
|
548
|
-
}
|
|
549
|
-
else {
|
|
550
|
-
return null;
|
|
551
|
-
// return throwError('No access right.');
|
|
552
|
-
}
|
|
553
|
-
})), catchError((/**
|
|
554
|
-
* @param {?} error
|
|
555
|
-
* @return {?}
|
|
556
|
-
*/
|
|
557
|
-
(error) => {
|
|
558
|
-
console.log('error ' + error);
|
|
559
|
-
return null;
|
|
560
|
-
})));
|
|
561
|
-
}
|
|
562
|
-
/**
|
|
563
|
-
* @private
|
|
564
|
-
* @param {?} staffId
|
|
565
|
-
* @param {?} offenderId
|
|
566
|
-
* @return {?}
|
|
567
|
-
*/
|
|
568
|
-
getStaffOffenderRelation(staffId, offenderId) {
|
|
569
|
-
/** @type {?} */
|
|
570
|
-
const queryString = `
|
|
571
|
-
{
|
|
572
|
-
findvStaffOffenderRelations(input: {where: {staffId: ${staffId}, offenderId: ${offenderId}}}) {
|
|
573
|
-
data {
|
|
574
|
-
assignmentStaffRelationId
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
}`;
|
|
578
|
-
return this.http
|
|
579
|
-
.post(this.smartDataServiceUrl, { query: queryString })
|
|
580
|
-
.pipe(take(1), map((/**
|
|
581
|
-
* @param {?} result
|
|
582
|
-
* @return {?}
|
|
583
|
-
*/
|
|
584
|
-
(result) => {
|
|
585
|
-
if (isDevMode) {
|
|
586
|
-
console.log('##### getStaffOffenderRelation() from service ', result);
|
|
587
|
-
}
|
|
588
|
-
if (result.data.findvStaffOffenderRelations.data.length > 0) {
|
|
589
|
-
/** @type {?} */
|
|
590
|
-
const data = result.data.findvStaffOffenderRelations.data[0];
|
|
591
|
-
return data.assignmentStaffRelationId;
|
|
592
|
-
}
|
|
593
|
-
else {
|
|
594
|
-
return null;
|
|
595
|
-
// return throwError('No access right.');
|
|
596
|
-
}
|
|
597
|
-
})), catchError((/**
|
|
598
|
-
* @param {?} error
|
|
599
|
-
* @return {?}
|
|
600
|
-
*/
|
|
601
|
-
(error) => {
|
|
602
|
-
console.log('error ' + error);
|
|
603
|
-
return null;
|
|
604
|
-
})));
|
|
605
|
-
}
|
|
606
|
-
/**
|
|
607
|
-
* @private
|
|
608
|
-
* @param {?} appModuleId
|
|
609
|
-
* @param {?} resource
|
|
610
|
-
* @return {?}
|
|
611
|
-
*/
|
|
612
|
-
getRolePermissions(appModuleId, resource) {
|
|
613
|
-
/** @type {?} */
|
|
614
|
-
const queryString = `
|
|
615
|
-
query findvRolePermissionPivots{
|
|
616
|
-
findvRolePermissionPivots(input: {where: {appModuleId: ${appModuleId}, resource: ${resource}}}){
|
|
617
|
-
totalCount
|
|
618
|
-
message
|
|
619
|
-
}
|
|
620
|
-
}`;
|
|
621
|
-
return this.http
|
|
622
|
-
.post(this.smartDataServiceUrl, { query: queryString })
|
|
623
|
-
.pipe(take(1), map((/**
|
|
624
|
-
* @param {?} result
|
|
625
|
-
* @return {?}
|
|
626
|
-
*/
|
|
627
|
-
(result) => {
|
|
628
|
-
if (isDevMode) {
|
|
629
|
-
console.log('##### findvRolePermissionPivots() from service ', result);
|
|
630
|
-
}
|
|
631
|
-
if (result.data.findvRolePermissionPivots.totalCount > 0) {
|
|
632
|
-
return true;
|
|
633
|
-
}
|
|
634
|
-
else {
|
|
635
|
-
return false;
|
|
636
|
-
// return throwError('No access right.');
|
|
637
|
-
}
|
|
638
|
-
})), catchError((/**
|
|
639
|
-
* @param {?} error
|
|
640
|
-
* @return {?}
|
|
641
|
-
*/
|
|
642
|
-
(error) => {
|
|
643
|
-
console.log('error ' + error);
|
|
644
|
-
return throwError(error);
|
|
645
|
-
})));
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
SmartAuthService.decorators = [
|
|
649
|
-
{ type: Injectable, args: [{
|
|
650
|
-
providedIn: 'root',
|
|
651
|
-
},] }
|
|
652
|
-
];
|
|
653
|
-
/** @nocollapse */
|
|
654
|
-
SmartAuthService.ctorParameters = () => [
|
|
655
|
-
{ type: HttpClient },
|
|
656
|
-
{ type: MsalService },
|
|
657
|
-
{ type: XdmService },
|
|
658
|
-
{ type: undefined, decorators: [{ type: Inject, args: [SMART_DATA_SERVICE_URL,] }] },
|
|
659
|
-
{ type: String, decorators: [{ type: Inject, args: [SMART_DOMAIN_FORMAT,] }] }
|
|
660
|
-
];
|
|
661
|
-
/** @nocollapse */ SmartAuthService.ngInjectableDef = i0.defineInjectable({ factory: function SmartAuthService_Factory() { return new SmartAuthService(i0.inject(i1.HttpClient), i0.inject(i2.MsalService), i0.inject(i3.XdmService), i0.inject(i4.SMART_DATA_SERVICE_URL), i0.inject(i4.SMART_DOMAIN_FORMAT)); }, token: SmartAuthService, providedIn: "root" });
|
|
662
|
-
if (false) {
|
|
663
|
-
/** @type {?} */
|
|
664
|
-
SmartAuthService.prototype.loginStaff;
|
|
665
|
-
/** @type {?} */
|
|
666
|
-
SmartAuthService.prototype.selectedOffender;
|
|
667
|
-
/**
|
|
668
|
-
* @type {?}
|
|
669
|
-
* @private
|
|
670
|
-
*/
|
|
671
|
-
SmartAuthService.prototype.http;
|
|
672
|
-
/**
|
|
673
|
-
* @type {?}
|
|
674
|
-
* @private
|
|
675
|
-
*/
|
|
676
|
-
SmartAuthService.prototype.authnService;
|
|
677
|
-
/**
|
|
678
|
-
* @type {?}
|
|
679
|
-
* @private
|
|
680
|
-
*/
|
|
681
|
-
SmartAuthService.prototype.xdmService;
|
|
682
|
-
/**
|
|
683
|
-
* @type {?}
|
|
684
|
-
* @private
|
|
685
|
-
*/
|
|
686
|
-
SmartAuthService.prototype.smartDataServiceUrl;
|
|
687
|
-
/**
|
|
688
|
-
* @type {?}
|
|
689
|
-
* @private
|
|
690
|
-
*/
|
|
691
|
-
SmartAuthService.prototype.smartDomainFormatUrl;
|
|
692
|
-
}
|
|
693
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNzbWFydC9uZ2Mtc21hcnQtY29yZS8iLCJzb3VyY2VzIjpbImxpYi9zbWFydC1hdXRoL3NtYXJ0LWF1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4RCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR2xELE9BQU8sRUFHTCxzQkFBc0IsRUFDdEIsbUJBQW1CLEdBR3BCLE1BQU0sc0NBQXNDLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7O0FBUTFELE1BQU0sT0FBTyxnQkFBZ0I7Ozs7Ozs7O0lBSTNCLFlBQ1UsSUFBZ0IsRUFDaEIsWUFBeUIsRUFDekIsVUFBc0IsRUFDVSxtQkFBbUIsRUFDdEIsb0JBQTRCO1FBSnpELFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsaUJBQVksR0FBWixZQUFZLENBQWE7UUFDekIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNVLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBQTtRQUN0Qix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQVE7SUFDaEUsQ0FBQzs7OztJQUVHLGFBQWE7UUFDbEIsSUFBSSxTQUFTLEVBQUU7WUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7U0FDbkQ7UUFDRCxJQUFJLENBQUMs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QUUsRUFBRTtZQUNiLElBQUksU0FBUyxFQUFFO2dCQUNiLE9BQU8sQ0FBQyxHQUFHLENBQ1QsaURBQWlELEVBQ2pELE1BQU0sQ0FDUCxDQUFDO2FBQ0g7WUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRTtnQkFDeEQsT0FBTyxJQUFJLENBQUM7YUFDYjtpQkFBTTtnQkFDTCxPQUFPLEtBQUssQ0FBQztnQkFDYix5Q0FBeUM7YUFDMUM7UUFDSCxDQUFDLEVBQUMsRUFDRixVQUFVOzs7O1FBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQztZQUM5QixPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixDQUFDLEVBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQzs7O1lBdGhCRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7Ozs7WUFyQlEsVUFBVTtZQUdWLFdBQVc7WUFXWCxVQUFVOzRDQWdCZCxNQUFNLFNBQUMsc0JBQXNCO3lDQUM3QixNQUFNLFNBQUMsbUJBQW1COzs7OztJQVI3QixzQ0FBdUI7O0lBQ3ZCLDRDQUFtQzs7Ozs7SUFHakMsZ0NBQXdCOzs7OztJQUN4Qix3Q0FBaUM7Ozs7O0lBQ2pDLHNDQUE4Qjs7Ozs7SUFDOUIsK0NBQTJEOzs7OztJQUMzRCxnREFBaUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgZnJvbSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCwgdGFrZSwgY2F0Y2hFcnJvcn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBNc2FsU2VydmljZSB9IGZyb20gJ0BhenVyZS9tc2FsLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbmltcG9ydCB7XHJcbiAgTG9naW5TdGFmZixcclxuICBTZWxlY3RlZE9mZmVuZGVyLFxyXG4gIFNNQVJUX0RBVEFfU0VSVklDRV9VUkwsXHJcbiAgU01BUlRfRE9NQUlOX0ZPUk1BVCxcclxuICBSb2xlLFxyXG4gIFBlcm1pc3Npb24sXHJcbn0gZnJvbSAnLi4vc21hcnQtc3RvcmFnZS9zbWFydC1zdG9yYWdlLW1vZGVsJztcclxuaW1wb3J0IHsgWGRtU2VydmljZSB9IGZyb20gJy4uL3NtYXJ0LXN0b3JhZ2UveGRtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTbWFydEFjY2Vzc0NvbnRyb2xDb25maWcgfSBmcm9tICcuL3NtYXJ0LWFjY2Vzcy1jb250cm9sLWNvbmZpZyc7XHJcbmltcG9ydCB7IG51bGxTYWZlSXNFcXVpdmFsZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXIvc3JjL291dHB1dC9vdXRwdXRfYXN0JztcclxuLy8gaW1wb3J0IHsgc3RyaW5naWZ5IH0gZnJvbSAncXVlcnlzdHJpbmcnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNtYXJ0QXV0aFNlcnZpY2Uge1xyXG4gIGxvZ2luU3RhZmY6IExvZ2luU3RhZmY7XHJcbiAgc2VsZWN0ZWRPZmZlbmRlcjogU2VsZWN0ZWRPZmZlbmRlcjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGF1dGhuU2VydmljZTogTXNhbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHhkbVNlcnZpY2U6IFhkbVNlcnZpY2UsXHJcbiAgICBASW5qZWN0KFNNQVJUX0RBVEFfU0VSVklDRV9VUkwpIHByaXZhdGUgc21hcnREYXRhU2VydmljZVVybCxcclxuICAgIEBJbmplY3QoU01BUlRfRE9NQUlOX0ZPUk1BVCkgcHJpdmF0ZSBzbWFydERvbWFpbkZvcm1hdFVybDogc3RyaW5nLFxyXG4gICkge31cclxuXHJcbiAgcHVibGljIGdldExvZ2luU3RhZmYoKTogT2JzZXJ2YWJsZTxMb2dpblN0YWZmPiB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdTbWFydEF1dGhTZXJ2aWNlIC0gZ2V0TG9naW5TdGFmZigpJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzRGV2TW9kZSAmJiB0aGlzLmxvZ2luU3RhZmYpIHtcclxuICAgICAgaWYgKHRoaXMubG9naW5TdGFmZi5zdGFmZklkKSB7XHJcbiAgICAgICAgaWYgKGlzRGV2TW9kZSkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICcjIyMjIyBnZXRMb2dpblN0YWZmKCk6IGdldCBpbnRlcm5hbCBpbnN0YW5jZSBpbiBzZXJ2aWNlJyxcclxuICAgICAgICAgICAgdGhpcy5sb2dpblN0YWZmLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9mKHRoaXMubG9naW5TdGFmZik7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5sb2dpblN0YWZmLnVzZXJOYW1lKSB7XHJcbiAgICAgICAgaWYgKGlzRGV2TW9kZSkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICcjIyMjIyBnZXRMb2dpblN0YWZmKCk6IGdldCB1c2luZyBwcmVzZXQgdXNlciBuYW1lJyxcclxuICAgICAgICAgICAgdGhpcy5sb2dpblN0YWZmLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhZmYodGhpcy5sb2dpblN0YWZmLnVzZXJOYW1lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZyb20odGhpcy54ZG1TZXJ2aWNlLmdldExvZ2luU3RhZmYoKSkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKChzdG9yZWRSZXN1bHQpID0+IHtcclxuICAgICAgICBpZiAoc3RvcmVkUmVzdWx0ICYmIHN0b3JlZFJlc3VsdC5zdGFmZklkKSB7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICcjIyMjIyBnZXRMb2dpblN0YWZmKCk6IGdldCBmcm9tIHNlc3Npb24uJyxcclxuICAgICAgICAgICAgICBzdG9yZWRSZXN1bHQsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmxvZ2luU3RhZmYgPSBzdG9yZWRSZXN1bHQ7XHJcbiAgICAgICAgICByZXR1cm4gb2Yoc3RvcmVkUmVzdWx0KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0b3JlZFJlc3VsdCAmJiBzdG9yZWRSZXN1bHQudXNlck5hbWUpIHtcclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgJyMjIyMjIGdldExvZ2luU3RhZmYoKTogZ2V0IHVzaW5nIHByZXNldCB1c2VyIG5hbWUnLFxyXG4gICAgICAgICAgICAgIHRoaXMubG9naW5TdGFmZixcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiB0aGlzLmdldFN0YWZmKHN0b3JlZFJlc3VsdC51c2VyTmFtZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IHVzZXJOYW1lID0gdGhpcy5hdXRoblNlcnZpY2UuZ2V0QWNjb3VudCgpLnVzZXJOYW1lO1xyXG4gICAgICAgICAgY29uc3Qgc3RhZmZOYW1lID0gdXNlck5hbWUuc3Vic3RyaW5nKDAsIHVzZXJOYW1lLmluZGV4T2YoJ0AnKSk7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICcjIyMjIyBsb2dpbkxvZ2luU3RhZmYoKTogZ2V0IHVzaW5nIGxvZ2luIHN0YWZmIG5hbWUgJyxcclxuICAgICAgICAgICAgICBzdGFmZk5hbWUsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTdGFmZihzdGFmZk5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRUZWFtVXJsKGFwcDogc3RyaW5nLCBhZnRlckhhc2g6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5zbWFydERvbWFpbkZvcm1hdFVybC5yZXBsYWNlKCcke0FQUH0nLCBhcHApICsgYWZ0ZXJIYXNoO1xyXG4gIH1cclxuICBwcml2YXRlIGlzU2FtZUhvc3QodXJsLCBhcHApIHtcclxuICAgIHJldHVybiB0aGlzLnNtYXJ0RG9tYWluRm9ybWF0VXJsLnJlcGxhY2UoJyR7QVBQfScsIGFwcCkgPT09IHVybDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWRpcmVjdFRvVGVhbShsb2dpblN0YWZmOiBMb2dpblN0YWZmKSB7XHJcbiAgICBpZiAobG9naW5TdGFmZi5yb2xlcy5maW5kSW5kZXgoKHJvbGUpID0+IHJvbGUucm9sZUlkID09PSAnRVVVU1BDJykgPiAtMSkge1xyXG4gICAgICBpZiAoIXRoaXMuaXNTYW1lSG9zdCh3aW5kb3cubG9jYXRpb24ub3JpZ2luLCAnaW52ZXN0aWdhdGlvbicpKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLmdldFRlYW1VcmwoJ2ludmVzdGlnYXRpb24nLCAnL2Fzc2lnbm1lbnQnKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgbG9naW5TdGFmZi5yb2xlcy5maW5kSW5kZXgoXHJcbiAgICAgICAgKHJvbGUpID0+IHJvbGUucm9sZUlkLnN1YnN0cmluZygwLCAzKSA9PT0gJ1JTQycsXHJcbiAgICAgICkgPiAtMVxyXG4gICAgKSB7XHJcbiAgICAgIGlmICghdGhpcy5pc1NhbWVIb3N0KHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4sICdyc2MnKSkge1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGhpcy5nZXRUZWFtVXJsKCdyc2MnLCAnL29mZmVuZGVyLWxpc3QnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNldFNlbGVjdGVkT2ZmZW5kZXIoc2VsZWN0ZWRPZmZlbmRlcjogU2VsZWN0ZWRPZmZlbmRlcikge1xyXG4gICAgaWYgKHNlbGVjdGVkT2ZmZW5kZXIpIHtcclxuICAgICAgLy8gaWYgKCFzZWxlY3RlZE9mZmVuZGVyLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQpIHtcclxuICAgICAgY29uc3QgcmVsYXRpb24gPSBhd2FpdCB0aGlzLmdldFN0YWZmT2ZmZW5kZXJSZWxhdGlvbihcclxuICAgICAgICB0aGlzLmxvZ2luU3RhZmYuc3RhZmZJZCxcclxuICAgICAgICBzZWxlY3RlZE9mZmVuZGVyLm9mZmVuZGVySWQsXHJcbiAgICAgICkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGlmIChyZWxhdGlvbikge1xyXG4gICAgICAgIHNlbGVjdGVkT2ZmZW5kZXIuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCA9IHJlbGF0aW9uO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNlbGVjdGVkT2ZmZW5kZXIuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCA9ICdOT0FTU0lHTic7XHJcbiAgICAgIH1cclxuICAgICAgLy8gfVxyXG4gICAgfVxyXG4gICAgdGhpcy54ZG1TZXJ2aWNlLnNldFNlbGVjdGVkT2ZmZW5kZXIoc2VsZWN0ZWRPZmZlbmRlcik7XHJcbiAgICB0aGlzLnNlbGVjdGVkT2ZmZW5kZXIgPSBzZWxlY3RlZE9mZmVuZGVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvZ291dCgpOiB2b2lkIHtcclxuICAgIHRoaXMueGRtU2VydmljZS5jbGVhckFsbCgpO1xyXG4gICAgdGhpcy5hdXRoblNlcnZpY2UubG9nb3V0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0UGVybWlzc2lvbihcclxuICAgIGFwcE1vZHVsZUlkOiBzdHJpbmcsXHJcbiAgICByb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcclxuICApIHtcclxuICAgIGlmICghdGhpcy5sb2dpblN0YWZmKSB7XHJcbiAgICAgIHRoaXMubG9naW5TdGFmZiA9IGF3YWl0IHRoaXMueGRtU2VydmljZS5nZXRMb2dpblN0YWZmKCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHRoaXMubG9naW5TdGFmZi5wZXJtaXNzaW9ucztcclxuICAgIGNvbnN0IHJlc291cmNlID0gcm91dGUudXJsWzBdLnBhdGg7XHJcblxyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkT2ZmZW5kZXIpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZE9mZmVuZGVyID0gYXdhaXQgdGhpcy54ZG1TZXJ2aWNlLmdldFNlbGVjdGVkT2ZmZW5kZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZE9mZmVuZGVyKSB7XHJcbiAgICAgIC8vIGlmICghdGhpcy5zZWxlY3RlZE9mZmVuZGVyLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQpIHtcclxuICAgICAgY29uc3QgcmVsYXRpb24gPSBhd2FpdCB0aGlzLmdldFN0YWZmT2ZmZW5kZXJSZWxhdGlvbihcclxuICAgICAgICB0aGlzLmxvZ2luU3RhZmYuc3RhZmZJZCxcclxuICAgICAgICB0aGlzLnNlbGVjdGVkT2ZmZW5kZXIub2ZmZW5kZXJJZCxcclxuICAgICAgKS50b1Byb21pc2UoKTtcclxuICAgICAgaWYgKHJlbGF0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9mZmVuZGVyLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPSByZWxhdGlvbjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkT2ZmZW5kZXIuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCA9ICdOT0FTU0lHTic7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy54ZG1TZXJ2aWNlLnNldFNlbGVjdGVkT2ZmZW5kZXIodGhpcy5zZWxlY3RlZE9mZmVuZGVyKTtcclxuICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPSB0aGlzLnNlbGVjdGVkT2ZmZW5kZXJcclxuICAgICAgLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQ7XHJcblxyXG4gICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbY2xhc3NePVwic2FjLVwiXScpO1xyXG4gICAgY29uc3QgcGF0dGVybiA9IC9ec2FjLShcXFMrKS0oXFxTKykkL2k7XHJcblxyXG4gICAgQXJyYXkuZnJvbShlbGVtZW50cykuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICBsZXQgaGlkZTtcclxuICAgICAgbGV0IGRpc2FibGU7XHJcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICBjb25zdCByZXN1bHRzID0gYy5tYXRjaChwYXR0ZXJuKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXN1bHRzKTtcclxuICAgICAgICBpZiAocmVzdWx0cyAmJiByZXN1bHRzLmxlbmd0aCA+IDIpIHtcclxuICAgICAgICAgIGNvbnN0IHJvbGVJZCA9IHJlc3VsdHNbMV0gPyByZXN1bHRzWzFdLnRvVXBwZXJDYXNlKCkgOiBudWxsO1xyXG4gICAgICAgICAgY29uc3QgcmlnaHQgPSByZXN1bHRzWzJdO1xyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzdWx0c1swXSk7XHJcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXN1bHRzWzFdKTtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3VsdHNbMl0pO1xyXG4gICAgICAgICAgY29uc3QgcGVybWlzc2lvbiA9IHBlcm1pc3Npb25zLmZpbmQoZnVuY3Rpb24gKHApIHtcclxuICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICBwLmFwcE1vZHVsZUlkID09PSBhcHBNb2R1bGVJZCAmJlxyXG4gICAgICAgICAgICAgIHAucmVzb3VyY2UgPT09IHJlc291cmNlICYmXHJcbiAgICAgICAgICAgICAgcC5yb2xlSWQgPT09IHJvbGVJZCAmJlxyXG4gICAgICAgICAgICAgIHAuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCA9PT0gYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICAvKlxyXG4gICAgICAgICAgY29uc29sZS5sb2coJyMjIyMjIHNldFBlcm1pc3Npb24oKSByZXNvdXJjZTogJywgcmVzb3VyY2UpO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJyMjIyMjIHNldFBlcm1pc3Npb24oKSBhcHBNb2R1bGVJZDogJywgYXBwTW9kdWxlSWQpO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJyMjIyMjIHNldFBlcm1pc3Npb24oKSByb2xlSWQ6ICcsIHJvbGVJZCk7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgJyMjIyMjIHNldFBlcm1pc3Npb24oKSBhc3NpZ25tZW50IHJlbGF0aW9uOiAnLFxyXG4gICAgICAgICAgICBhc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgICovXHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnIyMjIyMgTWF0Y2hlZCBwZXJtaXNzaW9uOiAnLCBwZXJtaXNzaW9uKTtcclxuXHJcbiAgICAgICAgICBpZiAocGVybWlzc2lvbikge1xyXG4gICAgICAgICAgICBpZiAocmlnaHQgPT09ICdyZWFkJykge1xyXG4gICAgICAgICAgICAgIGlmICghcGVybWlzc2lvbi5yZWFkRmxhZykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGhpZGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgIGhpZGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBoaWRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgIChyaWdodCA9PT0gJ2NyZWF0ZScgJiYgIXBlcm1pc3Npb24uY3JlYXRlRmxhZykgfHxcclxuICAgICAgICAgICAgICAocmlnaHQgPT09ICd1cGRhdGUnICYmICFwZXJtaXNzaW9uLnVwZGF0ZUZsYWcpIHx8XHJcbiAgICAgICAgICAgICAgKHJpZ2h0ID09PSAnZGVsZXRlJyAmJiAhcGVybWlzc2lvbi5kZWxldGVGbGFnKSB8fFxyXG4gICAgICAgICAgICAgIChyaWdodCA9PT0gJ2Fzc2lnbicgJiYgIXBlcm1pc3Npb24uYXNzaWduRmxhZykgfHxcclxuICAgICAgICAgICAgICAocmlnaHQgPT09ICdjbG9zZScgJiYgIXBlcm1pc3Npb24uY2xvc2VGbGFnKSB8fFxyXG4gICAgICAgICAgICAgIChyaWdodCA9PT0gJ2V4cHVuZ2UnICYmICFwZXJtaXNzaW9uLmV4cHVuZ2VGbGFnKSB8fFxyXG4gICAgICAgICAgICAgIChyaWdodCA9PT0gJ3Jlb3BlbicgJiYgIXBlcm1pc3Npb24ucmVvcGVuRmxhZylcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdCVVRUT04nKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaGlkZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgaGlkZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICBkaXNhYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdCVVRUT04nKSB7XHJcbiAgICAgICAgICAgICAgICBoaWRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRpc2FibGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChyaWdodCA9PT0gJ3JlYWQnKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGhpZGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBoaWRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5ub2RlTmFtZSA9PT0gJ0JVVFRPTicpIHtcclxuICAgICAgICAgICAgICBpZiAoaGlkZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIGhpZGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXNhYmxlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgIGRpc2FibGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgY29uc29sZS5sb2coJ2hpZGU6ICcsIGhpZGUpO1xyXG4gICAgICBjb25zb2xlLmxvZygnZGlzYWJsZTogJywgZGlzYWJsZSk7XHJcbiAgICAgIGlmIChoaWRlID09PSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5oaWRlSHRtbEVsZW1lbnQoZWxlbWVudCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZGlzYWJsZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZUh0bWxFbGVtZW50KGVsZW1lbnQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjaGVja1Blcm1pc3Npb24oYWNjZXNzQ29udHJvbENvbmZpZzogU21hcnRBY2Nlc3NDb250cm9sQ29uZmlnKSB7XHJcbiAgICBjb25zdCBzZWxEYXRhID0gYWNjZXNzQ29udHJvbENvbmZpZy5yb3V0ZS5kYXRhO1xyXG4gICAgdGhpcy5sb2dpblN0YWZmID0gc2VsRGF0YS5sb2dpblN0YWZmO1xyXG4gICAgdGhpcy5zZWxlY3RlZE9mZmVuZGVyID0gc2VsRGF0YS5zZWxlY3RlZE9mZmVuZGVyO1xyXG5cclxuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gdGhpcy5sb2dpblN0YWZmLnBlcm1pc3Npb25zO1xyXG4gICAgY29uc3QgcmVzb3VyY2UgPSBhY2Nlc3NDb250cm9sQ29uZmlnLnJvdXRlLnVybFswXS5wYXRoO1xyXG4gICAgY29uc3Qgcm9sZUlkID0gYWNjZXNzQ29udHJvbENvbmZpZy5yb2xlSWRcclxuICAgICAgPyBhY2Nlc3NDb250cm9sQ29uZmlnLnJvbGVJZC50b1VwcGVyQ2FzZSgpXHJcbiAgICAgIDogbnVsbDtcclxuICAgIGNvbnN0IGFjY2Vzc1R5cGUgPSBhY2Nlc3NDb250cm9sQ29uZmlnLmFjY2Vzc1R5cGU7XHJcbiAgICBjb25zdCBhc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkID0gIXRoaXMuc2VsZWN0ZWRPZmZlbmRlclxyXG4gICAgICAuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZFxyXG4gICAgICA/ICdOL0EnXHJcbiAgICAgIDogdGhpcy5zZWxlY3RlZE9mZmVuZGVyLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQ7XHJcblxyXG4gICAgY29uc3QgcGVybWlzc2lvbiA9IHBlcm1pc3Npb25zLmZpbmQoKHApID0+IHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgIHAuYXBwTW9kdWxlSWQgPT09IGFjY2Vzc0NvbnRyb2xDb25maWcuYXBwTW9kdWxlSWRcclxuICAgICAgICAgICYmIHAucmVzb3VyY2UgPT09IHJlc291cmNlXHJcbiAgICAgICAgICAmJiAoIXJvbGVJZCB8fCBwLnJvbGVJZCA9PT0gcm9sZUlkKVxyXG4gICAgICAgICAgJiYgKHAuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCA9PT0gJ04vQScgfHxcclxuICAgICAgICBwLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPT09IGFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQpXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAocGVybWlzc2lvbikge1xyXG4gICAgICBpZiAoYWNjZXNzVHlwZSA9PT0gJ3JlYWQnKSB7XHJcbiAgICAgICAgaWYgKCFwZXJtaXNzaW9uLnJlYWRGbGFnKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2NyZWF0ZScgJiYgIXBlcm1pc3Npb24uY3JlYXRlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ3VwZGF0ZScgJiYgIXBlcm1pc3Npb24udXBkYXRlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2RlbGV0ZScgJiYgIXBlcm1pc3Npb24uZGVsZXRlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2Fzc2lnbicgJiYgIXBlcm1pc3Npb24uYXNzaWduRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2Nsb3NlJyAmJiAhcGVybWlzc2lvbi5jbG9zZUZsYWcpIHx8XHJcbiAgICAgICAgKGFjY2Vzc1R5cGUgPT09ICdleHB1bmdlJyAmJiAhcGVybWlzc2lvbi5leHB1bmdlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ3Jlb3BlbicgJiYgIXBlcm1pc3Npb24ucmVvcGVuRmxhZylcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoYWNjZXNzVHlwZSA9PT0gJ3JlYWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FuQXBwRmVhdHVyZUFjdGl2YXRlKFxyXG4gICAgbG9naW5TdGFmZjogTG9naW5TdGFmZixcclxuICAgIGZlYXR1cmU6IHN0cmluZyxcclxuICAgIGFwcE1vZHVsZUlkID0gbnVsbCxcclxuICApIHtcclxuICAgIC8vIGlmICghdGhpcy5pc0F1dGhFbmFibGUobG9naW5TdGFmZi5yb2xlcywgYXBwTW9kdWxlSWQpKSB7XHJcbiAgICAvLyAgIHJldHVybiB0cnVlO1xyXG4gICAgLy8gfVxyXG4gICAgcmV0dXJuIHRoaXMuaGFzQXBwRmVhdHVyZVBlcm1pc3Npb24oXHJcbiAgICAgIGxvZ2luU3RhZmYucGVybWlzc2lvbnMsXHJcbiAgICAgIGZlYXR1cmUsXHJcbiAgICAgIGFwcE1vZHVsZUlkLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyBpc0F1dGhFbmFibGUocm9sZXM6IFJvbGVbXSwgYXBwTW9kdWxlSWQ6IHN0cmluZykge1xyXG4gIC8vICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcclxuICAvLyAgICAgcmV0dXJuIHJvbGVzLm1hcChyID0+IHIucm9sZUlkKS5maW5kSW5kZXgodGhpcy5pc0V4dGVybmFsUm9sZSkgPiAtMSB8fCBhcHBNb2R1bGVJZCA9PT0gJ1JSJztcclxuICAvLyAgIH1cclxuICAvLyAgIHJldHVybiBmYWxzZTtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBoYXNJbnRha2VSb2xlKHJvbGVzOiBSb2xlW10pIHtcclxuICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiByb2xlcy5maW5kSW5kZXgodGhpcy5pc0ludGFrZVJvbGUpID4gLTE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc0FwcEZlYXR1cmVQZXJtaXNzaW9uKFxyXG4gICAgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXSxcclxuICAgIGZlYXR1cmU6IHN0cmluZyxcclxuICAgIGFwcE1vZHVsZUlkOiBzdHJpbmcsXHJcbiAgKSB7XHJcbiAgICBpZiAocGVybWlzc2lvbnMgJiYgcGVybWlzc2lvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBpZiAoYXBwTW9kdWxlSWQpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgcGVybWlzc2lvbnMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAocCkgPT4gcC5yZXNvdXJjZSA9PT0gZmVhdHVyZSAmJiBwLmFwcE1vZHVsZUlkID09PSBhcHBNb2R1bGVJZCxcclxuICAgICAgICAgICkgPiAtMVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zLmZpbmRJbmRleCgocCkgPT4gcC5yZXNvdXJjZSA9PT0gZmVhdHVyZSkgPiAtMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNFeHRlcm5hbFJvbGUocm9sZUlkKSB7XHJcbiAgICBzd2l0Y2ggKHJvbGVJZCkge1xyXG4gICAgICBjYXNlICdFVURUTCc6XHJcbiAgICAgIGNhc2UgJ0VVRFVTTSc6XHJcbiAgICAgIGNhc2UgJ0VVSkRHJzpcclxuICAgICAgY2FzZSAnRVVNUEQnOlxyXG4gICAgICBjYXNlICdFVVNPVFYnOlxyXG4gICAgICBjYXNlICdFVVVTQTInOlxyXG4gICAgICBjYXNlICdFVVVTQU8nOlxyXG4gICAgICBjYXNlICdFVVVTUEMnOlxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNJbnRha2VSb2xlKHJvbGU6IFJvbGUpIHtcclxuICAgIHN3aXRjaCAocm9sZS5yb2xlSWQpIHtcclxuICAgICAgY2FzZSAnT1BBJzpcclxuICAgICAgY2FzZSAnT1BTJzpcclxuICAgICAgY2FzZSAnU09QUyc6XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkaXNhYmxlSHRtbEVsZW1lbnQoZWxlbWVudDogRWxlbWVudCk6IHZvaWQge1xyXG4gICAgLy8gY29uc29sZS5sb2coZWxlbWVudCk7XHJcbiAgICBzd2l0Y2ggKGVsZW1lbnQubm9kZU5hbWUpIHtcclxuICAgICAgY2FzZSAnQSc6XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXHJcbiAgICAgICAgICAnc3R5bGUnLFxyXG4gICAgICAgICAgJ3BvaW50ZXItZXZlbnRzOiBub25lO2N1cnNvcjogbm90LWFsbG93ZWQ7JyxcclxuICAgICAgICApO1xyXG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsICctMScpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoaWRlSHRtbEVsZW1lbnQoZWxlbWVudDogRWxlbWVudCk6IHZvaWQge1xyXG4gICAgLy8gZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICdoaWRkZW4nKTtcclxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsICdkaXNwbGF5OiBub25lOycpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTdGFmZih1c2VyTmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxMb2dpblN0YWZmPiB7XHJcbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IGBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGZpbmR2U3RhZmZzKGlucHV0OiB7d2hlcmU6IHt1c2VyTmFtZTogXCIke3VzZXJOYW1lfVwiLCBhY3RpdmVGbGFnOiB0cnVlfX0pIHtcclxuICAgICAgICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2VcclxuICAgICAgICAgICAgICAgIGRhdGEge1xyXG4gICAgICAgICAgICAgICAgICBzdGFmZklkXHJcbiAgICAgICAgICAgICAgICAgIHVzZXJOYW1lXHJcbiAgICAgICAgICAgICAgICAgIGxhc3ROYW1lXHJcbiAgICAgICAgICAgICAgICAgIGZpcnN0TmFtZVxyXG4gICAgICAgICAgICAgICAgICBwaG9uZVxyXG4gICAgICAgICAgICAgICAgICBlbWFpbFxyXG4gICAgICAgICAgICAgICAgICByb2xlcyB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9sZUlkXHJcbiAgICAgICAgICAgICAgICAgICAgcm9sZVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zIHtcclxuICAgICAgICAgICAgICAgICAgICByb2xlSWRcclxuICAgICAgICAgICAgICAgICAgICBhcHBNb2R1bGVJZFxyXG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlXHJcbiAgICAgICAgICAgICAgICAgICAgYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZFxyXG4gICAgICAgICAgICAgICAgICAgIHJlYWRGbGFnXHJcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlRmxhZ1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZsYWdcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGVGbGFnXHJcbiAgICAgICAgICAgICAgICAgICAgYXNzaWduRmxhZ1xyXG4gICAgICAgICAgICAgICAgICAgIHJlb3BlbkZsYWdcclxuICAgICAgICAgICAgICAgICAgICBjbG9zZUZsYWdcclxuICAgICAgICAgICAgICAgICAgICBleHB1bmdlRmxhZ1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIG9wdGlvbnMge1xyXG4gICAgICAgICAgICAgICAgICAgIG9mZmVuZGVyTGlzdE9wdGlvbklkXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZVxyXG4gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VBcGlGaWVsZE5hbWVcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZsYWdcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWA7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAucG9zdDxhbnk+KHRoaXMuc21hcnREYXRhU2VydmljZVVybCwgeyBxdWVyeTogcXVlcnlTdHJpbmcgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICBtYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnIyMjIyMgZ2V0U3RhZmYoKSBmcm9tIHNlcnZpY2UgJywgcmVzdWx0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChyZXN1bHQuZGF0YS5maW5kdlN0YWZmcy5kYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHJlc3VsdC5kYXRhLmZpbmR2U3RhZmZzLmRhdGFbMF07XHJcbiAgICAgICAgICAgIHRoaXMueGRtU2VydmljZS5zZXRMb2dpblN0YWZmKGRhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2luU3RhZmYgPSBkYXRhO1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAvLyByZXR1cm4gdGhyb3dFcnJvcignTm8gYWNjZXNzIHJpZ2h0LicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IgJyArIGVycm9yKTtcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTdGFmZk9mZmVuZGVyUmVsYXRpb24oXHJcbiAgICBzdGFmZklkOiBudW1iZXIsXHJcbiAgICBvZmZlbmRlcklkOiBudW1iZXIsXHJcbiAgKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gYFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgZmluZHZTdGFmZk9mZmVuZGVyUmVsYXRpb25zKGlucHV0OiB7d2hlcmU6IHtzdGFmZklkOiAke3N0YWZmSWR9LCBvZmZlbmRlcklkOiAke29mZmVuZGVySWR9fX0pIHtcclxuICAgICAgICAgICAgICAgIGRhdGEge1xyXG4gICAgICAgICAgICAgICAgICBhc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9YDtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwXHJcbiAgICAgIC5wb3N0PGFueT4odGhpcy5zbWFydERhdGFTZXJ2aWNlVXJsLCB7IHF1ZXJ5OiBxdWVyeVN0cmluZyB9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgIG1hcCgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICcjIyMjIyBnZXRTdGFmZk9mZmVuZGVyUmVsYXRpb24oKSBmcm9tIHNlcnZpY2UgJyxcclxuICAgICAgICAgICAgICByZXN1bHQsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocmVzdWx0LmRhdGEuZmluZHZTdGFmZk9mZmVuZGVyUmVsYXRpb25zLmRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gcmVzdWx0LmRhdGEuZmluZHZTdGFmZk9mZmVuZGVyUmVsYXRpb25zLmRhdGFbMF07XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQ7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgLy8gcmV0dXJuIHRocm93RXJyb3IoJ05vIGFjY2VzcyByaWdodC4nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yICcgKyBlcnJvcik7XHJcbiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Um9sZVBlcm1pc3Npb25zKFxyXG4gICAgYXBwTW9kdWxlSWQ6IHN0cmluZyxcclxuICAgIHJlc291cmNlOiBzdHJpbmcsXHJcbiAgKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IGBcclxuICAgICAgICAgICBxdWVyeSBmaW5kdlJvbGVQZXJtaXNzaW9uUGl2b3Rze1xyXG4gICAgICAgICAgICBmaW5kdlJvbGVQZXJtaXNzaW9uUGl2b3RzKGlucHV0OiB7d2hlcmU6IHthcHBNb2R1bGVJZDogJHthcHBNb2R1bGVJZH0sIHJlc291cmNlOiAke3Jlc291cmNlfX19KXtcclxuICAgICAgICAgICAgICB0b3RhbENvdW50XHJcbiAgICAgICAgICAgICAgbWVzc2FnZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9YDtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwXHJcbiAgICAgIC5wb3N0PGFueT4odGhpcy5zbWFydERhdGFTZXJ2aWNlVXJsLCB7IHF1ZXJ5OiBxdWVyeVN0cmluZyB9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgIG1hcCgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICcjIyMjIyBmaW5kdlJvbGVQZXJtaXNzaW9uUGl2b3RzKCkgZnJvbSBzZXJ2aWNlICcsXHJcbiAgICAgICAgICAgICAgcmVzdWx0LFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHJlc3VsdC5kYXRhLmZpbmR2Um9sZVBlcm1pc3Npb25QaXZvdHMudG90YWxDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIC8vIHJldHVybiB0aHJvd0Vycm9yKCdObyBhY2Nlc3MgcmlnaHQuJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yICcgKyBlcnJvcik7XHJcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|