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 | var /** @type {?} */ uri = this.getUri('/users/me');
|
214 | return fromPromise.fromPromise(this.getSignature()).pipe(operators.switchMap(function (signature) {
|
215 | if (null === signature) {
|
216 | return rxjs.of(null);
|
217 | }
|
218 | var /** @type {?} */ options = {
|
219 | headers: {
|
220 | Authorization: signature.type + " " + signature.token,
|
221 | },
|
222 | };
|
223 | return _this.http.get(uri, options).pipe(operators.map(function (res) {
|
224 | if (res.data) {
|
225 | return res.data;
|
226 | }
|
227 | throw new Error('There are no body to be transformed');
|
228 | }), operators.map(function (data) {
|
229 | var /** @type {?} */ authUser = classTransformer.plainToClass(User, data);
|
230 | _this.setUser(authUser);
|
231 | return authUser;
|
232 | }), operators.catchError(function (e) {
|
233 | if (401 === e.status) {
|
234 | return _this.refreshUser().pipe(operators.switchMap(function (refreshUser) {
|
235 | if (refreshUser) {
|
236 | return rxjs.of(refreshUser);
|
237 | }
|
238 | return ErrorObservable.ErrorObservable.create(e);
|
239 | }));
|
240 | }
|
241 | return ErrorObservable.ErrorObservable.create(e);
|
242 | }));
|
243 | }));
|
244 | };
|
245 | /**
|
246 | * @return {?}
|
247 | */
|
248 | NacoService.prototype.getSignature = /**
|
249 | * @return {?}
|
250 | */
|
251 | function () {
|
252 | return Promise.resolve(this.signature);
|
253 | };
|
254 | /**
|
255 | * @param {?} signature
|
256 | * @return {?}
|
257 | */
|
258 | NacoService.prototype.setSignature = /**
|
259 | * @param {?} signature
|
260 | * @return {?}
|
261 | */
|
262 | function (signature) {
|
263 | this.signature = signature;
|
264 | };
|
265 | /**
|
266 | * @param {?} secret
|
267 | * @return {?}
|
268 | */
|
269 | NacoService.prototype.setClientSecret = /**
|
270 | * @param {?} secret
|
271 | * @return {?}
|
272 | */
|
273 | function (secret) {
|
274 | this.clientSecret = secret;
|
275 | };
|
276 | /**
|
277 | * @param {?} refreshToken
|
278 | * @return {?}
|
279 | */
|
280 | NacoService.prototype.setRefreshToken = /**
|
281 | * @param {?} refreshToken
|
282 | * @return {?}
|
283 | */
|
284 | function (refreshToken) {
|
285 | this.refreshToken = refreshToken;
|
286 | };
|
287 | /**
|
288 | * @param {?=} scopes
|
289 | * @return {?}
|
290 | */
|
291 | NacoService.prototype.refreshUser = /**
|
292 | * @param {?=} scopes
|
293 | * @return {?}
|
294 | */
|
295 | function (scopes) {
|
296 | var _this = this;
|
297 | this.setUser(null);
|
298 | this.setSignature(null);
|
299 | return rxjs.forkJoin(this.getRefreshToken(), this.getClientSecret()).pipe(operators.switchMap(function (results) {
|
300 | var /** @type {?} */ refreshToken = results[0];
|
301 | var /** @type {?} */ clientSecret = results[1];
|
302 | if (refreshToken && clientSecret) {
|
303 | return _this.refreshWithRefreshToken(clientSecret, refreshToken.token, scopes);
|
304 | }
|
305 | return _this.refreshWithSilentAuth();
|
306 | }));
|
307 | };
|
308 | /**
|
309 | * @param {?} clientSecret
|
310 | * @param {?} refreshToken
|
311 | * @param {?=} scopes
|
312 | * @return {?}
|
313 | */
|
314 | NacoService.prototype.refreshWithRefreshToken = /**
|
315 | * @param {?} clientSecret
|
316 | * @param {?} refreshToken
|
317 | * @param {?=} scopes
|
318 | * @return {?}
|
319 | */
|
320 | function (clientSecret, refreshToken, scopes) {
|
321 | var _this = this;
|
322 | var /** @type {?} */ request = this.http.post(this.getUri('/tokens'), {
|
323 | grant_type: 'refresh_token',
|
324 | scopes: scopes || 'basic email',
|
325 | client_id: this.config.clientId,
|
326 | client_secret: clientSecret,
|
327 | refresh_token: refreshToken,
|
328 | });
|
329 | return request.pipe(operators.tap(function (tokens) {
|
330 | if (tokens && tokens.data) {
|
331 | _this.setSignature({
|
332 | expiresIn: tokens.data.expires_in,
|
333 | type: tokens.data.token_type,
|
334 | token: tokens.data.access_token,
|
335 | });
|
336 | _this.setRefreshToken({
|
337 | type: tokens.data.token_type,
|
338 | token: tokens.data.refresh_token,
|
339 | });
|
340 | }
|
341 | }), operators.map(function (tokens) { return tokens && tokens.data; }), operators.switchMap(function (hasToken) {
|
342 | if (hasToken) {
|
343 | return _this.getUser();
|
344 | }
|
345 | return rxjs.of(null);
|
346 | }));
|
347 | };
|
348 | /**
|
349 | * @return {?}
|
350 | */
|
351 | NacoService.prototype.refreshWithSilentAuth = /**
|
352 | * @return {?}
|
353 | */
|
354 | function () {
|
355 | var _this = this;
|
356 | return new rxjs.Observable(function (observer) {
|
357 | var /** @type {?} */ redirectUri = _this.getCurrentOrigin('auth/silent');
|
358 | var /** @type {?} */ uri = _this.login('basic email', redirectUri);
|
359 | var /** @type {?} */ iframe = document.createElement('iframe');
|
360 | iframe.setAttribute('src', uri);
|
361 | iframe.style.display = 'none';
|
362 | iframe.addEventListener('load', function () {
|
363 | return __awaiter(_this, void 0, void 0, function () {
|
364 | var e_1, _a, queryString, queryParts, params, queryParts_1, queryParts_1_1, item, itemParts, state, _b, user, e_2;
|
365 | return __generator(this, function (_c) {
|
366 | switch (_c.label) {
|
367 | case 0:
|
368 | _c.trys.push([0, 6, , 7]);
|
369 | queryString = iframe.contentWindow.location.search.substring(1);
|
370 | iframe.parentNode.removeChild(iframe);
|
371 | if (!queryString)
|
372 | return [3 /*break*/, 5];
|
373 | queryParts = queryString.split('&');
|
374 | params = {};
|
375 | try {
|
376 | for (queryParts_1 = __values(queryParts), queryParts_1_1 = queryParts_1.next(); !queryParts_1_1.done; queryParts_1_1 = queryParts_1.next()) {
|
377 | item = queryParts_1_1.value;
|
378 | itemParts = item.split('=');
|
379 | params[itemParts[0]] = itemParts[1];
|
380 | }
|
381 | }
|
382 | catch (e_1_1) {
|
383 | e_1 = { error: e_1_1 };
|
384 | }
|
385 | finally {
|
386 | try {
|
387 | if (queryParts_1_1 && !queryParts_1_1.done && (_a = queryParts_1.return))
|
388 | _a.call(queryParts_1);
|
389 | }
|
390 | finally {
|
391 | if (e_1)
|
392 | throw e_1.error;
|
393 | }
|
394 | }
|
395 | if (!params.hasOwnProperty('access_token'))
|
396 | return [3 /*break*/, 3];
|
397 | state = params['state'] || null;
|
398 | _b = state;
|
399 | return [4 /*yield*/, this.getState()];
|
400 | case 1:
|
401 | if (_b !== (_c.sent())) {
|
402 | observer.next(null);
|
403 | return [2 /*return*/];
|
404 | }
|
405 | this.setSignature({
|
406 | token: params['access_token'],
|
407 | type: params['token_type'],
|
408 | expiresIn: params['ttl'],
|
409 | });
|
410 | return [4 /*yield*/, this.getUser().toPromise()];
|
411 | case 2:
|
412 | user = _c.sent();
|
413 | if (user) {
|
414 | this.setUser(user);
|
415 | }
|
416 | observer.next(user);
|
417 | return [3 /*break*/, 4];
|
418 | case 3:
|
419 | observer.next(null);
|
420 | _c.label = 4;
|
421 | case 4: return [2 /*return*/];
|
422 | case 5:
|
423 | observer.next(null);
|
424 | return [3 /*break*/, 7];
|
425 | case 6:
|
426 | e_2 = _c.sent();
|
427 | observer.next(null);
|
428 | return [3 /*break*/, 7];
|
429 | case 7: return [2 /*return*/];
|
430 | }
|
431 | });
|
432 | });
|
433 | }, false);
|
434 | document.body.appendChild(iframe);
|
435 | });
|
436 | };
|
437 | /**
|
438 | * @param {?} scopes
|
439 | * @param {?=} redirectUri
|
440 | * @return {?}
|
441 | */
|
442 | NacoService.prototype.login = /**
|
443 | * @param {?} scopes
|
444 | * @param {?=} redirectUri
|
445 | * @return {?}
|
446 | */
|
447 | function (scopes, redirectUri) {
|
448 | if (!redirectUri) {
|
449 | redirectUri = this.router.url;
|
450 | }
|
451 | var /** @type {?} */ state = this.generateState();
|
452 | this.storage.set('state', state);
|
453 | var /** @type {?} */ query = this.buildQueryString({
|
454 | 'response_type': 'token',
|
455 | 'scopes': scopes,
|
456 | 'client': this.config.clientId,
|
457 | 'state': state,
|
458 | 'continue': redirectUri,
|
459 | });
|
460 | return this.config.endpoint + '/auth?' + query;
|
461 | };
|
462 | /**
|
463 | * @param {?=} redirectUri
|
464 | * @return {?}
|
465 | */
|
466 | NacoService.prototype.logout = /**
|
467 | * @param {?=} redirectUri
|
468 | * @return {?}
|
469 | */
|
470 | function (redirectUri) {
|
471 | var _this = this;
|
472 | this.signature = null;
|
473 | this.user = null;
|
474 | return new Promise(function (resolve) {
|
475 | Promise.all([
|
476 | _this.storage.remove('signature'),
|
477 | _this.storage.remove('user'),
|
478 | ]).then(function () {
|
479 | var /** @type {?} */ endpoint = _this.config.endpoint + '/auth/logout';
|
480 | if (redirectUri) {
|
481 | endpoint += '?continue=' + redirectUri;
|
482 | }
|
483 | resolve(endpoint);
|
484 | });
|
485 | });
|
486 | };
|
487 | /**
|
488 | * @return {?}
|
489 | */
|
490 | NacoService.prototype.getState = /**
|
491 | * @return {?}
|
492 | */
|
493 | function () {
|
494 | return this.storage.get('state');
|
495 | };
|
496 | /**
|
497 | * @param {?} route
|
498 | * @return {?}
|
499 | */
|
500 | NacoService.prototype.buildNestedUri = /**
|
501 | * @param {?} route
|
502 | * @return {?}
|
503 | */
|
504 | function (route) {
|
505 | var _this = this;
|
506 | var /** @type {?} */ uri = '';
|
507 | if (route.routeConfig && route.routeConfig.path) {
|
508 | uri += '/' + route.routeConfig.path;
|
509 | }
|
510 | if (route.children) {
|
511 | route.children.forEach(function (item) {
|
512 | uri += _this.buildNestedUri(item);
|
513 | });
|
514 | }
|
515 | return uri;
|
516 | };
|
517 | /**
|
518 | * @return {?}
|
519 | */
|
520 | NacoService.prototype.getRefreshToken = /**
|
521 | * @return {?}
|
522 | */
|
523 | function () {
|
524 | if (null !== this.refreshToken) {
|
525 | return Promise.resolve(this.refreshToken);
|
526 | }
|
527 | return this.storage.get('refresh_token');
|
528 | };
|
529 | /**
|
530 | * @return {?}
|
531 | */
|
532 | NacoService.prototype.getClientSecret = /**
|
533 | * @return {?}
|
534 | */
|
535 | function () {
|
536 | if (null !== this.clientSecret) {
|
537 | return Promise.resolve(this.clientSecret);
|
538 | }
|
539 | return this.storage.get('client_secret');
|
540 | };
|
541 | /**
|
542 | * @param {?} path
|
543 | * @return {?}
|
544 | */
|
545 | NacoService.prototype.getUri = /**
|
546 | * @param {?} path
|
547 | * @return {?}
|
548 | */
|
549 | function (path) {
|
550 | return this.config.endpoint + '/api/' + this.VERSION + path;
|
551 | };
|
552 | /**
|
553 | * @param {?=} path
|
554 | * @return {?}
|
555 | */
|
556 | NacoService.prototype.getCurrentOrigin = /**
|
557 | * @param {?=} path
|
558 | * @return {?}
|
559 | */
|
560 | function (path) {
|
561 | return window.location.origin + this.location.prepareExternalUrl(path || '');
|
562 | };
|
563 | /**
|
564 | * @return {?}
|
565 | */
|
566 | NacoService.prototype.generateState = /**
|
567 | * @return {?}
|
568 | */
|
569 | function () {
|
570 | var /** @type {?} */ possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
571 | var /** @type {?} */ text = '';
|
572 | for (var /** @type {?} */ i = 0; i < 5; i++) {
|
573 | text += possible.charAt(Math.floor(Math.random() * possible.length));
|
574 | }
|
575 | return text;
|
576 | };
|
577 | /**
|
578 | * @param {?} params
|
579 | * @return {?}
|
580 | */
|
581 | NacoService.prototype.buildQueryString = /**
|
582 | * @param {?} params
|
583 | * @return {?}
|
584 | */
|
585 | function (params) {
|
586 | var /** @type {?} */ queryParams = Object.keys(params).map(function (key) {
|
587 | return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);
|
588 | });
|
589 | return queryParams.join('&');
|
590 | };
|
591 | NacoService.decorators = [
|
592 | { type: core.Injectable },
|
593 | ];
|
594 | /** @nocollapse */
|
595 | NacoService.ctorParameters = function () {
|
596 | return [
|
597 | { type: Config },
|
598 | { type: router.Router },
|
599 | { type: storage.Storage },
|
600 | { type: http.HttpClient },
|
601 | { type: common.Location }
|
602 | ];
|
603 | };
|
604 | return NacoService;
|
605 | }());
|
606 |
|
607 | /**
|
608 | * @fileoverview added by tsickle
|
609 | * @suppress {checkTypes} checked by tsc
|
610 | */
|
611 | var Signature = /** @class */ (function () {
|
612 | function Signature() {
|
613 | }
|
614 | return Signature;
|
615 | }());
|
616 |
|
617 | /**
|
618 | * @fileoverview added by tsickle
|
619 | * @suppress {checkTypes} checked by tsc
|
620 | */
|
621 | var AuthenticatedGuard = /** @class */ (function () {
|
622 | function AuthenticatedGuard(naco, storage$$1) {
|
623 | this.naco = naco;
|
624 | this.storage = storage$$1;
|
625 | }
|
626 | /**
|
627 | * @param {?} route
|
628 | * @return {?}
|
629 | */
|
630 | AuthenticatedGuard.prototype.canActivate = /**
|
631 | * @param {?} route
|
632 | * @return {?}
|
633 | */
|
634 | function (route) {
|
635 | var _this = this;
|
636 | return this.naco.getUser().pipe(operators.first(), operators.map(function (user) {
|
637 | if (null === user) {
|
638 | var /** @type {?} */ uri = _this.naco.buildNestedUri(route.root);
|
639 | var /** @type {?} */ next = _this.naco.getCurrentOrigin('/' + _this.ltrim(uri));
|
640 | _this.storage.set('naco_intended_url', next).then(function () {
|
641 | window.location.href = _this.naco.login('basic email', _this.naco.getCurrentOrigin('/auth'));
|
642 | });
|
643 | }
|
644 | return !!user;
|
645 | }));
|
646 | };
|
647 | /**
|
648 | * @param {?} route
|
649 | * @return {?}
|
650 | */
|
651 | AuthenticatedGuard.prototype.canActivateChild = /**
|
652 | * @param {?} route
|
653 | * @return {?}
|
654 | */
|
655 | function (route) {
|
656 | return this.canActivate(route);
|
657 | };
|
658 | /**
|
659 | * @param {?} text
|
660 | * @return {?}
|
661 | */
|
662 | AuthenticatedGuard.prototype.ltrim = /**
|
663 | * @param {?} text
|
664 | * @return {?}
|
665 | */
|
666 | function (text) {
|
667 | return text.replace(/^\/+/, '');
|
668 | };
|
669 | /**
|
670 | * @param {?} text
|
671 | * @return {?}
|
672 | */
|
673 | AuthenticatedGuard.prototype.rtrim = /**
|
674 | * @param {?} text
|
675 | * @return {?}
|
676 | */
|
677 | function (text) {
|
678 | return text.replace(/\/+$/, '');
|
679 | };
|
680 | AuthenticatedGuard.decorators = [
|
681 | { type: core.Injectable },
|
682 | ];
|
683 | /** @nocollapse */
|
684 | AuthenticatedGuard.ctorParameters = function () {
|
685 | return [
|
686 | { type: NacoService },
|
687 | { type: storage.Storage }
|
688 | ];
|
689 | };
|
690 | return AuthenticatedGuard;
|
691 | }());
|
692 |
|
693 | /**
|
694 | * @fileoverview added by tsickle
|
695 | * @suppress {checkTypes} checked by tsc
|
696 | */
|
697 | var AuthInterceptor = /** @class */ (function () {
|
698 | function AuthInterceptor(naco) {
|
699 | this.naco = naco;
|
700 | }
|
701 | /**
|
702 | * @param {?} req
|
703 | * @param {?} next
|
704 | * @return {?}
|
705 | */
|
706 | AuthInterceptor.prototype.intercept = /**
|
707 | * @param {?} req
|
708 | * @param {?} next
|
709 | * @return {?}
|
710 | */
|
711 | function (req, next) {
|
712 | var _this = this;
|
713 | return fromPromise.fromPromise(this.naco.getSignature()).pipe(operators.switchMap(function (signature) {
|
714 | if (!signature) {
|
715 | return next.handle(req);
|
716 | }
|
717 | return next
|
718 | .handle(req.clone({
|
719 | setHeaders: {
|
720 | Authorization: signature.type + " " + signature.token,
|
721 | },
|
722 | }))
|
723 | .pipe(operators.catchError(function (error) {
|
724 | if (error.status === 401) {
|
725 | return _this.naco.refreshUser().pipe(operators.switchMap(function (user) {
|
726 | if (user) {
|
727 | return fromPromise.fromPromise(_this.naco.getSignature()).pipe(operators.switchMap(function (newSignature) {
|
728 | return next.handle(req.clone({
|
729 | setHeaders: {
|
730 | Authorization: newSignature.type + " " + newSignature.token,
|
731 | },
|
732 | }));
|
733 | }));
|
734 | }
|
735 | return ErrorObservable.ErrorObservable.create(error);
|
736 | }));
|
737 | }
|
738 | return ErrorObservable.ErrorObservable.create(error);
|
739 | }));
|
740 | }));
|
741 | };
|
742 | AuthInterceptor.decorators = [
|
743 | { type: core.Injectable },
|
744 | ];
|
745 | /** @nocollapse */
|
746 | AuthInterceptor.ctorParameters = function () {
|
747 | return [
|
748 | { type: NacoService }
|
749 | ];
|
750 | };
|
751 | return AuthInterceptor;
|
752 | }());
|
753 |
|
754 | /**
|
755 | * @fileoverview added by tsickle
|
756 | * @suppress {checkTypes} checked by tsc
|
757 | */
|
758 | /**
|
759 | * @param {?} config
|
760 | * @param {?} router
|
761 | * @param {?} storage
|
762 | * @param {?} http
|
763 | * @param {?} location
|
764 | * @return {?}
|
765 | */
|
766 | function nacoFactory(config, router$$1, storage$$1, http$$1, location) {
|
767 | return new NacoService(new Config(__assign({}, config)), router$$1, storage$$1, http$$1, location);
|
768 | }
|
769 | var /** @type {?} */ NACO_CONFIG = new core.InjectionToken('NACO_CONFIG');
|
770 |
|
771 | /**
|
772 | * @fileoverview added by tsickle
|
773 | * @suppress {checkTypes} checked by tsc
|
774 | */
|
775 | var AuthPage = /** @class */ (function () {
|
776 | function AuthPage(route, naco, storage$$1) {
|
777 | var _this = this;
|
778 | this.route = route;
|
779 | this.naco = naco;
|
780 | this.storage = storage$$1;
|
781 | this.message = 'Authenticating...';
|
782 | this.route.queryParams.subscribe(function (params) { return _this.handle(params); });
|
783 | }
|
784 | /**
|
785 | * @param {?} params
|
786 | * @return {?}
|
787 | */
|
788 | AuthPage.prototype.handle = /**
|
789 | * @param {?} params
|
790 | * @return {?}
|
791 | */
|
792 | function (params) {
|
793 | var _this = this;
|
794 | if (params["state"]) {
|
795 | this.naco.getState().then(function (state) {
|
796 | if (state !== params["state"]) {
|
797 | _this.message = 'Invalid CSRF';
|
798 | return;
|
799 | }
|
800 | _this.authenticate(params);
|
801 | });
|
802 | }
|
803 | else {
|
804 | this.authenticate(params);
|
805 | }
|
806 | };
|
807 | /**
|
808 | * @param {?} params
|
809 | * @return {?}
|
810 | */
|
811 | AuthPage.prototype.authenticate = /**
|
812 | * @param {?} params
|
813 | * @return {?}
|
814 | */
|
815 | function (params) {
|
816 | var _this = this;
|
817 | var /** @type {?} */ signature = {
|
818 | expiresIn: params["expires_in"],
|
819 | type: params["token_type"],
|
820 | token: params["access_token"],
|
821 | };
|
822 | this.naco.setSignature(signature);
|
823 | this.naco.getUser().subscribe(function (user) {
|
824 | if (null !== user) {
|
825 | _this.storage.get('naco_intended_url').then(function (url) {
|
826 | _this.storage.remove('naco_intended_url').then(function () {
|
827 | window.location.href = url ? url : '/';
|
828 | });
|
829 | });
|
830 | return;
|
831 | }
|
832 | _this.message = 'Unauthenticated!';
|
833 | });
|
834 | };
|
835 | AuthPage.decorators = [
|
836 | { type: core.Component, args: [{
|
837 | selector: 'naker-auth-page',
|
838 | template: '{{ message }}',
|
839 | },] },
|
840 | ];
|
841 | /** @nocollapse */
|
842 | AuthPage.ctorParameters = function () {
|
843 | return [
|
844 | { type: router.ActivatedRoute },
|
845 | { type: NacoService },
|
846 | { type: storage.Storage }
|
847 | ];
|
848 | };
|
849 | return AuthPage;
|
850 | }());
|
851 |
|
852 | /**
|
853 | * @fileoverview added by tsickle
|
854 | * @suppress {checkTypes} checked by tsc
|
855 | */
|
856 | var AuthSilentPage = /** @class */ (function () {
|
857 | function AuthSilentPage() {
|
858 | }
|
859 | AuthSilentPage.decorators = [
|
860 | { type: core.Component, args: [{
|
861 | selector: 'naker-auth-silent',
|
862 | template: 'Processing silent auth...',
|
863 | },] },
|
864 | ];
|
865 | return AuthSilentPage;
|
866 | }());
|
867 |
|
868 | /**
|
869 | * @fileoverview added by tsickle
|
870 | * @suppress {checkTypes} checked by tsc
|
871 | */
|
872 | var /** @type {?} */ routes = [
|
873 | {
|
874 | path: 'auth',
|
875 | component: AuthPage
|
876 | },
|
877 | {
|
878 | path: 'auth/silent',
|
879 | component: AuthSilentPage
|
880 | },
|
881 | ];
|
882 | var /** @type {?} */ AUTH_ROUTING = router.RouterModule.forChild(routes);
|
883 |
|
884 | /**
|
885 | * @fileoverview added by tsickle
|
886 | * @suppress {checkTypes} checked by tsc
|
887 | */
|
888 | var NacoViewModule = /** @class */ (function () {
|
889 | function NacoViewModule() {
|
890 | }
|
891 | NacoViewModule.decorators = [
|
892 | { type: core.NgModule, args: [{
|
893 | imports: [
|
894 | AUTH_ROUTING,
|
895 | ],
|
896 | declarations: [
|
897 | AuthPage,
|
898 | AuthSilentPage,
|
899 | ],
|
900 | },] },
|
901 | ];
|
902 | return NacoViewModule;
|
903 | }());
|
904 |
|
905 | /**
|
906 | * @fileoverview added by tsickle
|
907 | * @suppress {checkTypes} checked by tsc
|
908 | */
|
909 | var NacoModule = /** @class */ (function () {
|
910 | function NacoModule() {
|
911 | }
|
912 | /**
|
913 | * @param {?} config
|
914 | * @return {?}
|
915 | */
|
916 | NacoModule.forRoot = /**
|
917 | * @param {?} config
|
918 | * @return {?}
|
919 | */
|
920 | function (config) {
|
921 | return {
|
922 | ngModule: NacoModule,
|
923 | providers: [
|
924 | {
|
925 | provide: NACO_CONFIG,
|
926 | useValue: config,
|
927 | },
|
928 | {
|
929 | provide: NacoService,
|
930 | useFactory: nacoFactory,
|
931 | deps: [NACO_CONFIG, router.Router, storage.Storage, http.HttpClient, common.Location],
|
932 | },
|
933 | AuthenticatedGuard,
|
934 | ],
|
935 | };
|
936 | };
|
937 | NacoModule.decorators = [
|
938 | { type: core.NgModule, args: [{
|
939 | imports: [
|
940 | storage.UbudStorageModule,
|
941 | NacoViewModule,
|
942 | ],
|
943 | },] },
|
944 | ];
|
945 | return NacoModule;
|
946 | }());
|
947 |
|
948 | /**
|
949 | * @fileoverview added by tsickle
|
950 | * @suppress {checkTypes} checked by tsc
|
951 | */
|
952 |
|
953 | /**
|
954 | * @fileoverview added by tsickle
|
955 | * @suppress {checkTypes} checked by tsc
|
956 | */
|
957 |
|
958 | exports.NacoService = NacoService;
|
959 | exports.User = User;
|
960 | exports.Signature = Signature;
|
961 | exports.Config = Config;
|
962 | exports.AuthenticatedGuard = AuthenticatedGuard;
|
963 | exports.AuthInterceptor = AuthInterceptor;
|
964 | exports.NacoModule = NacoModule;
|
965 | exports.ɵf = NACO_CONFIG;
|
966 | exports.ɵe = nacoFactory;
|
967 | exports.ɵa = NacoViewModule;
|
968 | exports.ɵd = AuthSilentPage;
|
969 | exports.ɵc = AuthPage;
|
970 | exports.ɵb = AUTH_ROUTING;
|
971 |
|
972 | Object.defineProperty(exports, '__esModule', { value: true });
|
973 |
|
974 | })));
|
975 |
|
976 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFrZXItbmFjby51bWQuanMubWFwIiwic291cmNlcyI6W251bGwsIm5nOi8vQG5ha2VyL25hY28vZG9tYWlucy92YWx1ZXMvY29uZmlnLnRzIiwibmc6Ly9AbmFrZXIvbmFjby9kb21haW5zL21vZGVscy91c2VyLnRzIiwibmc6Ly9AbmFrZXIvbmFjby9kb21haW5zL3NlcnZpY2VzL25hY28uc2VydmljZS50cyIsIm5nOi8vQG5ha2VyL25hY28vZG9tYWlucy92YWx1ZXMvc2lnbmF0dXJlLnRzIiwibmc6Ly9AbmFrZXIvbmFjby9ndWFyZHMvYXV0aGVudGljYXRlZC5ndWFyZC50cyIsIm5nOi8vQG5ha2VyL25hY28vaW50ZXJjZXB0b3JzL2F1dGguaW50ZXJjZXB0b3IudHMiLCJuZzovL0BuYWtlci9uYWNvL2ZhY3Rvcmllcy9uYWNvLWZhY3RvcnkudHMiLCJuZzovL0BuYWtlci9uYWNvL3ZpZXdzL3BhZ2VzL2F1dGgucGFnZS50cyIsIm5nOi8vQG5ha2VyL25hY28vdmlld3MvcGFnZXMvYXV0aC1zaWxlbnQucGFnZS50cyIsIm5nOi8vQG5ha2VyL25hY28vdmlld3Mvcm91dGVzLnRzIiwibmc6Ly9AbmFrZXIvbmFjby92aWV3cy9tb2R1bGUudHMiLCJuZzovL0BuYWtlci9uYWNvL25hY28ubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMClcclxuICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZShyZXN1bHQudmFsdWUpOyB9KS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBleHBvcnRzKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcclxuICAgIHJlc3VsdC5kZWZhdWx0ID0gbW9kO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIENvbmZpZyB7XG4gICAgcHVibGljIGVuZHBvaW50OiBzdHJpbmcgPSAnaHR0cHM6Ly9hY2NvdW50LmtlbW5ha2VyLmdvLmlkJztcbiAgICBwdWJsaWMgY2xpZW50SWQ6IHN0cmluZztcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhPzogUGFydGlhbDxDb25maWc+KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHlwZSB9IGZyb20gJ2NsYXNzLXRyYW5zZm9ybWVyJztcblxuZXhwb3J0IGNsYXNzIFVzZXIge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nO1xuICAgIHB1YmxpYyB1c2VybmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyBlbWFpbD86IHN0cmluZztcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyBzdGF0dXM6IG51bWJlcjtcblxuICAgIEBUeXBlKGZvcndhcmRSZWYoKCkgPT4gRGF0ZSkgYXMgYW55KVxuICAgIHB1YmxpYyB1cGRhdGVkQXQ6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3RvcmFnZSB9IGZyb20gJ0B1YnVkL3N0b3JhZ2UnO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi4vdmFsdWVzL2NvbmZpZyc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vbW9kZWxzL3VzZXInO1xuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIE9ic2VydmVyLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2lnbmF0dXJlIH0gZnJvbSAnLi4vdmFsdWVzL3NpZ25hdHVyZSc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSB9IGZyb20gJ3J4anMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9mcm9tUHJvbWlzZSc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgcGxhaW5Ub0NsYXNzIH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBFcnJvck9ic2VydmFibGUgfSBmcm9tICdyeGpzLWNvbXBhdC9vYnNlcnZhYmxlL0Vycm9yT2JzZXJ2YWJsZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOYWNvU2VydmljZSB7XG4gICAgcHVibGljIHJlYWRvbmx5IFZFUlNJT04gPSAndjEnO1xuXG4gICAgcHJpdmF0ZSBzaWduYXR1cmU6IFNpZ25hdHVyZSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgdXNlcjogVXNlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcmVmcmVzaFRva2VuOiBTaWduYXR1cmUgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGNsaWVudFNlY3JldDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IENvbmZpZywgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlciwgcHJpdmF0ZSBzdG9yYWdlOiBTdG9yYWdlLCBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uKSB7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFVzZXIodXNlcjogVXNlciB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51c2VyID0gdXNlcjtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldCgndXNlcicsIHVzZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRVc2VyKCk6IE9ic2VydmFibGU8VXNlciB8IG51bGw+IHtcbiAgICAgICAgaWYgKG51bGwgIT09IHRoaXMudXNlcikge1xuICAgICAgICAgICAgcmV0dXJuIG9mKHRoaXMudXNlcik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cmkgPSB0aGlzLmdldFVyaSgnL3VzZXJzL21lJyk7XG5cbiAgICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKHRoaXMuZ2V0U2lnbmF0dXJlKCkpLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKHNpZ25hdHVyZTogU2lnbmF0dXJlIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBzaWduYXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGAke3NpZ25hdHVyZS50eXBlfSAke3NpZ25hdHVyZS50b2tlbn1gLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KHVyaSwgb3B0aW9ucykucGlwZShcbiAgICAgICAgICAgICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGFyZSBubyBib2R5IHRvIGJlIHRyYW5zZm9ybWVkJyk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBtYXAoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0aFVzZXI6IGFueSA9IHBsYWluVG9DbGFzcyhVc2VyLCBkYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRVc2VyKGF1dGhVc2VyKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1dGhVc2VyO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZTogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICg0MDEgPT09IGUuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFVzZXIoKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHJlZnJlc2hVc2VyOiBVc2VyIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZnJlc2hVc2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHJlZnJlc2hVc2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yT2JzZXJ2YWJsZS5jcmVhdGUoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFcnJvck9ic2VydmFibGUuY3JlYXRlKGUpO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNpZ25hdHVyZSgpOiBQcm9taXNlPFNpZ25hdHVyZSB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnNpZ25hdHVyZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFNpZ25hdHVyZShzaWduYXR1cmU6IFNpZ25hdHVyZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNpZ25hdHVyZSA9IHNpZ25hdHVyZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q2xpZW50U2VjcmV0KHNlY3JldDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2xpZW50U2VjcmV0ID0gc2VjcmV0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRSZWZyZXNoVG9rZW4ocmVmcmVzaFRva2VuOiBTaWduYXR1cmUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4gPSByZWZyZXNoVG9rZW47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZnJlc2hVc2VyKHNjb3Blcz86IHN0cmluZyk6IE9ic2VydmFibGU8VXNlciB8IG51bGw+IHtcbiAgICAgICAgdGhpcy5zZXRVc2VyKG51bGwpO1xuICAgICAgICB0aGlzLnNldFNpZ25hdHVyZShudWxsKTtcblxuICAgICAgICByZXR1cm4gZm9ya0pvaW4odGhpcy5nZXRSZWZyZXNoVG9rZW4oKSwgdGhpcy5nZXRDbGllbnRTZWNyZXQoKSkucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgocmVzdWx0czogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmcmVzaFRva2VuOiBTaWduYXR1cmUgPSByZXN1bHRzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFNlY3JldDogc3RyaW5nID0gcmVzdWx0c1sxXTtcblxuICAgICAgICAgICAgICAgIGlmIChyZWZyZXNoVG9rZW4gJiYgY2xpZW50U2VjcmV0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZnJlc2hXaXRoUmVmcmVzaFRva2VuKGNsaWVudFNlY3JldCwgcmVmcmVzaFRva2VuLnRva2VuLCBzY29wZXMpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZnJlc2hXaXRoU2lsZW50QXV0aCgpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZnJlc2hXaXRoUmVmcmVzaFRva2VuKGNsaWVudFNlY3JldDogc3RyaW5nLCByZWZyZXNoVG9rZW46IHN0cmluZywgc2NvcGVzPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxVc2VyIHwgbnVsbD4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5odHRwLnBvc3QodGhpcy5nZXRVcmkoJy90b2tlbnMnKSwge1xuICAgICAgICAgICAgZ3JhbnRfdHlwZTogJ3JlZnJlc2hfdG9rZW4nLFxuICAgICAgICAgICAgc2NvcGVzOiBzY29wZXMgfHwgJ2Jhc2ljIGVtYWlsJyxcbiAgICAgICAgICAgIGNsaWVudF9pZDogdGhpcy5jb25maWcuY2xpZW50SWQsXG4gICAgICAgICAgICBjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXQsXG4gICAgICAgICAgICByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXF1ZXN0LnBpcGUoXG4gICAgICAgICAgICB0YXAoKHRva2VuczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRva2VucyAmJiB0b2tlbnMuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNpZ25hdHVyZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVzSW46IHRva2Vucy5kYXRhLmV4cGlyZXNfaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0b2tlbnMuZGF0YS50b2tlbl90eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IHRva2Vucy5kYXRhLmFjY2Vzc190b2tlbixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRSZWZyZXNoVG9rZW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdG9rZW5zLmRhdGEudG9rZW5fdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiB0b2tlbnMuZGF0YS5yZWZyZXNoX3Rva2VuLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1hcCgodG9rZW5zOiBhbnkpID0+IHRva2VucyAmJiB0b2tlbnMuZGF0YSksXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKGhhc1Rva2VuOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc1Rva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFVzZXIoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVmcmVzaFdpdGhTaWxlbnRBdXRoKCk6IE9ic2VydmFibGU8VXNlciB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFVzZXIgfCBudWxsPigob2JzZXJ2ZXI6IE9ic2VydmVyPFVzZXIgfCBudWxsPikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RVcmkgPSB0aGlzLmdldEN1cnJlbnRPcmlnaW4oJ2F1dGgvc2lsZW50Jyk7XG4gICAgICAgICAgICBjb25zdCB1cmkgPSB0aGlzLmxvZ2luKCdiYXNpYyBlbWFpbCcsIHJlZGlyZWN0VXJpKTtcblxuICAgICAgICAgICAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKCdzcmMnLCB1cmkpO1xuICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIGlmcmFtZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKTtcblxuICAgICAgICAgICAgICAgICAgICBpZnJhbWUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpZnJhbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeVN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVlcnlQYXJ0cyA9IHF1ZXJ5U3RyaW5nLnNwbGl0KCcmJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7fTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHF1ZXJ5UGFydHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtUGFydHMgPSBpdGVtLnNwbGl0KCc9Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbaXRlbVBhcnRzWzBdXSA9IGl0ZW1QYXJ0c1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnYWNjZXNzX3Rva2VuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHBhcmFtc1snc3RhdGUnXSB8fCBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlICE9PSBhd2FpdCB0aGlzLmdldFN0YXRlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTaWduYXR1cmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogcGFyYW1zWydhY2Nlc3NfdG9rZW4nXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogcGFyYW1zWyd0b2tlbl90eXBlJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXNJbjogcGFyYW1zWyd0dGwnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmdldFVzZXIoKS50b1Byb21pc2UoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VXNlcih1c2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBmYWxzZSk7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvZ2luKHNjb3Blczogc3RyaW5nLCByZWRpcmVjdFVyaT86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICghcmVkaXJlY3RVcmkpIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXJpID0gdGhpcy5yb3V0ZXIudXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdlbmVyYXRlU3RhdGUoKTtcblxuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0KCdzdGF0ZScsIHN0YXRlKTtcblxuICAgICAgICBjb25zdCBxdWVyeTogc3RyaW5nID0gdGhpcy5idWlsZFF1ZXJ5U3RyaW5nKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICdyZXNwb25zZV90eXBlJzogJ3Rva2VuJyxcbiAgICAgICAgICAgICAgICAnc2NvcGVzJzogc2NvcGVzLFxuICAgICAgICAgICAgICAgICdjbGllbnQnOiB0aGlzLmNvbmZpZy5jbGllbnRJZCxcbiAgICAgICAgICAgICAgICAnc3RhdGUnOiBzdGF0ZSxcbiAgICAgICAgICAgICAgICAnY29udGludWUnOiByZWRpcmVjdFVyaSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmVuZHBvaW50ICsgJy9hdXRoPycgKyBxdWVyeTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9nb3V0KHJlZGlyZWN0VXJpPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgdGhpcy5zaWduYXR1cmUgPSBudWxsO1xuICAgICAgICB0aGlzLnVzZXIgPSBudWxsO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlKCdzaWduYXR1cmUnKSxcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlKCd1c2VyJyksXG4gICAgICAgICAgICBdKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kcG9pbnQgPSB0aGlzLmNvbmZpZy5lbmRwb2ludCArICcvYXV0aC9sb2dvdXQnO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlZGlyZWN0VXJpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50ICs9ICc/Y29udGludWU9JyArIHJlZGlyZWN0VXJpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlc29sdmUoZW5kcG9pbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTdGF0ZSgpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXQoJ3N0YXRlJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGJ1aWxkTmVzdGVkVXJpKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHVyaSA9ICcnO1xuXG4gICAgICAgIGlmIChyb3V0ZS5yb3V0ZUNvbmZpZyAmJiByb3V0ZS5yb3V0ZUNvbmZpZy5wYXRoKSB7XG4gICAgICAgICAgICB1cmkgKz0gJy8nICsgcm91dGUucm91dGVDb25maWcucGF0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyb3V0ZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgcm91dGUuY2hpbGRyZW4uZm9yRWFjaCgoaXRlbTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCkgPT4ge1xuICAgICAgICAgICAgICAgIHVyaSArPSB0aGlzLmJ1aWxkTmVzdGVkVXJpKGl0ZW0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXJpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UmVmcmVzaFRva2VuKCk6IFByb21pc2U8U2lnbmF0dXJlIHwgbnVsbD4ge1xuICAgICAgICBpZiAobnVsbCAhPT0gdGhpcy5yZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5yZWZyZXNoVG9rZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXQoJ3JlZnJlc2hfdG9rZW4nKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENsaWVudFNlY3JldCgpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICAgICAgaWYgKG51bGwgIT09IHRoaXMuY2xpZW50U2VjcmV0KSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuY2xpZW50U2VjcmV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2UuZ2V0KCdjbGllbnRfc2VjcmV0Jyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRVcmkocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmVuZHBvaW50ICsgJy9hcGkvJyArIHRoaXMuVkVSU0lPTiArIHBhdGg7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRPcmlnaW4ocGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgdGhpcy5sb2NhdGlvbi5wcmVwYXJlRXh0ZXJuYWxVcmwocGF0aCB8fCAnJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVN0YXRlKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JztcbiAgICAgICAgbGV0IHRleHQgPSAnJztcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDU7IGkrKykge1xuICAgICAgICAgICAgdGV4dCArPSBwb3NzaWJsZS5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcG9zc2libGUubGVuZ3RoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkUXVlcnlTdHJpbmcocGFyYW1zOiBvYmplY3QpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IE9iamVjdC5rZXlzKHBhcmFtcykubWFwKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtc1trZXldKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW1zLmpvaW4oJyYnKTtcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgU2lnbmF0dXJlIHtcbiAgICBwdWJsaWMgZXhwaXJlc0luPzogbnVtYmVyO1xuICAgIHB1YmxpYyB0b2tlbjogc3RyaW5nO1xuICAgIHB1YmxpYyB0eXBlOiBzdHJpbmc7XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDYW5BY3RpdmF0ZSwgQ2FuQWN0aXZhdGVDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBOYWNvU2VydmljZSB9IGZyb20gJy4uL2RvbWFpbnMvc2VydmljZXMvbmFjby5zZXJ2aWNlJztcbmltcG9ydCB7IGZpcnN0LCBtYXAgfSBmcm9tICdyeGpzL2ludGVybmFsL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vZG9tYWlucy9tb2RlbHMvdXNlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdG9yYWdlIH0gZnJvbSAnQHVidWQvc3RvcmFnZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyL3NyYy9yb3V0ZXJfc3RhdGUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXV0aGVudGljYXRlZEd1YXJkIGltcGxlbWVudHMgQ2FuQWN0aXZhdGUsIENhbkFjdGl2YXRlQ2hpbGQge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG5hY286IE5hY29TZXJ2aWNlLCBwcml2YXRlIHN0b3JhZ2U6IFN0b3JhZ2UpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuQWN0aXZhdGUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFjby5nZXRVc2VyKCkucGlwZShcbiAgICAgICAgICAgIGZpcnN0KCksXG4gICAgICAgICAgICBtYXAoKHVzZXI6IFVzZXIgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IHVzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJpID0gdGhpcy5uYWNvLmJ1aWxkTmVzdGVkVXJpKHJvdXRlLnJvb3QpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5uYWNvLmdldEN1cnJlbnRPcmlnaW4oJy8nICsgdGhpcy5sdHJpbSh1cmkpKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0KCduYWNvX2ludGVuZGVkX3VybCcsIG5leHQpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLm5hY28ubG9naW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jhc2ljIGVtYWlsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hY28uZ2V0Q3VycmVudE9yaWdpbignL2F1dGgnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiAhIXVzZXI7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuQWN0aXZhdGVDaGlsZChyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW5BY3RpdmF0ZShyb3V0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsdHJpbSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9eXFwvKy8sJycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcnRyaW0odGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXFwvKyQvLCcnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEV2ZW50LCBIdHRwSGFuZGxlciwgSHR0cEludGVyY2VwdG9yLCBIdHRwUmVxdWVzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5hY29TZXJ2aWNlIH0gZnJvbSAnLi4vZG9tYWlucy9zZXJ2aWNlcy9uYWNvLnNlcnZpY2UnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UgfSBmcm9tICdyeGpzL2ludGVybmFsL29ic2VydmFibGUvZnJvbVByb21pc2UnO1xuaW1wb3J0IHsgU2lnbmF0dXJlIH0gZnJvbSAnLi4vZG9tYWlucy92YWx1ZXMvc2lnbmF0dXJlJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvaW50ZXJuYWwvb3BlcmF0b3JzJztcbmltcG9ydCB7IEVycm9yT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMtY29tcGF0L29ic2VydmFibGUvRXJyb3JPYnNlcnZhYmxlJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEF1dGhJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgbmFjbzogTmFjb1NlcnZpY2UpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW50ZXJjZXB0KHJlcTogSHR0cFJlcXVlc3Q8YW55PiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XG4gICAgICAgIHJldHVybiBmcm9tUHJvbWlzZSh0aGlzLm5hY28uZ2V0U2lnbmF0dXJlKCkpLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKHNpZ25hdHVyZTogU2lnbmF0dXJlIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghc2lnbmF0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0XG4gICAgICAgICAgICAgICAgICAgIC5oYW5kbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXEuY2xvbmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYCR7c2lnbmF0dXJlLnR5cGV9ICR7c2lnbmF0dXJlLnRva2VufWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hY28ucmVmcmVzaFVzZXIoKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKCh1c2VyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbVByb21pc2UodGhpcy5uYWNvLmdldFNpZ25hdHVyZSgpKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKChuZXdTaWduYXR1cmU6IFNpZ25hdHVyZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmNsb25lKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgJHtuZXdTaWduYXR1cmUudHlwZX0gJHtuZXdTaWduYXR1cmUudG9rZW59YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JPYnNlcnZhYmxlLmNyZWF0ZShlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JPYnNlcnZhYmxlLmNyZWF0ZShlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IE5hY29TZXJ2aWNlIH0gZnJvbSAnLi4vZG9tYWlucy9zZXJ2aWNlcy9uYWNvLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi4vZG9tYWlucy92YWx1ZXMvY29uZmlnJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdG9yYWdlIH0gZnJvbSAnQHVidWQvc3RvcmFnZSc7XG5pbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuZXhwb3J0IGZ1bmN0aW9uIG5hY29GYWN0b3J5KGNvbmZpZzogb2JqZWN0LCByb3V0ZXI6IFJvdXRlciwgc3RvcmFnZTogU3RvcmFnZSwgaHR0cDogSHR0cENsaWVudCwgbG9jYXRpb246IExvY2F0aW9uKSB7XG4gICAgcmV0dXJuIG5ldyBOYWNvU2VydmljZShcbiAgICAgICAgbmV3IENvbmZpZyh7IC4uLmNvbmZpZyB9KSxcbiAgICAgICAgcm91dGVyLFxuICAgICAgICBzdG9yYWdlLFxuICAgICAgICBodHRwLFxuICAgICAgICBsb2NhdGlvblxuICAgICk7XG59XG5cbmV4cG9ydCBjb25zdCBOQUNPX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxvYmplY3Q+KCdOQUNPX0NPTkZJRycpO1xuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE5hY29TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZG9tYWlucy9zZXJ2aWNlcy9uYWNvLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2lnbmF0dXJlIH0gZnJvbSAnLi4vLi4vZG9tYWlucy92YWx1ZXMvc2lnbmF0dXJlJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi8uLi9kb21haW5zL21vZGVscy91c2VyJztcbmltcG9ydCB7IFN0b3JhZ2UgfSBmcm9tICdAdWJ1ZC9zdG9yYWdlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduYWtlci1hdXRoLXBhZ2UnLFxuICAgIHRlbXBsYXRlOiAne3sgbWVzc2FnZSB9fScsXG59KVxuZXhwb3J0IGNsYXNzIEF1dGhQYWdlIHtcbiAgICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nID0gJ0F1dGhlbnRpY2F0aW5nLi4uJztcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSwgcHJpdmF0ZSBuYWNvOiBOYWNvU2VydmljZSwgcHJpdmF0ZSBzdG9yYWdlOiBTdG9yYWdlKSB7XG4gICAgICAgIHRoaXMucm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChwYXJhbXM6IFBhcmFtcykgPT4gdGhpcy5oYW5kbGUocGFyYW1zKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZShwYXJhbXM6IFBhcmFtcyk6IHZvaWQge1xuICAgICAgICBpZiAocGFyYW1zLnN0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLm5hY28uZ2V0U3RhdGUoKS50aGVuKChzdGF0ZTogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gcGFyYW1zLnN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9ICdJbnZhbGlkIENTUkYnO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhlbnRpY2F0ZShwYXJhbXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmF1dGhlbnRpY2F0ZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhdXRoZW50aWNhdGUocGFyYW1zOiBQYXJhbXMpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlOiBTaWduYXR1cmUgPSB7XG4gICAgICAgICAgICBleHBpcmVzSW46IHBhcmFtcy5leHBpcmVzX2luLFxuICAgICAgICAgICAgdHlwZTogcGFyYW1zLnRva2VuX3R5cGUsXG4gICAgICAgICAgICB0b2tlbjogcGFyYW1zLmFjY2Vzc190b2tlbixcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLm5hY28uc2V0U2lnbmF0dXJlKHNpZ25hdHVyZSk7XG5cbiAgICAgICAgdGhpcy5uYWNvLmdldFVzZXIoKS5zdWJzY3JpYmUoKHVzZXI6IFVzZXIgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICBpZiAobnVsbCAhPT0gdXNlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5nZXQoJ25hY29faW50ZW5kZWRfdXJsJykudGhlbigodXJsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZSgnbmFjb19pbnRlbmRlZF91cmwnKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsID8gdXJsIDogJy8nO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gJ1VuYXV0aGVudGljYXRlZCEnO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbiIsImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25ha2VyLWF1dGgtc2lsZW50JyxcbiAgICB0ZW1wbGF0ZTogJ1Byb2Nlc3Npbmcgc2lsZW50IGF1dGguLi4nLFxufSlcbmV4cG9ydCBjbGFzcyBBdXRoU2lsZW50UGFnZSB7XG59XG4iLCJpbXBvcnQgeyBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUsIFJvdXRlcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBBdXRoUGFnZSB9IGZyb20gJy4vcGFnZXMvYXV0aC5wYWdlJztcbmltcG9ydCB7IEF1dGhTaWxlbnRQYWdlIH0gZnJvbSAnLi9wYWdlcy9hdXRoLXNpbGVudC5wYWdlJztcblxuY29uc3Qgcm91dGVzOiBSb3V0ZXMgPSBbXG4gICAge1xuICAgICAgICBwYXRoOiAnYXV0aCcsXG4gICAgICAgIGNvbXBvbmVudDogQXV0aFBhZ2VcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJ2F1dGgvc2lsZW50JyxcbiAgICAgICAgY29tcG9uZW50OiBBdXRoU2lsZW50UGFnZVxuICAgIH0sXG5dO1xuXG5leHBvcnQgY29uc3QgQVVUSF9ST1VUSU5HOiBNb2R1bGVXaXRoUHJvdmlkZXJzID0gUm91dGVyTW9kdWxlLmZvckNoaWxkKHJvdXRlcyk7XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVVUSF9ST1VUSU5HIH0gZnJvbSAnLi9yb3V0ZXMnO1xuaW1wb3J0IHsgQXV0aFBhZ2UgfSBmcm9tICcuL3BhZ2VzL2F1dGgucGFnZSc7XG5pbXBvcnQgeyBBdXRoU2lsZW50UGFnZSB9IGZyb20gJy4vcGFnZXMvYXV0aC1zaWxlbnQucGFnZSc7XG5cbkBOZ01vZHVsZSh7XG4gICAgaW1wb3J0czogW1xuICAgICAgICBBVVRIX1JPVVRJTkcsXG4gICAgXSxcbiAgICBkZWNsYXJhdGlvbnM6IFtcbiAgICAgICAgQXV0aFBhZ2UsXG4gICAgICAgIEF1dGhTaWxlbnRQYWdlLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIE5hY29WaWV3TW9kdWxlIHtcbn1cbiIsImltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOYWNvU2VydmljZSB9IGZyb20gJy4vZG9tYWlucy9zZXJ2aWNlcy9uYWNvLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aGVudGljYXRlZEd1YXJkIH0gZnJvbSAnLi9ndWFyZHMvYXV0aGVudGljYXRlZC5ndWFyZCc7XG5pbXBvcnQgeyBOQUNPX0NPTkZJRywgbmFjb0ZhY3RvcnkgfSBmcm9tICcuL2ZhY3Rvcmllcy9uYWNvLWZhY3RvcnknO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFN0b3JhZ2UsIFVidWRTdG9yYWdlTW9kdWxlIH0gZnJvbSAnQHVidWQvc3RvcmFnZSc7XG5pbXBvcnQgeyBOYWNvVmlld01vZHVsZSB9IGZyb20gJy4vdmlld3MvbW9kdWxlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBOZ01vZHVsZSh7XG4gICAgaW1wb3J0czogW1xuICAgICAgICBVYnVkU3RvcmFnZU1vZHVsZSxcbiAgICAgICAgTmFjb1ZpZXdNb2R1bGUsXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTmFjb01vZHVsZSB7XG4gICAgcHVibGljIHN0YXRpYyBmb3JSb290KGNvbmZpZzogeyBjbGllbnRJZDogc3RyaW5nLCBlbmRwb2ludD86IHN0cmluZyB9KTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuZ01vZHVsZTogTmFjb01vZHVsZSxcbiAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTkFDT19DT05GSUcsXG4gICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiBjb25maWcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IE5hY29TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICB1c2VGYWN0b3J5OiBuYWNvRmFjdG9yeSxcbiAgICAgICAgICAgICAgICAgICAgZGVwczogW05BQ09fQ09ORklHLCBSb3V0ZXIsIFN0b3JhZ2UsIEh0dHBDbGllbnQsIExvY2F0aW9uXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIEF1dGhlbnRpY2F0ZWRHdWFyZCxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIlR5cGUiLCJmb3J3YXJkUmVmIiwicm91dGVyIiwic3RvcmFnZSIsImh0dHAiLCJvZiIsImZyb21Qcm9taXNlIiwic3dpdGNoTWFwIiwibWFwIiwicGxhaW5Ub0NsYXNzIiwiY2F0Y2hFcnJvciIsIkVycm9yT2JzZXJ2YWJsZSIsImZvcmtKb2luIiwidGFwIiwiT2JzZXJ2YWJsZSIsInRzbGliXzEuX192YWx1ZXMiLCJJbmplY3RhYmxlIiwiUm91dGVyIiwiU3RvcmFnZSIsIkh0dHBDbGllbnQiLCJMb2NhdGlvbiIsImZpcnN0IiwiSW5qZWN0aW9uVG9rZW4iLCJDb21wb25lbnQiLCJBY3RpdmF0ZWRSb3V0ZSIsIlJvdXRlck1vZHVsZSIsIk5nTW9kdWxlIiwiVWJ1ZFN0b3JhZ2VNb2R1bGUiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBOzs7Ozs7Ozs7Ozs7OztBQWNBLElBZU8sSUFBSSxRQUFRLEdBQUc7UUFDbEIsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksa0JBQWtCLENBQUM7WUFDM0MsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FB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QUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFBQyxTQUFTO3dCQUNqRCxLQUFLLENBQUM7NEJBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7NEJBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs0QkFBQyxTQUFTO3dCQUNqRDs0QkFDSSxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0NBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQ0FBQyxTQUFTOzZCQUFFOzRCQUM1RyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQ0FBRSxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FBQyxNQUFNOzZCQUFFOzRCQUN0RixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0NBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQ0FBQyxNQUFNOzZCQUFFOzRCQUNyRSxJ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 |
\ | No newline at end of file |