1 | (function (global, factory) {
|
2 | typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('lodash'), require('@angular/common/http'), require('core-js/fn/object'), require('rxjs'), require('rxjs/operators')) :
|
3 | typeof define === 'function' && define.amd ? define('ngx-restangular', ['exports', '@angular/core', 'lodash', '@angular/common/http', 'core-js/fn/object', 'rxjs', 'rxjs/operators'], factory) :
|
4 | (factory((global['ngx-restangular'] = {}),global.ng.core,null,global.ng.common.http,null,global.rxjs,global.rxjs.operators));
|
5 | }(this, (function (exports,core,lodash,http,object,rxjs,operators) { '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 | function __read(o, n) {
|
22 | var m = typeof Symbol === "function" && o[Symbol.iterator];
|
23 | if (!m)
|
24 | return o;
|
25 | var i = m.call(o), r, ar = [], e;
|
26 | try {
|
27 | while ((n === void 0 || n-- > 0) && !(r = i.next()).done)
|
28 | ar.push(r.value);
|
29 | }
|
30 | catch (error) {
|
31 | e = { error: error };
|
32 | }
|
33 | finally {
|
34 | try {
|
35 | if (r && !r.done && (m = i["return"]))
|
36 | m.call(i);
|
37 | }
|
38 | finally {
|
39 | if (e)
|
40 | throw e.error;
|
41 | }
|
42 | }
|
43 | return ar;
|
44 | }
|
45 | function __spread() {
|
46 | for (var ar = [], i = 0; i < arguments.length; i++)
|
47 | ar = ar.concat(__read(arguments[i]));
|
48 | return ar;
|
49 | }
|
50 |
|
51 | /**
|
52 | * @fileoverview added by tsickle
|
53 | * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
|
54 | */
|
55 | /** @type {?} */
|
56 | var RESTANGULAR = new core.InjectionToken('restangularWithConfig');
|
57 | /**
|
58 | * @param {?} __0
|
59 | * @return {?}
|
60 | */
|
61 | function RestangularFactory(_a) {
|
62 | var _b = __read(_a, 2), callbackOrServices = _b[0], callback = _b[1];
|
63 | /** @type {?} */
|
64 | var arrServices = [];
|
65 | /** @type {?} */
|
66 | var fn = callbackOrServices;
|
67 | if (lodash.isArray(callbackOrServices)) {
|
68 | arrServices = callbackOrServices;
|
69 | fn = callback;
|
70 | }
|
71 | return { fn: fn, arrServices: arrServices };
|
72 | }
|
73 |
|
74 | /**
|
75 | * @fileoverview added by tsickle
|
76 | * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
|
77 | */
|
78 | var RestangularHelper = /** @class */ (function () {
|
79 | function RestangularHelper() {
|
80 | }
|
81 | /**
|
82 | * @param {?} options
|
83 | * @return {?}
|
84 | */
|
85 | RestangularHelper.createRequest = /**
|
86 | * @param {?} options
|
87 | * @return {?}
|
88 | */
|
89 | function (options) {
|
90 | /** @type {?} */
|
91 | var requestQueryParams = RestangularHelper.createRequestQueryParams(options.params);
|
92 | /** @type {?} */
|
93 | var requestHeaders = RestangularHelper.createRequestHeaders(options.headers);
|
94 | /** @type {?} */
|
95 | var methodName = options.method.toUpperCase();
|
96 | /** @type {?} */
|
97 | var withCredentials = options.withCredentials || false;
|
98 | /** @type {?} */
|
99 | var request = new http.HttpRequest(methodName, options.url, options.data, {
|
100 | headers: requestHeaders,
|
101 | params: requestQueryParams,
|
102 | responseType: options.responseType,
|
103 | withCredentials: withCredentials
|
104 | });
|
105 | if (['GET', 'DELETE', 'HEAD', 'JSONP', 'OPTIONS'].indexOf(methodName) >= 0) {
|
106 | request = new http.HttpRequest(methodName, options.url, {
|
107 | headers: requestHeaders,
|
108 | params: requestQueryParams,
|
109 | responseType: options.responseType,
|
110 | withCredentials: withCredentials
|
111 | });
|
112 | }
|
113 | return request;
|
114 | };
|
115 | /**
|
116 | * @param {?} queryParams
|
117 | * @return {?}
|
118 | */
|
119 | RestangularHelper.createRequestQueryParams = /**
|
120 | * @param {?} queryParams
|
121 | * @return {?}
|
122 | */
|
123 | function (queryParams) {
|
124 | /** @type {?} */
|
125 | var requestQueryParams = object.assign({}, queryParams);
|
126 | /** @type {?} */
|
127 | var search = new http.HttpParams();
|
128 | var _loop_1 = function (key) {
|
129 | /** @type {?} */
|
130 | var value = requestQueryParams[key];
|
131 | if (Array.isArray(value)) {
|
132 | value.forEach(function (val) {
|
133 | search = search.append(key, val);
|
134 | });
|
135 | }
|
136 | else {
|
137 | if (typeof value === 'object') {
|
138 | value = JSON.stringify(value);
|
139 | }
|
140 | search = search.append(key, value);
|
141 | }
|
142 | };
|
143 | for (var key in requestQueryParams) {
|
144 | _loop_1(key);
|
145 | }
|
146 | return search;
|
147 | };
|
148 | /**
|
149 | * @param {?} headers
|
150 | * @return {?}
|
151 | */
|
152 | RestangularHelper.createRequestHeaders = /**
|
153 | * @param {?} headers
|
154 | * @return {?}
|
155 | */
|
156 | function (headers) {
|
157 | for (var key in headers) {
|
158 | /** @type {?} */
|
159 | var value = headers[key];
|
160 | if (typeof value === 'undefined') {
|
161 | delete headers[key];
|
162 | }
|
163 | }
|
164 | return new http.HttpHeaders(object.assign({}, headers));
|
165 | };
|
166 | return RestangularHelper;
|
167 | }());
|
168 |
|
169 | /**
|
170 | * @fileoverview added by tsickle
|
171 | * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
|
172 | */
|
173 | var RestangularHttp = /** @class */ (function () {
|
174 | function RestangularHttp(http$$1) {
|
175 | this.http = http$$1;
|
176 | }
|
177 | /**
|
178 | * @param {?} options
|
179 | * @return {?}
|
180 | */
|
181 | RestangularHttp.prototype.createRequest = /**
|
182 | * @param {?} options
|
183 | * @return {?}
|
184 | */
|
185 | function (options) {
|
186 | /** @type {?} */
|
187 | var request = RestangularHelper.createRequest(options);
|
188 | return this.request(request);
|
189 | };
|
190 | /**
|
191 | * @param {?} request
|
192 | * @return {?}
|
193 | */
|
194 | RestangularHttp.prototype.request = /**
|
195 | * @param {?} request
|
196 | * @return {?}
|
197 | */
|
198 | function (request) {
|
199 | var _this = this;
|
200 | return this.http.handle(request)
|
201 | .pipe(operators.filter(function (event) { return event instanceof http.HttpResponse; }), operators.map(function (response) {
|
202 | if (!response.ok) {
|
203 | return rxjs.throwError(new http.HttpErrorResponse(response));
|
204 | }
|
205 | return response;
|
206 | }), operators.map(function (response) {
|
207 | response.config = { params: request };
|
208 | return response;
|
209 | }), operators.catchError(function (err) {
|
210 | err.request = request;
|
211 | err.data = err.error;
|
212 | err.repeatRequest = function (newRequest) {
|
213 | return _this.request(newRequest || request);
|
214 | };
|
215 | return rxjs.throwError(err);
|
216 | }));
|
217 | };
|
218 | RestangularHttp.decorators = [
|
219 | { type: core.Injectable },
|
220 | ];
|
221 | /** @nocollapse */
|
222 | RestangularHttp.ctorParameters = function () {
|
223 | return [
|
224 | { type: http.HttpBackend }
|
225 | ];
|
226 | };
|
227 | return RestangularHttp;
|
228 | }());
|
229 |
|
230 | /**
|
231 | * @fileoverview added by tsickle
|
232 | * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
|
233 | */
|
234 | /**
|
235 | * @param {?} object
|
236 | * @param {?} configuration
|
237 | * @return {?}
|
238 | */
|
239 | function RestangularConfigurer(object$$1, configuration) {
|
240 | object$$1.configuration = configuration;
|
241 | /**
|
242 | * Those are HTTP safe methods for which there is no need to pass any data with the request.
|
243 | * @type {?}
|
244 | */
|
245 | var safeMethods = ['get', 'head', 'options', 'trace', 'getlist'];
|
246 | configuration.isSafe = function (operation) {
|
247 | return lodash.includes(safeMethods, operation.toLowerCase());
|
248 | };
|
249 | /** @type {?} */
|
250 | var absolutePattern = /^https?:\/\//i;
|
251 | configuration.isAbsoluteUrl = function (string) {
|
252 | return lodash.isUndefined(configuration.absoluteUrl) || lodash.isNull(configuration.absoluteUrl) ?
|
253 | string && absolutePattern.test(string) :
|
254 | configuration.absoluteUrl;
|
255 | };
|
256 | configuration.absoluteUrl = lodash.isUndefined(configuration.absoluteUrl) ? true : configuration.absoluteUrl;
|
257 | object$$1.setSelfLinkAbsoluteUrl = function (value) {
|
258 | configuration.absoluteUrl = value;
|
259 | };
|
260 | /**
|
261 | * This is the BaseURL to be used with Restangular
|
262 | */
|
263 | configuration.baseUrl = lodash.isUndefined(configuration.baseUrl) ? '' : configuration.baseUrl;
|
264 | object$$1.setBaseUrl = function (newBaseUrl) {
|
265 | configuration.baseUrl = /\/$/.test(newBaseUrl) ?
|
266 | newBaseUrl.substring(0, newBaseUrl.length - 1) :
|
267 | newBaseUrl;
|
268 | return this;
|
269 | };
|
270 | /**
|
271 | * Sets the extra fields to keep from the parents
|
272 | */
|
273 | configuration.extraFields = configuration.extraFields || [];
|
274 | object$$1.setExtraFields = function (newExtraFields) {
|
275 | configuration.extraFields = newExtraFields;
|
276 | return this;
|
277 | };
|
278 | /**
|
279 | * Some default $http parameter to be used in EVERY call
|
280 | **/
|
281 | configuration.defaultHttpFields = configuration.defaultHttpFields || {};
|
282 | object$$1.setDefaultHttpFields = function (values) {
|
283 | configuration.defaultHttpFields = values;
|
284 | return this;
|
285 | };
|
286 | /**
|
287 | * Always return plain data, no restangularized object
|
288 | **/
|
289 | configuration.plainByDefault = configuration.plainByDefault || false;
|
290 | object$$1.setPlainByDefault = function (value) {
|
291 | configuration.plainByDefault = value === true ? true : false;
|
292 | return this;
|
293 | };
|
294 | configuration.withHttpValues = function (httpLocalConfig, obj) {
|
295 | return lodash.defaults(obj, httpLocalConfig, configuration.defaultHttpFields);
|
296 | };
|
297 | configuration.encodeIds = lodash.isUndefined(configuration.encodeIds) ? true : configuration.encodeIds;
|
298 | object$$1.setEncodeIds = function (encode) {
|
299 | configuration.encodeIds = encode;
|
300 | };
|
301 | configuration.defaultRequestParams = configuration.defaultRequestParams || {
|
302 | get: {},
|
303 | post: {},
|
304 | put: {},
|
305 | remove: {},
|
306 | common: {}
|
307 | };
|
308 | object$$1.setDefaultRequestParams = function (param1, param2) {
|
309 | /** @type {?} */
|
310 | var methods = [];
|
311 | /** @type {?} */
|
312 | var params = param2 || param1;
|
313 | if (!lodash.isUndefined(param2)) {
|
314 | if (lodash.isArray(param1)) {
|
315 | methods = param1;
|
316 | }
|
317 | else {
|
318 | methods.push(param1);
|
319 | }
|
320 | }
|
321 | else {
|
322 | methods.push('common');
|
323 | }
|
324 | lodash.each(methods, function (method) {
|
325 | configuration.defaultRequestParams[method] = params;
|
326 | });
|
327 | return this;
|
328 | };
|
329 | object$$1.requestParams = configuration.defaultRequestParams;
|
330 | configuration.defaultHeaders = configuration.defaultHeaders || {};
|
331 | object$$1.setDefaultHeaders = function (headers) {
|
332 | configuration.defaultHeaders = headers;
|
333 | object$$1.defaultHeaders = configuration.defaultHeaders;
|
334 | return this;
|
335 | };
|
336 | object$$1.defaultHeaders = configuration.defaultHeaders;
|
337 | /**
|
338 | * Method overriders response Method
|
339 | **/
|
340 | configuration.defaultResponseMethod = configuration.defaultResponseMethod || 'promise';
|
341 | object$$1.setDefaultResponseMethod = function (method) {
|
342 | configuration.defaultResponseMethod = method;
|
343 | object$$1.defaultResponseMethod = configuration.defaultResponseMethod;
|
344 | return this;
|
345 | };
|
346 | object$$1.defaultResponseMethod = configuration.defaultResponseMethod;
|
347 | /**
|
348 | * Method overriders will set which methods are sent via POST with an X-HTTP-Method-Override
|
349 | **/
|
350 | configuration.methodOverriders = configuration.methodOverriders || [];
|
351 | object$$1.setMethodOverriders = function (values) {
|
352 | /** @type {?} */
|
353 | var overriders = lodash.extend([], values);
|
354 | if (configuration.isOverridenMethod('delete', overriders)) {
|
355 | overriders.push('remove');
|
356 | }
|
357 | configuration.methodOverriders = overriders;
|
358 | return this;
|
359 | };
|
360 | configuration.jsonp = lodash.isUndefined(configuration.jsonp) ? false : configuration.jsonp;
|
361 | object$$1.setJsonp = function (active) {
|
362 | configuration.jsonp = active;
|
363 | };
|
364 | configuration.isOverridenMethod = function (method, values) {
|
365 | /** @type {?} */
|
366 | var search = values || configuration.methodOverriders;
|
367 | return !lodash.isUndefined(lodash.find(search, function (one) {
|
368 | return one.toLowerCase() === method.toLowerCase();
|
369 | }));
|
370 | };
|
371 | /**
|
372 | * Sets the URL creator type. For now, only Path is created. In the future we'll have queryParams
|
373 | **/
|
374 | configuration.urlCreator = configuration.urlCreator || 'path';
|
375 | object$$1.setUrlCreator = function (name) {
|
376 | if (!lodash.has(configuration.urlCreatorFactory, name)) {
|
377 | throw new Error('URL Path selected isn\'t valid');
|
378 | }
|
379 | configuration.urlCreator = name;
|
380 | return this;
|
381 | };
|
382 | /**
|
383 | * You can set the restangular fields here. The 3 required fields for Restangular are:
|
384 | *
|
385 | * id: Id of the element
|
386 | * route: name of the route of this element
|
387 | * parentResource: the reference to the parent resource
|
388 | *
|
389 | * All of this fields except for id, are handled (and created) by Restangular. By default,
|
390 | * the field values will be id, route and parentResource respectively
|
391 | */
|
392 | configuration.restangularFields = configuration.restangularFields || {
|
393 | id: 'id',
|
394 | route: 'route',
|
395 | parentResource: 'parentResource',
|
396 | restangularCollection: 'restangularCollection',
|
397 | cannonicalId: '__cannonicalId',
|
398 | etag: 'restangularEtag',
|
399 | selfLink: 'href',
|
400 | get: 'get',
|
401 | getList: 'getList',
|
402 | put: 'put',
|
403 | post: 'post',
|
404 | remove: 'remove',
|
405 | head: 'head',
|
406 | trace: 'trace',
|
407 | options: 'options',
|
408 | patch: 'patch',
|
409 | getRestangularUrl: 'getRestangularUrl',
|
410 | getRequestedUrl: 'getRequestedUrl',
|
411 | putElement: 'putElement',
|
412 | addRestangularMethod: 'addRestangularMethod',
|
413 | getParentList: 'getParentList',
|
414 | clone: 'clone',
|
415 | ids: 'ids',
|
416 | httpConfig: '_$httpConfig',
|
417 | reqParams: 'reqParams',
|
418 | one: 'one',
|
419 | all: 'all',
|
420 | several: 'several',
|
421 | oneUrl: 'oneUrl',
|
422 | allUrl: 'allUrl',
|
423 | customPUT: 'customPUT',
|
424 | customPATCH: 'customPATCH',
|
425 | customPOST: 'customPOST',
|
426 | customDELETE: 'customDELETE',
|
427 | customGET: 'customGET',
|
428 | customGETLIST: 'customGETLIST',
|
429 | customOperation: 'customOperation',
|
430 | doPUT: 'doPUT',
|
431 | doPATCH: 'doPATCH',
|
432 | doPOST: 'doPOST',
|
433 | doDELETE: 'doDELETE',
|
434 | doGET: 'doGET',
|
435 | doGETLIST: 'doGETLIST',
|
436 | fromServer: 'fromServer',
|
437 | withConfig: 'withConfig',
|
438 | withHttpConfig: 'withHttpConfig',
|
439 | singleOne: 'singleOne',
|
440 | plain: 'plain',
|
441 | save: 'save',
|
442 | restangularized: 'restangularized'
|
443 | };
|
444 | object$$1.setRestangularFields = function (resFields) {
|
445 | configuration.restangularFields =
|
446 | lodash.extend({}, configuration.restangularFields, resFields);
|
447 | return this;
|
448 | };
|
449 | configuration.isRestangularized = function (obj) {
|
450 | return !!obj[configuration.restangularFields.restangularized];
|
451 | };
|
452 | configuration.setFieldToElem = function (field, elem, value) {
|
453 | /** @type {?} */
|
454 | var properties = field.split('.');
|
455 | /** @type {?} */
|
456 | var idValue = elem;
|
457 | lodash.each(lodash.initial(properties), function (prop) {
|
458 | idValue[prop] = {};
|
459 | idValue = idValue[prop];
|
460 | });
|
461 | /** @type {?} */
|
462 | var index = lodash.last(properties);
|
463 | idValue[index] = value;
|
464 | return this;
|
465 | };
|
466 | configuration.getFieldFromElem = function (field, elem) {
|
467 | /** @type {?} */
|
468 | var properties = field.split('.');
|
469 | /** @type {?} */
|
470 | var idValue = elem;
|
471 | lodash.each(properties, function (prop) {
|
472 | if (idValue) {
|
473 | idValue = idValue[prop];
|
474 | }
|
475 | });
|
476 | return lodash.clone(idValue);
|
477 | };
|
478 | configuration.setIdToElem = function (elem, id /*, route */) {
|
479 | configuration.setFieldToElem(configuration.restangularFields.id, elem, id);
|
480 | return this;
|
481 | };
|
482 | configuration.getIdFromElem = function (elem) {
|
483 | return configuration.getFieldFromElem(configuration.restangularFields.id, elem);
|
484 | };
|
485 | configuration.isValidId = function (elemId) {
|
486 | return '' !== elemId && !lodash.isUndefined(elemId) && !lodash.isNull(elemId);
|
487 | };
|
488 | configuration.setUrlToElem = function (elem, url /*, route */) {
|
489 | configuration.setFieldToElem(configuration.restangularFields.selfLink, elem, url);
|
490 | return this;
|
491 | };
|
492 | configuration.getUrlFromElem = function (elem) {
|
493 | return configuration.getFieldFromElem(configuration.restangularFields.selfLink, elem);
|
494 | };
|
495 | configuration.useCannonicalId = lodash.isUndefined(configuration.useCannonicalId) ? false : configuration.useCannonicalId;
|
496 | object$$1.setUseCannonicalId = function (value) {
|
497 | configuration.useCannonicalId = value;
|
498 | return this;
|
499 | };
|
500 | configuration.getCannonicalIdFromElem = function (elem) {
|
501 | /** @type {?} */
|
502 | var cannonicalId = elem[configuration.restangularFields.cannonicalId];
|
503 | /** @type {?} */
|
504 | var actualId = configuration.isValidId(cannonicalId) ? cannonicalId : configuration.getIdFromElem(elem);
|
505 | return actualId;
|
506 | };
|
507 | /**
|
508 | * Sets the Response parser. This is used in case your response isn't directly the data.
|
509 | * For example if you have a response like {meta: {'meta'}, data: {name: 'Gonto'}}
|
510 | * you can extract this data which is the one that needs wrapping
|
511 | *
|
512 | * The ResponseExtractor is a function that receives the response and the method executed.
|
513 | */
|
514 | configuration.responseInterceptors = configuration.responseInterceptors ? __spread(configuration.responseInterceptors) : [];
|
515 | configuration.defaultResponseInterceptor = function (data /*, operation, what, url, response, subject */) {
|
516 | return data || {};
|
517 | };
|
518 | configuration.responseExtractor = function (data, operation, what, url, response, subject) {
|
519 | /** @type {?} */
|
520 | var interceptors = lodash.clone(configuration.responseInterceptors);
|
521 | interceptors.push(configuration.defaultResponseInterceptor);
|
522 | /** @type {?} */
|
523 | var theData = data;
|
524 | lodash.each(interceptors, function (interceptor) {
|
525 | theData = interceptor(theData, operation, what, url, response, subject);
|
526 | });
|
527 | return theData;
|
528 | };
|
529 | object$$1.addResponseInterceptor = function (extractor) {
|
530 | configuration.responseInterceptors.push(extractor);
|
531 | return this;
|
532 | };
|
533 | configuration.errorInterceptors = configuration.errorInterceptors ? __spread(configuration.errorInterceptors) : [];
|
534 | object$$1.addErrorInterceptor = function (interceptor) {
|
535 | configuration.errorInterceptors = __spread([interceptor], configuration.errorInterceptors);
|
536 | return this;
|
537 | };
|
538 | object$$1.setResponseInterceptor = object$$1.addResponseInterceptor;
|
539 | object$$1.setResponseExtractor = object$$1.addResponseInterceptor;
|
540 | object$$1.setErrorInterceptor = object$$1.addErrorInterceptor;
|
541 | /**
|
542 | * Response interceptor is called just before resolving promises.
|
543 | */
|
544 | /**
|
545 | * Request interceptor is called before sending an object to the server.
|
546 | */
|
547 | configuration.requestInterceptors = configuration.requestInterceptors ? __spread(configuration.requestInterceptors) : [];
|
548 | configuration.defaultInterceptor = function (element, operation, path, url, headers, params, httpConfig) {
|
549 | return {
|
550 | element: element,
|
551 | headers: headers,
|
552 | params: params,
|
553 | httpConfig: httpConfig
|
554 | };
|
555 | };
|
556 | configuration.fullRequestInterceptor = function (element, operation, path, url, headers, params, httpConfig) {
|
557 | /** @type {?} */
|
558 | var interceptors = lodash.clone(configuration.requestInterceptors);
|
559 | /** @type {?} */
|
560 | var defaultRequest = configuration.defaultInterceptor(element, operation, path, url, headers, params, httpConfig);
|
561 | return lodash.reduce(interceptors, function (request, interceptor) {
|
562 | /** @type {?} */
|
563 | var returnInterceptor = interceptor(request.element, operation, path, url, request.headers, request.params, request.httpConfig);
|
564 | return lodash.extend(request, returnInterceptor);
|
565 | }, defaultRequest);
|
566 | };
|
567 | object$$1.addRequestInterceptor = function (interceptor) {
|
568 | configuration.requestInterceptors.push(function (elem, operation, path, url, headers, params, httpConfig) {
|
569 | return {
|
570 | headers: headers,
|
571 | params: params,
|
572 | element: interceptor(elem, operation, path, url),
|
573 | httpConfig: httpConfig
|
574 | };
|
575 | });
|
576 | return this;
|
577 | };
|
578 | object$$1.setRequestInterceptor = object$$1.addRequestInterceptor;
|
579 | object$$1.addFullRequestInterceptor = function (interceptor) {
|
580 | configuration.requestInterceptors.push(interceptor);
|
581 | return this;
|
582 | };
|
583 | object$$1.setFullRequestInterceptor = object$$1.addFullRequestInterceptor;
|
584 | configuration.onBeforeElemRestangularized = configuration.onBeforeElemRestangularized || function (elem) {
|
585 | return elem;
|
586 | };
|
587 | object$$1.setOnBeforeElemRestangularized = function (post) {
|
588 | configuration.onBeforeElemRestangularized = post;
|
589 | return this;
|
590 | };
|
591 | object$$1.setRestangularizePromiseInterceptor = function (interceptor) {
|
592 | configuration.restangularizePromiseInterceptor = interceptor;
|
593 | return this;
|
594 | };
|
595 | /**
|
596 | * This method is called after an element has been "Restangularized".
|
597 | *
|
598 | * It receives the element, a boolean indicating if it's an element or a collection
|
599 | * and the name of the model
|
600 | *
|
601 | */
|
602 | configuration.onElemRestangularized = configuration.onElemRestangularized || function (elem) {
|
603 | return elem;
|
604 | };
|
605 | object$$1.setOnElemRestangularized = function (post) {
|
606 | configuration.onElemRestangularized = post;
|
607 | return this;
|
608 | };
|
609 | configuration.shouldSaveParent = configuration.shouldSaveParent || function () {
|
610 | return true;
|
611 | };
|
612 | object$$1.setParentless = function (values) {
|
613 | if (lodash.isArray(values)) {
|
614 | configuration.shouldSaveParent = function (route) {
|
615 | return !lodash.includes(values, route);
|
616 | };
|
617 | }
|
618 | else if (lodash.isBoolean(values)) {
|
619 | configuration.shouldSaveParent = function () {
|
620 | return !values;
|
621 | };
|
622 | }
|
623 | return this;
|
624 | };
|
625 | /**
|
626 | * This lets you set a suffix to every request.
|
627 | *
|
628 | * For example, if your api requires that for JSon requests you do /users/123.json, you can set that
|
629 | * in here.
|
630 | *
|
631 | *
|
632 | * By default, the suffix is null
|
633 | */
|
634 | configuration.suffix = lodash.isUndefined(configuration.suffix) ? null : configuration.suffix;
|
635 | object$$1.setRequestSuffix = function (newSuffix) {
|
636 | configuration.suffix = newSuffix;
|
637 | return this;
|
638 | };
|
639 | /**
|
640 | * Add element transformers for certain routes.
|
641 | */
|
642 | configuration.transformers = configuration.transformers || {};
|
643 | object$$1.addElementTransformer = function (type, secondArg, thirdArg) {
|
644 | /** @type {?} */
|
645 | var isCollection = null;
|
646 | /** @type {?} */
|
647 | var transformer = null;
|
648 | if (arguments.length === 2) {
|
649 | transformer = secondArg;
|
650 | }
|
651 | else {
|
652 | transformer = thirdArg;
|
653 | isCollection = secondArg;
|
654 | }
|
655 | /** @type {?} */
|
656 | var typeTransformers = configuration.transformers[type];
|
657 | if (!typeTransformers) {
|
658 | typeTransformers = configuration.transformers[type] = [];
|
659 | }
|
660 | typeTransformers.push(function (coll, elem) {
|
661 | if (lodash.isNull(isCollection) || (coll === isCollection)) {
|
662 | return transformer(elem);
|
663 | }
|
664 | return elem;
|
665 | });
|
666 | return object$$1;
|
667 | };
|
668 | object$$1.extendCollection = function (route, fn) {
|
669 | return object$$1.addElementTransformer(route, true, fn);
|
670 | };
|
671 | object$$1.extendModel = function (route, fn) {
|
672 | return object$$1.addElementTransformer(route, false, fn);
|
673 | };
|
674 | configuration.transformElem = function (elem, isCollection, route, Restangular, force) {
|
675 | if (!force && !configuration.transformLocalElements && !elem[configuration.restangularFields.fromServer]) {
|
676 | return elem;
|
677 | }
|
678 | /** @type {?} */
|
679 | var typeTransformers = configuration.transformers[route];
|
680 | /** @type {?} */
|
681 | var changedElem = elem;
|
682 | if (typeTransformers) {
|
683 | lodash.each(typeTransformers, function (transformer) {
|
684 | changedElem = transformer(isCollection, changedElem);
|
685 | });
|
686 | }
|
687 | return configuration.onElemRestangularized(changedElem, isCollection, route, Restangular);
|
688 | };
|
689 | configuration.transformLocalElements = lodash.isUndefined(configuration.transformLocalElements) ?
|
690 | false :
|
691 | configuration.transformLocalElements;
|
692 | object$$1.setTransformOnlyServerElements = function (active) {
|
693 | configuration.transformLocalElements = !active;
|
694 | };
|
695 | configuration.fullResponse = lodash.isUndefined(configuration.fullResponse) ? false : configuration.fullResponse;
|
696 | object$$1.setFullResponse = function (full) {
|
697 | configuration.fullResponse = full;
|
698 | return this;
|
699 | };
|
700 | // Internal values and functions
|
701 | configuration.urlCreatorFactory = {};
|
702 | /**
|
703 | * Base URL Creator. Base prototype for everything related to it
|
704 | *
|
705 | * @type {?}
|
706 | */
|
707 | var BaseCreator = function () {
|
708 | };
|
709 | BaseCreator.prototype.setConfig = function (config) {
|
710 | this.config = config;
|
711 | return this;
|
712 | };
|
713 | BaseCreator.prototype.parentsArray = function (current) {
|
714 | /** @type {?} */
|
715 | var parents = [];
|
716 | while (current) {
|
717 | parents.push(current);
|
718 | current = current[this.config.restangularFields.parentResource];
|
719 | }
|
720 | return parents.reverse();
|
721 | };
|
722 | /**
|
723 | * @param {?} config
|
724 | * @param {?} $http
|
725 | * @param {?} url
|
726 | * @param {?} configurer
|
727 | * @return {?}
|
728 | */
|
729 | function RestangularResource(config, $http, url, configurer) {
|
730 | /** @type {?} */
|
731 | var resource = {};
|
732 | lodash.each(lodash.keys(configurer), function (key) {
|
733 | /** @type {?} */
|
734 | var value = configurer[key];
|
735 | // Add default parameters
|
736 | value.params = lodash.extend({}, value.params, config.defaultRequestParams[value.method.toLowerCase()]);
|
737 | // We don't want the ? if no params are there
|
738 | if (lodash.isEmpty(value.params)) {
|
739 | delete value.params;
|
740 | }
|
741 | if (config.isSafe(value.method)) {
|
742 | resource[key] = function () {
|
743 | /** @type {?} */
|
744 | var resultConfig = lodash.extend(value, {
|
745 | url: url
|
746 | });
|
747 | return $http.createRequest(resultConfig);
|
748 | };
|
749 | }
|
750 | else {
|
751 | resource[key] = function (data) {
|
752 | /** @type {?} */
|
753 | var resultConfig = lodash.extend(value, {
|
754 | url: url,
|
755 | data: data
|
756 | });
|
757 | return $http.createRequest(resultConfig);
|
758 | };
|
759 | }
|
760 | });
|
761 | return resource;
|
762 | }
|
763 | BaseCreator.prototype.resource = function (current, $http, localHttpConfig, callHeaders, callParams, what, etag, operation) {
|
764 | /** @type {?} */
|
765 | var params = lodash.defaults(callParams || {}, this.config.defaultRequestParams.common);
|
766 | /** @type {?} */
|
767 | var headers = lodash.defaults(callHeaders || {}, this.config.defaultHeaders);
|
768 | if (etag) {
|
769 | if (!configuration.isSafe(operation)) {
|
770 | headers['If-Match'] = etag;
|
771 | }
|
772 | else {
|
773 | headers['If-None-Match'] = etag;
|
774 | }
|
775 | }
|
776 | /** @type {?} */
|
777 | var url = this.base(current);
|
778 | if (what) {
|
779 | /** @type {?} */
|
780 | var add = '';
|
781 | if (!/\/$/.test(url)) {
|
782 | add += '/';
|
783 | }
|
784 | add += what;
|
785 | url += add;
|
786 | }
|
787 | if (this.config.suffix &&
|
788 | url.indexOf(this.config.suffix, url.length - this.config.suffix.length) === -1 && !this.config.getUrlFromElem(current)) {
|
789 | url += this.config.suffix;
|
790 | }
|
791 | current[this.config.restangularFields.httpConfig] = undefined;
|
792 | return RestangularResource(this.config, $http, url, {
|
793 | getList: this.config.withHttpValues(localHttpConfig, {
|
794 | method: 'GET',
|
795 | params: params,
|
796 | headers: headers
|
797 | }),
|
798 | get: this.config.withHttpValues(localHttpConfig, {
|
799 | method: 'GET',
|
800 | params: params,
|
801 | headers: headers
|
802 | }),
|
803 | jsonp: this.config.withHttpValues(localHttpConfig, {
|
804 | method: 'jsonp',
|
805 | params: params,
|
806 | headers: headers
|
807 | }),
|
808 | put: this.config.withHttpValues(localHttpConfig, {
|
809 | method: 'PUT',
|
810 | params: params,
|
811 | headers: headers
|
812 | }),
|
813 | post: this.config.withHttpValues(localHttpConfig, {
|
814 | method: 'POST',
|
815 | params: params,
|
816 | headers: headers
|
817 | }),
|
818 | remove: this.config.withHttpValues(localHttpConfig, {
|
819 | method: 'DELETE',
|
820 | params: params,
|
821 | headers: headers
|
822 | }),
|
823 | head: this.config.withHttpValues(localHttpConfig, {
|
824 | method: 'HEAD',
|
825 | params: params,
|
826 | headers: headers
|
827 | }),
|
828 | trace: this.config.withHttpValues(localHttpConfig, {
|
829 | method: 'TRACE',
|
830 | params: params,
|
831 | headers: headers
|
832 | }),
|
833 | options: this.config.withHttpValues(localHttpConfig, {
|
834 | method: 'OPTIONS',
|
835 | params: params,
|
836 | headers: headers
|
837 | }),
|
838 | patch: this.config.withHttpValues(localHttpConfig, {
|
839 | method: 'PATCH',
|
840 | params: params,
|
841 | headers: headers
|
842 | })
|
843 | });
|
844 | };
|
845 | /**
|
846 | * This is the Path URL creator. It uses Path to show Hierarchy in the Rest API.
|
847 | * This means that if you have an Account that then has a set of Buildings, a URL to a building
|
848 | * would be /accounts/123/buildings/456
|
849 | *
|
850 | * @type {?}
|
851 | */
|
852 | var Path = function () {
|
853 | };
|
854 | Path.prototype = new BaseCreator();
|
855 | Path.prototype.normalizeUrl = function (url) {
|
856 | /** @type {?} */
|
857 | var parts = /((?:http[s]?:)?\/\/)?(.*)?/.exec(url);
|
858 | parts[2] = parts[2].replace(/[\\\/]+/g, '/');
|
859 | return (typeof parts[1] !== 'undefined') ? parts[1] + parts[2] : parts[2];
|
860 | };
|
861 | Path.prototype.base = function (current) {
|
862 | /** @type {?} */
|
863 | var __this = this;
|
864 | return lodash.reduce(this.parentsArray(current), function (acum, elem) {
|
865 | /** @type {?} */
|
866 | var elemUrl;
|
867 | /** @type {?} */
|
868 | var elemSelfLink = __this.config.getUrlFromElem(elem);
|
869 | if (elemSelfLink) {
|
870 | if (__this.config.isAbsoluteUrl(elemSelfLink)) {
|
871 | return elemSelfLink;
|
872 | }
|
873 | else {
|
874 | elemUrl = elemSelfLink;
|
875 | }
|
876 | }
|
877 | else {
|
878 | elemUrl = elem[__this.config.restangularFields.route];
|
879 | if (elem[__this.config.restangularFields.restangularCollection]) {
|
880 | /** @type {?} */
|
881 | var ids = elem[__this.config.restangularFields.ids];
|
882 | if (ids) {
|
883 | elemUrl += '/' + ids.join(',');
|
884 | }
|
885 | }
|
886 | else {
|
887 | /** @type {?} */
|
888 | var elemId = void 0;
|
889 | if (__this.config.useCannonicalId) {
|
890 | elemId = __this.config.getCannonicalIdFromElem(elem);
|
891 | }
|
892 | else {
|
893 | elemId = __this.config.getIdFromElem(elem);
|
894 | }
|
895 | if (configuration.isValidId(elemId) && !elem.singleOne) {
|
896 | elemUrl += '/' + (__this.config.encodeIds ? encodeURIComponent(elemId) : elemId);
|
897 | }
|
898 | }
|
899 | }
|
900 | acum = acum.replace(/\/$/, '') + '/' + elemUrl;
|
901 | return __this.normalizeUrl(acum);
|
902 | }, this.config.baseUrl);
|
903 | };
|
904 | Path.prototype.fetchUrl = function (current, what) {
|
905 | /** @type {?} */
|
906 | var baseUrl = this.base(current);
|
907 | if (what) {
|
908 | baseUrl += '/' + what;
|
909 | }
|
910 | return baseUrl;
|
911 | };
|
912 | Path.prototype.fetchRequestedUrl = function (current, what) {
|
913 | /** @type {?} */
|
914 | var url = this.fetchUrl(current, what);
|
915 | /** @type {?} */
|
916 | var params = current[configuration.restangularFields.reqParams];
|
917 | // From here on and until the end of fetchRequestedUrl,
|
918 | // the code has been kindly borrowed from angular.js
|
919 | // The reason for such code bloating is coherence:
|
920 | // If the user were to use this for cache management, the
|
921 | // serialization of parameters would need to be identical
|
922 | // to the one done by angular for cache keys to match.
|
923 | /**
|
924 | * @param {?} obj
|
925 | * @return {?}
|
926 | */
|
927 | function sortedKeys(obj) {
|
928 | /** @type {?} */
|
929 | var resultKeys = [];
|
930 | for (var key in obj) {
|
931 | if (obj.hasOwnProperty(key)) {
|
932 | resultKeys.push(key);
|
933 | }
|
934 | }
|
935 | return resultKeys.sort();
|
936 | }
|
937 | /**
|
938 | * @param {?} obj
|
939 | * @param {?=} iterator
|
940 | * @param {?=} context
|
941 | * @return {?}
|
942 | */
|
943 | function forEachSorted(obj, iterator, context) {
|
944 | /** @type {?} */
|
945 | var sortedKeysArray = sortedKeys(obj);
|
946 | for (var i = 0; i < sortedKeysArray.length; i++) {
|
947 | iterator.call(context, obj[sortedKeysArray[i]], sortedKeysArray[i]);
|
948 | }
|
949 | return sortedKeysArray;
|
950 | }
|
951 | /**
|
952 | * @param {?} val
|
953 | * @param {?=} pctEncodeSpaces
|
954 | * @return {?}
|
955 | */
|
956 | function encodeUriQuery(val, pctEncodeSpaces) {
|
957 | return encodeURIComponent(val)
|
958 | .replace(/%40/gi, '@')
|
959 | .replace(/%3A/gi, ':')
|
960 | .replace(/%24/g, '$')
|
961 | .replace(/%2C/gi, ',')
|
962 | .replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));
|
963 | }
|
964 | if (!params) {
|
965 | return url + (this.config.suffix || '');
|
966 | }
|
967 | /** @type {?} */
|
968 | var parts = [];
|
969 | forEachSorted(params, function (value, key) {
|
970 | if (value === null || value === undefined) {
|
971 | return;
|
972 | }
|
973 | if (!lodash.isArray(value)) {
|
974 | value = [value];
|
975 | }
|
976 | lodash.forEach(value, function (v) {
|
977 | if (lodash.isObject(v)) {
|
978 | v = JSON.stringify(v);
|
979 | }
|
980 | parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(v));
|
981 | });
|
982 | });
|
983 | return url + (this.config.suffix || '') + ((url.indexOf('?') === -1) ? '?' : '&') + parts.join('&');
|
984 | };
|
985 | configuration.urlCreatorFactory.path = Path;
|
986 | }
|
987 |
|
988 | /**
|
989 | * @fileoverview added by tsickle
|
990 | * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
|
991 | */
|
992 | var Restangular = /** @class */ (function () {
|
993 | function Restangular(configObj, injector, http$$1) {
|
994 | this.configObj = configObj;
|
995 | this.injector = injector;
|
996 | this.http = http$$1;
|
997 | this.provider = new providerConfig(http$$1);
|
998 | /** @type {?} */
|
999 | var element = this.provider.$get();
|
1000 | object.assign(this, element);
|
1001 | this.setDefaultConfig();
|
1002 | }
|
1003 | /**
|
1004 | * @return {?}
|
1005 | */
|
1006 | Restangular.prototype.setDefaultConfig = /**
|
1007 | * @return {?}
|
1008 | */
|
1009 | function () {
|
1010 | var _this = this;
|
1011 | var _a;
|
1012 | if (!this.configObj || !lodash.isFunction(this.configObj.fn)) {
|
1013 | return;
|
1014 | }
|
1015 | /** @type {?} */
|
1016 | var arrDI = lodash.map(this.configObj.arrServices, function (services) {
|
1017 | return _this.injector.get(services);
|
1018 | });
|
1019 | (_a = this.configObj).fn.apply(_a, __spread([this.provider], arrDI));
|
1020 | };
|
1021 | Restangular.decorators = [
|
1022 | { type: core.Injectable },
|
1023 | ];
|
1024 | /** @nocollapse */
|
1025 | Restangular.ctorParameters = function () {
|
1026 | return [
|
1027 | { type: undefined, decorators: [{ type: core.Optional }, { type: core.Inject, args: [RESTANGULAR,] }] },
|
1028 | { type: core.Injector },
|
1029 | { type: RestangularHttp }
|
1030 | ];
|
1031 | };
|
1032 | return Restangular;
|
1033 | }());
|
1034 | /**
|
1035 | * @param {?} $http
|
1036 | * @return {?}
|
1037 | */
|
1038 | function providerConfig($http) {
|
1039 | /** @type {?} */
|
1040 | var globalConfiguration = {};
|
1041 | RestangularConfigurer(this, globalConfiguration);
|
1042 | this.$get = $get;
|
1043 | /**
|
1044 | * @return {?}
|
1045 | */
|
1046 | function $get() {
|
1047 | /**
|
1048 | * @param {?} config
|
1049 | * @return {?}
|
1050 | */
|
1051 | function createServiceForConfiguration(config) {
|
1052 | /** @type {?} */
|
1053 | var service = {};
|
1054 | /** @type {?} */
|
1055 | var urlHandler = new config.urlCreatorFactory[config.urlCreator]();
|
1056 | urlHandler.setConfig(config);
|
1057 | /**
|
1058 | * @param {?} parent
|
1059 | * @param {?} elem
|
1060 | * @param {?} route
|
1061 | * @param {?} reqParams
|
1062 | * @param {?} fromServer
|
1063 | * @return {?}
|
1064 | */
|
1065 | function restangularizeBase(parent, elem, route, reqParams, fromServer) {
|
1066 | elem[config.restangularFields.route] = route;
|
1067 | elem[config.restangularFields.getRestangularUrl] = lodash.bind(urlHandler.fetchUrl, urlHandler, elem);
|
1068 | elem[config.restangularFields.getRequestedUrl] = lodash.bind(urlHandler.fetchRequestedUrl, urlHandler, elem);
|
1069 | elem[config.restangularFields.addRestangularMethod] = lodash.bind(addRestangularMethodFunction, elem);
|
1070 | elem[config.restangularFields.clone] = lodash.bind(copyRestangularizedElement, elem);
|
1071 | elem[config.restangularFields.reqParams] = lodash.isEmpty(reqParams) ? null : reqParams;
|
1072 | elem[config.restangularFields.withHttpConfig] = lodash.bind(withHttpConfig, elem);
|
1073 | elem[config.restangularFields.plain] = lodash.bind(stripRestangular, elem, elem);
|
1074 | // Tag element as restangularized
|
1075 | elem[config.restangularFields.restangularized] = true;
|
1076 | // RequestLess connection
|
1077 | elem[config.restangularFields.one] = lodash.bind(one, elem, elem);
|
1078 | elem[config.restangularFields.all] = lodash.bind(all, elem, elem);
|
1079 | elem[config.restangularFields.several] = lodash.bind(several, elem, elem);
|
1080 | elem[config.restangularFields.oneUrl] = lodash.bind(oneUrl, elem, elem);
|
1081 | elem[config.restangularFields.allUrl] = lodash.bind(allUrl, elem, elem);
|
1082 | elem[config.restangularFields.fromServer] = !!fromServer;
|
1083 | if (parent && config.shouldSaveParent(route)) {
|
1084 | /** @type {?} */
|
1085 | var parentId = config.getIdFromElem(parent);
|
1086 | /** @type {?} */
|
1087 | var parentUrl = config.getUrlFromElem(parent);
|
1088 | /** @type {?} */
|
1089 | var restangularFieldsForParent = lodash.union(lodash.values(lodash.pick(config.restangularFields, ['route', 'singleOne', 'parentResource'])), config.extraFields);
|
1090 | /** @type {?} */
|
1091 | var parentResource = lodash.pick(parent, restangularFieldsForParent);
|
1092 | if (config.isValidId(parentId)) {
|
1093 | config.setIdToElem(parentResource, parentId, route);
|
1094 | }
|
1095 | if (config.isValidId(parentUrl)) {
|
1096 | config.setUrlToElem(parentResource, parentUrl, route);
|
1097 | }
|
1098 | elem[config.restangularFields.parentResource] = parentResource;
|
1099 | }
|
1100 | else {
|
1101 | elem[config.restangularFields.parentResource] = null;
|
1102 | }
|
1103 | return elem;
|
1104 | }
|
1105 | /**
|
1106 | * @param {?} parent
|
1107 | * @param {?} route
|
1108 | * @param {?} id
|
1109 | * @param {?} singleOne
|
1110 | * @return {?}
|
1111 | */
|
1112 | function one(parent, route, id, singleOne) {
|
1113 | /** @type {?} */
|
1114 | var error;
|
1115 | if (lodash.isNumber(route) || lodash.isNumber(parent)) {
|
1116 | error = 'You\'re creating a Restangular entity with the number ';
|
1117 | error += 'instead of the route or the parent. For example, you can\'t call .one(12).';
|
1118 | throw new Error(error);
|
1119 | }
|
1120 | if (lodash.isUndefined(route)) {
|
1121 | error = 'You\'re creating a Restangular entity either without the path. ';
|
1122 | error += 'For example you can\'t call .one(). Please check if your arguments are valid.';
|
1123 | throw new Error(error);
|
1124 | }
|
1125 | /** @type {?} */
|
1126 | var elem = {};
|
1127 | config.setIdToElem(elem, id, route);
|
1128 | config.setFieldToElem(config.restangularFields.singleOne, elem, singleOne);
|
1129 | return restangularizeElem(parent, elem, route, false);
|
1130 | }
|
1131 | /**
|
1132 | * @param {?} parent
|
1133 | * @param {?} route
|
1134 | * @return {?}
|
1135 | */
|
1136 | function all(parent, route) {
|
1137 | return restangularizeCollection(parent, [], route, false);
|
1138 | }
|
1139 | /**
|
1140 | * @param {?} parent
|
1141 | * @param {?} route
|
1142 | * @return {?}
|
1143 | */
|
1144 | function several(parent, route /*, ids */) {
|
1145 | /** @type {?} */
|
1146 | var collection = [];
|
1147 | collection[config.restangularFields.ids] = Array.prototype.splice.call(arguments, 2);
|
1148 | return restangularizeCollection(parent, collection, route, false);
|
1149 | }
|
1150 | /**
|
1151 | * @param {?} parent
|
1152 | * @param {?} route
|
1153 | * @param {?} url
|
1154 | * @return {?}
|
1155 | */
|
1156 | function oneUrl(parent, route, url) {
|
1157 | if (!route) {
|
1158 | throw new Error('Route is mandatory when creating new Restangular objects.');
|
1159 | }
|
1160 | /** @type {?} */
|
1161 | var elem = {};
|
1162 | config.setUrlToElem(elem, url, route);
|
1163 | return restangularizeElem(parent, elem, route, false);
|
1164 | }
|
1165 | /**
|
1166 | * @param {?} parent
|
1167 | * @param {?} route
|
1168 | * @param {?} url
|
1169 | * @return {?}
|
1170 | */
|
1171 | function allUrl(parent, route, url) {
|
1172 | if (!route) {
|
1173 | throw new Error('Route is mandatory when creating new Restangular objects.');
|
1174 | }
|
1175 | /** @type {?} */
|
1176 | var elem = {};
|
1177 | config.setUrlToElem(elem, url, route);
|
1178 | return restangularizeCollection(parent, elem, route, false);
|
1179 | }
|
1180 | // Promises
|
1181 | /**
|
1182 | * @param {?} subject
|
1183 | * @param {?} isCollection
|
1184 | * @param {?} valueToFill
|
1185 | * @return {?}
|
1186 | */
|
1187 | function restangularizeResponse(subject, isCollection, valueToFill) {
|
1188 | return subject.pipe(operators.filter(function (res) { return !!res; }));
|
1189 | }
|
1190 | /**
|
1191 | * @param {?} subject
|
1192 | * @param {?} response
|
1193 | * @param {?} data
|
1194 | * @param {?} filledValue
|
1195 | * @return {?}
|
1196 | */
|
1197 | function resolvePromise(subject, response, data, filledValue) {
|
1198 | lodash.extend(filledValue, data);
|
1199 | // Trigger the full response interceptor.
|
1200 | if (config.fullResponse) {
|
1201 | subject.next(lodash.extend(response, {
|
1202 | data: data
|
1203 | }));
|
1204 | }
|
1205 | else {
|
1206 | subject.next(data);
|
1207 | }
|
1208 | subject.complete();
|
1209 | }
|
1210 | // Elements
|
1211 | /**
|
1212 | * @param {?} elem
|
1213 | * @return {?}
|
1214 | */
|
1215 | function stripRestangular(elem) {
|
1216 | if (lodash.isArray(elem)) {
|
1217 | /** @type {?} */
|
1218 | var array_1 = [];
|
1219 | lodash.each(elem, function (value) {
|
1220 | array_1.push(config.isRestangularized(value) ? stripRestangular(value) : value);
|
1221 | });
|
1222 | return array_1;
|
1223 | }
|
1224 | else {
|
1225 | return lodash.omit(elem, lodash.values(lodash.omit(config.restangularFields, 'id')));
|
1226 | }
|
1227 | }
|
1228 | /**
|
1229 | * @param {?} elem
|
1230 | * @return {?}
|
1231 | */
|
1232 | function addCustomOperation(elem) {
|
1233 | elem[config.restangularFields.customOperation] = lodash.bind(customFunction, elem);
|
1234 | /** @type {?} */
|
1235 | var requestMethods = { get: customFunction, delete: customFunction };
|
1236 | lodash.each(['put', 'patch', 'post'], function (name) {
|
1237 | requestMethods[name] = function (operation, element, path, params, headers) {
|
1238 | return lodash.bind(customFunction, this)(operation, path, params, headers, element);
|
1239 | };
|
1240 | });
|
1241 | lodash.each(requestMethods, function (requestFunc, name) {
|
1242 | /** @type {?} */
|
1243 | var callOperation = name === 'delete' ? 'remove' : name;
|
1244 | lodash.each(['do', 'custom'], function (alias) {
|
1245 | elem[alias + name.toUpperCase()] = lodash.bind(requestFunc, elem, callOperation);
|
1246 | });
|
1247 | });
|
1248 | elem[config.restangularFields.customGETLIST] = lodash.bind(fetchFunction, elem);
|
1249 | elem[config.restangularFields.doGETLIST] = elem[config.restangularFields.customGETLIST];
|
1250 | }
|
1251 | /**
|
1252 | * @param {?} fromElement
|
1253 | * @param {?=} toElement
|
1254 | * @return {?}
|
1255 | */
|
1256 | function copyRestangularizedElement(fromElement, toElement) {
|
1257 | if (toElement === void 0) {
|
1258 | toElement = {};
|
1259 | }
|
1260 | /** @type {?} */
|
1261 | var copiedElement = object.assign(toElement, fromElement);
|
1262 | return restangularizeElem(copiedElement[config.restangularFields.parentResource], copiedElement, copiedElement[config.restangularFields.route], true);
|
1263 | }
|
1264 | /**
|
1265 | * @param {?} parent
|
1266 | * @param {?} element
|
1267 | * @param {?} route
|
1268 | * @param {?=} fromServer
|
1269 | * @param {?=} collection
|
1270 | * @param {?=} reqParams
|
1271 | * @return {?}
|
1272 | */
|
1273 | function restangularizeElem(parent, element, route, fromServer, collection, reqParams) {
|
1274 | /** @type {?} */
|
1275 | var elem = config.onBeforeElemRestangularized(element, false, route);
|
1276 | /** @type {?} */
|
1277 | var localElem = restangularizeBase(parent, elem, route, reqParams, fromServer);
|
1278 | if (config.useCannonicalId) {
|
1279 | localElem[config.restangularFields.cannonicalId] = config.getIdFromElem(localElem);
|
1280 | }
|
1281 | if (collection) {
|
1282 | localElem[config.restangularFields.getParentList] = function () {
|
1283 | return collection;
|
1284 | };
|
1285 | }
|
1286 | localElem[config.restangularFields.restangularCollection] = false;
|
1287 | localElem[config.restangularFields.get] = lodash.bind(getFunction, localElem);
|
1288 | localElem[config.restangularFields.getList] = lodash.bind(fetchFunction, localElem);
|
1289 | localElem[config.restangularFields.put] = lodash.bind(putFunction, localElem);
|
1290 | localElem[config.restangularFields.post] = lodash.bind(postFunction, localElem);
|
1291 | localElem[config.restangularFields.remove] = lodash.bind(deleteFunction, localElem);
|
1292 | localElem[config.restangularFields.head] = lodash.bind(headFunction, localElem);
|
1293 | localElem[config.restangularFields.trace] = lodash.bind(traceFunction, localElem);
|
1294 | localElem[config.restangularFields.options] = lodash.bind(optionsFunction, localElem);
|
1295 | localElem[config.restangularFields.patch] = lodash.bind(patchFunction, localElem);
|
1296 | localElem[config.restangularFields.save] = lodash.bind(save, localElem);
|
1297 | addCustomOperation(localElem);
|
1298 | return config.transformElem(localElem, false, route, service, true);
|
1299 | }
|
1300 | /**
|
1301 | * @param {?} parent
|
1302 | * @param {?} element
|
1303 | * @param {?} route
|
1304 | * @param {?=} fromServer
|
1305 | * @param {?=} reqParams
|
1306 | * @return {?}
|
1307 | */
|
1308 | function restangularizeCollection(parent, element, route, fromServer, reqParams) {
|
1309 | /** @type {?} */
|
1310 | var elem = config.onBeforeElemRestangularized(element, true, route);
|
1311 | /** @type {?} */
|
1312 | var localElem = restangularizeBase(parent, elem, route, reqParams, fromServer);
|
1313 | localElem[config.restangularFields.restangularCollection] = true;
|
1314 | localElem[config.restangularFields.post] = lodash.bind(postFunction, localElem, null);
|
1315 | localElem[config.restangularFields.remove] = lodash.bind(deleteFunction, localElem);
|
1316 | localElem[config.restangularFields.head] = lodash.bind(headFunction, localElem);
|
1317 | localElem[config.restangularFields.trace] = lodash.bind(traceFunction, localElem);
|
1318 | localElem[config.restangularFields.putElement] = lodash.bind(putElementFunction, localElem);
|
1319 | localElem[config.restangularFields.options] = lodash.bind(optionsFunction, localElem);
|
1320 | localElem[config.restangularFields.patch] = lodash.bind(patchFunction, localElem);
|
1321 | localElem[config.restangularFields.get] = lodash.bind(getById, localElem);
|
1322 | localElem[config.restangularFields.getList] = lodash.bind(fetchFunction, localElem, null);
|
1323 | addCustomOperation(localElem);
|
1324 | return config.transformElem(localElem, true, route, service, true);
|
1325 | }
|
1326 | /**
|
1327 | * @param {?} parent
|
1328 | * @param {?} element
|
1329 | * @param {?} route
|
1330 | * @return {?}
|
1331 | */
|
1332 | function restangularizeCollectionAndElements(parent, element, route) {
|
1333 | /** @type {?} */
|
1334 | var collection = restangularizeCollection(parent, element, route, false);
|
1335 | lodash.each(collection, function (elem) {
|
1336 | if (elem) {
|
1337 | restangularizeElem(parent, elem, route, false);
|
1338 | }
|
1339 | });
|
1340 | return collection;
|
1341 | }
|
1342 | /**
|
1343 | * @param {?} id
|
1344 | * @param {?} reqParams
|
1345 | * @param {?} headers
|
1346 | * @return {?}
|
1347 | */
|
1348 | function getById(id, reqParams, headers) {
|
1349 | return this.customGET(id.toString(), reqParams, headers);
|
1350 | }
|
1351 | /**
|
1352 | * @param {?} idx
|
1353 | * @param {?} params
|
1354 | * @param {?} headers
|
1355 | * @return {?}
|
1356 | */
|
1357 | function putElementFunction(idx, params, headers) {
|
1358 | /** @type {?} */
|
1359 | var __this = this;
|
1360 | /** @type {?} */
|
1361 | var elemToPut = this[idx];
|
1362 | /** @type {?} */
|
1363 | var subject = new rxjs.BehaviorSubject(null);
|
1364 | /** @type {?} */
|
1365 | var filledArray = [];
|
1366 | filledArray = config.transformElem(filledArray, true, elemToPut[config.restangularFields.route], service);
|
1367 | elemToPut.put(params, headers)
|
1368 | .subscribe(function (serverElem) {
|
1369 | /** @type {?} */
|
1370 | var newArray = copyRestangularizedElement(__this);
|
1371 | newArray[idx] = serverElem;
|
1372 | filledArray = newArray;
|
1373 | subject.next(newArray);
|
1374 | }, function (response) {
|
1375 | subject.error(response);
|
1376 | }, function () {
|
1377 | subject.complete();
|
1378 | });
|
1379 | return restangularizeResponse(subject, true, filledArray);
|
1380 | }
|
1381 | /**
|
1382 | * @param {?} resData
|
1383 | * @param {?} operation
|
1384 | * @param {?} route
|
1385 | * @param {?} fetchUrl
|
1386 | * @param {?} response
|
1387 | * @param {?} subject
|
1388 | * @return {?}
|
1389 | */
|
1390 | function parseResponse(resData, operation, route, fetchUrl, response, subject) {
|
1391 | /** @type {?} */
|
1392 | var data = config.responseExtractor(resData, operation, route, fetchUrl, response, subject);
|
1393 | /** @type {?} */
|
1394 | var etag = response.headers.get('ETag');
|
1395 | if (data && etag) {
|
1396 | data[config.restangularFields.etag] = etag;
|
1397 | }
|
1398 | return data;
|
1399 | }
|
1400 | /**
|
1401 | * @param {?} what
|
1402 | * @param {?} reqParams
|
1403 | * @param {?} headers
|
1404 | * @return {?}
|
1405 | */
|
1406 | function fetchFunction(what, reqParams, headers) {
|
1407 | /** @type {?} */
|
1408 | var __this = this;
|
1409 | /** @type {?} */
|
1410 | var subject = new rxjs.BehaviorSubject(null);
|
1411 | /** @type {?} */
|
1412 | var operation = 'getList';
|
1413 | /** @type {?} */
|
1414 | var url = urlHandler.fetchUrl(this, what);
|
1415 | /** @type {?} */
|
1416 | var whatFetched = what || __this[config.restangularFields.route];
|
1417 | /** @type {?} */
|
1418 | var request = config.fullRequestInterceptor(null, operation, whatFetched, url, headers || {}, reqParams || {}, this[config.restangularFields.httpConfig] || {});
|
1419 | /** @type {?} */
|
1420 | var filledArray = [];
|
1421 | filledArray = config.transformElem(filledArray, true, whatFetched, service);
|
1422 | /** @type {?} */
|
1423 | var method = 'getList';
|
1424 | if (config.jsonp) {
|
1425 | method = 'jsonp';
|
1426 | }
|
1427 | /** @type {?} */
|
1428 | var okCallback = function (response) {
|
1429 | /** @type {?} */
|
1430 | var resData = response.body;
|
1431 | /** @type {?} */
|
1432 | var fullParams = response.config.params;
|
1433 | /** @type {?} */
|
1434 | var data = parseResponse(resData, operation, whatFetched, url, response, subject);
|
1435 | // support empty response for getList() calls (some APIs respond with 204 and empty body)
|
1436 | if (lodash.isUndefined(data) || '' === data) {
|
1437 | data = [];
|
1438 | }
|
1439 | if (!lodash.isArray(data)) {
|
1440 | throw new Error('Response for getList SHOULD be an array and not an object or something else');
|
1441 | }
|
1442 | if (true === config.plainByDefault) {
|
1443 | return resolvePromise(subject, response, data, filledArray);
|
1444 | }
|
1445 | /** @type {?} */
|
1446 | var processedData = lodash.map(data, function (elem) {
|
1447 | if (!__this[config.restangularFields.restangularCollection]) {
|
1448 | return restangularizeElem(__this, elem, what, true, data);
|
1449 | }
|
1450 | else {
|
1451 | return restangularizeElem(__this[config.restangularFields.parentResource], elem, __this[config.restangularFields.route], true, data);
|
1452 | }
|
1453 | });
|
1454 | processedData = lodash.extend(data, processedData);
|
1455 | if (!__this[config.restangularFields.restangularCollection]) {
|
1456 | resolvePromise(subject, response, restangularizeCollection(__this, processedData, what, true, fullParams), filledArray);
|
1457 | }
|
1458 | else {
|
1459 | resolvePromise(subject, response, restangularizeCollection(__this[config.restangularFields.parentResource], processedData, __this[config.restangularFields.route], true, fullParams), filledArray);
|
1460 | }
|
1461 | };
|
1462 | urlHandler.resource(this, $http, request.httpConfig, request.headers, request.params, what, this[config.restangularFields.etag], operation)[method]()
|
1463 | .subscribe(okCallback, function error(response) {
|
1464 | if (response.status === 304 && __this[config.restangularFields.restangularCollection]) {
|
1465 | resolvePromise(subject, response, __this, filledArray);
|
1466 | }
|
1467 | else if (lodash.every(config.errorInterceptors, function (cb) {
|
1468 | return cb(response, subject, okCallback) !== false;
|
1469 | })) {
|
1470 | // triggered if no callback returns false
|
1471 | subject.error(response);
|
1472 | }
|
1473 | });
|
1474 | return restangularizeResponse(subject, true, filledArray);
|
1475 | }
|
1476 | /**
|
1477 | * @param {?} httpConfig
|
1478 | * @return {?}
|
1479 | */
|
1480 | function withHttpConfig(httpConfig) {
|
1481 | this[config.restangularFields.httpConfig] = httpConfig;
|
1482 | return this;
|
1483 | }
|
1484 | /**
|
1485 | * @param {?} params
|
1486 | * @param {?} headers
|
1487 | * @return {?}
|
1488 | */
|
1489 | function save(params, headers) {
|
1490 | if (this[config.restangularFields.fromServer]) {
|
1491 | return this[config.restangularFields.put](params, headers);
|
1492 | }
|
1493 | else {
|
1494 | return lodash.bind(elemFunction, this)('post', undefined, params, undefined, headers);
|
1495 | }
|
1496 | }
|
1497 | /**
|
1498 | * @param {?} operation
|
1499 | * @param {?} what
|
1500 | * @param {?} params
|
1501 | * @param {?} obj
|
1502 | * @param {?} headers
|
1503 | * @return {?}
|
1504 | */
|
1505 | function elemFunction(operation, what, params, obj, headers) {
|
1506 | /** @type {?} */
|
1507 | var __this = this;
|
1508 | /** @type {?} */
|
1509 | var subject = new rxjs.BehaviorSubject(null);
|
1510 | /** @type {?} */
|
1511 | var resParams = params || {};
|
1512 | /** @type {?} */
|
1513 | var route = what || this[config.restangularFields.route];
|
1514 | /** @type {?} */
|
1515 | var fetchUrl = urlHandler.fetchUrl(this, what);
|
1516 | /** @type {?} */
|
1517 | var callObj = obj || this;
|
1518 | // fallback to etag on restangular object (since for custom methods we probably don't explicitly specify the etag field)
|
1519 | /** @type {?} */
|
1520 | var etag = callObj[config.restangularFields.etag] || (operation !== 'post' ? this[config.restangularFields.etag] : null);
|
1521 | if (lodash.isObject(callObj) && config.isRestangularized(callObj)) {
|
1522 | callObj = stripRestangular(callObj);
|
1523 | }
|
1524 | /** @type {?} */
|
1525 | var request = config.fullRequestInterceptor(callObj, operation, route, fetchUrl, headers || {}, resParams || {}, this[config.restangularFields.httpConfig] || {});
|
1526 | /** @type {?} */
|
1527 | var filledObject = {};
|
1528 | filledObject = config.transformElem(filledObject, false, route, service);
|
1529 | /** @type {?} */
|
1530 | var okCallback = function (response) {
|
1531 | /** @type {?} */
|
1532 | var resData = lodash.get(response, 'body');
|
1533 | /** @type {?} */
|
1534 | var fullParams = lodash.get(response, 'config.params');
|
1535 | /** @type {?} */
|
1536 | var elem = parseResponse(resData, operation, route, fetchUrl, response, subject);
|
1537 | if (elem) {
|
1538 | /** @type {?} */
|
1539 | var data = void 0;
|
1540 | if (true === config.plainByDefault) {
|
1541 | return resolvePromise(subject, response, elem, filledObject);
|
1542 | }
|
1543 | if (operation === 'post' && !__this[config.restangularFields.restangularCollection]) {
|
1544 | data = restangularizeElem(__this[config.restangularFields.parentResource], elem, route, true, null, fullParams);
|
1545 | resolvePromise(subject, response, data, filledObject);
|
1546 | }
|
1547 | else {
|
1548 | data = restangularizeElem(__this[config.restangularFields.parentResource], elem, __this[config.restangularFields.route], true, null, fullParams);
|
1549 | data[config.restangularFields.singleOne] = __this[config.restangularFields.singleOne];
|
1550 | resolvePromise(subject, response, data, filledObject);
|
1551 | }
|
1552 | }
|
1553 | else {
|
1554 | resolvePromise(subject, response, undefined, filledObject);
|
1555 | }
|
1556 | };
|
1557 | /** @type {?} */
|
1558 | var errorCallback = function (response) {
|
1559 | if (response.status === 304 && config.isSafe(operation)) {
|
1560 | resolvePromise(subject, response, __this, filledObject);
|
1561 | }
|
1562 | else if (lodash.every(config.errorInterceptors, function (cb) {
|
1563 | return cb(response, subject, okCallback) !== false;
|
1564 | })) {
|
1565 | // triggered if no callback returns false
|
1566 | subject.error(response);
|
1567 | }
|
1568 | };
|
1569 | // Overriding HTTP Method
|
1570 | /** @type {?} */
|
1571 | var callOperation = operation;
|
1572 | /** @type {?} */
|
1573 | var callHeaders = lodash.extend({}, request.headers);
|
1574 | /** @type {?} */
|
1575 | var isOverrideOperation = config.isOverridenMethod(operation);
|
1576 | if (isOverrideOperation) {
|
1577 | callOperation = 'post';
|
1578 | callHeaders = lodash.extend(callHeaders, { 'X-HTTP-Method-Override': operation === 'remove' ? 'DELETE' : operation.toUpperCase() });
|
1579 | }
|
1580 | else if (config.jsonp && callOperation === 'get') {
|
1581 | callOperation = 'jsonp';
|
1582 | }
|
1583 | if (config.isSafe(operation)) {
|
1584 | if (isOverrideOperation) {
|
1585 | urlHandler.resource(this, $http, request.httpConfig, callHeaders, request.params, what, etag, callOperation)[callOperation]({}).subscribe(okCallback, errorCallback);
|
1586 | }
|
1587 | else {
|
1588 | urlHandler.resource(this, $http, request.httpConfig, callHeaders, request.params, what, etag, callOperation)[callOperation]().subscribe(okCallback, errorCallback);
|
1589 | }
|
1590 | }
|
1591 | else {
|
1592 | urlHandler.resource(this, $http, request.httpConfig, callHeaders, request.params, what, etag, callOperation)[callOperation](request.element).subscribe(okCallback, errorCallback);
|
1593 | }
|
1594 | return restangularizeResponse(subject, false, filledObject);
|
1595 | }
|
1596 | /**
|
1597 | * @param {?} params
|
1598 | * @param {?} headers
|
1599 | * @return {?}
|
1600 | */
|
1601 | function getFunction(params, headers) {
|
1602 | return lodash.bind(elemFunction, this)('get', undefined, params, undefined, headers);
|
1603 | }
|
1604 | /**
|
1605 | * @param {?} params
|
1606 | * @param {?} headers
|
1607 | * @return {?}
|
1608 | */
|
1609 | function deleteFunction(params, headers) {
|
1610 | return lodash.bind(elemFunction, this)('remove', undefined, params, undefined, headers);
|
1611 | }
|
1612 | /**
|
1613 | * @param {?} params
|
1614 | * @param {?} headers
|
1615 | * @return {?}
|
1616 | */
|
1617 | function putFunction(params, headers) {
|
1618 | return lodash.bind(elemFunction, this)('put', undefined, params, undefined, headers);
|
1619 | }
|
1620 | /**
|
1621 | * @param {?} what
|
1622 | * @param {?} elem
|
1623 | * @param {?} params
|
1624 | * @param {?} headers
|
1625 | * @return {?}
|
1626 | */
|
1627 | function postFunction(what, elem, params, headers) {
|
1628 | return lodash.bind(elemFunction, this)('post', what, params, elem, headers);
|
1629 | }
|
1630 | /**
|
1631 | * @param {?} params
|
1632 | * @param {?} headers
|
1633 | * @return {?}
|
1634 | */
|
1635 | function headFunction(params, headers) {
|
1636 | return lodash.bind(elemFunction, this)('head', undefined, params, undefined, headers);
|
1637 | }
|
1638 | /**
|
1639 | * @param {?} params
|
1640 | * @param {?} headers
|
1641 | * @return {?}
|
1642 | */
|
1643 | function traceFunction(params, headers) {
|
1644 | return lodash.bind(elemFunction, this)('trace', undefined, params, undefined, headers);
|
1645 | }
|
1646 | /**
|
1647 | * @param {?} params
|
1648 | * @param {?} headers
|
1649 | * @return {?}
|
1650 | */
|
1651 | function optionsFunction(params, headers) {
|
1652 | return lodash.bind(elemFunction, this)('options', undefined, params, undefined, headers);
|
1653 | }
|
1654 | /**
|
1655 | * @param {?} elem
|
1656 | * @param {?} params
|
1657 | * @param {?} headers
|
1658 | * @return {?}
|
1659 | */
|
1660 | function patchFunction(elem, params, headers) {
|
1661 | return lodash.bind(elemFunction, this)('patch', undefined, params, elem, headers);
|
1662 | }
|
1663 | /**
|
1664 | * @param {?} operation
|
1665 | * @param {?} path
|
1666 | * @param {?} params
|
1667 | * @param {?} headers
|
1668 | * @param {?} elem
|
1669 | * @return {?}
|
1670 | */
|
1671 | function customFunction(operation, path, params, headers, elem) {
|
1672 | return lodash.bind(elemFunction, this)(operation, path, params, elem, headers);
|
1673 | }
|
1674 | /**
|
1675 | * @param {?} name
|
1676 | * @param {?} operation
|
1677 | * @param {?} path
|
1678 | * @param {?} defaultParams
|
1679 | * @param {?} defaultHeaders
|
1680 | * @param {?} defaultElem
|
1681 | * @return {?}
|
1682 | */
|
1683 | function addRestangularMethodFunction(name, operation, path, defaultParams, defaultHeaders, defaultElem) {
|
1684 | /** @type {?} */
|
1685 | var bindedFunction;
|
1686 | if (operation === 'getList') {
|
1687 | bindedFunction = lodash.bind(fetchFunction, this, path);
|
1688 | }
|
1689 | else {
|
1690 | bindedFunction = lodash.bind(customFunction, this, operation, path);
|
1691 | }
|
1692 | /** @type {?} */
|
1693 | var createdFunction = function (params, headers, elem) {
|
1694 | /** @type {?} */
|
1695 | var callParams = lodash.defaults({
|
1696 | params: params,
|
1697 | headers: headers,
|
1698 | elem: elem
|
1699 | }, {
|
1700 | params: defaultParams,
|
1701 | headers: defaultHeaders,
|
1702 | elem: defaultElem
|
1703 | });
|
1704 | return bindedFunction(callParams.params, callParams.headers, callParams.elem);
|
1705 | };
|
1706 | if (config.isSafe(operation)) {
|
1707 | this[name] = createdFunction;
|
1708 | }
|
1709 | else {
|
1710 | this[name] = function (elem, params, headers) {
|
1711 | return createdFunction(params, headers, elem);
|
1712 | };
|
1713 | }
|
1714 | }
|
1715 | /**
|
1716 | * @param {?} configurer
|
1717 | * @return {?}
|
1718 | */
|
1719 | function withConfigurationFunction(configurer) {
|
1720 | /** @type {?} */
|
1721 | var newConfig = lodash.clone(lodash.omit(config, 'configuration'));
|
1722 | RestangularConfigurer(newConfig, newConfig);
|
1723 | configurer(newConfig);
|
1724 | return createServiceForConfiguration(newConfig);
|
1725 | }
|
1726 | /**
|
1727 | * @param {?} route
|
1728 | * @param {?} parent
|
1729 | * @return {?}
|
1730 | */
|
1731 | function toService(route, parent) {
|
1732 | /** @type {?} */
|
1733 | var knownCollectionMethods = lodash.values(config.restangularFields);
|
1734 | /** @type {?} */
|
1735 | var serv = {};
|
1736 | /** @type {?} */
|
1737 | var collection = (parent || service).all(route);
|
1738 | serv.one = lodash.bind(one, (parent || service), parent, route);
|
1739 | serv.all = lodash.bind(collection.all, collection);
|
1740 | serv.post = lodash.bind(collection.post, collection);
|
1741 | serv.getList = lodash.bind(collection.getList, collection);
|
1742 | serv.withHttpConfig = lodash.bind(collection.withHttpConfig, collection);
|
1743 | serv.get = lodash.bind(collection.get, collection);
|
1744 | for (var prop in collection) {
|
1745 | if (collection.hasOwnProperty(prop) && lodash.isFunction(collection[prop]) && !lodash.includes(knownCollectionMethods, prop)) {
|
1746 | serv[prop] = lodash.bind(collection[prop], collection);
|
1747 | }
|
1748 | }
|
1749 | return serv;
|
1750 | }
|
1751 | RestangularConfigurer(service, config);
|
1752 | service.copy = lodash.bind(copyRestangularizedElement, service);
|
1753 | service.service = lodash.bind(toService, service);
|
1754 | service.withConfig = lodash.bind(withConfigurationFunction, service);
|
1755 | service.one = lodash.bind(one, service, null);
|
1756 | service.all = lodash.bind(all, service, null);
|
1757 | service.several = lodash.bind(several, service, null);
|
1758 | service.oneUrl = lodash.bind(oneUrl, service, null);
|
1759 | service.allUrl = lodash.bind(allUrl, service, null);
|
1760 | service.stripRestangular = lodash.bind(stripRestangular, service);
|
1761 | service.restangularizeElement = lodash.bind(restangularizeElem, service);
|
1762 | service.restangularizeCollection = lodash.bind(restangularizeCollectionAndElements, service);
|
1763 | return service;
|
1764 | }
|
1765 | return createServiceForConfiguration(globalConfiguration);
|
1766 | }
|
1767 | }
|
1768 |
|
1769 | /**
|
1770 | * @fileoverview added by tsickle
|
1771 | * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
|
1772 | */
|
1773 | /** @type {?} */
|
1774 | var CONFIG_OBJ = new core.InjectionToken('configObj');
|
1775 | var RestangularModule = /** @class */ (function () {
|
1776 | function RestangularModule(parentModule) {
|
1777 | if (parentModule) {
|
1778 | throw new Error('RestangularModule is already loaded. Import it in the AppModule only');
|
1779 | }
|
1780 | }
|
1781 | /**
|
1782 | * @param {?=} config1
|
1783 | * @param {?=} config2
|
1784 | * @return {?}
|
1785 | */
|
1786 | RestangularModule.forRoot = /**
|
1787 | * @param {?=} config1
|
1788 | * @param {?=} config2
|
1789 | * @return {?}
|
1790 | */
|
1791 | function (config1, config2) {
|
1792 | return {
|
1793 | ngModule: RestangularModule,
|
1794 | providers: [
|
1795 | { provide: CONFIG_OBJ, useValue: [config1, config2] },
|
1796 | { provide: RESTANGULAR, useFactory: RestangularFactory, deps: [CONFIG_OBJ] },
|
1797 | ]
|
1798 | };
|
1799 | };
|
1800 | RestangularModule.decorators = [
|
1801 | { type: core.NgModule, args: [{
|
1802 | imports: [http.HttpClientModule],
|
1803 | providers: [RestangularHttp, Restangular]
|
1804 | },] },
|
1805 | ];
|
1806 | /** @nocollapse */
|
1807 | RestangularModule.ctorParameters = function () {
|
1808 | return [
|
1809 | { type: RestangularModule, decorators: [{ type: core.Optional }, { type: core.SkipSelf }] }
|
1810 | ];
|
1811 | };
|
1812 | return RestangularModule;
|
1813 | }());
|
1814 |
|
1815 | /**
|
1816 | * @fileoverview added by tsickle
|
1817 | * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
|
1818 | */
|
1819 |
|
1820 | /**
|
1821 | * @fileoverview added by tsickle
|
1822 | * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
|
1823 | */
|
1824 |
|
1825 | /**
|
1826 | * @fileoverview added by tsickle
|
1827 | * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
|
1828 | */
|
1829 |
|
1830 | exports.RestangularModule = RestangularModule;
|
1831 | exports.Restangular = Restangular;
|
1832 | exports.RestangularHttp = RestangularHttp;
|
1833 | exports.ɵb = RESTANGULAR;
|
1834 | exports.ɵc = RestangularFactory;
|
1835 | exports.ɵa = CONFIG_OBJ;
|
1836 |
|
1837 | Object.defineProperty(exports, '__esModule', { value: true });
|
1838 |
|
1839 | })));
|
1840 |
|
1841 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXJlc3Rhbmd1bGFyLnVtZC5qcy5tYXAiLCJzb3VyY2VzIjpbbnVsbCwibmc6Ly9uZ3gtcmVzdGFuZ3VsYXIvbGliL25neC1yZXN0YW5ndWxhci5jb25maWcudHMiLCJuZzovL25neC1yZXN0YW5ndWxhci9saWIvbmd4LXJlc3Rhbmd1bGFyLWhlbHBlci50cyIsIm5nOi8vbmd4LXJlc3Rhbmd1bGFyL2xpYi9uZ3gtcmVzdGFuZ3VsYXItaHR0cC50cyIsIm5nOi8vbmd4LXJlc3Rhbmd1bGFyL2xpYi9uZ3gtcmVzdGFuZ3VsYXItY29uZmlnLmZhY3RvcnkudHMiLCJuZzovL25neC1yZXN0YW5ndWxhci9saWIvbmd4LXJlc3Rhbmd1bGFyLnRzIiwibmc6Ly9uZ3gtcmVzdGFuZ3VsYXIvbGliL25neC1yZXN0YW5ndWxhci5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChlLmluZGV4T2YocFtpXSkgPCAwKVxyXG4gICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHJlc3VsdC52YWx1ZSk7IH0pLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKCFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgcmVzdWx0W2tdID0gbW9kW2tdO1xyXG4gICAgcmVzdWx0LmRlZmF1bHQgPSBtb2Q7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAnbG9kYXNoJztcblxuXG5leHBvcnQgY29uc3QgUkVTVEFOR1VMQVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPigncmVzdGFuZ3VsYXJXaXRoQ29uZmlnJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXN0YW5ndWxhckZhY3RvcnkoW2NhbGxiYWNrT3JTZXJ2aWNlcywgY2FsbGJhY2tdKSB7XG4gIGxldCBhcnJTZXJ2aWNlcyA9IFtdO1xuICBsZXQgZm4gPSBjYWxsYmFja09yU2VydmljZXM7XG5cbiAgaWYgKGlzQXJyYXkoY2FsbGJhY2tPclNlcnZpY2VzKSkge1xuICAgIGFyclNlcnZpY2VzID0gY2FsbGJhY2tPclNlcnZpY2VzO1xuICAgIGZuID0gY2FsbGJhY2s7XG4gIH1cblxuICByZXR1cm4ge2ZuLCBhcnJTZXJ2aWNlc307XG59XG4iLCJpbXBvcnQgeyBIdHRwUmVxdWVzdCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cbmltcG9ydCB7IGFzc2lnbiB9IGZyb20gJ2NvcmUtanMvZm4vb2JqZWN0JztcblxuZXhwb3J0IGNsYXNzIFJlc3Rhbmd1bGFySGVscGVyIHtcblxuICBzdGF0aWMgY3JlYXRlUmVxdWVzdChvcHRpb25zKSB7XG4gICAgY29uc3QgcmVxdWVzdFF1ZXJ5UGFyYW1zID0gUmVzdGFuZ3VsYXJIZWxwZXIuY3JlYXRlUmVxdWVzdFF1ZXJ5UGFyYW1zKG9wdGlvbnMucGFyYW1zKTtcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVycyA9IFJlc3Rhbmd1bGFySGVscGVyLmNyZWF0ZVJlcXVlc3RIZWFkZXJzKG9wdGlvbnMuaGVhZGVycyk7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IG9wdGlvbnMubWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gICAgY29uc3Qgd2l0aENyZWRlbnRpYWxzID0gb3B0aW9ucy53aXRoQ3JlZGVudGlhbHMgfHwgZmFsc2U7XG5cbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBIdHRwUmVxdWVzdChcbiAgICAgIG1ldGhvZE5hbWUsXG4gICAgICBvcHRpb25zLnVybCxcbiAgICAgIG9wdGlvbnMuZGF0YSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgIHBhcmFtczogcmVxdWVzdFF1ZXJ5UGFyYW1zLFxuICAgICAgICByZXNwb25zZVR5cGU6IG9wdGlvbnMucmVzcG9uc2VUeXBlLFxuICAgICAgICB3aXRoQ3JlZGVudGlhbHNcbiAgICAgIH1cbiAgICApO1xuXG4gICAgaWYgKFsnR0VUJywgJ0RFTEVURScsICdIRUFEJywgJ0pTT05QJywgJ09QVElPTlMnXS5pbmRleE9mKG1ldGhvZE5hbWUpID49IDApIHtcbiAgICAgIHJlcXVlc3QgPSBuZXcgSHR0cFJlcXVlc3QoXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIG9wdGlvbnMudXJsLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgcGFyYW1zOiByZXF1ZXN0UXVlcnlQYXJhbXMsXG4gICAgICAgICAgcmVzcG9uc2VUeXBlOiBvcHRpb25zLnJlc3BvbnNlVHlwZSxcbiAgICAgICAgICB3aXRoQ3JlZGVudGlhbHNcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUmVxdWVzdFF1ZXJ5UGFyYW1zKHF1ZXJ5UGFyYW1zKSB7XG4gICAgY29uc3QgcmVxdWVzdFF1ZXJ5UGFyYW1zID0gYXNzaWduKHt9LCBxdWVyeVBhcmFtcyk7XG4gICAgbGV0IHNlYXJjaDogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiByZXF1ZXN0UXVlcnlQYXJhbXMpIHtcbiAgICAgIGxldCB2YWx1ZTogYW55ID0gcmVxdWVzdFF1ZXJ5UGFyYW1zW2tleV07XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICBzZWFyY2ggPSBzZWFyY2guYXBwZW5kKGtleSwgdmFsKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHNlYXJjaCA9IHNlYXJjaC5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlYXJjaDtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVSZXF1ZXN0SGVhZGVycyhoZWFkZXJzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gaGVhZGVycykge1xuICAgICAgY29uc3QgdmFsdWU6IGFueSA9IGhlYWRlcnNba2V5XTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGRlbGV0ZSBoZWFkZXJzW2tleV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBIdHRwSGVhZGVycyhhc3NpZ24oe30sIGhlYWRlcnMpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cEJhY2tlbmQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5pbXBvcnQgeyB0aHJvd0Vycm9yLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlc3Rhbmd1bGFySGVscGVyIH0gZnJvbSAnLi9uZ3gtcmVzdGFuZ3VsYXItaGVscGVyJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSHR0cEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAvc3JjL3Jlc3BvbnNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlc3Rhbmd1bGFySHR0cCB7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGh0dHA6IEh0dHBCYWNrZW5kKSB7XG4gIH1cblxuICBjcmVhdGVSZXF1ZXN0KG9wdGlvbnMpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IFJlc3Rhbmd1bGFySGVscGVyLmNyZWF0ZVJlcXVlc3Qob3B0aW9ucyk7XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHJlcXVlc3QpO1xuICB9XG5cbiAgcmVxdWVzdChyZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuaGFuZGxlKHJlcXVlc3QpXG4gICAgLnBpcGUoXG4gICAgICBmaWx0ZXIoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpLFxuICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihuZXcgSHR0cEVycm9yUmVzcG9uc2UocmVzcG9uc2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9KSxcbiAgICAgIG1hcChyZXNwb25zZSA9PiB7XG4gICAgICAgIHJlc3BvbnNlLmNvbmZpZyA9IHtwYXJhbXM6IHJlcXVlc3R9O1xuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgZXJyLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgICAgICBlcnIuZGF0YSA9IGVyci5lcnJvcjtcbiAgICAgICAgZXJyLnJlcGVhdFJlcXVlc3QgPSAobmV3UmVxdWVzdD8pID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG5ld1JlcXVlc3QgfHwgcmVxdWVzdCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG4iLCJpbXBvcnQge1xuICBpbmNsdWRlcyxcbiAgaXNVbmRlZmluZWQsXG4gIGlzTnVsbCxcbiAgaXNBcnJheSxcbiAgaXNPYmplY3QsXG4gIGlzQm9vbGVhbixcbiAgZGVmYXVsdHMsXG4gIGVhY2gsXG4gIGV4dGVuZCxcbiAgZmluZCxcbiAgaGFzLFxuICBpbml0aWFsLFxuICBsYXN0LFxuICBjbG9uZSxcbiAgcmVkdWNlLFxuICBrZXlzLFxuICBpc0VtcHR5LFxuICBmb3JFYWNoLFxufSBmcm9tICdsb2Rhc2gnO1xuXG5leHBvcnQgZnVuY3Rpb24gUmVzdGFuZ3VsYXJDb25maWd1cmVyKG9iamVjdCwgY29uZmlndXJhdGlvbikge1xuICBvYmplY3QuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFRob3NlIGFyZSBIVFRQIHNhZmUgbWV0aG9kcyBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gbmVlZCB0byBwYXNzIGFueSBkYXRhIHdpdGggdGhlIHJlcXVlc3QuXG4gICAqL1xuICBjb25zdCBzYWZlTWV0aG9kcyA9IFsnZ2V0JywgJ2hlYWQnLCAnb3B0aW9ucycsICd0cmFjZScsICdnZXRsaXN0J107XG4gIGNvbmZpZ3VyYXRpb24uaXNTYWZlID0gZnVuY3Rpb24gKG9wZXJhdGlvbikge1xuICAgIHJldHVybiBpbmNsdWRlcyhzYWZlTWV0aG9kcywgb3BlcmF0aW9uLnRvTG93ZXJDYXNlKCkpO1xuICB9O1xuXG4gIGNvbnN0IGFic29sdXRlUGF0dGVybiA9IC9eaHR0cHM/OlxcL1xcLy9pO1xuICBjb25maWd1cmF0aW9uLmlzQWJzb2x1dGVVcmwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgcmV0dXJuIGlzVW5kZWZpbmVkKGNvbmZpZ3VyYXRpb24uYWJzb2x1dGVVcmwpIHx8IGlzTnVsbChjb25maWd1cmF0aW9uLmFic29sdXRlVXJsKSA/XG4gICAgICBzdHJpbmcgJiYgYWJzb2x1dGVQYXR0ZXJuLnRlc3Qoc3RyaW5nKSA6XG4gICAgICBjb25maWd1cmF0aW9uLmFic29sdXRlVXJsO1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24uYWJzb2x1dGVVcmwgPSBpc1VuZGVmaW5lZChjb25maWd1cmF0aW9uLmFic29sdXRlVXJsKSA/IHRydWUgOiBjb25maWd1cmF0aW9uLmFic29sdXRlVXJsO1xuICBvYmplY3Quc2V0U2VsZkxpbmtBYnNvbHV0ZVVybCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGNvbmZpZ3VyYXRpb24uYWJzb2x1dGVVcmwgPSB2YWx1ZTtcbiAgfTtcbiAgLyoqXG4gICAqIFRoaXMgaXMgdGhlIEJhc2VVUkwgdG8gYmUgdXNlZCB3aXRoIFJlc3Rhbmd1bGFyXG4gICAqL1xuICBjb25maWd1cmF0aW9uLmJhc2VVcmwgPSBpc1VuZGVmaW5lZChjb25maWd1cmF0aW9uLmJhc2VVcmwpID8gJycgOiBjb25maWd1cmF0aW9uLmJhc2VVcmw7XG4gIG9iamVjdC5zZXRCYXNlVXJsID0gZnVuY3Rpb24gKG5ld0Jhc2VVcmwpIHtcbiAgICBjb25maWd1cmF0aW9uLmJhc2VVcmwgPSAvXFwvJC8udGVzdChuZXdCYXNlVXJsKSA/XG4gICAgICBuZXdCYXNlVXJsLnN1YnN0cmluZygwLCBuZXdCYXNlVXJsLmxlbmd0aCAtIDEpIDpcbiAgICAgIG5ld0Jhc2VVcmw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGV4dHJhIGZpZWxkcyB0byBrZWVwIGZyb20gdGhlIHBhcmVudHNcbiAgICovXG4gIGNvbmZpZ3VyYXRpb24uZXh0cmFGaWVsZHMgPSBjb25maWd1cmF0aW9uLmV4dHJhRmllbGRzIHx8IFtdO1xuICBvYmplY3Quc2V0RXh0cmFGaWVsZHMgPSBmdW5jdGlvbiAobmV3RXh0cmFGaWVsZHMpIHtcbiAgICBjb25maWd1cmF0aW9uLmV4dHJhRmllbGRzID0gbmV3RXh0cmFGaWVsZHM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNvbWUgZGVmYXVsdCAkaHR0cCBwYXJhbWV0ZXIgdG8gYmUgdXNlZCBpbiBFVkVSWSBjYWxsXG4gICAqKi9cbiAgY29uZmlndXJhdGlvbi5kZWZhdWx0SHR0cEZpZWxkcyA9IGNvbmZpZ3VyYXRpb24uZGVmYXVsdEh0dHBGaWVsZHMgfHwge307XG4gIG9iamVjdC5zZXREZWZhdWx0SHR0cEZpZWxkcyA9IGZ1bmN0aW9uICh2YWx1ZXMpIHtcbiAgICBjb25maWd1cmF0aW9uLmRlZmF1bHRIdHRwRmllbGRzID0gdmFsdWVzO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBbHdheXMgcmV0dXJuIHBsYWluIGRhdGEsIG5vIHJlc3Rhbmd1bGFyaXplZCBvYmplY3RcbiAgICoqL1xuICBjb25maWd1cmF0aW9uLnBsYWluQnlEZWZhdWx0ID0gY29uZmlndXJhdGlvbi5wbGFpbkJ5RGVmYXVsdCB8fCBmYWxzZTtcbiAgb2JqZWN0LnNldFBsYWluQnlEZWZhdWx0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgY29uZmlndXJhdGlvbi5wbGFpbkJ5RGVmYXVsdCA9IHZhbHVlID09PSB0cnVlID8gdHJ1ZSA6IGZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24ud2l0aEh0dHBWYWx1ZXMgPSBmdW5jdGlvbiAoaHR0cExvY2FsQ29uZmlnLCBvYmopIHtcbiAgICByZXR1cm4gZGVmYXVsdHMob2JqLCBodHRwTG9jYWxDb25maWcsIGNvbmZpZ3VyYXRpb24uZGVmYXVsdEh0dHBGaWVsZHMpO1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24uZW5jb2RlSWRzID0gaXNVbmRlZmluZWQoY29uZmlndXJhdGlvbi5lbmNvZGVJZHMpID8gdHJ1ZSA6IGNvbmZpZ3VyYXRpb24uZW5jb2RlSWRzO1xuICBvYmplY3Quc2V0RW5jb2RlSWRzID0gZnVuY3Rpb24gKGVuY29kZSkge1xuICAgIGNvbmZpZ3VyYXRpb24uZW5jb2RlSWRzID0gZW5jb2RlO1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RQYXJhbXMgPSBjb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0UGFyYW1zIHx8IHtcbiAgICBnZXQ6IHt9LFxuICAgIHBvc3Q6IHt9LFxuICAgIHB1dDoge30sXG4gICAgcmVtb3ZlOiB7fSxcbiAgICBjb21tb246IHt9XG4gIH07XG5cbiAgb2JqZWN0LnNldERlZmF1bHRSZXF1ZXN0UGFyYW1zID0gZnVuY3Rpb24gKHBhcmFtMSwgcGFyYW0yKSB7XG4gICAgbGV0IG1ldGhvZHMgPSBbXTtcbiAgICBjb25zdCBwYXJhbXMgPSBwYXJhbTIgfHwgcGFyYW0xO1xuICAgIGlmICghaXNVbmRlZmluZWQocGFyYW0yKSkge1xuICAgICAgaWYgKGlzQXJyYXkocGFyYW0xKSkge1xuICAgICAgICBtZXRob2RzID0gcGFyYW0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWV0aG9kcy5wdXNoKHBhcmFtMSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1ldGhvZHMucHVzaCgnY29tbW9uJyk7XG4gICAgfVxuXG4gICAgZWFjaChtZXRob2RzLCBmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICBjb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0UGFyYW1zW21ldGhvZF0gPSBwYXJhbXM7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgb2JqZWN0LnJlcXVlc3RQYXJhbXMgPSBjb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0UGFyYW1zO1xuXG4gIGNvbmZpZ3VyYXRpb24uZGVmYXVsdEhlYWRlcnMgPSBjb25maWd1cmF0aW9uLmRlZmF1bHRIZWFkZXJzIHx8IHt9O1xuICBvYmplY3Quc2V0RGVmYXVsdEhlYWRlcnMgPSBmdW5jdGlvbiAoaGVhZGVycykge1xuICAgIGNvbmZpZ3VyYXRpb24uZGVmYXVsdEhlYWRlcnMgPSBoZWFkZXJzO1xuICAgIG9iamVjdC5kZWZhdWx0SGVhZGVycyA9IGNvbmZpZ3VyYXRpb24uZGVmYXVsdEhlYWRlcnM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgb2JqZWN0LmRlZmF1bHRIZWFkZXJzID0gY29uZmlndXJhdGlvbi5kZWZhdWx0SGVhZGVycztcblxuXG4gIC8qKlxuICAgKiBNZXRob2Qgb3ZlcnJpZGVycyByZXNwb25zZSBNZXRob2RcbiAgICoqL1xuICBjb25maWd1cmF0aW9uLmRlZmF1bHRSZXNwb25zZU1ldGhvZCA9IGNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlc3BvbnNlTWV0aG9kIHx8ICdwcm9taXNlJztcbiAgb2JqZWN0LnNldERlZmF1bHRSZXNwb25zZU1ldGhvZCA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICBjb25maWd1cmF0aW9uLmRlZmF1bHRSZXNwb25zZU1ldGhvZCA9IG1ldGhvZDtcbiAgICBvYmplY3QuZGVmYXVsdFJlc3BvbnNlTWV0aG9kID0gY29uZmlndXJhdGlvbi5kZWZhdWx0UmVzcG9uc2VNZXRob2Q7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIG9iamVjdC5kZWZhdWx0UmVzcG9uc2VNZXRob2QgPSBjb25maWd1cmF0aW9uLmRlZmF1bHRSZXNwb25zZU1ldGhvZDtcblxuICAvKipcbiAgICogTWV0aG9kIG92ZXJyaWRlcnMgd2lsbCBzZXQgd2hpY2ggbWV0aG9kcyBhcmUgc2VudCB2aWEgUE9TVCB3aXRoIGFuIFgtSFRUUC1NZXRob2QtT3ZlcnJpZGVcbiAgICoqL1xuICBjb25maWd1cmF0aW9uLm1ldGhvZE92ZXJyaWRlcnMgPSBjb25maWd1cmF0aW9uLm1ldGhvZE92ZXJyaWRlcnMgfHwgW107XG4gIG9iamVjdC5zZXRNZXRob2RPdmVycmlkZXJzID0gZnVuY3Rpb24gKHZhbHVlcykge1xuICAgIGNvbnN0IG92ZXJyaWRlcnMgPSBleHRlbmQoW10sIHZhbHVlcyk7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24uaXNPdmVycmlkZW5NZXRob2QoJ2RlbGV0ZScsIG92ZXJyaWRlcnMpKSB7XG4gICAgICBvdmVycmlkZXJzLnB1c2goJ3JlbW92ZScpO1xuICAgIH1cbiAgICBjb25maWd1cmF0aW9uLm1ldGhvZE92ZXJyaWRlcnMgPSBvdmVycmlkZXJzO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24uanNvbnAgPSBpc1VuZGVmaW5lZChjb25maWd1cmF0aW9uLmpzb25wKSA/IGZhbHNlIDogY29uZmlndXJhdGlvbi5qc29ucDtcbiAgb2JqZWN0LnNldEpzb25wID0gZnVuY3Rpb24gKGFjdGl2ZSkge1xuICAgIGNvbmZpZ3VyYXRpb24uanNvbnAgPSBhY3RpdmU7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi5pc092ZXJyaWRlbk1ldGhvZCA9IGZ1bmN0aW9uIChtZXRob2QsIHZhbHVlcykge1xuICAgIGNvbnN0IHNlYXJjaCA9IHZhbHVlcyB8fCBjb25maWd1cmF0aW9uLm1ldGhvZE92ZXJyaWRlcnM7XG4gICAgcmV0dXJuICFpc1VuZGVmaW5lZChmaW5kKHNlYXJjaCwgZnVuY3Rpb24gKG9uZTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gb25lLnRvTG93ZXJDYXNlKCkgPT09IG1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pKTtcbiAgfTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgVVJMIGNyZWF0b3IgdHlwZS4gRm9yIG5vdywgb25seSBQYXRoIGlzIGNyZWF0ZWQuIEluIHRoZSBmdXR1cmUgd2UnbGwgaGF2ZSBxdWVyeVBhcmFtc1xuICAgKiovXG4gIGNvbmZpZ3VyYXRpb24udXJsQ3JlYXRvciA9IGNvbmZpZ3VyYXRpb24udXJsQ3JlYXRvciB8fCAncGF0aCc7XG4gIG9iamVjdC5zZXRVcmxDcmVhdG9yID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAoIWhhcyhjb25maWd1cmF0aW9uLnVybENyZWF0b3JGYWN0b3J5LCBuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVUkwgUGF0aCBzZWxlY3RlZCBpc25cXCd0IHZhbGlkJyk7XG4gICAgfVxuXG4gICAgY29uZmlndXJhdGlvbi51cmxDcmVhdG9yID0gbmFtZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogWW91IGNhbiBzZXQgdGhlIHJlc3Rhbmd1bGFyIGZpZWxkcyBoZXJlLiBUaGUgMyByZXF1aXJlZCBmaWVsZHMgZm9yIFJlc3Rhbmd1bGFyIGFyZTpcbiAgICpcbiAgICogaWQ6IElkIG9mIHRoZSBlbGVtZW50XG4gICAqIHJvdXRlOiBuYW1lIG9mIHRoZSByb3V0ZSBvZiB0aGlzIGVsZW1lbnRcbiAgICogcGFyZW50UmVzb3VyY2U6IHRoZSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCByZXNvdXJjZVxuICAgKlxuICAgKiAgQWxsIG9mIHRoaXMgZmllbGRzIGV4Y2VwdCBmb3IgaWQsIGFyZSBoYW5kbGVkIChhbmQgY3JlYXRlZCkgYnkgUmVzdGFuZ3VsYXIuIEJ5IGRlZmF1bHQsXG4gICAqICB0aGUgZmllbGQgdmFsdWVzIHdpbGwgYmUgaWQsIHJvdXRlIGFuZCBwYXJlbnRSZXNvdXJjZSByZXNwZWN0aXZlbHlcbiAgICovXG4gIGNvbmZpZ3VyYXRpb24ucmVzdGFuZ3VsYXJGaWVsZHMgPSBjb25maWd1cmF0aW9uLnJlc3Rhbmd1bGFyRmllbGRzIHx8IHtcbiAgICBpZDogJ2lkJyxcbiAgICByb3V0ZTogJ3JvdXRlJyxcbiAgICBwYXJlbnRSZXNvdXJjZTogJ3BhcmVudFJlc291cmNlJyxcbiAgICByZXN0YW5ndWxhckNvbGxlY3Rpb246ICdyZXN0YW5ndWxhckNvbGxlY3Rpb24nLFxuICAgIGNhbm5vbmljYWxJZDogJ19fY2Fubm9uaWNhbElkJyxcbiAgICBldGFnOiAncmVzdGFuZ3VsYXJFdGFnJyxcbiAgICBzZWxmTGluazogJ2hyZWYnLFxuICAgIGdldDogJ2dldCcsXG4gICAgZ2V0TGlzdDogJ2dldExpc3QnLFxuICAgIHB1dDogJ3B1dCcsXG4gICAgcG9zdDogJ3Bvc3QnLFxuICAgIHJlbW92ZTogJ3JlbW92ZScsXG4gICAgaGVhZDogJ2hlYWQnLFxuICAgIHRyYWNlOiAndHJhY2UnLFxuICAgIG9wdGlvbnM6ICdvcHRpb25zJyxcbiAgICBwYXRjaDogJ3BhdGNoJyxcbiAgICBnZXRSZXN0YW5ndWxhclVybDogJ2dldFJlc3Rhbmd1bGFyVXJsJyxcbiAgICBnZXRSZXF1ZXN0ZWRVcmw6ICdnZXRSZXF1ZXN0ZWRVcmwnLFxuICAgIHB1dEVsZW1lbnQ6ICdwdXRFbGVtZW50JyxcbiAgICBhZGRSZXN0YW5ndWxhck1ldGhvZDogJ2FkZFJlc3Rhbmd1bGFyTWV0aG9kJyxcbiAgICBnZXRQYXJlbnRMaXN0OiAnZ2V0UGFyZW50TGlzdCcsXG4gICAgY2xvbmU6ICdjbG9uZScsXG4gICAgaWRzOiAnaWRzJyxcbiAgICBodHRwQ29uZmlnOiAnXyRodHRwQ29uZmlnJyxcbiAgICByZXFQYXJhbXM6ICdyZXFQYXJhbXMnLFxuICAgIG9uZTogJ29uZScsXG4gICAgYWxsOiAnYWxsJyxcbiAgICBzZXZlcmFsOiAnc2V2ZXJhbCcsXG4gICAgb25lVXJsOiAnb25lVXJsJyxcbiAgICBhbGxVcmw6ICdhbGxVcmwnLFxuICAgIGN1c3RvbVBVVDogJ2N1c3RvbVBVVCcsXG4gICAgY3VzdG9tUEFUQ0g6ICdjdXN0b21QQVRDSCcsXG4gICAgY3VzdG9tUE9TVDogJ2N1c3RvbVBPU1QnLFxuICAgIGN1c3RvbURFTEVURTogJ2N1c3RvbURFTEVURScsXG4gICAgY3VzdG9tR0VUOiAnY3VzdG9tR0VUJyxcbiAgICBjdXN0b21HRVRMSVNUOiAnY3VzdG9tR0VUTElTVCcsXG4gICAgY3VzdG9tT3BlcmF0aW9uOiAnY3VzdG9tT3BlcmF0aW9uJyxcbiAgICBkb1BVVDogJ2RvUFVUJyxcbiAgICBkb1BBVENIOiAnZG9QQVRDSCcsXG4gICAgZG9QT1NUOiAnZG9QT1NUJyxcbiAgICBkb0RFTEVURTogJ2RvREVMRVRFJyxcbiAgICBkb0dFVDogJ2RvR0VUJyxcbiAgICBkb0dFVExJU1Q6ICdkb0dFVExJU1QnLFxuICAgIGZyb21TZXJ2ZXI6ICdmcm9tU2VydmVyJyxcbiAgICB3aXRoQ29uZmlnOiAnd2l0aENvbmZpZycsXG4gICAgd2l0aEh0dHBDb25maWc6ICd3aXRoSHR0cENvbmZpZycsXG4gICAgc2luZ2xlT25lOiAnc2luZ2xlT25lJyxcbiAgICBwbGFpbjogJ3BsYWluJyxcbiAgICBzYXZlOiAnc2F2ZScsXG4gICAgcmVzdGFuZ3VsYXJpemVkOiAncmVzdGFuZ3VsYXJpemVkJ1xuICB9O1xuICBvYmplY3Quc2V0UmVzdGFuZ3VsYXJGaWVsZHMgPSBmdW5jdGlvbiAocmVzRmllbGRzKSB7XG4gICAgY29uZmlndXJhdGlvbi5yZXN0YW5ndWxhckZpZWxkcyA9XG4gICAgICBleHRlbmQoe30sIGNvbmZpZ3VyYXRpb24ucmVzdGFuZ3VsYXJGaWVsZHMsIHJlc0ZpZWxkcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi5pc1Jlc3Rhbmd1bGFyaXplZCA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gISFvYmpbY29uZmlndXJhdGlvbi5yZXN0YW5ndWxhckZpZWxkcy5yZXN0YW5ndWxhcml6ZWRdO1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24uc2V0RmllbGRUb0VsZW0gPSBmdW5jdGlvbiAoZmllbGQsIGVsZW0sIHZhbHVlKSB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IGZpZWxkLnNwbGl0KCcuJyk7XG4gICAgbGV0IGlkVmFsdWUgPSBlbGVtO1xuICAgIGVhY2goaW5pdGlhbChwcm9wZXJ0aWVzKSwgZnVuY3Rpb24gKHByb3A6IGFueSkge1xuICAgICAgaWRWYWx1ZVtwcm9wXSA9IHt9O1xuICAgICAgaWRWYWx1ZSA9IGlkVmFsdWVbcHJvcF07XG4gICAgfSk7XG4gICAgY29uc3QgaW5kZXg6IGFueSA9IGxhc3QocHJvcGVydGllcyk7XG4gICAgaWRWYWx1ZVtpbmRleF0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBjb25maWd1cmF0aW9uLmdldEZpZWxkRnJvbUVsZW0gPSBmdW5jdGlvbiAoZmllbGQsIGVsZW0pIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gZmllbGQuc3BsaXQoJy4nKTtcbiAgICBsZXQgaWRWYWx1ZTogYW55ID0gZWxlbTtcbiAgICBlYWNoKHByb3BlcnRpZXMsIGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICBpZiAoaWRWYWx1ZSkge1xuICAgICAgICBpZFZhbHVlID0gaWRWYWx1ZVtwcm9wXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2xvbmUoaWRWYWx1ZSk7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi5zZXRJZFRvRWxlbSA9IGZ1bmN0aW9uIChlbGVtLCBpZCAvKiwgcm91dGUgKi8pIHtcbiAgICBjb25maWd1cmF0aW9uLnNldEZpZWxkVG9FbGVtKGNvbmZpZ3VyYXRpb24ucmVzdGFuZ3VsYXJGaWVsZHMuaWQsIGVsZW0sIGlkKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBjb25maWd1cmF0aW9uLmdldElkRnJvbUVsZW0gPSBmdW5jdGlvbiAoZWxlbSkge1xuICAgIHJldHVybiBjb25maWd1cmF0aW9uLmdldEZpZWxkRnJvbUVsZW0oY29uZmlndXJhdGlvbi5yZXN0YW5ndWxhckZpZWxkcy5pZCwgZWxlbSk7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi5pc1ZhbGlkSWQgPSBmdW5jdGlvbiAoZWxlbUlkKSB7XG4gICAgcmV0dXJuICcnICE9PSBlbGVtSWQgJiYgIWlzVW5kZWZpbmVkKGVsZW1JZCkgJiYgIWlzTnVsbChlbGVtSWQpO1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24uc2V0VXJsVG9FbGVtID0gZnVuY3Rpb24gKGVsZW0sIHVybCAvKiwgcm91dGUgKi8pIHtcbiAgICBjb25maWd1cmF0aW9uLnNldEZpZWxkVG9FbGVtKGNvbmZpZ3VyYXRpb24ucmVzdGFuZ3VsYXJGaWVsZHMuc2VsZkxpbmssIGVsZW0sIHVybCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi5nZXRVcmxGcm9tRWxlbSA9IGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgcmV0dXJuIGNvbmZpZ3VyYXRpb24uZ2V0RmllbGRGcm9tRWxlbShjb25maWd1cmF0aW9uLnJlc3Rhbmd1bGFyRmllbGRzLnNlbGZMaW5rLCBlbGVtKTtcbiAgfTtcblxuICBjb25maWd1cmF0aW9uLnVzZUNhbm5vbmljYWxJZCA9IGlzVW5kZWZpbmVkKGNvbmZpZ3VyYXRpb24udXNlQ2Fubm9uaWNhbElkKSA/IGZhbHNlIDogY29uZmlndXJhdGlvbi51c2VDYW5ub25pY2FsSWQ7XG4gIG9iamVjdC5zZXRVc2VDYW5ub25pY2FsSWQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBjb25maWd1cmF0aW9uLnVzZUNhbm5vbmljYWxJZCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24uZ2V0Q2Fubm9uaWNhbElkRnJvbUVsZW0gPSBmdW5jdGlvbiAoZWxlbSkge1xuICAgIGNvbnN0IGNhbm5vbmljYWxJZCA9IGVsZW1bY29uZmlndXJhdGlvbi5yZXN0YW5ndWxhckZpZWxkcy5jYW5ub25pY2FsSWRdO1xuICAgIGNvbnN0IGFjdHVhbElkID0gY29uZmlndXJhdGlvbi5pc1ZhbGlkSWQoY2Fubm9uaWNhbElkKSA/IGNhbm5vbmljYWxJZCA6IGNvbmZpZ3VyYXRpb24uZ2V0SWRGcm9tRWxlbShlbGVtKTtcbiAgICByZXR1cm4gYWN0dWFsSWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIFJlc3BvbnNlIHBhcnNlci4gVGhpcyBpcyB1c2VkIGluIGNhc2UgeW91ciByZXNwb25zZSBpc24ndCBkaXJlY3RseSB0aGUgZGF0YS5cbiAgICogRm9yIGV4YW1wbGUgaWYgeW91IGhhdmUgYSByZXNwb25zZSBsaWtlIHttZXRhOiB7J21ldGEnfSwgZGF0YToge25hbWU6ICdHb250byd9fVxuICAgKiB5b3UgY2FuIGV4dHJhY3QgdGhpcyBkYXRhIHdoaWNoIGlzIHRoZSBvbmUgdGhhdCBuZWVkcyB3cmFwcGluZ1xuICAgKlxuICAgKiBUaGUgUmVzcG9uc2VFeHRyYWN0b3IgaXMgYSBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIHRoZSByZXNwb25zZSBhbmQgdGhlIG1ldGhvZCBleGVjdXRlZC5cbiAgICovXG5cbiAgY29uZmlndXJhdGlvbi5yZXNwb25zZUludGVyY2VwdG9ycyA9IGNvbmZpZ3VyYXRpb24ucmVzcG9uc2VJbnRlcmNlcHRvcnMgPyBbLi4uY29uZmlndXJhdGlvbi5yZXNwb25zZUludGVyY2VwdG9yc10gOiBbXTtcblxuICBjb25maWd1cmF0aW9uLmRlZmF1bHRSZXNwb25zZUludGVyY2VwdG9yID0gZnVuY3Rpb24gKGRhdGEgLyosIG9wZXJhdGlvbiwgd2hhdCwgdXJsLCByZXNwb25zZSwgc3ViamVjdCAqLykge1xuICAgIHJldHVybiBkYXRhIHx8IHt9O1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24ucmVzcG9uc2VFeHRyYWN0b3IgPSBmdW5jdGlvbiAoZGF0YSwgb3BlcmF0aW9uLCB3aGF0LCB1cmwsIHJlc3BvbnNlLCBzdWJqZWN0KSB7XG4gICAgY29uc3QgaW50ZXJjZXB0b3JzID0gY2xvbmUoY29uZmlndXJhdGlvbi5yZXNwb25zZUludGVyY2VwdG9ycyk7XG4gICAgaW50ZXJjZXB0b3JzLnB1c2goY29uZmlndXJhdGlvbi5kZWZhdWx0UmVzcG9uc2VJbnRlcmNlcHRvcik7XG4gICAgbGV0IHRoZURhdGEgPSBkYXRhO1xuICAgIGVhY2goaW50ZXJjZXB0b3JzLCBmdW5jdGlvbiAoaW50ZXJjZXB0b3I6IGFueSkge1xuICAgICAgdGhlRGF0YSA9IGludGVyY2VwdG9yKHRoZURhdGEsIG9wZXJhdGlvbixcbiAgICAgICAgd2hhdCwgdXJsLCByZXNwb25zZSwgc3ViamVjdCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoZURhdGE7XG4gIH07XG5cbiAgb2JqZWN0LmFkZFJlc3BvbnNlSW50ZXJjZXB0b3IgPSBmdW5jdGlvbiAoZXh0cmFjdG9yKSB7XG4gICAgY29uZmlndXJhdGlvbi5yZXNwb25zZUludGVyY2VwdG9ycy5wdXNoKGV4dHJhY3Rvcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi5lcnJvckludGVyY2VwdG9ycyA9IGNvbmZpZ3VyYXRpb24uZXJyb3JJbnRlcmNlcHRvcnMgPyBbLi4uY29uZmlndXJhdGlvbi5lcnJvckludGVyY2VwdG9yc10gOiBbXTtcbiAgb2JqZWN0LmFkZEVycm9ySW50ZXJjZXB0b3IgPSBmdW5jdGlvbiAoaW50ZXJjZXB0b3IpIHtcbiAgICBjb25maWd1cmF0aW9uLmVycm9ySW50ZXJjZXB0b3JzID0gW2ludGVyY2VwdG9yLCAuLi5jb25maWd1cmF0aW9uLmVycm9ySW50ZXJjZXB0b3JzXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBvYmplY3Quc2V0UmVzcG9uc2VJbnRlcmNlcHRvciA9IG9iamVjdC5hZGRSZXNwb25zZUludGVyY2VwdG9yO1xuICBvYmplY3Quc2V0UmVzcG9uc2VFeHRyYWN0b3IgPSBvYmplY3QuYWRkUmVzcG9uc2VJbnRlcmNlcHRvcjtcbiAgb2JqZWN0LnNldEVycm9ySW50ZXJjZXB0b3IgPSBvYmplY3QuYWRkRXJyb3JJbnRlcmNlcHRvcjtcblxuICAvKipcbiAgICogUmVzcG9uc2UgaW50ZXJjZXB0b3IgaXMgY2FsbGVkIGp1c3QgYmVmb3JlIHJlc29sdmluZyBwcm9taXNlcy5cbiAgICovXG5cblxuICAvKipcbiAgICogUmVxdWVzdCBpbnRlcmNlcHRvciBpcyBjYWxsZWQgYmVmb3JlIHNlbmRpbmcgYW4gb2JqZWN0IHRvIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBjb25maWd1cmF0aW9uLnJlcXVlc3RJbnRlcmNlcHRvcnMgPSBjb25maWd1cmF0aW9uLnJlcXVlc3RJbnRlcmNlcHRvcnMgPyBbLi4uY29uZmlndXJhdGlvbi5yZXF1ZXN0SW50ZXJjZXB0b3JzXSA6IFtdO1xuXG4gIGNvbmZpZ3VyYXRpb24uZGVmYXVsdEludGVyY2VwdG9yID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wZXJhdGlvbiwgcGF0aCwgdXJsLCBoZWFkZXJzLCBwYXJhbXMsIGh0dHBDb25maWcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgIGh0dHBDb25maWc6IGh0dHBDb25maWdcbiAgICB9O1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24uZnVsbFJlcXVlc3RJbnRlcmNlcHRvciA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcGVyYXRpb24sIHBhdGgsIHVybCwgaGVhZGVycywgcGFyYW1zLCBodHRwQ29uZmlnKSB7XG4gICAgY29uc3QgaW50ZXJjZXB0b3JzID0gY2xvbmUoY29uZmlndXJhdGlvbi5yZXF1ZXN0SW50ZXJjZXB0b3JzKTtcbiAgICBjb25zdCBkZWZhdWx0UmVxdWVzdCA9IGNvbmZpZ3VyYXRpb24uZGVmYXVsdEludGVyY2VwdG9yKGVsZW1lbnQsIG9wZXJhdGlvbiwgcGF0aCwgdXJsLCBoZWFkZXJzLCBwYXJhbXMsIGh0dHBDb25maWcpO1xuICAgIHJldHVybiByZWR1Y2UoaW50ZXJjZXB0b3JzLCBmdW5jdGlvbiAocmVxdWVzdDogYW55LCBpbnRlcmNlcHRvcjogYW55KSB7XG5cbiAgICAgIGNvbnN0IHJldHVybkludGVyY2VwdG9yOiBhbnkgPSBpbnRlcmNlcHRvcihcbiAgICAgICAgcmVxdWVzdC5lbGVtZW50LFxuICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgIHBhdGgsXG4gICAgICAgIHVybCxcbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICByZXF1ZXN0LnBhcmFtcyxcbiAgICAgICAgcmVxdWVzdC5odHRwQ29uZmlnXG4gICAgICApO1xuICAgICAgcmV0dXJuIGV4dGVuZChyZXF1ZXN0LCByZXR1cm5JbnRlcmNlcHRvcik7XG4gICAgfSwgZGVmYXVsdFJlcXVlc3QpO1xuICB9O1xuXG4gIG9iamVjdC5hZGRSZXF1ZXN0SW50ZXJjZXB0b3IgPSBmdW5jdGlvbiAoaW50ZXJjZXB0b3IpIHtcbiAgICBjb25maWd1cmF0aW9uLnJlcXVlc3RJbnRlcmNlcHRvcnMucHVzaChmdW5jdGlvbiAoZWxlbSwgb3BlcmF0aW9uLCBwYXRoLCB1cmwsIGhlYWRlcnMsIHBhcmFtcywgaHR0cENvbmZpZykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgIGVsZW1lbnQ6IGludGVyY2VwdG9yKGVsZW0sIG9wZXJhdGlvbiwgcGF0aCwgdXJsKSxcbiAgICAgICAgaHR0cENvbmZpZzogaHR0cENvbmZpZ1xuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBvYmplY3Quc2V0UmVxdWVzdEludGVyY2VwdG9yID0gb2JqZWN0LmFkZFJlcXVlc3RJbnRlcmNlcHRvcjtcblxuICBvYmplY3QuYWRkRnVsbFJlcXVlc3RJbnRlcmNlcHRvciA9IGZ1bmN0aW9uIChpbnRlcmNlcHRvcikge1xuICAgIGNvbmZpZ3VyYXRpb24ucmVxdWVzdEludGVyY2VwdG9ycy5wdXNoKGludGVyY2VwdG9yKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBvYmplY3Quc2V0RnVsbFJlcXVlc3RJbnRlcmNlcHRvciA9IG9iamVjdC5hZGRGdWxsUmVxdWVzdEludGVyY2VwdG9yO1xuXG4gIGNvbmZpZ3VyYXRpb24ub25CZWZvcmVFbGVtUmVzdGFuZ3VsYXJpemVkID0gY29uZmlndXJhdGlvbi5vbkJlZm9yZUVsZW1SZXN0YW5ndWxhcml6ZWQgfHwgZnVuY3Rpb24gKGVsZW0pIHtcbiAgICByZXR1cm4gZWxlbTtcbiAgfTtcbiAgb2JqZWN0LnNldE9uQmVmb3JlRWxlbVJlc3Rhbmd1bGFyaXplZCA9IGZ1bmN0aW9uIChwb3N0KSB7XG4gICAgY29uZmlndXJhdGlvbi5vbkJlZm9yZUVsZW1SZXN0YW5ndWxhcml6ZWQgPSBwb3N0O1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIG9iamVjdC5zZXRSZXN0YW5ndWxhcml6ZVByb21pc2VJbnRlcmNlcHRvciA9IGZ1bmN0aW9uIChpbnRlcmNlcHRvcikge1xuICAgIGNvbmZpZ3VyYXRpb24ucmVzdGFuZ3VsYXJpemVQcm9taXNlSW50ZXJjZXB0b3IgPSBpbnRlcmNlcHRvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGFuIGVsZW1lbnQgaGFzIGJlZW4gXCJSZXN0YW5ndWxhcml6ZWRcIi5cbiAgICpcbiAgICogSXQgcmVjZWl2ZXMgdGhlIGVsZW1lbnQsIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGl0J3MgYW4gZWxlbWVudCBvciBhIGNvbGxlY3Rpb25cbiAgICogYW5kIHRoZSBuYW1lIG9mIHRoZSBtb2RlbFxuICAgKlxuICAgKi9cbiAgY29uZmlndXJhdGlvbi5vbkVsZW1SZXN0YW5ndWxhcml6ZWQgPSBjb25maWd1cmF0aW9uLm9uRWxlbVJlc3Rhbmd1bGFyaXplZCB8fCBmdW5jdGlvbiAoZWxlbSkge1xuICAgIHJldHVybiBlbGVtO1xuICB9O1xuICBvYmplY3Quc2V0T25FbGVtUmVzdGFuZ3VsYXJpemVkID0gZnVuY3Rpb24gKHBvc3QpIHtcbiAgICBjb25maWd1cmF0aW9uLm9uRWxlbVJlc3Rhbmd1bGFyaXplZCA9IHBvc3Q7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi5zaG91bGRTYXZlUGFyZW50ID0gY29uZmlndXJhdGlvbi5zaG91bGRTYXZlUGFyZW50IHx8IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgb2JqZWN0LnNldFBhcmVudGxlc3MgPSBmdW5jdGlvbiAodmFsdWVzKSB7XG4gICAgaWYgKGlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgY29uZmlndXJhdGlvbi5zaG91bGRTYXZlUGFyZW50ID0gZnVuY3Rpb24gKHJvdXRlKSB7XG4gICAgICAgIHJldHVybiAhaW5jbHVkZXModmFsdWVzLCByb3V0ZSk7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoaXNCb29sZWFuKHZhbHVlcykpIHtcbiAgICAgIGNvbmZpZ3VyYXRpb24uc2hvdWxkU2F2ZVBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZXM7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyBsZXRzIHlvdSBzZXQgYSBzdWZmaXggdG8gZXZlcnkgcmVxdWVzdC5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIGlmIHlvdXIgYXBpIHJlcXVpcmVzIHRoYXQgZm9yIEpTb24gcmVxdWVzdHMgeW91IGRvIC91c2Vycy8xMjMuanNvbiwgeW91IGNhbiBzZXQgdGhhdFxuICAgKiBpbiBoZXJlLlxuICAgKlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgc3VmZml4IGlzIG51bGxcbiAgICovXG4gIGNvbmZpZ3VyYXRpb24uc3VmZml4ID0gaXNVbmRlZmluZWQoY29uZmlndXJhdGlvbi5zdWZmaXgpID8gbnVsbCA6IGNvbmZpZ3VyYXRpb24uc3VmZml4O1xuICBvYmplY3Quc2V0UmVxdWVzdFN1ZmZpeCA9IGZ1bmN0aW9uIChuZXdTdWZmaXgpIHtcbiAgICBjb25maWd1cmF0aW9uLnN1ZmZpeCA9IG5ld1N1ZmZpeDtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogQWRkIGVsZW1lbnQgdHJhbnNmb3JtZXJzIGZvciBjZXJ0YWluIHJvdXRlcy5cbiAgICovXG4gIGNvbmZpZ3VyYXRpb24udHJhbnNmb3JtZXJzID0gY29uZmlndXJhdGlvbi50cmFuc2Zvcm1lcnMgfHwge307XG4gIG9iamVjdC5hZGRFbGVtZW50VHJhbnNmb3JtZXIgPSBmdW5jdGlvbiAodHlwZSwgc2Vjb25kQXJnLCB0aGlyZEFyZykge1xuICAgIGxldCBpc0NvbGxlY3Rpb24gPSBudWxsO1xuICAgIGxldCB0cmFuc2Zvcm1lciA9IG51bGw7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHRyYW5zZm9ybWVyID0gc2Vjb25kQXJnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmFuc2Zvcm1lciA9IHRoaXJkQXJnO1xuICAgICAgaXNDb2xsZWN0aW9uID0gc2Vjb25kQXJnO1xuICAgIH1cblxuICAgIGxldCB0eXBlVHJhbnNmb3JtZXJzID0gY29uZmlndXJhdGlvbi50cmFuc2Zvcm1lcnNbdHlwZV07XG4gICAgaWYgKCF0eXBlVHJhbnNmb3JtZXJzKSB7XG4gICAgICB0eXBlVHJhbnNmb3JtZXJzID0gY29uZmlndXJhdGlvbi50cmFuc2Zvcm1lcnNbdHlwZV0gPSBbXTtcbiAgICB9XG5cbiAgICB0eXBlVHJhbnNmb3JtZXJzLnB1c2goZnVuY3Rpb24gKGNvbGwsIGVsZW0pIHtcbiAgICAgIGlmIChpc051bGwoaXNDb2xsZWN0aW9uKSB8fCAoY29sbCA9PT0gaXNDb2xsZWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIoZWxlbSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlbTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvYmplY3Q7XG4gIH07XG5cbiAgb2JqZWN0LmV4dGVuZENvbGxlY3Rpb24gPSBmdW5jdGlvbiAocm91dGUsIGZuKSB7XG4gICAgcmV0dXJuIG9iamVjdC5hZGRFbGVtZW50VHJhbnNmb3JtZXIocm91dGUsIHRydWUsIGZuKTtcbiAgfTtcblxuICBvYmplY3QuZXh0ZW5kTW9kZWwgPSBmdW5jdGlvbiAocm91dGUsIGZuKSB7XG4gICAgcmV0dXJuIG9iamVjdC5hZGRFbGVtZW50VHJhbnNmb3JtZXIocm91dGUsIGZhbHNlLCBmbik7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi50cmFuc2Zvcm1FbGVtID0gZnVuY3Rpb24gKGVsZW0sIGlzQ29sbGVjdGlvbiwgcm91dGUsIFJlc3Rhbmd1bGFyLCBmb3JjZSkge1xuICAgIGlmICghZm9yY2UgJiYgIWNvbmZpZ3VyYXRpb24udHJhbnNmb3JtTG9jYWxFbGVtZW50cyAmJiAhZWxlbVtjb25maWd1cmF0aW9uLnJlc3Rhbmd1bGFyRmllbGRzLmZyb21TZXJ2ZXJdKSB7XG4gICAgICByZXR1cm4gZWxlbTtcbiAgICB9XG4gICAgY29uc3QgdHlwZVRyYW5zZm9ybWVycyA9IGNvbmZpZ3VyYXRpb24udHJhbnNmb3JtZXJzW3JvdXRlXTtcbiAgICBsZXQgY2hhbmdlZEVsZW0gPSBlbGVtO1xuICAgIGlmICh0eXBlVHJhbnNmb3JtZXJzKSB7XG4gICAgICBlYWNoKHR5cGVUcmFuc2Zvcm1lcnMsIGZ1bmN0aW9uICh0cmFuc2Zvcm1lcjogKGlzQ29sbGVjdGlvbjogYm9vbGVhbiwgY2hhbmdlZEVsZW06IGFueSkgPT4gYW55KSB7XG4gICAgICAgIGNoYW5nZWRFbGVtID0gdHJhbnNmb3JtZXIoaXNDb2xsZWN0aW9uLCBjaGFuZ2VkRWxlbSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZ3VyYXRpb24ub25FbGVtUmVzdGFuZ3VsYXJpemVkKGNoYW5nZWRFbGVtLCBpc0NvbGxlY3Rpb24sIHJvdXRlLCBSZXN0YW5ndWxhcik7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi50cmFuc2Zvcm1Mb2NhbEVsZW1lbnRzID0gaXNVbmRlZmluZWQoY29uZmlndXJhdGlvbi50cmFuc2Zvcm1Mb2NhbEVsZW1lbnRzKSA/XG4gICAgZmFsc2UgOlxuICAgIGNvbmZpZ3VyYXRpb24udHJhbnNmb3JtTG9jYWxFbGVtZW50cztcblxuICBvYmplY3Quc2V0VHJhbnNmb3JtT25seVNlcnZlckVsZW1lbnRzID0gZnVuY3Rpb24gKGFjdGl2ZSkge1xuICAgIGNvbmZpZ3VyYXRpb24udHJhbnNmb3JtTG9jYWxFbGVtZW50cyA9ICFhY3RpdmU7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi5mdWxsUmVzcG9uc2UgPSBpc1VuZGVmaW5lZChjb25maWd1cmF0aW9uLmZ1bGxSZXNwb25zZSkgPyBmYWxzZSA6IGNvbmZpZ3VyYXRpb24uZnVsbFJlc3BvbnNlO1xuICBvYmplY3Quc2V0RnVsbFJlc3BvbnNlID0gZnVuY3Rpb24gKGZ1bGwpIHtcbiAgICBjb25maWd1cmF0aW9uLmZ1bGxSZXNwb25zZSA9IGZ1bGw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cblxuICAvLyBJbnRlcm5hbCB2YWx1ZXMgYW5kIGZ1bmN0aW9uc1xuICBjb25maWd1cmF0aW9uLnVybENyZWF0b3JGYWN0b3J5ID0ge307XG5cbiAgLyoqXG4gICAqIEJhc2UgVVJMIENyZWF0b3IuIEJhc2UgcHJvdG90eXBlIGZvciBldmVyeXRoaW5nIHJlbGF0ZWQgdG8gaXRcbiAgICoqL1xuXG4gIGNvbnN0IEJhc2VDcmVhdG9yID0gZnVuY3Rpb24gKCkge1xuICB9O1xuXG4gIEJhc2VDcmVhdG9yLnByb3RvdHlwZS5zZXRDb25maWcgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQmFzZUNyZWF0b3IucHJvdG90eXBlLnBhcmVudHNBcnJheSA9IGZ1bmN0aW9uIChjdXJyZW50KSB7XG4gICAgY29uc3QgcGFyZW50cyA9IFtdO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBwYXJlbnRzLnB1c2goY3VycmVudCk7XG4gICAgICBjdXJyZW50ID0gY3VycmVudFt0aGlzLmNvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5wYXJlbnRSZXNvdXJjZV07XG4gICAgfVxuICAgIHJldHVybiBwYXJlbnRzLnJldmVyc2UoKTtcbiAgfTtcblxuICBmdW5jdGlvbiBSZXN0YW5ndWxhclJlc291cmNlKGNvbmZpZywgJGh0dHAsIHVybCwgY29uZmlndXJlcikge1xuICAgIGNvbnN0IHJlc291cmNlID0ge307XG4gICAgZWFjaChrZXlzKGNvbmZpZ3VyZXIpLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ3VyZXJba2V5XTtcblxuICAgICAgLy8gQWRkIGRlZmF1bHQgcGFyYW1ldGVyc1xuICAgICAgdmFsdWUucGFyYW1zID0gZXh0ZW5kKHt9LCB2YWx1ZS5wYXJhbXMsIGNvbmZpZy5kZWZhdWx0UmVxdWVzdFBhcmFtc1t2YWx1ZS5tZXRob2QudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0aGUgPyBpZiBubyBwYXJhbXMgYXJlIHRoZXJlXG4gICAgICBpZiAoaXNFbXB0eSh2YWx1ZS5wYXJhbXMpKSB7XG4gICAgICAgIGRlbGV0ZSB2YWx1ZS5wYXJhbXM7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcuaXNTYWZlKHZhbHVlLm1ldGhvZCkpIHtcblxuICAgICAgICByZXNvdXJjZVtrZXldID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdENvbmZpZyA9IGV4dGVuZCh2YWx1ZSwge1xuICAgICAgICAgICAgdXJsOiB1cmxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gJGh0dHAuY3JlYXRlUmVxdWVzdChyZXN1bHRDb25maWcpO1xuICAgICAgICB9O1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIHJlc291cmNlW2tleV0gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdENvbmZpZyA9IGV4dGVuZCh2YWx1ZSwge1xuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuICRodHRwLmNyZWF0ZVJlcXVlc3QocmVzdWx0Q29uZmlnKTtcbiAgICAgICAgfTtcblxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc291cmNlO1xuICB9XG5cbiAgQmFzZUNyZWF0b3IucHJvdG90eXBlLnJlc291cmNlID0gZnVuY3Rpb24gKGN1cnJlbnQsICRodHRwLCBsb2NhbEh0dHBDb25maWcsIGNhbGxIZWFkZXJzLCBjYWxsUGFyYW1zLCB3aGF0LCBldGFnLCBvcGVyYXRpb24pIHtcbiAgICBjb25zdCBwYXJhbXMgPSBkZWZhdWx0cyhjYWxsUGFyYW1zIHx8IHt9LCB0aGlzLmNvbmZpZy5kZWZhdWx0UmVxdWVzdFBhcmFtcy5jb21tb24pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBkZWZhdWx0cyhjYWxsSGVhZGVycyB8fCB7fSwgdGhpcy5jb25maWcuZGVmYXVsdEhlYWRlcnMpO1xuXG4gICAgaWYgKGV0YWcpIHtcbiAgICAgIGlmICghY29uZmlndXJhdGlvbi5pc1NhZmUob3BlcmF0aW9uKSkge1xuICAgICAgICBoZWFkZXJzWydJZi1NYXRjaCddID0gZXRhZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhlYWRlcnNbJ0lmLU5vbmUtTWF0Y2gnXSA9IGV0YWc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHVybCA9IHRoaXMuYmFzZShjdXJyZW50KTtcblxuICAgIGlmICh3aGF0KSB7XG4gICAgICBsZXQgYWRkID0gJyc7XG4gICAgICBpZiAoIS9cXC8kLy50ZXN0KHVybCkpIHtcbiAgICAgICAgYWRkICs9ICcvJztcbiAgICAgIH1cbiAgICAgIGFkZCArPSB3aGF0O1xuICAgICAgdXJsICs9IGFkZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcuc3VmZml4ICYmXG4gICAgICB1cmwuaW5kZXhPZih0aGlzLmNvbmZpZy5zdWZmaXgsIHVybC5sZW5ndGggLSB0aGlzLmNvbmZpZy5zdWZmaXgubGVuZ3RoKSA9PT0gLTEgJiYgIXRoaXMuY29uZmlnLmdldFVybEZyb21FbGVtKGN1cnJlbnQpKSB7XG4gICAgICB1cmwgKz0gdGhpcy5jb25maWcuc3VmZml4O1xuICAgIH1cblxuICAgIGN1cnJlbnRbdGhpcy5jb25maWcucmVzdGFuZ3VsYXJGaWVsZHMuaHR0cENvbmZpZ10gPSB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gUmVzdGFuZ3VsYXJSZXNvdXJjZSh0aGlzLmNvbmZpZywgJGh0dHAsIHVybCwge1xuICAgICAgZ2V0TGlzdDogdGhpcy5jb25maWcud2l0aEh0dHBWYWx1ZXMobG9jYWxIdHRwQ29uZmlnLFxuICAgICAgICB7XG4gICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzXG4gICAgICAgIH0pLFxuXG4gICAgICBnZXQ6IHRoaXMuY29uZmlnLndpdGhIdHRwVmFsdWVzKGxvY2FsSHR0cENvbmZpZyxcbiAgICAgICAge1xuICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgaGVhZGVyczogaGVhZGVyc1xuICAgICAgICB9KSxcblxuICAgICAganNvbnA6IHRoaXMuY29uZmlnLndpdGhIdHRwVmFsdWVzKGxvY2FsSHR0cENvbmZpZyxcbiAgICAgICAge1xuICAgICAgICAgIG1ldGhvZDogJ2pzb25wJyxcbiAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzXG4gICAgICAgIH0pLFxuXG4gICAgICBwdXQ6IHRoaXMuY29uZmlnLndpdGhIdHRwVmFsdWVzKGxvY2FsSHR0cENvbmZpZyxcbiAgICAgICAge1xuICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgaGVhZGVyczogaGVhZGVyc1xuICAgICAgICB9KSxcblxuICAgICAgcG9zdDogdGhpcy5jb25maWcud2l0aEh0dHBWYWx1ZXMobG9jYWxIdHRwQ29uZmlnLFxuICAgICAgICB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgaGVhZGVyczogaGVhZGVyc1xuICAgICAgICB9KSxcblxuICAgICAgcmVtb3ZlOiB0aGlzLmNvbmZpZy53aXRoSHR0cFZhbHVlcyhsb2NhbEh0dHBDb25maWcsXG4gICAgICAgIHtcbiAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnNcbiAgICAgICAgfSksXG5cbiAgICAgIGhlYWQ6IHRoaXMuY29uZmlnLndpdGhIdHRwVmFsdWVzKGxvY2FsSHR0cENvbmZpZyxcbiAgICAgICAge1xuICAgICAgICAgIG1ldGhvZDogJ0hFQUQnLFxuICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnNcbiAgICAgICAgfSksXG5cbiAgICAgIHRyYWNlOiB0aGlzLmNvbmZpZy53aXRoSHR0cFZhbHVlcyhsb2NhbEh0dHBDb25maWcsXG4gICAgICAgIHtcbiAgICAgICAgICBtZXRob2Q6ICdUUkFDRScsXG4gICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgaGVhZGVyczogaGVhZGVyc1xuICAgICAgICB9KSxcblxuICAgICAgb3B0aW9uczogdGhpcy5jb25maWcud2l0aEh0dHBWYWx1ZXMobG9jYWxIdHRwQ29uZmlnLFxuICAgICAgICB7XG4gICAgICAgICAgbWV0aG9kOiAnT1BUSU9OUycsXG4gICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgaGVhZGVyczogaGVhZGVyc1xuICAgICAgICB9KSxcblxuICAgICAgcGF0Y2g6IHRoaXMuY29uZmlnLndpdGhIdHRwVmFsdWVzKGxvY2FsSHR0cENvbmZpZyxcbiAgICAgICAge1xuICAgICAgICAgIG1ldGhvZDogJ1BBVENIJyxcbiAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzXG4gICAgICAgIH0pXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgdGhlIFBhdGggVVJMIGNyZWF0b3IuIEl0IHVzZXMgUGF0aCB0byBzaG93IEhpZXJhcmNoeSBpbiB0aGUgUmVzdCBBUEkuXG4gICAqIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgaGF2ZSBhbiBBY2NvdW50IHRoYXQgdGhlbiBoYXMgYSBzZXQgb2YgQnVpbGRpbmdzLCBhIFVSTCB0byBhIGJ1aWxkaW5nXG4gICAqIHdvdWxkIGJlIC9hY2NvdW50cy8xMjMvYnVpbGRpbmdzLzQ1NlxuICAgKiovXG4gIGNvbnN0IFBhdGggPSBmdW5jdGlvbiAoKSB7XG4gIH07XG5cbiAgUGF0aC5wcm90b3R5cGUgPSBuZXcgQmFzZUNyZWF0b3IoKTtcblxuICBQYXRoLnByb3RvdHlwZS5ub3JtYWxpemVVcmwgPSBmdW5jdGlvbiAodXJsKSB7XG4gICAgY29uc3QgcGFydHMgPSAvKCg/Omh0dHBbc10/Oik/XFwvXFwvKT8oLiopPy8uZXhlYyh1cmwpO1xuICAgIHBhcnRzWzJdID0gcGFydHNbMl0ucmVwbGFjZSgvW1xcXFxcXC9dKy9nLCAnLycpO1xuICAgIHJldHVybiAodHlwZW9mIHBhcnRzWzFdICE9PSAndW5kZWZpbmVkJykgPyBwYXJ0c1sxXSArIHBhcnRzWzJdIDogcGFydHNbMl07XG4gIH07XG5cbiAgUGF0aC5wcm90b3R5cGUuYmFzZSA9IGZ1bmN0aW9uIChjdXJyZW50KSB7XG4gICAgY29uc3QgX190aGlzID0gdGhpcztcbiAgICByZXR1cm4gcmVkdWNlKHRoaXMucGFyZW50c0FycmF5KGN1cnJlbnQpLCBmdW5jdGlvbiAoYWN1bTogYW55LCBlbGVtOiBhbnkpIHtcbiAgICAgIGxldCBlbGVtVXJsO1xuICAgICAgY29uc3QgZWxlbVNlbGZMaW5rID0gX190aGlzLmNvbmZpZy5nZXRVcmxGcm9tRWxlbShlbGVtKTtcbiAgICAgIGlmIChlbGVtU2VsZkxpbmspIHtcbiAgICAgICAgaWYgKF9fdGhpcy5jb25maWcuaXNBYnNvbHV0ZVVybChlbGVtU2VsZkxpbmspKSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1TZWxmTGluaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtVXJsID0gZWxlbVNlbGZMaW5rO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtVXJsID0gZWxlbVtfX3RoaXMuY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnJvdXRlXTtcblxuICAgICAgICBpZiAoZWxlbVtfX3RoaXMuY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnJlc3Rhbmd1bGFyQ29sbGVjdGlvbl0pIHtcbiAgICAgICAgICBjb25zdCBpZHMgPSBlbGVtW19fdGhpcy5jb25maWcucmVzdGFuZ3VsYXJGaWVsZHMuaWRzXTtcbiAgICAgICAgICBpZiAoaWRzKSB7XG4gICAgICAgICAgICBlbGVtVXJsICs9ICcvJyArIGlkcy5qb2luKCcsJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBlbGVtSWQ6IGFueTtcbiAgICAgICAgICBpZiAoX190aGlzLmNvbmZpZy51c2VDYW5ub25pY2FsSWQpIHtcbiAgICAgICAgICAgIGVsZW1JZCA9IF9fdGhpcy5jb25maWcuZ2V0Q2Fubm9uaWNhbElkRnJvbUVsZW0oZWxlbSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZW1JZCA9IF9fdGhpcy5jb25maWcuZ2V0SWRGcm9tRWxlbShlbGVtKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5pc1ZhbGlkSWQoZWxlbUlkKSAmJiAhZWxlbS5zaW5nbGVPbmUpIHtcbiAgICAgICAgICAgIGVsZW1VcmwgKz0gJy8nICsgKF9fdGhpcy5jb25maWcuZW5jb2RlSWRzID8gZW5jb2RlVVJJQ29tcG9uZW50KGVsZW1JZCkgOiBlbGVtSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYWN1bSA9IGFjdW0ucmVwbGFjZSgvXFwvJC8sICcnKSArICcvJyArIGVsZW1Vcmw7XG4gICAgICByZXR1cm4gX190aGlzLm5vcm1hbGl6ZVVybChhY3VtKTtcblxuICAgIH0sIHRoaXMuY29uZmlnLmJhc2VVcmwpO1xuICB9O1xuXG5cbiAgUGF0aC5wcm90b3R5cGUuZmV0Y2hVcmwgPSBmdW5jdGlvbiAoY3VycmVudCwgd2hhdCkge1xuICAgIGxldCBiYXNlVXJsID0gdGhpcy5iYXNlKGN1cnJlbnQpO1xuICAgIGlmICh3aGF0KSB7XG4gICAgICBiYXNlVXJsICs9ICcvJyArIHdoYXQ7XG4gICAgfVxuICAgIHJldHVybiBiYXNlVXJsO1xuICB9O1xuXG4gIFBhdGgucHJvdG90eXBlLmZldGNoUmVxdWVzdGVkVXJsID0gZnVuY3Rpb24gKGN1cnJlbnQsIHdoYXQpIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmZldGNoVXJsKGN1cnJlbnQsIHdoYXQpO1xuICAgIGNvbnN0IHBhcmFtcyA9IGN1cnJlbnRbY29uZmlndXJhdGlvbi5yZXN0YW5ndWxhckZpZWxkcy5yZXFQYXJhbXNdO1xuXG4gICAgLy8gRnJvbSBoZXJlIG9uIGFuZCB1bnRpbCB0aGUgZW5kIG9mIGZldGNoUmVxdWVzdGVkVXJsLFxuICAgIC8vIHRoZSBjb2RlIGhhcyBiZWVuIGtpbmRseSBib3Jyb3dlZCBmcm9tIGFuZ3VsYXIuanNcbiAgICAvLyBUaGUgcmVhc29uIGZvciBzdWNoIGNvZGUgYmxvYXRpbmcgaXMgY29oZXJlbmNlOlxuICAgIC8vICAgSWYgdGhlIHVzZXIgd2VyZSB0byB1c2UgdGhpcyBmb3IgY2FjaGUgbWFuYWdlbWVudCwgdGhlXG4gICAgLy8gICBzZXJpYWxpemF0aW9uIG9mIHBhcmFtZXRlcnMgd291bGQgbmVlZCB0byBiZSBpZGVudGljYWxcbiAgICAvLyAgIHRvIHRoZSBvbmUgZG9uZSBieSBhbmd1bGFyIGZvciBjYWNoZSBrZXlzIHRvIG1hdGNoLlxuICAgIGZ1bmN0aW9uIHNvcnRlZEtleXMob2JqKSB7XG4gICAgICBjb25zdCByZXN1bHRLZXlzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgcmVzdWx0S2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHRLZXlzLnNvcnQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmb3JFYWNoU29ydGVkKG9iaiwgaXRlcmF0b3I/LCBjb250ZXh0Pykge1xuICAgICAgY29uc3Qgc29ydGVkS2V5c0FycmF5ID0gc29ydGVkS2V5cyhvYmopO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWRLZXlzQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpbc29ydGVkS2V5c0FycmF5W2ldXSwgc29ydGVkS2V5c0FycmF5W2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzb3J0ZWRLZXlzQXJyYXk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW5jb2RlVXJpUXVlcnkodmFsLCBwY3RFbmNvZGVTcGFjZXM/KSB7XG4gICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbClcbiAgICAgIC5yZXBsYWNlKC8lNDAvZ2ksICdAJylcbiAgICAgIC5yZXBsYWNlKC8lM0EvZ2ksICc6JylcbiAgICAgIC5yZXBsYWNlKC8lMjQvZywgJyQnKVxuICAgICAgLnJlcGxhY2UoLyUyQy9naSwgJywnKVxuICAgICAgLnJlcGxhY2UoLyUyMC9nLCAocGN0RW5jb2RlU3BhY2VzID8gJyUyMCcgOiAnKycpKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcykge1xuICAgICAgcmV0dXJuIHVybCArICh0aGlzLmNvbmZpZy5zdWZmaXggfHwgJycpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgZm9yRWFjaFNvcnRlZChwYXJhbXMsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gW3ZhbHVlXTtcbiAgICAgIH1cblxuICAgICAgZm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHYpKSB7XG4gICAgICAgICAgdiA9IEpTT04uc3RyaW5naWZ5KHYpO1xuICAgICAgICB9XG4gICAgICAgIHBhcnRzLnB1c2goZW5jb2RlVXJpUXVlcnkoa2V5KSArICc9JyArIGVuY29kZVVyaVF1ZXJ5KHYpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHVybCArICh0aGlzLmNvbmZpZy5zdWZmaXggfHwgJycpICsgKCh1cmwuaW5kZXhPZignPycpID09PSAtMSkgPyAnPycgOiAnJicpICsgcGFydHMuam9pbignJicpO1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24udXJsQ3JlYXRvckZhY3RvcnkucGF0aCA9IFBhdGg7XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIEluamVjdG9yLCBPcHRpb25hbCwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgYXNzaWduIH0gZnJvbSAnY29yZS1qcy9mbi9vYmplY3QnO1xuaW1wb3J0IHtcbiAgbWFwLFxuICBiaW5kLFxuICB1bmlvbixcbiAgdmFsdWVzLFxuICBwaWNrLFxuICBpc0VtcHR5LFxuICBpc0Z1bmN0aW9uLFxuICBpc051bWJlcixcbiAgaXNVbmRlZmluZWQsXG4gIGlzQXJyYXksXG4gIGlzT2JqZWN0LFxuICBleHRlbmQsXG4gIGVhY2gsXG4gIGV2ZXJ5LFxuICBvbWl0LFxuICBnZXQsXG4gIGRlZmF1bHRzLFxuICBjbG9uZSxcbiAgaW5jbHVkZXNcbn0gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJFU1RBTkdVTEFSIH0gZnJvbSAnLi9uZ3gtcmVzdGFuZ3VsYXIuY29uZmlnJztcbmltcG9ydCB7IFJlc3Rhbmd1bGFySHR0cCB9IGZyb20gJy4vbmd4LXJlc3Rhbmd1bGFyLWh0dHAnO1xuaW1wb3J0IHsgUmVzdGFuZ3VsYXJDb25maWd1cmVyIH0gZnJvbSAnLi9uZ3gtcmVzdGFuZ3VsYXItY29uZmlnLmZhY3RvcnknO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVzdGFuZ3VsYXIge1xuICBwcm92aWRlcjoge1xuICAgIHNldEJhc2VVcmw6IGFueSxcbiAgICBzZXREZWZhdWx0SGVhZGVyczogYW55LFxuICAgIGNvbmZpZ3VyYXRpb246IGFueSxcbiAgICBzZXRTZWxmTGlua0Fic29sdXRlVXJsOiBhbnksXG4gICAgc2V0RXh0cmFGaWVsZHM6IGFueSxcbiAgICBzZXREZWZhdWx0SHR0cEZpZWxkczogYW55LFxuICAgIHNldFBsYWluQnlEZWZhdWx0OiBhbnksXG4gICAgc2V0RW5jb2RlSWRzOiBhbnksXG4gICAgc2V0RGVmYXVsdFJlcXVlc3RQYXJhbXM6IGFueSxcbiAgICByZXF1ZXN0UGFyYW1zOiBhbnksXG4gICAgZGVmYXVsdEhlYWRlcnM6IGFueSxcbiAgICBzZXREZWZhdWx0UmVzcG9uc2VNZXRob2Q6IGFueSxcbiAgICBkZWZhdWx0UmVzcG9uc2VNZXRob2Q6IGFueSxcbiAgICBzZXRNZXRob2RPdmVycmlkZXJzOiBhbnksXG4gICAgc2V0SnNvbnA6IGFueSxcbiAgICBzZXRVcmxDcmVhdG9yOiBhbnksXG4gICAgc2V0UmVzdGFuZ3VsYXJGaWVsZHM6IGFueSxcbiAgICBzZXRVc2VDYW5ub25pY2FsSWQ6IGFueSxcbiAgICBhZGRSZXNwb25zZUludGVyY2VwdG9yOiBhbnksXG4gICAgYWRkRXJyb3JJbnRlcmNlcHRvcjogYW55LFxuICAgIHNldFJlc3BvbnNlSW50ZXJjZXB0b3I6IGFueSxcbiAgICBzZXRSZXNwb25zZUV4dHJhY3RvcjogYW55LFxuICAgIHNldEVycm9ySW50ZXJjZXB0b3I6IGFueSxcbiAgICBhZGRSZXF1ZXN0SW50ZXJjZXB0b3I6IGFueSxcbiAgICBzZXRSZXF1ZXN0SW50ZXJjZXB0b3I6IGFueSxcbiAgICBzZXRGdWxsUmVxdWVzdEludGVyY2VwdG9yOiBhbnksXG4gICAgYWRkRnVsbFJlcXVlc3RJbnRlcmNlcHRvcjogYW55LFxuICAgIHNldE9uQmVmb3JlRWxlbVJlc3Rhbmd1bGFyaXplZDogYW55LFxuICAgIHNldFJlc3Rhbmd1bGFyaXplUHJvbWlzZUludGVyY2VwdG9yOiBhbnksXG4gICAgc2V0T25FbGVtUmVzdGFuZ3VsYXJpemVkOiBhbnksXG4gICAgc2V0UGFyZW50bGVzczogYW55LFxuICAgIHNldFJlcXVlc3RTdWZmaXg6IGFueSxcbiAgICBhZGRFbGVtZW50VHJhbnNmb3JtZXI6IGFueSxcbiAgICBleHRlbmRDb2xsZWN0aW9uOiBhbnksXG4gICAgZXh0ZW5kTW9kZWw6IGFueSxcbiAgICBzZXRUcmFuc2Zvcm1Pbmx5U2VydmVyRWxlbWVudHM6IGFueSxcbiAgICBzZXRGdWxsUmVzcG9uc2U6IGFueSxcbiAgICAkZ2V0OiBhbnlcbiAgfTtcbiAgYWRkRWxlbWVudFRyYW5zZm9ybWVyOiBhbnk7XG4gIGV4dGVuZENvbGxlY3Rpb246IGFueTtcbiAgZXh0ZW5kTW9kZWw6IGFueTtcbiAgY29weTtcbiAgY29uZmlndXJhdGlvbjtcbiAgc2VydmljZTtcbiAgaWQ7XG4gIHJvdXRlO1xuICBwYXJlbnRSZXNvdXJjZTtcbiAgcmVzdGFuZ3VsYXJDb2xsZWN0aW9uO1xuICBjYW5ub25pY2FsSWQ7XG4gIGV0YWc7XG4gIHNlbGZMaW5rO1xuICBnZXQ7XG4gIGdldExpc3Q7XG4gIHB1dDtcbiAgcG9zdDtcbiAgcmVtb3ZlO1xuICBoZWFkO1xuICB0cmFjZTtcbiAgb3B0aW9ucztcbiAgcGF0Y2g7XG4gIGdldFJlc3Rhbmd1bGFyVXJsO1xuICBnZXRSZXF1ZXN0ZWRVcmw7XG4gIHB1dEVsZW1lbnQ7XG4gIGFkZFJlc3Rhbmd1bGFyTWV0aG9kO1xuICBnZXRQYXJlbnRMaXN0O1xuICBjbG9uZTtcbiAgaWRzO1xuICBodHRwQ29uZmlnO1xuICByZXFQYXJhbXM7XG4gIG9uZTtcbiAgYWxsO1xuICBzZXZlcmFsO1xuICBvbmVVcmw7XG4gIGFsbFVybDtcbiAgY3VzdG9tUFVUO1xuICBjdXN0b21QQVRDSDtcbiAgY3VzdG9tUE9TVDtcbiAgY3VzdG9tREVMRVRFO1xuICBjdXN0b21HRVQ7XG4gIGN1c3RvbUdFVExJU1Q7XG4gIGN1c3RvbU9wZXJhdGlvbjtcbiAgZG9QVVQ7XG4gIGRvUEFUQ0g7XG4gIGRvUE9TVDtcbiAgZG9ERUxFVEU7XG4gIGRvR0VUO1xuICBkb0dFVExJU1Q7XG4gIGZyb21TZXJ2ZXI7XG4gIHdpdGhDb25maWc7XG4gIHdpdGhIdHRwQ29uZmlnO1xuICBzaW5nbGVPbmU7XG4gIHBsYWluO1xuICBzYXZlO1xuICByZXN0YW5ndWxhcml6ZWQ7XG4gIHJlc3Rhbmd1bGFyaXplRWxlbWVudDtcbiAgcmVzdGFuZ3VsYXJpemVDb2xsZWN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoUkVTVEFOR1VMQVIpIHB1YmxpYyBjb25maWdPYmosXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBodHRwOiBSZXN0YW5ndWxhckh0dHBcbiAgKSB7XG4gICAgdGhpcy5wcm92aWRlciA9IG5ldyBwcm92aWRlckNvbmZpZyhodHRwKTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5wcm92aWRlci4kZ2V0KCk7XG4gICAgYXNzaWduKHRoaXMsIGVsZW1lbnQpO1xuXG4gICAgdGhpcy5zZXREZWZhdWx0Q29uZmlnKCk7XG4gIH1cblxuICBzZXREZWZhdWx0Q29uZmlnKCkge1xuICAgIGlmICghdGhpcy5jb25maWdPYmogfHwgIWlzRnVuY3Rpb24odGhpcy5jb25maWdPYmouZm4pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXJyREkgPSBtYXAodGhpcy5jb25maWdPYmouYXJyU2VydmljZXMsIChzZXJ2aWNlczogVHlwZTxhbnk+KSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5nZXQoc2VydmljZXMpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jb25maWdPYmouZm4oLi4uW3RoaXMucHJvdmlkZXIsIC4uLmFyckRJXSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvdmlkZXJDb25maWcoJGh0dHApIHtcbiAgY29uc3QgZ2xvYmFsQ29uZmlndXJhdGlvbiA9IHt9O1xuXG4gIFJlc3Rhbmd1bGFyQ29uZmlndXJlcih0aGlzLCBnbG9iYWxDb25maWd1cmF0aW9uKTtcblxuICB0aGlzLiRnZXQgPSAkZ2V0O1xuXG4gIGZ1bmN0aW9uICRnZXQoKSB7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVTZXJ2aWNlRm9yQ29uZmlndXJhdGlvbihjb25maWcpIHtcbiAgICAgIGNvbnN0IHNlcnZpY2U6IGFueSA9IHt9O1xuXG4gICAgICBjb25zdCB1cmxIYW5kbGVyID0gbmV3IGNvbmZpZy51cmxDcmVhdG9yRmFjdG9yeVtjb25maWcudXJsQ3JlYXRvcl0oKTtcbiAgICAgIHVybEhhbmRsZXIuc2V0Q29uZmlnKGNvbmZpZyk7XG5cbiAgICAgIGZ1bmN0aW9uIHJlc3Rhbmd1bGFyaXplQmFzZShwYXJlbnQsIGVsZW0sIHJvdXRlLCByZXFQYXJhbXMsIGZyb21TZXJ2ZXIpIHtcbiAgICAgICAgZWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucm91dGVdID0gcm91dGU7XG4gICAgICAgIGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLmdldFJlc3Rhbmd1bGFyVXJsXSA9IGJpbmQodXJsSGFuZGxlci5mZXRjaFVybCwgdXJsSGFuZGxlciwgZWxlbSk7XG4gICAgICAgIGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLmdldFJlcXVlc3RlZFVybF0gPSBiaW5kKHVybEhhbmRsZXIuZmV0Y2hSZXF1ZXN0ZWRVcmwsIHVybEhhbmRsZXIsIGVsZW0pO1xuICAgICAgICBlbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5hZGRSZXN0YW5ndWxhck1ldGhvZF0gPSBiaW5kKGFkZFJlc3Rhbmd1bGFyTWV0aG9kRnVuY3Rpb24sIGVsZW0pO1xuICAgICAgICBlbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5jbG9uZV0gPSBiaW5kKGNvcHlSZXN0YW5ndWxhcml6ZWRFbGVtZW50LCBlbGVtKTtcbiAgICAgICAgZWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucmVxUGFyYW1zXSA9IGlzRW1wdHkocmVxUGFyYW1zKSA/IG51bGwgOiByZXFQYXJhbXM7XG4gICAgICAgIGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLndpdGhIdHRwQ29uZmlnXSA9IGJpbmQod2l0aEh0dHBDb25maWcsIGVsZW0pO1xuICAgICAgICBlbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5wbGFpbl0gPSBiaW5kKHN0cmlwUmVzdGFuZ3VsYXIsIGVsZW0sIGVsZW0pO1xuXG4gICAgICAgIC8vIFRhZyBlbGVtZW50IGFzIHJlc3Rhbmd1bGFyaXplZFxuICAgICAgICBlbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5yZXN0YW5ndWxhcml6ZWRdID0gdHJ1ZTtcblxuICAgICAgICAvLyBSZXF1ZXN0TGVzcyBjb25uZWN0aW9uXG4gICAgICAgIGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLm9uZV0gPSBiaW5kKG9uZSwgZWxlbSwgZWxlbSk7XG4gICAgICAgIGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLmFsbF0gPSBiaW5kKGFsbCwgZWxlbSwgZWxlbSk7XG4gICAgICAgIGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnNldmVyYWxdID0gYmluZChzZXZlcmFsLCBlbGVtLCBlbGVtKTtcbiAgICAgICAgZWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMub25lVXJsXSA9IGJpbmQob25lVXJsLCBlbGVtLCBlbGVtKTtcbiAgICAgICAgZWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMuYWxsVXJsXSA9IGJpbmQoYWxsVXJsLCBlbGVtLCBlbGVtKTtcblxuICAgICAgICBlbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5mcm9tU2VydmVyXSA9ICEhZnJvbVNlcnZlcjtcblxuICAgICAgICBpZiAocGFyZW50ICYmIGNvbmZpZy5zaG91bGRTYXZlUGFyZW50KHJvdXRlKSkge1xuICAgICAgICAgIGNvbnN0IHBhcmVudElkID0gY29uZmlnLmdldElkRnJvbUVsZW0ocGFyZW50KTtcbiAgICAgICAgICBjb25zdCBwYXJlbnRVcmwgPSBjb25maWcuZ2V0VXJsRnJvbUVsZW0ocGFyZW50KTtcblxuICAgICAgICAgIGNvbnN0IHJlc3Rhbmd1bGFyRmllbGRzRm9yUGFyZW50ID0gdW5pb24oXG4gICAgICAgICAgICB2YWx1ZXMocGljayhjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMsIFsncm91dGUnLCAnc2luZ2xlT25lJywgJ3BhcmVudFJlc291cmNlJ10pKSxcbiAgICAgICAgICAgIGNvbmZpZy5leHRyYUZpZWxkc1xuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgcGFyZW50UmVzb3VyY2UgPSBwaWNrKHBhcmVudCwgcmVzdGFuZ3VsYXJGaWVsZHNGb3JQYXJlbnQpO1xuXG4gICAgICAgICAgaWYgKGNvbmZpZy5pc1ZhbGlkSWQocGFyZW50SWQpKSB7XG4gICAgICAgICAgICBjb25maWcuc2V0SWRUb0VsZW0ocGFyZW50UmVzb3VyY2UsIHBhcmVudElkLCByb3V0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb25maWcuaXNWYWxpZElkKHBhcmVudFVybCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5zZXRVcmxUb0VsZW0ocGFyZW50UmVzb3VyY2UsIHBhcmVudFVybCwgcm91dGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnBhcmVudFJlc291cmNlXSA9IHBhcmVudFJlc291cmNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnBhcmVudFJlc291cmNlXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG9uZShwYXJlbnQsIHJvdXRlLCBpZCwgc2luZ2xlT25lKSB7XG4gICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgaWYgKGlzTnVtYmVyKHJvdXRlKSB8fCBpc051bWJlcihwYXJlbnQpKSB7XG4gICAgICAgICAgZXJyb3IgPSAnWW91XFwncmUgY3JlYXRpbmcgYSBSZXN0YW5ndWxhciBlbnRpdHkgd2l0aCB0aGUgbnVtYmVyICc7XG4gICAgICAgICAgZXJyb3IgKz0gJ2luc3RlYWQgb2YgdGhlIHJvdXRlIG9yIHRoZSBwYXJlbnQuIEZvciBleGFtcGxlLCB5b3UgY2FuXFwndCBjYWxsIC5vbmUoMTIpLic7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNVbmRlZmluZWQocm91dGUpKSB7XG4gICAgICAgICAgZXJyb3IgPSAnWW91XFwncmUgY3JlYXRpbmcgYSBSZXN0YW5ndWxhciBlbnRpdHkgZWl0aGVyIHdpdGhvdXQgdGhlIHBhdGguICc7XG4gICAgICAgICAgZXJyb3IgKz0gJ0ZvciBleGFtcGxlIHlvdSBjYW5cXCd0IGNhbGwgLm9uZSgpLiBQbGVhc2UgY2hlY2sgaWYgeW91ciBhcmd1bWVudHMgYXJlIHZhbGlkLic7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtID0ge307XG4gICAgICAgIGNvbmZpZy5zZXRJZFRvRWxlbShlbGVtLCBpZCwgcm91dGUpO1xuICAgICAgICBjb25maWcuc2V0RmllbGRUb0VsZW0oY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnNpbmdsZU9uZSwgZWxlbSwgc2luZ2xlT25lKTtcbiAgICAgICAgcmV0dXJuIHJlc3Rhbmd1bGFyaXplRWxlbShwYXJlbnQsIGVsZW0sIHJvdXRlLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGFsbChwYXJlbnQsIHJvdXRlKSB7XG4gICAgICAgIHJldHVybiByZXN0YW5ndWxhcml6ZUNvbGxlY3Rpb24ocGFyZW50LCBbXSwgcm91dGUsIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gc2V2ZXJhbChwYXJlbnQsIHJvdXRlIC8qLCBpZHMgKi8pIHtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IFtdO1xuICAgICAgICBjb2xsZWN0aW9uW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5pZHNdID0gQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgICAgIHJldHVybiByZXN0YW5ndWxhcml6ZUNvbGxlY3Rpb24ocGFyZW50LCBjb2xsZWN0aW9uLCByb3V0ZSwgZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBvbmVVcmwocGFyZW50LCByb3V0ZSwgdXJsKSB7XG4gICAgICAgIGlmICghcm91dGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JvdXRlIGlzIG1hbmRhdG9yeSB3aGVuIGNyZWF0aW5nIG5ldyBSZXN0YW5ndWxhciBvYmplY3RzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW0gPSB7fTtcbiAgICAgICAgY29uZmlnLnNldFVybFRvRWxlbShlbGVtLCB1cmwsIHJvdXRlKTtcbiAgICAgICAgcmV0dXJuIHJlc3Rhbmd1bGFyaXplRWxlbShwYXJlbnQsIGVsZW0sIHJvdXRlLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGFsbFVybChwYXJlbnQsIHJvdXRlLCB1cmwpIHtcbiAgICAgICAgaWYgKCFyb3V0ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUm91dGUgaXMgbWFuZGF0b3J5IHdoZW4gY3JlYXRpbmcgbmV3IFJlc3Rhbmd1bGFyIG9iamVjdHMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbSA9IHt9O1xuICAgICAgICBjb25maWcuc2V0VXJsVG9FbGVtKGVsZW0sIHVybCwgcm91dGUpO1xuICAgICAgICByZXR1cm4gcmVzdGFuZ3VsYXJpemVDb2xsZWN0aW9uKHBhcmVudCwgZWxlbSwgcm91dGUsIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJvbWlzZXNcbiAgICAgIGZ1bmN0aW9uIHJlc3Rhbmd1bGFyaXplUmVzcG9uc2Uoc3ViamVjdCwgaXNDb2xsZWN0aW9uLCB2YWx1ZVRvRmlsbCkge1xuICAgICAgICByZXR1cm4gc3ViamVjdC5waXBlKGZpbHRlcihyZXMgPT4gISFyZXMpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcmVzb2x2ZVByb21pc2Uoc3ViamVjdCwgcmVzcG9uc2UsIGRhdGEsIGZpbGxlZFZhbHVlKSB7XG4gICAgICAgIGV4dGVuZChmaWxsZWRWYWx1ZSwgZGF0YSk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciB0aGUgZnVsbCByZXNwb25zZSBpbnRlcmNlcHRvci5cbiAgICAgICAgaWYgKGNvbmZpZy5mdWxsUmVzcG9uc2UpIHtcbiAgICAgICAgICBzdWJqZWN0Lm5leHQoZXh0ZW5kKHJlc3BvbnNlLCB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1YmplY3QubmV4dChkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1YmplY3QuY29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gRWxlbWVudHNcbiAgICAgIGZ1bmN0aW9uIHN0cmlwUmVzdGFuZ3VsYXIoZWxlbSkge1xuICAgICAgICBpZiAoaXNBcnJheShlbGVtKSkge1xuICAgICAgICAgIGNvbnN0IGFycmF5ID0gW107XG4gICAgICAgICAgZWFjaChlbGVtLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGFycmF5LnB1c2goY29uZmlnLmlzUmVzdGFuZ3VsYXJpemVkKHZhbHVlKSA/IHN0cmlwUmVzdGFuZ3VsYXIodmFsdWUpIDogdmFsdWUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gb21pdChlbGVtLCB2YWx1ZXMob21pdChjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMsICdpZCcpKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gYWRkQ3VzdG9tT3BlcmF0aW9uKGVsZW0pIHtcbiAgICAgICAgZWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMuY3VzdG9tT3BlcmF0aW9uXSA9IGJpbmQoY3VzdG9tRnVuY3Rpb24sIGVsZW0pO1xuICAgICAgICBjb25zdCByZXF1ZXN0TWV0aG9kcyA9IHtnZXQ6IGN1c3RvbUZ1bmN0aW9uLCBkZWxldGU6IGN1c3RvbUZ1bmN0aW9ufTtcbiAgICAgICAgZWFjaChbJ3B1dCcsICdwYXRjaCcsICdwb3N0J10sIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgcmVxdWVzdE1ldGhvZHNbbmFtZV0gPSBmdW5jdGlvbiAob3BlcmF0aW9uLCBlbGVtZW50LCBwYXRoLCBwYXJhbXMsIGhlYWRlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBiaW5kKGN1c3RvbUZ1bmN0aW9uLCB0aGlzKShvcGVyYXRpb24sIHBhdGgsIHBhcmFtcywgaGVhZGVycywgZWxlbWVudCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVhY2gocmVxdWVzdE1ldGhvZHMsIGZ1bmN0aW9uIChyZXF1ZXN0RnVuYywgbmFtZSkge1xuICAgICAgICAgIGNvbnN0IGNhbGxPcGVyYXRpb24gPSBuYW1lID09PSAnZGVsZXRlJyA/ICdyZW1vdmUnIDogbmFtZTtcbiAgICAgICAgICBlYWNoKFsnZG8nLCAnY3VzdG9tJ10sIGZ1bmN0aW9uIChhbGlhcykge1xuICAgICAgICAgICAgZWxlbVthbGlhcyArIG5hbWUudG9VcHBlckNhc2UoKV0gPSBiaW5kKHJlcXVlc3RGdW5jLCBlbGVtLCBjYWxsT3BlcmF0aW9uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLmN1c3RvbUdFVExJU1RdID0gYmluZChmZXRjaEZ1bmN0aW9uLCBlbGVtKTtcbiAgICAgICAgZWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMuZG9HRVRMSVNUXSA9IGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLmN1c3RvbUdFVExJU1RdO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjb3B5UmVzdGFuZ3VsYXJpemVkRWxlbWVudChmcm9tRWxlbWVudCwgdG9FbGVtZW50ID0ge30pIHtcbiAgICAgICAgY29uc3QgY29waWVkRWxlbWVudCA9IGFzc2lnbih0b0VsZW1lbnQsIGZyb21FbGVtZW50KTtcbiAgICAgICAgcmV0dXJuIHJlc3Rhbmd1bGFyaXplRWxlbShjb3BpZWRFbGVtZW50W2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5wYXJlbnRSZXNvdXJjZV0sXG4gICAgICAgICAgY29waWVkRWxlbWVudCwgY29waWVkRWxlbWVudFtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucm91dGVdLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcmVzdGFuZ3VsYXJpemVFbGVtKHBhcmVudCwgZWxlbWVudCwgcm91dGUsIGZyb21TZXJ2ZXI/LCBjb2xsZWN0aW9uPywgcmVxUGFyYW1zPykge1xuICAgICAgICBjb25zdCBlbGVtID0gY29uZmlnLm9uQmVmb3JlRWxlbVJlc3Rhbmd1bGFyaXplZChlbGVtZW50LCBmYWxzZSwgcm91dGUpO1xuXG4gICAgICAgIGNvbnN0IGxvY2FsRWxlbSA9IHJlc3Rhbmd1bGFyaXplQmFzZShwYXJlbnQsIGVsZW0sIHJvdXRlLCByZXFQYXJhbXMsIGZyb21TZXJ2ZXIpO1xuXG4gICAgICAgIGlmIChjb25maWcudXNlQ2Fubm9uaWNhbElkKSB7XG4gICAgICAgICAgbG9jYWxFbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5jYW5ub25pY2FsSWRdID0gY29uZmlnLmdldElkRnJvbUVsZW0obG9jYWxFbGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgbG9jYWxFbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5nZXRQYXJlbnRMaXN0XSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBsb2NhbEVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnJlc3Rhbmd1bGFyQ29sbGVjdGlvbl0gPSBmYWxzZTtcbiAgICAgICAgbG9jYWxFbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5nZXRdID0gYmluZChnZXRGdW5jdGlvbiwgbG9jYWxFbGVtKTtcbiAgICAgICAgbG9jYWxFbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5nZXRMaXN0XSA9IGJpbmQoZmV0Y2hGdW5jdGlvbiwgbG9jYWxFbGVtKTtcbiAgICAgICAgbG9jYWxFbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5wdXRdID0gYmluZChwdXRGdW5jdGlvbiwgbG9jYWxFbGVtKTtcbiAgICAgICAgbG9jYWxFbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5wb3N0XSA9IGJpbmQocG9zdEZ1bmN0aW9uLCBsb2NhbEVsZW0pO1xuICAgICAgICBsb2NhbEVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnJlbW92ZV0gPSBiaW5kKGRlbGV0ZUZ1bmN0aW9uLCBsb2NhbEVsZW0pO1xuICAgICAgICBsb2NhbEVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLmhlYWRdID0gYmluZChoZWFkRnVuY3Rpb24sIGxvY2FsRWxlbSk7XG4gICAgICAgIGxvY2FsRWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMudHJhY2VdID0gYmluZCh0cmFjZUZ1bmN0aW9uLCBsb2NhbEVsZW0pO1xuICAgICAgICBsb2NhbEVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLm9wdGlvbnNdID0gYmluZChvcHRpb25zRnVuY3Rpb24sIGxvY2FsRWxlbSk7XG4gICAgICAgIGxvY2FsRWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucGF0Y2hdID0gYmluZChwYXRjaEZ1bmN0aW9uLCBsb2NhbEVsZW0pO1xuICAgICAgICBsb2NhbEVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnNhdmVdID0gYmluZChzYXZlLCBsb2NhbEVsZW0pO1xuXG4gICAgICAgIGFkZEN1c3RvbU9wZXJhdGlvbihsb2NhbEVsZW0pO1xuICAgICAgICByZXR1cm4gY29uZmlnLnRyYW5zZm9ybUVsZW0obG9jYWxFbGVtLCBmYWxzZSwgcm91dGUsIHNlcnZpY2UsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZXN0YW5ndWxhcml6ZUNvbGxlY3Rpb24ocGFyZW50LCBlbGVtZW50LCByb3V0ZSwgZnJvbVNlcnZlcj8sIHJlcVBhcmFtcz8pIHtcbiAgICAgICAgY29uc3QgZWxlbSA9IGNvbmZpZy5vbkJlZm9yZUVsZW1SZXN0YW5ndWxhcml6ZWQoZWxlbWVudCwgdHJ1ZSwgcm91dGUpO1xuXG4gICAgICAgIGNvbnN0IGxvY2FsRWxlbSA9IHJlc3Rhbmd1bGFyaXplQmFzZShwYXJlbnQsIGVsZW0sIHJvdXRlLCByZXFQYXJhbXMsIGZyb21TZXJ2ZXIpO1xuICAgICAgICBsb2NhbEVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnJlc3Rhbmd1bGFyQ29sbGVjdGlvbl0gPSB0cnVlO1xuICAgICAgICBsb2NhbEVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnBvc3RdID0gYmluZChwb3N0RnVuY3Rpb24sIGxvY2FsRWxlbSwgbnVsbCk7XG4gICAgICAgIGxvY2FsRWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucmVtb3ZlXSA9IGJpbmQoZGVsZXRlRnVuY3Rpb24sIGxvY2FsRWxlbSk7XG4gICAgICAgIGxvY2FsRWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMuaGVhZF0gPSBiaW5kKGhlYWRGdW5jdGlvbiwgbG9jYWxFbGVtKTtcbiAgICAgICAgbG9jYWxFbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy50cmFjZV0gPSBiaW5kKHRyYWNlRnVuY3Rpb24sIGxvY2FsRWxlbSk7XG4gICAgICAgIGxvY2FsRWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucHV0RWxlbWVudF0gPSBiaW5kKHB1dEVsZW1lbnRGdW5jdGlvbiwgbG9jYWxFbGVtKTtcbiAgICAgICAgbG9jYWxFbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5vcHRpb25zXSA9IGJpbmQob3B0aW9uc0Z1bmN0aW9uLCBsb2NhbEVsZW0pO1xuICAgICAgICBsb2NhbEVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnBhdGNoXSA9IGJpbmQocGF0Y2hGdW5jdGlvbiwgbG9jYWxFbGVtKTtcbiAgICAgICAgbG9jYWxFbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5nZXRdID0gYmluZChnZXRCeUlkLCBsb2NhbEVsZW0pO1xuICAgICAgICBsb2NhbEVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLmdldExpc3RdID0gYmluZChmZXRjaEZ1bmN0aW9uLCBsb2NhbEVsZW0sIG51bGwpO1xuXG4gICAgICAgIGFkZEN1c3RvbU9wZXJhdGlvbihsb2NhbEVsZW0pO1xuICAgICAgICByZXR1cm4gY29uZmlnLnRyYW5zZm9ybUVsZW0obG9jYWxFbGVtLCB0cnVlLCByb3V0ZSwgc2VydmljZSwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHJlc3Rhbmd1bGFyaXplQ29sbGVjdGlvbkFuZEVsZW1lbnRzKHBhcmVudCwgZWxlbWVudCwgcm91dGUpIHtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IHJlc3Rhbmd1bGFyaXplQ29sbGVjdGlvbihwYXJlbnQsIGVsZW1lbnQsIHJvdXRlLCBmYWxzZSk7XG4gICAgICAgIGVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgICAgICBpZiAoZWxlbSkge1xuICAgICAgICAgICAgcmVzdGFuZ3VsYXJpemVFbGVtKHBhcmVudCwgZWxlbSwgcm91dGUsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0QnlJZChpZCwgcmVxUGFyYW1zLCBoZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1c3RvbUdFVChpZC50b1N0cmluZygpLCByZXFQYXJhbXMsIGhlYWRlcnMpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwdXRFbGVtZW50RnVuY3Rpb24oaWR4LCBwYXJhbXMsIGhlYWRlcnMpIHtcbiAgICAgICAgY29uc3QgX190aGlzID0gdGhpcztcbiAgICAgICAgY29uc3QgZWxlbVRvUHV0ID0gdGhpc1tpZHhdO1xuICAgICAgICBjb25zdCBzdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgICAgICAgbGV0IGZpbGxlZEFycmF5ID0gW107XG4gICAgICAgIGZpbGxlZEFycmF5ID0gY29uZmlnLnRyYW5zZm9ybUVsZW0oZmlsbGVkQXJyYXksIHRydWUsIGVsZW1Ub1B1dFtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucm91dGVdLCBzZXJ2aWNlKTtcblxuICAgICAgICBlbGVtVG9QdXQucHV0KHBhcmFtcywgaGVhZGVycylcbiAgICAgICAgLnN1YnNjcmliZShmdW5jdGlvbiAoc2VydmVyRWxlbSkge1xuICAgICAgICAgIGNvbnN0IG5ld0FycmF5ID0gY29weVJlc3Rhbmd1bGFyaXplZEVsZW1lbnQoX190aGlzKTtcbiAgICAgICAgICBuZXdBcnJheVtpZHhdID0gc2VydmVyRWxlbTtcbiAgICAgICAgICBmaWxsZWRBcnJheSA9IG5ld0FycmF5O1xuICAgICAgICAgIHN1YmplY3QubmV4dChuZXdBcnJheSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgIHN1YmplY3QuZXJyb3IocmVzcG9uc2UpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdGFuZ3VsYXJpemVSZXNwb25zZShzdWJqZWN0LCB0cnVlLCBmaWxsZWRBcnJheSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHBhcnNlUmVzcG9uc2UocmVzRGF0YSwgb3BlcmF0aW9uLCByb3V0ZSwgZmV0Y2hVcmwsIHJlc3BvbnNlLCBzdWJqZWN0KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjb25maWcucmVzcG9uc2VFeHRyYWN0b3IocmVzRGF0YSwgb3BlcmF0aW9uLCByb3V0ZSwgZmV0Y2hVcmwsIHJlc3BvbnNlLCBzdWJqZWN0KTtcbiAgICAgICAgY29uc3QgZXRhZyA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdFVGFnJyk7XG4gICAgICAgIGlmIChkYXRhICYmIGV0YWcpIHtcbiAgICAgICAgICBkYXRhW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5ldGFnXSA9IGV0YWc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGZldGNoRnVuY3Rpb24od2hhdCwgcmVxUGFyYW1zLCBoZWFkZXJzKSB7XG4gICAgICAgIGNvbnN0IF9fdGhpcyA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuICAgICAgICBjb25zdCBvcGVyYXRpb24gPSAnZ2V0TGlzdCc7XG4gICAgICAgIGNvbnN0IHVybCA9IHVybEhhbmRsZXIuZmV0Y2hVcmwodGhpcywgd2hhdCk7XG4gICAgICAgIGNvbnN0IHdoYXRGZXRjaGVkID0gd2hhdCB8fCBfX3RoaXNbY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnJvdXRlXTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gY29uZmlnLmZ1bGxSZXF1ZXN0SW50ZXJjZXB0b3IobnVsbCwgb3BlcmF0aW9uLFxuICAgICAgICAgIHdoYXRGZXRjaGVkLCB1cmwsIGhlYWRlcnMgfHwge30sIHJlcVBhcmFtcyB8fCB7fSwgdGhpc1tjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMuaHR0cENvbmZpZ10gfHwge30pO1xuXG4gICAgICAgIGxldCBmaWxsZWRBcnJheSA9IFtdO1xuICAgICAgICBmaWxsZWRBcnJheSA9IGNvbmZpZy50cmFuc2Zvcm1FbGVtKGZpbGxlZEFycmF5LCB0cnVlLCB3aGF0RmV0Y2hlZCwgc2VydmljZSk7XG5cbiAgICAgICAgbGV0IG1ldGhvZCA9ICdnZXRMaXN0JztcblxuICAgICAgICBpZiAoY29uZmlnLmpzb25wKSB7XG4gICAgICAgICAgbWV0aG9kID0gJ2pzb25wJztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9rQ2FsbGJhY2sgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICBjb25zdCByZXNEYXRhID0gcmVzcG9uc2UuYm9keTtcbiAgICAgICAgICBjb25zdCBmdWxsUGFyYW1zID0gcmVzcG9uc2UuY29uZmlnLnBhcmFtcztcbiAgICAgICAgICBsZXQgZGF0YSA9IHBhcnNlUmVzcG9uc2UocmVzRGF0YSwgb3BlcmF0aW9uLCB3aGF0RmV0Y2hlZCwgdXJsLCByZXNwb25zZSwgc3ViamVjdCk7XG5cbiAgICAgICAgICAvLyBzdXBwb3J0IGVtcHR5IHJlc3BvbnNlIGZvciBnZXRMaXN0KCkgY2FsbHMgKHNvbWUgQVBJcyByZXNwb25kIHdpdGggMjA0IGFuZCBlbXB0eSBib2R5KVxuICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChkYXRhKSB8fCAnJyA9PT0gZGF0YSkge1xuICAgICAgICAgICAgZGF0YSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVzcG9uc2UgZm9yIGdldExpc3QgU0hPVUxEIGJlIGFuIGFycmF5IGFuZCBub3QgYW4gb2JqZWN0IG9yIHNvbWV0aGluZyBlbHNlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRydWUgPT09IGNvbmZpZy5wbGFpbkJ5RGVmYXVsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVQcm9taXNlKHN1YmplY3QsIHJlc3BvbnNlLCBkYXRhLCBmaWxsZWRBcnJheSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHByb2Nlc3NlZERhdGEgPSBtYXAoZGF0YSwgZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgICAgICAgIGlmICghX190aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5yZXN0YW5ndWxhckNvbGxlY3Rpb25dKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN0YW5ndWxhcml6ZUVsZW0oX190aGlzLCBlbGVtLCB3aGF0LCB0cnVlLCBkYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN0YW5ndWxhcml6ZUVsZW0oX190aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5wYXJlbnRSZXNvdXJjZV0sXG4gICAgICAgICAgICAgICAgZWxlbSwgX190aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5yb3V0ZV0sIHRydWUsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcHJvY2Vzc2VkRGF0YSA9IGV4dGVuZChkYXRhLCBwcm9jZXNzZWREYXRhKTtcblxuICAgICAgICAgIGlmICghX190aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5yZXN0YW5ndWxhckNvbGxlY3Rpb25dKSB7XG4gICAgICAgICAgICByZXNvbHZlUHJvbWlzZShcbiAgICAgICAgICAgICAgc3ViamVjdCxcbiAgICAgICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgICAgIHJlc3Rhbmd1bGFyaXplQ29sbGVjdGlvbihcbiAgICAgICAgICAgICAgICBfX3RoaXMsXG4gICAgICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YSxcbiAgICAgICAgICAgICAgICB3aGF0LFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZnVsbFBhcmFtc1xuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBmaWxsZWRBcnJheVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UoXG4gICAgICAgICAgICAgIHN1YmplY3QsXG4gICAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgICByZXN0YW5ndWxhcml6ZUNvbGxlY3Rpb24oXG4gICAgICAgICAgICAgICAgX190aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5wYXJlbnRSZXNvdXJjZV0sXG4gICAgICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YSxcbiAgICAgICAgICAgICAgICBfX3RoaXNbY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnJvdXRlXSxcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGZ1bGxQYXJhbXNcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgZmlsbGVkQXJyYXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHVybEhhbmRsZXIucmVzb3VyY2UodGhpcywgJGh0dHAsIHJlcXVlc3QuaHR0cENvbmZpZywgcmVxdWVzdC5oZWFkZXJzLCByZXF1ZXN0LnBhcmFtcywgd2hhdCxcbiAgICAgICAgICB0aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5ldGFnXSwgb3BlcmF0aW9uKVttZXRob2RdKClcbiAgICAgICAgLnN1YnNjcmliZShva0NhbGxiYWNrLCBmdW5jdGlvbiBlcnJvcihyZXNwb25zZSkge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDMwNCAmJiBfX3RoaXNbY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnJlc3Rhbmd1bGFyQ29sbGVjdGlvbl0pIHtcbiAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHN1YmplY3QsIHJlc3BvbnNlLCBfX3RoaXMsIGZpbGxlZEFycmF5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGV2ZXJ5KGNvbmZpZy5lcnJvckludGVyY2VwdG9ycywgZnVuY3Rpb24gKGNiOiBhbnkpIHtcblxuICAgICAgICAgICAgcmV0dXJuIGNiKHJlc3BvbnNlLCBzdWJqZWN0LCBva0NhbGxiYWNrKSAhPT0gZmFsc2U7XG4gICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIC8vIHRyaWdnZXJlZCBpZiBubyBjYWxsYmFjayByZXR1cm5zIGZhbHNlXG4gICAgICAgICAgICBzdWJqZWN0LmVycm9yKHJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN0YW5ndWxhcml6ZVJlc3BvbnNlKHN1YmplY3QsIHRydWUsIGZpbGxlZEFycmF5KTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gd2l0aEh0dHBDb25maWcoaHR0cENvbmZpZykge1xuICAgICAgICB0aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5odHRwQ29uZmlnXSA9IGh0dHBDb25maWc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzYXZlKHBhcmFtcywgaGVhZGVycykge1xuICAgICAgICBpZiAodGhpc1tjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMuZnJvbVNlcnZlcl0pIHtcbiAgICAgICAgICByZXR1cm4gdGhpc1tjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucHV0XShwYXJhbXMsIGhlYWRlcnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBiaW5kKGVsZW1GdW5jdGlvbiwgdGhpcykoJ3Bvc3QnLCB1bmRlZmluZWQsIHBhcmFtcywgdW5kZWZpbmVkLCBoZWFkZXJzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBlbGVtRnVuY3Rpb24ob3BlcmF0aW9uLCB3aGF0LCBwYXJhbXMsIG9iaiwgaGVhZGVycykge1xuICAgICAgICBjb25zdCBfX3RoaXMgPSB0aGlzO1xuICAgICAgICBjb25zdCBzdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgICAgICAgY29uc3QgcmVzUGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgICBjb25zdCByb3V0ZSA9IHdoYXQgfHwgdGhpc1tjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucm91dGVdO1xuICAgICAgICBjb25zdCBmZXRjaFVybCA9IHVybEhhbmRsZXIuZmV0Y2hVcmwodGhpcywgd2hhdCk7XG5cbiAgICAgICAgbGV0IGNhbGxPYmogPSBvYmogfHwgdGhpcztcbiAgICAgICAgLy8gZmFsbGJhY2sgdG8gZXRhZyBvbiByZXN0YW5ndWxhciBvYmplY3QgKHNpbmNlIGZvciBjdXN0b20gbWV0aG9kcyB3ZSBwcm9iYWJseSBkb24ndCBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIGV0YWcgZmllbGQpXG4gICAgICAgIGNvbnN0IGV0YWcgPSBjYWxsT2JqW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5ldGFnXSB8fCAob3BlcmF0aW9uICE9PSAncG9zdCcgPyB0aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5ldGFnXSA6IG51bGwpO1xuXG4gICAgICAgIGlmIChpc09iamVjdChjYWxsT2JqKSAmJiBjb25maWcuaXNSZXN0YW5ndWxhcml6ZWQoY2FsbE9iaikpIHtcbiAgICAgICAgICBjYWxsT2JqID0gc3RyaXBSZXN0YW5ndWxhcihjYWxsT2JqKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gY29uZmlnLmZ1bGxSZXF1ZXN0SW50ZXJjZXB0b3IoXG4gICAgICAgICAgY2FsbE9iaixcbiAgICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgICAgcm91dGUsXG4gICAgICAgICAgZmV0Y2hVcmwsXG4gICAgICAgICAgaGVhZGVycyB8fCB7fSxcbiAgICAgICAgICByZXNQYXJhbXMgfHwge30sXG4gICAgICAgICAgdGhpc1tjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMuaHR0cENvbmZpZ10gfHwge31cbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgZmlsbGVkT2JqZWN0ID0ge307XG4gICAgICAgIGZpbGxlZE9iamVjdCA9IGNvbmZpZy50cmFuc2Zvcm1FbGVtKGZpbGxlZE9iamVjdCwgZmFsc2UsIHJvdXRlLCBzZXJ2aWNlKTtcblxuICAgICAgICBjb25zdCBva0NhbGxiYWNrID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgY29uc3QgcmVzRGF0YSA9IGdldChyZXNwb25zZSwgJ2JvZHknKTtcbiAgICAgICAgICBjb25zdCBmdWxsUGFyYW1zID0gZ2V0KHJlc3BvbnNlLCAnY29uZmlnLnBhcmFtcycpO1xuXG4gICAgICAgICAgY29uc3QgZWxlbSA9IHBhcnNlUmVzcG9uc2UocmVzRGF0YSwgb3BlcmF0aW9uLCByb3V0ZSwgZmV0Y2hVcmwsIHJlc3BvbnNlLCBzdWJqZWN0KTtcblxuICAgICAgICAgIGlmIChlbGVtKSB7XG4gICAgICAgICAgICBsZXQgZGF0YTtcbiAgICAgICAgICAgIGlmICh0cnVlID09PSBjb25maWcucGxhaW5CeURlZmF1bHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVQcm9taXNlKHN1YmplY3QsIHJlc3BvbnNlLCBlbGVtLCBmaWxsZWRPYmplY3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3BlcmF0aW9uID09PSAncG9zdCcgJiYgIV9fdGhpc1tjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucmVzdGFuZ3VsYXJDb2xsZWN0aW9uXSkge1xuICAgICAgICAgICAgICBkYXRhID0gcmVzdGFuZ3VsYXJpemVFbGVtKFxuICAgICAgICAgICAgICAgIF9fdGhpc1tjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucGFyZW50UmVzb3VyY2VdLFxuICAgICAgICAgICAgICAgIGVsZW0sXG4gICAgICAgICAgICAgICAgcm91dGUsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIGZ1bGxQYXJhbXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2Uoc3ViamVjdCwgcmVzcG9uc2UsIGRhdGEsIGZpbGxlZE9iamVjdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkYXRhID0gcmVzdGFuZ3VsYXJpemVFbGVtKFxuICAgICAgICAgICAgICAgIF9fdGhpc1tjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucGFyZW50UmVzb3VyY2VdLFxuICAgICAgICAgICAgICAgIGVsZW0sXG4gICAgICAgICAgICAgICAgX190aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5yb3V0ZV0sXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIGZ1bGxQYXJhbXNcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBkYXRhW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5zaW5nbGVPbmVdID0gX190aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5zaW5nbGVPbmVdO1xuICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShzdWJqZWN0LCByZXNwb25zZSwgZGF0YSwgZmlsbGVkT2JqZWN0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlUHJvbWlzZShzdWJqZWN0LCByZXNwb25zZSwgdW5kZWZpbmVkLCBmaWxsZWRPYmplY3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBlcnJvckNhbGxiYWNrID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMzA0ICYmIGNvbmZpZy5pc1NhZmUob3BlcmF0aW9uKSkge1xuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2Uoc3ViamVjdCwgcmVzcG9uc2UsIF9fdGhpcywgZmlsbGVkT2JqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGV2ZXJ5KGNvbmZpZy5lcnJvckludGVyY2VwdG9ycywgZnVuY3Rpb24gKGNiOiBhbnkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYihyZXNwb25zZSwgc3ViamVjdCwgb2tDYWxsYmFjaykgIT09IGZhbHNlO1xuICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAvLyB0cmlnZ2VyZWQgaWYgbm8gY2FsbGJhY2sgcmV0dXJucyBmYWxzZVxuICAgICAgICAgICAgc3ViamVjdC5lcnJvcihyZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBPdmVycmlkaW5nIEhUVFAgTWV0aG9kXG4gICAgICAgIGxldCBjYWxsT3BlcmF0aW9uID0gb3BlcmF0aW9uO1xuICAgICAgICBsZXQgY2FsbEhlYWRlcnMgPSBleHRlbmQoe30sIHJlcXVlc3QuaGVhZGVycyk7XG4gICAgICAgIGNvbnN0IGlzT3ZlcnJpZGVPcGVyYXRpb24gPSBjb25maWcuaXNPdmVycmlkZW5NZXRob2Qob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlzT3ZlcnJpZGVPcGVyYXRpb24pIHtcbiAgICAgICAgICBjYWxsT3BlcmF0aW9uID0gJ3Bvc3QnO1xuICAgICAgICAgIGNhbGxIZWFkZXJzID0gZXh0ZW5kKGNhbGxIZWFkZXJzLCB7J1gtSFRUUC1NZXRob2QtT3ZlcnJpZGUnOiBvcGVyYXRpb24gPT09ICdyZW1vdmUnID8gJ0RFTEVURScgOiBvcGVyYXRpb24udG9VcHBlckNhc2UoKX0pO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5qc29ucCAmJiBjYWxsT3BlcmF0aW9uID09PSAnZ2V0Jykge1xuICAgICAgICAgIGNhbGxPcGVyYXRpb24gPSAnanNvbnAnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5pc1NhZmUob3BlcmF0aW9uKSkge1xuICAgICAgICAgIGlmIChpc092ZXJyaWRlT3BlcmF0aW9uKSB7XG4gICAgICAgICAgICB1cmxIYW5kbGVyLnJlc291cmNlKHRoaXMsICRodHRwLCByZXF1ZXN0Lmh0dHBDb25maWcsIGNhbGxIZWFkZXJzLCByZXF1ZXN0LnBhcmFtcyxcbiAgICAgICAgICAgICAgd2hhdCwgZXRhZywgY2FsbE9wZXJhdGlvbilbY2FsbE9wZXJhdGlvbl0oe30pLnN1YnNjcmliZShva0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXJsSGFuZGxlci5yZXNvdXJjZSh0aGlzLCAkaHR0cCwgcmVxdWVzdC5odHRwQ29uZmlnLCBjYWxsSGVhZGVycywgcmVxdWVzdC5wYXJhbXMsXG4gICAgICAgICAgICAgIHdoYXQsIGV0YWcsIGNhbGxPcGVyYXRpb24pW2NhbGxPcGVyYXRpb25dKCkuc3Vic2NyaWJlKG9rQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cmxIYW5kbGVyLnJlc291cmNlKHRoaXMsICRodHRwLCByZXF1ZXN0Lmh0dHBDb25maWcsIGNhbGxIZWFkZXJzLCByZXF1ZXN0LnBhcmFtcyxcbiAgICAgICAgICAgIHdoYXQsIGV0YWcsIGNhbGxPcGVyYXRpb24pW2NhbGxPcGVyYXRpb25dKHJlcXVlc3QuZWxlbWVudCkuc3Vic2NyaWJlKG9rQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3Rhbmd1bGFyaXplUmVzcG9uc2Uoc3ViamVjdCwgZmFsc2UsIGZpbGxlZE9iamVjdCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGdldEZ1bmN0aW9uKHBhcmFtcywgaGVhZGVycykge1xuICAgICAgICByZXR1cm4gYmluZChlbGVtRnVuY3Rpb24sIHRoaXMpKCdnZXQnLCB1bmRlZmluZWQsIHBhcmFtcywgdW5kZWZpbmVkLCBoZWFkZXJzKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZGVsZXRlRnVuY3Rpb24ocGFyYW1zLCBoZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBiaW5kKGVsZW1GdW5jdGlvbiwgdGhpcykoJ3JlbW92ZScsIHVuZGVmaW5lZCwgcGFyYW1zLCB1bmRlZmluZWQsIGhlYWRlcnMpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwdXRGdW5jdGlvbihwYXJhbXMsIGhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIGJpbmQoZWxlbUZ1bmN0aW9uLCB0aGlzKSgncHV0JywgdW5kZWZpbmVkLCBwYXJhbXMsIHVuZGVmaW5lZCwgaGVhZGVycyk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHBvc3RGdW5jdGlvbih3aGF0LCBlbGVtLCBwYXJhbXMsIGhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIGJpbmQoZWxlbUZ1bmN0aW9uLCB0aGlzKSgncG9zdCcsIHdoYXQsIHBhcmFtcywgZWxlbSwgaGVhZGVycyk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGhlYWRGdW5jdGlvbihwYXJhbXMsIGhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIGJpbmQoZWxlbUZ1bmN0aW9uLCB0aGlzKSgnaGVhZCcsIHVuZGVmaW5lZCwgcGFyYW1zLCB1bmRlZmluZWQsIGhlYWRlcnMpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0cmFjZUZ1bmN0aW9uKHBhcmFtcywgaGVhZGVycykge1xuICAgICAgICByZXR1cm4gYmluZChlbGVtRnVuY3Rpb24sIHRoaXMpKCd0cmFjZScsIHVuZGVmaW5lZCwgcGFyYW1zLCB1bmRlZmluZWQsIGhlYWRlcnMpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBvcHRpb25zRnVuY3Rpb24ocGFyYW1zLCBoZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBiaW5kKGVsZW1GdW5jdGlvbiwgdGhpcykoJ29wdGlvbnMnLCB1bmRlZmluZWQsIHBhcmFtcywgdW5kZWZpbmVkLCBoZWFkZXJzKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcGF0Y2hGdW5jdGlvbihlbGVtLCBwYXJhbXMsIGhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIGJpbmQoZWxlbUZ1bmN0aW9uLCB0aGlzKSgncGF0Y2gnLCB1bmRlZmluZWQsIHBhcmFtcywgZWxlbSwgaGVhZGVycyk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGN1c3RvbUZ1bmN0aW9uKG9wZXJhdGlvbiwgcGF0aCwgcGFyYW1zLCBoZWFkZXJzLCBlbGVtKSB7XG4gICAgICAgIHJldHVybiBiaW5kKGVsZW1GdW5jdGlvbiwgdGhpcykob3BlcmF0aW9uLCBwYXRoLCBwYXJhbXMsIGVsZW0sIGhlYWRlcnMpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBhZGRSZXN0YW5ndWxhck1ldGhvZEZ1bmN0aW9uKG5hbWUsIG9wZXJhdGlvbiwgcGF0aCwgZGVmYXVsdFBhcmFtcywgZGVmYXVsdEhlYWRlcnMsIGRlZmF1bHRFbGVtKSB7XG4gICAgICAgIGxldCBiaW5kZWRGdW5jdGlvbjtcbiAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJ2dldExpc3QnKSB7XG4gICAgICAgICAgYmluZGVkRnVuY3Rpb24gPSBiaW5kKGZldGNoRnVuY3Rpb24sIHRoaXMsIHBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJpbmRlZEZ1bmN0aW9uID0gYmluZChjdXN0b21GdW5jdGlvbiwgdGhpcywgb3BlcmF0aW9uLCBwYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNyZWF0ZWRGdW5jdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGhlYWRlcnMsIGVsZW0pIHtcbiAgICAgICAgICBjb25zdCBjYWxsUGFyYW1zID0gZGVmYXVsdHMoe1xuICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgZWxlbTogZWxlbVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHBhcmFtczogZGVmYXVsdFBhcmFtcyxcbiAgICAgICAgICAgIGhlYWRlcnM6IGRlZmF1bHRIZWFkZXJzLFxuICAgICAgICAgICAgZWxlbTogZGVmYXVsdEVsZW1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gYmluZGVkRnVuY3Rpb24oY2FsbFBhcmFtcy5wYXJhbXMsIGNhbGxQYXJhbXMuaGVhZGVycywgY2FsbFBhcmFtcy5lbGVtKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoY29uZmlnLmlzU2FmZShvcGVyYXRpb24pKSB7XG4gICAgICAgICAgdGhpc1tuYW1lXSA9IGNyZWF0ZWRGdW5jdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzW25hbWVdID0gZnVuY3Rpb24gKGVsZW0sIHBhcmFtcywgaGVhZGVycykge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWRGdW5jdGlvbihwYXJhbXMsIGhlYWRlcnMsIGVsZW0pO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gd2l0aENvbmZpZ3VyYXRpb25GdW5jdGlvbihjb25maWd1cmVyKSB7XG4gICAgICAgIGNvbnN0IG5ld0NvbmZpZyA9IGNsb25lKG9taXQoY29uZmlnLCAnY29uZmlndXJhdGlvbicpKTtcbiAgICAgICAgUmVzdGFuZ3VsYXJDb25maWd1cmVyKG5ld0NvbmZpZywgbmV3Q29uZmlnKTtcbiAgICAgICAgY29uZmlndXJlcihuZXdDb25maWcpO1xuICAgICAgICByZXR1cm4gY3JlYXRlU2VydmljZUZvckNvbmZpZ3VyYXRpb24obmV3Q29uZmlnKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdG9TZXJ2aWNlKHJvdXRlLCBwYXJlbnQpIHtcbiAgICAgICAgY29uc3Qga25vd25Db2xsZWN0aW9uTWV0aG9kcyA9IHZhbHVlcyhjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMpO1xuICAgICAgICBjb25zdCBzZXJ2OiBhbnkgPSB7fTtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChwYXJlbnQgfHwgc2VydmljZSkuYWxsKHJvdXRlKTtcbiAgICAgICAgc2Vydi5vbmUgPSBiaW5kKG9uZSwgKHBhcmVudCB8fCBzZXJ2aWNlKSwgcGFyZW50LCByb3V0ZSk7XG4gICAgICAgIHNlcnYuYWxsID0gYmluZChjb2xsZWN0aW9uLmFsbCwgY29sbGVjdGlvbik7XG4gICAgICAgIHNlcnYucG9zdCA9IGJpbmQoY29sbGVjdGlvbi5wb3N0LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgc2Vydi5nZXRMaXN0ID0gYmluZChjb2xsZWN0aW9uLmdldExpc3QsIGNvbGxlY3Rpb24pO1xuICAgICAgICBzZXJ2LndpdGhIdHRwQ29uZmlnID0gYmluZChjb2xsZWN0aW9uLndpdGhIdHRwQ29uZmlnLCBjb2xsZWN0aW9uKTtcbiAgICAgICAgc2Vydi5nZXQgPSBiaW5kKGNvbGxlY3Rpb24uZ2V0LCBjb2xsZWN0aW9uKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gY29sbGVjdGlvbikge1xuICAgICAgICAgIGlmIChjb2xsZWN0aW9uLmhhc093blByb3BlcnR5KHByb3ApICYmIGlzRnVuY3Rpb24oY29sbGVjdGlvbltwcm9wXSkgJiYgIWluY2x1ZGVzKGtub3duQ29sbGVjdGlvbk1ldGhvZHMsIHByb3ApKSB7XG4gICAgICAgICAgICBzZXJ2W3Byb3BdID0gYmluZChjb2xsZWN0aW9uW3Byb3BdLCBjb2xsZWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2VydjtcbiAgICAgIH1cblxuICAgICAgUmVzdGFuZ3VsYXJDb25maWd1cmVyKHNlcnZpY2UsIGNvbmZpZyk7XG5cbiAgICAgIHNlcnZpY2UuY29weSA9IGJpbmQoY29weVJlc3Rhbmd1bGFyaXplZEVsZW1lbnQsIHNlcnZpY2UpO1xuXG4gICAgICBzZXJ2aWNlLnNlcnZpY2UgPSBiaW5kKHRvU2VydmljZSwgc2VydmljZSk7XG5cbiAgICAgIHNlcnZpY2Uud2l0aENvbmZpZyA9IGJpbmQod2l0aENvbmZpZ3VyYXRpb25GdW5jdGlvbiwgc2VydmljZSk7XG5cbiAgICAgIHNlcnZpY2Uub25lID0gYmluZChvbmUsIHNlcnZpY2UsIG51bGwpO1xuXG4gICAgICBzZXJ2aWNlLmFsbCA9IGJpbmQoYWxsLCBzZXJ2aWNlLCBudWxsKTtcblxuICAgICAgc2VydmljZS5zZXZlcmFsID0gYmluZChzZXZlcmFsLCBzZXJ2aWNlLCBudWxsKTtcblxuICAgICAgc2VydmljZS5vbmVVcmwgPSBiaW5kKG9uZVVybCwgc2VydmljZSwgbnVsbCk7XG5cbiAgICAgIHNlcnZpY2UuYWxsVXJsID0gYmluZChhbGxVcmwsIHNlcnZpY2UsIG51bGwpO1xuXG4gICAgICBzZXJ2aWNlLnN0cmlwUmVzdGFuZ3VsYXIgPSBiaW5kKHN0cmlwUmVzdGFuZ3VsYXIsIHNlcnZpY2UpO1xuXG4gICAgICBzZXJ2aWNlLnJlc3Rhbmd1bGFyaXplRWxlbWVudCA9IGJpbmQocmVzdGFuZ3VsYXJpemVFbGVtLCBzZXJ2aWNlKTtcblxuICAgICAgc2VydmljZS5yZXN0YW5ndWxhcml6ZUNvbGxlY3Rpb24gPSBiaW5kKHJlc3Rhbmd1bGFyaXplQ29sbGVjdGlvbkFuZEVsZW1lbnRzLCBzZXJ2aWNlKTtcblxuICAgICAgcmV0dXJuIHNlcnZpY2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZVNlcnZpY2VGb3JDb25maWd1cmF0aW9uKGdsb2JhbENvbmZpZ3VyYXRpb24pO1xuICB9XG5cbn1cbiIsImltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlLCBPcHRpb25hbCwgU2tpcFNlbGYsIEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgUkVTVEFOR1VMQVIsIFJlc3Rhbmd1bGFyRmFjdG9yeSB9IGZyb20gJy4vbmd4LXJlc3Rhbmd1bGFyLmNvbmZpZyc7XG5pbXBvcnQgeyBSZXN0YW5ndWxhciB9IGZyb20gJy4vbmd4LXJlc3Rhbmd1bGFyJztcbmltcG9ydCB7IFJlc3Rhbmd1bGFySHR0cCB9IGZyb20gJy4vbmd4LXJlc3Rhbmd1bGFyLWh0dHAnO1xuXG5leHBvcnQgY29uc3QgQ09ORklHX09CSiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdjb25maWdPYmonKTtcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0h0dHBDbGllbnRNb2R1bGVdLFxuICBwcm92aWRlcnM6IFtSZXN0YW5ndWxhckh0dHAsIFJlc3Rhbmd1bGFyXVxufSlcbmV4cG9ydCBjbGFzcyBSZXN0YW5ndWxhck1vZHVsZSB7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQFNraXBTZWxmKCkgcGFyZW50TW9kdWxlOiBSZXN0YW5ndWxhck1vZHVsZSkge1xuICAgIGlmIChwYXJlbnRNb2R1bGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1Jlc3Rhbmd1bGFyTW9kdWxlIGlzIGFscmVhZHkgbG9hZGVkLiBJbXBvcnQgaXQgaW4gdGhlIEFwcE1vZHVsZSBvbmx5Jyk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZvclJvb3QoY29uZmlnRnVuY3Rpb24/OiAocHJvdmlkZXI6IGFueSwgLi4uYXJnOiBhbnlbXSkgPT4gdm9pZCk6IE1vZHVsZVdpdGhQcm92aWRlcnM7XG4gIHN0YXRpYyBmb3JSb290KHByb3ZpZGVycz86IGFueVtdLCBjb25maWdGdW5jdGlvbj86IChwcm92aWRlcjogYW55LCAuLi5hcmc6IGFueVtdKSA9PiB2b2lkKTogTW9kdWxlV2l0aFByb3ZpZGVycztcbiAgc3RhdGljIGZvclJvb3QoY29uZmlnMT8sIGNvbmZpZzI/KTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBSZXN0YW5ndWxhck1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7cHJvdmlkZTogQ09ORklHX09CSiwgdXNlVmFsdWU6IFtjb25maWcxLCBjb25maWcyXX0sXG4gICAgICAgIHtwcm92aWRlOiBSRVNUQU5HVUxBUiwgdXNlRmFjdG9yeTogUmVzdGFuZ3VsYXJGYWN0b3J5LCBkZXBzOiBbQ09ORklHX09CSl19LFxuICAgICAgXVxuICAgIH07XG4gIH1cblxufVxuIl0sIm5hbWVzIjpbIkluamVjdGlvblRva2VuIiwiaXNBcnJheSIsIkh0dHBSZXF1ZXN0IiwiYXNzaWduIiwiSHR0cFBhcmFtcyIsIkh0dHBIZWFkZXJzIiwiaHR0cCIsImZpbHRlciIsIkh0dHBSZXNwb25zZSIsIm1hcCIsInRocm93RXJyb3IiLCJIdHRwRXJyb3JSZXNwb25zZSIsImNhdGNoRXJyb3IiLCJJbmplY3RhYmxlIiwiSHR0cEJhY2tlbmQiLCJvYmplY3QiLCJpbmNsdWRlcyIsImlzVW5kZWZpbmVkIiwiaXNOdWxsIiwiZGVmYXVsdHMiLCJlYWNoIiwiZXh0ZW5kIiwiZmluZCIsImhhcyIsImluaXRpYWwiLCJsYXN0IiwiY2xvbmUiLCJyZWR1Y2UiLCJpc0Jvb2xlYW4iLCJrZXlzIiwiaXNFbXB0eSIsImZvckVhY2giLCJpc09iamVjdCIsImlzRnVuY3Rpb24iLCJPcHRpb25hbCIsIkluamVjdCIsIkluamVjdG9yIiwiYmluZCIsInVuaW9uIiwidmFsdWVzIiwicGljayIsImlzTnVtYmVyIiwib21pdCIsIkJlaGF2aW9yU3ViamVjdCIsImV2ZXJ5IiwiZ2V0IiwiTmdNb2R1bGUiLCJIdHRwQ2xpZW50TW9kdWxlIiwiU2tpcFNlbGYiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBOzs7Ozs7Ozs7Ozs7OztBQWNBLGFBdUdnQixNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkIs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 |
\ | No newline at end of file |