UNPKG

106 kBJavaScriptView Raw
1(function (global, factory) {
2 typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('class-transformer'), require('@angular/router'), require('@ubud/storage'), require('rxjs'), require('rxjs/internal/observable/fromPromise'), require('rxjs/internal/operators'), require('@angular/common/http'), require('@angular/common'), require('rxjs-compat/observable/ErrorObservable')) :
3 typeof define === 'function' && define.amd ? define('@naker/naco', ['exports', '@angular/core', 'class-transformer', '@angular/router', '@ubud/storage', 'rxjs', 'rxjs/internal/observable/fromPromise', 'rxjs/internal/operators', '@angular/common/http', '@angular/common', 'rxjs-compat/observable/ErrorObservable'], factory) :
4 (factory((global.naker = global.naker || {}, global.naker.naco = {}),global.ng.core,null,global.ng.router,null,global.rxjs,global.rxjs['internal/observable/fromPromise'],global.rxjs['internal/operators'],global.ng.common.http,global.ng.common,null));
5}(this, (function (exports,core,classTransformer,router,storage,rxjs,fromPromise,operators,http,common,ErrorObservable) { 'use strict';
6
7 /*! *****************************************************************************
8 Copyright (c) Microsoft Corporation. All rights reserved.
9 Licensed under the Apache License, Version 2.0 (the "License"); you may not use
10 this file except in compliance with the License. You may obtain a copy of the
11 License at http://www.apache.org/licenses/LICENSE-2.0
12
13 THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
15 WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
16 MERCHANTABLITY OR NON-INFRINGEMENT.
17
18 See the Apache Version 2.0 License for specific language governing permissions
19 and limitations under the License.
20 ***************************************************************************** */
21 var __assign = function () {
22 __assign = Object.assign || function __assign(t) {
23 for (var s, i = 1, n = arguments.length; i < n; i++) {
24 s = arguments[i];
25 for (var p in s)
26 if (Object.prototype.hasOwnProperty.call(s, p))
27 t[p] = s[p];
28 }
29 return t;
30 };
31 return __assign.apply(this, arguments);
32 };
33 function __decorate(decorators, target, key, desc) {
34 var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
35 if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
36 r = Reflect.decorate(decorators, target, key, desc);
37 else
38 for (var i = decorators.length - 1; i >= 0; i--)
39 if (d = decorators[i])
40 r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
41 return c > 3 && r && Object.defineProperty(target, key, r), r;
42 }
43 function __metadata(metadataKey, metadataValue) {
44 if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
45 return Reflect.metadata(metadataKey, metadataValue);
46 }
47 function __awaiter(thisArg, _arguments, P, generator) {
48 return new (P || (P = Promise))(function (resolve, reject) {
49 function fulfilled(value) { try {
50 step(generator.next(value));
51 }
52 catch (e) {
53 reject(e);
54 } }
55 function rejected(value) { try {
56 step(generator["throw"](value));
57 }
58 catch (e) {
59 reject(e);
60 } }
61 function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
62 step((generator = generator.apply(thisArg, _arguments || [])).next());
63 });
64 }
65 function __generator(thisArg, body) {
66 var _ = { label: 0, sent: function () { if (t[0] & 1)
67 throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
68 return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g;
69 function verb(n) { return function (v) { return step([n, v]); }; }
70 function step(op) {
71 if (f)
72 throw new TypeError("Generator is already executing.");
73 while (_)
74 try {
75 if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
76 return t;
77 if (y = 0, t)
78 op = [op[0] & 2, t.value];
79 switch (op[0]) {
80 case 0:
81 case 1:
82 t = op;
83 break;
84 case 4:
85 _.label++;
86 return { value: op[1], done: false };
87 case 5:
88 _.label++;
89 y = op[1];
90 op = [0];
91 continue;
92 case 7:
93 op = _.ops.pop();
94 _.trys.pop();
95 continue;
96 default:
97 if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
98 _ = 0;
99 continue;
100 }
101 if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
102 _.label = op[1];
103 break;
104 }
105 if (op[0] === 6 && _.label < t[1]) {
106 _.label = t[1];
107 t = op;
108 break;
109 }
110 if (t && _.label < t[2]) {
111 _.label = t[2];
112 _.ops.push(op);
113 break;
114 }
115 if (t[2])
116 _.ops.pop();
117 _.trys.pop();
118 continue;
119 }
120 op = body.call(thisArg, _);
121 }
122 catch (e) {
123 op = [6, e];
124 y = 0;
125 }
126 finally {
127 f = t = 0;
128 }
129 if (op[0] & 5)
130 throw op[1];
131 return { value: op[0] ? op[1] : void 0, done: true };
132 }
133 }
134 function __values(o) {
135 var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
136 if (m)
137 return m.call(o);
138 return {
139 next: function () {
140 if (o && i >= o.length)
141 o = void 0;
142 return { value: o && o[i++], done: !o };
143 }
144 };
145 }
146
147 /**
148 * @fileoverview added by tsickle
149 * @suppress {checkTypes} checked by tsc
150 */
151 var Config = /** @class */ (function () {
152 function Config(data) {
153 this.endpoint = 'https://account.kemnaker.go.id';
154 Object.assign(this, data);
155 }
156 return Config;
157 }());
158
159 /**
160 * @fileoverview added by tsickle
161 * @suppress {checkTypes} checked by tsc
162 */
163 var User = /** @class */ (function () {
164 function User() {
165 }
166 __decorate([
167 classTransformer.Type(/** @type {?} */ (core.forwardRef(function () { return Date; }))),
168 __metadata("design:type", Date)
169 ], User.prototype, "updatedAt", void 0);
170 return User;
171 }());
172
173 /**
174 * @fileoverview added by tsickle
175 * @suppress {checkTypes} checked by tsc
176 */
177 var NacoService = /** @class */ (function () {
178 function NacoService(config, router$$1, storage$$1, http$$1, location) {
179 this.config = config;
180 this.router = router$$1;
181 this.storage = storage$$1;
182 this.http = http$$1;
183 this.location = location;
184 this.VERSION = 'v1';
185 this.signature = null;
186 this.user = null;
187 this.refreshToken = null;
188 this.clientSecret = null;
189 }
190 /**
191 * @param {?} user
192 * @return {?}
193 */
194 NacoService.prototype.setUser = /**
195 * @param {?} user
196 * @return {?}
197 */
198 function (user) {
199 this.user = user;
200 this.storage.set('user', user);
201 };
202 /**
203 * @return {?}
204 */
205 NacoService.prototype.getUser = /**
206 * @return {?}
207 */
208 function () {
209 var _this = this;
210 if (null !== this.user) {
211 return rxjs.of(this.user);
212 }
213 return fromPromise.fromPromise(this.storage.get('user')).pipe(operators.switchMap(function (user) {
214 if (user) {
215 return rxjs.of(user);
216 }
217 var /** @type {?} */ uri = _this.getUri('/users/me');
218 return fromPromise.fromPromise(_this.getSignature()).pipe(operators.switchMap(function (signature) {
219 if (null === signature) {
220 return _this.refreshUser();
221 }
222 var /** @type {?} */ options = {
223 headers: {
224 Authorization: signature.type + " " + signature.token,
225 },
226 };
227 return _this.http.get(uri, options).pipe(operators.map(function (res) {
228 if (res.data) {
229 return res.data;
230 }
231 throw new Error('There are no body to be transformed');
232 }), operators.map(function (data) {
233 var /** @type {?} */ authUser = classTransformer.plainToClass(User, data);
234 _this.setUser(authUser);
235 return authUser;
236 }), operators.catchError(function (e) {
237 if (401 === e.status) {
238 return _this.refreshUser().pipe(operators.switchMap(function (refreshUser) {
239 if (refreshUser) {
240 return rxjs.of(refreshUser);
241 }
242 return ErrorObservable.ErrorObservable.create(e);
243 }));
244 }
245 return ErrorObservable.ErrorObservable.create(e);
246 }));
247 }));
248 }));
249 };
250 /**
251 * @return {?}
252 */
253 NacoService.prototype.getSignature = /**
254 * @return {?}
255 */
256 function () {
257 return Promise.resolve(this.signature);
258 };
259 /**
260 * @param {?} signature
261 * @return {?}
262 */
263 NacoService.prototype.setSignature = /**
264 * @param {?} signature
265 * @return {?}
266 */
267 function (signature) {
268 this.signature = signature;
269 this.storage.set('signature', signature);
270 };
271 /**
272 * @param {?} secret
273 * @return {?}
274 */
275 NacoService.prototype.setClientSecret = /**
276 * @param {?} secret
277 * @return {?}
278 */
279 function (secret) {
280 this.clientSecret = secret;
281 this.storage.set('client_secret', secret);
282 };
283 /**
284 * @param {?} refreshToken
285 * @return {?}
286 */
287 NacoService.prototype.setRefreshToken = /**
288 * @param {?} refreshToken
289 * @return {?}
290 */
291 function (refreshToken) {
292 this.refreshToken = refreshToken;
293 this.storage.set('refresh_token', refreshToken);
294 };
295 /**
296 * @param {?=} scopes
297 * @return {?}
298 */
299 NacoService.prototype.refreshUser = /**
300 * @param {?=} scopes
301 * @return {?}
302 */
303 function (scopes) {
304 var _this = this;
305 this.setUser(null);
306 this.setSignature(null);
307 return rxjs.forkJoin(this.getRefreshToken(), this.getClientSecret()).pipe(operators.switchMap(function (results) {
308 var /** @type {?} */ refreshToken = results[0];
309 var /** @type {?} */ clientSecret = results[1];
310 if (refreshToken && clientSecret) {
311 return _this.refreshWithRefreshToken(clientSecret, refreshToken.token, scopes);
312 }
313 return _this.refreshWithSilentAuth();
314 }));
315 };
316 /**
317 * @param {?} clientSecret
318 * @param {?} refreshToken
319 * @param {?=} scopes
320 * @return {?}
321 */
322 NacoService.prototype.refreshWithRefreshToken = /**
323 * @param {?} clientSecret
324 * @param {?} refreshToken
325 * @param {?=} scopes
326 * @return {?}
327 */
328 function (clientSecret, refreshToken, scopes) {
329 var _this = this;
330 var /** @type {?} */ request = this.http.post(this.getUri('/tokens'), {
331 grant_type: 'refresh_token',
332 scopes: scopes || 'basic email',
333 client_id: this.config.clientId,
334 client_secret: clientSecret,
335 refresh_token: refreshToken,
336 });
337 return request.pipe(operators.tap(function (tokens) {
338 if (tokens && tokens.data) {
339 _this.setSignature({
340 expiresIn: tokens.data.expires_in,
341 type: tokens.data.token_type,
342 token: tokens.data.access_token,
343 });
344 _this.setRefreshToken({
345 type: tokens.data.token_type,
346 token: tokens.data.refresh_token,
347 });
348 }
349 }), operators.map(function (tokens) { return tokens && tokens.data; }), operators.switchMap(function (hasToken) {
350 if (hasToken) {
351 return _this.getUser();
352 }
353 return rxjs.of(null);
354 }));
355 };
356 /**
357 * @return {?}
358 */
359 NacoService.prototype.refreshWithSilentAuth = /**
360 * @return {?}
361 */
362 function () {
363 var _this = this;
364 return new rxjs.Observable(function (observer) {
365 var /** @type {?} */ redirectUri = _this.getCurrentOrigin('auth/silent');
366 var /** @type {?} */ uri = _this.login('basic email', redirectUri);
367 var /** @type {?} */ iframe = document.createElement('iframe');
368 iframe.setAttribute('src', uri);
369 iframe.style.display = 'none';
370 iframe.addEventListener('load', function () {
371 return __awaiter(_this, void 0, void 0, function () {
372 var e_1, _a, queryString, queryParts, params, queryParts_1, queryParts_1_1, item, itemParts, state, _b, user, e_2;
373 return __generator(this, function (_c) {
374 switch (_c.label) {
375 case 0:
376 _c.trys.push([0, 6, , 7]);
377 queryString = iframe.contentWindow.location.search.substring(1);
378 iframe.parentNode.removeChild(iframe);
379 if (!queryString)
380 return [3 /*break*/, 5];
381 queryParts = queryString.split('&');
382 params = {};
383 try {
384 for (queryParts_1 = __values(queryParts), queryParts_1_1 = queryParts_1.next(); !queryParts_1_1.done; queryParts_1_1 = queryParts_1.next()) {
385 item = queryParts_1_1.value;
386 itemParts = item.split('=');
387 params[itemParts[0]] = itemParts[1];
388 }
389 }
390 catch (e_1_1) {
391 e_1 = { error: e_1_1 };
392 }
393 finally {
394 try {
395 if (queryParts_1_1 && !queryParts_1_1.done && (_a = queryParts_1.return))
396 _a.call(queryParts_1);
397 }
398 finally {
399 if (e_1)
400 throw e_1.error;
401 }
402 }
403 if (!params.hasOwnProperty('access_token'))
404 return [3 /*break*/, 3];
405 state = params['state'] || null;
406 _b = state;
407 return [4 /*yield*/, this.getState()];
408 case 1:
409 if (_b !== (_c.sent())) {
410 observer.next(null);
411 return [2 /*return*/];
412 }
413 this.setSignature({
414 token: params['access_token'],
415 type: params['token_type'],
416 expiresIn: params['ttl'],
417 });
418 return [4 /*yield*/, this.getUser().toPromise()];
419 case 2:
420 user = _c.sent();
421 if (user) {
422 this.setUser(user);
423 }
424 observer.next(user);
425 return [3 /*break*/, 4];
426 case 3:
427 observer.next(null);
428 _c.label = 4;
429 case 4: return [2 /*return*/];
430 case 5:
431 observer.next(null);
432 return [3 /*break*/, 7];
433 case 6:
434 e_2 = _c.sent();
435 observer.next(null);
436 return [3 /*break*/, 7];
437 case 7: return [2 /*return*/];
438 }
439 });
440 });
441 }, false);
442 document.body.appendChild(iframe);
443 });
444 };
445 /**
446 * @param {?} scopes
447 * @param {?=} redirectUri
448 * @return {?}
449 */
450 NacoService.prototype.login = /**
451 * @param {?} scopes
452 * @param {?=} redirectUri
453 * @return {?}
454 */
455 function (scopes, redirectUri) {
456 if (!redirectUri) {
457 redirectUri = this.router.url;
458 }
459 var /** @type {?} */ state = this.generateState();
460 this.storage.set('state', state);
461 var /** @type {?} */ query = this.buildQueryString({
462 'response_type': 'token',
463 'scopes': scopes,
464 'client': this.config.clientId,
465 'state': state,
466 'continue': redirectUri,
467 });
468 return this.config.endpoint + '/auth?' + query;
469 };
470 /**
471 * @param {?=} redirectUri
472 * @return {?}
473 */
474 NacoService.prototype.logout = /**
475 * @param {?=} redirectUri
476 * @return {?}
477 */
478 function (redirectUri) {
479 var _this = this;
480 this.signature = null;
481 this.user = null;
482 return new Promise(function (resolve) {
483 Promise.all([
484 _this.storage.remove('signature'),
485 _this.storage.remove('user'),
486 ]).then(function () {
487 var /** @type {?} */ endpoint = _this.config.endpoint + '/auth/logout';
488 if (redirectUri) {
489 endpoint += '?continue=' + redirectUri;
490 }
491 resolve(endpoint);
492 });
493 });
494 };
495 /**
496 * @return {?}
497 */
498 NacoService.prototype.getState = /**
499 * @return {?}
500 */
501 function () {
502 return this.storage.get('state');
503 };
504 /**
505 * @param {?} route
506 * @return {?}
507 */
508 NacoService.prototype.buildNestedUri = /**
509 * @param {?} route
510 * @return {?}
511 */
512 function (route) {
513 var _this = this;
514 var /** @type {?} */ uri = '';
515 if (route.routeConfig && route.routeConfig.path) {
516 uri += '/' + route.routeConfig.path;
517 }
518 if (route.children) {
519 route.children.forEach(function (item) {
520 uri += _this.buildNestedUri(item);
521 });
522 }
523 return uri;
524 };
525 /**
526 * @return {?}
527 */
528 NacoService.prototype.getRefreshToken = /**
529 * @return {?}
530 */
531 function () {
532 if (null !== this.refreshToken) {
533 return Promise.resolve(this.refreshToken);
534 }
535 return this.storage.get('refresh_token');
536 };
537 /**
538 * @return {?}
539 */
540 NacoService.prototype.getClientSecret = /**
541 * @return {?}
542 */
543 function () {
544 if (null !== this.clientSecret) {
545 return Promise.resolve(this.clientSecret);
546 }
547 return this.storage.get('client_secret');
548 };
549 /**
550 * @param {?} path
551 * @return {?}
552 */
553 NacoService.prototype.getUri = /**
554 * @param {?} path
555 * @return {?}
556 */
557 function (path) {
558 return this.config.endpoint + '/api/' + this.VERSION + path;
559 };
560 /**
561 * @param {?=} path
562 * @return {?}
563 */
564 NacoService.prototype.getCurrentOrigin = /**
565 * @param {?=} path
566 * @return {?}
567 */
568 function (path) {
569 return window.location.origin + this.location.prepareExternalUrl(path || '');
570 };
571 /**
572 * @return {?}
573 */
574 NacoService.prototype.generateState = /**
575 * @return {?}
576 */
577 function () {
578 var /** @type {?} */ possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
579 var /** @type {?} */ text = '';
580 for (var /** @type {?} */ i = 0; i < 5; i++) {
581 text += possible.charAt(Math.floor(Math.random() * possible.length));
582 }
583 return text;
584 };
585 /**
586 * @param {?} params
587 * @return {?}
588 */
589 NacoService.prototype.buildQueryString = /**
590 * @param {?} params
591 * @return {?}
592 */
593 function (params) {
594 var /** @type {?} */ queryParams = Object.keys(params).map(function (key) {
595 return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);
596 });
597 return queryParams.join('&');
598 };
599 NacoService.decorators = [
600 { type: core.Injectable },
601 ];
602 /** @nocollapse */
603 NacoService.ctorParameters = function () {
604 return [
605 { type: Config },
606 { type: router.Router },
607 { type: storage.Storage },
608 { type: http.HttpClient },
609 { type: common.Location }
610 ];
611 };
612 return NacoService;
613 }());
614
615 /**
616 * @fileoverview added by tsickle
617 * @suppress {checkTypes} checked by tsc
618 */
619 var Signature = /** @class */ (function () {
620 function Signature() {
621 }
622 return Signature;
623 }());
624
625 /**
626 * @fileoverview added by tsickle
627 * @suppress {checkTypes} checked by tsc
628 */
629 var AuthenticatedGuard = /** @class */ (function () {
630 function AuthenticatedGuard(naco, storage$$1) {
631 this.naco = naco;
632 this.storage = storage$$1;
633 }
634 /**
635 * @param {?} route
636 * @return {?}
637 */
638 AuthenticatedGuard.prototype.canActivate = /**
639 * @param {?} route
640 * @return {?}
641 */
642 function (route) {
643 var _this = this;
644 return this.naco.getUser().pipe(operators.first(), operators.map(function (user) {
645 if (null === user) {
646 var /** @type {?} */ uri = _this.naco.buildNestedUri(route.root);
647 var /** @type {?} */ next = _this.naco.getCurrentOrigin('/' + _this.ltrim(uri));
648 _this.storage.set('naco_intended_url', next).then(function () {
649 window.location.href = _this.naco.login('basic email', _this.naco.getCurrentOrigin('/auth'));
650 });
651 }
652 return !!user;
653 }));
654 };
655 /**
656 * @param {?} route
657 * @return {?}
658 */
659 AuthenticatedGuard.prototype.canActivateChild = /**
660 * @param {?} route
661 * @return {?}
662 */
663 function (route) {
664 return this.canActivate(route);
665 };
666 /**
667 * @param {?} text
668 * @return {?}
669 */
670 AuthenticatedGuard.prototype.ltrim = /**
671 * @param {?} text
672 * @return {?}
673 */
674 function (text) {
675 return text.replace(/^\/+/, '');
676 };
677 /**
678 * @param {?} text
679 * @return {?}
680 */
681 AuthenticatedGuard.prototype.rtrim = /**
682 * @param {?} text
683 * @return {?}
684 */
685 function (text) {
686 return text.replace(/\/+$/, '');
687 };
688 AuthenticatedGuard.decorators = [
689 { type: core.Injectable },
690 ];
691 /** @nocollapse */
692 AuthenticatedGuard.ctorParameters = function () {
693 return [
694 { type: NacoService },
695 { type: storage.Storage }
696 ];
697 };
698 return AuthenticatedGuard;
699 }());
700
701 /**
702 * @fileoverview added by tsickle
703 * @suppress {checkTypes} checked by tsc
704 */
705 var AuthInterceptor = /** @class */ (function () {
706 function AuthInterceptor(naco) {
707 this.naco = naco;
708 }
709 /**
710 * @param {?} req
711 * @param {?} next
712 * @return {?}
713 */
714 AuthInterceptor.prototype.intercept = /**
715 * @param {?} req
716 * @param {?} next
717 * @return {?}
718 */
719 function (req, next) {
720 var _this = this;
721 return fromPromise.fromPromise(this.naco.getSignature()).pipe(operators.switchMap(function (signature) {
722 if (!signature) {
723 return next.handle(req);
724 }
725 return next
726 .handle(req.clone({
727 setHeaders: {
728 Authorization: signature.type + " " + signature.token,
729 },
730 }))
731 .pipe(operators.catchError(function (error) {
732 if (error.status === 401) {
733 return _this.naco.refreshUser().pipe(operators.switchMap(function (user) {
734 if (user) {
735 return fromPromise.fromPromise(_this.naco.getSignature()).pipe(operators.switchMap(function (newSignature) {
736 return next.handle(req.clone({
737 setHeaders: {
738 Authorization: newSignature.type + " " + newSignature.token,
739 },
740 }));
741 }));
742 }
743 return ErrorObservable.ErrorObservable.create(error);
744 }));
745 }
746 return ErrorObservable.ErrorObservable.create(error);
747 }));
748 }));
749 };
750 AuthInterceptor.decorators = [
751 { type: core.Injectable },
752 ];
753 /** @nocollapse */
754 AuthInterceptor.ctorParameters = function () {
755 return [
756 { type: NacoService }
757 ];
758 };
759 return AuthInterceptor;
760 }());
761
762 /**
763 * @fileoverview added by tsickle
764 * @suppress {checkTypes} checked by tsc
765 */
766 /**
767 * @param {?} config
768 * @param {?} router
769 * @param {?} storage
770 * @param {?} http
771 * @param {?} location
772 * @return {?}
773 */
774 function nacoFactory(config, router$$1, storage$$1, http$$1, location) {
775 return new NacoService(new Config(__assign({}, config)), router$$1, storage$$1, http$$1, location);
776 }
777 var /** @type {?} */ NACO_CONFIG = new core.InjectionToken('NACO_CONFIG');
778
779 /**
780 * @fileoverview added by tsickle
781 * @suppress {checkTypes} checked by tsc
782 */
783 var AuthPage = /** @class */ (function () {
784 function AuthPage(route, naco, storage$$1) {
785 var _this = this;
786 this.route = route;
787 this.naco = naco;
788 this.storage = storage$$1;
789 this.message = 'Authenticating...';
790 this.route.queryParams.subscribe(function (params) { return _this.handle(params); });
791 }
792 /**
793 * @param {?} params
794 * @return {?}
795 */
796 AuthPage.prototype.handle = /**
797 * @param {?} params
798 * @return {?}
799 */
800 function (params) {
801 var _this = this;
802 if (params["state"]) {
803 this.naco.getState().then(function (state) {
804 if (state !== params["state"]) {
805 _this.message = 'Invalid CSRF';
806 return;
807 }
808 _this.authenticate(params);
809 });
810 }
811 else {
812 this.authenticate(params);
813 }
814 };
815 /**
816 * @param {?} params
817 * @return {?}
818 */
819 AuthPage.prototype.authenticate = /**
820 * @param {?} params
821 * @return {?}
822 */
823 function (params) {
824 var _this = this;
825 var /** @type {?} */ signature = {
826 expiresIn: params["expires_in"],
827 type: params["token_type"],
828 token: params["access_token"],
829 };
830 this.naco.setUser(null);
831 this.naco.setSignature(signature);
832 this.naco.getUser().subscribe(function (user) {
833 if (null !== user) {
834 _this.storage.get('naco_intended_url').then(function (url) {
835 _this.storage.remove('naco_intended_url').then(function () {
836 window.location.href = url ? url : '/';
837 });
838 });
839 return;
840 }
841 _this.message = 'Unauthenticated!';
842 });
843 };
844 AuthPage.decorators = [
845 { type: core.Component, args: [{
846 selector: 'naker-auth-page',
847 template: '{{ message }}',
848 },] },
849 ];
850 /** @nocollapse */
851 AuthPage.ctorParameters = function () {
852 return [
853 { type: router.ActivatedRoute },
854 { type: NacoService },
855 { type: storage.Storage }
856 ];
857 };
858 return AuthPage;
859 }());
860
861 /**
862 * @fileoverview added by tsickle
863 * @suppress {checkTypes} checked by tsc
864 */
865 var AuthSilentPage = /** @class */ (function () {
866 function AuthSilentPage() {
867 }
868 AuthSilentPage.decorators = [
869 { type: core.Component, args: [{
870 selector: 'naker-auth-silent',
871 template: 'Processing silent auth...',
872 },] },
873 ];
874 return AuthSilentPage;
875 }());
876
877 /**
878 * @fileoverview added by tsickle
879 * @suppress {checkTypes} checked by tsc
880 */
881 var /** @type {?} */ routes = [
882 {
883 path: 'auth',
884 component: AuthPage
885 },
886 {
887 path: 'auth/silent',
888 component: AuthSilentPage
889 },
890 ];
891 var /** @type {?} */ AUTH_ROUTING = router.RouterModule.forChild(routes);
892
893 /**
894 * @fileoverview added by tsickle
895 * @suppress {checkTypes} checked by tsc
896 */
897 var NacoViewModule = /** @class */ (function () {
898 function NacoViewModule() {
899 }
900 NacoViewModule.decorators = [
901 { type: core.NgModule, args: [{
902 imports: [
903 AUTH_ROUTING,
904 ],
905 declarations: [
906 AuthPage,
907 AuthSilentPage,
908 ],
909 },] },
910 ];
911 return NacoViewModule;
912 }());
913
914 /**
915 * @fileoverview added by tsickle
916 * @suppress {checkTypes} checked by tsc
917 */
918 var NacoModule = /** @class */ (function () {
919 function NacoModule() {
920 }
921 /**
922 * @param {?} config
923 * @return {?}
924 */
925 NacoModule.forRoot = /**
926 * @param {?} config
927 * @return {?}
928 */
929 function (config) {
930 return {
931 ngModule: NacoModule,
932 providers: [
933 {
934 provide: NACO_CONFIG,
935 useValue: config,
936 },
937 {
938 provide: NacoService,
939 useFactory: nacoFactory,
940 deps: [NACO_CONFIG, router.Router, storage.Storage, http.HttpClient, common.Location],
941 },
942 AuthenticatedGuard,
943 ],
944 };
945 };
946 NacoModule.decorators = [
947 { type: core.NgModule, args: [{
948 imports: [
949 storage.UbudStorageModule,
950 NacoViewModule,
951 ],
952 },] },
953 ];
954 return NacoModule;
955 }());
956
957 /**
958 * @fileoverview added by tsickle
959 * @suppress {checkTypes} checked by tsc
960 */
961
962 /**
963 * @fileoverview added by tsickle
964 * @suppress {checkTypes} checked by tsc
965 */
966
967 exports.NacoService = NacoService;
968 exports.User = User;
969 exports.Signature = Signature;
970 exports.Config = Config;
971 exports.AuthenticatedGuard = AuthenticatedGuard;
972 exports.AuthInterceptor = AuthInterceptor;
973 exports.NacoModule = NacoModule;
974 exports.ɵf = NACO_CONFIG;
975 exports.ɵe = nacoFactory;
976 exports.ɵa = NacoViewModule;
977 exports.ɵd = AuthSilentPage;
978 exports.ɵc = AuthPage;
979 exports.ɵb = AUTH_ROUTING;
980
981 Object.defineProperty(exports, '__esModule', { value: true });
982
983})));
984
985//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFrZXItbmFjby51bWQuanMubWFwIiwic291cmNlcyI6W251bGwsIm5nOi8vQG5ha2VyL25hY28vZG9tYWlucy92YWx1ZXMvY29uZmlnLnRzIiwibmc6Ly9AbmFrZXIvbmFjby9kb21haW5zL21vZGVscy91c2VyLnRzIiwibmc6Ly9AbmFrZXIvbmFjby9kb21haW5zL3NlcnZpY2VzL25hY28uc2VydmljZS50cyIsIm5nOi8vQG5ha2VyL25hY28vZG9tYWlucy92YWx1ZXMvc2lnbmF0dXJlLnRzIiwibmc6Ly9AbmFrZXIvbmFjby9ndWFyZHMvYXV0aGVudGljYXRlZC5ndWFyZC50cyIsIm5nOi8vQG5ha2VyL25hY28vaW50ZXJjZXB0b3JzL2F1dGguaW50ZXJjZXB0b3IudHMiLCJuZzovL0BuYWtlci9uYWNvL2ZhY3Rvcmllcy9uYWNvLWZhY3RvcnkudHMiLCJuZzovL0BuYWtlci9uYWNvL3ZpZXdzL3BhZ2VzL2F1dGgucGFnZS50cyIsIm5nOi8vQG5ha2VyL25hY28vdmlld3MvcGFnZXMvYXV0aC1zaWxlbnQucGFnZS50cyIsIm5nOi8vQG5ha2VyL25hY28vdmlld3Mvcm91dGVzLnRzIiwibmc6Ly9AbmFrZXIvbmFjby92aWV3cy9tb2R1bGUudHMiLCJuZzovL0BuYWtlci9uYWNvL25hY28ubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMClcclxuICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZShyZXN1bHQudmFsdWUpOyB9KS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBleHBvcnRzKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcclxuICAgIHJlc3VsdC5kZWZhdWx0ID0gbW9kO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIENvbmZpZyB7XG4gICAgcHVibGljIGVuZHBvaW50OiBzdHJpbmcgPSAnaHR0cHM6Ly9hY2NvdW50LmtlbW5ha2VyLmdvLmlkJztcbiAgICBwdWJsaWMgY2xpZW50SWQ6IHN0cmluZztcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhPzogUGFydGlhbDxDb25maWc+KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHlwZSB9IGZyb20gJ2NsYXNzLXRyYW5zZm9ybWVyJztcblxuZXhwb3J0IGNsYXNzIFVzZXIge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nO1xuICAgIHB1YmxpYyB1c2VybmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyBlbWFpbD86IHN0cmluZztcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyBzdGF0dXM6IG51bWJlcjtcblxuICAgIEBUeXBlKGZvcndhcmRSZWYoKCkgPT4gRGF0ZSkgYXMgYW55KVxuICAgIHB1YmxpYyB1cGRhdGVkQXQ6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3RvcmFnZSB9IGZyb20gJ0B1YnVkL3N0b3JhZ2UnO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi4vdmFsdWVzL2NvbmZpZyc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vbW9kZWxzL3VzZXInO1xuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIE9ic2VydmVyLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2lnbmF0dXJlIH0gZnJvbSAnLi4vdmFsdWVzL3NpZ25hdHVyZSc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSB9IGZyb20gJ3J4anMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9mcm9tUHJvbWlzZSc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgcGxhaW5Ub0NsYXNzIH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBFcnJvck9ic2VydmFibGUgfSBmcm9tICdyeGpzLWNvbXBhdC9vYnNlcnZhYmxlL0Vycm9yT2JzZXJ2YWJsZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOYWNvU2VydmljZSB7XG4gICAgcHVibGljIHJlYWRvbmx5IFZFUlNJT04gPSAndjEnO1xuXG4gICAgcHJpdmF0ZSBzaWduYXR1cmU6IFNpZ25hdHVyZSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgdXNlcjogVXNlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcmVmcmVzaFRva2VuOiBTaWduYXR1cmUgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGNsaWVudFNlY3JldDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IENvbmZpZywgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlciwgcHJpdmF0ZSBzdG9yYWdlOiBTdG9yYWdlLCBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uKSB7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFVzZXIodXNlcjogVXNlciB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51c2VyID0gdXNlcjtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldCgndXNlcicsIHVzZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRVc2VyKCk6IE9ic2VydmFibGU8VXNlciB8IG51bGw+IHtcbiAgICAgICAgaWYgKG51bGwgIT09IHRoaXMudXNlcikge1xuICAgICAgICAgICAgcmV0dXJuIG9mKHRoaXMudXNlcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZnJvbVByb21pc2UodGhpcy5zdG9yYWdlLmdldCgndXNlcicpKS5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKCh1c2VyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodXNlcik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgdXJpID0gdGhpcy5nZXRVcmkoJy91c2Vycy9tZScpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKHRoaXMuZ2V0U2lnbmF0dXJlKCkpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoc2lnbmF0dXJlOiBTaWduYXR1cmUgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gc2lnbmF0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFVzZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGAke3NpZ25hdHVyZS50eXBlfSAke3NpZ25hdHVyZS50b2tlbn1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KHVyaSwgb3B0aW9ucykucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBhcmUgbm8gYm9keSB0byBiZSB0cmFuc2Zvcm1lZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dGhVc2VyOiBhbnkgPSBwbGFpblRvQ2xhc3MoVXNlciwgZGF0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRVc2VyKGF1dGhVc2VyKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXV0aFVzZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZTogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDQwMSA9PT0gZS5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZnJlc2hVc2VyKCkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHJlZnJlc2hVc2VyOiBVc2VyIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmcmVzaFVzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihyZWZyZXNoVXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JPYnNlcnZhYmxlLmNyZWF0ZShlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JPYnNlcnZhYmxlLmNyZWF0ZShlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2lnbmF0dXJlKCk6IFByb21pc2U8U2lnbmF0dXJlIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuc2lnbmF0dXJlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0U2lnbmF0dXJlKHNpZ25hdHVyZTogU2lnbmF0dXJlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0KCdzaWduYXR1cmUnLCBzaWduYXR1cmUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDbGllbnRTZWNyZXQoc2VjcmV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGllbnRTZWNyZXQgPSBzZWNyZXQ7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoJ2NsaWVudF9zZWNyZXQnLCBzZWNyZXQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRSZWZyZXNoVG9rZW4ocmVmcmVzaFRva2VuOiBTaWduYXR1cmUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4gPSByZWZyZXNoVG9rZW47XG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoJ3JlZnJlc2hfdG9rZW4nLCByZWZyZXNoVG9rZW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWZyZXNoVXNlcihzY29wZXM/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPFVzZXIgfCBudWxsPiB7XG4gICAgICAgIHRoaXMuc2V0VXNlcihudWxsKTtcbiAgICAgICAgdGhpcy5zZXRTaWduYXR1cmUobnVsbCk7XG5cbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKHRoaXMuZ2V0UmVmcmVzaFRva2VuKCksIHRoaXMuZ2V0Q2xpZW50U2VjcmV0KCkpLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKHJlc3VsdHM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZnJlc2hUb2tlbjogU2lnbmF0dXJlID0gcmVzdWx0c1swXTtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGllbnRTZWNyZXQ6IHN0cmluZyA9IHJlc3VsdHNbMV07XG5cbiAgICAgICAgICAgICAgICBpZiAocmVmcmVzaFRva2VuICYmIGNsaWVudFNlY3JldCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZyZXNoV2l0aFJlZnJlc2hUb2tlbihjbGllbnRTZWNyZXQsIHJlZnJlc2hUb2tlbi50b2tlbiwgc2NvcGVzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZyZXNoV2l0aFNpbGVudEF1dGgoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWZyZXNoV2l0aFJlZnJlc2hUb2tlbihjbGllbnRTZWNyZXQ6IHN0cmluZywgcmVmcmVzaFRva2VuOiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZyk6IE9ic2VydmFibGU8VXNlciB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuaHR0cC5wb3N0KHRoaXMuZ2V0VXJpKCcvdG9rZW5zJyksIHtcbiAgICAgICAgICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICAgICAgICAgIHNjb3Blczogc2NvcGVzIHx8ICdiYXNpYyBlbWFpbCcsXG4gICAgICAgICAgICBjbGllbnRfaWQ6IHRoaXMuY29uZmlnLmNsaWVudElkLFxuICAgICAgICAgICAgY2xpZW50X3NlY3JldDogY2xpZW50U2VjcmV0LFxuICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVxdWVzdC5waXBlKFxuICAgICAgICAgICAgdGFwKCh0b2tlbnM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbnMgJiYgdG9rZW5zLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTaWduYXR1cmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlc0luOiB0b2tlbnMuZGF0YS5leHBpcmVzX2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdG9rZW5zLmRhdGEudG9rZW5fdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiB0b2tlbnMuZGF0YS5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UmVmcmVzaFRva2VuKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRva2Vucy5kYXRhLnRva2VuX3R5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogdG9rZW5zLmRhdGEucmVmcmVzaF90b2tlbixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtYXAoKHRva2VuczogYW55KSA9PiB0b2tlbnMgJiYgdG9rZW5zLmRhdGEpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKChoYXNUb2tlbjogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChoYXNUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRVc2VyKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZnJlc2hXaXRoU2lsZW50QXV0aCgpOiBPYnNlcnZhYmxlPFVzZXIgfCBudWxsPiB7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxVc2VyIHwgbnVsbD4oKG9ic2VydmVyOiBPYnNlcnZlcjxVc2VyIHwgbnVsbD4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0VXJpID0gdGhpcy5nZXRDdXJyZW50T3JpZ2luKCdhdXRoL3NpbGVudCcpO1xuICAgICAgICAgICAgY29uc3QgdXJpID0gdGhpcy5sb2dpbignYmFzaWMgZW1haWwnLCByZWRpcmVjdFVyaSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnc3JjJywgdXJpKTtcbiAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgICAgICBpZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWVyeVN0cmluZyA9IGlmcmFtZS5jb250ZW50V2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnlTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFydHMgPSBxdWVyeVN0cmluZy5zcGxpdCgnJicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge307XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBxdWVyeVBhcnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbVBhcnRzID0gaXRlbS5zcGxpdCgnPScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zW2l0ZW1QYXJ0c1swXV0gPSBpdGVtUGFydHNbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkoJ2FjY2Vzc190b2tlbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBwYXJhbXNbJ3N0YXRlJ10gfHwgbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U2lnbmF0dXJlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IHBhcmFtc1snYWNjZXNzX3Rva2VuJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHBhcmFtc1sndG9rZW5fdHlwZSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVzSW46IHBhcmFtc1sndHRsJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5nZXRVc2VyKCkudG9Qcm9taXNlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFVzZXIodXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh1c2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZmFsc2UpO1xuXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2dpbihzY29wZXM6IHN0cmluZywgcmVkaXJlY3RVcmk/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXJlZGlyZWN0VXJpKSB7XG4gICAgICAgICAgICByZWRpcmVjdFVyaSA9IHRoaXMucm91dGVyLnVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZW5lcmF0ZVN0YXRlKCk7XG5cbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldCgnc3RhdGUnLCBzdGF0ZSk7XG5cbiAgICAgICAgY29uc3QgcXVlcnk6IHN0cmluZyA9IHRoaXMuYnVpbGRRdWVyeVN0cmluZyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAncmVzcG9uc2VfdHlwZSc6ICd0b2tlbicsXG4gICAgICAgICAgICAgICAgJ3Njb3Blcyc6IHNjb3BlcyxcbiAgICAgICAgICAgICAgICAnY2xpZW50JzogdGhpcy5jb25maWcuY2xpZW50SWQsXG4gICAgICAgICAgICAgICAgJ3N0YXRlJzogc3RhdGUsXG4gICAgICAgICAgICAgICAgJ2NvbnRpbnVlJzogcmVkaXJlY3RVcmksXG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5lbmRwb2ludCArICcvYXV0aD8nICsgcXVlcnk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvZ291dChyZWRpcmVjdFVyaT86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHRoaXMuc2lnbmF0dXJlID0gbnVsbDtcbiAgICAgICAgdGhpcy51c2VyID0gbnVsbDtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZSgnc2lnbmF0dXJlJyksXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZSgndXNlcicpLFxuICAgICAgICAgICAgXSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZHBvaW50ID0gdGhpcy5jb25maWcuZW5kcG9pbnQgKyAnL2F1dGgvbG9nb3V0JztcblxuICAgICAgICAgICAgICAgIGlmIChyZWRpcmVjdFVyaSkge1xuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludCArPSAnP2NvbnRpbnVlPScgKyByZWRpcmVjdFVyaTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXNvbHZlKGVuZHBvaW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3RhdGUoKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2UuZ2V0KCdzdGF0ZScpO1xuICAgIH1cblxuICAgIHB1YmxpYyBidWlsZE5lc3RlZFVyaShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IHN0cmluZyB7XG4gICAgICAgIGxldCB1cmkgPSAnJztcblxuICAgICAgICBpZiAocm91dGUucm91dGVDb25maWcgJiYgcm91dGUucm91dGVDb25maWcucGF0aCkge1xuICAgICAgICAgICAgdXJpICs9ICcvJyArIHJvdXRlLnJvdXRlQ29uZmlnLnBhdGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm91dGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHJvdXRlLmNoaWxkcmVuLmZvckVhY2goKGl0ZW06IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpID0+IHtcbiAgICAgICAgICAgICAgICB1cmkgKz0gdGhpcy5idWlsZE5lc3RlZFVyaShpdGVtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVyaTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFJlZnJlc2hUb2tlbigpOiBQcm9taXNlPFNpZ25hdHVyZSB8IG51bGw+IHtcbiAgICAgICAgaWYgKG51bGwgIT09IHRoaXMucmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMucmVmcmVzaFRva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2UuZ2V0KCdyZWZyZXNoX3Rva2VuJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDbGllbnRTZWNyZXQoKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICAgIGlmIChudWxsICE9PSB0aGlzLmNsaWVudFNlY3JldCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmNsaWVudFNlY3JldCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldCgnY2xpZW50X3NlY3JldCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VXJpKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5lbmRwb2ludCArICcvYXBpLycgKyB0aGlzLlZFUlNJT04gKyBwYXRoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDdXJyZW50T3JpZ2luKHBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIHRoaXMubG9jYXRpb24ucHJlcGFyZUV4dGVybmFsVXJsKHBhdGggfHwgJycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVTdGF0ZSgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwb3NzaWJsZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7XG4gICAgICAgIGxldCB0ZXh0ID0gJyc7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAgICAgICAgIHRleHQgKz0gcG9zc2libGUuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHBvc3NpYmxlLmxlbmd0aCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWlsZFF1ZXJ5U3RyaW5nKHBhcmFtczogb2JqZWN0KTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBPYmplY3Qua2V5cyhwYXJhbXMpLm1hcCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChwYXJhbXNba2V5XSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBxdWVyeVBhcmFtcy5qb2luKCcmJyk7XG4gICAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFNpZ25hdHVyZSB7XG4gICAgcHVibGljIGV4cGlyZXNJbj86IG51bWJlcjtcbiAgICBwdWJsaWMgdG9rZW46IHN0cmluZztcbiAgICBwdWJsaWMgdHlwZTogc3RyaW5nO1xufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2FuQWN0aXZhdGUsIENhbkFjdGl2YXRlQ2hpbGQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTmFjb1NlcnZpY2UgfSBmcm9tICcuLi9kb21haW5zL3NlcnZpY2VzL25hY28uc2VydmljZSc7XG5pbXBvcnQgeyBmaXJzdCwgbWFwIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uL2RvbWFpbnMvbW9kZWxzL3VzZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3RvcmFnZSB9IGZyb20gJ0B1YnVkL3N0b3JhZ2UnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlci9zcmMvcm91dGVyX3N0YXRlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEF1dGhlbnRpY2F0ZWRHdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlLCBDYW5BY3RpdmF0ZUNoaWxkIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBuYWNvOiBOYWNvU2VydmljZSwgcHJpdmF0ZSBzdG9yYWdlOiBTdG9yYWdlKSB7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbkFjdGl2YXRlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hY28uZ2V0VXNlcigpLnBpcGUoXG4gICAgICAgICAgICBmaXJzdCgpLFxuICAgICAgICAgICAgbWFwKCh1c2VyOiBVc2VyIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChudWxsID09PSB1c2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVyaSA9IHRoaXMubmFjby5idWlsZE5lc3RlZFVyaShyb3V0ZS5yb290KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMubmFjby5nZXRDdXJyZW50T3JpZ2luKCcvJyArIHRoaXMubHRyaW0odXJpKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnNldCgnbmFjb19pbnRlbmRlZF91cmwnLCBuZXh0KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGhpcy5uYWNvLmxvZ2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYXNpYyBlbWFpbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYWNvLmdldEN1cnJlbnRPcmlnaW4oJy9hdXRoJyksXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gISF1c2VyO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbkFjdGl2YXRlQ2hpbGQocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuQWN0aXZhdGUocm91dGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbHRyaW0odGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXlxcLysvLCcnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJ0cmltKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcLyskLywnJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBFdmVudCwgSHR0cEhhbmRsZXIsIEh0dHBJbnRlcmNlcHRvciwgSHR0cFJlcXVlc3QgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOYWNvU2VydmljZSB9IGZyb20gJy4uL2RvbWFpbnMvc2VydmljZXMvbmFjby5zZXJ2aWNlJztcbmltcG9ydCB7IGZyb21Qcm9taXNlIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb21Qcm9taXNlJztcbmltcG9ydCB7IFNpZ25hdHVyZSB9IGZyb20gJy4uL2RvbWFpbnMvdmFsdWVzL3NpZ25hdHVyZSc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL2ludGVybmFsL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFcnJvck9ic2VydmFibGUgfSBmcm9tICdyeGpzLWNvbXBhdC9vYnNlcnZhYmxlL0Vycm9yT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBdXRoSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG5hY286IE5hY29TZXJ2aWNlKSB7XG4gICAgfVxuXG4gICAgcHVibGljIGludGVyY2VwdChyZXE6IEh0dHBSZXF1ZXN0PGFueT4sIG5leHQ6IEh0dHBIYW5kbGVyKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xuICAgICAgICByZXR1cm4gZnJvbVByb21pc2UodGhpcy5uYWNvLmdldFNpZ25hdHVyZSgpKS5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKChzaWduYXR1cmU6IFNpZ25hdHVyZSB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXNpZ25hdHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFxuICAgICAgICAgICAgICAgICAgICAuaGFuZGxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmNsb25lKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRIZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGAke3NpZ25hdHVyZS50eXBlfSAke3NpZ25hdHVyZS50b2tlbn1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uYWNvLnJlZnJlc2hVc2VyKCkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgodXNlcjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKHRoaXMubmFjby5nZXRTaWduYXR1cmUoKSkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgobmV3U2lnbmF0dXJlOiBTaWduYXR1cmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5jbG9uZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRIZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYCR7bmV3U2lnbmF0dXJlLnR5cGV9ICR7bmV3U2lnbmF0dXJlLnRva2VufWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yT2JzZXJ2YWJsZS5jcmVhdGUoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yT2JzZXJ2YWJsZS5jcmVhdGUoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBOYWNvU2VydmljZSB9IGZyb20gJy4uL2RvbWFpbnMvc2VydmljZXMvbmFjby5zZXJ2aWNlJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uL2RvbWFpbnMvdmFsdWVzL2NvbmZpZyc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3RvcmFnZSB9IGZyb20gJ0B1YnVkL3N0b3JhZ2UnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmV4cG9ydCBmdW5jdGlvbiBuYWNvRmFjdG9yeShjb25maWc6IG9iamVjdCwgcm91dGVyOiBSb3V0ZXIsIHN0b3JhZ2U6IFN0b3JhZ2UsIGh0dHA6IEh0dHBDbGllbnQsIGxvY2F0aW9uOiBMb2NhdGlvbikge1xuICAgIHJldHVybiBuZXcgTmFjb1NlcnZpY2UoXG4gICAgICAgIG5ldyBDb25maWcoeyAuLi5jb25maWcgfSksXG4gICAgICAgIHJvdXRlcixcbiAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgaHR0cCxcbiAgICAgICAgbG9jYXRpb25cbiAgICApO1xufVxuXG5leHBvcnQgY29uc3QgTkFDT19DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48b2JqZWN0PignTkFDT19DT05GSUcnKTtcbiIsImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBOYWNvU2VydmljZSB9IGZyb20gJy4uLy4uL2RvbWFpbnMvc2VydmljZXMvbmFjby5zZXJ2aWNlJztcbmltcG9ydCB7IFNpZ25hdHVyZSB9IGZyb20gJy4uLy4uL2RvbWFpbnMvdmFsdWVzL3NpZ25hdHVyZSc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vLi4vZG9tYWlucy9tb2RlbHMvdXNlcic7XG5pbXBvcnQgeyBTdG9yYWdlIH0gZnJvbSAnQHVidWQvc3RvcmFnZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmFrZXItYXV0aC1wYWdlJyxcbiAgICB0ZW1wbGF0ZTogJ3t7IG1lc3NhZ2UgfX0nLFxufSlcbmV4cG9ydCBjbGFzcyBBdXRoUGFnZSB7XG4gICAgcHVibGljIG1lc3NhZ2U6IHN0cmluZyA9ICdBdXRoZW50aWNhdGluZy4uLic7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsIHByaXZhdGUgbmFjbzogTmFjb1NlcnZpY2UsIHByaXZhdGUgc3RvcmFnZTogU3RvcmFnZSkge1xuICAgICAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocGFyYW1zOiBQYXJhbXMpID0+IHRoaXMuaGFuZGxlKHBhcmFtcykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGUocGFyYW1zOiBQYXJhbXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKHBhcmFtcy5zdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5uYWNvLmdldFN0YXRlKCkudGhlbigoc3RhdGU6IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgIT09IHBhcmFtcy5zdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSAnSW52YWxpZCBDU1JGJztcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5hdXRoZW50aWNhdGUocGFyYW1zKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hdXRoZW50aWNhdGUocGFyYW1zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXV0aGVudGljYXRlKHBhcmFtczogUGFyYW1zKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZTogU2lnbmF0dXJlID0ge1xuICAgICAgICAgICAgZXhwaXJlc0luOiBwYXJhbXMuZXhwaXJlc19pbixcbiAgICAgICAgICAgIHR5cGU6IHBhcmFtcy50b2tlbl90eXBlLFxuICAgICAgICAgICAgdG9rZW46IHBhcmFtcy5hY2Nlc3NfdG9rZW4sXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5uYWNvLnNldFVzZXIobnVsbCk7XG4gICAgICAgIHRoaXMubmFjby5zZXRTaWduYXR1cmUoc2lnbmF0dXJlKTtcblxuICAgICAgICB0aGlzLm5hY28uZ2V0VXNlcigpLnN1YnNjcmliZSgodXNlcjogVXNlciB8IG51bGwpID0+IHtcbiAgICAgICAgICAgIGlmIChudWxsICE9PSB1c2VyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlLmdldCgnbmFjb19pbnRlbmRlZF91cmwnKS50aGVuKCh1cmw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlKCduYWNvX2ludGVuZGVkX3VybCcpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmwgPyB1cmwgOiAnLyc7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSAnVW5hdXRoZW50aWNhdGVkISc7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmFrZXItYXV0aC1zaWxlbnQnLFxuICAgIHRlbXBsYXRlOiAnUHJvY2Vzc2luZyBzaWxlbnQgYXV0aC4uLicsXG59KVxuZXhwb3J0IGNsYXNzIEF1dGhTaWxlbnRQYWdlIHtcbn1cbiIsImltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlck1vZHVsZSwgUm91dGVzIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEF1dGhQYWdlIH0gZnJvbSAnLi9wYWdlcy9hdXRoLnBhZ2UnO1xuaW1wb3J0IHsgQXV0aFNpbGVudFBhZ2UgfSBmcm9tICcuL3BhZ2VzL2F1dGgtc2lsZW50LnBhZ2UnO1xuXG5jb25zdCByb3V0ZXM6IFJvdXRlcyA9IFtcbiAgICB7XG4gICAgICAgIHBhdGg6ICdhdXRoJyxcbiAgICAgICAgY29tcG9uZW50OiBBdXRoUGFnZVxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXRoOiAnYXV0aC9zaWxlbnQnLFxuICAgICAgICBjb21wb25lbnQ6IEF1dGhTaWxlbnRQYWdlXG4gICAgfSxcbl07XG5cbmV4cG9ydCBjb25zdCBBVVRIX1JPVVRJTkc6IE1vZHVsZVdpdGhQcm92aWRlcnMgPSBSb3V0ZXJNb2R1bGUuZm9yQ2hpbGQocm91dGVzKTtcbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBVVRIX1JPVVRJTkcgfSBmcm9tICcuL3JvdXRlcyc7XG5pbXBvcnQgeyBBdXRoUGFnZSB9IGZyb20gJy4vcGFnZXMvYXV0aC5wYWdlJztcbmltcG9ydCB7IEF1dGhTaWxlbnRQYWdlIH0gZnJvbSAnLi9wYWdlcy9hdXRoLXNpbGVudC5wYWdlJztcblxuQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIEFVVEhfUk9VVElORyxcbiAgICBdLFxuICAgIGRlY2xhcmF0aW9uczogW1xuICAgICAgICBBdXRoUGFnZSxcbiAgICAgICAgQXV0aFNpbGVudFBhZ2UsXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTmFjb1ZpZXdNb2R1bGUge1xufVxuIiwiaW1wb3J0IHsgTW9kdWxlV2l0aFByb3ZpZGVycywgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5hY29TZXJ2aWNlIH0gZnJvbSAnLi9kb21haW5zL3NlcnZpY2VzL25hY28uc2VydmljZSc7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkR3VhcmQgfSBmcm9tICcuL2d1YXJkcy9hdXRoZW50aWNhdGVkLmd1YXJkJztcbmltcG9ydCB7IE5BQ09fQ09ORklHLCBuYWNvRmFjdG9yeSB9IGZyb20gJy4vZmFjdG9yaWVzL25hY28tZmFjdG9yeSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3RvcmFnZSwgVWJ1ZFN0b3JhZ2VNb2R1bGUgfSBmcm9tICdAdWJ1ZC9zdG9yYWdlJztcbmltcG9ydCB7IE5hY29WaWV3TW9kdWxlIH0gZnJvbSAnLi92aWV3cy9tb2R1bGUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIFVidWRTdG9yYWdlTW9kdWxlLFxuICAgICAgICBOYWNvVmlld01vZHVsZSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBOYWNvTW9kdWxlIHtcbiAgICBwdWJsaWMgc3RhdGljIGZvclJvb3QoY29uZmlnOiB7IGNsaWVudElkOiBzdHJpbmcsIGVuZHBvaW50Pzogc3RyaW5nIH0pOiBNb2R1bGVXaXRoUHJvdmlkZXJzIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5nTW9kdWxlOiBOYWNvTW9kdWxlLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBOQUNPX0NPTkZJRyxcbiAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IGNvbmZpZyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTmFjb1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IG5hY29GYWN0b3J5LFxuICAgICAgICAgICAgICAgICAgICBkZXBzOiBbTkFDT19DT05GSUcsIFJvdXRlciwgU3RvcmFnZSwgSHR0cENsaWVudCwgTG9jYXRpb25dLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgQXV0aGVudGljYXRlZEd1YXJkLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iXSwibmFtZXMiOlsiVHlwZSIsImZvcndhcmRSZWYiLCJyb3V0ZXIiLCJzdG9yYWdlIiwiaHR0cCIsIm9mIiwiZnJvbVByb21pc2UiLCJzd2l0Y2hNYXAiLCJtYXAiLCJwbGFpblRvQ2xhc3MiLCJjYXRjaEVycm9yIiwiRXJyb3JPYnNlcnZhYmxlIiwiZm9ya0pvaW4iLCJ0YXAiLCJPYnNlcnZhYmxlIiwidHNsaWJfMS5fX3ZhbHVlcyIsIkluamVjdGFibGUiLCJSb3V0ZXIiLCJTdG9yYWdlIiwiSHR0cENsaWVudCIsIkxvY2F0aW9uIiwiZmlyc3QiLCJJbmplY3Rpb25Ub2tlbiIsIkNvbXBvbmVudCIsIkFjdGl2YXRlZFJvdXRlIiwiUm91dGVyTW9kdWxlIiwiTmdNb2R1bGUiLCJVYnVkU3RvcmFnZU1vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0lBQUE7Ozs7Ozs7Ozs7Ozs7O0FBY0EsSUFlTyxJQUFJLFFBQVEsR0FBRztRQUNsQixRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxrQkFBa0IsQ0FBQztZQUMzQyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDakQsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakIsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUFFLElBQUksTUFBTSxDQUFD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QUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDOzRCQUFDLFNBQVM7d0JBQ2pEOzRCQUNJLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQ0FBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dDQUFDLFNBQVM7NkJBQUU7NEJBQzVHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dDQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUFDLE1BQU07NkJBQUU7NEJBQ3RGLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQ0FBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dDQUFDLE1BQU07NkJBQUU7NEJBQ3JFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dDQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dDQUFD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
\No newline at end of file