1 | import { __assign, __decorate, __metadata, __awaiter, __generator, __values } from 'tslib';
|
2 | import { forwardRef, Injectable, InjectionToken, Component, NgModule } from '@angular/core';
|
3 | import { Type, plainToClass } from 'class-transformer';
|
4 | import { Router, ActivatedRoute, RouterModule } from '@angular/router';
|
5 | import { Storage, UbudStorageModule } from '@ubud/storage';
|
6 | import { forkJoin, Observable, of } from 'rxjs';
|
7 | import { fromPromise } from 'rxjs/internal/observable/fromPromise';
|
8 | import { catchError, map, switchMap, tap, first } from 'rxjs/internal/operators';
|
9 | import { HttpClient } from '@angular/common/http';
|
10 | import { Location, PlatformLocation } from '@angular/common';
|
11 | import { ErrorObservable } from 'rxjs-compat/observable/ErrorObservable';
|
12 |
|
13 | /**
|
14 | * @fileoverview added by tsickle
|
15 | * @suppress {checkTypes} checked by tsc
|
16 | */
|
17 | var Config = /** @class */ (function () {
|
18 | function Config(data) {
|
19 | this.endpoint = 'https://account.kemnaker.go.id';
|
20 | Object.assign(this, data);
|
21 | }
|
22 | return Config;
|
23 | }());
|
24 |
|
25 | /**
|
26 | * @fileoverview added by tsickle
|
27 | * @suppress {checkTypes} checked by tsc
|
28 | */
|
29 | var User = /** @class */ (function () {
|
30 | function User() {
|
31 | }
|
32 | __decorate([
|
33 | Type(/** @type {?} */ (forwardRef(function () { return Date; }))),
|
34 | __metadata("design:type", Date)
|
35 | ], User.prototype, "updatedAt", void 0);
|
36 | return User;
|
37 | }());
|
38 |
|
39 | /**
|
40 | * @fileoverview added by tsickle
|
41 | * @suppress {checkTypes} checked by tsc
|
42 | */
|
43 | var NacoService = /** @class */ (function () {
|
44 | function NacoService(config, router, storage, http, location) {
|
45 | this.config = config;
|
46 | this.router = router;
|
47 | this.storage = storage;
|
48 | this.http = http;
|
49 | this.location = location;
|
50 | this.VERSION = 'v1';
|
51 | this.signature = null;
|
52 | this.user = null;
|
53 | this.refreshToken = null;
|
54 | this.clientSecret = null;
|
55 | }
|
56 | /**
|
57 | * @param {?} user
|
58 | * @return {?}
|
59 | */
|
60 | NacoService.prototype.setUser = /**
|
61 | * @param {?} user
|
62 | * @return {?}
|
63 | */
|
64 | function (user) {
|
65 | this.user = user;
|
66 | this.storage.set('user', user);
|
67 | };
|
68 | /**
|
69 | * @return {?}
|
70 | */
|
71 | NacoService.prototype.getUser = /**
|
72 | * @return {?}
|
73 | */
|
74 | function () {
|
75 | var _this = this;
|
76 | if (null !== this.user) {
|
77 | return of(this.user);
|
78 | }
|
79 | return fromPromise(this.storage.get('user')).pipe(switchMap(function (user) {
|
80 | if (null !== user) {
|
81 | return of(user);
|
82 | }
|
83 | var /** @type {?} */ uri = _this.getUri('/users/me');
|
84 | return fromPromise(_this.getSignature()).pipe(switchMap(function (signature) {
|
85 | if (null === signature) {
|
86 | return of(null);
|
87 | }
|
88 | var /** @type {?} */ options = {
|
89 | headers: {
|
90 | Authorization: signature.type + " " + signature.token,
|
91 | },
|
92 | };
|
93 | return _this.http.get(uri, options).pipe(map(function (res) {
|
94 | if (res.data) {
|
95 | return res.data;
|
96 | }
|
97 | throw new Error('There are no body to be transformed');
|
98 | }), map(function (data) {
|
99 | var /** @type {?} */ authUser = plainToClass(User, data);
|
100 | _this.setUser(authUser);
|
101 | return authUser;
|
102 | }), catchError(function (e) {
|
103 | if (401 === e.status) {
|
104 | return _this.refreshUser().pipe(switchMap(function (refreshUser) {
|
105 | if (refreshUser) {
|
106 | return of(refreshUser);
|
107 | }
|
108 | return ErrorObservable.create(e);
|
109 | }));
|
110 | }
|
111 | return ErrorObservable.create(e);
|
112 | }));
|
113 | }));
|
114 | }));
|
115 | };
|
116 | /**
|
117 | * @return {?}
|
118 | */
|
119 | NacoService.prototype.getSignature = /**
|
120 | * @return {?}
|
121 | */
|
122 | function () {
|
123 | if (null !== this.signature) {
|
124 | return Promise.resolve(this.signature);
|
125 | }
|
126 | return this.storage.get('signature');
|
127 | };
|
128 | /**
|
129 | * @param {?} signature
|
130 | * @return {?}
|
131 | */
|
132 | NacoService.prototype.setSignature = /**
|
133 | * @param {?} signature
|
134 | * @return {?}
|
135 | */
|
136 | function (signature) {
|
137 | this.signature = signature;
|
138 | this.storage.set('signature', signature);
|
139 | };
|
140 | /**
|
141 | * @param {?} secret
|
142 | * @return {?}
|
143 | */
|
144 | NacoService.prototype.setClientSecret = /**
|
145 | * @param {?} secret
|
146 | * @return {?}
|
147 | */
|
148 | function (secret) {
|
149 | this.clientSecret = secret;
|
150 | this.storage.set('client_secret', secret);
|
151 | };
|
152 | /**
|
153 | * @param {?} refreshToken
|
154 | * @return {?}
|
155 | */
|
156 | NacoService.prototype.setRefreshToken = /**
|
157 | * @param {?} refreshToken
|
158 | * @return {?}
|
159 | */
|
160 | function (refreshToken) {
|
161 | this.refreshToken = refreshToken;
|
162 | this.storage.set('refresh_token', refreshToken);
|
163 | };
|
164 | /**
|
165 | * @param {?=} scopes
|
166 | * @return {?}
|
167 | */
|
168 | NacoService.prototype.refreshUser = /**
|
169 | * @param {?=} scopes
|
170 | * @return {?}
|
171 | */
|
172 | function (scopes) {
|
173 | var _this = this;
|
174 | this.setUser(null);
|
175 | this.setSignature(null);
|
176 | return forkJoin(this.getRefreshToken(), this.getClientSecret()).pipe(switchMap(function (results) {
|
177 | var /** @type {?} */ refreshToken = results[0];
|
178 | var /** @type {?} */ clientSecret = results[1];
|
179 | if (refreshToken && clientSecret) {
|
180 | return _this.refreshWithRefreshToken(clientSecret, refreshToken.token, scopes);
|
181 | }
|
182 | return _this.refreshWithSilentAuth();
|
183 | }));
|
184 | };
|
185 | /**
|
186 | * @param {?} clientSecret
|
187 | * @param {?} refreshToken
|
188 | * @param {?=} scopes
|
189 | * @return {?}
|
190 | */
|
191 | NacoService.prototype.refreshWithRefreshToken = /**
|
192 | * @param {?} clientSecret
|
193 | * @param {?} refreshToken
|
194 | * @param {?=} scopes
|
195 | * @return {?}
|
196 | */
|
197 | function (clientSecret, refreshToken, scopes) {
|
198 | var _this = this;
|
199 | var /** @type {?} */ request = this.http.post(this.getUri('/tokens'), {
|
200 | grant_type: 'refresh_token',
|
201 | scopes: scopes || 'basic email',
|
202 | client_id: this.config.clientId,
|
203 | client_secret: clientSecret,
|
204 | refresh_token: refreshToken,
|
205 | });
|
206 | return request.pipe(tap(function (tokens) {
|
207 | if (tokens && tokens.data) {
|
208 | _this.setSignature({
|
209 | expiresIn: tokens.data.expires_in,
|
210 | type: tokens.data.token_type,
|
211 | token: tokens.data.access_token,
|
212 | });
|
213 | _this.setRefreshToken({
|
214 | type: tokens.data.token_type,
|
215 | token: tokens.data.refresh_token,
|
216 | });
|
217 | }
|
218 | }), map(function (tokens) { return tokens && tokens.data; }), switchMap(function (hasToken) {
|
219 | if (hasToken) {
|
220 | return _this.getUser();
|
221 | }
|
222 | return of(null);
|
223 | }));
|
224 | };
|
225 | /**
|
226 | * @return {?}
|
227 | */
|
228 | NacoService.prototype.refreshWithSilentAuth = /**
|
229 | * @return {?}
|
230 | */
|
231 | function () {
|
232 | var _this = this;
|
233 | return new Observable(function (observer) {
|
234 | var /** @type {?} */ redirectUri = _this.getCurrentOrigin('auth/silent');
|
235 | var /** @type {?} */ uri = _this.login('basic email', redirectUri);
|
236 | var /** @type {?} */ iframe = document.createElement('iframe');
|
237 | iframe.setAttribute('src', uri);
|
238 | iframe.style.display = 'none';
|
239 | iframe.addEventListener('load', function () { return __awaiter(_this, void 0, void 0, function () {
|
240 | var e_1, _a, queryString, queryParts, params, queryParts_1, queryParts_1_1, item, itemParts, state, _b, user, e_2;
|
241 | return __generator(this, function (_c) {
|
242 | switch (_c.label) {
|
243 | case 0:
|
244 | _c.trys.push([0, 6, , 7]);
|
245 | queryString = iframe.contentWindow.location.search.substring(1);
|
246 | iframe.parentNode.removeChild(iframe);
|
247 | if (!queryString) return [3 /*break*/, 5];
|
248 | queryParts = queryString.split('&');
|
249 | params = {};
|
250 | try {
|
251 | for (queryParts_1 = __values(queryParts), queryParts_1_1 = queryParts_1.next(); !queryParts_1_1.done; queryParts_1_1 = queryParts_1.next()) {
|
252 | item = queryParts_1_1.value;
|
253 | itemParts = item.split('=');
|
254 | params[itemParts[0]] = itemParts[1];
|
255 | }
|
256 | }
|
257 | catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
258 | finally {
|
259 | try {
|
260 | if (queryParts_1_1 && !queryParts_1_1.done && (_a = queryParts_1.return)) _a.call(queryParts_1);
|
261 | }
|
262 | finally { if (e_1) throw e_1.error; }
|
263 | }
|
264 | if (!params.hasOwnProperty('access_token')) return [3 /*break*/, 3];
|
265 | state = params['state'] || null;
|
266 | _b = state;
|
267 | return [4 /*yield*/, this.getState()];
|
268 | case 1:
|
269 | if (_b !== (_c.sent())) {
|
270 | observer.next(null);
|
271 | return [2 /*return*/];
|
272 | }
|
273 | this.setSignature({
|
274 | token: params['access_token'],
|
275 | type: params['token_type'],
|
276 | expiresIn: params['ttl'],
|
277 | });
|
278 | return [4 /*yield*/, this.getUser().toPromise()];
|
279 | case 2:
|
280 | user = _c.sent();
|
281 | if (user) {
|
282 | this.setUser(user);
|
283 | }
|
284 | observer.next(user);
|
285 | return [3 /*break*/, 4];
|
286 | case 3:
|
287 | observer.next(null);
|
288 | _c.label = 4;
|
289 | case 4: return [2 /*return*/];
|
290 | case 5:
|
291 | observer.next(null);
|
292 | return [3 /*break*/, 7];
|
293 | case 6:
|
294 | e_2 = _c.sent();
|
295 | observer.next(null);
|
296 | return [3 /*break*/, 7];
|
297 | case 7: return [2 /*return*/];
|
298 | }
|
299 | });
|
300 | }); }, false);
|
301 | document.body.appendChild(iframe);
|
302 | });
|
303 | };
|
304 | /**
|
305 | * @param {?} scopes
|
306 | * @param {?=} redirectUri
|
307 | * @return {?}
|
308 | */
|
309 | NacoService.prototype.login = /**
|
310 | * @param {?} scopes
|
311 | * @param {?=} redirectUri
|
312 | * @return {?}
|
313 | */
|
314 | function (scopes, redirectUri) {
|
315 | if (!redirectUri) {
|
316 | redirectUri = this.router.url;
|
317 | }
|
318 | var /** @type {?} */ state = this.generateState();
|
319 | this.storage.set('state', state);
|
320 | var /** @type {?} */ query = this.buildQueryString({
|
321 | 'response_type': 'token',
|
322 | 'scopes': scopes,
|
323 | 'client': this.config.clientId,
|
324 | 'state': state,
|
325 | 'continue': redirectUri,
|
326 | });
|
327 | return this.config.endpoint + '/auth?' + query;
|
328 | };
|
329 | /**
|
330 | * @param {?=} redirectUri
|
331 | * @return {?}
|
332 | */
|
333 | NacoService.prototype.logout = /**
|
334 | * @param {?=} redirectUri
|
335 | * @return {?}
|
336 | */
|
337 | function (redirectUri) {
|
338 | var _this = this;
|
339 | this.signature = null;
|
340 | this.user = null;
|
341 | return new Promise(function (resolve) {
|
342 | Promise.all([
|
343 | _this.storage.remove('signature'),
|
344 | _this.storage.remove('user'),
|
345 | ]).then(function () {
|
346 | var /** @type {?} */ endpoint = _this.config.endpoint + '/auth/logout';
|
347 | if (redirectUri) {
|
348 | endpoint += '?continue=' + redirectUri;
|
349 | }
|
350 | resolve(endpoint);
|
351 | });
|
352 | });
|
353 | };
|
354 | /**
|
355 | * @return {?}
|
356 | */
|
357 | NacoService.prototype.getState = /**
|
358 | * @return {?}
|
359 | */
|
360 | function () {
|
361 | return this.storage.get('state');
|
362 | };
|
363 | /**
|
364 | * @param {?} route
|
365 | * @return {?}
|
366 | */
|
367 | NacoService.prototype.buildNestedUri = /**
|
368 | * @param {?} route
|
369 | * @return {?}
|
370 | */
|
371 | function (route) {
|
372 | var _this = this;
|
373 | var /** @type {?} */ uri = '';
|
374 | if (route.routeConfig && route.routeConfig.path) {
|
375 | uri += '/' + route.routeConfig.path;
|
376 | }
|
377 | if (route.children) {
|
378 | route.children.forEach(function (item) {
|
379 | uri += _this.buildNestedUri(item);
|
380 | });
|
381 | }
|
382 | return uri;
|
383 | };
|
384 | /**
|
385 | * @return {?}
|
386 | */
|
387 | NacoService.prototype.getRefreshToken = /**
|
388 | * @return {?}
|
389 | */
|
390 | function () {
|
391 | if (null !== this.refreshToken) {
|
392 | return Promise.resolve(this.refreshToken);
|
393 | }
|
394 | return this.storage.get('refresh_token');
|
395 | };
|
396 | /**
|
397 | * @return {?}
|
398 | */
|
399 | NacoService.prototype.getClientSecret = /**
|
400 | * @return {?}
|
401 | */
|
402 | function () {
|
403 | if (null !== this.clientSecret) {
|
404 | return Promise.resolve(this.clientSecret);
|
405 | }
|
406 | return this.storage.get('client_secret');
|
407 | };
|
408 | /**
|
409 | * @param {?} path
|
410 | * @return {?}
|
411 | */
|
412 | NacoService.prototype.getUri = /**
|
413 | * @param {?} path
|
414 | * @return {?}
|
415 | */
|
416 | function (path) {
|
417 | return this.config.endpoint + '/api/' + this.VERSION + path;
|
418 | };
|
419 | /**
|
420 | * @param {?=} path
|
421 | * @return {?}
|
422 | */
|
423 | NacoService.prototype.getCurrentOrigin = /**
|
424 | * @param {?=} path
|
425 | * @return {?}
|
426 | */
|
427 | function (path) {
|
428 | return window.location.origin + this.location.prepareExternalUrl(path || '');
|
429 | };
|
430 | /**
|
431 | * @return {?}
|
432 | */
|
433 | NacoService.prototype.generateState = /**
|
434 | * @return {?}
|
435 | */
|
436 | function () {
|
437 | var /** @type {?} */ possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
438 | var /** @type {?} */ text = '';
|
439 | for (var /** @type {?} */ i = 0; i < 5; i++) {
|
440 | text += possible.charAt(Math.floor(Math.random() * possible.length));
|
441 | }
|
442 | return text;
|
443 | };
|
444 | /**
|
445 | * @param {?} params
|
446 | * @return {?}
|
447 | */
|
448 | NacoService.prototype.buildQueryString = /**
|
449 | * @param {?} params
|
450 | * @return {?}
|
451 | */
|
452 | function (params) {
|
453 | var /** @type {?} */ queryParams = Object.keys(params).map(function (key) {
|
454 | return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);
|
455 | });
|
456 | return queryParams.join('&');
|
457 | };
|
458 | NacoService.decorators = [
|
459 | { type: Injectable },
|
460 | ];
|
461 | /** @nocollapse */
|
462 | NacoService.ctorParameters = function () { return [
|
463 | { type: Config },
|
464 | { type: Router },
|
465 | { type: Storage },
|
466 | { type: HttpClient },
|
467 | { type: Location }
|
468 | ]; };
|
469 | return NacoService;
|
470 | }());
|
471 |
|
472 | /**
|
473 | * @fileoverview added by tsickle
|
474 | * @suppress {checkTypes} checked by tsc
|
475 | */
|
476 | var Signature = /** @class */ (function () {
|
477 | function Signature() {
|
478 | }
|
479 | return Signature;
|
480 | }());
|
481 |
|
482 | /**
|
483 | * @fileoverview added by tsickle
|
484 | * @suppress {checkTypes} checked by tsc
|
485 | */
|
486 | var AuthenticatedGuard = /** @class */ (function () {
|
487 | function AuthenticatedGuard(naco, storage, platformLocation) {
|
488 | this.naco = naco;
|
489 | this.storage = storage;
|
490 | this.platformLocation = platformLocation;
|
491 | }
|
492 | /**
|
493 | * @param {?} route
|
494 | * @return {?}
|
495 | */
|
496 | AuthenticatedGuard.prototype.canActivate = /**
|
497 | * @param {?} route
|
498 | * @return {?}
|
499 | */
|
500 | function (route) {
|
501 | var _this = this;
|
502 | return this.naco.getUser().pipe(first(), map(function (user) {
|
503 | if (null === user) {
|
504 | var /** @type {?} */ base = _this.rtrim((/** @type {?} */ (_this.platformLocation)).location.href);
|
505 | var /** @type {?} */ uri = _this.naco.buildNestedUri(route.root);
|
506 | var /** @type {?} */ next = base.replace(uri, '') + '/' + _this.ltrim(uri);
|
507 | var /** @type {?} */ origin_1 = base.replace(uri, '');
|
508 | _this.storage.set('naco_intended_url', next).then(function () {
|
509 | window.location.href = _this.naco.login('basic email', origin_1 + '/auth');
|
510 | });
|
511 | }
|
512 | return !!user;
|
513 | }));
|
514 | };
|
515 | /**
|
516 | * @param {?} route
|
517 | * @return {?}
|
518 | */
|
519 | AuthenticatedGuard.prototype.canActivateChild = /**
|
520 | * @param {?} route
|
521 | * @return {?}
|
522 | */
|
523 | function (route) {
|
524 | return this.canActivate(route);
|
525 | };
|
526 | /**
|
527 | * @param {?} text
|
528 | * @return {?}
|
529 | */
|
530 | AuthenticatedGuard.prototype.ltrim = /**
|
531 | * @param {?} text
|
532 | * @return {?}
|
533 | */
|
534 | function (text) {
|
535 | return text.replace(/^\/+/, '');
|
536 | };
|
537 | /**
|
538 | * @param {?} text
|
539 | * @return {?}
|
540 | */
|
541 | AuthenticatedGuard.prototype.rtrim = /**
|
542 | * @param {?} text
|
543 | * @return {?}
|
544 | */
|
545 | function (text) {
|
546 | return text.replace(/\/+$/, '');
|
547 | };
|
548 | AuthenticatedGuard.decorators = [
|
549 | { type: Injectable },
|
550 | ];
|
551 | /** @nocollapse */
|
552 | AuthenticatedGuard.ctorParameters = function () { return [
|
553 | { type: NacoService },
|
554 | { type: Storage },
|
555 | { type: PlatformLocation }
|
556 | ]; };
|
557 | return AuthenticatedGuard;
|
558 | }());
|
559 |
|
560 | /**
|
561 | * @fileoverview added by tsickle
|
562 | * @suppress {checkTypes} checked by tsc
|
563 | */
|
564 | var AuthInterceptor = /** @class */ (function () {
|
565 | function AuthInterceptor(naco) {
|
566 | this.naco = naco;
|
567 | }
|
568 | /**
|
569 | * @param {?} req
|
570 | * @param {?} next
|
571 | * @return {?}
|
572 | */
|
573 | AuthInterceptor.prototype.intercept = /**
|
574 | * @param {?} req
|
575 | * @param {?} next
|
576 | * @return {?}
|
577 | */
|
578 | function (req, next) {
|
579 | var _this = this;
|
580 | return fromPromise(this.naco.getSignature()).pipe(switchMap(function (signature) {
|
581 | if (!signature) {
|
582 | return next.handle(req);
|
583 | }
|
584 | return next
|
585 | .handle(req.clone({
|
586 | setHeaders: {
|
587 | Authorization: signature.type + " " + signature.token,
|
588 | },
|
589 | }))
|
590 | .pipe(catchError(function (error) {
|
591 | if (error.status === 401) {
|
592 | return _this.naco.refreshUser().pipe(switchMap(function (user) {
|
593 | if (user) {
|
594 | return fromPromise(_this.naco.getSignature()).pipe(switchMap(function (newSignature) {
|
595 | return next.handle(req.clone({
|
596 | setHeaders: {
|
597 | Authorization: newSignature.type + " " + newSignature.token,
|
598 | },
|
599 | }));
|
600 | }));
|
601 | }
|
602 | return ErrorObservable.create(error);
|
603 | }));
|
604 | }
|
605 | return ErrorObservable.create(error);
|
606 | }));
|
607 | }));
|
608 | };
|
609 | AuthInterceptor.decorators = [
|
610 | { type: Injectable },
|
611 | ];
|
612 | /** @nocollapse */
|
613 | AuthInterceptor.ctorParameters = function () { return [
|
614 | { type: NacoService }
|
615 | ]; };
|
616 | return AuthInterceptor;
|
617 | }());
|
618 |
|
619 | /**
|
620 | * @fileoverview added by tsickle
|
621 | * @suppress {checkTypes} checked by tsc
|
622 | */
|
623 | /**
|
624 | * @param {?} config
|
625 | * @param {?} router
|
626 | * @param {?} storage
|
627 | * @param {?} http
|
628 | * @param {?} location
|
629 | * @return {?}
|
630 | */
|
631 | function nacoFactory(config, router, storage, http, location) {
|
632 | return new NacoService(new Config(__assign({}, config)), router, storage, http, location);
|
633 | }
|
634 | var /** @type {?} */ NACO_CONFIG = new InjectionToken('NACO_CONFIG');
|
635 |
|
636 | /**
|
637 | * @fileoverview added by tsickle
|
638 | * @suppress {checkTypes} checked by tsc
|
639 | */
|
640 | var AuthPage = /** @class */ (function () {
|
641 | function AuthPage(route, naco, storage) {
|
642 | var _this = this;
|
643 | this.route = route;
|
644 | this.naco = naco;
|
645 | this.storage = storage;
|
646 | this.message = 'Authenticating...';
|
647 | this.route.queryParams.subscribe(function (params) { return _this.handle(params); });
|
648 | }
|
649 | /**
|
650 | * @param {?} params
|
651 | * @return {?}
|
652 | */
|
653 | AuthPage.prototype.handle = /**
|
654 | * @param {?} params
|
655 | * @return {?}
|
656 | */
|
657 | function (params) {
|
658 | var _this = this;
|
659 | if (params["state"]) {
|
660 | this.naco.getState().then(function (state) {
|
661 | if (state !== params["state"]) {
|
662 | _this.message = 'Invalid CSRF';
|
663 | return;
|
664 | }
|
665 | _this.authenticate(params);
|
666 | });
|
667 | }
|
668 | else {
|
669 | this.authenticate(params);
|
670 | }
|
671 | };
|
672 | /**
|
673 | * @param {?} params
|
674 | * @return {?}
|
675 | */
|
676 | AuthPage.prototype.authenticate = /**
|
677 | * @param {?} params
|
678 | * @return {?}
|
679 | */
|
680 | function (params) {
|
681 | var _this = this;
|
682 | var /** @type {?} */ signature = {
|
683 | expiresIn: params["expires_in"],
|
684 | type: params["token_type"],
|
685 | token: params["access_token"],
|
686 | };
|
687 | this.naco.setSignature(signature);
|
688 | this.naco.getUser().subscribe(function (user) {
|
689 | if (null !== user) {
|
690 | _this.storage.get('naco_intended_url').then(function (url) {
|
691 | _this.storage.remove('naco_intended_url').then(function () {
|
692 | window.location.href = url ? url : '/';
|
693 | });
|
694 | });
|
695 | return;
|
696 | }
|
697 | _this.message = 'Unauthenticated!';
|
698 | });
|
699 | };
|
700 | AuthPage.decorators = [
|
701 | { type: Component, args: [{
|
702 | selector: 'naker-auth-page',
|
703 | template: '{{ message }}',
|
704 | },] },
|
705 | ];
|
706 | /** @nocollapse */
|
707 | AuthPage.ctorParameters = function () { return [
|
708 | { type: ActivatedRoute },
|
709 | { type: NacoService },
|
710 | { type: Storage }
|
711 | ]; };
|
712 | return AuthPage;
|
713 | }());
|
714 |
|
715 | /**
|
716 | * @fileoverview added by tsickle
|
717 | * @suppress {checkTypes} checked by tsc
|
718 | */
|
719 | var AuthSilentPage = /** @class */ (function () {
|
720 | function AuthSilentPage() {
|
721 | }
|
722 | AuthSilentPage.decorators = [
|
723 | { type: Component, args: [{
|
724 | selector: 'naker-auth-silent',
|
725 | template: 'Processing silent auth...',
|
726 | },] },
|
727 | ];
|
728 | return AuthSilentPage;
|
729 | }());
|
730 |
|
731 | /**
|
732 | * @fileoverview added by tsickle
|
733 | * @suppress {checkTypes} checked by tsc
|
734 | */
|
735 | var /** @type {?} */ routes = [
|
736 | {
|
737 | path: 'auth',
|
738 | component: AuthPage
|
739 | },
|
740 | {
|
741 | path: 'auth/silent',
|
742 | component: AuthSilentPage
|
743 | },
|
744 | ];
|
745 | var /** @type {?} */ AUTH_ROUTING = RouterModule.forChild(routes);
|
746 |
|
747 | /**
|
748 | * @fileoverview added by tsickle
|
749 | * @suppress {checkTypes} checked by tsc
|
750 | */
|
751 | var NacoViewModule = /** @class */ (function () {
|
752 | function NacoViewModule() {
|
753 | }
|
754 | NacoViewModule.decorators = [
|
755 | { type: NgModule, args: [{
|
756 | imports: [
|
757 | AUTH_ROUTING,
|
758 | ],
|
759 | declarations: [
|
760 | AuthPage,
|
761 | AuthSilentPage,
|
762 | ],
|
763 | },] },
|
764 | ];
|
765 | return NacoViewModule;
|
766 | }());
|
767 |
|
768 | /**
|
769 | * @fileoverview added by tsickle
|
770 | * @suppress {checkTypes} checked by tsc
|
771 | */
|
772 | var NacoModule = /** @class */ (function () {
|
773 | function NacoModule() {
|
774 | }
|
775 | /**
|
776 | * @param {?} config
|
777 | * @return {?}
|
778 | */
|
779 | NacoModule.forRoot = /**
|
780 | * @param {?} config
|
781 | * @return {?}
|
782 | */
|
783 | function (config) {
|
784 | return {
|
785 | ngModule: NacoModule,
|
786 | providers: [
|
787 | {
|
788 | provide: NACO_CONFIG,
|
789 | useValue: config,
|
790 | },
|
791 | {
|
792 | provide: NacoService,
|
793 | useFactory: nacoFactory,
|
794 | deps: [NACO_CONFIG, Router, Storage, HttpClient, Location],
|
795 | },
|
796 | AuthenticatedGuard,
|
797 | ],
|
798 | };
|
799 | };
|
800 | NacoModule.decorators = [
|
801 | { type: NgModule, args: [{
|
802 | imports: [
|
803 | UbudStorageModule,
|
804 | NacoViewModule,
|
805 | ],
|
806 | },] },
|
807 | ];
|
808 | return NacoModule;
|
809 | }());
|
810 |
|
811 | /**
|
812 | * @fileoverview added by tsickle
|
813 | * @suppress {checkTypes} checked by tsc
|
814 | */
|
815 |
|
816 | /**
|
817 | * @fileoverview added by tsickle
|
818 | * @suppress {checkTypes} checked by tsc
|
819 | */
|
820 |
|
821 | export { NacoService, User, Signature, Config, AuthenticatedGuard, AuthInterceptor, NacoModule, NACO_CONFIG as ɵf, nacoFactory as ɵe, NacoViewModule as ɵa, AuthSilentPage as ɵd, AuthPage as ɵc, AUTH_ROUTING as ɵb };
|
822 |
|
823 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFrZXItbmFjby5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQG5ha2VyL25hY28vZG9tYWlucy92YWx1ZXMvY29uZmlnLnRzIiwibmc6Ly9AbmFrZXIvbmFjby9kb21haW5zL21vZGVscy91c2VyLnRzIiwibmc6Ly9AbmFrZXIvbmFjby9kb21haW5zL3NlcnZpY2VzL25hY28uc2VydmljZS50cyIsIm5nOi8vQG5ha2VyL25hY28vZG9tYWlucy92YWx1ZXMvc2lnbmF0dXJlLnRzIiwibmc6Ly9AbmFrZXIvbmFjby9ndWFyZHMvYXV0aGVudGljYXRlZC5ndWFyZC50cyIsIm5nOi8vQG5ha2VyL25hY28vaW50ZXJjZXB0b3JzL2F1dGguaW50ZXJjZXB0b3IudHMiLCJuZzovL0BuYWtlci9uYWNvL2ZhY3Rvcmllcy9uYWNvLWZhY3RvcnkudHMiLCJuZzovL0BuYWtlci9uYWNvL3ZpZXdzL3BhZ2VzL2F1dGgucGFnZS50cyIsIm5nOi8vQG5ha2VyL25hY28vdmlld3MvcGFnZXMvYXV0aC1zaWxlbnQucGFnZS50cyIsIm5nOi8vQG5ha2VyL25hY28vdmlld3Mvcm91dGVzLnRzIiwibmc6Ly9AbmFrZXIvbmFjby92aWV3cy9tb2R1bGUudHMiLCJuZzovL0BuYWtlci9uYWNvL25hY28ubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBDb25maWcge1xuICAgIHB1YmxpYyBlbmRwb2ludDogc3RyaW5nID0gJ2h0dHBzOi8vYWNjb3VudC5rZW1uYWtlci5nby5pZCc7XG4gICAgcHVibGljIGNsaWVudElkOiBzdHJpbmc7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZGF0YT86IFBhcnRpYWw8Q29uZmlnPikge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFR5cGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5cbmV4cG9ydCBjbGFzcyBVc2VyIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZztcbiAgICBwdWJsaWMgdXNlcm5hbWU6IHN0cmluZztcbiAgICBwdWJsaWMgZW1haWw/OiBzdHJpbmc7XG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcbiAgICBwdWJsaWMgc3RhdHVzOiBudW1iZXI7XG5cbiAgICBAVHlwZShmb3J3YXJkUmVmKCgpID0+IERhdGUpIGFzIGFueSlcbiAgICBwdWJsaWMgdXBkYXRlZEF0OiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFN0b3JhZ2UgfSBmcm9tICdAdWJ1ZC9zdG9yYWdlJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uL3ZhbHVlcy9jb25maWcnO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uL21vZGVscy91c2VyJztcbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlLCBPYnNlcnZlciwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFNpZ25hdHVyZSB9IGZyb20gJy4uL3ZhbHVlcy9zaWduYXR1cmUnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UgfSBmcm9tICdyeGpzL2ludGVybmFsL29ic2VydmFibGUvZnJvbVByb21pc2UnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvaW50ZXJuYWwvb3BlcmF0b3JzJztcbmltcG9ydCB7IHBsYWluVG9DbGFzcyB9IGZyb20gJ2NsYXNzLXRyYW5zZm9ybWVyJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRXJyb3JPYnNlcnZhYmxlIH0gZnJvbSAncnhqcy1jb21wYXQvb2JzZXJ2YWJsZS9FcnJvck9ic2VydmFibGUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTmFjb1NlcnZpY2Uge1xuICAgIHB1YmxpYyByZWFkb25seSBWRVJTSU9OID0gJ3YxJztcblxuICAgIHByaXZhdGUgc2lnbmF0dXJlOiBTaWduYXR1cmUgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHVzZXI6IFVzZXIgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHJlZnJlc2hUb2tlbjogU2lnbmF0dXJlIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBjbGllbnRTZWNyZXQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnOiBDb25maWcsIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsIHByaXZhdGUgc3RvcmFnZTogU3RvcmFnZSwgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbikge1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRVc2VyKHVzZXI6IFVzZXIgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXNlciA9IHVzZXI7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoJ3VzZXInLCB1c2VyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VXNlcigpOiBPYnNlcnZhYmxlPFVzZXIgfCBudWxsPiB7XG4gICAgICAgIGlmIChudWxsICE9PSB0aGlzLnVzZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBvZih0aGlzLnVzZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKHRoaXMuc3RvcmFnZS5nZXQoJ3VzZXInKSkucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgodXNlcjogVXNlciB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gdXNlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodXNlcik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgdXJpID0gdGhpcy5nZXRVcmkoJy91c2Vycy9tZScpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKHRoaXMuZ2V0U2lnbmF0dXJlKCkpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoc2lnbmF0dXJlOiBTaWduYXR1cmUgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gc2lnbmF0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYCR7c2lnbmF0dXJlLnR5cGV9ICR7c2lnbmF0dXJlLnRva2VufWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4odXJpLCBvcHRpb25zKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGFyZSBubyBib2R5IHRvIGJlIHRyYW5zZm9ybWVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0aFVzZXI6IGFueSA9IHBsYWluVG9DbGFzcyhVc2VyLCBkYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFVzZXIoYXV0aFVzZXIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdXRoVXNlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoNDAxID09PSBlLnN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFVzZXIoKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgocmVmcmVzaFVzZXI6IFVzZXIgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZyZXNoVXNlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHJlZnJlc2hVc2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFcnJvck9ic2VydmFibGUuY3JlYXRlKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFcnJvck9ic2VydmFibGUuY3JlYXRlKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTaWduYXR1cmUoKTogUHJvbWlzZTxTaWduYXR1cmUgfCBudWxsPiB7XG4gICAgICAgIGlmIChudWxsICE9PSB0aGlzLnNpZ25hdHVyZSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnNpZ25hdHVyZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldCgnc2lnbmF0dXJlJyk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFNpZ25hdHVyZShzaWduYXR1cmU6IFNpZ25hdHVyZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNpZ25hdHVyZSA9IHNpZ25hdHVyZTtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldCgnc2lnbmF0dXJlJywgc2lnbmF0dXJlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q2xpZW50U2VjcmV0KHNlY3JldDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2xpZW50U2VjcmV0ID0gc2VjcmV0O1xuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0KCdjbGllbnRfc2VjcmV0Jywgc2VjcmV0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UmVmcmVzaFRva2VuKHJlZnJlc2hUb2tlbjogU2lnbmF0dXJlKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVmcmVzaFRva2VuID0gcmVmcmVzaFRva2VuO1xuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0KCdyZWZyZXNoX3Rva2VuJywgcmVmcmVzaFRva2VuKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVmcmVzaFVzZXIoc2NvcGVzPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxVc2VyIHwgbnVsbD4ge1xuICAgICAgICB0aGlzLnNldFVzZXIobnVsbCk7XG4gICAgICAgIHRoaXMuc2V0U2lnbmF0dXJlKG51bGwpO1xuXG4gICAgICAgIHJldHVybiBmb3JrSm9pbih0aGlzLmdldFJlZnJlc2hUb2tlbigpLCB0aGlzLmdldENsaWVudFNlY3JldCgpKS5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKChyZXN1bHRzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZyZXNoVG9rZW46IFNpZ25hdHVyZSA9IHJlc3VsdHNbMF07XG4gICAgICAgICAgICAgICAgY29uc3QgY2xpZW50U2VjcmV0OiBzdHJpbmcgPSByZXN1bHRzWzFdO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlZnJlc2hUb2tlbiAmJiBjbGllbnRTZWNyZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFdpdGhSZWZyZXNoVG9rZW4oY2xpZW50U2VjcmV0LCByZWZyZXNoVG9rZW4udG9rZW4sIHNjb3Blcyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFdpdGhTaWxlbnRBdXRoKCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVmcmVzaFdpdGhSZWZyZXNoVG9rZW4oY2xpZW50U2VjcmV0OiBzdHJpbmcsIHJlZnJlc2hUb2tlbjogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPFVzZXIgfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmh0dHAucG9zdCh0aGlzLmdldFVyaSgnL3Rva2VucycpLCB7XG4gICAgICAgICAgICBncmFudF90eXBlOiAncmVmcmVzaF90b2tlbicsXG4gICAgICAgICAgICBzY29wZXM6IHNjb3BlcyB8fCAnYmFzaWMgZW1haWwnLFxuICAgICAgICAgICAgY2xpZW50X2lkOiB0aGlzLmNvbmZpZy5jbGllbnRJZCxcbiAgICAgICAgICAgIGNsaWVudF9zZWNyZXQ6IGNsaWVudFNlY3JldCxcbiAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IHJlZnJlc2hUb2tlbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlcXVlc3QucGlwZShcbiAgICAgICAgICAgIHRhcCgodG9rZW5zOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodG9rZW5zICYmIHRva2Vucy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U2lnbmF0dXJlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXNJbjogdG9rZW5zLmRhdGEuZXhwaXJlc19pbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRva2Vucy5kYXRhLnRva2VuX3R5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogdG9rZW5zLmRhdGEuYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFJlZnJlc2hUb2tlbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0b2tlbnMuZGF0YS50b2tlbl90eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IHRva2Vucy5kYXRhLnJlZnJlc2hfdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbWFwKCh0b2tlbnM6IGFueSkgPT4gdG9rZW5zICYmIHRva2Vucy5kYXRhKSxcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoaGFzVG9rZW46IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VXNlcigpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWZyZXNoV2l0aFNpbGVudEF1dGgoKTogT2JzZXJ2YWJsZTxVc2VyIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8VXNlciB8IG51bGw+KChvYnNlcnZlcjogT2JzZXJ2ZXI8VXNlciB8IG51bGw+KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWRpcmVjdFVyaSA9IHRoaXMuZ2V0Q3VycmVudE9yaWdpbignYXV0aC9zaWxlbnQnKTtcbiAgICAgICAgICAgIGNvbnN0IHVyaSA9IHRoaXMubG9naW4oJ2Jhc2ljIGVtYWlsJywgcmVkaXJlY3RVcmkpO1xuXG4gICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgICAgICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIHVyaSk7XG4gICAgICAgICAgICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgaWZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVlcnlTdHJpbmcgPSBpZnJhbWUuY29udGVudFdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmcmFtZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWVyeVBhcnRzID0gcXVlcnlTdHJpbmcuc3BsaXQoJyYnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcXVlcnlQYXJ0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1QYXJ0cyA9IGl0ZW0uc3BsaXQoJz0nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1tpdGVtUGFydHNbMF1dID0gaXRlbVBhcnRzWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KCdhY2Nlc3NfdG9rZW4nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gcGFyYW1zWydzdGF0ZSddIHx8IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgIT09IGF3YWl0IHRoaXMuZ2V0U3RhdGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNpZ25hdHVyZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiBwYXJhbXNbJ2FjY2Vzc190b2tlbiddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBwYXJhbXNbJ3Rva2VuX3R5cGUnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlc0luOiBwYXJhbXNbJ3R0bCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuZ2V0VXNlcigpLnRvUHJvbWlzZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRVc2VyKHVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQodXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGZhbHNlKTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9naW4oc2NvcGVzOiBzdHJpbmcsIHJlZGlyZWN0VXJpPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFyZWRpcmVjdFVyaSkge1xuICAgICAgICAgICAgcmVkaXJlY3RVcmkgPSB0aGlzLnJvdXRlci51cmw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2VuZXJhdGVTdGF0ZSgpO1xuXG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoJ3N0YXRlJywgc3RhdGUpO1xuXG4gICAgICAgIGNvbnN0IHF1ZXJ5OiBzdHJpbmcgPSB0aGlzLmJ1aWxkUXVlcnlTdHJpbmcoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgJ3Jlc3BvbnNlX3R5cGUnOiAndG9rZW4nLFxuICAgICAgICAgICAgICAgICdzY29wZXMnOiBzY29wZXMsXG4gICAgICAgICAgICAgICAgJ2NsaWVudCc6IHRoaXMuY29uZmlnLmNsaWVudElkLFxuICAgICAgICAgICAgICAgICdzdGF0ZSc6IHN0YXRlLFxuICAgICAgICAgICAgICAgICdjb250aW51ZSc6IHJlZGlyZWN0VXJpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuZW5kcG9pbnQgKyAnL2F1dGg/JyArIHF1ZXJ5O1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2dvdXQocmVkaXJlY3RVcmk/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICB0aGlzLnNpZ25hdHVyZSA9IG51bGw7XG4gICAgICAgIHRoaXMudXNlciA9IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoJ3NpZ25hdHVyZScpLFxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoJ3VzZXInKSxcbiAgICAgICAgICAgIF0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBlbmRwb2ludCA9IHRoaXMuY29uZmlnLmVuZHBvaW50ICsgJy9hdXRoL2xvZ291dCc7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVkaXJlY3RVcmkpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQgKz0gJz9jb250aW51ZT0nICsgcmVkaXJlY3RVcmk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShlbmRwb2ludCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN0YXRlKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldCgnc3RhdGUnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYnVpbGROZXN0ZWRVcmkocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBzdHJpbmcge1xuICAgICAgICBsZXQgdXJpID0gJyc7XG5cbiAgICAgICAgaWYgKHJvdXRlLnJvdXRlQ29uZmlnICYmIHJvdXRlLnJvdXRlQ29uZmlnLnBhdGgpIHtcbiAgICAgICAgICAgIHVyaSArPSAnLycgKyByb3V0ZS5yb3V0ZUNvbmZpZy5wYXRoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvdXRlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICByb3V0ZS5jaGlsZHJlbi5mb3JFYWNoKChpdGVtOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KSA9PiB7XG4gICAgICAgICAgICAgICAgdXJpICs9IHRoaXMuYnVpbGROZXN0ZWRVcmkoaXRlbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cmk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRSZWZyZXNoVG9rZW4oKTogUHJvbWlzZTxTaWduYXR1cmUgfCBudWxsPiB7XG4gICAgICAgIGlmIChudWxsICE9PSB0aGlzLnJlZnJlc2hUb2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnJlZnJlc2hUb2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldCgncmVmcmVzaF90b2tlbicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q2xpZW50U2VjcmV0KCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICBpZiAobnVsbCAhPT0gdGhpcy5jbGllbnRTZWNyZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5jbGllbnRTZWNyZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXQoJ2NsaWVudF9zZWNyZXQnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFVyaShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuZW5kcG9pbnQgKyAnL2FwaS8nICsgdGhpcy5WRVJTSU9OICsgcGF0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q3VycmVudE9yaWdpbihwYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyB0aGlzLmxvY2F0aW9uLnByZXBhcmVFeHRlcm5hbFVybChwYXRoIHx8ICcnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlU3RhdGUoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcG9zc2libGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknO1xuICAgICAgICBsZXQgdGV4dCA9ICcnO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gICAgICAgICAgICB0ZXh0ICs9IHBvc3NpYmxlLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBwb3NzaWJsZS5sZW5ndGgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cblxuICAgIHByaXZhdGUgYnVpbGRRdWVyeVN0cmluZyhwYXJhbXM6IG9iamVjdCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gT2JqZWN0LmtleXMocGFyYW1zKS5tYXAoKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zW2tleV0pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcXVlcnlQYXJhbXMuam9pbignJicpO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBTaWduYXR1cmUge1xuICAgIHB1YmxpYyBleHBpcmVzSW4/OiBudW1iZXI7XG4gICAgcHVibGljIHRva2VuOiBzdHJpbmc7XG4gICAgcHVibGljIHR5cGU6IHN0cmluZztcbn1cbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENhbkFjdGl2YXRlLCBDYW5BY3RpdmF0ZUNoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE5hY29TZXJ2aWNlIH0gZnJvbSAnLi4vZG9tYWlucy9zZXJ2aWNlcy9uYWNvLnNlcnZpY2UnO1xuaW1wb3J0IHsgZmlyc3QsIG1hcCB9IGZyb20gJ3J4anMvaW50ZXJuYWwvb3BlcmF0b3JzJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi9kb21haW5zL21vZGVscy91c2VyJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFN0b3JhZ2UgfSBmcm9tICdAdWJ1ZC9zdG9yYWdlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXIvc3JjL3JvdXRlcl9zdGF0ZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybUxvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEF1dGhlbnRpY2F0ZWRHdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlLCBDYW5BY3RpdmF0ZUNoaWxkIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBuYWNvOiBOYWNvU2VydmljZSwgcHJpdmF0ZSBzdG9yYWdlOiBTdG9yYWdlLCBwcml2YXRlIHBsYXRmb3JtTG9jYXRpb246IFBsYXRmb3JtTG9jYXRpb24pIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuQWN0aXZhdGUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFjby5nZXRVc2VyKCkucGlwZShcbiAgICAgICAgICAgIGZpcnN0KCksXG4gICAgICAgICAgICBtYXAoKHVzZXI6IFVzZXIgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IHVzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IHRoaXMucnRyaW0oKHRoaXMucGxhdGZvcm1Mb2NhdGlvbiBhcyBhbnkpLmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmkgPSB0aGlzLm5hY28uYnVpbGROZXN0ZWRVcmkocm91dGUucm9vdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBiYXNlLnJlcGxhY2UodXJpLCAnJykgKyAnLycgKyB0aGlzLmx0cmltKHVyaSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbiA9IGJhc2UucmVwbGFjZSh1cmksICcnKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0KCduYWNvX2ludGVuZGVkX3VybCcsIG5leHQpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLm5hY28ubG9naW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jhc2ljIGVtYWlsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW4gKyAnL2F1dGgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuICEhdXNlcjtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5BY3RpdmF0ZUNoaWxkKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbkFjdGl2YXRlKHJvdXRlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGx0cmltKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL15cXC8rLywnJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBydHJpbSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXC8rJC8sJycpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwRXZlbnQsIEh0dHBIYW5kbGVyLCBIdHRwSW50ZXJjZXB0b3IsIEh0dHBSZXF1ZXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTmFjb1NlcnZpY2UgfSBmcm9tICcuLi9kb21haW5zL3NlcnZpY2VzL25hY28uc2VydmljZSc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSB9IGZyb20gJ3J4anMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9mcm9tUHJvbWlzZSc7XG5pbXBvcnQgeyBTaWduYXR1cmUgfSBmcm9tICcuLi9kb21haW5zL3ZhbHVlcy9zaWduYXR1cmUnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRXJyb3JPYnNlcnZhYmxlIH0gZnJvbSAncnhqcy1jb21wYXQvb2JzZXJ2YWJsZS9FcnJvck9ic2VydmFibGUnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXV0aEludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBuYWNvOiBOYWNvU2VydmljZSkge1xuICAgIH1cblxuICAgIHB1YmxpYyBpbnRlcmNlcHQocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcbiAgICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKHRoaXMubmFjby5nZXRTaWduYXR1cmUoKSkucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoc2lnbmF0dXJlOiBTaWduYXR1cmUgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFzaWduYXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHRcbiAgICAgICAgICAgICAgICAgICAgLmhhbmRsZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5jbG9uZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgJHtzaWduYXR1cmUudHlwZX0gJHtzaWduYXR1cmUudG9rZW59YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFjby5yZWZyZXNoVXNlcigpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHVzZXI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcm9tUHJvbWlzZSh0aGlzLm5hY28uZ2V0U2lnbmF0dXJlKCkpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKG5ld1NpZ25hdHVyZTogU2lnbmF0dXJlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEuY2xvbmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGAke25ld1NpZ25hdHVyZS50eXBlfSAke25ld1NpZ25hdHVyZS50b2tlbn1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFcnJvck9ic2VydmFibGUuY3JlYXRlKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFcnJvck9ic2VydmFibGUuY3JlYXRlKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgTmFjb1NlcnZpY2UgfSBmcm9tICcuLi9kb21haW5zL3NlcnZpY2VzL25hY28uc2VydmljZSc7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLi9kb21haW5zL3ZhbHVlcy9jb25maWcnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFN0b3JhZ2UgfSBmcm9tICdAdWJ1ZC9zdG9yYWdlJztcbmltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5leHBvcnQgZnVuY3Rpb24gbmFjb0ZhY3RvcnkoY29uZmlnOiBvYmplY3QsIHJvdXRlcjogUm91dGVyLCBzdG9yYWdlOiBTdG9yYWdlLCBodHRwOiBIdHRwQ2xpZW50LCBsb2NhdGlvbjogTG9jYXRpb24pIHtcbiAgICByZXR1cm4gbmV3IE5hY29TZXJ2aWNlKFxuICAgICAgICBuZXcgQ29uZmlnKHsgLi4uY29uZmlnIH0pLFxuICAgICAgICByb3V0ZXIsXG4gICAgICAgIHN0b3JhZ2UsXG4gICAgICAgIGh0dHAsXG4gICAgICAgIGxvY2F0aW9uXG4gICAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IE5BQ09fQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPG9iamVjdD4oJ05BQ09fQ09ORklHJyk7XG4iLCJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTmFjb1NlcnZpY2UgfSBmcm9tICcuLi8uLi9kb21haW5zL3NlcnZpY2VzL25hY28uc2VydmljZSc7XG5pbXBvcnQgeyBTaWduYXR1cmUgfSBmcm9tICcuLi8uLi9kb21haW5zL3ZhbHVlcy9zaWduYXR1cmUnO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL2RvbWFpbnMvbW9kZWxzL3VzZXInO1xuaW1wb3J0IHsgU3RvcmFnZSB9IGZyb20gJ0B1YnVkL3N0b3JhZ2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25ha2VyLWF1dGgtcGFnZScsXG4gICAgdGVtcGxhdGU6ICd7eyBtZXNzYWdlIH19Jyxcbn0pXG5leHBvcnQgY2xhc3MgQXV0aFBhZ2Uge1xuICAgIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmcgPSAnQXV0aGVudGljYXRpbmcuLi4nO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLCBwcml2YXRlIG5hY286IE5hY29TZXJ2aWNlLCBwcml2YXRlIHN0b3JhZ2U6IFN0b3JhZ2UpIHtcbiAgICAgICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5zdWJzY3JpYmUoKHBhcmFtczogUGFyYW1zKSA9PiB0aGlzLmhhbmRsZShwYXJhbXMpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFuZGxlKHBhcmFtczogUGFyYW1zKTogdm9pZCB7XG4gICAgICAgIGlmIChwYXJhbXMuc3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMubmFjby5nZXRTdGF0ZSgpLnRoZW4oKHN0YXRlOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlICE9PSBwYXJhbXMuc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gJ0ludmFsaWQgQ1NSRic7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuYXV0aGVudGljYXRlKHBhcmFtcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXV0aGVudGljYXRlKHBhcmFtcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGF1dGhlbnRpY2F0ZShwYXJhbXM6IFBhcmFtcyk6IHZvaWQge1xuICAgICAgICBjb25zdCBzaWduYXR1cmU6IFNpZ25hdHVyZSA9IHtcbiAgICAgICAgICAgIGV4cGlyZXNJbjogcGFyYW1zLmV4cGlyZXNfaW4sXG4gICAgICAgICAgICB0eXBlOiBwYXJhbXMudG9rZW5fdHlwZSxcbiAgICAgICAgICAgIHRva2VuOiBwYXJhbXMuYWNjZXNzX3Rva2VuLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMubmFjby5zZXRTaWduYXR1cmUoc2lnbmF0dXJlKTtcblxuICAgICAgICB0aGlzLm5hY28uZ2V0VXNlcigpLnN1YnNjcmliZSgodXNlcjogVXNlciB8IG51bGwpID0+IHtcbiAgICAgICAgICAgIGlmIChudWxsICE9PSB1c2VyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlLmdldCgnbmFjb19pbnRlbmRlZF91cmwnKS50aGVuKCh1cmw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlKCduYWNvX2ludGVuZGVkX3VybCcpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmwgPyB1cmwgOiAnLyc7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSAnVW5hdXRoZW50aWNhdGVkISc7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmFrZXItYXV0aC1zaWxlbnQnLFxuICAgIHRlbXBsYXRlOiAnUHJvY2Vzc2luZyBzaWxlbnQgYXV0aC4uLicsXG59KVxuZXhwb3J0IGNsYXNzIEF1dGhTaWxlbnRQYWdlIHtcbn1cbiIsImltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlck1vZHVsZSwgUm91dGVzIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEF1dGhQYWdlIH0gZnJvbSAnLi9wYWdlcy9hdXRoLnBhZ2UnO1xuaW1wb3J0IHsgQXV0aFNpbGVudFBhZ2UgfSBmcm9tICcuL3BhZ2VzL2F1dGgtc2lsZW50LnBhZ2UnO1xuXG5jb25zdCByb3V0ZXM6IFJvdXRlcyA9IFtcbiAgICB7XG4gICAgICAgIHBhdGg6ICdhdXRoJyxcbiAgICAgICAgY29tcG9uZW50OiBBdXRoUGFnZVxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXRoOiAnYXV0aC9zaWxlbnQnLFxuICAgICAgICBjb21wb25lbnQ6IEF1dGhTaWxlbnRQYWdlXG4gICAgfSxcbl07XG5cbmV4cG9ydCBjb25zdCBBVVRIX1JPVVRJTkc6IE1vZHVsZVdpdGhQcm92aWRlcnMgPSBSb3V0ZXJNb2R1bGUuZm9yQ2hpbGQocm91dGVzKTtcbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBVVRIX1JPVVRJTkcgfSBmcm9tICcuL3JvdXRlcyc7XG5pbXBvcnQgeyBBdXRoUGFnZSB9IGZyb20gJy4vcGFnZXMvYXV0aC5wYWdlJztcbmltcG9ydCB7IEF1dGhTaWxlbnRQYWdlIH0gZnJvbSAnLi9wYWdlcy9hdXRoLXNpbGVudC5wYWdlJztcblxuQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIEFVVEhfUk9VVElORyxcbiAgICBdLFxuICAgIGRlY2xhcmF0aW9uczogW1xuICAgICAgICBBdXRoUGFnZSxcbiAgICAgICAgQXV0aFNpbGVudFBhZ2UsXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTmFjb1ZpZXdNb2R1bGUge1xufVxuIiwiaW1wb3J0IHsgTW9kdWxlV2l0aFByb3ZpZGVycywgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5hY29TZXJ2aWNlIH0gZnJvbSAnLi9kb21haW5zL3NlcnZpY2VzL25hY28uc2VydmljZSc7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkR3VhcmQgfSBmcm9tICcuL2d1YXJkcy9hdXRoZW50aWNhdGVkLmd1YXJkJztcbmltcG9ydCB7IE5BQ09fQ09ORklHLCBuYWNvRmFjdG9yeSB9IGZyb20gJy4vZmFjdG9yaWVzL25hY28tZmFjdG9yeSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3RvcmFnZSwgVWJ1ZFN0b3JhZ2VNb2R1bGUgfSBmcm9tICdAdWJ1ZC9zdG9yYWdlJztcbmltcG9ydCB7IE5hY29WaWV3TW9kdWxlIH0gZnJvbSAnLi92aWV3cy9tb2R1bGUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIFVidWRTdG9yYWdlTW9kdWxlLFxuICAgICAgICBOYWNvVmlld01vZHVsZSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBOYWNvTW9kdWxlIHtcbiAgICBwdWJsaWMgc3RhdGljIGZvclJvb3QoY29uZmlnOiB7IGNsaWVudElkOiBzdHJpbmcsIGVuZHBvaW50Pzogc3RyaW5nIH0pOiBNb2R1bGVXaXRoUHJvdmlkZXJzIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5nTW9kdWxlOiBOYWNvTW9kdWxlLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBOQUNPX0NPTkZJRyxcbiAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IGNvbmZpZyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTmFjb1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IG5hY29GYWN0b3J5LFxuICAgICAgICAgICAgICAgICAgICBkZXBzOiBbTkFDT19DT05GSUcsIFJvdXRlciwgU3RvcmFnZSwgSHR0cENsaWVudCwgTG9jYXRpb25dLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgQXV0aGVudGljYXRlZEd1YXJkLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iXSwibmFtZXMiOlsidHNsaWJfMS5fX3ZhbHVlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUE7b0JBSXVCLElBQXNCO3dCQUhmLGdDQUFnQztRQUl0RCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzs7aUJBTGxDO0lBT0M7Ozs7Ozs7Ozs7UUNHSSxJQUFJLG1CQUFDLFVBQVUsQ0FBQyxjQUFNLE9BQUEsSUFBSSxHQUFBLENBQVEsRUFBQztrQ0FDbEIsSUFBSTs7ZUFYMUI7Ozs7Ozs7O3lCQ3VCK0IsTUFBYyxFQUFVLE1BQWMsRUFBVSxPQUFnQixFQUFVLElBQWdCLEVBQVUsUUFBa0I7UUFBdEgsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVU7dUJBUHZILElBQUk7eUJBRVEsSUFBSTtvQkFDZCxJQUFJOzRCQUNTLElBQUk7NEJBQ1AsSUFBSTs7Ozs7O0lBS25DLDZCQUFPOzs7O2NBQUMsSUFBaUI7UUFDNUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDOzs7OztJQUc1Qiw2QkFBTzs7Ozs7UUFDVixJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ3BCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4QjtRQUVELE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUM3QyxTQUFTLENBQUMsVUFBQyxJQUFpQjtZQUN4QixJQUFJLElBQUksS0FBSyxJQUFJ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 |
\ | No newline at end of file |