1 | ;
|
2 |
|
3 | function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
4 |
|
5 | function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
6 |
|
7 | function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
8 |
|
9 | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
10 |
|
11 | function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
12 |
|
13 | function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
14 |
|
15 | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
16 |
|
17 | function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
18 |
|
19 | /**
|
20 | * Module dependencies.
|
21 | */
|
22 | // eslint-disable-next-line node/no-deprecated-api
|
23 | var _require = require('url'),
|
24 | parse = _require.parse,
|
25 | format = _require.format,
|
26 | resolve = _require.resolve;
|
27 |
|
28 | var Stream = require('stream');
|
29 |
|
30 | var https = require('https');
|
31 |
|
32 | var http = require('http');
|
33 |
|
34 | var fs = require('fs');
|
35 |
|
36 | var zlib = require('zlib');
|
37 |
|
38 | var util = require('util');
|
39 |
|
40 | var qs = require('qs');
|
41 |
|
42 | var mime = require('mime');
|
43 |
|
44 | var methods = require('methods');
|
45 |
|
46 | var FormData = require('form-data');
|
47 |
|
48 | var formidable = require('formidable');
|
49 |
|
50 | var debug = require('debug')('superagent');
|
51 |
|
52 | var CookieJar = require('cookiejar');
|
53 |
|
54 | var semverGte = require('semver/functions/gte');
|
55 |
|
56 | var safeStringify = require('fast-safe-stringify');
|
57 |
|
58 | var utils = require('../utils');
|
59 |
|
60 | var RequestBase = require('../request-base');
|
61 |
|
62 | var _require2 = require('./unzip'),
|
63 | unzip = _require2.unzip;
|
64 |
|
65 | var Response = require('./response');
|
66 |
|
67 | var http2;
|
68 | if (semverGte(process.version, 'v10.10.0')) http2 = require('./http2wrapper');
|
69 |
|
70 | function request(method, url) {
|
71 | // callback
|
72 | if (typeof url === 'function') {
|
73 | return new exports.Request('GET', method).end(url);
|
74 | } // url first
|
75 |
|
76 |
|
77 | if (arguments.length === 1) {
|
78 | return new exports.Request('GET', method);
|
79 | }
|
80 |
|
81 | return new exports.Request(method, url);
|
82 | }
|
83 |
|
84 | module.exports = request;
|
85 | exports = module.exports;
|
86 | /**
|
87 | * Expose `Request`.
|
88 | */
|
89 |
|
90 | exports.Request = Request;
|
91 | /**
|
92 | * Expose the agent function
|
93 | */
|
94 |
|
95 | exports.agent = require('./agent');
|
96 | /**
|
97 | * Noop.
|
98 | */
|
99 |
|
100 | function noop() {}
|
101 | /**
|
102 | * Expose `Response`.
|
103 | */
|
104 |
|
105 |
|
106 | exports.Response = Response;
|
107 | /**
|
108 | * Define "form" mime type.
|
109 | */
|
110 |
|
111 | mime.define({
|
112 | 'application/x-www-form-urlencoded': ['form', 'urlencoded', 'form-data']
|
113 | }, true);
|
114 | /**
|
115 | * Protocol map.
|
116 | */
|
117 |
|
118 | exports.protocols = {
|
119 | 'http:': http,
|
120 | 'https:': https,
|
121 | 'http2:': http2
|
122 | };
|
123 | /**
|
124 | * Default serialization map.
|
125 | *
|
126 | * superagent.serialize['application/xml'] = function(obj){
|
127 | * return 'generated xml here';
|
128 | * };
|
129 | *
|
130 | */
|
131 |
|
132 | exports.serialize = {
|
133 | 'application/x-www-form-urlencoded': qs.stringify,
|
134 | 'application/json': safeStringify
|
135 | };
|
136 | /**
|
137 | * Default parsers.
|
138 | *
|
139 | * superagent.parse['application/xml'] = function(res, fn){
|
140 | * fn(null, res);
|
141 | * };
|
142 | *
|
143 | */
|
144 |
|
145 | exports.parse = require('./parsers');
|
146 | /**
|
147 | * Default buffering map. Can be used to set certain
|
148 | * response types to buffer/not buffer.
|
149 | *
|
150 | * superagent.buffer['application/xml'] = true;
|
151 | */
|
152 |
|
153 | exports.buffer = {};
|
154 | /**
|
155 | * Initialize internal header tracking properties on a request instance.
|
156 | *
|
157 | * @param {Object} req the instance
|
158 | * @api private
|
159 | */
|
160 |
|
161 | function _initHeaders(request_) {
|
162 | request_._header = {// coerces header names to lowercase
|
163 | };
|
164 | request_.header = {// preserves header name case
|
165 | };
|
166 | }
|
167 | /**
|
168 | * Initialize a new `Request` with the given `method` and `url`.
|
169 | *
|
170 | * @param {String} method
|
171 | * @param {String|Object} url
|
172 | * @api public
|
173 | */
|
174 |
|
175 |
|
176 | function Request(method, url) {
|
177 | Stream.call(this);
|
178 | if (typeof url !== 'string') url = format(url);
|
179 | this._enableHttp2 = Boolean(process.env.HTTP2_TEST); // internal only
|
180 |
|
181 | this._agent = false;
|
182 | this._formData = null;
|
183 | this.method = method;
|
184 | this.url = url;
|
185 |
|
186 | _initHeaders(this);
|
187 |
|
188 | this.writable = true;
|
189 | this._redirects = 0;
|
190 | this.redirects(method === 'HEAD' ? 0 : 5);
|
191 | this.cookies = '';
|
192 | this.qs = {};
|
193 | this._query = [];
|
194 | this.qsRaw = this._query; // Unused, for backwards compatibility only
|
195 |
|
196 | this._redirectList = [];
|
197 | this._streamRequest = false;
|
198 | this.once('end', this.clearTimeout.bind(this));
|
199 | }
|
200 | /**
|
201 | * Inherit from `Stream` (which inherits from `EventEmitter`).
|
202 | * Mixin `RequestBase`.
|
203 | */
|
204 |
|
205 |
|
206 | util.inherits(Request, Stream); // eslint-disable-next-line new-cap
|
207 |
|
208 | RequestBase(Request.prototype);
|
209 | /**
|
210 | * Enable or Disable http2.
|
211 | *
|
212 | * Enable http2.
|
213 | *
|
214 | * ``` js
|
215 | * request.get('http://localhost/')
|
216 | * .http2()
|
217 | * .end(callback);
|
218 | *
|
219 | * request.get('http://localhost/')
|
220 | * .http2(true)
|
221 | * .end(callback);
|
222 | * ```
|
223 | *
|
224 | * Disable http2.
|
225 | *
|
226 | * ``` js
|
227 | * request = request.http2();
|
228 | * request.get('http://localhost/')
|
229 | * .http2(false)
|
230 | * .end(callback);
|
231 | * ```
|
232 | *
|
233 | * @param {Boolean} enable
|
234 | * @return {Request} for chaining
|
235 | * @api public
|
236 | */
|
237 |
|
238 | Request.prototype.http2 = function (bool) {
|
239 | if (exports.protocols['http2:'] === undefined) {
|
240 | throw new Error('superagent: this version of Node.js does not support http2');
|
241 | }
|
242 |
|
243 | this._enableHttp2 = bool === undefined ? true : bool;
|
244 | return this;
|
245 | };
|
246 | /**
|
247 | * Queue the given `file` as an attachment to the specified `field`,
|
248 | * with optional `options` (or filename).
|
249 | *
|
250 | * ``` js
|
251 | * request.post('http://localhost/upload')
|
252 | * .attach('field', Buffer.from('<b>Hello world</b>'), 'hello.html')
|
253 | * .end(callback);
|
254 | * ```
|
255 | *
|
256 | * A filename may also be used:
|
257 | *
|
258 | * ``` js
|
259 | * request.post('http://localhost/upload')
|
260 | * .attach('files', 'image.jpg')
|
261 | * .end(callback);
|
262 | * ```
|
263 | *
|
264 | * @param {String} field
|
265 | * @param {String|fs.ReadStream|Buffer} file
|
266 | * @param {String|Object} options
|
267 | * @return {Request} for chaining
|
268 | * @api public
|
269 | */
|
270 |
|
271 |
|
272 | Request.prototype.attach = function (field, file, options) {
|
273 | var _this = this;
|
274 |
|
275 | if (file) {
|
276 | if (this._data) {
|
277 | throw new Error("superagent can't mix .send() and .attach()");
|
278 | }
|
279 |
|
280 | var o = options || {};
|
281 |
|
282 | if (typeof options === 'string') {
|
283 | o = {
|
284 | filename: options
|
285 | };
|
286 | }
|
287 |
|
288 | if (typeof file === 'string') {
|
289 | if (!o.filename) o.filename = file;
|
290 | debug('creating `fs.ReadStream` instance for file: %s', file);
|
291 | file = fs.createReadStream(file);
|
292 | file.on('error', function (error) {
|
293 | var formData = _this._getFormData();
|
294 |
|
295 | formData.emit('error', error);
|
296 | });
|
297 | } else if (!o.filename && file.path) {
|
298 | o.filename = file.path;
|
299 | }
|
300 |
|
301 | this._getFormData().append(field, file, o);
|
302 | }
|
303 |
|
304 | return this;
|
305 | };
|
306 |
|
307 | Request.prototype._getFormData = function () {
|
308 | var _this2 = this;
|
309 |
|
310 | if (!this._formData) {
|
311 | this._formData = new FormData();
|
312 |
|
313 | this._formData.on('error', function (error) {
|
314 | debug('FormData error', error);
|
315 |
|
316 | if (_this2.called) {
|
317 | // The request has already finished and the callback was called.
|
318 | // Silently ignore the error.
|
319 | return;
|
320 | }
|
321 |
|
322 | _this2.callback(error);
|
323 |
|
324 | _this2.abort();
|
325 | });
|
326 | }
|
327 |
|
328 | return this._formData;
|
329 | };
|
330 | /**
|
331 | * Gets/sets the `Agent` to use for this HTTP request. The default (if this
|
332 | * function is not called) is to opt out of connection pooling (`agent: false`).
|
333 | *
|
334 | * @param {http.Agent} agent
|
335 | * @return {http.Agent}
|
336 | * @api public
|
337 | */
|
338 |
|
339 |
|
340 | Request.prototype.agent = function (agent) {
|
341 | if (arguments.length === 0) return this._agent;
|
342 | this._agent = agent;
|
343 | return this;
|
344 | };
|
345 | /**
|
346 | * Set _Content-Type_ response header passed through `mime.getType()`.
|
347 | *
|
348 | * Examples:
|
349 | *
|
350 | * request.post('/')
|
351 | * .type('xml')
|
352 | * .send(xmlstring)
|
353 | * .end(callback);
|
354 | *
|
355 | * request.post('/')
|
356 | * .type('json')
|
357 | * .send(jsonstring)
|
358 | * .end(callback);
|
359 | *
|
360 | * request.post('/')
|
361 | * .type('application/json')
|
362 | * .send(jsonstring)
|
363 | * .end(callback);
|
364 | *
|
365 | * @param {String} type
|
366 | * @return {Request} for chaining
|
367 | * @api public
|
368 | */
|
369 |
|
370 |
|
371 | Request.prototype.type = function (type) {
|
372 | return this.set('Content-Type', type.includes('/') ? type : mime.getType(type));
|
373 | };
|
374 | /**
|
375 | * Set _Accept_ response header passed through `mime.getType()`.
|
376 | *
|
377 | * Examples:
|
378 | *
|
379 | * superagent.types.json = 'application/json';
|
380 | *
|
381 | * request.get('/agent')
|
382 | * .accept('json')
|
383 | * .end(callback);
|
384 | *
|
385 | * request.get('/agent')
|
386 | * .accept('application/json')
|
387 | * .end(callback);
|
388 | *
|
389 | * @param {String} accept
|
390 | * @return {Request} for chaining
|
391 | * @api public
|
392 | */
|
393 |
|
394 |
|
395 | Request.prototype.accept = function (type) {
|
396 | return this.set('Accept', type.includes('/') ? type : mime.getType(type));
|
397 | };
|
398 | /**
|
399 | * Add query-string `val`.
|
400 | *
|
401 | * Examples:
|
402 | *
|
403 | * request.get('/shoes')
|
404 | * .query('size=10')
|
405 | * .query({ color: 'blue' })
|
406 | *
|
407 | * @param {Object|String} val
|
408 | * @return {Request} for chaining
|
409 | * @api public
|
410 | */
|
411 |
|
412 |
|
413 | Request.prototype.query = function (value) {
|
414 | if (typeof value === 'string') {
|
415 | this._query.push(value);
|
416 | } else {
|
417 | Object.assign(this.qs, value);
|
418 | }
|
419 |
|
420 | return this;
|
421 | };
|
422 | /**
|
423 | * Write raw `data` / `encoding` to the socket.
|
424 | *
|
425 | * @param {Buffer|String} data
|
426 | * @param {String} encoding
|
427 | * @return {Boolean}
|
428 | * @api public
|
429 | */
|
430 |
|
431 |
|
432 | Request.prototype.write = function (data, encoding) {
|
433 | var request_ = this.request();
|
434 |
|
435 | if (!this._streamRequest) {
|
436 | this._streamRequest = true;
|
437 | }
|
438 |
|
439 | return request_.write(data, encoding);
|
440 | };
|
441 | /**
|
442 | * Pipe the request body to `stream`.
|
443 | *
|
444 | * @param {Stream} stream
|
445 | * @param {Object} options
|
446 | * @return {Stream}
|
447 | * @api public
|
448 | */
|
449 |
|
450 |
|
451 | Request.prototype.pipe = function (stream, options) {
|
452 | this.piped = true; // HACK...
|
453 |
|
454 | this.buffer(false);
|
455 | this.end();
|
456 | return this._pipeContinue(stream, options);
|
457 | };
|
458 |
|
459 | Request.prototype._pipeContinue = function (stream, options) {
|
460 | var _this3 = this;
|
461 |
|
462 | this.req.once('response', function (res) {
|
463 | // redirect
|
464 | if (isRedirect(res.statusCode) && _this3._redirects++ !== _this3._maxRedirects) {
|
465 | return _this3._redirect(res) === _this3 ? _this3._pipeContinue(stream, options) : undefined;
|
466 | }
|
467 |
|
468 | _this3.res = res;
|
469 |
|
470 | _this3._emitResponse();
|
471 |
|
472 | if (_this3._aborted) return;
|
473 |
|
474 | if (_this3._shouldUnzip(res)) {
|
475 | var unzipObject = zlib.createUnzip();
|
476 | unzipObject.on('error', function (error) {
|
477 | if (error && error.code === 'Z_BUF_ERROR') {
|
478 | // unexpected end of file is ignored by browsers and curl
|
479 | stream.emit('end');
|
480 | return;
|
481 | }
|
482 |
|
483 | stream.emit('error', error);
|
484 | });
|
485 | res.pipe(unzipObject).pipe(stream, options);
|
486 | } else {
|
487 | res.pipe(stream, options);
|
488 | }
|
489 |
|
490 | res.once('end', function () {
|
491 | _this3.emit('end');
|
492 | });
|
493 | });
|
494 | return stream;
|
495 | };
|
496 | /**
|
497 | * Enable / disable buffering.
|
498 | *
|
499 | * @return {Boolean} [val]
|
500 | * @return {Request} for chaining
|
501 | * @api public
|
502 | */
|
503 |
|
504 |
|
505 | Request.prototype.buffer = function (value) {
|
506 | this._buffer = value !== false;
|
507 | return this;
|
508 | };
|
509 | /**
|
510 | * Redirect to `url
|
511 | *
|
512 | * @param {IncomingMessage} res
|
513 | * @return {Request} for chaining
|
514 | * @api private
|
515 | */
|
516 |
|
517 |
|
518 | Request.prototype._redirect = function (res) {
|
519 | var url = res.headers.location;
|
520 |
|
521 | if (!url) {
|
522 | return this.callback(new Error('No location header for redirect'), res);
|
523 | }
|
524 |
|
525 | debug('redirect %s -> %s', this.url, url); // location
|
526 |
|
527 | url = resolve(this.url, url); // ensure the response is being consumed
|
528 | // this is required for Node v0.10+
|
529 |
|
530 | res.resume();
|
531 | var headers = this.req.getHeaders ? this.req.getHeaders() : this.req._headers;
|
532 | var changesOrigin = parse(url).host !== parse(this.url).host; // implementation of 302 following defacto standard
|
533 |
|
534 | if (res.statusCode === 301 || res.statusCode === 302) {
|
535 | // strip Content-* related fields
|
536 | // in case of POST etc
|
537 | headers = utils.cleanHeader(headers, changesOrigin); // force GET
|
538 |
|
539 | this.method = this.method === 'HEAD' ? 'HEAD' : 'GET'; // clear data
|
540 |
|
541 | this._data = null;
|
542 | } // 303 is always GET
|
543 |
|
544 |
|
545 | if (res.statusCode === 303) {
|
546 | // strip Content-* related fields
|
547 | // in case of POST etc
|
548 | headers = utils.cleanHeader(headers, changesOrigin); // force method
|
549 |
|
550 | this.method = 'GET'; // clear data
|
551 |
|
552 | this._data = null;
|
553 | } // 307 preserves method
|
554 | // 308 preserves method
|
555 |
|
556 |
|
557 | delete headers.host;
|
558 | delete this.req;
|
559 | delete this._formData; // remove all add header except User-Agent
|
560 |
|
561 | _initHeaders(this); // redirect
|
562 |
|
563 |
|
564 | this._endCalled = false;
|
565 | this.url = url;
|
566 | this.qs = {};
|
567 | this._query.length = 0;
|
568 | this.set(headers);
|
569 | this.emit('redirect', res);
|
570 |
|
571 | this._redirectList.push(this.url);
|
572 |
|
573 | this.end(this._callback);
|
574 | return this;
|
575 | };
|
576 | /**
|
577 | * Set Authorization field value with `user` and `pass`.
|
578 | *
|
579 | * Examples:
|
580 | *
|
581 | * .auth('tobi', 'learnboost')
|
582 | * .auth('tobi:learnboost')
|
583 | * .auth('tobi')
|
584 | * .auth(accessToken, { type: 'bearer' })
|
585 | *
|
586 | * @param {String} user
|
587 | * @param {String} [pass]
|
588 | * @param {Object} [options] options with authorization type 'basic' or 'bearer' ('basic' is default)
|
589 | * @return {Request} for chaining
|
590 | * @api public
|
591 | */
|
592 |
|
593 |
|
594 | Request.prototype.auth = function (user, pass, options) {
|
595 | if (arguments.length === 1) pass = '';
|
596 |
|
597 | if (_typeof(pass) === 'object' && pass !== null) {
|
598 | // pass is optional and can be replaced with options
|
599 | options = pass;
|
600 | pass = '';
|
601 | }
|
602 |
|
603 | if (!options) {
|
604 | options = {
|
605 | type: 'basic'
|
606 | };
|
607 | }
|
608 |
|
609 | var encoder = function encoder(string) {
|
610 | return Buffer.from(string).toString('base64');
|
611 | };
|
612 |
|
613 | return this._auth(user, pass, options, encoder);
|
614 | };
|
615 | /**
|
616 | * Set the certificate authority option for https request.
|
617 | *
|
618 | * @param {Buffer | Array} cert
|
619 | * @return {Request} for chaining
|
620 | * @api public
|
621 | */
|
622 |
|
623 |
|
624 | Request.prototype.ca = function (cert) {
|
625 | this._ca = cert;
|
626 | return this;
|
627 | };
|
628 | /**
|
629 | * Set the client certificate key option for https request.
|
630 | *
|
631 | * @param {Buffer | String} cert
|
632 | * @return {Request} for chaining
|
633 | * @api public
|
634 | */
|
635 |
|
636 |
|
637 | Request.prototype.key = function (cert) {
|
638 | this._key = cert;
|
639 | return this;
|
640 | };
|
641 | /**
|
642 | * Set the key, certificate, and CA certs of the client in PFX or PKCS12 format.
|
643 | *
|
644 | * @param {Buffer | String} cert
|
645 | * @return {Request} for chaining
|
646 | * @api public
|
647 | */
|
648 |
|
649 |
|
650 | Request.prototype.pfx = function (cert) {
|
651 | if (_typeof(cert) === 'object' && !Buffer.isBuffer(cert)) {
|
652 | this._pfx = cert.pfx;
|
653 | this._passphrase = cert.passphrase;
|
654 | } else {
|
655 | this._pfx = cert;
|
656 | }
|
657 |
|
658 | return this;
|
659 | };
|
660 | /**
|
661 | * Set the client certificate option for https request.
|
662 | *
|
663 | * @param {Buffer | String} cert
|
664 | * @return {Request} for chaining
|
665 | * @api public
|
666 | */
|
667 |
|
668 |
|
669 | Request.prototype.cert = function (cert) {
|
670 | this._cert = cert;
|
671 | return this;
|
672 | };
|
673 | /**
|
674 | * Do not reject expired or invalid TLS certs.
|
675 | * sets `rejectUnauthorized=true`. Be warned that this allows MITM attacks.
|
676 | *
|
677 | * @return {Request} for chaining
|
678 | * @api public
|
679 | */
|
680 |
|
681 |
|
682 | Request.prototype.disableTLSCerts = function () {
|
683 | this._disableTLSCerts = true;
|
684 | return this;
|
685 | };
|
686 | /**
|
687 | * Return an http[s] request.
|
688 | *
|
689 | * @return {OutgoingMessage}
|
690 | * @api private
|
691 | */
|
692 | // eslint-disable-next-line complexity
|
693 |
|
694 |
|
695 | Request.prototype.request = function () {
|
696 | var _this4 = this;
|
697 |
|
698 | if (this.req) return this.req;
|
699 | var options = {};
|
700 |
|
701 | try {
|
702 | var query = qs.stringify(this.qs, {
|
703 | indices: false,
|
704 | strictNullHandling: true
|
705 | });
|
706 |
|
707 | if (query) {
|
708 | this.qs = {};
|
709 |
|
710 | this._query.push(query);
|
711 | }
|
712 |
|
713 | this._finalizeQueryString();
|
714 | } catch (err) {
|
715 | return this.emit('error', err);
|
716 | }
|
717 |
|
718 | var url = this.url;
|
719 | var retries = this._retries; // Capture backticks as-is from the final query string built above.
|
720 | // Note: this'll only find backticks entered in req.query(String)
|
721 | // calls, because qs.stringify unconditionally encodes backticks.
|
722 |
|
723 | var queryStringBackticks;
|
724 |
|
725 | if (url.includes('`')) {
|
726 | var queryStartIndex = url.indexOf('?');
|
727 |
|
728 | if (queryStartIndex !== -1) {
|
729 | var queryString = url.slice(queryStartIndex + 1);
|
730 | queryStringBackticks = queryString.match(/`|%60/g);
|
731 | }
|
732 | } // default to http://
|
733 |
|
734 |
|
735 | if (url.indexOf('http') !== 0) url = "http://".concat(url);
|
736 | url = parse(url); // See https://github.com/visionmedia/superagent/issues/1367
|
737 |
|
738 | if (queryStringBackticks) {
|
739 | var i = 0;
|
740 | url.query = url.query.replace(/%60/g, function () {
|
741 | return queryStringBackticks[i++];
|
742 | });
|
743 | url.search = "?".concat(url.query);
|
744 | url.path = url.pathname + url.search;
|
745 | } // support unix sockets
|
746 |
|
747 |
|
748 | if (/^https?\+unix:/.test(url.protocol) === true) {
|
749 | // get the protocol
|
750 | url.protocol = "".concat(url.protocol.split('+')[0], ":"); // get the socket, path
|
751 |
|
752 | var unixParts = url.path.match(/^([^/]+)(.+)$/);
|
753 | options.socketPath = unixParts[1].replace(/%2F/g, '/');
|
754 | url.path = unixParts[2];
|
755 | } // Override IP address of a hostname
|
756 |
|
757 |
|
758 | if (this._connectOverride) {
|
759 | var _url = url,
|
760 | hostname = _url.hostname;
|
761 | var match = hostname in this._connectOverride ? this._connectOverride[hostname] : this._connectOverride['*'];
|
762 |
|
763 | if (match) {
|
764 | // backup the real host
|
765 | if (!this._header.host) {
|
766 | this.set('host', url.host);
|
767 | }
|
768 |
|
769 | var newHost;
|
770 | var newPort;
|
771 |
|
772 | if (_typeof(match) === 'object') {
|
773 | newHost = match.host;
|
774 | newPort = match.port;
|
775 | } else {
|
776 | newHost = match;
|
777 | newPort = url.port;
|
778 | } // wrap [ipv6]
|
779 |
|
780 |
|
781 | url.host = /:/.test(newHost) ? "[".concat(newHost, "]") : newHost;
|
782 |
|
783 | if (newPort) {
|
784 | url.host += ":".concat(newPort);
|
785 | url.port = newPort;
|
786 | }
|
787 |
|
788 | url.hostname = newHost;
|
789 | }
|
790 | } // options
|
791 |
|
792 |
|
793 | options.method = this.method;
|
794 | options.port = url.port;
|
795 | options.path = url.path;
|
796 | options.host = url.hostname;
|
797 | options.ca = this._ca;
|
798 | options.key = this._key;
|
799 | options.pfx = this._pfx;
|
800 | options.cert = this._cert;
|
801 | options.passphrase = this._passphrase;
|
802 | options.agent = this._agent;
|
803 | options.rejectUnauthorized = typeof this._disableTLSCerts === 'boolean' ? !this._disableTLSCerts : process.env.NODE_TLS_REJECT_UNAUTHORIZED !== '0'; // Allows request.get('https://1.2.3.4/').set('Host', 'example.com')
|
804 |
|
805 | if (this._header.host) {
|
806 | options.servername = this._header.host.replace(/:\d+$/, '');
|
807 | }
|
808 |
|
809 | if (this._trustLocalhost && /^(?:localhost|127\.0\.0\.\d+|(0*:)+:0*1)$/.test(url.hostname)) {
|
810 | options.rejectUnauthorized = false;
|
811 | } // initiate request
|
812 |
|
813 |
|
814 | var mod = this._enableHttp2 ? exports.protocols['http2:'].setProtocol(url.protocol) : exports.protocols[url.protocol]; // request
|
815 |
|
816 | this.req = mod.request(options);
|
817 | var req = this.req; // set tcp no delay
|
818 |
|
819 | req.setNoDelay(true);
|
820 |
|
821 | if (options.method !== 'HEAD') {
|
822 | req.setHeader('Accept-Encoding', 'gzip, deflate');
|
823 | }
|
824 |
|
825 | this.protocol = url.protocol;
|
826 | this.host = url.host; // expose events
|
827 |
|
828 | req.once('drain', function () {
|
829 | _this4.emit('drain');
|
830 | });
|
831 | req.on('error', function (error) {
|
832 | // flag abortion here for out timeouts
|
833 | // because node will emit a faux-error "socket hang up"
|
834 | // when request is aborted before a connection is made
|
835 | if (_this4._aborted) return; // if not the same, we are in the **old** (cancelled) request,
|
836 | // so need to continue (same as for above)
|
837 |
|
838 | if (_this4._retries !== retries) return; // if we've received a response then we don't want to let
|
839 | // an error in the request blow up the response
|
840 |
|
841 | if (_this4.response) return;
|
842 |
|
843 | _this4.callback(error);
|
844 | }); // auth
|
845 |
|
846 | if (url.auth) {
|
847 | var auth = url.auth.split(':');
|
848 | this.auth(auth[0], auth[1]);
|
849 | }
|
850 |
|
851 | if (this.username && this.password) {
|
852 | this.auth(this.username, this.password);
|
853 | }
|
854 |
|
855 | for (var key in this.header) {
|
856 | if (Object.prototype.hasOwnProperty.call(this.header, key)) req.setHeader(key, this.header[key]);
|
857 | } // add cookies
|
858 |
|
859 |
|
860 | if (this.cookies) {
|
861 | if (Object.prototype.hasOwnProperty.call(this._header, 'cookie')) {
|
862 | // merge
|
863 | var temporaryJar = new CookieJar.CookieJar();
|
864 | temporaryJar.setCookies(this._header.cookie.split(';'));
|
865 | temporaryJar.setCookies(this.cookies.split(';'));
|
866 | req.setHeader('Cookie', temporaryJar.getCookies(CookieJar.CookieAccessInfo.All).toValueString());
|
867 | } else {
|
868 | req.setHeader('Cookie', this.cookies);
|
869 | }
|
870 | }
|
871 |
|
872 | return req;
|
873 | };
|
874 | /**
|
875 | * Invoke the callback with `err` and `res`
|
876 | * and handle arity check.
|
877 | *
|
878 | * @param {Error} err
|
879 | * @param {Response} res
|
880 | * @api private
|
881 | */
|
882 |
|
883 |
|
884 | Request.prototype.callback = function (error, res) {
|
885 | if (this._shouldRetry(error, res)) {
|
886 | return this._retry();
|
887 | } // Avoid the error which is emitted from 'socket hang up' to cause the fn undefined error on JS runtime.
|
888 |
|
889 |
|
890 | var fn = this._callback || noop;
|
891 | this.clearTimeout();
|
892 | if (this.called) return console.warn('superagent: double callback bug');
|
893 | this.called = true;
|
894 |
|
895 | if (!error) {
|
896 | try {
|
897 | if (!this._isResponseOK(res)) {
|
898 | var message = 'Unsuccessful HTTP response';
|
899 |
|
900 | if (res) {
|
901 | message = http.STATUS_CODES[res.status] || message;
|
902 | }
|
903 |
|
904 | error = new Error(message);
|
905 | error.status = res ? res.status : undefined;
|
906 | }
|
907 | } catch (error_) {
|
908 | error = error_;
|
909 | }
|
910 | } // It's important that the callback is called outside try/catch
|
911 | // to avoid double callback
|
912 |
|
913 |
|
914 | if (!error) {
|
915 | return fn(null, res);
|
916 | }
|
917 |
|
918 | error.response = res;
|
919 | if (this._maxRetries) error.retries = this._retries - 1; // only emit error event if there is a listener
|
920 | // otherwise we assume the callback to `.end()` will get the error
|
921 |
|
922 | if (error && this.listeners('error').length > 0) {
|
923 | this.emit('error', error);
|
924 | }
|
925 |
|
926 | fn(error, res);
|
927 | };
|
928 | /**
|
929 | * Check if `obj` is a host object,
|
930 | *
|
931 | * @param {Object} obj host object
|
932 | * @return {Boolean} is a host object
|
933 | * @api private
|
934 | */
|
935 |
|
936 |
|
937 | Request.prototype._isHost = function (object) {
|
938 | return Buffer.isBuffer(object) || object instanceof Stream || object instanceof FormData;
|
939 | };
|
940 | /**
|
941 | * Initiate request, invoking callback `fn(err, res)`
|
942 | * with an instanceof `Response`.
|
943 | *
|
944 | * @param {Function} fn
|
945 | * @return {Request} for chaining
|
946 | * @api public
|
947 | */
|
948 |
|
949 |
|
950 | Request.prototype._emitResponse = function (body, files) {
|
951 | var response = new Response(this);
|
952 | this.response = response;
|
953 | response.redirects = this._redirectList;
|
954 |
|
955 | if (undefined !== body) {
|
956 | response.body = body;
|
957 | }
|
958 |
|
959 | response.files = files;
|
960 |
|
961 | if (this._endCalled) {
|
962 | response.pipe = function () {
|
963 | throw new Error("end() has already been called, so it's too late to start piping");
|
964 | };
|
965 | }
|
966 |
|
967 | this.emit('response', response);
|
968 | return response;
|
969 | };
|
970 |
|
971 | Request.prototype.end = function (fn) {
|
972 | this.request();
|
973 | debug('%s %s', this.method, this.url);
|
974 |
|
975 | if (this._endCalled) {
|
976 | throw new Error('.end() was called twice. This is not supported in superagent');
|
977 | }
|
978 |
|
979 | this._endCalled = true; // store callback
|
980 |
|
981 | this._callback = fn || noop;
|
982 |
|
983 | this._end();
|
984 | };
|
985 |
|
986 | Request.prototype._end = function () {
|
987 | var _this5 = this;
|
988 |
|
989 | if (this._aborted) return this.callback(new Error('The request has been aborted even before .end() was called'));
|
990 | var data = this._data;
|
991 | var req = this.req;
|
992 | var method = this.method;
|
993 |
|
994 | this._setTimeouts(); // body
|
995 |
|
996 |
|
997 | if (method !== 'HEAD' && !req._headerSent) {
|
998 | // serialize stuff
|
999 | if (typeof data !== 'string') {
|
1000 | var contentType = req.getHeader('Content-Type'); // Parse out just the content type from the header (ignore the charset)
|
1001 |
|
1002 | if (contentType) contentType = contentType.split(';')[0];
|
1003 | var serialize = this._serializer || exports.serialize[contentType];
|
1004 |
|
1005 | if (!serialize && isJSON(contentType)) {
|
1006 | serialize = exports.serialize['application/json'];
|
1007 | }
|
1008 |
|
1009 | if (serialize) data = serialize(data);
|
1010 | } // content-length
|
1011 |
|
1012 |
|
1013 | if (data && !req.getHeader('Content-Length')) {
|
1014 | req.setHeader('Content-Length', Buffer.isBuffer(data) ? data.length : Buffer.byteLength(data));
|
1015 | }
|
1016 | } // response
|
1017 | // eslint-disable-next-line complexity
|
1018 |
|
1019 |
|
1020 | req.once('response', function (res) {
|
1021 | debug('%s %s -> %s', _this5.method, _this5.url, res.statusCode);
|
1022 |
|
1023 | if (_this5._responseTimeoutTimer) {
|
1024 | clearTimeout(_this5._responseTimeoutTimer);
|
1025 | }
|
1026 |
|
1027 | if (_this5.piped) {
|
1028 | return;
|
1029 | }
|
1030 |
|
1031 | var max = _this5._maxRedirects;
|
1032 | var mime = utils.type(res.headers['content-type'] || '') || 'text/plain';
|
1033 | var type = mime.split('/')[0];
|
1034 | if (type) type = type.toLowerCase().trim();
|
1035 | var multipart = type === 'multipart';
|
1036 | var redirect = isRedirect(res.statusCode);
|
1037 | var responseType = _this5._responseType;
|
1038 | _this5.res = res; // redirect
|
1039 |
|
1040 | if (redirect && _this5._redirects++ !== max) {
|
1041 | return _this5._redirect(res);
|
1042 | }
|
1043 |
|
1044 | if (_this5.method === 'HEAD') {
|
1045 | _this5.emit('end');
|
1046 |
|
1047 | _this5.callback(null, _this5._emitResponse());
|
1048 |
|
1049 | return;
|
1050 | } // zlib support
|
1051 |
|
1052 |
|
1053 | if (_this5._shouldUnzip(res)) {
|
1054 | unzip(req, res);
|
1055 | }
|
1056 |
|
1057 | var buffer = _this5._buffer;
|
1058 |
|
1059 | if (buffer === undefined && mime in exports.buffer) {
|
1060 | buffer = Boolean(exports.buffer[mime]);
|
1061 | }
|
1062 |
|
1063 | var parser = _this5._parser;
|
1064 |
|
1065 | if (undefined === buffer && parser) {
|
1066 | console.warn("A custom superagent parser has been set, but buffering strategy for the parser hasn't been configured. Call `req.buffer(true or false)` or set `superagent.buffer[mime] = true or false`");
|
1067 | buffer = true;
|
1068 | }
|
1069 |
|
1070 | if (!parser) {
|
1071 | if (responseType) {
|
1072 | parser = exports.parse.image; // It's actually a generic Buffer
|
1073 |
|
1074 | buffer = true;
|
1075 | } else if (multipart) {
|
1076 | var form = formidable();
|
1077 | parser = form.parse.bind(form);
|
1078 | buffer = true;
|
1079 | } else if (isImageOrVideo(mime)) {
|
1080 | parser = exports.parse.image;
|
1081 | buffer = true; // For backwards-compatibility buffering default is ad-hoc MIME-dependent
|
1082 | } else if (exports.parse[mime]) {
|
1083 | parser = exports.parse[mime];
|
1084 | } else if (type === 'text') {
|
1085 | parser = exports.parse.text;
|
1086 | buffer = buffer !== false; // everyone wants their own white-labeled json
|
1087 | } else if (isJSON(mime)) {
|
1088 | parser = exports.parse['application/json'];
|
1089 | buffer = buffer !== false;
|
1090 | } else if (buffer) {
|
1091 | parser = exports.parse.text;
|
1092 | } else if (undefined === buffer) {
|
1093 | parser = exports.parse.image; // It's actually a generic Buffer
|
1094 |
|
1095 | buffer = true;
|
1096 | }
|
1097 | } // by default only buffer text/*, json and messed up thing from hell
|
1098 |
|
1099 |
|
1100 | if (undefined === buffer && isText(mime) || isJSON(mime)) {
|
1101 | buffer = true;
|
1102 | }
|
1103 |
|
1104 | _this5._resBuffered = buffer;
|
1105 | var parserHandlesEnd = false;
|
1106 |
|
1107 | if (buffer) {
|
1108 | // Protectiona against zip bombs and other nuisance
|
1109 | var responseBytesLeft = _this5._maxResponseSize || 200000000;
|
1110 | res.on('data', function (buf) {
|
1111 | responseBytesLeft -= buf.byteLength || buf.length > 0 ? buf.length : 0;
|
1112 |
|
1113 | if (responseBytesLeft < 0) {
|
1114 | // This will propagate through error event
|
1115 | var error = new Error('Maximum response size reached');
|
1116 | error.code = 'ETOOLARGE'; // Parsers aren't required to observe error event,
|
1117 | // so would incorrectly report success
|
1118 |
|
1119 | parserHandlesEnd = false; // Will not emit error event
|
1120 |
|
1121 | res.destroy(error); // so we do callback now
|
1122 |
|
1123 | _this5.callback(error, null);
|
1124 | }
|
1125 | });
|
1126 | }
|
1127 |
|
1128 | if (parser) {
|
1129 | try {
|
1130 | // Unbuffered parsers are supposed to emit response early,
|
1131 | // which is weird BTW, because response.body won't be there.
|
1132 | parserHandlesEnd = buffer;
|
1133 | parser(res, function (error, object, files) {
|
1134 | if (_this5.timedout) {
|
1135 | // Timeout has already handled all callbacks
|
1136 | return;
|
1137 | } // Intentional (non-timeout) abort is supposed to preserve partial response,
|
1138 | // even if it doesn't parse.
|
1139 |
|
1140 |
|
1141 | if (error && !_this5._aborted) {
|
1142 | return _this5.callback(error);
|
1143 | }
|
1144 |
|
1145 | if (parserHandlesEnd) {
|
1146 | _this5.emit('end');
|
1147 |
|
1148 | _this5.callback(null, _this5._emitResponse(object, files));
|
1149 | }
|
1150 | });
|
1151 | } catch (err) {
|
1152 | _this5.callback(err);
|
1153 |
|
1154 | return;
|
1155 | }
|
1156 | }
|
1157 |
|
1158 | _this5.res = res; // unbuffered
|
1159 |
|
1160 | if (!buffer) {
|
1161 | debug('unbuffered %s %s', _this5.method, _this5.url);
|
1162 |
|
1163 | _this5.callback(null, _this5._emitResponse());
|
1164 |
|
1165 | if (multipart) return; // allow multipart to handle end event
|
1166 |
|
1167 | res.once('end', function () {
|
1168 | debug('end %s %s', _this5.method, _this5.url);
|
1169 |
|
1170 | _this5.emit('end');
|
1171 | });
|
1172 | return;
|
1173 | } // terminating events
|
1174 |
|
1175 |
|
1176 | res.once('error', function (error) {
|
1177 | parserHandlesEnd = false;
|
1178 |
|
1179 | _this5.callback(error, null);
|
1180 | });
|
1181 | if (!parserHandlesEnd) res.once('end', function () {
|
1182 | debug('end %s %s', _this5.method, _this5.url); // TODO: unless buffering emit earlier to stream
|
1183 |
|
1184 | _this5.emit('end');
|
1185 |
|
1186 | _this5.callback(null, _this5._emitResponse());
|
1187 | });
|
1188 | });
|
1189 | this.emit('request', this);
|
1190 |
|
1191 | var getProgressMonitor = function getProgressMonitor() {
|
1192 | var lengthComputable = true;
|
1193 | var total = req.getHeader('Content-Length');
|
1194 | var loaded = 0;
|
1195 | var progress = new Stream.Transform();
|
1196 |
|
1197 | progress._transform = function (chunk, encoding, cb) {
|
1198 | loaded += chunk.length;
|
1199 |
|
1200 | _this5.emit('progress', {
|
1201 | direction: 'upload',
|
1202 | lengthComputable: lengthComputable,
|
1203 | loaded: loaded,
|
1204 | total: total
|
1205 | });
|
1206 |
|
1207 | cb(null, chunk);
|
1208 | };
|
1209 |
|
1210 | return progress;
|
1211 | };
|
1212 |
|
1213 | var bufferToChunks = function bufferToChunks(buffer) {
|
1214 | var chunkSize = 16 * 1024; // default highWaterMark value
|
1215 |
|
1216 | var chunking = new Stream.Readable();
|
1217 | var totalLength = buffer.length;
|
1218 | var remainder = totalLength % chunkSize;
|
1219 | var cutoff = totalLength - remainder;
|
1220 |
|
1221 | for (var i = 0; i < cutoff; i += chunkSize) {
|
1222 | var chunk = buffer.slice(i, i + chunkSize);
|
1223 | chunking.push(chunk);
|
1224 | }
|
1225 |
|
1226 | if (remainder > 0) {
|
1227 | var remainderBuffer = buffer.slice(-remainder);
|
1228 | chunking.push(remainderBuffer);
|
1229 | }
|
1230 |
|
1231 | chunking.push(null); // no more data
|
1232 |
|
1233 | return chunking;
|
1234 | }; // if a FormData instance got created, then we send that as the request body
|
1235 |
|
1236 |
|
1237 | var formData = this._formData;
|
1238 |
|
1239 | if (formData) {
|
1240 | // set headers
|
1241 | var headers = formData.getHeaders();
|
1242 |
|
1243 | for (var i in headers) {
|
1244 | if (Object.prototype.hasOwnProperty.call(headers, i)) {
|
1245 | debug('setting FormData header: "%s: %s"', i, headers[i]);
|
1246 | req.setHeader(i, headers[i]);
|
1247 | }
|
1248 | } // attempt to get "Content-Length" header
|
1249 |
|
1250 |
|
1251 | formData.getLength(function (error, length) {
|
1252 | // TODO: Add chunked encoding when no length (if err)
|
1253 | if (error) debug('formData.getLength had error', error, length);
|
1254 | debug('got FormData Content-Length: %s', length);
|
1255 |
|
1256 | if (typeof length === 'number') {
|
1257 | req.setHeader('Content-Length', length);
|
1258 | }
|
1259 |
|
1260 | formData.pipe(getProgressMonitor()).pipe(req);
|
1261 | });
|
1262 | } else if (Buffer.isBuffer(data)) {
|
1263 | bufferToChunks(data).pipe(getProgressMonitor()).pipe(req);
|
1264 | } else {
|
1265 | req.end(data);
|
1266 | }
|
1267 | }; // Check whether response has a non-0-sized gzip-encoded body
|
1268 |
|
1269 |
|
1270 | Request.prototype._shouldUnzip = function (res) {
|
1271 | if (res.statusCode === 204 || res.statusCode === 304) {
|
1272 | // These aren't supposed to have any body
|
1273 | return false;
|
1274 | } // header content is a string, and distinction between 0 and no information is crucial
|
1275 |
|
1276 |
|
1277 | if (res.headers['content-length'] === '0') {
|
1278 | // We know that the body is empty (unfortunately, this check does not cover chunked encoding)
|
1279 | return false;
|
1280 | } // console.log(res);
|
1281 |
|
1282 |
|
1283 | return /^\s*(?:deflate|gzip)\s*$/.test(res.headers['content-encoding']);
|
1284 | };
|
1285 | /**
|
1286 | * Overrides DNS for selected hostnames. Takes object mapping hostnames to IP addresses.
|
1287 | *
|
1288 | * When making a request to a URL with a hostname exactly matching a key in the object,
|
1289 | * use the given IP address to connect, instead of using DNS to resolve the hostname.
|
1290 | *
|
1291 | * A special host `*` matches every hostname (keep redirects in mind!)
|
1292 | *
|
1293 | * request.connect({
|
1294 | * 'test.example.com': '127.0.0.1',
|
1295 | * 'ipv6.example.com': '::1',
|
1296 | * })
|
1297 | */
|
1298 |
|
1299 |
|
1300 | Request.prototype.connect = function (connectOverride) {
|
1301 | if (typeof connectOverride === 'string') {
|
1302 | this._connectOverride = {
|
1303 | '*': connectOverride
|
1304 | };
|
1305 | } else if (_typeof(connectOverride) === 'object') {
|
1306 | this._connectOverride = connectOverride;
|
1307 | } else {
|
1308 | this._connectOverride = undefined;
|
1309 | }
|
1310 |
|
1311 | return this;
|
1312 | };
|
1313 |
|
1314 | Request.prototype.trustLocalhost = function (toggle) {
|
1315 | this._trustLocalhost = toggle === undefined ? true : toggle;
|
1316 | return this;
|
1317 | }; // generate HTTP verb methods
|
1318 |
|
1319 |
|
1320 | if (!methods.includes('del')) {
|
1321 | // create a copy so we don't cause conflicts with
|
1322 | // other packages using the methods package and
|
1323 | // npm 3.x
|
1324 | methods = _toConsumableArray(methods);
|
1325 | methods.push('del');
|
1326 | }
|
1327 |
|
1328 | var _iterator = _createForOfIteratorHelper(methods),
|
1329 | _step;
|
1330 |
|
1331 | try {
|
1332 | var _loop = function _loop() {
|
1333 | var method = _step.value;
|
1334 | var name = method;
|
1335 | method = method === 'del' ? 'delete' : method;
|
1336 | method = method.toUpperCase();
|
1337 |
|
1338 | request[name] = function (url, data, fn) {
|
1339 | var request_ = request(method, url);
|
1340 |
|
1341 | if (typeof data === 'function') {
|
1342 | fn = data;
|
1343 | data = null;
|
1344 | }
|
1345 |
|
1346 | if (data) {
|
1347 | if (method === 'GET' || method === 'HEAD') {
|
1348 | request_.query(data);
|
1349 | } else {
|
1350 | request_.send(data);
|
1351 | }
|
1352 | }
|
1353 |
|
1354 | if (fn) request_.end(fn);
|
1355 | return request_;
|
1356 | };
|
1357 | };
|
1358 |
|
1359 | for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
1360 | _loop();
|
1361 | }
|
1362 | /**
|
1363 | * Check if `mime` is text and should be buffered.
|
1364 | *
|
1365 | * @param {String} mime
|
1366 | * @return {Boolean}
|
1367 | * @api public
|
1368 | */
|
1369 |
|
1370 | } catch (err) {
|
1371 | _iterator.e(err);
|
1372 | } finally {
|
1373 | _iterator.f();
|
1374 | }
|
1375 |
|
1376 | function isText(mime) {
|
1377 | var parts = mime.split('/');
|
1378 | var type = parts[0];
|
1379 | if (type) type = type.toLowerCase().trim();
|
1380 | var subtype = parts[1];
|
1381 | if (subtype) subtype = subtype.toLowerCase().trim();
|
1382 | return type === 'text' || subtype === 'x-www-form-urlencoded';
|
1383 | }
|
1384 |
|
1385 | function isImageOrVideo(mime) {
|
1386 | var type = mime.split('/')[0];
|
1387 | if (type) type = type.toLowerCase().trim();
|
1388 | return type === 'image' || type === 'video';
|
1389 | }
|
1390 | /**
|
1391 | * Check if `mime` is json or has +json structured syntax suffix.
|
1392 | *
|
1393 | * @param {String} mime
|
1394 | * @return {Boolean}
|
1395 | * @api private
|
1396 | */
|
1397 |
|
1398 |
|
1399 | function isJSON(mime) {
|
1400 | // should match /json or +json
|
1401 | // but not /json-seq
|
1402 | return /[/+]json($|[^-\w])/i.test(mime);
|
1403 | }
|
1404 | /**
|
1405 | * Check if we should follow the redirect `code`.
|
1406 | *
|
1407 | * @param {Number} code
|
1408 | * @return {Boolean}
|
1409 | * @api private
|
1410 | */
|
1411 |
|
1412 |
|
1413 | function isRedirect(code) {
|
1414 | return [301, 302, 303, 305, 307, 308].includes(code);
|
1415 | }
|
1416 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ub2RlL2luZGV4LmpzIl0sIm5hbWVzIjpbInJlcXVpcmUiLCJwYXJzZSIsImZvcm1hdCIsInJlc29sdmUiLCJTdHJlYW0iLCJodHRwcyIsImh0dHAiLCJmcyIsInpsaWIiLCJ1dGlsIiwicXMiLCJtaW1lIiwibWV0aG9kcyIsIkZvcm1EYXRhIiwiZm9ybWlkYWJsZSIsImRlYnVnIiwiQ29va2llSmFyIiwic2VtdmVyR3RlIiwic2FmZVN0cmluZ2lmeSIsInV0aWxzIiwiUmVxdWVzdEJhc2UiLCJ1bnppcCIsIlJlc3BvbnNlIiwiaHR0cDIiLCJwcm9jZXNzIiwidmVyc2lvbiIsInJlcXVlc3QiLCJtZXRob2QiLCJ1cmwiLCJleHBvcnRzIiwiUmVxdWVzdCIsImVuZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsIm1vZHVsZSIsImFnZW50Iiwibm9vcCIsImRlZmluZSIsInByb3RvY29scyIsInNlcmlhbGl6ZSIsInN0cmluZ2lmeSIsImJ1ZmZlciIsIl9pbml0SGVhZGVycyIsInJlcXVlc3RfIiwiX2hlYWRlciIsImhlYWRlciIsImNhbGwiLCJfZW5hYmxlSHR0cDIiLCJCb29sZWFuIiwiZW52IiwiSFRUUDJfVEVTVCIsIl9hZ2VudCIsIl9mb3JtRGF0YSIsIndyaXRhYmxlIiwiX3JlZGlyZWN0cyIsInJlZGlyZWN0cyIsImNvb2tpZXMiLCJfcXVlcnkiLCJxc1JhdyIsIl9yZWRpcmVjdExpc3QiLCJfc3RyZWFtUmVxdWVzdCIsIm9uY2UiLCJjbGVhclRpbWVvdXQiLCJiaW5kIiwiaW5oZXJpdHMiLCJwcm90b3R5cGUiLCJib29sIiwidW5kZWZpbmVkIiwiRXJyb3IiLCJhdHRhY2giLCJmaWVsZCIsImZpbGUiLCJvcHRpb25zIiwiX2RhdGEiLCJvIiwiZmlsZW5hbWUiLCJjcmVhdGVSZWFkU3RyZWFtIiwib24iLCJlcnJvciIsImZvcm1EYXRhIiwiX2dldEZvcm1EYXRhIiwiZW1pdCIsInBhdGgiLCJhcHBlbmQiLCJjYWxsZWQiLCJjYWxsYmFjayIsImFib3J0IiwidHlwZSIsInNldCIsImluY2x1ZGVzIiwiZ2V0VHlwZSIsImFjY2VwdCIsInF1ZXJ5IiwidmFsdWUiLCJwdXNoIiwiT2JqZWN0IiwiYXNzaWduIiwid3JpdGUiLCJkYXRhIiwiZW5jb2RpbmciLCJwaXBlIiwic3RyZWFtIiwicGlwZWQiLCJfcGlwZUNvbnRpbnVlIiwicmVxIiwicmVzIiwiaXNSZWRpcmVjdCIsInN0YXR1c0NvZGUiLCJfbWF4UmVkaXJlY3RzIiwiX3JlZGlyZWN0IiwiX2VtaXRSZXNwb25zZSIsIl9hYm9ydGVkIiwiX3Nob3VsZFVuemlwIiwidW56aXBPYmplY3QiLCJjcmVhdGVVbnppcCIsImNvZGUiLCJfYnVmZmVyIiwiaGVhZGVycyIsImxvY2F0aW9uIiwicmVzdW1lIiwiZ2V0SGVhZGVycyIsIl9oZWFkZXJzIiwiY2hhbmdlc09yaWdpbiIsImhvc3QiLCJjbGVhbkhlYWRlciIsIl9lbmRDYWxsZWQiLCJfY2FsbGJhY2siLCJhdXRoIiwidXNlciIsInBhc3MiLCJlbmNvZGVyIiwic3RyaW5nIiwiQnVmZmVyIiwiZnJvbSIsInRvU3RyaW5nIiwiX2F1dGgiLCJjYSIsImNlcnQiLCJfY2EiLCJrZXkiLCJfa2V5IiwicGZ4IiwiaXNCdWZmZXIiLCJfcGZ4IiwiX3Bhc3NwaHJhc2UiLCJwYXNzcGhyYXNlIiwiX2NlcnQiLCJkaXNhYmxlVExTQ2VydHMiLCJfZGlzYWJsZVRMU0NlcnRzIiwiaW5kaWNlcyIsInN0cmljdE51bGxIYW5kbGluZyIsIl9maW5hbGl6ZVF1ZXJ5U3RyaW5nIiwiZXJyIiwicmV0cmllcyIsIl9yZXRyaWVzIiwicXVlcnlTdHJpbmdCYWNrdGlja3MiLCJxdWVyeVN0YXJ0SW5kZXgiLCJpbmRleE9mIiwicXVlcnlTdHJpbmciLCJzbGljZSIsIm1hdGNoIiwiaSIsInJlcGxhY2UiLCJzZWFyY2giLCJwYXRobmFtZSIsInRlc3QiLCJwcm90b2NvbCIsInNwbGl0IiwidW5peFBhcnRzIiwic29ja2V0UGF0aCIsIl9jb25uZWN0T3ZlcnJpZGUiLCJob3N0bmFtZSIsIm5ld0hvc3QiLCJuZXdQb3J0IiwicG9ydCIsInJlamVjdFVuYXV0aG9yaXplZCIsIk5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQiLCJzZXJ2ZXJuYW1lIiwiX3RydXN0TG9jYWxob3N0IiwibW9kIiwic2V0UHJvdG9jb2wiLCJzZXROb0RlbGF5Iiwic2V0SGVhZGVyIiwicmVzcG9uc2UiLCJ1c2VybmFtZSIsInBhc3N3b3JkIiwiaGFzT3duUHJvcGVydHkiLCJ0ZW1wb3JhcnlKYXIiLCJzZXRDb29raWVzIiwiY29va2llIiwiZ2V0Q29va2llcyIsIkNvb2tpZUFjY2Vzc0luZm8iLCJBbGwiLCJ0b1ZhbHVlU3RyaW5nIiwiX3Nob3VsZFJldHJ5IiwiX3JldHJ5IiwiZm4iLCJjb25zb2xlIiwid2FybiIsIl9pc1Jlc3BvbnNlT0siLCJtZXNzYWdlIiwiU1RBVFVTX0NPREVTIiwic3RhdHVzIiwiZXJyb3JfIiwiX21heFJldHJpZXMiLCJsaXN0ZW5lcnMiLCJfaXNIb3N0Iiwib2JqZWN0IiwiYm9keSIsImZpbGVzIiwiX2VuZCIsIl9zZXRUaW1lb3V0cyIsIl9oZWFkZXJTZW50IiwiY29udGVudFR5cGUiLCJnZXRIZWFkZXIiLCJfc2VyaWFsaXplciIsImlzSlNPTiIsImJ5dGVMZW5ndGgiLCJfcmVzcG9uc2VUaW1lb3V0VGltZXIiLCJtYXgiLCJ0b0xvd2VyQ2FzZSIsInRyaW0iLCJtdWx0aXBhcnQiLCJyZWRpcmVjdCIsInJlc3BvbnNlVHlwZSIsIl9yZXNwb25zZVR5cGUiLCJwYXJzZXIiLCJfcGFyc2VyIiwiaW1hZ2UiLCJmb3JtIiwiaXNJbWFnZU9yVmlkZW8iLCJ0ZXh0IiwiaXNUZXh0IiwiX3Jlc0J1ZmZlcmVkIiwicGFyc2VySGFuZGxlc0VuZCIsInJlc3BvbnNlQnl0ZXNMZWZ0IiwiX21heFJlc3BvbnNlU2l6ZSIsImJ1ZiIsImRlc3Ryb3kiLCJ0aW1lZG91dCIsImdldFByb2dyZXNzTW9uaXRvciIsImxlbmd0aENvbXB1dGFibGUiLCJ0b3RhbCIsImxvYWRlZCIsInByb2dyZXNzIiwiVHJhbnNmb3JtIiwiX3RyYW5zZm9ybSIsImNodW5rIiwiY2IiLCJkaXJlY3Rpb24iLCJidWZmZXJUb0NodW5rcyIsImNodW5rU2l6ZSIsImNodW5raW5nIiwiUmVhZGFibGUiLCJ0b3RhbExlbmd0aCIsInJlbWFpbmRlciIsImN1dG9mZiIsInJlbWFpbmRlckJ1ZmZlciIsImdldExlbmd0aCIsImNvbm5lY3QiLCJjb25uZWN0T3ZlcnJpZGUiLCJ0cnVzdExvY2FsaG9zdCIsInRvZ2dsZSIsIm5hbWUiLCJ0b1VwcGVyQ2FzZSIsInNlbmQiLCJwYXJ0cyIsInN1YnR5cGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0EsZUFBbUNBLE9BQU8sQ0FBQyxLQUFELENBQTFDO0FBQUEsSUFBUUMsS0FBUixZQUFRQSxLQUFSO0FBQUEsSUFBZUMsTUFBZixZQUFlQSxNQUFmO0FBQUEsSUFBdUJDLE9BQXZCLFlBQXVCQSxPQUF2Qjs7QUFDQSxJQUFNQyxNQUFNLEdBQUdKLE9BQU8sQ0FBQyxRQUFELENBQXRCOztBQUNBLElBQU1LLEtBQUssR0FBR0wsT0FBTyxDQUFDLE9BQUQsQ0FBckI7O0FBQ0EsSUFBTU0sSUFBSSxHQUFHTixPQUFPLENBQUMsTUFBRCxDQUFwQjs7QUFDQSxJQUFNTyxFQUFFLEdBQUdQLE9BQU8sQ0FBQyxJQUFELENBQWxCOztBQUNBLElBQU1RLElBQUksR0FBR1IsT0FBTyxDQUFDLE1BQUQsQ0FBcEI7O0FBQ0EsSUFBTVMsSUFBSSxHQUFHVCxPQUFPLENBQUMsTUFBRCxDQUFwQjs7QUFDQSxJQUFNVSxFQUFFLEdBQUdWLE9BQU8sQ0FBQyxJQUFELENBQWxCOztBQUNBLElBQU1XLElBQUksR0FBR1gsT0FBTyxDQUFDLE1BQUQsQ0FBcEI7O0FBQ0EsSUFBSVksT0FBTyxHQUFHWixPQUFPLENBQUMsU0FBRCxDQUFyQjs7QUFDQSxJQUFNYSxRQUFRLEdBQUdiLE9BQU8sQ0FBQyxXQUFELENBQXhCOztBQUNBLElBQU1jLFVBQVUs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QUssT0FBcEM7QUFDRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQSxTQUFTaUksTUFBVCxDQUFnQjdNLElBQWhCLEVBQXNCO0FBQ3BCO0FBQ0E7QUFDQSxTQUFPLHNCQUFzQjBKLElBQXRCLENBQTJCMUosSUFBM0IsQ0FBUDtBQUNEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBLFNBQVMrRixVQUFULENBQW9CUyxJQUFwQixFQUEwQjtBQUN4QixTQUFPLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBVyxHQUFYLEVBQWdCLEdBQWhCLEVBQXFCLEdBQXJCLEVBQTBCLEdBQTFCLEVBQStCMUIsUUFBL0IsQ0FBd0MwQixJQUF4QyxDQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGlcbmNvbnN0IHsgcGFyc2UsIGZvcm1hdCwgcmVzb2x2ZSB9ID0gcmVxdWlyZSgndXJsJyk7XG5jb25zdCBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbmNvbnN0IGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKTtcbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCB6bGliID0gcmVxdWlyZSgnemxpYicpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbmNvbnN0IHFzID0gcmVxdWlyZSgncXMnKTtcbmNvbnN0IG1pbWUgPSByZXF1aXJlKCdtaW1lJyk7XG5sZXQgbWV0aG9kcyA9IHJlcXVpcmUoJ21ldGhvZHMnKTtcbmNvbnN0IEZvcm1EYXRhID0gcmVxdWlyZSgnZm9ybS1kYXRhJyk7XG5jb25zdCBmb3JtaWRhYmxlID0gcmVxdWlyZSgnZm9ybWlkYWJsZScpO1xuY29uc3QgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdzdXBlcmFnZW50Jyk7XG5jb25zdCBDb29raWVKYXIgPSByZXF1aXJlKCdjb29raWVqYXInKTtcbmNvbnN0IHNlbXZlckd0ZSA9IHJlcXVpcmUoJ3NlbXZlci9mdW5jdGlvbnMvZ3RlJyk7XG5jb25zdCBzYWZlU3RyaW5naWZ5ID0gcmVxdWlyZSgnZmFzdC1zYWZlLXN0cmluZ2lmeScpO1xuXG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5jb25zdCBSZXF1ZXN0QmFzZSA9IHJlcXVpcmUoJy4uL3JlcXVlc3QtYmFzZScpO1xuY29uc3QgeyB1bnppcCB9ID0gcmVxdWlyZSgnLi91bnppcCcpO1xuY29uc3QgUmVzcG9uc2UgPSByZXF1aXJlKCcuL3Jlc3BvbnNlJyk7XG5cbmxldCBodHRwMjtcblxuaWYgKHNlbXZlckd0ZShwcm9jZXNzLnZlcnNpb24sICd2MTAuMTAuMCcpKSBodHRwMiA9IHJlcXVpcmUoJy4vaHR0cDJ3cmFwcGVyJyk7XG5cbmZ1bmN0aW9uIHJlcXVlc3QobWV0aG9kLCB1cmwpIHtcbiAgLy8gY2FsbGJhY2tcbiAgaWYgKHR5cGVvZiB1cmwgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbmV3IGV4cG9ydHMuUmVxdWVzdCgnR0VUJywgbWV0aG9kKS5lbmQodXJsKTtcbiAgfVxuXG4gIC8vIHVybCBmaXJzdFxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBuZXcgZXhwb3J0cy5SZXF1ZXN0KCdHRVQnLCBtZXRob2QpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBleHBvcnRzLlJlcXVlc3QobWV0aG9kLCB1cmwpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVlc3Q7XG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogRXhwb3NlIGBSZXF1ZXN0YC5cbiAqL1xuXG5leHBvcnRzLlJlcXVlc3QgPSBSZXF1ZXN0O1xuXG4vKipcbiAqIEV4cG9zZSB0aGUgYWdlbnQgZnVuY3Rpb25cbiAqL1xuXG5leHBvcnRzLmFnZW50ID0gcmVxdWlyZSgnLi9hZ2VudCcpO1xuXG4vKipcbiAqIE5vb3AuXG4gKi9cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbi8qKlxuICogRXhwb3NlIGBSZXNwb25zZWAuXG4gKi9cblxuZXhwb3J0cy5SZXNwb25zZSA9IFJlc3BvbnNlO1xuXG4vKipcbiAqIERlZmluZSBcImZvcm1cIiBtaW1lIHR5cGUuXG4gKi9cblxubWltZS5kZWZpbmUoXG4gIHtcbiAgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzogWydmb3JtJywgJ3VybGVuY29kZWQnLCAnZm9ybS1kYXRhJ11cbiAgfSxcbiAgdHJ1ZVxuKTtcblxuLyoqXG4gKiBQcm90b2NvbCBtYXAuXG4gKi9cblxuZXhwb3J0cy5wcm90b2NvbHMgPSB7XG4gICdodHRwOic6IGh0dHAsXG4gICdodHRwczonOiBodHRwcyxcbiAgJ2h0dHAyOic6IGh0dHAyXG59O1xuXG4vKipcbiAqIERlZmF1bHQgc2VyaWFsaXphdGlvbiBtYXAuXG4gKlxuICogICAgIHN1cGVyYWdlbnQuc2VyaWFsaXplWydhcHBsaWNhdGlvbi94bWwnXSA9IGZ1bmN0aW9uKG9iail7XG4gKiAgICAgICByZXR1cm4gJ2dlbmVyYXRlZCB4bWwgaGVyZSc7XG4gKiAgICAgfTtcbiAqXG4gKi9cblxuZXhwb3J0cy5zZXJpYWxpemUgPSB7XG4gICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOiBxcy5zdHJpbmdpZnksXG4gICdhcHBsaWNhdGlvbi9qc29uJzogc2FmZVN0cmluZ2lmeVxufTtcblxuLyoqXG4gKiBEZWZhdWx0IHBhcnNlcnMuXG4gKlxuICogICAgIHN1cGVyYWdlbnQucGFyc2VbJ2FwcGxpY2F0aW9uL3htbCddID0gZnVuY3Rpb24ocmVzLCBmbil7XG4gKiAgICAgICBmbihudWxsLCByZXMpO1xuICogICAgIH07XG4gKlxuICovXG5cbmV4cG9ydHMucGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlcnMnKTtcblxuLyoqXG4gKiBEZWZhdWx0IGJ1ZmZlcmluZyBtYXAuIENhbiBiZSB1c2VkIHRvIHNldCBjZXJ0YWluXG4gKiByZXNwb25zZSB0eXBlcyB0byBidWZmZXIvbm90IGJ1ZmZlci5cbiAqXG4gKiAgICAgc3VwZXJhZ2VudC5idWZmZXJbJ2FwcGxpY2F0aW9uL3htbCddID0gdHJ1ZTtcbiAqL1xuZXhwb3J0cy5idWZmZXIgPSB7fTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGludGVybmFsIGhlYWRlciB0cmFja2luZyBwcm9wZXJ0aWVzIG9uIGEgcmVxdWVzdCBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcmVxIHRoZSBpbnN0YW5jZVxuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9pbml0SGVhZGVycyhyZXF1ZXN0Xykge1xuICByZXF1ZXN0Xy5faGVhZGVyID0ge1xuICAgIC8vIGNvZXJjZXMgaGVhZGVyIG5hbWVzIHRvIGxvd2VyY2FzZVxuICB9O1xuICByZXF1ZXN0Xy5oZWFkZXIgPSB7XG4gICAgLy8gcHJlc2VydmVzIGhlYWRlciBuYW1lIGNhc2VcbiAgfTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBSZXF1ZXN0YCB3aXRoIHRoZSBnaXZlbiBgbWV0aG9kYCBhbmQgYHVybGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZFxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSB1cmxcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gUmVxdWVzdChtZXRob2QsIHVybCkge1xuICBTdHJlYW0uY2FsbCh0aGlzKTtcbiAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB1cmwgPSBmb3JtYXQodXJsKTtcbiAgdGhpcy5fZW5hYmxlSHR0cDIgPSBCb29sZWFuKHByb2Nlc3MuZW52LkhUVFAyX1RFU1QpOyAvLyBpbnRlcm5hbCBvbmx5XG4gIHRoaXMuX2FnZW50ID0gZmFsc2U7XG4gIHRoaXMuX2Zvcm1EYXRhID0gbnVsbDtcbiAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gIHRoaXMudXJsID0gdXJsO1xuICBfaW5pdEhlYWRlcnModGhpcyk7XG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuICB0aGlzLl9yZWRpcmVjdHMgPSAwO1xuICB0aGlzLnJlZGlyZWN0cyhtZXRob2QgPT09ICdIRUFEJyA/IDAgOiA1KTtcbiAgdGhpcy5jb29raWVzID0gJyc7XG4gIHRoaXMucXMgPSB7fTtcbiAgdGhpcy5fcXVlcnkgPSBbXTtcbiAgdGhpcy5xc1JhdyA9IHRoaXMuX3F1ZXJ5OyAvLyBVbnVzZWQsIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5XG4gIHRoaXMuX3JlZGlyZWN0TGlzdCA9IFtdO1xuICB0aGlzLl9zdHJlYW1SZXF1ZXN0ID0gZmFsc2U7XG4gIHRoaXMub25jZSgnZW5kJywgdGhpcy5jbGVhclRpbWVvdXQuYmluZCh0aGlzKSk7XG59XG5cbi8qKlxuICogSW5oZXJpdCBmcm9tIGBTdHJlYW1gICh3aGljaCBpbmhlcml0cyBmcm9tIGBFdmVudEVtaXR0ZXJgKS5cbiAqIE1peGluIGBSZXF1ZXN0QmFzZWAuXG4gKi9cbnV0aWwuaW5oZXJpdHMoUmVxdWVzdCwgU3RyZWFtKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG5SZXF1ZXN0QmFzZShSZXF1ZXN0LnByb3RvdHlwZSk7XG5cbi8qKlxuICogRW5hYmxlIG9yIERpc2FibGUgaHR0cDIuXG4gKlxuICogRW5hYmxlIGh0dHAyLlxuICpcbiAqIGBgYCBqc1xuICogcmVxdWVzdC5nZXQoJ2h0dHA6Ly9sb2NhbGhvc3QvJylcbiAqICAgLmh0dHAyKClcbiAqICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogcmVxdWVzdC5nZXQoJ2h0dHA6Ly9sb2NhbGhvc3QvJylcbiAqICAgLmh0dHAyKHRydWUpXG4gKiAgIC5lbmQoY2FsbGJhY2spO1xuICogYGBgXG4gKlxuICogRGlzYWJsZSBodHRwMi5cbiAqXG4gKiBgYGAganNcbiAqIHJlcXVlc3QgPSByZXF1ZXN0Lmh0dHAyKCk7XG4gKiByZXF1ZXN0LmdldCgnaHR0cDovL2xvY2FsaG9zdC8nKVxuICogICAuaHR0cDIoZmFsc2UpXG4gKiAgIC5lbmQoY2FsbGJhY2spO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5odHRwMiA9IGZ1bmN0aW9uIChib29sKSB7XG4gIGlmIChleHBvcnRzLnByb3RvY29sc1snaHR0cDI6J10gPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdzdXBlcmFnZW50OiB0aGlzIHZlcnNpb24gb2YgTm9kZS5qcyBkb2VzIG5vdCBzdXBwb3J0IGh0dHAyJ1xuICAgICk7XG4gIH1cblxuICB0aGlzLl9lbmFibGVIdHRwMiA9IGJvb2wgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBib29sO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUXVldWUgdGhlIGdpdmVuIGBmaWxlYCBhcyBhbiBhdHRhY2htZW50IHRvIHRoZSBzcGVjaWZpZWQgYGZpZWxkYCxcbiAqIHdpdGggb3B0aW9uYWwgYG9wdGlvbnNgIChvciBmaWxlbmFtZSkuXG4gKlxuICogYGBgIGpzXG4gKiByZXF1ZXN0LnBvc3QoJ2h0dHA6Ly9sb2NhbGhvc3QvdXBsb2FkJylcbiAqICAgLmF0dGFjaCgnZmllbGQnLCBCdWZmZXIuZnJvbSgnPGI+SGVsbG8gd29ybGQ8L2I+JyksICdoZWxsby5odG1sJylcbiAqICAgLmVuZChjYWxsYmFjayk7XG4gKiBgYGBcbiAqXG4gKiBBIGZpbGVuYW1lIG1heSBhbHNvIGJlIHVzZWQ6XG4gKlxuICogYGBgIGpzXG4gKiByZXF1ZXN0LnBvc3QoJ2h0dHA6Ly9sb2NhbGhvc3QvdXBsb2FkJylcbiAqICAgLmF0dGFjaCgnZmlsZXMnLCAnaW1hZ2UuanBnJylcbiAqICAgLmVuZChjYWxsYmFjayk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGRcbiAqIEBwYXJhbSB7U3RyaW5nfGZzLlJlYWRTdHJlYW18QnVmZmVyfSBmaWxlXG4gKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5hdHRhY2ggPSBmdW5jdGlvbiAoZmllbGQsIGZpbGUsIG9wdGlvbnMpIHtcbiAgaWYgKGZpbGUpIHtcbiAgICBpZiAodGhpcy5fZGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic3VwZXJhZ2VudCBjYW4ndCBtaXggLnNlbmQoKSBhbmQgLmF0dGFjaCgpXCIpO1xuICAgIH1cblxuICAgIGxldCBvID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBvID0geyBmaWxlbmFtZTogb3B0aW9ucyB9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZmlsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICghby5maWxlbmFtZSkgby5maWxlbmFtZSA9IGZpbGU7XG4gICAgICBkZWJ1ZygnY3JlYXRpbmcgYGZzLlJlYWRTdHJlYW1gIGluc3RhbmNlIGZvciBmaWxlOiAlcycsIGZpbGUpO1xuICAgICAgZmlsZSA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0oZmlsZSk7XG4gICAgICBmaWxlLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMuX2dldEZvcm1EYXRhKCk7XG4gICAgICAgIGZvcm1EYXRhLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghby5maWxlbmFtZSAmJiBmaWxlLnBhdGgpIHtcbiAgICAgIG8uZmlsZW5hbWUgPSBmaWxlLnBhdGg7XG4gICAgfVxuXG4gICAgdGhpcy5fZ2V0Rm9ybURhdGEoKS5hcHBlbmQoZmllbGQsIGZpbGUsIG8pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fZ2V0Rm9ybURhdGEgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5fZm9ybURhdGEpIHtcbiAgICB0aGlzLl9mb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIHRoaXMuX2Zvcm1EYXRhLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgZGVidWcoJ0Zvcm1EYXRhIGVycm9yJywgZXJyb3IpO1xuICAgICAgaWYgKHRoaXMuY2FsbGVkKSB7XG4gICAgICAgIC8vIFRoZSByZXF1ZXN0IGhhcyBhbHJlYWR5IGZpbmlzaGVkIGFuZCB0aGUgY2FsbGJhY2sgd2FzIGNhbGxlZC5cbiAgICAgICAgLy8gU2lsZW50bHkgaWdub3JlIHRoZSBlcnJvci5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNhbGxiYWNrKGVycm9yKTtcbiAgICAgIHRoaXMuYWJvcnQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9mb3JtRGF0YTtcbn07XG5cbi8qKlxuICogR2V0cy9zZXRzIHRoZSBgQWdlbnRgIHRvIHVzZSBmb3IgdGhpcyBIVFRQIHJlcXVlc3QuIFRoZSBkZWZhdWx0IChpZiB0aGlzXG4gKiBmdW5jdGlvbiBpcyBub3QgY2FsbGVkKSBpcyB0byBvcHQgb3V0IG9mIGNvbm5lY3Rpb24gcG9vbGluZyAoYGFnZW50OiBmYWxzZWApLlxuICpcbiAqIEBwYXJhbSB7aHR0cC5BZ2VudH0gYWdlbnRcbiAqIEByZXR1cm4ge2h0dHAuQWdlbnR9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmFnZW50ID0gZnVuY3Rpb24gKGFnZW50KSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5fYWdlbnQ7XG4gIHRoaXMuX2FnZW50ID0gYWdlbnQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgX0NvbnRlbnQtVHlwZV8gcmVzcG9uc2UgaGVhZGVyIHBhc3NlZCB0aHJvdWdoIGBtaW1lLmdldFR5cGUoKWAuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICByZXF1ZXN0LnBvc3QoJy8nKVxuICogICAgICAgIC50eXBlKCd4bWwnKVxuICogICAgICAgIC5zZW5kKHhtbHN0cmluZylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiAgICAgIHJlcXVlc3QucG9zdCgnLycpXG4gKiAgICAgICAgLnR5cGUoJ2pzb24nKVxuICogICAgICAgIC5zZW5kKGpzb25zdHJpbmcpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogICAgICByZXF1ZXN0LnBvc3QoJy8nKVxuICogICAgICAgIC50eXBlKCdhcHBsaWNhdGlvbi9qc29uJylcbiAqICAgICAgICAuc2VuZChqc29uc3RyaW5nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUudHlwZSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gIHJldHVybiB0aGlzLnNldChcbiAgICAnQ29udGVudC1UeXBlJyxcbiAgICB0eXBlLmluY2x1ZGVzKCcvJykgPyB0eXBlIDogbWltZS5nZXRUeXBlKHR5cGUpXG4gICk7XG59O1xuXG4vKipcbiAqIFNldCBfQWNjZXB0XyByZXNwb25zZSBoZWFkZXIgcGFzc2VkIHRocm91Z2ggYG1pbWUuZ2V0VHlwZSgpYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHN1cGVyYWdlbnQudHlwZXMuanNvbiA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAqXG4gKiAgICAgIHJlcXVlc3QuZ2V0KCcvYWdlbnQnKVxuICogICAgICAgIC5hY2NlcHQoJ2pzb24nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxdWVzdC5nZXQoJy9hZ2VudCcpXG4gKiAgICAgICAgLmFjY2VwdCgnYXBwbGljYXRpb24vanNvbicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2VwdFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmFjY2VwdCA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gIHJldHVybiB0aGlzLnNldCgnQWNjZXB0JywgdHlwZS5pbmNsdWRlcygnLycpID8gdHlwZSA6IG1pbWUuZ2V0VHlwZSh0eXBlKSk7XG59O1xuXG4vKipcbiAqIEFkZCBxdWVyeS1zdHJpbmcgYHZhbGAuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICByZXF1ZXN0LmdldCgnL3Nob2VzJylcbiAqICAgICAucXVlcnkoJ3NpemU9MTAnKVxuICogICAgIC5xdWVyeSh7IGNvbG9yOiAnYmx1ZScgfSlcbiAqXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZhbFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhpcy5fcXVlcnkucHVzaCh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLnFzLCB2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogV3JpdGUgcmF3IGBkYXRhYCAvIGBlbmNvZGluZ2AgdG8gdGhlIHNvY2tldC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcnxTdHJpbmd9IGRhdGFcbiAqIEBwYXJhbSB7U3RyaW5nfSBlbmNvZGluZ1xuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoZGF0YSwgZW5jb2RpbmcpIHtcbiAgY29uc3QgcmVxdWVzdF8gPSB0aGlzLnJlcXVlc3QoKTtcbiAgaWYgKCF0aGlzLl9zdHJlYW1SZXF1ZXN0KSB7XG4gICAgdGhpcy5fc3RyZWFtUmVxdWVzdCA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gcmVxdWVzdF8ud3JpdGUoZGF0YSwgZW5jb2RpbmcpO1xufTtcblxuLyoqXG4gKiBQaXBlIHRoZSByZXF1ZXN0IGJvZHkgdG8gYHN0cmVhbWAuXG4gKlxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1N0cmVhbX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uIChzdHJlYW0sIG9wdGlvbnMpIHtcbiAgdGhpcy5waXBlZCA9IHRydWU7IC8vIEhBQ0suLi5cbiAgdGhpcy5idWZmZXIoZmFsc2UpO1xuICB0aGlzLmVuZCgpO1xuICByZXR1cm4gdGhpcy5fcGlwZUNvbnRpbnVlKHN0cmVhbSwgb3B0aW9ucyk7XG59O1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fcGlwZUNvbnRpbnVlID0gZnVuY3Rpb24gKHN0cmVhbSwgb3B0aW9ucykge1xuICB0aGlzLnJlcS5vbmNlKCdyZXNwb25zZScsIChyZXMpID0+IHtcbiAgICAvLyByZWRpcmVjdFxuICAgIGlmIChcbiAgICAgIGlzUmVkaXJlY3QocmVzLnN0YXR1c0NvZGUpICYmXG4gICAgICB0aGlzLl9yZWRpcmVjdHMrKyAhPT0gdGhpcy5fbWF4UmVkaXJlY3RzXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVkaXJlY3QocmVzKSA9PT0gdGhpc1xuICAgICAgICA/IHRoaXMuX3BpcGVDb250aW51ZShzdHJlYW0sIG9wdGlvbnMpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMucmVzID0gcmVzO1xuICAgIHRoaXMuX2VtaXRSZXNwb25zZSgpO1xuICAgIGlmICh0aGlzLl9hYm9ydGVkKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5fc2hvdWxkVW56aXAocmVzKSkge1xuICAgICAgY29uc3QgdW56aXBPYmplY3QgPSB6bGliLmNyZWF0ZVVuemlwKCk7XG4gICAgICB1bnppcE9iamVjdC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdaX0JVRl9FUlJPUicpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIGlzIGlnbm9yZWQgYnkgYnJvd3NlcnMgYW5kIGN1cmxcbiAgICAgICAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgfSk7XG4gICAgICByZXMucGlwZSh1bnppcE9iamVjdCkucGlwZShzdHJlYW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMucGlwZShzdHJlYW0sIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJlcy5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHN0cmVhbTtcbn07XG5cbi8qKlxuICogRW5hYmxlIC8gZGlzYWJsZSBidWZmZXJpbmcuXG4gKlxuICogQHJldHVybiB7Qm9vbGVhbn0gW3ZhbF1cbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5idWZmZXIgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdGhpcy5fYnVmZmVyID0gdmFsdWUgIT09IGZhbHNlO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVkaXJlY3QgdG8gYHVybFxuICpcbiAqIEBwYXJhbSB7SW5jb21pbmdNZXNzYWdlfSByZXNcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuX3JlZGlyZWN0ID0gZnVuY3Rpb24gKHJlcykge1xuICBsZXQgdXJsID0gcmVzLmhlYWRlcnMubG9jYXRpb247XG4gIGlmICghdXJsKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbGJhY2sobmV3IEVycm9yKCdObyBsb2NhdGlvbiBoZWFkZXIgZm9yIHJlZGlyZWN0JyksIHJlcyk7XG4gIH1cblxuICBkZWJ1ZygncmVkaXJlY3QgJXMgLT4gJXMnLCB0aGlzLnVybCwgdXJsKTtcblxuICAvLyBsb2NhdGlvblxuICB1cmwgPSByZXNvbHZlKHRoaXMudXJsLCB1cmwpO1xuXG4gIC8vIGVuc3VyZSB0aGUgcmVzcG9uc2UgaXMgYmVpbmcgY29uc3VtZWRcbiAgLy8gdGhpcyBpcyByZXF1aXJlZCBmb3IgTm9kZSB2MC4xMCtcbiAgcmVzLnJlc3VtZSgpO1xuXG4gIGxldCBoZWFkZXJzID0gdGhpcy5yZXEuZ2V0SGVhZGVycyA/IHRoaXMucmVxLmdldEhlYWRlcnMoKSA6IHRoaXMucmVxLl9oZWFkZXJzO1xuXG4gIGNvbnN0IGNoYW5nZXNPcmlnaW4gPSBwYXJzZSh1cmwpLmhvc3QgIT09IHBhcnNlKHRoaXMudXJsKS5ob3N0O1xuXG4gIC8vIGltcGxlbWVudGF0aW9uIG9mIDMwMiBmb2xsb3dpbmcgZGVmYWN0byBzdGFuZGFyZFxuICBpZiAocmVzLnN0YXR1c0NvZGUgPT09IDMwMSB8fCByZXMuc3RhdHVzQ29kZSA9PT0gMzAyKSB7XG4gICAgLy8gc3RyaXAgQ29udGVudC0qIHJlbGF0ZWQgZmllbGRzXG4gICAgLy8gaW4gY2FzZSBvZiBQT1NUIGV0Y1xuICAgIGhlYWRlcnMgPSB1dGlscy5jbGVhbkhlYWRlcihoZWFkZXJzLCBjaGFuZ2VzT3JpZ2luKTtcblxuICAgIC8vIGZvcmNlIEdFVFxuICAgIHRoaXMubWV0aG9kID0gdGhpcy5tZXRob2QgPT09ICdIRUFEJyA/ICdIRUFEJyA6ICdHRVQnO1xuXG4gICAgLy8gY2xlYXIgZGF0YVxuICAgIHRoaXMuX2RhdGEgPSBudWxsO1xuICB9XG5cbiAgLy8gMzAzIGlzIGFsd2F5cyBHRVRcbiAgaWYgKHJlcy5zdGF0dXNDb2RlID09PSAzMDMpIHtcbiAgICAvLyBzdHJpcCBDb250ZW50LSogcmVsYXRlZCBmaWVsZHNcbiAgICAvLyBpbiBjYXNlIG9mIFBPU1QgZXRjXG4gICAgaGVhZGVycyA9IHV0aWxzLmNsZWFuSGVhZGVyKGhlYWRlcnMsIGNoYW5nZXNPcmlnaW4pO1xuXG4gICAgLy8gZm9yY2UgbWV0aG9kXG4gICAgdGhpcy5tZXRob2QgPSAnR0VUJztcblxuICAgIC8vIGNsZWFyIGRhdGFcbiAgICB0aGlzLl9kYXRhID0gbnVsbDtcbiAgfVxuXG4gIC8vIDMwNyBwcmVzZXJ2ZXMgbWV0aG9kXG4gIC8vIDMwOCBwcmVzZXJ2ZXMgbWV0aG9kXG4gIGRlbGV0ZSBoZWFkZXJzLmhvc3Q7XG5cbiAgZGVsZXRlIHRoaXMucmVxO1xuICBkZWxldGUgdGhpcy5fZm9ybURhdGE7XG5cbiAgLy8gcmVtb3ZlIGFsbCBhZGQgaGVhZGVyIGV4Y2VwdCBVc2VyLUFnZW50XG4gIF9pbml0SGVhZGVycyh0aGlzKTtcblxuICAvLyByZWRpcmVjdFxuICB0aGlzLl9lbmRDYWxsZWQgPSBmYWxzZTtcbiAgdGhpcy51cmwgPSB1cmw7XG4gIHRoaXMucXMgPSB7fTtcbiAgdGhpcy5fcXVlcnkubGVuZ3RoID0gMDtcbiAgdGhpcy5zZXQoaGVhZGVycyk7XG4gIHRoaXMuZW1pdCgncmVkaXJlY3QnLCByZXMpO1xuICB0aGlzLl9yZWRpcmVjdExpc3QucHVzaCh0aGlzLnVybCk7XG4gIHRoaXMuZW5kKHRoaXMuX2NhbGxiYWNrKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBBdXRob3JpemF0aW9uIGZpZWxkIHZhbHVlIHdpdGggYHVzZXJgIGFuZCBgcGFzc2AuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAuYXV0aCgndG9iaScsICdsZWFybmJvb3N0JylcbiAqICAgLmF1dGgoJ3RvYmk6bGVhcm5ib29zdCcpXG4gKiAgIC5hdXRoKCd0b2JpJylcbiAqICAgLmF1dGgoYWNjZXNzVG9rZW4sIHsgdHlwZTogJ2JlYXJlcicgfSlcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXNlclxuICogQHBhcmFtIHtTdHJpbmd9IFtwYXNzXVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBvcHRpb25zIHdpdGggYXV0aG9yaXphdGlvbiB0eXBlICdiYXNpYycgb3IgJ2JlYXJlcicgKCdiYXNpYycgaXMgZGVmYXVsdClcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5hdXRoID0gZnVuY3Rpb24gKHVzZXIsIHBhc3MsIG9wdGlvbnMpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHBhc3MgPSAnJztcbiAgaWYgKHR5cGVvZiBwYXNzID09PSAnb2JqZWN0JyAmJiBwYXNzICE9PSBudWxsKSB7XG4gICAgLy8gcGFzcyBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHJlcGxhY2VkIHdpdGggb3B0aW9uc1xuICAgIG9wdGlvbnMgPSBwYXNzO1xuICAgIHBhc3MgPSAnJztcbiAgfVxuXG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7IHR5cGU6ICdiYXNpYycgfTtcbiAgfVxuXG4gIGNvbnN0IGVuY29kZXIgPSAoc3RyaW5nKSA9PiBCdWZmZXIuZnJvbShzdHJpbmcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICByZXR1cm4gdGhpcy5fYXV0aCh1c2VyLCBwYXNzLCBvcHRpb25zLCBlbmNvZGVyKTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgb3B0aW9uIGZvciBodHRwcyByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyIHwgQXJyYXl9IGNlcnRcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5jYSA9IGZ1bmN0aW9uIChjZXJ0KSB7XG4gIHRoaXMuX2NhID0gY2VydDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY2xpZW50IGNlcnRpZmljYXRlIGtleSBvcHRpb24gZm9yIGh0dHBzIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIHtCdWZmZXIgfCBTdHJpbmd9IGNlcnRcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5rZXkgPSBmdW5jdGlvbiAoY2VydCkge1xuICB0aGlzLl9rZXkgPSBjZXJ0O1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBrZXksIGNlcnRpZmljYXRlLCBhbmQgQ0EgY2VydHMgb2YgdGhlIGNsaWVudCBpbiBQRlggb3IgUEtDUzEyIGZvcm1hdC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlciB8IFN0cmluZ30gY2VydFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLnBmeCA9IGZ1bmN0aW9uIChjZXJ0KSB7XG4gIGlmICh0eXBlb2YgY2VydCA9PT0gJ29iamVjdCcgJiYgIUJ1ZmZlci5pc0J1ZmZlcihjZXJ0KSkge1xuICAgIHRoaXMuX3BmeCA9IGNlcnQucGZ4O1xuICAgIHRoaXMuX3Bhc3NwaHJhc2UgPSBjZXJ0LnBhc3NwaHJhc2U7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fcGZ4ID0gY2VydDtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZSBvcHRpb24gZm9yIGh0dHBzIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIHtCdWZmZXIgfCBTdHJpbmd9IGNlcnRcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5jZXJ0ID0gZnVuY3Rpb24gKGNlcnQpIHtcbiAgdGhpcy5fY2VydCA9IGNlcnQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBEbyBub3QgcmVqZWN0IGV4cGlyZWQgb3IgaW52YWxpZCBUTFMgY2VydHMuXG4gKiBzZXRzIGByZWplY3RVbmF1dGhvcml6ZWQ9dHJ1ZWAuIEJlIHdhcm5lZCB0aGF0IHRoaXMgYWxsb3dzIE1JVE0gYXR0YWNrcy5cbiAqXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuZGlzYWJsZVRMU0NlcnRzID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9kaXNhYmxlVExTQ2VydHMgPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmV0dXJuIGFuIGh0dHBbc10gcmVxdWVzdC5cbiAqXG4gKiBAcmV0dXJuIHtPdXRnb2luZ01lc3NhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuUmVxdWVzdC5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMucmVxKSByZXR1cm4gdGhpcy5yZXE7XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHt9O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcXVlcnkgPSBxcy5zdHJpbmdpZnkodGhpcy5xcywge1xuICAgICAgaW5kaWNlczogZmFsc2UsXG4gICAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IHRydWVcbiAgICB9KTtcbiAgICBpZiAocXVlcnkpIHtcbiAgICAgIHRoaXMucXMgPSB7fTtcbiAgICAgIHRoaXMuX3F1ZXJ5LnB1c2gocXVlcnkpO1xuICAgIH1cblxuICAgIHRoaXMuX2ZpbmFsaXplUXVlcnlTdHJpbmcoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICB9XG5cbiAgbGV0IHsgdXJsIH0gPSB0aGlzO1xuICBjb25zdCByZXRyaWVzID0gdGhpcy5fcmV0cmllcztcblxuICAvLyBDYXB0dXJlIGJhY2t0aWNrcyBhcy1pcyBmcm9tIHRoZSBmaW5hbCBxdWVyeSBzdHJpbmcgYnVpbHQgYWJvdmUuXG4gIC8vIE5vdGU6IHRoaXMnbGwgb25seSBmaW5kIGJhY2t0aWNrcyBlbnRlcmVkIGluIHJlcS5xdWVyeShTdHJpbmcpXG4gIC8vIGNhbGxzLCBiZWNhdXNlIHFzLnN0cmluZ2lmeSB1bmNvbmRpdGlvbmFsbHkgZW5jb2RlcyBiYWNrdGlja3MuXG4gIGxldCBxdWVyeVN0cmluZ0JhY2t0aWNrcztcbiAgaWYgKHVybC5pbmNsdWRlcygnYCcpKSB7XG4gICAgY29uc3QgcXVlcnlTdGFydEluZGV4ID0gdXJsLmluZGV4T2YoJz8nKTtcblxuICAgIGlmIChxdWVyeVN0YXJ0SW5kZXggIT09IC0xKSB7XG4gICAgICBjb25zdCBxdWVyeVN0cmluZyA9IHVybC5zbGljZShxdWVyeVN0YXJ0SW5kZXggKyAxKTtcbiAgICAgIHF1ZXJ5U3RyaW5nQmFja3RpY2tzID0gcXVlcnlTdHJpbmcubWF0Y2goL2B8JTYwL2cpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGRlZmF1bHQgdG8gaHR0cDovL1xuICBpZiAodXJsLmluZGV4T2YoJ2h0dHAnKSAhPT0gMCkgdXJsID0gYGh0dHA6Ly8ke3VybH1gO1xuICB1cmwgPSBwYXJzZSh1cmwpO1xuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdmlzaW9ubWVkaWEvc3VwZXJhZ2VudC9pc3N1ZXMvMTM2N1xuICBpZiAocXVlcnlTdHJpbmdCYWNrdGlja3MpIHtcbiAgICBsZXQgaSA9IDA7XG4gICAgdXJsLnF1ZXJ5ID0gdXJsLnF1ZXJ5LnJlcGxhY2UoLyU2MC9nLCAoKSA9PiBxdWVyeVN0cmluZ0JhY2t0aWNrc1tpKytdKTtcbiAgICB1cmwuc2VhcmNoID0gYD8ke3VybC5xdWVyeX1gO1xuICAgIHVybC5wYXRoID0gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaDtcbiAgfVxuXG4gIC8vIHN1cHBvcnQgdW5peCBzb2NrZXRzXG4gIGlmICgvXmh0dHBzP1xcK3VuaXg6Ly50ZXN0KHVybC5wcm90b2NvbCkgPT09IHRydWUpIHtcbiAgICAvLyBnZXQgdGhlIHByb3RvY29sXG4gICAgdXJsLnByb3RvY29sID0gYCR7dXJsLnByb3RvY29sLnNwbGl0KCcrJylbMF19OmA7XG5cbiAgICAvLyBnZXQgdGhlIHNvY2tldCwgcGF0aFxuICAgIGNvbnN0IHVuaXhQYXJ0cyA9IHVybC5wYXRoLm1hdGNoKC9eKFteL10rKSguKykkLyk7XG4gICAgb3B0aW9ucy5zb2NrZXRQYXRoID0gdW5peFBhcnRzWzFdLnJlcGxhY2UoLyUyRi9nLCAnLycpO1xuICAgIHVybC5wYXRoID0gdW5peFBhcnRzWzJdO1xuICB9XG5cbiAgLy8gT3ZlcnJpZGUgSVAgYWRkcmVzcyBvZiBhIGhvc3RuYW1lXG4gIGlmICh0aGlzLl9jb25uZWN0T3ZlcnJpZGUpIHtcbiAgICBjb25zdCB7IGhvc3RuYW1lIH0gPSB1cmw7XG4gICAgY29uc3QgbWF0Y2ggPVxuICAgICAgaG9zdG5hbWUgaW4gdGhpcy5fY29ubmVjdE92ZXJyaWRlXG4gICAgICAgID8gdGhpcy5fY29ubmVjdE92ZXJyaWRlW2hvc3RuYW1lXVxuICAgICAgICA6IHRoaXMuX2Nvbm5lY3RPdmVycmlkZVsnKiddO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgLy8gYmFja3VwIHRoZSByZWFsIGhvc3RcbiAgICAgIGlmICghdGhpcy5faGVhZGVyLmhvc3QpIHtcbiAgICAgICAgdGhpcy5zZXQoJ2hvc3QnLCB1cmwuaG9zdCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdIb3N0O1xuICAgICAgbGV0IG5ld1BvcnQ7XG5cbiAgICAgIGlmICh0eXBlb2YgbWF0Y2ggPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG5ld0hvc3QgPSBtYXRjaC5ob3N0O1xuICAgICAgICBuZXdQb3J0ID0gbWF0Y2gucG9ydDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld0hvc3QgPSBtYXRjaDtcbiAgICAgICAgbmV3UG9ydCA9IHVybC5wb3J0O1xuICAgICAgfVxuXG4gICAgICAvLyB3cmFwIFtpcHY2XVxuICAgICAgdXJsLmhvc3QgPSAvOi8udGVzdChuZXdIb3N0KSA/IGBbJHtuZXdIb3N0fV1gIDogbmV3SG9zdDtcbiAgICAgIGlmIChuZXdQb3J0KSB7XG4gICAgICAgIHVybC5ob3N0ICs9IGA6JHtuZXdQb3J0fWA7XG4gICAgICAgIHVybC5wb3J0ID0gbmV3UG9ydDtcbiAgICAgIH1cblxuICAgICAgdXJsLmhvc3RuYW1lID0gbmV3SG9zdDtcbiAgICB9XG4gIH1cblxuICAvLyBvcHRpb25zXG4gIG9wdGlvbnMubWV0aG9kID0gdGhpcy5tZXRob2Q7XG4gIG9wdGlvbnMucG9ydCA9IHVybC5wb3J0O1xuICBvcHRpb25zLnBhdGggPSB1cmwucGF0aDtcbiAgb3B0aW9ucy5ob3N0ID0gdXJsLmhvc3RuYW1lO1xuICBvcHRpb25zLmNhID0gdGhpcy5fY2E7XG4gIG9wdGlvbnMua2V5ID0gdGhpcy5fa2V5O1xuICBvcHRpb25zLnBmeCA9IHRoaXMuX3BmeDtcbiAgb3B0aW9ucy5jZXJ0ID0gdGhpcy5fY2VydDtcbiAgb3B0aW9ucy5wYXNzcGhyYXNlID0gdGhpcy5fcGFzc3BocmFzZTtcbiAgb3B0aW9ucy5hZ2VudCA9IHRoaXMuX2FnZW50O1xuICBvcHRpb25zLnJlamVjdFVuYXV0aG9yaXplZCA9XG4gICAgdHlwZW9mIHRoaXMuX2Rpc2FibGVUTFNDZXJ0cyA9PT0gJ2Jvb2xlYW4nXG4gICAgICA/ICF0aGlzLl9kaXNhYmxlVExTQ2VydHNcbiAgICAgIDogcHJvY2Vzcy5lbnYuTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRCAhPT0gJzAnO1xuXG4gIC8vIEFsbG93cyByZXF1ZXN0LmdldCgnaHR0cHM6Ly8xLjIuMy40LycpLnNldCgnSG9zdCcsICdleGFtcGxlLmNvbScpXG4gIGlmICh0aGlzLl9oZWFkZXIuaG9zdCkge1xuICAgIG9wdGlvbnMuc2VydmVybmFtZSA9IHRoaXMuX2hlYWRlci5ob3N0LnJlcGxhY2UoLzpcXGQrJC8sICcnKTtcbiAgfVxuXG4gIGlmIChcbiAgICB0aGlzLl90cnVzdExvY2FsaG9zdCAmJlxuICAgIC9eKD86bG9jYWxob3N0fDEyN1xcLjBcXC4wXFwuXFxkK3woMCo6KSs6MCoxKSQvLnRlc3QodXJsLmhvc3RuYW1lKVxuICApIHtcbiAgICBvcHRpb25zLnJlamVjdFVuYXV0aG9yaXplZCA9IGZhbHNlO1xuICB9XG5cbiAgLy8gaW5pdGlhdGUgcmVxdWVzdFxuICBjb25zdCBtb2QgPSB0aGlzLl9lbmFibGVIdHRwMlxuICAgID8gZXhwb3J0cy5wcm90b2NvbHNbJ2h0dHAyOiddLnNldFByb3RvY29sKHVybC5wcm90b2NvbClcbiAgICA6IGV4cG9ydHMucHJvdG9jb2xzW3VybC5wcm90b2NvbF07XG5cbiAgLy8gcmVxdWVzdFxuICB0aGlzLnJlcSA9IG1vZC5yZXF1ZXN0KG9wdGlvbnMpO1xuICBjb25zdCB7IHJlcSB9ID0gdGhpcztcblxuICAvLyBzZXQgdGNwIG5vIGRlbGF5XG4gIHJlcS5zZXROb0RlbGF5KHRydWUpO1xuXG4gIGlmIChvcHRpb25zLm1ldGhvZCAhPT0gJ0hFQUQnKSB7XG4gICAgcmVxLnNldEhlYWRlcignQWNjZXB0LUVuY29kaW5nJywgJ2d6aXAsIGRlZmxhdGUnKTtcbiAgfVxuXG4gIHRoaXMucHJvdG9jb2wgPSB1cmwucHJvdG9jb2w7XG4gIHRoaXMuaG9zdCA9IHVybC5ob3N0O1xuXG4gIC8vIGV4cG9zZSBldmVudHNcbiAgcmVxLm9uY2UoJ2RyYWluJywgKCkgPT4ge1xuICAgIHRoaXMuZW1pdCgnZHJhaW4nKTtcbiAgfSk7XG5cbiAgcmVxLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgIC8vIGZsYWcgYWJvcnRpb24gaGVyZSBmb3Igb3V0IHRpbWVvdXRzXG4gICAgLy8gYmVjYXVzZSBub2RlIHdpbGwgZW1pdCBhIGZhdXgtZXJyb3IgXCJzb2NrZXQgaGFuZyB1cFwiXG4gICAgLy8gd2hlbiByZXF1ZXN0IGlzIGFib3J0ZWQgYmVmb3JlIGEgY29ubmVjdGlvbiBpcyBtYWRlXG4gICAgaWYgKHRoaXMuX2Fib3J0ZWQpIHJldHVybjtcbiAgICAvLyBpZiBub3QgdGhlIHNhbWUsIHdlIGFyZSBpbiB0aGUgKipvbGQqKiAoY2FuY2VsbGVkKSByZXF1ZXN0LFxuICAgIC8vIHNvIG5lZWQgdG8gY29udGludWUgKHNhbWUgYXMgZm9yIGFib3ZlKVxuICAgIGlmICh0aGlzLl9yZXRyaWVzICE9PSByZXRyaWVzKSByZXR1cm47XG4gICAgLy8gaWYgd2UndmUgcmVjZWl2ZWQgYSByZXNwb25zZSB0aGVuIHdlIGRvbid0IHdhbnQgdG8gbGV0XG4gICAgLy8gYW4gZXJyb3IgaW4gdGhlIHJlcXVlc3QgYmxvdyB1cCB0aGUgcmVzcG9uc2VcbiAgICBpZiAodGhpcy5yZXNwb25zZSkgcmV0dXJuO1xuICAgIHRoaXMuY2FsbGJhY2soZXJyb3IpO1xuICB9KTtcblxuICAvLyBhdXRoXG4gIGlmICh1cmwuYXV0aCkge1xuICAgIGNvbnN0IGF1dGggPSB1cmwuYXV0aC5zcGxpdCgnOicpO1xuICAgIHRoaXMuYXV0aChhdXRoWzBdLCBhdXRoWzFdKTtcbiAgfVxuXG4gIGlmICh0aGlzLnVzZXJuYW1lICYmIHRoaXMucGFzc3dvcmQpIHtcbiAgICB0aGlzLmF1dGgodGhpcy51c2VybmFtZSwgdGhpcy5wYXNzd29yZCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmhlYWRlcikge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5oZWFkZXIsIGtleSkpXG4gICAgICByZXEuc2V0SGVhZGVyKGtleSwgdGhpcy5oZWFkZXJba2V5XSk7XG4gIH1cblxuICAvLyBhZGQgY29va2llc1xuICBpZiAodGhpcy5jb29raWVzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9oZWFkZXIsICdjb29raWUnKSkge1xuICAgICAgLy8gbWVyZ2VcbiAgICAgIGNvbnN0IHRlbXBvcmFyeUphciA9IG5ldyBDb29raWVKYXIuQ29va2llSmFyKCk7XG4gICAgICB0ZW1wb3JhcnlKYXIuc2V0Q29va2llcyh0aGlzLl9oZWFkZXIuY29va2llLnNwbGl0KCc7JykpO1xuICAgICAgdGVtcG9yYXJ5SmFyLnNldENvb2tpZXModGhpcy5jb29raWVzLnNwbGl0KCc7JykpO1xuICAgICAgcmVxLnNldEhlYWRlcihcbiAgICAgICAgJ0Nvb2tpZScsXG4gICAgICAgIHRlbXBvcmFyeUphci5nZXRDb29raWVzKENvb2tpZUphci5Db29raWVBY2Nlc3NJbmZvLkFsbCkudG9WYWx1ZVN0cmluZygpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXEuc2V0SGVhZGVyKCdDb29raWUnLCB0aGlzLmNvb2tpZXMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXE7XG59O1xuXG4vKipcbiAqIEludm9rZSB0aGUgY2FsbGJhY2sgd2l0aCBgZXJyYCBhbmQgYHJlc2BcbiAqIGFuZCBoYW5kbGUgYXJpdHkgY2hlY2suXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0ge1Jlc3BvbnNlfSByZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNhbGxiYWNrID0gZnVuY3Rpb24gKGVycm9yLCByZXMpIHtcbiAgaWYgKHRoaXMuX3Nob3VsZFJldHJ5KGVycm9yLCByZXMpKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JldHJ5KCk7XG4gIH1cblxuICAvLyBBdm9pZCB0aGUgZXJyb3Igd2hpY2ggaXMgZW1pdHRlZCBmcm9tICdzb2NrZXQgaGFuZyB1cCcgdG8gY2F1c2UgdGhlIGZuIHVuZGVmaW5lZCBlcnJvciBvbiBKUyBydW50aW1lLlxuICBjb25zdCBmbiA9IHRoaXMuX2NhbGxiYWNrIHx8IG5vb3A7XG4gIHRoaXMuY2xlYXJUaW1lb3V0KCk7XG4gIGlmICh0aGlzLmNhbGxlZCkgcmV0dXJuIGNvbnNvbGUud2Fybignc3VwZXJhZ2VudDogZG91YmxlIGNhbGxiYWNrIGJ1ZycpO1xuICB0aGlzLmNhbGxlZCA9IHRydWU7XG5cbiAgaWYgKCFlcnJvcikge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuX2lzUmVzcG9uc2VPSyhyZXMpKSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gJ1Vuc3VjY2Vzc2Z1bCBIVFRQIHJlc3BvbnNlJztcbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgIG1lc3NhZ2UgPSBodHRwLlNUQVRVU19DT0RFU1tyZXMuc3RhdHVzXSB8fCBtZXNzYWdlO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIGVycm9yLnN0YXR1cyA9IHJlcyA/IHJlcy5zdGF0dXMgOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3JfKSB7XG4gICAgICBlcnJvciA9IGVycm9yXztcbiAgICB9XG4gIH1cblxuICAvLyBJdCdzIGltcG9ydGFudCB0aGF0IHRoZSBjYWxsYmFjayBpcyBjYWxsZWQgb3V0c2lkZSB0cnkvY2F0Y2hcbiAgLy8gdG8gYXZvaWQgZG91YmxlIGNhbGxiYWNrXG4gIGlmICghZXJyb3IpIHtcbiAgICByZXR1cm4gZm4obnVsbCwgcmVzKTtcbiAgfVxuXG4gIGVycm9yLnJlc3BvbnNlID0gcmVzO1xuICBpZiAodGhpcy5fbWF4UmV0cmllcykgZXJyb3IucmV0cmllcyA9IHRoaXMuX3JldHJpZXMgLSAxO1xuXG4gIC8vIG9ubHkgZW1pdCBlcnJvciBldmVudCBpZiB0aGVyZSBpcyBhIGxpc3RlbmVyXG4gIC8vIG90aGVyd2lzZSB3ZSBhc3N1bWUgdGhlIGNhbGxiYWNrIHRvIGAuZW5kKClgIHdpbGwgZ2V0IHRoZSBlcnJvclxuICBpZiAoZXJyb3IgJiYgdGhpcy5saXN0ZW5lcnMoJ2Vycm9yJykubGVuZ3RoID4gMCkge1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gIH1cblxuICBmbihlcnJvciwgcmVzKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYG9iamAgaXMgYSBob3N0IG9iamVjdCxcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIGhvc3Qgb2JqZWN0XG4gKiBAcmV0dXJuIHtCb29sZWFufSBpcyBhIGhvc3Qgb2JqZWN0XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuUmVxdWVzdC5wcm90b3R5cGUuX2lzSG9zdCA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgcmV0dXJuIChcbiAgICBCdWZmZXIuaXNCdWZmZXIob2JqZWN0KSB8fFxuICAgIG9iamVjdCBpbnN0YW5jZW9mIFN0cmVhbSB8fFxuICAgIG9iamVjdCBpbnN0YW5jZW9mIEZvcm1EYXRhXG4gICk7XG59O1xuXG4vKipcbiAqIEluaXRpYXRlIHJlcXVlc3QsIGludm9raW5nIGNhbGxiYWNrIGBmbihlcnIsIHJlcylgXG4gKiB3aXRoIGFuIGluc3RhbmNlb2YgYFJlc3BvbnNlYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLl9lbWl0UmVzcG9uc2UgPSBmdW5jdGlvbiAoYm9keSwgZmlsZXMpIHtcbiAgY29uc3QgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UodGhpcyk7XG4gIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgcmVzcG9uc2UucmVkaXJlY3RzID0gdGhpcy5fcmVkaXJlY3RMaXN0O1xuICBpZiAodW5kZWZpbmVkICE9PSBib2R5KSB7XG4gICAgcmVzcG9uc2UuYm9keSA9IGJvZHk7XG4gIH1cblxuICByZXNwb25zZS5maWxlcyA9IGZpbGVzO1xuICBpZiAodGhpcy5fZW5kQ2FsbGVkKSB7XG4gICAgcmVzcG9uc2UucGlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJlbmQoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCwgc28gaXQncyB0b28gbGF0ZSB0byBzdGFydCBwaXBpbmdcIlxuICAgICAgKTtcbiAgICB9O1xuICB9XG5cbiAgdGhpcy5lbWl0KCdyZXNwb25zZScsIHJlc3BvbnNlKTtcbiAgcmV0dXJuIHJlc3BvbnNlO1xufTtcblxuUmVxdWVzdC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGZuKSB7XG4gIHRoaXMucmVxdWVzdCgpO1xuICBkZWJ1ZygnJXMgJXMnLCB0aGlzLm1ldGhvZCwgdGhpcy51cmwpO1xuXG4gIGlmICh0aGlzLl9lbmRDYWxsZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnLmVuZCgpIHdhcyBjYWxsZWQgdHdpY2UuIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBpbiBzdXBlcmFnZW50J1xuICAgICk7XG4gIH1cblxuICB0aGlzLl9lbmRDYWxsZWQgPSB0cnVlO1xuXG4gIC8vIHN0b3JlIGNhbGxiYWNrXG4gIHRoaXMuX2NhbGxiYWNrID0gZm4gfHwgbm9vcDtcblxuICB0aGlzLl9lbmQoKTtcbn07XG5cblJlcXVlc3QucHJvdG90eXBlLl9lbmQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLl9hYm9ydGVkKVxuICAgIHJldHVybiB0aGlzLmNhbGxiYWNrKFxuICAgICAgbmV3IEVycm9yKCdUaGUgcmVxdWVzdCBoYXMgYmVlbiBhYm9ydGVkIGV2ZW4gYmVmb3JlIC5lbmQoKSB3YXMgY2FsbGVkJylcbiAgICApO1xuXG4gIGxldCBkYXRhID0gdGhpcy5fZGF0YTtcbiAgY29uc3QgeyByZXEgfSA9IHRoaXM7XG4gIGNvbnN0IHsgbWV0aG9kIH0gPSB0aGlzO1xuXG4gIHRoaXMuX3NldFRpbWVvdXRzKCk7XG5cbiAgLy8gYm9keVxuICBpZiAobWV0aG9kICE9PSAnSEVBRCcgJiYgIXJlcS5faGVhZGVyU2VudCkge1xuICAgIC8vIHNlcmlhbGl6ZSBzdHVmZlxuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGxldCBjb250ZW50VHlwZSA9IHJlcS5nZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScpO1xuICAgICAgLy8gUGFyc2Ugb3V0IGp1c3QgdGhlIGNvbnRlbnQgdHlwZSBmcm9tIHRoZSBoZWFkZXIgKGlnbm9yZSB0aGUgY2hhcnNldClcbiAgICAgIGlmIChjb250ZW50VHlwZSkgY29udGVudFR5cGUgPSBjb250ZW50VHlwZS5zcGxpdCgnOycpWzBdO1xuICAgICAgbGV0IHNlcmlhbGl6ZSA9IHRoaXMuX3NlcmlhbGl6ZXIgfHwgZXhwb3J0cy5zZXJpYWxpemVbY29udGVudFR5cGVdO1xuICAgICAgaWYgKCFzZXJpYWxpemUgJiYgaXNKU09OKGNvbnRlbnRUeXBlKSkge1xuICAgICAgICBzZXJpYWxpemUgPSBleHBvcnRzLnNlcmlhbGl6ZVsnYXBwbGljYXRpb24vanNvbiddO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VyaWFsaXplKSBkYXRhID0gc2VyaWFsaXplKGRhdGEpO1xuICAgIH1cblxuICAgIC8vIGNvbnRlbnQtbGVuZ3RoXG4gICAgaWYgKGRhdGEgJiYgIXJlcS5nZXRIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJykpIHtcbiAgICAgIHJlcS5zZXRIZWFkZXIoXG4gICAgICAgICdDb250ZW50LUxlbmd0aCcsXG4gICAgICAgIEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSA/IGRhdGEubGVuZ3RoIDogQnVmZmVyLmJ5dGVMZW5ndGgoZGF0YSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gcmVzcG9uc2VcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgcmVxLm9uY2UoJ3Jlc3BvbnNlJywgKHJlcykgPT4ge1xuICAgIGRlYnVnKCclcyAlcyAtPiAlcycsIHRoaXMubWV0aG9kLCB0aGlzLnVybCwgcmVzLnN0YXR1c0NvZGUpO1xuXG4gICAgaWYgKHRoaXMuX3Jlc3BvbnNlVGltZW91dFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmVzcG9uc2VUaW1lb3V0VGltZXIpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBpcGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWF4ID0gdGhpcy5fbWF4UmVkaXJlY3RzO1xuICAgIGNvbnN0IG1pbWUgPSB1dGlscy50eXBlKHJlcy5oZWFkZXJzWydjb250ZW50LXR5cGUnXSB8fCAnJykgfHwgJ3RleHQvcGxhaW4nO1xuICAgIGxldCB0eXBlID0gbWltZS5zcGxpdCgnLycpWzBdO1xuICAgIGlmICh0eXBlKSB0eXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICBjb25zdCBtdWx0aXBhcnQgPSB0eXBlID09PSAnbXVsdGlwYXJ0JztcbiAgICBjb25zdCByZWRpcmVjdCA9IGlzUmVkaXJlY3QocmVzLnN0YXR1c0NvZGUpO1xuICAgIGNvbnN0IHJlc3BvbnNlVHlwZSA9IHRoaXMuX3Jlc3BvbnNlVHlwZTtcblxuICAgIHRoaXMucmVzID0gcmVzO1xuXG4gICAgLy8gcmVkaXJlY3RcbiAgICBpZiAocmVkaXJlY3QgJiYgdGhpcy5fcmVkaXJlY3RzKysgIT09IG1heCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlZGlyZWN0KHJlcyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWV0aG9kID09PSAnSEVBRCcpIHtcbiAgICAgIHRoaXMuZW1pdCgnZW5kJyk7XG4gICAgICB0aGlzLmNhbGxiYWNrKG51bGwsIHRoaXMuX2VtaXRSZXNwb25zZSgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB6bGliIHN1cHBvcnRcbiAgICBpZiAodGhpcy5fc2hvdWxkVW56aXAocmVzKSkge1xuICAgICAgdW56aXAocmVxLCByZXMpO1xuICAgIH1cblxuICAgIGxldCBidWZmZXIgPSB0aGlzLl9idWZmZXI7XG4gICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkICYmIG1pbWUgaW4gZXhwb3J0cy5idWZmZXIpIHtcbiAgICAgIGJ1ZmZlciA9IEJvb2xlYW4oZXhwb3J0cy5idWZmZXJbbWltZV0pO1xuICAgIH1cblxuICAgIGxldCBwYXJzZXIgPSB0aGlzLl9wYXJzZXI7XG4gICAgaWYgKHVuZGVmaW5lZCA9PT0gYnVmZmVyICYmIHBhcnNlcikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkEgY3VzdG9tIHN1cGVyYWdlbnQgcGFyc2VyIGhhcyBiZWVuIHNldCwgYnV0IGJ1ZmZlcmluZyBzdHJhdGVneSBmb3IgdGhlIHBhcnNlciBoYXNuJ3QgYmVlbiBjb25maWd1cmVkLiBDYWxsIGByZXEuYnVmZmVyKHRydWUgb3IgZmFsc2UpYCBvciBzZXQgYHN1cGVyYWdlbnQuYnVmZmVyW21pbWVdID0gdHJ1ZSBvciBmYWxzZWBcIlxuICAgICAgKTtcbiAgICAgIGJ1ZmZlciA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJzZXIpIHtcbiAgICAgIGlmIChyZXNwb25zZVR5cGUpIHtcbiAgICAgICAgcGFyc2VyID0gZXhwb3J0cy5wYXJzZS5pbWFnZTsgLy8gSXQncyBhY3R1YWxseSBhIGdlbmVyaWMgQnVmZmVyXG4gICAgICAgIGJ1ZmZlciA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKG11bHRpcGFydCkge1xuICAgICAgICBjb25zdCBmb3JtID0gZm9ybWlkYWJsZSgpO1xuICAgICAgICBwYXJzZXIgPSBmb3JtLnBhcnNlLmJpbmQoZm9ybSk7XG4gICAgICAgIGJ1ZmZlciA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGlzSW1hZ2VPclZpZGVvKG1pbWUpKSB7XG4gICAgICAgIHBhcnNlciA9IGV4cG9ydHMucGFyc2UuaW1hZ2U7XG4gICAgICAgIGJ1ZmZlciA9IHRydWU7IC8vIEZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBidWZmZXJpbmcgZGVmYXVsdCBpcyBhZC1ob2MgTUlNRS1kZXBlbmRlbnRcbiAgICAgIH0gZWxzZSBpZiAoZXhwb3J0cy5wYXJzZVttaW1lXSkge1xuICAgICAgICBwYXJzZXIgPSBleHBvcnRzLnBhcnNlW21pbWVdO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgcGFyc2VyID0gZXhwb3J0cy5wYXJzZS50ZXh0O1xuICAgICAgICBidWZmZXIgPSBidWZmZXIgIT09IGZhbHNlO1xuXG4gICAgICAgIC8vIGV2ZXJ5b25lIHdhbnRzIHRoZWlyIG93biB3aGl0ZS1sYWJlbGVkIGpzb25cbiAgICAgIH0gZWxzZSBpZiAoaXNKU09OKG1pbWUpKSB7XG4gICAgICAgIHBhcnNlciA9IGV4cG9ydHMucGFyc2VbJ2FwcGxpY2F0aW9uL2pzb24nXTtcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyICE9PSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoYnVmZmVyKSB7XG4gICAgICAgIHBhcnNlciA9IGV4cG9ydHMucGFyc2UudGV4dDtcbiAgICAgIH0gZWxzZSBpZiAodW5kZWZpbmVkID09PSBidWZmZXIpIHtcbiAgICAgICAgcGFyc2VyID0gZXhwb3J0cy5wYXJzZS5pbWFnZTsgLy8gSXQncyBhY3R1YWxseSBhIGdlbmVyaWMgQnVmZmVyXG4gICAgICAgIGJ1ZmZlciA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYnkgZGVmYXVsdCBvbmx5IGJ1ZmZlciB0ZXh0LyosIGpzb24gYW5kIG1lc3NlZCB1cCB0aGluZyBmcm9tIGhlbGxcbiAgICBpZiAoKHVuZGVmaW5lZCA9PT0gYnVmZmVyICYmIGlzVGV4dChtaW1lKSkgfHwgaXNKU09OKG1pbWUpKSB7XG4gICAgICBidWZmZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuX3Jlc0J1ZmZlcmVkID0gYnVmZmVyO1xuICAgIGxldCBwYXJzZXJIYW5kbGVzRW5kID0gZmFsc2U7XG4gICAgaWYgKGJ1ZmZlcikge1xuICAgICAgLy8gUHJvdGVjdGlvbmEgYWdhaW5zdCB6aXAgYm9tYnMgYW5kIG90aGVyIG51aXNhbmNlXG4gICAgICBsZXQgcmVzcG9uc2VCeXRlc0xlZnQgPSB0aGlzLl9tYXhSZXNwb25zZVNpemUgfHwgMjAwXzAwMF8wMDA7XG4gICAgICByZXMub24oJ2RhdGEnLCAoYnVmKSA9PiB7XG4gICAgICAgIHJlc3BvbnNlQnl0ZXNMZWZ0IC09IGJ1Zi5ieXRlTGVuZ3RoIHx8IGJ1Zi5sZW5ndGggPiAwID8gYnVmLmxlbmd0aCA6IDA7XG4gICAgICAgIGlmIChyZXNwb25zZUJ5dGVzTGVmdCA8IDApIHtcbiAgICAgICAgICAvLyBUaGlzIHdpbGwgcHJvcGFnYXRlIHRocm91Z2ggZXJyb3IgZXZlbnRcbiAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTWF4aW11bSByZXNwb25zZSBzaXplIHJlYWNoZWQnKTtcbiAgICAgICAgICBlcnJvci5jb2RlID0gJ0VUT09MQVJHRSc7XG4gICAgICAgICAgLy8gUGFyc2VycyBhcmVuJ3QgcmVxdWlyZWQgdG8gb2JzZXJ2ZSBlcnJvciBldmVudCxcbiAgICAgICAgICAvLyBzbyB3b3VsZCBpbmNvcnJlY3RseSByZXBvcnQgc3VjY2Vzc1xuICAgICAgICAgIHBhcnNlckhhbmRsZXNFbmQgPSBmYWxzZTtcbiAgICAgICAgICAvLyBXaWxsIG5vdCBlbWl0IGVycm9yIGV2ZW50XG4gICAgICAgICAgcmVzLmRlc3Ryb3koZXJyb3IpO1xuICAgICAgICAgIC8vIHNvIHdlIGRvIGNhbGxiYWNrIG5vd1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2soZXJyb3IsIG51bGwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VyKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBVbmJ1ZmZlcmVkIHBhcnNlcnMgYXJlIHN1cHBvc2VkIHRvIGVtaXQgcmVzcG9uc2UgZWFybHksXG4gICAgICAgIC8vIHdoaWNoIGlzIHdlaXJkIEJUVywgYmVjYXVzZSByZXNwb25zZS5ib2R5IHdvbid0IGJlIHRoZXJlLlxuICAgICAgICBwYXJzZXJIYW5kbGVzRW5kID0gYnVmZmVyO1xuXG4gICAgICAgIHBhcnNlcihyZXMsIChlcnJvciwgb2JqZWN0LCBmaWxlcykgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnRpbWVkb3V0KSB7XG4gICAgICAgICAgICAvLyBUaW1lb3V0IGhhcyBhbHJlYWR5IGhhbmRsZWQgYWxsIGNhbGxiYWNrc1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEludGVudGlvbmFsIChub24tdGltZW91dCkgYWJvcnQgaXMgc3VwcG9zZWQgdG8gcHJlc2VydmUgcGFydGlhbCByZXNwb25zZSxcbiAgICAgICAgICAvLyBldmVuIGlmIGl0IGRvZXNuJ3QgcGFyc2UuXG4gICAgICAgICAgaWYgKGVycm9yICYmICF0aGlzLl9hYm9ydGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWxsYmFjayhlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHBhcnNlckhhbmRsZXNFbmQpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZW5kJyk7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrKG51bGwsIHRoaXMuX2VtaXRSZXNwb25zZShvYmplY3QsIGZpbGVzKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmNhbGxiYWNrKGVycik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnJlcyA9IHJlcztcblxuICAgIC8vIHVuYnVmZmVyZWRcbiAgICBpZiAoIWJ1ZmZlcikge1xuICAgICAgZGVidWcoJ3VuYnVmZmVyZWQgJXMgJXMnLCB0aGlzLm1ldGhvZCwgdGhpcy51cmwpO1xuICAgICAgdGhpcy5jYWxsYmFjayhudWxsLCB0aGlzLl9lbWl0UmVzcG9uc2UoKSk7XG4gICAgICBpZiAobXVsdGlwYXJ0KSByZXR1cm47IC8vIGFsbG93IG11bHRpcGFydCB0byBoYW5kbGUgZW5kIGV2ZW50XG4gICAgICByZXMub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgICBkZWJ1ZygnZW5kICVzICVzJywgdGhpcy5tZXRob2QsIHRoaXMudXJsKTtcbiAgICAgICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHRlcm1pbmF0aW5nIGV2ZW50c1xuICAgIHJlcy5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgcGFyc2VySGFuZGxlc0VuZCA9IGZhbHNlO1xuICAgICAgdGhpcy5jYWxsYmFjayhlcnJvciwgbnVsbCk7XG4gICAgfSk7XG4gICAgaWYgKCFwYXJzZXJIYW5kbGVzRW5kKVxuICAgICAgcmVzLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICAgICAgZGVidWcoJ2VuZCAlcyAlcycsIHRoaXMubWV0aG9kLCB0aGlzLnVybCk7XG4gICAgICAgIC8vIFRPRE86IHVubGVzcyBidWZmZXJpbmcgZW1pdCBlYXJsaWVyIHRvIHN0cmVhbVxuICAgICAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgICAgICB0aGlzLmNhbGxiYWNrKG51bGwsIHRoaXMuX2VtaXRSZXNwb25zZSgpKTtcbiAgICAgIH0pO1xuICB9KTtcblxuICB0aGlzLmVtaXQoJ3JlcXVlc3QnLCB0aGlzKTtcblxuICBjb25zdCBnZXRQcm9ncmVzc01vbml0b3IgPSAoKSA9PiB7XG4gICAgY29uc3QgbGVuZ3RoQ29tcHV0YWJsZSA9IHRydWU7XG4gICAgY29uc3QgdG90YWwgPSByZXEuZ2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcpO1xuICAgIGxldCBsb2FkZWQgPSAwO1xuXG4gICAgY29uc3QgcHJvZ3Jlc3MgPSBuZXcgU3RyZWFtLlRyYW5zZm9ybSgpO1xuICAgIHByb2dyZXNzLl90cmFuc2Zvcm0gPSAoY2h1bmssIGVuY29kaW5nLCBjYikgPT4ge1xuICAgICAgbG9hZGVkICs9IGNodW5rLmxlbmd0aDtcbiAgICAgIHRoaXMuZW1pdCgncHJvZ3Jlc3MnLCB7XG4gICAgICAgIGRpcmVjdGlvbjogJ3VwbG9hZCcsXG4gICAgICAgIGxlbmd0aENvbXB1dGFibGUsXG4gICAgICAgIGxvYWRlZCxcbiAgICAgICAgdG90YWxcbiAgICAgIH0pO1xuICAgICAgY2IobnVsbCwgY2h1bmspO1xuICAgIH07XG5cbiAgICByZXR1cm4gcHJvZ3Jlc3M7XG4gIH07XG5cbiAgY29uc3QgYnVmZmVyVG9DaHVua3MgPSAoYnVmZmVyKSA9PiB7XG4gICAgY29uc3QgY2h1bmtTaXplID0gMTYgKiAxMDI0OyAvLyBkZWZhdWx0IGhpZ2hXYXRlck1hcmsgdmFsdWVcbiAgICBjb25zdCBjaHVua2luZyA9IG5ldyBTdHJlYW0uUmVhZGFibGUoKTtcbiAgICBjb25zdCB0b3RhbExlbmd0aCA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgY29uc3QgcmVtYWluZGVyID0gdG90YWxMZW5ndGggJSBjaHVua1NpemU7XG4gICAgY29uc3QgY3V0b2ZmID0gdG90YWxMZW5ndGggLSByZW1haW5kZXI7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1dG9mZjsgaSArPSBjaHVua1NpemUpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gYnVmZmVyLnNsaWNlKGksIGkgKyBjaHVua1NpemUpO1xuICAgICAgY2h1bmtpbmcucHVzaChjaHVuayk7XG4gICAgfVxuXG4gICAgaWYgKHJlbWFpbmRlciA+IDApIHtcbiAgICAgIGNvbnN0IHJlbWFpbmRlckJ1ZmZlciA9IGJ1ZmZlci5zbGljZSgtcmVtYWluZGVyKTtcbiAgICAgIGNodW5raW5nLnB1c2gocmVtYWluZGVyQnVmZmVyKTtcbiAgICB9XG5cbiAgICBjaHVua2luZy5wdXNoKG51bGwpOyAvLyBubyBtb3JlIGRhdGFcblxuICAgIHJldHVybiBjaHVua2luZztcbiAgfTtcblxuICAvLyBpZiBhIEZvcm1EYXRhIGluc3RhbmNlIGdvdCBjcmVhdGVkLCB0aGVuIHdlIHNlbmQgdGhhdCBhcyB0aGUgcmVxdWVzdCBib2R5XG4gIGNvbnN0IGZvcm1EYXRhID0gdGhpcy5fZm9ybURhdGE7XG4gIGlmIChmb3JtRGF0YSkge1xuICAgIC8vIHNldCBoZWFkZXJzXG4gICAgY29uc3QgaGVhZGVycyA9IGZvcm1EYXRhLmdldEhlYWRlcnMoKTtcbiAgICBmb3IgKGNvbnN0IGkgaW4gaGVhZGVycykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoZWFkZXJzLCBpKSkge1xuICAgICAgICBkZWJ1Zygnc2V0dGluZyBGb3JtRGF0YSBoZWFkZXI6IFwiJXM6ICVzXCInLCBpLCBoZWFkZXJzW2ldKTtcbiAgICAgICAgcmVxLnNldEhlYWRlcihpLCBoZWFkZXJzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhdHRlbXB0IHRvIGdldCBcIkNvbnRlbnQtTGVuZ3RoXCIgaGVhZGVyXG4gICAgZm9ybURhdGEuZ2V0TGVuZ3RoKChlcnJvciwgbGVuZ3RoKSA9PiB7XG4gICAgICAvLyBUT0RPOiBBZGQgY2h1bmtlZCBlbmNvZGluZyB3aGVuIG5vIGxlbmd0aCAoaWYgZXJyKVxuICAgICAgaWYgKGVycm9yKSBkZWJ1ZygnZm9ybURhdGEuZ2V0TGVuZ3RoIGhhZCBlcnJvcicsIGVycm9yLCBsZW5ndGgpO1xuXG4gICAgICBkZWJ1ZygnZ290IEZvcm1EYXRhIENvbnRlbnQtTGVuZ3RoOiAlcycsIGxlbmd0aCk7XG4gICAgICBpZiAodHlwZW9mIGxlbmd0aCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmVxLnNldEhlYWRlcignQ29udGVudC1MZW5ndGgnLCBsZW5ndGgpO1xuICAgICAgfVxuXG4gICAgICBmb3JtRGF0YS5waXBlKGdldFByb2dyZXNzTW9uaXRvcigpKS5waXBlKHJlcSk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKGRhdGEpKSB7XG4gICAgYnVmZmVyVG9DaHVua3MoZGF0YSkucGlwZShnZXRQcm9ncmVzc01vbml0b3IoKSkucGlwZShyZXEpO1xuICB9IGVsc2Uge1xuICAgIHJlcS5lbmQoZGF0YSk7XG4gIH1cbn07XG5cbi8vIENoZWNrIHdoZXRoZXIgcmVzcG9uc2UgaGFzIGEgbm9uLTAtc2l6ZWQgZ3ppcC1lbmNvZGVkIGJvZHlcblJlcXVlc3QucHJvdG90eXBlLl9zaG91bGRVbnppcCA9IChyZXMpID0+IHtcbiAgaWYgKHJlcy5zdGF0dXNDb2RlID09PSAyMDQgfHwgcmVzLnN0YXR1c0NvZGUgPT09IDMwNCkge1xuICAgIC8vIFRoZXNlIGFyZW4ndCBzdXBwb3NlZCB0byBoYXZlIGFueSBib2R5XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gaGVhZGVyIGNvbnRlbnQgaXMgYSBzdHJpbmcsIGFuZCBkaXN0aW5jdGlvbiBiZXR3ZWVuIDAgYW5kIG5vIGluZm9ybWF0aW9uIGlzIGNydWNpYWxcbiAgaWYgKHJlcy5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddID09PSAnMCcpIHtcbiAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGJvZHkgaXMgZW1wdHkgKHVuZm9ydHVuYXRlbHksIHRoaXMgY2hlY2sgZG9lcyBub3QgY292ZXIgY2h1bmtlZCBlbmNvZGluZylcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBjb25zb2xlLmxvZyhyZXMpO1xuICByZXR1cm4gL15cXHMqKD86ZGVmbGF0ZXxnemlwKVxccyokLy50ZXN0KHJlcy5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10pO1xufTtcblxuLyoqXG4gKiBPdmVycmlkZXMgRE5TIGZvciBzZWxlY3RlZCBob3N0bmFtZXMuIFRha2VzIG9iamVjdCBtYXBwaW5nIGhvc3RuYW1lcyB0byBJUCBhZGRyZXNzZXMuXG4gKlxuICogV2hlbiBtYWtpbmcgYSByZXF1ZXN0IHRvIGEgVVJMIHdpdGggYSBob3N0bmFtZSBleGFjdGx5IG1hdGNoaW5nIGEga2V5IGluIHRoZSBvYmplY3QsXG4gKiB1c2UgdGhlIGdpdmVuIElQIGFkZHJlc3MgdG8gY29ubmVjdCwgaW5zdGVhZCBvZiB1c2luZyBETlMgdG8gcmVzb2x2ZSB0aGUgaG9zdG5hbWUuXG4gKlxuICogQSBzcGVjaWFsIGhvc3QgYCpgIG1hdGNoZXMgZXZlcnkgaG9zdG5hbWUgKGtlZXAgcmVkaXJlY3RzIGluIG1pbmQhKVxuICpcbiAqICAgICAgcmVxdWVzdC5jb25uZWN0KHtcbiAqICAgICAgICAndGVzdC5leGFtcGxlLmNvbSc6ICcxMjcuMC4wLjEnLFxuICogICAgICAgICdpcHY2LmV4YW1wbGUuY29tJzogJzo6MScsXG4gKiAgICAgIH0pXG4gKi9cblJlcXVlc3QucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAoY29ubmVjdE92ZXJyaWRlKSB7XG4gIGlmICh0eXBlb2YgY29ubmVjdE92ZXJyaWRlID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuX2Nvbm5lY3RPdmVycmlkZSA9IHsgJyonOiBjb25uZWN0T3ZlcnJpZGUgfTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY29ubmVjdE92ZXJyaWRlID09PSAnb2JqZWN0Jykge1xuICAgIHRoaXMuX2Nvbm5lY3RPdmVycmlkZSA9IGNvbm5lY3RPdmVycmlkZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9jb25uZWN0T3ZlcnJpZGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cblJlcXVlc3QucHJvdG90eXBlLnRydXN0TG9jYWxob3N0ID0gZnVuY3Rpb24gKHRvZ2dsZSkge1xuICB0aGlzLl90cnVzdExvY2FsaG9zdCA9IHRvZ2dsZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHRvZ2dsZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBnZW5lcmF0ZSBIVFRQIHZlcmIgbWV0aG9kc1xuaWYgKCFtZXRob2RzLmluY2x1ZGVzKCdkZWwnKSkge1xuICAvLyBjcmVhdGUgYSBjb3B5IHNvIHdlIGRvbid0IGNhdXNlIGNvbmZsaWN0cyB3aXRoXG4gIC8vIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBtZXRob2RzIHBhY2thZ2UgYW5kXG4gIC8vIG5wbSAzLnhcbiAgbWV0aG9kcyA9IFsuLi5tZXRob2RzXTtcbiAgbWV0aG9kcy5wdXNoKCdkZWwnKTtcbn1cblxuZm9yIChsZXQgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgY29uc3QgbmFtZSA9IG1ldGhvZDtcbiAgbWV0aG9kID0gbWV0aG9kID09PSAnZGVsJyA/ICdkZWxldGUnIDogbWV0aG9kO1xuXG4gIG1ldGhvZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICByZXF1ZXN0W25hbWVdID0gKHVybCwgZGF0YSwgZm4pID0+IHtcbiAgICBjb25zdCByZXF1ZXN0XyA9IHJlcXVlc3QobWV0aG9kLCB1cmwpO1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZm4gPSBkYXRhO1xuICAgICAgZGF0YSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIGlmIChtZXRob2QgPT09ICdHRVQnIHx8IG1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgICAgIHJlcXVlc3RfLnF1ZXJ5KGRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVxdWVzdF8uc2VuZChkYXRhKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZm4pIHJlcXVlc3RfLmVuZChmbik7XG4gICAgcmV0dXJuIHJlcXVlc3RfO1xuICB9O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGBtaW1lYCBpcyB0ZXh0IGFuZCBzaG91bGQgYmUgYnVmZmVyZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1pbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGlzVGV4dChtaW1lKSB7XG4gIGNvbnN0IHBhcnRzID0gbWltZS5zcGxpdCgnLycpO1xuICBsZXQgdHlwZSA9IHBhcnRzWzBdO1xuICBpZiAodHlwZSkgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gIGxldCBzdWJ0eXBlID0gcGFydHNbMV07XG4gIGlmIChzdWJ0eXBlKSBzdWJ0eXBlID0gc3VidHlwZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcblxuICByZXR1cm4gdHlwZSA9PT0gJ3RleHQnIHx8IHN1YnR5cGUgPT09ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnO1xufVxuXG5mdW5jdGlvbiBpc0ltYWdlT3JWaWRlbyhtaW1lKSB7XG4gIGxldCB0eXBlID0gbWltZS5zcGxpdCgnLycpWzBdO1xuICBpZiAodHlwZSkgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgcmV0dXJuIHR5cGUgPT09ICdpbWFnZScgfHwgdHlwZSA9PT0gJ3ZpZGVvJztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBgbWltZWAgaXMganNvbiBvciBoYXMgK2pzb24gc3RydWN0dXJlZCBzeW50YXggc3VmZml4LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtaW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNKU09OKG1pbWUpIHtcbiAgLy8gc2hvdWxkIG1hdGNoIC9qc29uIG9yICtqc29uXG4gIC8vIGJ1dCBub3QgL2pzb24tc2VxXG4gIHJldHVybiAvWy8rXWpzb24oJHxbXi1cXHddKS9pLnRlc3QobWltZSk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgd2Ugc2hvdWxkIGZvbGxvdyB0aGUgcmVkaXJlY3QgYGNvZGVgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNSZWRpcmVjdChjb2RlKSB7XG4gIHJldHVybiBbMzAxLCAzMDIsIDMwMywgMzA1LCAzMDcsIDMwOF0uaW5jbHVkZXMoY29kZSk7XG59XG4iXX0= |
\ | No newline at end of file |