ssi-security-commons 0.19.0 → 0.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,438 @@
1
+ /* eslint-disable max-lines-per-function */
2
+ /* eslint-disable arrow-body-style */
3
+ /* eslint-disable @typescript-eslint/naming-convention */
4
+ import { Inject, Injectable } from '@angular/core';
5
+ import { HttpHeaders } from '@angular/common/http';
6
+ import { map } from 'rxjs/operators';
7
+ import { REFRESH_TOKEN, TOKEN, USERDATA } from '../shared/constants';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/common/http";
10
+ import * as i2 from "./crypto.service";
11
+ import * as i3 from "./jwt.service";
12
+ export class SessionService {
13
+ constructor(http, environment, cryptoService, jwtService) {
14
+ this.http = http;
15
+ this.cryptoService = cryptoService;
16
+ this.jwtService = jwtService;
17
+ this.loginUrl = 'http://localhost:4200/login';
18
+ this.endPoint = environment.endPointCore;
19
+ this.applicationId = environment.applicationId;
20
+ this.environment = environment;
21
+ }
22
+ buildUserdataFromToken(token) {
23
+ const tokenData = this.jwtService.decodeToken(token);
24
+ const userData = {
25
+ givenName: tokenData.given_name,
26
+ familyName: tokenData.family_name,
27
+ name: tokenData.name,
28
+ roles: tokenData.realm_access.roles,
29
+ userId: tokenData.sub,
30
+ username: tokenData.preferred_username,
31
+ email: tokenData.email,
32
+ emailVerified: tokenData.email_verified,
33
+ countryCode: tokenData.country_code
34
+ };
35
+ return userData;
36
+ }
37
+ async reviewSessionData() {
38
+ const value = await this.checkSessionData();
39
+ console.log(`async result: ${value}`);
40
+ return value;
41
+ }
42
+ setUserdata(userdata) {
43
+ this.userdata = userdata;
44
+ }
45
+ setTokens(token, refreshToken) {
46
+ this.token = token;
47
+ this.refreshToken = refreshToken;
48
+ }
49
+ getUserdata() {
50
+ return this.userdata;
51
+ }
52
+ setRefreshToken(refreshToken) {
53
+ this.refreshToken = refreshToken;
54
+ this.saveStorageData(REFRESH_TOKEN, refreshToken);
55
+ }
56
+ getRefreshToken() {
57
+ return this.refreshToken;
58
+ }
59
+ setToken(token) {
60
+ this.token = token;
61
+ this.saveStorageData(TOKEN, token);
62
+ }
63
+ getToken() {
64
+ return this.token;
65
+ }
66
+ destroyCredentials() {
67
+ this.token = undefined;
68
+ this.refreshToken = undefined;
69
+ this.deleteStorageData(TOKEN);
70
+ this.deleteStorageData(REFRESH_TOKEN);
71
+ }
72
+ destroyUserData() {
73
+ this.userdata = undefined;
74
+ this.deleteStorageData(USERDATA);
75
+ }
76
+ saveCredentials(token, refreshToken) {
77
+ this.token = token;
78
+ this.refreshToken = refreshToken;
79
+ this.saveStorageData(TOKEN, token);
80
+ this.saveStorageData(REFRESH_TOKEN, refreshToken);
81
+ this.saveUserData(this.buildUserdataFromToken(token));
82
+ }
83
+ saveUserData(userData) {
84
+ this.userdata = userData;
85
+ this.saveStorageData(USERDATA, JSON.stringify(userData));
86
+ }
87
+ isLoggedIn() {
88
+ return !!this.userdata;
89
+ }
90
+ logout() {
91
+ let clientId = this.environment.authClient;
92
+ if (this.refreshToken) {
93
+ const decoded = this.jwtService.decodeToken(this.refreshToken);
94
+ clientId = decoded.azp;
95
+ }
96
+ return new Promise((resolve, reject) => {
97
+ this.logoutApiClient(clientId).subscribe(res => {
98
+ console.log(res);
99
+ this.destroyCredentials();
100
+ this.destroyUserData();
101
+ this.goToLogin();
102
+ resolve(null);
103
+ }, (err) => {
104
+ this.destroyCredentials();
105
+ this.destroyUserData();
106
+ console.error(err);
107
+ reject(err);
108
+ });
109
+ });
110
+ }
111
+ getNewToken(refreshToken) {
112
+ console.log('getNewToken');
113
+ const body = 'grant_type=refresh_token' + '&refresh_token=' + refreshToken + '&client_id=' + this.environment.authClient;
114
+ const headers = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded');
115
+ return this.http.post(`${this.environment.authEndPoint}/realms/${this.environment.authRealm}/protocol/openid-connect/token`, body, { headers })
116
+ .pipe(map(res => res));
117
+ }
118
+ getNewTokenClient(refreshToken, clientId) {
119
+ console.log('getNewToken');
120
+ const body = 'grant_type=refresh_token' + '&refresh_token=' + refreshToken + '&client_id=' + clientId;
121
+ const headers = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded');
122
+ return this.http.post(`${this.environment.authEndPoint}/realms/${this.environment.authRealm}/protocol/openid-connect/token`, body, { headers })
123
+ .pipe(map(res => res));
124
+ }
125
+ getTokenClientCode(refreshToken, clientId) {
126
+ console.log('getNewToken');
127
+ const body = 'grant_type=refresh_token' + '&refresh_token=' + refreshToken + '&client_id=' + clientId;
128
+ const headers = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded');
129
+ return this.http.post(`${this.environment.authEndPoint}/realms/${this.environment.authRealm}/protocol/openid-connect/token`, body, { headers })
130
+ .pipe(map(res => res));
131
+ }
132
+ getLoginUrl() {
133
+ return this.http.get(this.endPoint + '/auth/login/url/' + this.environment.authClient)
134
+ .pipe(map(res => res));
135
+ }
136
+ getHomeUrl() {
137
+ return this.http.get(this.endPoint + '/auth/home/url/' + this.environment.authClient)
138
+ .pipe(map(res => res));
139
+ }
140
+ logoutApi() {
141
+ const body = 'refresh_token=' + this.refreshToken + '&client_id=' + this.environment.authClient;
142
+ const headers = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded');
143
+ return this.http.post(`${this.environment.authEndPoint}/realms/${this.environment.authRealm}/protocol/openid-connect/logout`, body, { headers })
144
+ .pipe(map(res => res));
145
+ }
146
+ logoutApiClient(clientId) {
147
+ const body = 'refresh_token=' + this.refreshToken + '&client_id=' + clientId;
148
+ const headers = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded');
149
+ return this.http.post(`${this.environment.authEndPoint}/realms/${this.environment.authRealm}/protocol/openid-connect/logout`, body, { headers })
150
+ .pipe(map(res => res));
151
+ }
152
+ goToLogin() {
153
+ this.getLoginUrl().subscribe(res => {
154
+ console.log(res);
155
+ const loginUrl = res.data;
156
+ window.location.href = loginUrl;
157
+ }, (err) => {
158
+ console.error(err);
159
+ });
160
+ }
161
+ loadSessionData() {
162
+ let data;
163
+ let token;
164
+ let refreshToken;
165
+ if (this.environment.production) {
166
+ const u = this.cryptoService.encrypt(USERDATA);
167
+ const t = this.cryptoService.encrypt(TOKEN);
168
+ const r = this.cryptoService.encrypt(REFRESH_TOKEN);
169
+ data = window.localStorage.getItem(u);
170
+ token = window.localStorage.getItem(t);
171
+ refreshToken = window.localStorage.getItem(r);
172
+ if (data && token && refreshToken) {
173
+ data = this.cryptoService.decrypt(data);
174
+ token = this.cryptoService.decrypt(token);
175
+ refreshToken = this.cryptoService.decrypt(refreshToken);
176
+ }
177
+ }
178
+ else {
179
+ data = window.localStorage.getItem(USERDATA);
180
+ token = window.localStorage.getItem(TOKEN);
181
+ refreshToken = window.localStorage.getItem(REFRESH_TOKEN);
182
+ }
183
+ if (data && token && refreshToken) {
184
+ const user = JSON.parse(data);
185
+ this.setTokens(token, refreshToken);
186
+ this.setUserdata(user);
187
+ }
188
+ }
189
+ userHasOptionsInApp(userId, applicationId) {
190
+ return this.http.get(this.endPoint + `/security/option/${applicationId}/${userId}`)
191
+ .pipe(map(res => res));
192
+ }
193
+ checkAppPermissions() {
194
+ const promise = new Promise((resolve, reject) => {
195
+ console.log(this.userdata?.userId, this.applicationId);
196
+ if (this.applicationId) {
197
+ this.userHasOptionsInApp(this.userdata?.userId, this.applicationId).subscribe(res => {
198
+ console.log(res);
199
+ if (res.data) {
200
+ resolve('ok');
201
+ }
202
+ else {
203
+ this.getHomeUrl().subscribe(res1 => {
204
+ console.log(res1);
205
+ const homeUrl = res1.data;
206
+ window.location.href = homeUrl;
207
+ reject('nok');
208
+ }, (err) => {
209
+ console.error(err);
210
+ reject('nok');
211
+ });
212
+ }
213
+ }, (err) => {
214
+ console.error(err);
215
+ reject('nok');
216
+ });
217
+ }
218
+ else {
219
+ resolve('ok');
220
+ }
221
+ });
222
+ return promise;
223
+ }
224
+ // eslint-disable-next-line max-len
225
+ getOptionsUser(applicationId, type, language, entityCode, parentOptionId, includeData) {
226
+ const param = {
227
+ userId: this.userdata?.userId,
228
+ applicationId,
229
+ type,
230
+ language,
231
+ entityCode,
232
+ parentOptionId,
233
+ includeData
234
+ };
235
+ return this.http.post(this.endPoint + '/security/option/user', param)
236
+ .pipe(map(res => res));
237
+ }
238
+ registerException(param) {
239
+ const headers = new HttpHeaders().set('skipError', 'true');
240
+ return this.http.post(this.endPoint + '/auth/exception/log', param, { headers })
241
+ .pipe(map(res => res));
242
+ }
243
+ saveStorageData(key, value) {
244
+ if (this.environment.production) {
245
+ const k = this.cryptoService.encrypt(key);
246
+ const v = this.cryptoService.encrypt(value);
247
+ window.localStorage.setItem(k, v);
248
+ }
249
+ else {
250
+ window.localStorage.setItem(key, value);
251
+ }
252
+ }
253
+ deleteStorageData(key) {
254
+ if (this.environment.production) {
255
+ const k = this.cryptoService.encrypt(key);
256
+ window.localStorage.removeItem(k);
257
+ }
258
+ else {
259
+ window.localStorage.removeItem(key);
260
+ }
261
+ }
262
+ getStorageData(key) {
263
+ let res;
264
+ if (this.environment.production) {
265
+ const k = this.cryptoService.encrypt(key);
266
+ const v = window.localStorage.getItem(k);
267
+ if (v) {
268
+ res = this.cryptoService.decrypt(v);
269
+ return res;
270
+ }
271
+ else {
272
+ res = null;
273
+ }
274
+ }
275
+ else {
276
+ res = window.localStorage.getItem(key);
277
+ }
278
+ return res;
279
+ }
280
+ removeUrlData() {
281
+ const url = new URL(window.location.href);
282
+ const queryParams = url.searchParams;
283
+ queryParams.delete('code');
284
+ const newUrl = url.origin + url.pathname + '?' + queryParams.toString();
285
+ window.history.replaceState({}, document.title, newUrl);
286
+ }
287
+ checkSessionData() {
288
+ const promise = new Promise((resolve, reject) => {
289
+ let data;
290
+ let token;
291
+ let refreshToken;
292
+ const currentUrl = new URL(window.location.href);
293
+ const code = currentUrl.searchParams.get('code');
294
+ console.log('code', code);
295
+ if (code) {
296
+ const codeDecoded = this.getDecodedAuthCode(code);
297
+ // console.log('code', codeDecoded);
298
+ const decoded = this.jwtService.decodeToken(codeDecoded);
299
+ this.getTokenClientCode(codeDecoded, decoded.azp).subscribe({
300
+ next: (res) => {
301
+ console.log(res);
302
+ token = res.access_token;
303
+ refreshToken = res.refresh_token;
304
+ this.saveCredentials(token, refreshToken);
305
+ this.checkAppPermissions().then((res1) => {
306
+ console.log(res1);
307
+ this.removeUrlData();
308
+ resolve('OK');
309
+ }, (err) => {
310
+ console.error(err);
311
+ reject(err);
312
+ });
313
+ },
314
+ error: (err) => {
315
+ console.error(err);
316
+ reject(err);
317
+ }
318
+ });
319
+ }
320
+ else {
321
+ data = this.getStorageData(USERDATA);
322
+ token = this.getStorageData(TOKEN);
323
+ refreshToken = this.getStorageData(REFRESH_TOKEN);
324
+ if (data && token && refreshToken) {
325
+ this.saveCredentials(token, refreshToken);
326
+ this.checkAppPermissions().then((res1) => {
327
+ console.log(res1);
328
+ resolve('OK');
329
+ }, (err) => {
330
+ console.error(err);
331
+ reject(err);
332
+ });
333
+ }
334
+ else {
335
+ const url = window.location.href;
336
+ if (url.indexOf('/redirect') > -1) {
337
+ resolve('OK');
338
+ }
339
+ else {
340
+ this.destroyCredentials();
341
+ this.destroyUserData();
342
+ this.getLoginUrl().subscribe(res1 => {
343
+ console.log(res1);
344
+ this.loginUrl = res1.data;
345
+ if (url.indexOf('/login') < 0 && url.indexOf('/forgot') < 0 &&
346
+ url.indexOf('/reset') < 0 && url.indexOf('/verify') < 0 &&
347
+ url.indexOf('/sign_up') < 0) {
348
+ window.location.href = this.loginUrl + '?continue=' + encodeURIComponent(url);
349
+ }
350
+ resolve('NOK');
351
+ }, (err) => {
352
+ console.error(err);
353
+ reject(err);
354
+ });
355
+ }
356
+ }
357
+ }
358
+ });
359
+ return promise;
360
+ }
361
+ checkSessionDataMicrofront() {
362
+ const promise = new Promise((resolve, reject) => {
363
+ let data;
364
+ let token;
365
+ let refreshToken;
366
+ if (this.environment.production) {
367
+ const u = this.cryptoService.encrypt(USERDATA);
368
+ const t = this.cryptoService.encrypt(TOKEN);
369
+ const r = this.cryptoService.encrypt(REFRESH_TOKEN);
370
+ const d1 = window.localStorage.getItem(u);
371
+ const d2 = window.localStorage.getItem(t);
372
+ const d3 = window.localStorage.getItem(r);
373
+ if (d1 && d2 && d3) {
374
+ data = this.cryptoService.decrypt(d1);
375
+ token = this.cryptoService.decrypt(d2);
376
+ refreshToken = this.cryptoService.decrypt(d3);
377
+ }
378
+ }
379
+ else {
380
+ data = window.localStorage.getItem(USERDATA);
381
+ token = window.localStorage.getItem(TOKEN);
382
+ refreshToken = window.localStorage.getItem(REFRESH_TOKEN);
383
+ }
384
+ if (data && token && refreshToken) {
385
+ console.log('local session ok');
386
+ this.saveCredentials(token, refreshToken);
387
+ resolve('OK');
388
+ }
389
+ else {
390
+ console.error('local session nok');
391
+ reject('NOK');
392
+ }
393
+ });
394
+ return promise;
395
+ }
396
+ getAuthCode() {
397
+ const enc = this.cryptoService.encrypt(this.refreshToken ? this.refreshToken : '');
398
+ return encodeURIComponent(enc);
399
+ }
400
+ getDecodedAuthCode(code) {
401
+ const dec = decodeURIComponent(code);
402
+ return this.cryptoService.decrypt(dec);
403
+ }
404
+ refreshSession() {
405
+ const promise = new Promise((resolve, reject) => {
406
+ const refreshToken = this.getRefreshToken();
407
+ if (refreshToken) {
408
+ const decoded = this.jwtService.decodeToken(refreshToken);
409
+ this.getNewTokenClient(refreshToken, decoded.azp).subscribe({
410
+ next: (res) => {
411
+ console.log(res);
412
+ this.setToken(res.access_token);
413
+ this.setRefreshToken(res.refresh_token);
414
+ this.saveCredentials(res.access_token, res.refresh_token);
415
+ resolve('OK');
416
+ },
417
+ error: (err) => {
418
+ console.error(err);
419
+ reject(err);
420
+ }
421
+ });
422
+ }
423
+ else {
424
+ reject('NOK');
425
+ }
426
+ });
427
+ return promise;
428
+ }
429
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.3", ngImport: i0, type: SessionService, deps: [{ token: i1.HttpClient }, { token: 'environment' }, { token: i2.CryptoService }, { token: i3.JwtService }], target: i0.ɵɵFactoryTarget.Injectable }); }
430
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.3", ngImport: i0, type: SessionService }); }
431
+ }
432
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.3", ngImport: i0, type: SessionService, decorators: [{
433
+ type: Injectable
434
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
435
+ type: Inject,
436
+ args: ['environment']
437
+ }] }, { type: i2.CryptoService }, { type: i3.JwtService }]; } });
438
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3NpLXNlY3VyaXR5LWNvbW1vbnMvc3JjL2xpYi9zZXJ2aWNlcy9zZXNzaW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMkNBQTJDO0FBQzNDLHFDQUFxQztBQUNyQyx5REFBeUQ7QUFDekQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFjLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRy9ELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdyQyxPQUFPLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7QUFJckUsTUFBTSxPQUFPLGNBQWM7SUFVekIsWUFBb0IsSUFBZ0IsRUFDWCxXQUFnQixFQUNyQixhQUE0QixFQUM1QixVQUFzQjtRQUh0QixTQUFJLEdBQUosSUFBSSxDQUFZO1FBRWhCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFQMUMsYUFBUSxHQUFHLDZCQUE2QixDQUFDO1FBUXZDLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQztRQUN6QyxJQUFJLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUM7UUFDL0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVNLHNCQUFzQixDQUFDLEtBQWE7UUFDekMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsTUFBTSxRQUFRLEdBQWE7WUFDekIsU0FBUyxFQUFFLFNBQVMsQ0FBQyxVQUFVO1lBQy9CLFVBQVUsRUFBRSxTQUFTLENB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USxFQUFFLEVBQUU7d0JBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO3dCQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQzt3QkFDeEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQzt3QkFDMUQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoQixDQUFDO29CQUNELEtBQUssRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO3dCQUNsQixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNuQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2QsQ0FBQztpQkFDRixDQUFDLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDZjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzs4R0F4ZFUsY0FBYyw0Q0FXZixhQUFhO2tIQVhaLGNBQWM7OzJGQUFkLGNBQWM7a0JBRDFCLFVBQVU7OzBCQVlOLE1BQU07MkJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG1heC1saW5lcy1wZXItZnVuY3Rpb24gKi9cbi8qIGVzbGludC1kaXNhYmxlIGFycm93LWJvZHktc3R5bGUgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEZyb250RW5kRXhjZXB0aW9uLCBVc2VyRGF0YSB9IGZyb20gJy4uL3VzZXIubW9kZWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSnd0U2VydmljZSB9IGZyb20gJy4vand0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSB9IGZyb20gJy4vY3J5cHRvLnNlcnZpY2UnO1xuaW1wb3J0IHsgUkVGUkVTSF9UT0tFTiwgVE9LRU4sIFVTRVJEQVRBIH0gZnJvbSAnLi4vc2hhcmVkL2NvbnN0YW50cyc7XG5cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNlc3Npb25TZXJ2aWNlIHtcblxuICB1c2VyZGF0YTogVXNlckRhdGEgfCB1bmRlZmluZWQ7XG4gIHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHJlZnJlc2hUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBlbmRQb2ludDogc3RyaW5nO1xuICBsb2dpblVybCA9ICdodHRwOi8vbG9jYWxob3N0OjQyMDAvbG9naW4nO1xuICBhcHBsaWNhdGlvbklkOiBhbnk7XG4gIGVudmlyb25tZW50OiBhbnk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIEBJbmplY3QoJ2Vudmlyb25tZW50JykgZW52aXJvbm1lbnQ6IGFueSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjcnlwdG9TZXJ2aWNlOiBDcnlwdG9TZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGp3dFNlcnZpY2U6IEp3dFNlcnZpY2UpIHtcbiAgICB0aGlzLmVuZFBvaW50ID0gZW52aXJvbm1lbnQuZW5kUG9pbnRDb3JlO1xuICAgIHRoaXMuYXBwbGljYXRpb25JZCA9IGVudmlyb25tZW50LmFwcGxpY2F0aW9uSWQ7XG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50O1xuICB9XG5cbiAgcHVibGljIGJ1aWxkVXNlcmRhdGFGcm9tVG9rZW4odG9rZW46IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3QgdG9rZW5EYXRhID0gdGhpcy5qd3RTZXJ2aWNlLmRlY29kZVRva2VuKHRva2VuKTtcbiAgICBjb25zdCB1c2VyRGF0YTogVXNlckRhdGEgPSB7XG4gICAgICBnaXZlbk5hbWU6IHRva2VuRGF0YS5naXZlbl9uYW1lLFxuICAgICAgZmFtaWx5TmFtZTogdG9rZW5EYXRhLmZhbWlseV9uYW1lLFxuICAgICAgbmFtZTogdG9rZW5EYXRhLm5hbWUsXG4gICAgICByb2xlczogdG9rZW5EYXRhLnJlYWxtX2FjY2Vzcy5yb2xlcyxcbiAgICAgIHVzZXJJZDogdG9rZW5EYXRhLnN1YixcbiAgICAgIHVzZXJuYW1lOiB0b2tlbkRhdGEucHJlZmVycmVkX3VzZXJuYW1lLFxuICAgICAgZW1haWw6IHRva2VuRGF0YS5lbWFpbCxcbiAgICAgIGVtYWlsVmVyaWZpZWQ6IHRva2VuRGF0YS5lbWFpbF92ZXJpZmllZCxcbiAgICAgIGNvdW50cnlDb2RlOiB0b2tlbkRhdGEuY291bnRyeV9jb2RlXG4gICAgfTtcbiAgICByZXR1cm4gdXNlckRhdGE7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmV2aWV3U2Vzc2lvbkRhdGEoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuY2hlY2tTZXNzaW9uRGF0YSgpIGFzIGFueTtcbiAgICBjb25zb2xlLmxvZyhgYXN5bmMgcmVzdWx0OiAke3ZhbHVlfWApO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRVc2VyZGF0YSh1c2VyZGF0YTogYW55KTogdm9pZCB7XG4gICAgdGhpcy51c2VyZGF0YSA9IHVzZXJkYXRhO1xuICB9XG5cbiAgcHVibGljIHNldFRva2Vucyh0b2tlbjogYW55LCByZWZyZXNoVG9rZW46IGFueSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICB0aGlzLnJlZnJlc2hUb2tlbiA9IHJlZnJlc2hUb2tlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVc2VyZGF0YSgpOiBVc2VyRGF0YSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudXNlcmRhdGE7XG4gIH1cblxuICBwdWJsaWMgc2V0UmVmcmVzaFRva2VuKHJlZnJlc2hUb2tlbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5yZWZyZXNoVG9rZW4gPSByZWZyZXNoVG9rZW47XG4gICAgdGhpcy5zYXZlU3RvcmFnZURhdGEoUkVGUkVTSF9UT0tFTiwgcmVmcmVzaFRva2VuKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZWZyZXNoVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZWZyZXNoVG9rZW47XG4gIH1cblxuICBwdWJsaWMgc2V0VG9rZW4odG9rZW46IGFueSk6IGFueSB7XG4gICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgIHRoaXMuc2F2ZVN0b3JhZ2VEYXRhKFRPS0VOLCB0b2tlbik7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9rZW4oKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy50b2tlbjtcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95Q3JlZGVudGlhbHMoKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlZnJlc2hUb2tlbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRlbGV0ZVN0b3JhZ2VEYXRhKFRPS0VOKTtcbiAgICB0aGlzLmRlbGV0ZVN0b3JhZ2VEYXRhKFJFRlJFU0hfVE9LRU4pO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3lVc2VyRGF0YSgpOiB2b2lkIHtcbiAgICB0aGlzLnVzZXJkYXRhID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZGVsZXRlU3RvcmFnZURhdGEoVVNFUkRBVEEpO1xuICB9XG5cbiAgcHVibGljIHNhdmVDcmVkZW50aWFscyh0b2tlbjogYW55LCByZWZyZXNoVG9rZW46IGFueSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICB0aGlzLnJlZnJlc2hUb2tlbiA9IHJlZnJlc2hUb2tlbjtcbiAgICB0aGlzLnNhdmVTdG9yYWdlRGF0YShUT0tFTiwgdG9rZW4pO1xuICAgIHRoaXMuc2F2ZVN0b3JhZ2VEYXRhKFJFRlJFU0hfVE9LRU4sIHJlZnJlc2hUb2tlbik7XG4gICAgdGhpcy5zYXZlVXNlckRhdGEodGhpcy5idWlsZFVzZXJkYXRhRnJvbVRva2VuKHRva2VuKSk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZVVzZXJEYXRhKHVzZXJEYXRhOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnVzZXJkYXRhID0gdXNlckRhdGE7XG4gICAgdGhpcy5zYXZlU3RvcmFnZURhdGEoVVNFUkRBVEEsIEpTT04uc3RyaW5naWZ5KHVzZXJEYXRhKSk7XG4gIH1cblxuICBwdWJsaWMgaXNMb2dnZWRJbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnVzZXJkYXRhO1xuICB9XG5cbiAgbG9nb3V0KCk6IFByb21pc2U8YW55PiB7XG4gICAgbGV0IGNsaWVudElkID0gdGhpcy5lbnZpcm9ubWVudC5hdXRoQ2xpZW50O1xuICAgIGlmICh0aGlzLnJlZnJlc2hUb2tlbikge1xuICAgICAgY29uc3QgZGVjb2RlZCA9IHRoaXMuand0U2VydmljZS5kZWNvZGVUb2tlbih0aGlzLnJlZnJlc2hUb2tlbik7XG4gICAgICBjbGllbnRJZCA9IGRlY29kZWQuYXpwO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5sb2dvdXRBcGlDbGllbnQoY2xpZW50SWQpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhyZXMpO1xuICAgICAgICB0aGlzLmRlc3Ryb3lDcmVkZW50aWFscygpO1xuICAgICAgICB0aGlzLmRlc3Ryb3lVc2VyRGF0YSgpO1xuICAgICAgICB0aGlzLmdvVG9Mb2dpbigpO1xuICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICB0aGlzLmRlc3Ryb3lDcmVkZW50aWFscygpO1xuICAgICAgICB0aGlzLmRlc3Ryb3lVc2VyRGF0YSgpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXROZXdUb2tlbihyZWZyZXNoVG9rZW46IHN0cmluZyk6IGFueSB7XG4gICAgY29uc29sZS5sb2coJ2dldE5ld1Rva2VuJyk7XG4gICAgY29uc3QgYm9keSA9ICdncmFudF90eXBlPXJlZnJlc2hfdG9rZW4nICsgJyZyZWZyZXNoX3Rva2VuPScgKyByZWZyZXNoVG9rZW4gKyAnJmNsaWVudF9pZD0nICsgdGhpcy5lbnZpcm9ubWVudC5hdXRoQ2xpZW50O1xuXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KGAke3RoaXMuZW52aXJvbm1lbnQuYXV0aEVuZFBvaW50fS9yZWFsbXMvJHt0aGlzLmVudmlyb25tZW50LmF1dGhSZWFsbX0vcHJvdG9jb2wvb3BlbmlkLWNvbm5lY3QvdG9rZW5gLFxuICAgICAgYm9keSwge2hlYWRlcnN9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChyZXMgPT4gcmVzKSk7XG4gIH1cblxuICBnZXROZXdUb2tlbkNsaWVudChyZWZyZXNoVG9rZW46IHN0cmluZywgY2xpZW50SWQ6IHN0cmluZyk6IGFueSB7XG4gICAgY29uc29sZS5sb2coJ2dldE5ld1Rva2VuJyk7XG4gICAgY29uc3QgYm9keSA9ICdncmFudF90eXBlPXJlZnJlc2hfdG9rZW4nICsgJyZyZWZyZXNoX3Rva2VuPScgKyByZWZyZXNoVG9rZW4gKyAnJmNsaWVudF9pZD0nICsgY2xpZW50SWQ7XG5cbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4oYCR7dGhpcy5lbnZpcm9ubWVudC5hdXRoRW5kUG9pbnR9L3JlYWxtcy8ke3RoaXMuZW52aXJvbm1lbnQuYXV0aFJlYWxtfS9wcm90b2NvbC9vcGVuaWQtY29ubmVjdC90b2tlbmAsXG4gICAgICBib2R5LCB7aGVhZGVyc30pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKHJlcyA9PiByZXMpKTtcbiAgfVxuXG4gIGdldFRva2VuQ2xpZW50Q29kZShyZWZyZXNoVG9rZW46IHN0cmluZywgY2xpZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc29sZS5sb2coJ2dldE5ld1Rva2VuJyk7XG4gICAgY29uc3QgYm9keSA9ICdncmFudF90eXBlPXJlZnJlc2hfdG9rZW4nICsgJyZyZWZyZXNoX3Rva2VuPScgKyByZWZyZXNoVG9rZW4gKyAnJmNsaWVudF9pZD0nICsgY2xpZW50SWQ7XG5cbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4oYCR7dGhpcy5lbnZpcm9ubWVudC5hdXRoRW5kUG9pbnR9L3JlYWxtcy8ke3RoaXMuZW52aXJvbm1lbnQuYXV0aFJlYWxtfS9wcm90b2NvbC9vcGVuaWQtY29ubmVjdC90b2tlbmAsXG4gICAgICBib2R5LCB7aGVhZGVyc30pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKHJlcyA9PiByZXMpKTtcbiAgfVxuXG5cbiAgZ2V0TG9naW5VcmwoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KHRoaXMuZW5kUG9pbnQgKyAnL2F1dGgvbG9naW4vdXJsLycrdGhpcy5lbnZpcm9ubWVudC5hdXRoQ2xpZW50KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChyZXMgPT4gcmVzKSk7XG4gIH1cblxuICBnZXRIb21lVXJsKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55Pih0aGlzLmVuZFBvaW50ICsgJy9hdXRoL2hvbWUvdXJsLycrdGhpcy5lbnZpcm9ubWVudC5hdXRoQ2xpZW50KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChyZXMgPT4gcmVzKSk7XG4gIH1cblxuICBsb2dvdXRBcGkoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBib2R5ID0gJ3JlZnJlc2hfdG9rZW49JyArIHRoaXMucmVmcmVzaFRva2VuICsgJyZjbGllbnRfaWQ9JyArIHRoaXMuZW52aXJvbm1lbnQuYXV0aENsaWVudDtcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4oYCR7dGhpcy5lbnZpcm9ubWVudC5hdXRoRW5kUG9pbnR9L3JlYWxtcy8ke3RoaXMuZW52aXJvbm1lbnQuYXV0aFJlYWxtfS9wcm90b2NvbC9vcGVuaWQtY29ubmVjdC9sb2dvdXRgLFxuICAgICAgYm9keSwge2hlYWRlcnN9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChyZXMgPT4gcmVzKSk7XG4gIH1cblxuICBsb2dvdXRBcGlDbGllbnQoY2xpZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgYm9keSA9ICdyZWZyZXNoX3Rva2VuPScgKyB0aGlzLnJlZnJlc2hUb2tlbiArICcmY2xpZW50X2lkPScgKyBjbGllbnRJZDtcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4oYCR7dGhpcy5lbnZpcm9ubWVudC5hdXRoRW5kUG9pbnR9L3JlYWxtcy8ke3RoaXMuZW52aXJvbm1lbnQuYXV0aFJlYWxtfS9wcm90b2NvbC9vcGVuaWQtY29ubmVjdC9sb2dvdXRgLFxuICAgICAgYm9keSwge2hlYWRlcnN9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChyZXMgPT4gcmVzKSk7XG4gIH1cblxuICBnb1RvTG9naW4oKTogdm9pZCB7XG4gICAgdGhpcy5nZXRMb2dpblVybCgpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgY29uc29sZS5sb2cocmVzKTtcbiAgICAgIGNvbnN0IGxvZ2luVXJsID0gcmVzLmRhdGE7XG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGxvZ2luVXJsO1xuICAgIH0sIChlcnIpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkU2Vzc2lvbkRhdGEoKTogdm9pZCB7XG4gICAgbGV0IGRhdGE7XG4gICAgbGV0IHRva2VuO1xuICAgIGxldCByZWZyZXNoVG9rZW47XG4gICAgaWYgKHRoaXMuZW52aXJvbm1lbnQucHJvZHVjdGlvbikge1xuICAgICAgY29uc3QgdSA9IHRoaXMuY3J5cHRvU2VydmljZS5lbmNyeXB0KFVTRVJEQVRBKTtcbiAgICAgIGNvbnN0IHQgPSB0aGlzLmNyeXB0b1NlcnZpY2UuZW5jcnlwdChUT0tFTik7XG4gICAgICBjb25zdCByID0gdGhpcy5jcnlwdG9TZXJ2aWNlLmVuY3J5cHQoUkVGUkVTSF9UT0tFTik7XG4gICAgICBkYXRhID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHUpO1xuICAgICAgdG9rZW4gPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odCk7XG4gICAgICByZWZyZXNoVG9rZW4gPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0ocik7XG4gICAgICBpZiAoZGF0YSAmJiB0b2tlbiAmJiByZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgZGF0YSA9IHRoaXMuY3J5cHRvU2VydmljZS5kZWNyeXB0KGRhdGEpO1xuICAgICAgICB0b2tlbiA9IHRoaXMuY3J5cHRvU2VydmljZS5kZWNyeXB0KHRva2VuKTtcbiAgICAgICAgcmVmcmVzaFRva2VuID0gdGhpcy5jcnlwdG9TZXJ2aWNlLmRlY3J5cHQocmVmcmVzaFRva2VuKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShVU0VSREFUQSk7XG4gICAgICB0b2tlbiA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShUT0tFTik7XG4gICAgICByZWZyZXNoVG9rZW4gPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oUkVGUkVTSF9UT0tFTik7XG4gICAgfVxuICAgIGlmIChkYXRhICYmIHRva2VuICYmIHJlZnJlc2hUb2tlbikge1xuICAgICAgY29uc3QgdXNlciA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICB0aGlzLnNldFRva2Vucyh0b2tlbiwgcmVmcmVzaFRva2VuKTtcbiAgICAgIHRoaXMuc2V0VXNlcmRhdGEodXNlcik7XG4gICAgfVxuICB9XG5cbiAgdXNlckhhc09wdGlvbnNJbkFwcCh1c2VySWQ6IGFueSwgYXBwbGljYXRpb25JZDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KHRoaXMuZW5kUG9pbnQgKyBgL3NlY3VyaXR5L29wdGlvbi8ke2FwcGxpY2F0aW9uSWR9LyR7dXNlcklkfWApXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKHJlcyA9PiByZXMpKTtcbiAgfVxuXG4gIGNoZWNrQXBwUGVybWlzc2lvbnMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc29sZS5sb2codGhpcy51c2VyZGF0YT8udXNlcklkLCB0aGlzLmFwcGxpY2F0aW9uSWQpO1xuICAgICAgaWYgKHRoaXMuYXBwbGljYXRpb25JZCkge1xuICAgICAgICB0aGlzLnVzZXJIYXNPcHRpb25zSW5BcHAodGhpcy51c2VyZGF0YT8udXNlcklkLCB0aGlzLmFwcGxpY2F0aW9uSWQpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHJlcyk7XG4gICAgICAgICAgaWYgKHJlcy5kYXRhKSB7XG4gICAgICAgICAgICByZXNvbHZlKCdvaycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdldEhvbWVVcmwoKS5zdWJzY3JpYmUocmVzMSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlczEpO1xuICAgICAgICAgICAgICBjb25zdCBob21lVXJsID0gcmVzMS5kYXRhO1xuICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGhvbWVVcmw7XG4gICAgICAgICAgICAgIHJlamVjdCgnbm9rJyk7XG4gICAgICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgcmVqZWN0KCdub2snKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICByZWplY3QoJ25vaycpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoJ29rJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gIHB1YmxpYyBnZXRPcHRpb25zVXNlcihhcHBsaWNhdGlvbklkOiBudW1iZXIgfCBudWxsLCB0eXBlOiBzdHJpbmcgfCBudWxsLCBsYW5ndWFnZTogc3RyaW5nIHwgbnVsbCwgZW50aXR5Q29kZTogc3RyaW5nIHwgbnVsbCwgcGFyZW50T3B0aW9uSWQ6IG51bWJlciB8IG51bGwsIGluY2x1ZGVEYXRhOiBib29sZWFuIHwgbnVsbCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgcGFyYW0gPSB7XG4gICAgICB1c2VySWQ6IHRoaXMudXNlcmRhdGE/LnVzZXJJZCxcbiAgICAgIGFwcGxpY2F0aW9uSWQsXG4gICAgICB0eXBlLFxuICAgICAgbGFuZ3VhZ2UsXG4gICAgICBlbnRpdHlDb2RlLFxuICAgICAgcGFyZW50T3B0aW9uSWQsXG4gICAgICBpbmNsdWRlRGF0YVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4odGhpcy5lbmRQb2ludCArICcvc2VjdXJpdHkvb3B0aW9uL3VzZXInLCBwYXJhbSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAocmVzID0+IHJlcykpO1xuICB9XG5cbiAgcmVnaXN0ZXJFeGNlcHRpb24ocGFyYW06IEZyb250RW5kRXhjZXB0aW9uKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdza2lwRXJyb3InLCAndHJ1ZScpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KHRoaXMuZW5kUG9pbnQgKyAnL2F1dGgvZXhjZXB0aW9uL2xvZycsIHBhcmFtLCB7aGVhZGVyc30pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKHJlcyA9PiByZXMpKTtcbiAgfVxuXG4gIHNhdmVTdG9yYWdlRGF0YShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVudmlyb25tZW50LnByb2R1Y3Rpb24pIHtcbiAgICAgIGNvbnN0IGsgPSB0aGlzLmNyeXB0b1NlcnZpY2UuZW5jcnlwdChrZXkpO1xuICAgICAgY29uc3QgdiA9IHRoaXMuY3J5cHRvU2VydmljZS5lbmNyeXB0KHZhbHVlKTtcbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShrLCB2KTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZVN0b3JhZ2VEYXRhKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZW52aXJvbm1lbnQucHJvZHVjdGlvbikge1xuICAgICAgY29uc3QgayA9IHRoaXMuY3J5cHRvU2VydmljZS5lbmNyeXB0KGtleSk7XG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0b3JhZ2VEYXRhKGtleTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgbGV0IHJlczogc3RyaW5nIHwgbnVsbDtcbiAgICBpZiAodGhpcy5lbnZpcm9ubWVudC5wcm9kdWN0aW9uKSB7XG4gICAgICBjb25zdCBrID0gdGhpcy5jcnlwdG9TZXJ2aWNlLmVuY3J5cHQoa2V5KTtcbiAgICAgIGNvbnN0IHYgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oayk7XG4gICAgICBpZiAodikge1xuICAgICAgICByZXMgPSB0aGlzLmNyeXB0b1NlcnZpY2UuZGVjcnlwdCh2KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcyA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cblxuICBwdWJsaWMgcmVtb3ZlVXJsRGF0YSgpOiB2b2lkIHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHVybC5zZWFyY2hQYXJhbXM7XG4gICAgcXVlcnlQYXJhbXMuZGVsZXRlKCdjb2RlJyk7XG4gICAgY29uc3QgbmV3VXJsID0gdXJsLm9yaWdpbiArIHVybC5wYXRobmFtZSArICc/JyArIHF1ZXJ5UGFyYW1zLnRvU3RyaW5nKCk7XG4gICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCBkb2N1bWVudC50aXRsZSwgbmV3VXJsKTtcbiAgfVxuXG4gIHB1YmxpYyBjaGVja1Nlc3Npb25EYXRhKCk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBkYXRhO1xuICAgICAgbGV0IHRva2VuO1xuICAgICAgbGV0IHJlZnJlc2hUb2tlbjtcblxuICAgICAgY29uc3QgY3VycmVudFVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgY29uc3QgY29kZSA9IGN1cnJlbnRVcmwuc2VhcmNoUGFyYW1zLmdldCgnY29kZScpO1xuICAgICAgY29uc29sZS5sb2coJ2NvZGUnLCBjb2RlKTtcbiAgICAgIGlmIChjb2RlKSB7XG4gICAgICAgIGNvbnN0IGNvZGVEZWNvZGVkID0gdGhpcy5nZXREZWNvZGVkQXV0aENvZGUoY29kZSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdjb2RlJywgY29kZURlY29kZWQpO1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5qd3RTZXJ2aWNlLmRlY29kZVRva2VuKGNvZGVEZWNvZGVkKTtcbiAgICAgICAgdGhpcy5nZXRUb2tlbkNsaWVudENvZGUoY29kZURlY29kZWQsIGRlY29kZWQuYXpwKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcyk7XG4gICAgICAgICAgICB0b2tlbiA9IHJlcy5hY2Nlc3NfdG9rZW47XG4gICAgICAgICAgICByZWZyZXNoVG9rZW4gPSByZXMucmVmcmVzaF90b2tlbjtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNyZWRlbnRpYWxzKHRva2VuLCByZWZyZXNoVG9rZW4pO1xuICAgICAgICAgICAgdGhpcy5jaGVja0FwcFBlcm1pc3Npb25zKCkudGhlbigocmVzMSkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMxKTtcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVVcmxEYXRhKCk7XG4gICAgICAgICAgICAgIHJlc29sdmUoJ09LJyk7XG4gICAgICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YSA9IHRoaXMuZ2V0U3RvcmFnZURhdGEoVVNFUkRBVEEpO1xuICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0U3RvcmFnZURhdGEoVE9LRU4pO1xuICAgICAgICByZWZyZXNoVG9rZW4gPSB0aGlzLmdldFN0b3JhZ2VEYXRhKFJFRlJFU0hfVE9LRU4pO1xuICAgICAgICBpZiAoZGF0YSAmJiB0b2tlbiAmJiByZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICB0aGlzLnNhdmVDcmVkZW50aWFscyh0b2tlbiwgcmVmcmVzaFRva2VuKTtcbiAgICAgICAgICB0aGlzLmNoZWNrQXBwUGVybWlzc2lvbnMoKS50aGVuKChyZXMxKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMxKTtcbiAgICAgICAgICAgIHJlc29sdmUoJ09LJyk7XG4gICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICAgICAgaWYgKHVybC5pbmRleE9mKCcvcmVkaXJlY3QnKT4tMSkge1xuICAgICAgICAgICAgcmVzb2x2ZSgnT0snKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95Q3JlZGVudGlhbHMoKTtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveVVzZXJEYXRhKCk7XG4gICAgICAgICAgICB0aGlzLmdldExvZ2luVXJsKCkuc3Vic2NyaWJlKHJlczEgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMxKTtcbiAgICAgICAgICAgICAgdGhpcy5sb2dpblVybCA9IHJlczEuZGF0YTtcbiAgICAgICAgICAgICAgaWYgKHVybC5pbmRleE9mKCcvbG9naW4nKTwwICYmIHVybC5pbmRleE9mKCcvZm9yZ290Jyk8MCAmJlxuICAgICAgICAgICAgICAgICAgdXJsLmluZGV4T2YoJy9yZXNldCcpPDAgJiYgdXJsLmluZGV4T2YoJy92ZXJpZnknKTwwICYmXG4gICAgICAgICAgICAgICAgICB1cmwuaW5kZXhPZignL3NpZ25fdXAnKTwwKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLmxvZ2luVXJsICsgJz9jb250aW51ZT0nK2VuY29kZVVSSUNvbXBvbmVudCh1cmwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlc29sdmUoJ05PSycpO1xuICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuXG5cbiAgcHVibGljIGNoZWNrU2Vzc2lvbkRhdGFNaWNyb2Zyb250KCk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBkYXRhO1xuICAgICAgbGV0IHRva2VuO1xuICAgICAgbGV0IHJlZnJlc2hUb2tlbjtcbiAgICAgIGlmICh0aGlzLmVudmlyb25tZW50LnByb2R1Y3Rpb24pIHtcbiAgICAgICAgY29uc3QgdSA9IHRoaXMuY3J5cHRvU2VydmljZS5lbmNyeXB0KFVTRVJEQVRBKTtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuY3J5cHRvU2VydmljZS5lbmNyeXB0KFRPS0VOKTtcbiAgICAgICAgY29uc3QgciA9IHRoaXMuY3J5cHRvU2VydmljZS5lbmNyeXB0KFJFRlJFU0hfVE9LRU4pO1xuICAgICAgICBjb25zdCBkMSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh1KTtcbiAgICAgICAgY29uc3QgZDIgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odCk7XG4gICAgICAgIGNvbnN0IGQzID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHIpO1xuICAgICAgICBpZiAoZDEgJiYgZDIgJiYgZDMpIHtcbiAgICAgICAgICBkYXRhID0gdGhpcy5jcnlwdG9TZXJ2aWNlLmRlY3J5cHQoZDEpO1xuICAgICAgICAgIHRva2VuID0gdGhpcy5jcnlwdG9TZXJ2aWNlLmRlY3J5cHQoZDIpO1xuICAgICAgICAgIHJlZnJlc2hUb2tlbiA9IHRoaXMuY3J5cHRvU2VydmljZS5kZWNyeXB0KGQzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShVU0VSREFUQSk7XG4gICAgICAgIHRva2VuID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFRPS0VOKTtcbiAgICAgICAgcmVmcmVzaFRva2VuID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFJFRlJFU0hfVE9LRU4pO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEgJiYgdG9rZW4gJiYgcmVmcmVzaFRva2VuKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdsb2NhbCBzZXNzaW9uIG9rJyk7XG4gICAgICAgIHRoaXMuc2F2ZUNyZWRlbnRpYWxzKHRva2VuLCByZWZyZXNoVG9rZW4pO1xuICAgICAgICByZXNvbHZlKCdPSycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignbG9jYWwgc2Vzc2lvbiBub2snKTtcbiAgICAgICAgcmVqZWN0KCdOT0snKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBdXRoQ29kZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVuYyA9IHRoaXMuY3J5cHRvU2VydmljZS5lbmNyeXB0KHRoaXMucmVmcmVzaFRva2VuP3RoaXMucmVmcmVzaFRva2VuOicnKTtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGVuYyk7XG4gIH1cblxuICBwcml2YXRlIGdldERlY29kZWRBdXRoQ29kZShjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRlYyA9IGRlY29kZVVSSUNvbXBvbmVudChjb2RlKTtcbiAgICByZXR1cm4gdGhpcy5jcnlwdG9TZXJ2aWNlLmRlY3J5cHQoZGVjKTtcbiAgfVxuXG4gIHB1YmxpYyByZWZyZXNoU2Vzc2lvbigpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCByZWZyZXNoVG9rZW4gPSB0aGlzLmdldFJlZnJlc2hUb2tlbigpO1xuICAgICAgaWYgKHJlZnJlc2hUb2tlbikge1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5qd3RTZXJ2aWNlLmRlY29kZVRva2VuKHJlZnJlc2hUb2tlbik7XG4gICAgICAgIHRoaXMuZ2V0TmV3VG9rZW5DbGllbnQocmVmcmVzaFRva2VuLCBkZWNvZGVkLmF6cCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcyk7XG4gICAgICAgICAgICB0aGlzLnNldFRva2VuKHJlcy5hY2Nlc3NfdG9rZW4pO1xuICAgICAgICAgICAgdGhpcy5zZXRSZWZyZXNoVG9rZW4ocmVzLnJlZnJlc2hfdG9rZW4pO1xuICAgICAgICAgICAgdGhpcy5zYXZlQ3JlZGVudGlhbHMocmVzLmFjY2Vzc190b2tlbiwgcmVzLnJlZnJlc2hfdG9rZW4pO1xuICAgICAgICAgICAgcmVzb2x2ZSgnT0snKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QoJ05PSycpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbn1cblxuIl19
@@ -0,0 +1,31 @@
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { map } from 'rxjs/operators';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common/http";
5
+ export class UserEventService {
6
+ constructor(http, environment) {
7
+ this.http = http;
8
+ this.endPoint = environment.endPointCore;
9
+ }
10
+ registerUserEvent(eventType, optionId, entityType, entityId, paramsIn, paramsOut) {
11
+ const param = {
12
+ eventType,
13
+ optionId,
14
+ entityType,
15
+ entityId,
16
+ paramsIn,
17
+ paramsOut
18
+ };
19
+ return this.http.post(this.endPoint + '/security/user/event', param)
20
+ .pipe(map((res) => res));
21
+ }
22
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.3", ngImport: i0, type: UserEventService, deps: [{ token: i1.HttpClient }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Injectable }); }
23
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.3", ngImport: i0, type: UserEventService }); }
24
+ }
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.3", ngImport: i0, type: UserEventService, decorators: [{
26
+ type: Injectable
27
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
28
+ type: Inject,
29
+ args: ['environment']
30
+ }] }]; } });
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3NpLXNlY3VyaXR5LWNvbW1vbnMvc3JjL2xpYi9zZXJ2aWNlcy91c2VyLWV2ZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFJckMsTUFBTSxPQUFPLGdCQUFnQjtJQUkzQixZQUFvQixJQUFnQixFQUNYLFdBQWdCO1FBRHJCLFNBQUksR0FBSixJQUFJLENBQVk7UUFFbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDO0lBQzNDLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxTQUFpQixFQUNqQixRQUF1QixFQUN2QixVQUF5QixFQUN6QixRQUF1QixFQUN2QixRQUF1QixFQUN2QixTQUF3QjtRQUMvQyxNQUFNLEtBQUssR0FBRztZQUNaLFNBQVM7WUFDVCxRQUFRO1lBQ1IsVUFBVTtZQUNWLFFBQVE7WUFDUixRQUFRO1lBQ1IsU0FBUztTQUNWLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFNLElBQUksQ0FBQyxRQUFRLEdBQUcsc0JBQXNCLEVBQUUsS0FBSyxDQUFDO2FBQ3RFLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDOUIsQ0FBQzs4R0ExQlUsZ0JBQWdCLDRDQUtqQixhQUFhO2tIQUxaLGdCQUFnQjs7MkZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVTs7MEJBTU4sTUFBTTsyQkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBVc2VyRXZlbnRTZXJ2aWNlIHtcblxuICBlbmRQb2ludDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBASW5qZWN0KCdlbnZpcm9ubWVudCcpIGVudmlyb25tZW50OiBhbnkpIHtcbiAgICB0aGlzLmVuZFBvaW50ID0gZW52aXJvbm1lbnQuZW5kUG9pbnRDb3JlO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyVXNlckV2ZW50KGV2ZW50VHlwZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uSWQ6IG51bWJlciB8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlUeXBlOiBzdHJpbmcgfCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5SWQ6IHN0cmluZyB8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNJbjogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc091dDogc3RyaW5nIHwgbnVsbCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgcGFyYW0gPSB7XG4gICAgICBldmVudFR5cGUsXG4gICAgICBvcHRpb25JZCxcbiAgICAgIGVudGl0eVR5cGUsXG4gICAgICBlbnRpdHlJZCxcbiAgICAgIHBhcmFtc0luLFxuICAgICAgcGFyYW1zT3V0XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55Pih0aGlzLmVuZFBvaW50ICsgJy9zZWN1cml0eS91c2VyL2V2ZW50JywgcGFyYW0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4gcmVzKSk7XG4gIH1cblxufVxuIl19