PageSourceSearch

https://laruscapital.com/local/templates/larus/scripts/app.js

js laruscapital.com collected 2026-10-07 18:13:42 UTC 3,910,091 bytes, 46,184 lines download raw bytes

vendor: 3,594 bytes, lines 1-88
1/******/ (function(modules) { // webpackBootstrap
2/******/ 	// The module cache
3/******/ 	var installedModules = {};
4/******/
5/******/ 	// The require function
6/******/ 	function __webpack_require__(moduleId) {
7/******/
8/******/ 		// Check if module is in cache
9/******/ 		if(installedModules[moduleId]) {
10/******/ 			return installedModules[moduleId].exports;
11/******/ 		}
12/******/ 		// Create a new module (and put it into the cache)
13/******/ 		var module = installedModules[moduleId] = {
14/******/ 			i: moduleId,
15/******/ 			l: false,
16/******/ 			exports: {}
17/******/ 		};
18/******/
19/******/ 		// Execute the module function
20/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21/******/
22/******/ 		// Flag the module as loaded
23/******/ 		module.l = true;
24/******/
25/******/ 		// Return the exports of the module
26/******/ 		return module.exports;
27/******/ 	}
28/******/
29/******/
30/******/ 	// expose the modules object (__webpack_modules__)
31/******/ 	__webpack_require__.m = modules;
32/******/
33/******/ 	// expose the module cache
34/******/ 	__webpack_require__.c = installedModules;
35/******/
36/******/ 	// define getter function for harmony exports
37/******/ 	__webpack_require__.d = function(exports, name, getter) {
38/******/ 		if(!__webpack_require__.o(exports, name)) {
39/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
40/******/ 		}
41/******/ 	};
42/******/
43/******/ 	// define __esModule on exports
44/******/ 	__webpack_require__.r = function(exports) {
45/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
46/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
47/******/ 		}
48/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
49/******/ 	};
50/******/
51/******/ 	// create a fake namespace object
52/******/ 	// mode & 1: value is a module id, require it
53/******/ 	// mode & 2: merge all properties of value into the ns
54/******/ 	// mode & 4: return value when already ns object
55/******/ 	// mode & 8|1: behave like require
56/******/ 	__webpack_require__.t = function(value, mode) {
57/******/ 		if(mode & 1) value = __webpack_require__(value);
58/******/ 		if(mode & 8) return value;
59/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
60/******/ 		var ns = Object.create(null);
61/******/ 		__webpack_require__.r(ns);
62/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
63/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
64/******/ 		return ns;
65/******/ 	};
66/******/
67/******/ 	// getDefaultExport function for compatibility with non-harmony modules
68/******/ 	__webpack_require__.n = function(module) {
69/******/ 		var getter = module && module.__esModule ?
70/******/ 			function getDefault() { return module['default']; } :
71/******/ 			function getModuleExports() { return module; };
72/******/ 		__webpack_require__.d(getter, 'a', getter);
73/******/ 		return getter;
74/******/ 	};
75/******/
76/******/ 	// Object.prototype.hasOwnProperty.call
77/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
78/******/
79/******/ 	// __webpack_public_path__
80/******/ 	__webpack_require__.p = "";
81/******/
82/******/
83/******/ 	// Load entry module and return exports
84/******/ 	return __webpack_require__(__webpack_require__.s = 1);
85/******/ })
86/************************************************************************/
87/******/ ({
88
vendor: 1,588 bytes, lines 89-128
89/***/ "../node_modules/babel-polyfill/lib/index.js":
90/*!***************************************************!*\
91  !*** ../node_modules/babel-polyfill/lib/index.js ***!
92  \***************************************************/
93/*! no static exports found */
94/***/ (function(module, exports, __webpack_require__) {
95
96"use strict";
97/* WEBPACK VAR INJECTION */(function(global) {
98
99__webpack_require__(/*! core-js/shim */ "../node_modules/babel-polyfill/node_modules/core-js/shim.js");
100
101__webpack_require__(/*! regenerator-runtime/runtime */ "../node_modules/regenerator-runtime/runtime.js");
102
103__webpack_require__(/*! core-js/fn/regexp/escape */ "../node_modules/babel-polyfill/node_modules/core-js/fn/regexp/escape.js");
104
105if (global._babelPolyfill) {
106  throw new Error("only one instance of babel-polyfill is allowed");
107}
108
109global._babelPolyfill = true;
110var DEFINE_PROPERTY = "defineProperty";
111
112function define(O, key, value) {
113  O[key] || Object[DEFINE_PROPERTY](O, key, {
114    writable: true,
115    configurable: true,
116    value: value
117  });
118}
119
120define(String.prototype, "padLeft", "".padStart);
121define(String.prototype, "padRight", "".padEnd);
122"pop,reverse,shift,keys,values,entries,indexOf,every,some,forEach,map,filter,find,findIndex,includes,join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill".split(",").forEach(function (key) {
123  [][key] && define(Array, key, Function.call.bind([][key]));
124});
125/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "../node_modules/webpack/buildin/global.js")))
126
127/***/ }),
128
vendor: 733 bytes, lines 129-141
129/***/ "../node_modules/babel-polyfill/node_modules/core-js/fn/regexp/escape.js":
130/*!*******************************************************************************!*\
131  !*** ../node_modules/babel-polyfill/node_modules/core-js/fn/regexp/escape.js ***!
132  \*******************************************************************************/
133/*! no static exports found */
134/***/ (function(module, exports, __webpack_require__) {
135
136__webpack_require__(/*! ../../modules/core.regexp.escape */ "../node_modules/babel-polyfill/node_modules/core-js/modules/core.regexp.escape.js");
137
138module.exports = __webpack_require__(/*! ../../modules/_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js").RegExp.escape;
139
140/***/ }),
141
vendor: 551 bytes, lines 142-155
142/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js":
143/*!**********************************************************************************!*\
144  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js ***!
145  \**********************************************************************************/
146/*! no static exports found */
147/***/ (function(module, exports) {
148
149module.exports = function (it) {
150  if (typeof it != 'function') throw TypeError(it + ' is not a function!');
151  return it;
152};
153
154/***/ }),
155
vendor: 709 bytes, lines 156-171
156/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-number-value.js":
157/*!**************************************************************************************!*\
158  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_a-number-value.js ***!
159  \**************************************************************************************/
160/*! no static exports found */
161/***/ (function(module, exports, __webpack_require__) {
162
163var cof = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js");
164
165module.exports = function (it, msg) {
166  if (typeof it != 'number' && cof(it) != 'Number') throw TypeError(msg);
167  return +it;
168};
169
170/***/ }),
171
vendor: 953 bytes, lines 172-190
172/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js":
173/*!******************************************************************************************!*\
174  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js ***!
175  \******************************************************************************************/
176/*! no static exports found */
177/***/ (function(module, exports, __webpack_require__) {
178
179// 22.1.3.31 Array.prototype[@@unscopables]
180var UNSCOPABLES = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('unscopables');
181
182var ArrayProto = Array.prototype;
183if (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js")(ArrayProto, UNSCOPABLES, {});
184
185module.exports = function (key) {
186  ArrayProto[UNSCOPABLES][key] = true;
187};
188
189/***/ }),
190
vendor: 844 bytes, lines 191-210
191/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_advance-string-index.js":
192/*!********************************************************************************************!*\
193  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_advance-string-index.js ***!
194  \********************************************************************************************/
195/*! no static exports found */
196/***/ (function(module, exports, __webpack_require__) {
197
198"use strict";
199
200
201var at = __webpack_require__(/*! ./_string-at */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-at.js")(true); // `AdvanceStringIndex` abstract operation
202// https://tc39.github.io/ecma262/#sec-advancestringindex
203
204
205module.exports = function (S, index, unicode) {
206  return index + (unicode ? at(S, index).length : 1);
207};
208
209/***/ }),
210
vendor: 668 bytes, lines 211-227
211/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js":
212/*!***********************************************************************************!*\
213  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js ***!
214  \***********************************************************************************/
215/*! no static exports found */
216/***/ (function(module, exports) {
217
218module.exports = function (it, Constructor, name, forbiddenField) {
219  if (!(it instanceof Constructor) || forbiddenField !== undefined && forbiddenField in it) {
220    throw TypeError(name + ': incorrect invocation!');
221  }
222
223  return it;
224};
225
226/***/ }),
227
vendor: 691 bytes, lines 228-243
228/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js":
229/*!*********************************************************************************!*\
230  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js ***!
231  \*********************************************************************************/
232/*! no static exports found */
233/***/ (function(module, exports, __webpack_require__) {
234
235var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
236
237module.exports = function (it) {
238  if (!isObject(it)) throw TypeError(it + ' is not an object!');
239  return it;
240};
241
242/***/ }),
243
vendor: 1,644 bytes, lines 244-290
244/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-copy-within.js":
245/*!*****************************************************************************************!*\
246  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_array-copy-within.js ***!
247  \*****************************************************************************************/
248/*! no static exports found */
249/***/ (function(module, exports, __webpack_require__) {
250
251"use strict";
252// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)
253
254
255var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js");
256
257var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js");
258
259var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
260
261module.exports = [].copyWithin || function copyWithin(target
262/* = 0 */
263, start
264/* = 0, end = @length */
265) {
266  var O = toObject(this);
267  var len = toLength(O.length);
268  var to = toAbsoluteIndex(target, len);
269  var from = toAbsoluteIndex(start, len);
270  var end = arguments.length > 2 ? arguments[2] : undefined;
271  var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);
272  var inc = 1;
273
274  if (from < to && to < from + count) {
275    inc = -1;
276    from += count - 1;
277    to += count - 1;
278  }
279
280  while (count-- > 0) {
281    if (from in O) O[to] = O[from];else delete O[to];
282    to += inc;
283    from += inc;
284  }
285
286  return O;
287};
288
289/***/ }),
290
vendor: 1,395 bytes, lines 291-326
291/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-fill.js":
292/*!**********************************************************************************!*\
293  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_array-fill.js ***!
294  \**********************************************************************************/
295/*! no static exports found */
296/***/ (function(module, exports, __webpack_require__) {
297
298"use strict";
299// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)
300
301
302var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js");
303
304var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js");
305
306var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
307
308module.exports = function fill(value
309/* , start = 0, end = @length */
310) {
311  var O = toObject(this);
312  var length = toLength(O.length);
313  var aLen = arguments.length;
314  var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);
315  var end = aLen > 2 ? arguments[2] : undefined;
316  var endPos = end === undefined ? length : toAbsoluteIndex(end, length);
317
318  while (endPos > index) {
319    O[index++] = value;
320  }
321
322  return O;
323};
324
325/***/ }),
326
vendor: 745 bytes, lines 327-343
327/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-from-iterable.js":
328/*!*******************************************************************************************!*\
329  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_array-from-iterable.js ***!
330  \*******************************************************************************************/
331/*! no static exports found */
332/***/ (function(module, exports, __webpack_require__) {
333
334var forOf = __webpack_require__(/*! ./_for-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js");
335
336module.exports = function (iter, ITERATOR) {
337  var result = [];
338  forOf(iter, false, result.push, result, ITERATOR);
339  return result;
340};
341
342/***/ }),
343
vendor: 1,689 bytes, lines 344-381
344/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-includes.js":
345/*!**************************************************************************************!*\
346  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_array-includes.js ***!
347  \**************************************************************************************/
348/*! no static exports found */
349/***/ (function(module, exports, __webpack_require__) {
350
351// false -> Array#indexOf
352// true  -> Array#includes
353var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js");
354
355var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
356
357var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js");
358
359module.exports = function (IS_INCLUDES) {
360  return function ($this, el, fromIndex) {
361    var O = toIObject($this);
362    var length = toLength(O.length);
363    var index = toAbsoluteIndex(fromIndex, length);
364    var value; // Array#includes uses SameValueZero equality algorithm
365    // eslint-disable-next-line no-self-compare
366
367    if (IS_INCLUDES && el != el) while (length > index) {
368      value = O[index++]; // eslint-disable-next-line no-self-compare
369
370      if (value != value) return true; // Array#indexOf ignores holes, Array#includes - not
371    } else for (; length > index; index++) {
372      if (IS_INCLUDES || index in O) {
373        if (O[index] === el) return IS_INCLUDES || index || 0;
374      }
375    }
376    return !IS_INCLUDES && -1;
377  };
378};
379
380/***/ }),
381
vendor: 2,556 bytes, lines 382-456
382/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js":
383/*!*************************************************************************************!*\
384  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js ***!
385  \*************************************************************************************/
386/*! no static exports found */
387/***/ (function(module, exports, __webpack_require__) {
388
389// 0 -> Array#forEach
390// 1 -> Array#map
391// 2 -> Array#filter
392// 3 -> Array#some
393// 4 -> Array#every
394// 5 -> Array#find
395// 6 -> Array#findIndex
396var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js");
397
398var IObject = __webpack_require__(/*! ./_iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iobject.js");
399
400var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js");
401
402var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
403
404var asc = __webpack_require__(/*! ./_array-species-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-create.js");
405
406module.exports = function (TYPE, $create) {
407  var IS_MAP = TYPE == 1;
408  var IS_FILTER = TYPE == 2;
409  var IS_SOME = TYPE == 3;
410  var IS_EVERY = TYPE == 4;
411  var IS_FIND_INDEX = TYPE == 6;
412  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
413  var create = $create || asc;
414  return function ($this, callbackfn, that) {
415    var O = toObject($this);
416    var self = IObject(O);
417    var f = ctx(callbackfn, that, 3);
418    var length = toLength(self.length);
419    var index = 0;
420    var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
421    var val, res;
422
423    for (; length > index; index++) {
424      if (NO_HOLES || index in self) {
425        val = self[index];
426        res = f(val, index, O);
427
428        if (TYPE) {
429          if (IS_MAP) result[index] = res; // map
430          else if (res) switch (TYPE) {
431              case 3:
432                return true;
433              // some
434
435              case 5:
436                return val;
437              // find
438
439              case 6:
440                return index;
441              // findIndex
442
443              case 2:
444                result.push(val);
445              // filter
446            } else if (IS_EVERY) return false; // every
447        }
448      }
449    }
450
451    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
452  };
453};
454
455/***/ }),
456
vendor: 1,669 bytes, lines 457-503
457/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-reduce.js":
458/*!************************************************************************************!*\
459  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_array-reduce.js ***!
460  \************************************************************************************/
461/*! no static exports found */
462/***/ (function(module, exports, __webpack_require__) {
463
464var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js");
465
466var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js");
467
468var IObject = __webpack_require__(/*! ./_iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iobject.js");
469
470var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
471
472module.exports = function (that, callbackfn, aLen, memo, isRight) {
473  aFunction(callbackfn);
474  var O = toObject(that);
475  var self = IObject(O);
476  var length = toLength(O.length);
477  var index = isRight ? length - 1 : 0;
478  var i = isRight ? -1 : 1;
479  if (aLen < 2) for (;;) {
480    if (index in self) {
481      memo = self[index];
482      index += i;
483      break;
484    }
485
486    index += i;
487
488    if (isRight ? index < 0 : length <= index) {
489      throw TypeError('Reduce of empty array with no initial value');
490    }
491  }
492
493  for (; isRight ? index >= 0 : length > index; index += i) {
494    if (index in self) {
495      memo = callbackfn(memo, self[index], index, O);
496    }
497  }
498
499  return memo;
500};
501
502/***/ }),
503
vendor: 1,258 bytes, lines 504-535
504/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-constructor.js":
505/*!*************************************************************************************************!*\
506  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-constructor.js ***!
507  \*************************************************************************************************/
508/*! no static exports found */
509/***/ (function(module, exports, __webpack_require__) {
510
511var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
512
513var isArray = __webpack_require__(/*! ./_is-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array.js");
514
515var SPECIES = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('species');
516
517module.exports = function (original) {
518  var C;
519
520  if (isArray(original)) {
521    C = original.constructor; // cross-realm fallback
522
523    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;
524
525    if (isObject(C)) {
526      C = C[SPECIES];
527      if (C === null) C = undefined;
528    }
529  }
530
531  return C === undefined ? Array : C;
532};
533
534/***/ }),
535
vendor: 819 bytes, lines 536-551
536/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-create.js":
537/*!********************************************************************************************!*\
538  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-create.js ***!
539  \********************************************************************************************/
540/*! no static exports found */
541/***/ (function(module, exports, __webpack_require__) {
542
543// 9.4.2.3 ArraySpeciesCreate(originalArray, length)
544var speciesConstructor = __webpack_require__(/*! ./_array-species-constructor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-constructor.js");
545
546module.exports = function (original, length) {
547  return new (speciesConstructor(original))(length);
548};
549
550/***/ }),
551
vendor: 1,645 bytes, lines 552-602
552/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_bind.js":
553/*!****************************************************************************!*\
554  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_bind.js ***!
555  \****************************************************************************/
556/*! no static exports found */
557/***/ (function(module, exports, __webpack_require__) {
558
559"use strict";
560
561
562var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js");
563
564var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
565
566var invoke = __webpack_require__(/*! ./_invoke */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_invoke.js");
567
568var arraySlice = [].slice;
569var factories = {};
570
571var construct = function construct(F, len, args) {
572  if (!(len in factories)) {
573    for (var n = [], i = 0; i < len; i++) {
574      n[i] = 'a[' + i + ']';
575    } // eslint-disable-next-line no-new-func
576
577
578    factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');
579  }
580
581  return factories[len](F, args);
582};
583
584module.exports = Function.bind || function bind(that
585/* , ...args */
586) {
587  var fn = aFunction(this);
588  var partArgs = arraySlice.call(arguments, 1);
589
590  var bound = function bound()
591  /* args... */
592  {
593    var args = partArgs.concat(arraySlice.call(arguments));
594    return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);
595  };
596
597  if (isObject(fn.prototype)) bound.prototype = fn.prototype;
598  return bound;
599};
600
601/***/ }),
602
vendor: 1,326 bytes, lines 603-637
603/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js":
604/*!*******************************************************************************!*\
605  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js ***!
606  \*******************************************************************************/
607/*! no static exports found */
608/***/ (function(module, exports, __webpack_require__) {
609
610// getting tag from 19.1.3.6 Object.prototype.toString()
611var cof = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js");
612
613var TAG = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('toStringTag'); // ES3 wrong here
614
615
616var ARG = cof(function () {
617  return arguments;
618}()) == 'Arguments'; // fallback for IE11 Script Access Denied error
619
620var tryGet = function tryGet(it, key) {
621  try {
622    return it[key];
623  } catch (e) {
624    /* empty */
625  }
626};
627
628module.exports = function (it) {
629  var O, T, B;
630  return it === undefined ? 'Undefined' : it === null ? 'Null' // @@toStringTag case
631  : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T // builtinTag case
632  : ARG ? cof(O) // ES3 arguments fallback
633  : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
634};
635
636/***/ }),
637
vendor: 504 bytes, lines 638-652
638/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js":
639/*!***************************************************************************!*\
640  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js ***!
641  \***************************************************************************/
642/*! no static exports found */
643/***/ (function(module, exports) {
644
645var toString = {}.toString;
646
647module.exports = function (it) {
648  return toString.call(it).slice(8, -1);
649};
650
651/***/ }),
652
vendor: 6,610 bytes, lines 653-846
653/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-strong.js":
654/*!*****************************************************************************************!*\
655  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-strong.js ***!
656  \*****************************************************************************************/
657/*! no static exports found */
658/***/ (function(module, exports, __webpack_require__) {
659
660"use strict";
661
662
663var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f;
664
665var create = __webpack_require__(/*! ./_object-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js");
666
667var redefineAll = __webpack_require__(/*! ./_redefine-all */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js");
668
669var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js");
670
671var anInstance = __webpack_require__(/*! ./_an-instance */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js");
672
673var forOf = __webpack_require__(/*! ./_for-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js");
674
675var $iterDefine = __webpack_require__(/*! ./_iter-define */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-define.js");
676
677var step = __webpack_require__(/*! ./_iter-step */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-step.js");
678
679var setSpecies = __webpack_require__(/*! ./_set-species */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js");
680
681var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js");
682
683var fastKey = __webpack_require__(/*! ./_meta */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js").fastKey;
684
685var validate = __webpack_require__(/*! ./_validate-collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js");
686
687var SIZE = DESCRIPTORS ? '_s' : 'size';
688
689var getEntry = function getEntry(that, key) {
690  // fast case
691  var index = fastKey(key);
692  var entry;
693  if (index !== 'F') return that._i[index]; // frozen object case
694
695  for (entry = that._f; entry; entry = entry.n) {
696    if (entry.k == key) return entry;
697  }
698};
699
700module.exports = {
701  getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) {
702    var C = wrapper(function (that, iterable) {
703      anInstance(that, C, NAME, '_i');
704      that._t = NAME; // collection type
705
706      that._i = create(null); // index
707
708      that._f = undefined; // first entry
709
710      that._l = undefined; // last entry
711
712      that[SIZE] = 0; // size
713
714      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
715    });
716    redefineAll(C.prototype, {
717      // 23.1.3.1 Map.prototype.clear()
718      // 23.2.3.2 Set.prototype.clear()
719      clear: function clear() {
720        for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {
721          entry.r = true;
722          if (entry.p) entry.p = entry.p.n = undefined;
723          delete data[entry.i];
724        }
725
726        that._f = that._l = undefined;
727        that[SIZE] = 0;
728      },
729      // 23.1.3.3 Map.prototype.delete(key)
730      // 23.2.3.4 Set.prototype.delete(value)
731      'delete': function _delete(key) {
732        var that = validate(this, NAME);
733        var entry = getEntry(that, key);
734
735        if (entry) {
736          var next = entry.n;
737          var prev = entry.p;
738          delete that._i[entry.i];
739          entry.r = true;
740          if (prev) prev.n = next;
741          if (next) next.p = prev;
742          if (that._f == entry) that._f = next;
743          if (that._l == entry) that._l = prev;
744          that[SIZE]--;
745        }
746
747        return !!entry;
748      },
749      // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)
750      // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)
751      forEach: function forEach(callbackfn
752      /* , that = undefined */
753      ) {
754        validate(this, NAME);
755        var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
756        var entry;
757
758        while (entry = entry ? entry.n : this._f) {
759          f(entry.v, entry.k, this); // revert to the last existing entry
760
761          while (entry && entry.r) {
762            entry = entry.p;
763          }
764        }
765      },
766      // 23.1.3.7 Map.prototype.has(key)
767      // 23.2.3.7 Set.prototype.has(value)
768      has: function has(key) {
769        return !!getEntry(validate(this, NAME), key);
770      }
771    });
772    if (DESCRIPTORS) dP(C.prototype, 'size', {
773      get: function get() {
774        return validate(this, NAME)[SIZE];
775      }
776    });
777    return C;
778  },
779  def: function def(that, key, value) {
780    var entry = getEntry(that, key);
781    var prev, index; // change existing entry
782
783    if (entry) {
784      entry.v = value; // create new entry
785    } else {
786      that._l = entry = {
787        i: index = fastKey(key, true),
788        // <- index
789        k: key,
790        // <- key
791        v: value,
792        // <- value
793        p: prev = that._l,
794        // <- previous entry
795        n: undefined,
796        // <- next entry
797        r: false // <- removed
798
799      };
800      if (!that._f) that._f = entry;
801      if (prev) prev.n = entry;
802      that[SIZE]++; // add to index
803
804      if (index !== 'F') that._i[index] = entry;
805    }
806
807    return that;
808  },
809  getEntry: getEntry,
810  setStrong: function setStrong(C, NAME, IS_MAP) {
811    // add .keys, .values, .entries, [@@iterator]
812    // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11
813    $iterDefine(C, NAME, function (iterated, kind) {
814      this._t = validate(iterated, NAME); // target
815
816      this._k = kind; // kind
817
818      this._l = undefined; // previous
819    }, function () {
820      var that = this;
821      var kind = that._k;
822      var entry = that._l; // revert to the last existing entry
823
824      while (entry && entry.r) {
825        entry = entry.p;
826      } // get next entry
827
828
829      if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {
830        // or finish the iteration
831        that._t = undefined;
832        return step(1);
833      } // return step by kind
834
835
836      if (kind == 'keys') return step(0, entry.k);
837      if (kind == 'values') return step(0, entry.v);
838      return step(0, [entry.k, entry.v]);
839    }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); // add [@@species], 23.1.2.2, 23.2.2.2
840
841    setSpecies(NAME);
842  }
843};
844
845/***/ }),
846
vendor: 992 bytes, lines 847-867
847/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-to-json.js":
848/*!******************************************************************************************!*\
849  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-to-json.js ***!
850  \******************************************************************************************/
851/*! no static exports found */
852/***/ (function(module, exports, __webpack_require__) {
853
854// https://github.com/DavidBruant/Map-Set.prototype.toJSON
855var classof = __webpack_require__(/*! ./_classof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js");
856
857var from = __webpack_require__(/*! ./_array-from-iterable */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-from-iterable.js");
858
859module.exports = function (NAME) {
860  return function toJSON() {
861    if (classof(this) != NAME) throw TypeError(NAME + "#toJSON isn't generic");
862    return from(this);
863  };
864};
865
866/***/ }),
867
vendor: 4,189 bytes, lines 868-975
868/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-weak.js":
869/*!***************************************************************************************!*\
870  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-weak.js ***!
871  \***************************************************************************************/
872/*! no static exports found */
873/***/ (function(module, exports, __webpack_require__) {
874
875"use strict";
876
877
878var redefineAll = __webpack_require__(/*! ./_redefine-all */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js");
879
880var getWeak = __webpack_require__(/*! ./_meta */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js").getWeak;
881
882var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
883
884var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
885
886var anInstance = __webpack_require__(/*! ./_an-instance */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js");
887
888var forOf = __webpack_require__(/*! ./_for-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js");
889
890var createArrayMethod = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js");
891
892var $has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js");
893
894var validate = __webpack_require__(/*! ./_validate-collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js");
895
896var arrayFind = createArrayMethod(5);
897var arrayFindIndex = createArrayMethod(6);
898var id = 0; // fallback for uncaught frozen keys
899
900var uncaughtFrozenStore = function uncaughtFrozenStore(that) {
901  return that._l || (that._l = new UncaughtFrozenStore());
902};
903
904var UncaughtFrozenStore = function UncaughtFrozenStore() {
905  this.a = [];
906};
907
908var findUncaughtFrozen = function findUncaughtFrozen(store, key) {
909  return arrayFind(store.a, function (it) {
910    return it[0] === key;
911  });
912};
913
914UncaughtFrozenStore.prototype = {
915  get: function get(key) {
916    var entry = findUncaughtFrozen(this, key);
917    if (entry) return entry[1];
918  },
919  has: function has(key) {
920    return !!findUncaughtFrozen(this, key);
921  },
922  set: function set(key, value) {
923    var entry = findUncaughtFrozen(this, key);
924    if (entry) entry[1] = value;else this.a.push([key, value]);
925  },
926  'delete': function _delete(key) {
927    var index = arrayFindIndex(this.a, function (it) {
928      return it[0] === key;
929    });
930    if (~index) this.a.splice(index, 1);
931    return !!~index;
932  }
933};
934module.exports = {
935  getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) {
936    var C = wrapper(function (that, iterable) {
937      anInstance(that, C, NAME, '_i');
938      that._t = NAME; // collection type
939
940      that._i = id++; // collection id
941
942      that._l = undefined; // leak store for uncaught frozen objects
943
944      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
945    });
946    redefineAll(C.prototype, {
947      // 23.3.3.2 WeakMap.prototype.delete(key)
948      // 23.4.3.3 WeakSet.prototype.delete(value)
949      'delete': function _delete(key) {
950        if (!isObject(key)) return false;
951        var data = getWeak(key);
952        if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);
953        return data && $has(data, this._i) && delete data[this._i];
954      },
955      // 23.3.3.4 WeakMap.prototype.has(key)
956      // 23.4.3.4 WeakSet.prototype.has(value)
957      has: function has(key) {
958        if (!isObject(key)) return false;
959        var data = getWeak(key);
960        if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);
961        return data && $has(data, this._i);
962      }
963    });
964    return C;
965  },
966  def: function def(that, key, value) {
967    var data = getWeak(anObject(key), true);
968    if (data === true) uncaughtFrozenStore(that).set(key, value);else data[that._i] = value;
969    return that;
970  },
971  ufstore: uncaughtFrozenStore
972};
973
974/***/ }),
975
vendor: 4,930 bytes, lines 976-1097
976/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection.js":
977/*!**********************************************************************************!*\
978  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_collection.js ***!
979  \**********************************************************************************/
980/*! no static exports found */
981/***/ (function(module, exports, __webpack_require__) {
982
983"use strict";
984
985
986var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
987
988var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
989
990var redefine = __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js");
991
992var redefineAll = __webpack_require__(/*! ./_redefine-all */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js");
993
994var meta = __webpack_require__(/*! ./_meta */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js");
995
996var forOf = __webpack_require__(/*! ./_for-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js");
997
998var anInstance = __webpack_require__(/*! ./_an-instance */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js");
999
1000var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
1001
1002var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js");
1003
1004var $iterDetect = __webpack_require__(/*! ./_iter-detect */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-detect.js");
1005
1006var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js");
1007
1008var inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_inherit-if-required.js");
1009
1010module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {
1011  var Base = global[NAME];
1012  var C = Base;
1013  var ADDER = IS_MAP ? 'set' : 'add';
1014  var proto = C && C.prototype;
1015  var O = {};
1016
1017  var fixMethod = function fixMethod(KEY) {
1018    var fn = proto[KEY];
1019    redefine(proto, KEY, KEY == 'delete' ? function (a) {
1020      return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
1021    } : KEY == 'has' ? function has(a) {
1022      return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
1023    } : KEY == 'get' ? function get(a) {
1024      return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);
1025    } : KEY == 'add' ? function add(a) {
1026      fn.call(this, a === 0 ? 0 : a);
1027      return this;
1028    } : function set(a, b) {
1029      fn.call(this, a === 0 ? 0 : a, b);
1030      return this;
1031    });
1032  };
1033
1034  if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {
1035    new C().entries().next();
1036  }))) {
1037    // create collection constructor
1038    C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);
1039    redefineAll(C.prototype, methods);
1040    meta.NEED = true;
1041  } else {
1042    var instance = new C(); // early implementations not supports chaining
1043
1044    var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; // V8 ~  Chromium 40- weak-collections throws on primitives, but should return false
1045
1046    var THROWS_ON_PRIMITIVES = fails(function () {
1047      instance.has(1);
1048    }); // most early implementations doesn't supports iterables, most modern - not close it correctly
1049
1050    var ACCEPT_ITERABLES = $iterDetect(function (iter) {
1051      new C(iter);
1052    }); // eslint-disable-line no-new
1053    // for early implementations -0 and +0 not the same
1054
1055    var BUGGY_ZERO = !IS_WEAK && fails(function () {
1056      // V8 ~ Chromium 42- fails only with 5+ elements
1057      var $instance = new C();
1058      var index = 5;
1059
1060      while (index--) {
1061        $instance[ADDER](index, index);
1062      }
1063
1064      return !$instance.has(-0);
1065    });
1066
1067    if (!ACCEPT_ITERABLES) {
1068      C = wrapper(function (target, iterable) {
1069        anInstance(target, C, NAME);
1070        var that = inheritIfRequired(new Base(), target, C);
1071        if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
1072        return that;
1073      });
1074      C.prototype = proto;
1075      proto.constructor = C;
1076    }
1077
1078    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {
1079      fixMethod('delete');
1080      fixMethod('has');
1081      IS_MAP && fixMethod('get');
1082    }
1083
1084    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); // weak collections should not contains .clear method
1085
1086    if (IS_WEAK && proto.clear) delete proto.clear;
1087  }
1088
1089  setToStringTag(C, NAME);
1090  O[NAME] = C;
1091  $export($export.G + $export.W + $export.F * (C != Base), O);
1092  if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);
1093  return C;
1094};
1095
1096/***/ }),
1097
vendor: 526 bytes, lines 1098-1111
1098/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js":
1099/*!****************************************************************************!*\
1100  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js ***!
1101  \****************************************************************************/
1102/*! no static exports found */
1103/***/ (function(module, exports) {
1104
1105var core = module.exports = {
1106  version: '2.6.5'
1107};
1108if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
1109
1110/***/ }),
1111
vendor: 928 bytes, lines 1112-1131
1112/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_create-property.js":
1113/*!***************************************************************************************!*\
1114  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_create-property.js ***!
1115  \***************************************************************************************/
1116/*! no static exports found */
1117/***/ (function(module, exports, __webpack_require__) {
1118
1119"use strict";
1120
1121
1122var $defineProperty = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js");
1123
1124var createDesc = __webpack_require__(/*! ./_property-desc */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js");
1125
1126module.exports = function (object, index, value) {
1127  if (index in object) $defineProperty.f(object, index, createDesc(0, value));else object[index] = value;
1128};
1129
1130/***/ }),
1131
vendor: 1,073 bytes, lines 1132-1171
1132/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js":
1133/*!***************************************************************************!*\
1134  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js ***!
1135  \***************************************************************************/
1136/*! no static exports found */
1137/***/ (function(module, exports, __webpack_require__) {
1138
1139// optional / simple context binding
1140var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js");
1141
1142module.exports = function (fn, that, length) {
1143  aFunction(fn);
1144  if (that === undefined) return fn;
1145
1146  switch (length) {
1147    case 1:
1148      return function (a) {
1149        return fn.call(that, a);
1150      };
1151
1152    case 2:
1153      return function (a, b) {
1154        return fn.call(that, a, b);
1155      };
1156
1157    case 3:
1158      return function (a, b, c) {
1159        return fn.call(that, a, b, c);
1160      };
1161  }
1162
1163  return function ()
1164  /* ...args */
1165  {
1166    return fn.apply(that, arguments);
1167  };
1168};
1169
1170/***/ }),
1171
vendor: 1,556 bytes, lines 1172-1206
1172/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-iso-string.js":
1173/*!******************************************************************************************!*\
1174  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-iso-string.js ***!
1175  \******************************************************************************************/
1176/*! no static exports found */
1177/***/ (function(module, exports, __webpack_require__) {
1178
1179"use strict";
1180 // 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()
1181
1182var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js");
1183
1184var getTime = Date.prototype.getTime;
1185var $toISOString = Date.prototype.toISOString;
1186
1187var lz = function lz(num) {
1188  return num > 9 ? num : '0' + num;
1189}; // PhantomJS / old WebKit has a broken implementations
1190
1191
1192module.exports = fails(function () {
1193  return $toISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z';
1194}) || !fails(function () {
1195  $toISOString.call(new Date(NaN));
1196}) ? function toISOString() {
1197  if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value');
1198  var d = this;
1199  var y = d.getUTCFullYear();
1200  var m = d.getUTCMilliseconds();
1201  var s = y < 0 ? '-' : y > 9999 ? '+' : '';
1202  return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) + '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) + 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) + ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z';
1203} : $toISOString;
1204
1205/***/ }),
1206
vendor: 985 bytes, lines 1207-1229
1207/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-primitive.js":
1208/*!*****************************************************************************************!*\
1209  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-primitive.js ***!
1210  \*****************************************************************************************/
1211/*! no static exports found */
1212/***/ (function(module, exports, __webpack_require__) {
1213
1214"use strict";
1215
1216
1217var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
1218
1219var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js");
1220
1221var NUMBER = 'number';
1222
1223module.exports = function (hint) {
1224  if (hint !== 'string' && hint !== NUMBER && hint !== 'default') throw TypeError('Incorrect hint');
1225  return toPrimitive(anObject(this), hint != NUMBER);
1226};
1227
1228/***/ }),
1229
vendor: 576 bytes, lines 1230-1244
1230/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js":
1231/*!*******************************************************************************!*\
1232  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js ***!
1233  \*******************************************************************************/
1234/*! no static exports found */
1235/***/ (function(module, exports) {
1236
1237// 7.2.1 RequireObjectCoercible(argument)
1238module.exports = function (it) {
1239  if (it == undefined) throw TypeError("Can't call method on  " + it);
1240  return it;
1241};
1242
1243/***/ }),
1244
vendor: 743 bytes, lines 1245-1262
1245/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js":
1246/*!***********************************************************************************!*\
1247  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js ***!
1248  \***********************************************************************************/
1249/*! no static exports found */
1250/***/ (function(module, exports, __webpack_require__) {
1251
1252// Thank's IE8 for his funny defineProperty
1253module.exports = !__webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () {
1254  return Object.defineProperty({}, 'a', {
1255    get: function get() {
1256      return 7;
1257    }
1258  }).a != 7;
1259});
1260
1261/***/ }),
1262
vendor: 923 bytes, lines 1263-1282
1263/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_dom-create.js":
1264/*!**********************************************************************************!*\
1265  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_dom-create.js ***!
1266  \**********************************************************************************/
1267/*! no static exports found */
1268/***/ (function(module, exports, __webpack_require__) {
1269
1270var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
1271
1272var document = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").document; // typeof document.createElement is 'object' in old IE
1273
1274
1275var is = isObject(document) && isObject(document.createElement);
1276
1277module.exports = function (it) {
1278  return is ? document.createElement(it) : {};
1279};
1280
1281/***/ }),
1282
vendor: 592 bytes, lines 1283-1294
1283/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_enum-bug-keys.js":
1284/*!*************************************************************************************!*\
1285  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_enum-bug-keys.js ***!
1286  \*************************************************************************************/
1287/*! no static exports found */
1288/***/ (function(module, exports) {
1289
1290// IE 8- don't enum bug keys
1291module.exports = 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'.split(',');
1292
1293/***/ }),
1294
vendor: 1,218 bytes, lines 1295-1328
1295/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_enum-keys.js":
1296/*!*********************************************************************************!*\
1297  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_enum-keys.js ***!
1298  \*********************************************************************************/
1299/*! no static exports found */
1300/***/ (function(module, exports, __webpack_require__) {
1301
1302// all enumerable object keys, includes symbols
1303var getKeys = __webpack_require__(/*! ./_object-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js");
1304
1305var gOPS = __webpack_require__(/*! ./_object-gops */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gops.js");
1306
1307var pIE = __webpack_require__(/*! ./_object-pie */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-pie.js");
1308
1309module.exports = function (it) {
1310  var result = getKeys(it);
1311  var getSymbols = gOPS.f;
1312
1313  if (getSymbols) {
1314    var symbols = getSymbols(it);
1315    var isEnum = pIE.f;
1316    var i = 0;
1317    var key;
1318
1319    while (symbols.length > i) {
1320      if (isEnum.call(it, key = symbols[i++])) result.push(key);
1321    }
1322  }
1323
1324  return result;
1325};
1326
1327/***/ }),
1328
vendor: 2,477 bytes, lines 1329-1396
1329/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js":
1330/*!******************************************************************************!*\
1331  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js ***!
1332  \******************************************************************************/
1333/*! no static exports found */
1334/***/ (function(module, exports, __webpack_require__) {
1335
1336var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
1337
1338var core = __webpack_require__(/*! ./_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js");
1339
1340var hide = __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js");
1341
1342var redefine = __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js");
1343
1344var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js");
1345
1346var PROTOTYPE = 'prototype';
1347
1348var $export = function $export(type, name, source) {
1349  var IS_FORCED = type & $export.F;
1350  var IS_GLOBAL = type & $export.G;
1351  var IS_STATIC = type & $export.S;
1352  var IS_PROTO = type & $export.P;
1353  var IS_BIND = type & $export.B;
1354  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];
1355  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
1356  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});
1357  var key, own, out, exp;
1358  if (IS_GLOBAL) source = name;
1359
1360  for (key in source) {
1361    // contains in native
1362    own = !IS_FORCED && target && target[key] !== undefined; // export native or passed
1363
1364    out = (own ? target : source)[key]; // bind timers to global for call from export context
1365
1366    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; // extend global
1367
1368    if (target) redefine(target, key, out, type & $export.U); // export
1369
1370    if (exports[key] != out) hide(exports, key, exp);
1371    if (IS_PROTO && expProto[key] != out) expProto[key] = out;
1372  }
1373};
1374
1375global.core = core; // type bitmap
1376
1377$export.F = 1; // forced
1378
1379$export.G = 2; // global
1380
1381$export.S = 4; // static
1382
1383$export.P = 8; // proto
1384
1385$export.B = 16; // bind
1386
1387$export.W = 32; // wrap
1388
1389$export.U = 64; // safe
1390
1391$export.R = 128; // real proto method for `library`
1392
1393module.exports = $export;
1394
1395/***/ }),
1396
vendor: 820 bytes, lines 1397-1424
1397/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails-is-regexp.js":
1398/*!***************************************************************************************!*\
1399  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_fails-is-regexp.js ***!
1400  \***************************************************************************************/
1401/*! no static exports found */
1402/***/ (function(module, exports, __webpack_require__) {
1403
1404var MATCH = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('match');
1405
1406module.exports = function (KEY) {
1407  var re = /./;
1408
1409  try {
1410    '/./'[KEY](re);
1411  } catch (e) {
1412    try {
1413      re[MATCH] = false;
1414      return !'/./'[KEY](re);
1415    } catch (f) {
1416      /* empty */
1417    }
1418  }
1419
1420  return true;
1421};
1422
1423/***/ }),
1424
vendor: 510 bytes, lines 1425-1441
1425/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js":
1426/*!*****************************************************************************!*\
1427  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js ***!
1428  \*****************************************************************************/
1429/*! no static exports found */
1430/***/ (function(module, exports) {
1431
1432module.exports = function (exec) {
1433  try {
1434    return !!exec();
1435  } catch (e) {
1436    return true;
1437  }
1438};
1439
1440/***/ }),
1441
vendor: 4,485 bytes, lines 1442-1573
1442/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fix-re-wks.js":
1443/*!**********************************************************************************!*\
1444  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_fix-re-wks.js ***!
1445  \**********************************************************************************/
1446/*! no static exports found */
1447/***/ (function(module, exports, __webpack_require__) {
1448
1449"use strict";
1450
1451
1452__webpack_require__(/*! ./es6.regexp.exec */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.exec.js");
1453
1454var redefine = __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js");
1455
1456var hide = __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js");
1457
1458var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js");
1459
1460var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js");
1461
1462var wks = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js");
1463
1464var regexpExec = __webpack_require__(/*! ./_regexp-exec */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec.js");
1465
1466var SPECIES = wks('species');
1467var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {
1468  // #replace needs built-in support for named groups.
1469  // #match works fine because it just return the exec results, even if it has
1470  // a "grops" property.
1471  var re = /./;
1472
1473  re.exec = function () {
1474    var result = [];
1475    result.groups = {
1476      a: '7'
1477    };
1478    return result;
1479  };
1480
1481  return ''.replace(re, '$<a>') !== '7';
1482});
1483
1484var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = function () {
1485  // Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec
1486  var re = /(?:)/;
1487  var originalExec = re.exec;
1488
1489  re.exec = function () {
1490    return originalExec.apply(this, arguments);
1491  };
1492
1493  var result = 'ab'.split(re);
1494  return result.length === 2 && result[0] === 'a' && result[1] === 'b';
1495}();
1496
1497module.exports = function (KEY, length, exec) {
1498  var SYMBOL = wks(KEY);
1499  var DELEGATES_TO_SYMBOL = !fails(function () {
1500    // String methods call symbol-named RegEp methods
1501    var O = {};
1502
1503    O[SYMBOL] = function () {
1504      return 7;
1505    };
1506
1507    return ''[KEY](O) != 7;
1508  });
1509  var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () {
1510    // Symbol-named RegExp methods call .exec
1511    var execCalled = false;
1512    var re = /a/;
1513
1514    re.exec = function () {
1515      execCalled = true;
1516      return null;
1517    };
1518
1519    if (KEY === 'split') {
1520      // RegExp[@@split] doesn't call the regex's exec method, but first creates
1521      // a new one. We need to return the patched regex when creating the new one.
1522      re.constructor = {};
1523
1524      re.constructor[SPECIES] = function () {
1525        return re;
1526      };
1527    }
1528
1529    re[SYMBOL]('');
1530    return !execCalled;
1531  }) : undefined;
1532
1533  if (!DELEGATES_TO_SYMBOL || !DELEGATES_TO_EXEC || KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS || KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC) {
1534    var nativeRegExpMethod = /./[SYMBOL];
1535    var fns = exec(defined, SYMBOL, ''[KEY], function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {
1536      if (regexp.exec === regexpExec) {
1537        if (DELEGATES_TO_SYMBOL && !forceStringMethod) {
1538          // The native String method already delegates to @@method (this
1539          // polyfilled function), leasing to infinite recursion.
1540          // We avoid it by directly calling the native @@method method.
1541          return {
1542            done: true,
1543            value: nativeRegExpMethod.call(regexp, str, arg2)
1544          };
1545        }
1546
1547        return {
1548          done: true,
1549          value: nativeMethod.call(str, regexp, arg2)
1550        };
1551      }
1552
1553      return {
1554        done: false
1555      };
1556    });
1557    var strfn = fns[0];
1558    var rxfn = fns[1];
1559    redefine(String.prototype, KEY, strfn);
1560    hide(RegExp.prototype, SYMBOL, length == 2 // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)
1561    // 21.2.5.11 RegExp.prototype[@@split](string, limit)
1562    ? function (string, arg) {
1563      return rxfn.call(string, this, arg);
1564    } // 21.2.5.6 RegExp.prototype[@@match](string)
1565    // 21.2.5.9 RegExp.prototype[@@search](string)
1566    : function (string) {
1567      return rxfn.call(string, this);
1568    });
1569  }
1570};
1571
1572/***/ }),
1573
vendor: 893 bytes, lines 1574-1598
1574/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_flags.js":
1575/*!*****************************************************************************!*\
1576  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_flags.js ***!
1577  \*****************************************************************************/
1578/*! no static exports found */
1579/***/ (function(module, exports, __webpack_require__) {
1580
1581"use strict";
1582 // 21.2.5.3 get RegExp.prototype.flags
1583
1584var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
1585
1586module.exports = function () {
1587  var that = anObject(this);
1588  var result = '';
1589  if (that.global) result += 'g';
1590  if (that.ignoreCase) result += 'i';
1591  if (that.multiline) result += 'm';
1592  if (that.unicode) result += 'u';
1593  if (that.sticky) result += 'y';
1594  return result;
1595};
1596
1597/***/ }),
1598
vendor: 2,225 bytes, lines 1599-1654
1599/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_flatten-into-array.js":
1600/*!******************************************************************************************!*\
1601  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_flatten-into-array.js ***!
1602  \******************************************************************************************/
1603/*! no static exports found */
1604/***/ (function(module, exports, __webpack_require__) {
1605
1606"use strict";
1607 // https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray
1608
1609var isArray = __webpack_require__(/*! ./_is-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array.js");
1610
1611var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
1612
1613var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
1614
1615var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js");
1616
1617var IS_CONCAT_SPREADABLE = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('isConcatSpreadable');
1618
1619function flattenIntoArray(target, original, source, sourceLen, start, depth, mapper, thisArg) {
1620  var targetIndex = start;
1621  var sourceIndex = 0;
1622  var mapFn = mapper ? ctx(mapper, thisArg, 3) : false;
1623  var element, spreadable;
1624
1625  while (sourceIndex < sourceLen) {
1626    if (sourceIndex in source) {
1627      element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];
1628      spreadable = false;
1629
1630      if (isObject(element)) {
1631        spreadable = element[IS_CONCAT_SPREADABLE];
1632        spreadable = spreadable !== undefined ? !!spreadable : isArray(element);
1633      }
1634
1635      if (spreadable && depth > 0) {
1636        targetIndex = flattenIntoArray(target, original, element, toLength(element.length), targetIndex, depth - 1) - 1;
1637      } else {
1638        if (targetIndex >= 0x1fffffffffffff) throw TypeError();
1639        target[targetIndex] = element;
1640      }
1641
1642      targetIndex++;
1643    }
1644
1645    sourceIndex++;
1646  }
1647
1648  return targetIndex;
1649}
1650
1651module.exports = flattenIntoArray;
1652
1653/***/ }),
1654
vendor: 2,190 bytes, lines 1655-1699
1655/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js":
1656/*!******************************************************************************!*\
1657  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js ***!
1658  \******************************************************************************/
1659/*! no static exports found */
1660/***/ (function(module, exports, __webpack_require__) {
1661
1662var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js");
1663
1664var call = __webpack_require__(/*! ./_iter-call */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-call.js");
1665
1666var isArrayIter = __webpack_require__(/*! ./_is-array-iter */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array-iter.js");
1667
1668var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
1669
1670var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
1671
1672var getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/core.get-iterator-method.js");
1673
1674var BREAK = {};
1675var RETURN = {};
1676
1677var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
1678  var iterFn = ITERATOR ? function () {
1679    return iterable;
1680  } : getIterFn(iterable);
1681  var f = ctx(fn, that, entries ? 2 : 1);
1682  var index = 0;
1683  var length, step, iterator, result;
1684  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!'); // fast case for arrays with default iterator
1685
1686  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {
1687    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
1688    if (result === BREAK || result === RETURN) return result;
1689  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
1690    result = call(iterator, f, step.value, entries);
1691    if (result === BREAK || result === RETURN) return result;
1692  }
1693};
1694
1695exports.BREAK = BREAK;
1696exports.RETURN = RETURN;
1697
1698/***/ }),
1699
vendor: 656 bytes, lines 1700-1710
1700/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_function-to-string.js":
1701/*!******************************************************************************************!*\
1702  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_function-to-string.js ***!
1703  \******************************************************************************************/
1704/*! no static exports found */
1705/***/ (function(module, exports, __webpack_require__) {
1706
1707module.exports = __webpack_require__(/*! ./_shared */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared.js")('native-function-to-string', Function.toString);
1708
1709/***/ }),
1710
vendor: 773 bytes, lines 1711-1724
1711/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js":
1712/*!******************************************************************************!*\
1713  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js ***!
1714  \******************************************************************************/
1715/*! no static exports found */
1716/***/ (function(module, exports) {
1717
1718// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
1719var global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self // eslint-disable-next-line no-new-func
1720: Function('return this')();
1721if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
1722
1723/***/ }),
1724
vendor: 519 bytes, lines 1725-1739
1725/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js":
1726/*!***************************************************************************!*\
1727  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js ***!
1728  \***************************************************************************/
1729/*! no static exports found */
1730/***/ (function(module, exports) {
1731
1732var hasOwnProperty = {}.hasOwnProperty;
1733
1734module.exports = function (it, key) {
1735  return hasOwnProperty.call(it, key);
1736};
1737
1738/***/ }),
1739
vendor: 996 bytes, lines 1740-1759
1740/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js":
1741/*!****************************************************************************!*\
1742  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js ***!
1743  \****************************************************************************/
1744/*! no static exports found */
1745/***/ (function(module, exports, __webpack_require__) {
1746
1747var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js");
1748
1749var createDesc = __webpack_require__(/*! ./_property-desc */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js");
1750
1751module.exports = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") ? function (object, key, value) {
1752  return dP.f(object, key, createDesc(1, value));
1753} : function (object, key, value) {
1754  object[key] = value;
1755  return object;
1756};
1757
1758/***/ }),
1759
vendor: 615 bytes, lines 1760-1772
1760/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_html.js":
1761/*!****************************************************************************!*\
1762  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_html.js ***!
1763  \****************************************************************************/
1764/*! no static exports found */
1765/***/ (function(module, exports, __webpack_require__) {
1766
1767var document = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").document;
1768
1769module.exports = document && document.documentElement;
1770
1771/***/ }),
1772
vendor: 959 bytes, lines 1773-1789
1773/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ie8-dom-define.js":
1774/*!**************************************************************************************!*\
1775  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_ie8-dom-define.js ***!
1776  \**************************************************************************************/
1777/*! no static exports found */
1778/***/ (function(module, exports, __webpack_require__) {
1779
1780module.exports = !__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") && !__webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () {
1781  return Object.defineProperty(__webpack_require__(/*! ./_dom-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_dom-create.js")('div'), 'a', {
1782    get: function get() {
1783      return 7;
1784    }
1785  }).a != 7;
1786});
1787
1788/***/ }),
1789
vendor: 1,012 bytes, lines 1790-1813
1790/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_inherit-if-required.js":
1791/*!*******************************************************************************************!*\
1792  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_inherit-if-required.js ***!
1793  \*******************************************************************************************/
1794/*! no static exports found */
1795/***/ (function(module, exports, __webpack_require__) {
1796
1797var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
1798
1799var setPrototypeOf = __webpack_require__(/*! ./_set-proto */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-proto.js").set;
1800
1801module.exports = function (that, target, C) {
1802  var S = target.constructor;
1803  var P;
1804
1805  if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {
1806    setPrototypeOf(that, P);
1807  }
1808
1809  return that;
1810};
1811
1812/***/ }),
1813
vendor: 1,039 bytes, lines 1814-1846
1814/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_invoke.js":
1815/*!******************************************************************************!*\
1816  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_invoke.js ***!
1817  \******************************************************************************/
1818/*! no static exports found */
1819/***/ (function(module, exports) {
1820
1821// fast apply, http://jsperf.lnkit.com/fast-apply/5
1822module.exports = function (fn, args, that) {
1823  var un = that === undefined;
1824
1825  switch (args.length) {
1826    case 0:
1827      return un ? fn() : fn.call(that);
1828
1829    case 1:
1830      return un ? fn(args[0]) : fn.call(that, args[0]);
1831
1832    case 2:
1833      return un ? fn(args[0], args[1]) : fn.call(that, args[0], args[1]);
1834
1835    case 3:
1836      return un ? fn(args[0], args[1], args[2]) : fn.call(that, args[0], args[1], args[2]);
1837
1838    case 4:
1839      return un ? fn(args[0], args[1], args[2], args[3]) : fn.call(that, args[0], args[1], args[2], args[3]);
1840  }
1841
1842  return fn.apply(that, args);
1843};
1844
1845/***/ }),
1846
vendor: 813 bytes, lines 1847-1863
1847/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iobject.js":
1848/*!*******************************************************************************!*\
1849  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_iobject.js ***!
1850  \*******************************************************************************/
1851/*! no static exports found */
1852/***/ (function(module, exports, __webpack_require__) {
1853
1854// fallback for non-array-like ES3 and non-enumerable old V8 strings
1855var cof = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js"); // eslint-disable-next-line no-prototype-builtins
1856
1857
1858module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
1859  return cof(it) == 'String' ? it.split('') : Object(it);
1860};
1861
1862/***/ }),
1863
vendor: 920 bytes, lines 1864-1883
1864/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array-iter.js":
1865/*!*************************************************************************************!*\
1866  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array-iter.js ***!
1867  \*************************************************************************************/
1868/*! no static exports found */
1869/***/ (function(module, exports, __webpack_require__) {
1870
1871// check on default Array iterator
1872var Iterators = __webpack_require__(/*! ./_iterators */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js");
1873
1874var ITERATOR = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('iterator');
1875
1876var ArrayProto = Array.prototype;
1877
1878module.exports = function (it) {
1879  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);
1880};
1881
1882/***/ }),
1883
vendor: 674 bytes, lines 1884-1899
1884/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array.js":
1885/*!********************************************************************************!*\
1886  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array.js ***!
1887  \********************************************************************************/
1888/*! no static exports found */
1889/***/ (function(module, exports, __webpack_require__) {
1890
1891// 7.2.2 IsArray(argument)
1892var cof = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js");
1893
1894module.exports = Array.isArray || function isArray(arg) {
1895  return cof(arg) == 'Array';
1896};
1897
1898/***/ }),
1899
vendor: 748 bytes, lines 1900-1917
1900/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-integer.js":
1901/*!**********************************************************************************!*\
1902  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_is-integer.js ***!
1903  \**********************************************************************************/
1904/*! no static exports found */
1905/***/ (function(module, exports, __webpack_require__) {
1906
1907// 20.1.2.3 Number.isInteger(number)
1908var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
1909
1910var floor = Math.floor;
1911
1912module.exports = function isInteger(it) {
1913  return !isObject(it) && isFinite(it) && floor(it) === it;
1914};
1915
1916/***/ }),
1917
vendor: 887 bytes, lines 1918-1932
1918/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js":
1919/*!*********************************************************************************!*\
1920  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js ***!
1921  \*********************************************************************************/
1922/*! no static exports found */
1923/***/ (function(module, exports) {
1924
1925function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
1926
1927module.exports = function (it) {
1928  return _typeof(it) === 'object' ? it !== null : typeof it === 'function';
1929};
1930
1931/***/ }),
1932
vendor: 1,002 bytes, lines 1933-1953
1933/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-regexp.js":
1934/*!*********************************************************************************!*\
1935  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_is-regexp.js ***!
1936  \*********************************************************************************/
1937/*! no static exports found */
1938/***/ (function(module, exports, __webpack_require__) {
1939
1940// 7.2.8 IsRegExp(argument)
1941var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
1942
1943var cof = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js");
1944
1945var MATCH = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('match');
1946
1947module.exports = function (it) {
1948  var isRegExp;
1949  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');
1950};
1951
1952/***/ }),
1953
vendor: 945 bytes, lines 1954-1975
1954/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-call.js":
1955/*!*********************************************************************************!*\
1956  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-call.js ***!
1957  \*********************************************************************************/
1958/*! no static exports found */
1959/***/ (function(module, exports, __webpack_require__) {
1960
1961// call something on iterator step with safe closing on error
1962var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
1963
1964module.exports = function (iterator, fn, value, entries) {
1965  try {
1966    return entries ? fn(anObject(value)[0], value[1]) : fn(value); // 7.4.6 IteratorClose(iterator, completion)
1967  } catch (e) {
1968    var ret = iterator['return'];
1969    if (ret !== undefined) anObject(ret.call(iterator));
1970    throw e;
1971  }
1972};
1973
1974/***/ }),
1975
vendor: 1,460 bytes, lines 1976-2006
1976/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-create.js":
1977/*!***********************************************************************************!*\
1978  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-create.js ***!
1979  \***********************************************************************************/
1980/*! no static exports found */
1981/***/ (function(module, exports, __webpack_require__) {
1982
1983"use strict";
1984
1985
1986var create = __webpack_require__(/*! ./_object-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js");
1987
1988var descriptor = __webpack_require__(/*! ./_property-desc */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js");
1989
1990var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js");
1991
1992var IteratorPrototype = {}; // 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
1993
1994__webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js")(IteratorPrototype, __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('iterator'), function () {
1995  return this;
1996});
1997
1998module.exports = function (Constructor, NAME, next) {
1999  Constructor.prototype = create(IteratorPrototype, {
2000    next: descriptor(1, next)
2001  });
2002  setToStringTag(Constructor, NAME + ' Iterator');
2003};
2004
2005/***/ }),
2006
vendor: 4,173 bytes, lines 2007-2122
2007/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-define.js":
2008/*!***********************************************************************************!*\
2009  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-define.js ***!
2010  \***********************************************************************************/
2011/*! no static exports found */
2012/***/ (function(module, exports, __webpack_require__) {
2013
2014"use strict";
2015
2016
2017var LIBRARY = __webpack_require__(/*! ./_library */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js");
2018
2019var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
2020
2021var redefine = __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js");
2022
2023var hide = __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js");
2024
2025var Iterators = __webpack_require__(/*! ./_iterators */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js");
2026
2027var $iterCreate = __webpack_require__(/*! ./_iter-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-create.js");
2028
2029var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js");
2030
2031var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js");
2032
2033var ITERATOR = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('iterator');
2034
2035var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
2036
2037var FF_ITERATOR = '@@iterator';
2038var KEYS = 'keys';
2039var VALUES = 'values';
2040
2041var returnThis = function returnThis() {
2042  return this;
2043};
2044
2045module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
2046  $iterCreate(Constructor, NAME, next);
2047
2048  var getMethod = function getMethod(kind) {
2049    if (!BUGGY && kind in proto) return proto[kind];
2050
2051    switch (kind) {
2052      case KEYS:
2053        return function keys() {
2054          return new Constructor(this, kind);
2055        };
2056
2057      case VALUES:
2058        return function values() {
2059          return new Constructor(this, kind);
2060        };
2061    }
2062
2063    return function entries() {
2064      return new Constructor(this, kind);
2065    };
2066  };
2067
2068  var TAG = NAME + ' Iterator';
2069  var DEF_VALUES = DEFAULT == VALUES;
2070  var VALUES_BUG = false;
2071  var proto = Base.prototype;
2072  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
2073  var $default = $native || getMethod(DEFAULT);
2074  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
2075  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
2076  var methods, key, IteratorPrototype; // Fix native
2077
2078  if ($anyNative) {
2079    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
2080
2081    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
2082      // Set @@toStringTag to native iterators
2083      setToStringTag(IteratorPrototype, TAG, true); // fix for some old engines
2084
2085      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);
2086    }
2087  } // fix Array#{values, @@iterator}.name in V8 / FF
2088
2089
2090  if (DEF_VALUES && $native && $native.name !== VALUES) {
2091    VALUES_BUG = true;
2092
2093    $default = function values() {
2094      return $native.call(this);
2095    };
2096  } // Define iterator
2097
2098
2099  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
2100    hide(proto, ITERATOR, $default);
2101  } // Plug for library
2102
2103
2104  Iterators[NAME] = $default;
2105  Iterators[TAG] = returnThis;
2106
2107  if (DEFAULT) {
2108    methods = {
2109      values: DEF_VALUES ? $default : getMethod(VALUES),
2110      keys: IS_SET ? $default : getMethod(KEYS),
2111      entries: $entries
2112    };
2113    if (FORCED) for (key in methods) {
2114      if (!(key in proto)) redefine(proto, key, methods[key]);
2115    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
2116  }
2117
2118  return methods;
2119};
2120
2121/***/ }),
2122
vendor: 1,244 bytes, lines 2123-2176
2123/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-detect.js":
2124/*!***********************************************************************************!*\
2125  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-detect.js ***!
2126  \***********************************************************************************/
2127/*! no static exports found */
2128/***/ (function(module, exports, __webpack_require__) {
2129
2130var ITERATOR = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('iterator');
2131
2132var SAFE_CLOSING = false;
2133
2134try {
2135  var riter = [7][ITERATOR]();
2136
2137  riter['return'] = function () {
2138    SAFE_CLOSING = true;
2139  }; // eslint-disable-next-line no-throw-literal
2140
2141
2142  Array.from(riter, function () {
2143    throw 2;
2144  });
2145} catch (e) {
2146  /* empty */
2147}
2148
2149module.exports = function (exec, skipClosing) {
2150  if (!skipClosing && !SAFE_CLOSING) return false;
2151  var safe = false;
2152
2153  try {
2154    var arr = [7];
2155    var iter = arr[ITERATOR]();
2156
2157    iter.next = function () {
2158      return {
2159        done: safe = true
2160      };
2161    };
2162
2163    arr[ITERATOR] = function () {
2164      return iter;
2165    };
2166
2167    exec(arr);
2168  } catch (e) {
2169    /* empty */
2170  }
2171
2172  return safe;
2173};
2174
2175/***/ }),
2176
vendor: 518 bytes, lines 2177-2192
2177/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-step.js":
2178/*!*********************************************************************************!*\
2179  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-step.js ***!
2180  \*********************************************************************************/
2181/*! no static exports found */
2182/***/ (function(module, exports) {
2183
2184module.exports = function (done, value) {
2185  return {
2186    value: value,
2187    done: !!done
2188  };
2189};
2190
2191/***/ }),
2192
vendor: 443 bytes, lines 2193-2203
2193/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js":
2194/*!*********************************************************************************!*\
2195  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js ***!
2196  \*********************************************************************************/
2197/*! no static exports found */
2198/***/ (function(module, exports) {
2199
2200module.exports = {};
2201
2202/***/ }),
2203
vendor: 438 bytes, lines 2204-2214
2204/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js":
2205/*!*******************************************************************************!*\
2206  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js ***!
2207  \*******************************************************************************/
2208/*! no static exports found */
2209/***/ (function(module, exports) {
2210
2211module.exports = false;
2212
2213/***/ }),
2214
vendor: 758 bytes, lines 2215-2231
2215/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-expm1.js":
2216/*!**********************************************************************************!*\
2217  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_math-expm1.js ***!
2218  \**********************************************************************************/
2219/*! no static exports found */
2220/***/ (function(module, exports) {
2221
2222// 20.2.2.14 Math.expm1(x)
2223var $expm1 = Math.expm1;
2224module.exports = !$expm1 // Old FF bug
2225|| $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168 // Tor Browser bug
2226|| $expm1(-2e-17) != -2e-17 ? function expm1(x) {
2227  return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;
2228} : $expm1;
2229
2230/***/ }),
2231
vendor: 1,275 bytes, lines 2232-2265
2232/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-fround.js":
2233/*!***********************************************************************************!*\
2234  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_math-fround.js ***!
2235  \***********************************************************************************/
2236/*! no static exports found */
2237/***/ (function(module, exports, __webpack_require__) {
2238
2239// 20.2.2.16 Math.fround(x)
2240var sign = __webpack_require__(/*! ./_math-sign */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-sign.js");
2241
2242var pow = Math.pow;
2243var EPSILON = pow(2, -52);
2244var EPSILON32 = pow(2, -23);
2245var MAX32 = pow(2, 127) * (2 - EPSILON32);
2246var MIN32 = pow(2, -126);
2247
2248var roundTiesToEven = function roundTiesToEven(n) {
2249  return n + 1 / EPSILON - 1 / EPSILON;
2250};
2251
2252module.exports = Math.fround || function fround(x) {
2253  var $abs = Math.abs(x);
2254  var $sign = sign(x);
2255  var a, result;
2256  if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;
2257  a = (1 + EPSILON32 / EPSILON) * $abs;
2258  result = a - (a - $abs); // eslint-disable-next-line no-self-compare
2259
2260  if (result > MAX32 || result != result) return $sign * Infinity;
2261  return $sign * result;
2262};
2263
2264/***/ }),
2265
vendor: 580 bytes, lines 2266-2279
2266/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-log1p.js":
2267/*!**********************************************************************************!*\
2268  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_math-log1p.js ***!
2269  \**********************************************************************************/
2270/*! no static exports found */
2271/***/ (function(module, exports) {
2272
2273// 20.2.2.20 Math.log1p(x)
2274module.exports = Math.log1p || function log1p(x) {
2275  return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);
2276};
2277
2278/***/ }),
2279
vendor: 1,052 bytes, lines 2280-2300
2280/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-scale.js":
2281/*!**********************************************************************************!*\
2282  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_math-scale.js ***!
2283  \**********************************************************************************/
2284/*! no static exports found */
2285/***/ (function(module, exports) {
2286
2287// https://rwaldron.github.io/proposal-math-extensions/
2288module.exports = Math.scale || function scale(x, inLow, inHigh, outLow, outHigh) {
2289  if (arguments.length === 0 // eslint-disable-next-line no-self-compare
2290  || x != x // eslint-disable-next-line no-self-compare
2291  || inLow != inLow // eslint-disable-next-line no-self-compare
2292  || inHigh != inHigh // eslint-disable-next-line no-self-compare
2293  || outLow != outLow // eslint-disable-next-line no-self-compare
2294  || outHigh != outHigh) return NaN;
2295  if (x === Infinity || x === -Infinity) return x;
2296  return (x - inLow) * (outHigh - outLow) / (inHigh - inLow) + outLow;
2297};
2298
2299/***/ }),
2300
vendor: 601 bytes, lines 2301-2315
2301/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-sign.js":
2302/*!*********************************************************************************!*\
2303  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_math-sign.js ***!
2304  \*********************************************************************************/
2305/*! no static exports found */
2306/***/ (function(module, exports) {
2307
2308// 20.2.2.28 Math.sign(x)
2309module.exports = Math.sign || function sign(x) {
2310  // eslint-disable-next-line no-self-compare
2311  return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;
2312};
2313
2314/***/ }),
2315
vendor: 2,827 bytes, lines 2316-2398
2316/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js":
2317/*!****************************************************************************!*\
2318  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js ***!
2319  \****************************************************************************/
2320/*! no static exports found */
2321/***/ (function(module, exports, __webpack_require__) {
2322
2323function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
2324
2325var META = __webpack_require__(/*! ./_uid */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js")('meta');
2326
2327var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
2328
2329var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js");
2330
2331var setDesc = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f;
2332
2333var id = 0;
2334
2335var isExtensible = Object.isExtensible || function () {
2336  return true;
2337};
2338
2339var FREEZE = !__webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () {
2340  return isExtensible(Object.preventExtensions({}));
2341});
2342
2343var setMeta = function setMeta(it) {
2344  setDesc(it, META, {
2345    value: {
2346      i: 'O' + ++id,
2347      // object ID
2348      w: {} // weak collections IDs
2349
2350    }
2351  });
2352};
2353
2354var fastKey = function fastKey(it, create) {
2355  // return primitive with prefix
2356  if (!isObject(it)) return _typeof(it) == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
2357
2358  if (!has(it, META)) {
2359    // can't set metadata to uncaught frozen object
2360    if (!isExtensible(it)) return 'F'; // not necessary to add metadata
2361
2362    if (!create) return 'E'; // add missing metadata
2363
2364    setMeta(it); // return object ID
2365  }
2366
2367  return it[META].i;
2368};
2369
2370var getWeak = function getWeak(it, create) {
2371  if (!has(it, META)) {
2372    // can't set metadata to uncaught frozen object
2373    if (!isExtensible(it)) return true; // not necessary to add metadata
2374
2375    if (!create) return false; // add missing metadata
2376
2377    setMeta(it); // return hash weak collections IDs
2378  }
2379
2380  return it[META].w;
2381}; // add metadata on freeze-family methods calling
2382
2383
2384var onFreeze = function onFreeze(it) {
2385  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
2386  return it;
2387};
2388
2389var meta = module.exports = {
2390  KEY: META,
2391  NEED: false,
2392  fastKey: fastKey,
2393  getWeak: getWeak,
2394  onFreeze: onFreeze
2395};
2396
2397/***/ }),
2398
vendor: 3,109 bytes, lines 2399-2477
2399/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js":
2400/*!********************************************************************************!*\
2401  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js ***!
2402  \********************************************************************************/
2403/*! no static exports found */
2404/***/ (function(module, exports, __webpack_require__) {
2405
2406function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
2407
2408var Map = __webpack_require__(/*! ./es6.map */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.map.js");
2409
2410var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
2411
2412var shared = __webpack_require__(/*! ./_shared */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared.js")('metadata');
2413
2414var store = shared.store || (shared.store = new (__webpack_require__(/*! ./es6.weak-map */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-map.js"))());
2415
2416var getOrCreateMetadataMap = function getOrCreateMetadataMap(target, targetKey, create) {
2417  var targetMetadata = store.get(target);
2418
2419  if (!targetMetadata) {
2420    if (!create) return undefined;
2421    store.set(target, targetMetadata = new Map());
2422  }
2423
2424  var keyMetadata = targetMetadata.get(targetKey);
2425
2426  if (!keyMetadata) {
2427    if (!create) return undefined;
2428    targetMetadata.set(targetKey, keyMetadata = new Map());
2429  }
2430
2431  return keyMetadata;
2432};
2433
2434var ordinaryHasOwnMetadata = function ordinaryHasOwnMetadata(MetadataKey, O, P) {
2435  var metadataMap = getOrCreateMetadataMap(O, P, false);
2436  return metadataMap === undefined ? false : metadataMap.has(MetadataKey);
2437};
2438
2439var ordinaryGetOwnMetadata = function ordinaryGetOwnMetadata(MetadataKey, O, P) {
2440  var metadataMap = getOrCreateMetadataMap(O, P, false);
2441  return metadataMap === undefined ? undefined : metadataMap.get(MetadataKey);
2442};
2443
2444var ordinaryDefineOwnMetadata = function ordinaryDefineOwnMetadata(MetadataKey, MetadataValue, O, P) {
2445  getOrCreateMetadataMap(O, P, true).set(MetadataKey, MetadataValue);
2446};
2447
2448var ordinaryOwnMetadataKeys = function ordinaryOwnMetadataKeys(target, targetKey) {
2449  var metadataMap = getOrCreateMetadataMap(target, targetKey, false);
2450  var keys = [];
2451  if (metadataMap) metadataMap.forEach(function (_, key) {
2452    keys.push(key);
2453  });
2454  return keys;
2455};
2456
2457var toMetaKey = function toMetaKey(it) {
2458  return it === undefined || _typeof(it) == 'symbol' ? it : String(it);
2459};
2460
2461var exp = function exp(O) {
2462  $export($export.S, 'Reflect', O);
2463};
2464
2465module.exports = {
2466  store: store,
2467  map: getOrCreateMetadataMap,
2468  has: ordinaryHasOwnMetadata,
2469  get: ordinaryGetOwnMetadata,
2470  set: ordinaryDefineOwnMetadata,
2471  keys: ordinaryOwnMetadataKeys,
2472  key: toMetaKey,
2473  exp: exp
2474};
2475
2476/***/ }),
2477
vendor: 2,759 bytes, lines 2478-2571
2478/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_microtask.js":
2479/*!*********************************************************************************!*\
2480  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_microtask.js ***!
2481  \*********************************************************************************/
2482/*! no static exports found */
2483/***/ (function(module, exports, __webpack_require__) {
2484
2485var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
2486
2487var macrotask = __webpack_require__(/*! ./_task */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_task.js").set;
2488
2489var Observer = global.MutationObserver || global.WebKitMutationObserver;
2490var process = global.process;
2491var Promise = global.Promise;
2492var isNode = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js")(process) == 'process';
2493
2494module.exports = function () {
2495  var head, last, notify;
2496
2497  var flush = function flush() {
2498    var parent, fn;
2499    if (isNode && (parent = process.domain)) parent.exit();
2500
2501    while (head) {
2502      fn = head.fn;
2503      head = head.next;
2504
2505      try {
2506        fn();
2507      } catch (e) {
2508        if (head) notify();else last = undefined;
2509        throw e;
2510      }
2511    }
2512
2513    last = undefined;
2514    if (parent) parent.enter();
2515  }; // Node.js
2516
2517
2518  if (isNode) {
2519    notify = function notify() {
2520      process.nextTick(flush);
2521    }; // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339
2522
2523  } else if (Observer && !(global.navigator && global.navigator.standalone)) {
2524    var toggle = true;
2525    var node = document.createTextNode('');
2526    new Observer(flush).observe(node, {
2527      characterData: true
2528    }); // eslint-disable-line no-new
2529
2530    notify = function notify() {
2531      node.data = toggle = !toggle;
2532    }; // environments with maybe non-completely correct, but existent Promise
2533
2534  } else if (Promise && Promise.resolve) {
2535    // Promise.resolve without an argument throws an error in LG WebOS 2
2536    var promise = Promise.resolve(undefined);
2537
2538    notify = function notify() {
2539      promise.then(flush);
2540    }; // for other environments - macrotask based on:
2541    // - setImmediate
2542    // - MessageChannel
2543    // - window.postMessag
2544    // - onreadystatechange
2545    // - setTimeout
2546
2547  } else {
2548    notify = function notify() {
2549      // strange IE + webpack dev server bug - use .call(global)
2550      macrotask.call(global, flush);
2551    };
2552  }
2553
2554  return function (fn) {
2555    var task = {
2556      fn: fn,
2557      next: undefined
2558    };
2559    if (last) last.next = task;
2560
2561    if (!head) {
2562      head = task;
2563      notify();
2564    }
2565
2566    last = task;
2567  };
2568};
2569
2570/***/ }),
2571
vendor: 1,095 bytes, lines 2572-2600
2572/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_new-promise-capability.js":
2573/*!**********************************************************************************************!*\
2574  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_new-promise-capability.js ***!
2575  \**********************************************************************************************/
2576/*! no static exports found */
2577/***/ (function(module, exports, __webpack_require__) {
2578
2579"use strict";
2580 // 25.4.1.5 NewPromiseCapability(C)
2581
2582var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js");
2583
2584function PromiseCapability(C) {
2585  var resolve, reject;
2586  this.promise = new C(function ($$resolve, $$reject) {
2587    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
2588    resolve = $$resolve;
2589    reject = $$reject;
2590  });
2591  this.resolve = aFunction(resolve);
2592  this.reject = aFunction(reject);
2593}
2594
2595module.exports.f = function (C) {
2596  return new PromiseCapability(C);
2597};
2598
2599/***/ }),
2600
vendor: 2,244 bytes, lines 2601-2658
2601/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-assign.js":
2602/*!*************************************************************************************!*\
2603  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-assign.js ***!
2604  \*************************************************************************************/
2605/*! no static exports found */
2606/***/ (function(module, exports, __webpack_require__) {
2607
2608"use strict";
2609 // 19.1.2.1 Object.assign(target, source, ...)
2610
2611var getKeys = __webpack_require__(/*! ./_object-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js");
2612
2613var gOPS = __webpack_require__(/*! ./_object-gops */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gops.js");
2614
2615var pIE = __webpack_require__(/*! ./_object-pie */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-pie.js");
2616
2617var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js");
2618
2619var IObject = __webpack_require__(/*! ./_iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iobject.js");
2620
2621var $assign = Object.assign; // should work with symbols and should have deterministic property order (V8 bug)
2622
2623module.exports = !$assign || __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () {
2624  var A = {};
2625  var B = {}; // eslint-disable-next-line no-undef
2626
2627  var S = Symbol();
2628  var K = 'abcdefghijklmnopqrst';
2629  A[S] = 7;
2630  K.split('').forEach(function (k) {
2631    B[k] = k;
2632  });
2633  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
2634}) ? function assign(target, source) {
2635  // eslint-disable-line no-unused-vars
2636  var T = toObject(target);
2637  var aLen = arguments.length;
2638  var index = 1;
2639  var getSymbols = gOPS.f;
2640  var isEnum = pIE.f;
2641
2642  while (aLen > index) {
2643    var S = IObject(arguments[index++]);
2644    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);
2645    var length = keys.length;
2646    var j = 0;
2647    var key;
2648
2649    while (length > j) {
2650      if (isEnum.call(S, key = keys[j++])) T[key] = S[key];
2651    }
2652  }
2653
2654  return T;
2655} : $assign;
2656
2657/***/ }),
2658
vendor: 2,566 bytes, lines 2659-2725
2659/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js":
2660/*!*************************************************************************************!*\
2661  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js ***!
2662  \*************************************************************************************/
2663/*! no static exports found */
2664/***/ (function(module, exports, __webpack_require__) {
2665
2666// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
2667var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
2668
2669var dPs = __webpack_require__(/*! ./_object-dps */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dps.js");
2670
2671var enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_enum-bug-keys.js");
2672
2673var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared-key.js")('IE_PROTO');
2674
2675var Empty = function Empty() {
2676  /* empty */
2677};
2678
2679var PROTOTYPE = 'prototype'; // Create object with fake `null` prototype: use iframe Object with cleared prototype
2680
2681var _createDict = function createDict() {
2682  // Thrash, waste and sodomy: IE GC bug
2683  var iframe = __webpack_require__(/*! ./_dom-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_dom-create.js")('iframe');
2684
2685  var i = enumBugKeys.length;
2686  var lt = '<';
2687  var gt = '>';
2688  var iframeDocument;
2689  iframe.style.display = 'none';
2690
2691  __webpack_require__(/*! ./_html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_html.js").appendChild(iframe);
2692
2693  iframe.src = 'javascript:'; // eslint-disable-line no-script-url
2694  // createDict = iframe.contentWindow.Object;
2695  // html.removeChild(iframe);
2696
2697  iframeDocument = iframe.contentWindow.document;
2698  iframeDocument.open();
2699  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
2700  iframeDocument.close();
2701  _createDict = iframeDocument.F;
2702
2703  while (i--) {
2704    delete _createDict[PROTOTYPE][enumBugKeys[i]];
2705  }
2706
2707  return _createDict();
2708};
2709
2710module.exports = Object.create || function create(O, Properties) {
2711  var result;
2712
2713  if (O !== null) {
2714    Empty[PROTOTYPE] = anObject(O);
2715    result = new Empty();
2716    Empty[PROTOTYPE] = null; // add "__proto__" for Object.getPrototypeOf polyfill
2717
2718    result[IE_PROTO] = O;
2719  } else result = _createDict();
2720
2721  return Properties === undefined ? result : dPs(result, Properties);
2722};
2723
2724/***/ }),
2725
vendor: 1,433 bytes, lines 2726-2755
2726/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js":
2727/*!*********************************************************************************!*\
2728  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js ***!
2729  \*********************************************************************************/
2730/*! no static exports found */
2731/***/ (function(module, exports, __webpack_require__) {
2732
2733var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
2734
2735var IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ie8-dom-define.js");
2736
2737var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js");
2738
2739var dP = Object.defineProperty;
2740exports.f = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") ? Object.defineProperty : function defineProperty(O, P, Attributes) {
2741  anObject(O);
2742  P = toPrimitive(P, true);
2743  anObject(Attributes);
2744  if (IE8_DOM_DEFINE) try {
2745    return dP(O, P, Attributes);
2746  } catch (e) {
2747    /* empty */
2748  }
2749  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
2750  if ('value' in Attributes) O[P] = Attributes.value;
2751  return O;
2752};
2753
2754/***/ }),
2755
vendor: 1,241 bytes, lines 2756-2784
2756/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dps.js":
2757/*!**********************************************************************************!*\
2758  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dps.js ***!
2759  \**********************************************************************************/
2760/*! no static exports found */
2761/***/ (function(module, exports, __webpack_require__) {
2762
2763var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js");
2764
2765var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
2766
2767var getKeys = __webpack_require__(/*! ./_object-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js");
2768
2769module.exports = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") ? Object.defineProperties : function defineProperties(O, Properties) {
2770  anObject(O);
2771  var keys = getKeys(Properties);
2772  var length = keys.length;
2773  var i = 0;
2774  var P;
2775
2776  while (length > i) {
2777    dP.f(O, P = keys[i++], Properties[P]);
2778  }
2779
2780  return O;
2781};
2782
2783/***/ }),
2784
vendor: 1,114 bytes, lines 2785-2807
2785/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-forced-pam.js":
2786/*!*****************************************************************************************!*\
2787  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-forced-pam.js ***!
2788  \*****************************************************************************************/
2789/*! no static exports found */
2790/***/ (function(module, exports, __webpack_require__) {
2791
2792"use strict";
2793 // Forced replacement prototype accessors methods
2794
2795module.exports = __webpack_require__(/*! ./_library */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js") || !__webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () {
2796  var K = Math.random(); // In FF throws only define methods
2797  // eslint-disable-next-line no-undef, no-useless-call
2798
2799  __defineSetter__.call(null, K, function () {
2800    /* empty */
2801  });
2802
2803  delete __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js")[K];
2804});
2805
2806/***/ }),
2807
vendor: 1,700 bytes, lines 2808-2840
2808/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js":
2809/*!***********************************************************************************!*\
2810  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js ***!
2811  \***********************************************************************************/
2812/*! no static exports found */
2813/***/ (function(module, exports, __webpack_require__) {
2814
2815var pIE = __webpack_require__(/*! ./_object-pie */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-pie.js");
2816
2817var createDesc = __webpack_require__(/*! ./_property-desc */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js");
2818
2819var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js");
2820
2821var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js");
2822
2823var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js");
2824
2825var IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ie8-dom-define.js");
2826
2827var gOPD = Object.getOwnPropertyDescriptor;
2828exports.f = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") ? gOPD : function getOwnPropertyDescriptor(O, P) {
2829  O = toIObject(O);
2830  P = toPrimitive(P, true);
2831  if (IE8_DOM_DEFINE) try {
2832    return gOPD(O, P);
2833  } catch (e) {
2834    /* empty */
2835  }
2836  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
2837};
2838
2839/***/ }),
2840
vendor: 1,676 bytes, lines 2841-2871
2841/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn-ext.js":
2842/*!***************************************************************************************!*\
2843  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn-ext.js ***!
2844  \***************************************************************************************/
2845/*! no static exports found */
2846/***/ (function(module, exports, __webpack_require__) {
2847
2848function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
2849
2850// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
2851var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js");
2852
2853var gOPN = __webpack_require__(/*! ./_object-gopn */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js").f;
2854
2855var toString = {}.toString;
2856var windowNames = (typeof window === "undefined" ? "undefined" : _typeof(window)) == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : [];
2857
2858var getWindowNames = function getWindowNames(it) {
2859  try {
2860    return gOPN(it);
2861  } catch (e) {
2862    return windowNames.slice();
2863  }
2864};
2865
2866module.exports.f = function getOwnPropertyNames(it) {
2867  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
2868};
2869
2870/***/ }),
2871
vendor: 941 bytes, lines 2872-2889
2872/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js":
2873/*!***********************************************************************************!*\
2874  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js ***!
2875  \***********************************************************************************/
2876/*! no static exports found */
2877/***/ (function(module, exports, __webpack_require__) {
2878
2879// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
2880var $keys = __webpack_require__(/*! ./_object-keys-internal */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys-internal.js");
2881
2882var hiddenKeys = __webpack_require__(/*! ./_enum-bug-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_enum-bug-keys.js").concat('length', 'prototype');
2883
2884exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
2885  return $keys(O, hiddenKeys);
2886};
2887
2888/***/ }),
2889
vendor: 472 bytes, lines 2890-2900
2890/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gops.js":
2891/*!***********************************************************************************!*\
2892  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gops.js ***!
2893  \***********************************************************************************/
2894/*! no static exports found */
2895/***/ (function(module, exports) {
2896
2897exports.f = Object.getOwnPropertySymbols;
2898
2899/***/ }),
2900
vendor: 1,221 bytes, lines 2901-2929
2901/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js":
2902/*!**********************************************************************************!*\
2903  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js ***!
2904  \**********************************************************************************/
2905/*! no static exports found */
2906/***/ (function(module, exports, __webpack_require__) {
2907
2908// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
2909var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js");
2910
2911var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js");
2912
2913var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared-key.js")('IE_PROTO');
2914
2915var ObjectProto = Object.prototype;
2916
2917module.exports = Object.getPrototypeOf || function (O) {
2918  O = toObject(O);
2919  if (has(O, IE_PROTO)) return O[IE_PROTO];
2920
2921  if (typeof O.constructor == 'function' && O instanceof O.constructor) {
2922    return O.constructor.prototype;
2923  }
2924
2925  return O instanceof Object ? ObjectProto : null;
2926};
2927
2928/***/ }),
2929
vendor: 1,426 bytes, lines 2930-2966
2930/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys-internal.js":
2931/*!********************************************************************************************!*\
2932  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys-internal.js ***!
2933  \********************************************************************************************/
2934/*! no static exports found */
2935/***/ (function(module, exports, __webpack_require__) {
2936
2937var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js");
2938
2939var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js");
2940
2941var arrayIndexOf = __webpack_require__(/*! ./_array-includes */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-includes.js")(false);
2942
2943var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared-key.js")('IE_PROTO');
2944
2945module.exports = function (object, names) {
2946  var O = toIObject(object);
2947  var i = 0;
2948  var result = [];
2949  var key;
2950
2951  for (key in O) {
2952    if (key != IE_PROTO) has(O, key) && result.push(key);
2953  } // Don't enum bug & hidden keys
2954
2955
2956  while (names.length > i) {
2957    if (has(O, key = names[i++])) {
2958      ~arrayIndexOf(result, key) || result.push(key);
2959    }
2960  }
2961
2962  return result;
2963};
2964
2965/***/ }),
2966
vendor: 875 bytes, lines 2967-2984
2967/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js":
2968/*!***********************************************************************************!*\
2969  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js ***!
2970  \***********************************************************************************/
2971/*! no static exports found */
2972/***/ (function(module, exports, __webpack_require__) {
2973
2974// 19.1.2.14 / 15.2.3.14 Object.keys(O)
2975var $keys = __webpack_require__(/*! ./_object-keys-internal */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys-internal.js");
2976
2977var enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_enum-bug-keys.js");
2978
2979module.exports = Object.keys || function keys(O) {
2980  return $keys(O, enumBugKeys);
2981};
2982
2983/***/ }),
2984
vendor: 463 bytes, lines 2985-2995
2985/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-pie.js":
2986/*!**********************************************************************************!*\
2987  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-pie.js ***!
2988  \**********************************************************************************/
2989/*! no static exports found */
2990/***/ (function(module, exports) {
2991
2992exports.f = {}.propertyIsEnumerable;
2993
2994/***/ }),
2995
vendor: 1,093 bytes, lines 2996-3020
2996/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js":
2997/*!**********************************************************************************!*\
2998  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js ***!
2999  \**********************************************************************************/
3000/*! no static exports found */
3001/***/ (function(module, exports, __webpack_require__) {
3002
3003// most Object methods by ES6 should accept primitives
3004var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
3005
3006var core = __webpack_require__(/*! ./_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js");
3007
3008var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js");
3009
3010module.exports = function (KEY, exec) {
3011  var fn = (core.Object || {})[KEY] || Object[KEY];
3012  var exp = {};
3013  exp[KEY] = exec(fn);
3014  $export($export.S + $export.F * fails(function () {
3015    fn(1);
3016  }), 'Object', exp);
3017};
3018
3019/***/ }),
3020
vendor: 1,245 bytes, lines 3021-3054
3021/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-to-array.js":
3022/*!***************************************************************************************!*\
3023  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_object-to-array.js ***!
3024  \***************************************************************************************/
3025/*! no static exports found */
3026/***/ (function(module, exports, __webpack_require__) {
3027
3028var getKeys = __webpack_require__(/*! ./_object-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js");
3029
3030var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js");
3031
3032var isEnum = __webpack_require__(/*! ./_object-pie */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-pie.js").f;
3033
3034module.exports = function (isEntries) {
3035  return function (it) {
3036    var O = toIObject(it);
3037    var keys = getKeys(O);
3038    var length = keys.length;
3039    var i = 0;
3040    var result = [];
3041    var key;
3042
3043    while (length > i) {
3044      if (isEnum.call(O, key = keys[i++])) {
3045        result.push(isEntries ? [key, O[key]] : O[key]);
3046      }
3047    }
3048
3049    return result;
3050  };
3051};
3052
3053/***/ }),
3054
vendor: 1,225 bytes, lines 3055-3078
3055/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_own-keys.js":
3056/*!********************************************************************************!*\
3057  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_own-keys.js ***!
3058  \********************************************************************************/
3059/*! no static exports found */
3060/***/ (function(module, exports, __webpack_require__) {
3061
3062// all object keys, includes non-enumerable and symbols
3063var gOPN = __webpack_require__(/*! ./_object-gopn */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js");
3064
3065var gOPS = __webpack_require__(/*! ./_object-gops */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gops.js");
3066
3067var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
3068
3069var Reflect = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").Reflect;
3070
3071module.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {
3072  var keys = gOPN.f(anObject(it));
3073  var getSymbols = gOPS.f;
3074  return getSymbols ? keys.concat(getSymbols(it)) : keys;
3075};
3076
3077/***/ }),
3078
vendor: 1,089 bytes, lines 3079-3097
3079/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_parse-float.js":
3080/*!***********************************************************************************!*\
3081  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_parse-float.js ***!
3082  \***********************************************************************************/
3083/*! no static exports found */
3084/***/ (function(module, exports, __webpack_require__) {
3085
3086var $parseFloat = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").parseFloat;
3087
3088var $trim = __webpack_require__(/*! ./_string-trim */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js").trim;
3089
3090module.exports = 1 / $parseFloat(__webpack_require__(/*! ./_string-ws */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-ws.js") + '-0') !== -Infinity ? function parseFloat(str) {
3091  var string = $trim(String(str), 3);
3092  var result = $parseFloat(string);
3093  return result === 0 && string.charAt(0) == '-' ? -0 : result;
3094} : $parseFloat;
3095
3096/***/ }),
3097
vendor: 1,111 bytes, lines 3098-3118
3098/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_parse-int.js":
3099/*!*********************************************************************************!*\
3100  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_parse-int.js ***!
3101  \*********************************************************************************/
3102/*! no static exports found */
3103/***/ (function(module, exports, __webpack_require__) {
3104
3105var $parseInt = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").parseInt;
3106
3107var $trim = __webpack_require__(/*! ./_string-trim */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js").trim;
3108
3109var ws = __webpack_require__(/*! ./_string-ws */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-ws.js");
3110
3111var hex = /^[-+]?0[xX]/;
3112module.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) {
3113  var string = $trim(String(str), 3);
3114  return $parseInt(string, radix >>> 0 || (hex.test(string) ? 16 : 10));
3115} : $parseInt;
3116
3117/***/ }),
3118
vendor: 578 bytes, lines 3119-3141
3119/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_perform.js":
3120/*!*******************************************************************************!*\
3121  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_perform.js ***!
3122  \*******************************************************************************/
3123/*! no static exports found */
3124/***/ (function(module, exports) {
3125
3126module.exports = function (exec) {
3127  try {
3128    return {
3129      e: false,
3130      v: exec()
3131    };
3132  } catch (e) {
3133    return {
3134      e: true,
3135      v: e
3136    };
3137  }
3138};
3139
3140/***/ }),
3141
vendor: 1,158 bytes, lines 3142-3165
3142/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_promise-resolve.js":
3143/*!***************************************************************************************!*\
3144  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_promise-resolve.js ***!
3145  \***************************************************************************************/
3146/*! no static exports found */
3147/***/ (function(module, exports, __webpack_require__) {
3148
3149var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
3150
3151var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
3152
3153var newPromiseCapability = __webpack_require__(/*! ./_new-promise-capability */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_new-promise-capability.js");
3154
3155module.exports = function (C, x) {
3156  anObject(C);
3157  if (isObject(x) && x.constructor === C) return x;
3158  var promiseCapability = newPromiseCapability.f(C);
3159  var resolve = promiseCapability.resolve;
3160  resolve(x);
3161  return promiseCapability.promise;
3162};
3163
3164/***/ }),
3165
vendor: 611 bytes, lines 3166-3183
3166/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js":
3167/*!*************************************************************************************!*\
3168  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js ***!
3169  \*************************************************************************************/
3170/*! no static exports found */
3171/***/ (function(module, exports) {
3172
3173module.exports = function (bitmap, value) {
3174  return {
3175    enumerable: !(bitmap & 1),
3176    configurable: !(bitmap & 2),
3177    writable: !(bitmap & 4),
3178    value: value
3179  };
3180};
3181
3182/***/ }),
3183
vendor: 728 bytes, lines 3184-3202
3184/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js":
3185/*!************************************************************************************!*\
3186  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js ***!
3187  \************************************************************************************/
3188/*! no static exports found */
3189/***/ (function(module, exports, __webpack_require__) {
3190
3191var redefine = __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js");
3192
3193module.exports = function (target, src, safe) {
3194  for (var key in src) {
3195    redefine(target, key, src[key], safe);
3196  }
3197
3198  return target;
3199};
3200
3201/***/ }),
3202
vendor: 2,038 bytes, lines 3203-3249
3203/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js":
3204/*!********************************************************************************!*\
3205  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js ***!
3206  \********************************************************************************/
3207/*! no static exports found */
3208/***/ (function(module, exports, __webpack_require__) {
3209
3210var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
3211
3212var hide = __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js");
3213
3214var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js");
3215
3216var SRC = __webpack_require__(/*! ./_uid */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js")('src');
3217
3218var $toString = __webpack_require__(/*! ./_function-to-string */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_function-to-string.js");
3219
3220var TO_STRING = 'toString';
3221var TPL = ('' + $toString).split(TO_STRING);
3222
3223__webpack_require__(/*! ./_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js").inspectSource = function (it) {
3224  return $toString.call(it);
3225};
3226
3227(module.exports = function (O, key, val, safe) {
3228  var isFunction = typeof val == 'function';
3229  if (isFunction) has(val, 'name') || hide(val, 'name', key);
3230  if (O[key] === val) return;
3231  if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));
3232
3233  if (O === global) {
3234    O[key] = val;
3235  } else if (!safe) {
3236    delete O[key];
3237    hide(O, key, val);
3238  } else if (O[key]) {
3239    O[key] = val;
3240  } else {
3241    hide(O, key, val);
3242  } // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
3243
3244})(Function.prototype, TO_STRING, function toString() {
3245  return typeof this == 'function' && this[SRC] || $toString.call(this);
3246});
3247
3248/***/ }),
3249
vendor: 1,554 bytes, lines 3250-3288
3250/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec-abstract.js":
3251/*!********************************************************************************************!*\
3252  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec-abstract.js ***!
3253  \********************************************************************************************/
3254/*! no static exports found */
3255/***/ (function(module, exports, __webpack_require__) {
3256
3257"use strict";
3258
3259
3260function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
3261
3262var classof = __webpack_require__(/*! ./_classof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js");
3263
3264var builtinExec = RegExp.prototype.exec; // `RegExpExec` abstract operation
3265// https://tc39.github.io/ecma262/#sec-regexpexec
3266
3267module.exports = function (R, S) {
3268  var exec = R.exec;
3269
3270  if (typeof exec === 'function') {
3271    var result = exec.call(R, S);
3272
3273    if (_typeof(result) !== 'object') {
3274      throw new TypeError('RegExp exec method returned something other than an Object or null');
3275    }
3276
3277    return result;
3278  }
3279
3280  if (classof(R) !== 'RegExp') {
3281    throw new TypeError('RegExp#exec called on incompatible receiver');
3282  }
3283
3284  return builtinExec.call(R, S);
3285};
3286
3287/***/ }),
3288
vendor: 2,279 bytes, lines 3289-3355
3289/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec.js":
3290/*!***********************************************************************************!*\
3291  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec.js ***!
3292  \***********************************************************************************/
3293/*! no static exports found */
3294/***/ (function(module, exports, __webpack_require__) {
3295
3296"use strict";
3297
3298
3299var regexpFlags = __webpack_require__(/*! ./_flags */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_flags.js");
3300
3301var nativeExec = RegExp.prototype.exec; // This always refers to the native implementation, because the
3302// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,
3303// which loads this file before patching the method.
3304
3305var nativeReplace = String.prototype.replace;
3306var patchedExec = nativeExec;
3307var LAST_INDEX = 'lastIndex';
3308
3309var UPDATES_LAST_INDEX_WRONG = function () {
3310  var re1 = /a/,
3311      re2 = /b*/g;
3312  nativeExec.call(re1, 'a');
3313  nativeExec.call(re2, 'a');
3314  return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;
3315}(); // nonparticipating capturing group, copied from es5-shim's String#split patch.
3316
3317
3318var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;
3319var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;
3320
3321if (PATCH) {
3322  patchedExec = function exec(str) {
3323    var re = this;
3324    var lastIndex, reCopy, match, i;
3325
3326    if (NPCG_INCLUDED) {
3327      reCopy = new RegExp('^' + re.source + '$(?!\\s)', regexpFlags.call(re));
3328    }
3329
3330    if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];
3331    match = nativeExec.call(re, str);
3332
3333    if (UPDATES_LAST_INDEX_WRONG && match) {
3334      re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;
3335    }
3336
3337    if (NPCG_INCLUDED && match && match.length > 1) {
3338      // Fix browsers whose `exec` methods don't consistently return `undefined`
3339      // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/
3340      // eslint-disable-next-line no-loop-func
3341      nativeReplace.call(match[0], reCopy, function () {
3342        for (i = 1; i < arguments.length - 2; i++) {
3343          if (arguments[i] === undefined) match[i] = undefined;
3344        }
3345      });
3346    }
3347
3348    return match;
3349  };
3350}
3351
3352module.exports = patchedExec;
3353
3354/***/ }),
3355
vendor: 652 bytes, lines 3356-3373
3356/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_replacer.js":
3357/*!********************************************************************************!*\
3358  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_replacer.js ***!
3359  \********************************************************************************/
3360/*! no static exports found */
3361/***/ (function(module, exports) {
3362
3363module.exports = function (regExp, replace) {
3364  var replacer = replace === Object(replace) ? function (part) {
3365    return replace[part];
3366  } : replace;
3367  return function (it) {
3368    return String(it).replace(regExp, replacer);
3369  };
3370};
3371
3372/***/ }),
3373
vendor: 616 bytes, lines 3374-3388
3374/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_same-value.js":
3375/*!**********************************************************************************!*\
3376  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_same-value.js ***!
3377  \**********************************************************************************/
3378/*! no static exports found */
3379/***/ (function(module, exports) {
3380
3381// 7.2.9 SameValue(x, y)
3382module.exports = Object.is || function is(x, y) {
3383  // eslint-disable-next-line no-self-compare
3384  return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;
3385};
3386
3387/***/ }),
3388
vendor: 1,704 bytes, lines 3389-3436
3389/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-from.js":
3390/*!*******************************************************************************************!*\
3391  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-from.js ***!
3392  \*******************************************************************************************/
3393/*! no static exports found */
3394/***/ (function(module, exports, __webpack_require__) {
3395
3396"use strict";
3397 // https://tc39.github.io/proposal-setmap-offrom/
3398
3399var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
3400
3401var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js");
3402
3403var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js");
3404
3405var forOf = __webpack_require__(/*! ./_for-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js");
3406
3407module.exports = function (COLLECTION) {
3408  $export($export.S, COLLECTION, {
3409    from: function from(source
3410    /* , mapFn, thisArg */
3411    ) {
3412      var mapFn = arguments[1];
3413      var mapping, A, n, cb;
3414      aFunction(this);
3415      mapping = mapFn !== undefined;
3416      if (mapping) aFunction(mapFn);
3417      if (source == undefined) return new this();
3418      A = [];
3419
3420      if (mapping) {
3421        n = 0;
3422        cb = ctx(mapFn, arguments[2], 2);
3423        forOf(source, false, function (nextItem) {
3424          A.push(cb(nextItem, n++));
3425        });
3426      } else {
3427        forOf(source, false, A.push, A);
3428      }
3429
3430      return new this(A);
3431    }
3432  });
3433};
3434
3435/***/ }),
3436
vendor: 953 bytes, lines 3437-3465
3437/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-of.js":
3438/*!*****************************************************************************************!*\
3439  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-of.js ***!
3440  \*****************************************************************************************/
3441/*! no static exports found */
3442/***/ (function(module, exports, __webpack_require__) {
3443
3444"use strict";
3445 // https://tc39.github.io/proposal-setmap-offrom/
3446
3447var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
3448
3449module.exports = function (COLLECTION) {
3450  $export($export.S, COLLECTION, {
3451    of: function of() {
3452      var length = arguments.length;
3453      var A = new Array(length);
3454
3455      while (length--) {
3456        A[length] = arguments[length];
3457      }
3458
3459      return new this(A);
3460    }
3461  });
3462};
3463
3464/***/ }),
3465
vendor: 1,704 bytes, lines 3466-3506
3466/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-proto.js":
3467/*!*********************************************************************************!*\
3468  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_set-proto.js ***!
3469  \*********************************************************************************/
3470/*! no static exports found */
3471/***/ (function(module, exports, __webpack_require__) {
3472
3473// Works with __proto__ only. Old v8 can't work with null proto objects.
3474
3475/* eslint-disable no-proto */
3476var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
3477
3478var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
3479
3480var check = function check(O, proto) {
3481  anObject(O);
3482  if (!isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!");
3483};
3484
3485module.exports = {
3486  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line
3487  function (test, buggy, set) {
3488    try {
3489      set = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js")(Function.call, __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js").f(Object.prototype, '__proto__').set, 2);
3490      set(test, []);
3491      buggy = !(test instanceof Array);
3492    } catch (e) {
3493      buggy = true;
3494    }
3495
3496    return function setPrototypeOf(O, proto) {
3497      check(O, proto);
3498      if (buggy) O.__proto__ = proto;else set(O, proto);
3499      return O;
3500    };
3501  }({}, false) : undefined),
3502  check: check
3503};
3504
3505/***/ }),
3506
vendor: 1,193 bytes, lines 3507-3536
3507/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js":
3508/*!***********************************************************************************!*\
3509  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js ***!
3510  \***********************************************************************************/
3511/*! no static exports found */
3512/***/ (function(module, exports, __webpack_require__) {
3513
3514"use strict";
3515
3516
3517var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
3518
3519var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js");
3520
3521var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js");
3522
3523var SPECIES = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('species');
3524
3525module.exports = function (KEY) {
3526  var C = global[KEY];
3527  if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {
3528    configurable: true,
3529    get: function get() {
3530      return this;
3531    }
3532  });
3533};
3534
3535/***/ }),
3536
vendor: 1,016 bytes, lines 3537-3558
3537/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js":
3538/*!*****************************************************************************************!*\
3539  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js ***!
3540  \*****************************************************************************************/
3541/*! no static exports found */
3542/***/ (function(module, exports, __webpack_require__) {
3543
3544var def = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f;
3545
3546var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js");
3547
3548var TAG = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('toStringTag');
3549
3550module.exports = function (it, tag, stat) {
3551  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, {
3552    configurable: true,
3553    value: tag
3554  });
3555};
3556
3557/***/ }),
3558
vendor: 785 bytes, lines 3559-3575
3559/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared-key.js":
3560/*!**********************************************************************************!*\
3561  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_shared-key.js ***!
3562  \**********************************************************************************/
3563/*! no static exports found */
3564/***/ (function(module, exports, __webpack_require__) {
3565
3566var shared = __webpack_require__(/*! ./_shared */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared.js")('keys');
3567
3568var uid = __webpack_require__(/*! ./_uid */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js");
3569
3570module.exports = function (key) {
3571  return shared[key] || (shared[key] = uid(key));
3572};
3573
3574/***/ }),
3575
vendor: 1,129 bytes, lines 3576-3598
3576/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared.js":
3577/*!******************************************************************************!*\
3578  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_shared.js ***!
3579  \******************************************************************************/
3580/*! no static exports found */
3581/***/ (function(module, exports, __webpack_require__) {
3582
3583var core = __webpack_require__(/*! ./_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js");
3584
3585var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
3586
3587var SHARED = '__core-js_shared__';
3588var store = global[SHARED] || (global[SHARED] = {});
3589(module.exports = function (key, value) {
3590  return store[key] || (store[key] = value !== undefined ? value : {});
3591})('versions', []).push({
3592  version: core.version,
3593  mode: __webpack_require__(/*! ./_library */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js") ? 'pure' : 'global',
3594  copyright: '© 2019 Denis Pushkarev (zloirock.ru)'
3595});
3596
3597/***/ }),
3598
vendor: 1,108 bytes, lines 3599-3620
3599/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_species-constructor.js":
3600/*!*******************************************************************************************!*\
3601  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_species-constructor.js ***!
3602  \*******************************************************************************************/
3603/*! no static exports found */
3604/***/ (function(module, exports, __webpack_require__) {
3605
3606// 7.3.20 SpeciesConstructor(O, defaultConstructor)
3607var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
3608
3609var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js");
3610
3611var SPECIES = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('species');
3612
3613module.exports = function (O, D) {
3614  var C = anObject(O).constructor;
3615  var S;
3616  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);
3617};
3618
3619/***/ }),
3620
vendor: 829 bytes, lines 3621-3643
3621/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js":
3622/*!*************************************************************************************!*\
3623  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js ***!
3624  \*************************************************************************************/
3625/*! no static exports found */
3626/***/ (function(module, exports, __webpack_require__) {
3627
3628"use strict";
3629
3630
3631var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js");
3632
3633module.exports = function (method, arg) {
3634  return !!method && fails(function () {
3635    // eslint-disable-next-line no-useless-call
3636    arg ? method.call(null, function () {
3637      /* empty */
3638    }, 1) : method.call(null);
3639  });
3640};
3641
3642/***/ }),
3643
vendor: 1,239 bytes, lines 3644-3670
3644/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-at.js":
3645/*!*********************************************************************************!*\
3646  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_string-at.js ***!
3647  \*********************************************************************************/
3648/*! no static exports found */
3649/***/ (function(module, exports, __webpack_require__) {
3650
3651var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js");
3652
3653var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js"); // true  -> String#at
3654// false -> String#codePointAt
3655
3656
3657module.exports = function (TO_STRING) {
3658  return function (that, pos) {
3659    var s = String(defined(that));
3660    var i = toInteger(pos);
3661    var l = s.length;
3662    var a, b;
3663    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
3664    a = s.charCodeAt(i);
3665    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff ? TO_STRING ? s.charAt(i) : a : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
3666  };
3667};
3668
3669/***/ }),
3670
vendor: 962 bytes, lines 3671-3689
3671/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-context.js":
3672/*!**************************************************************************************!*\
3673  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_string-context.js ***!
3674  \**************************************************************************************/
3675/*! no static exports found */
3676/***/ (function(module, exports, __webpack_require__) {
3677
3678// helper for String#{startsWith, endsWith, includes}
3679var isRegExp = __webpack_require__(/*! ./_is-regexp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-regexp.js");
3680
3681var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js");
3682
3683module.exports = function (that, searchString, NAME) {
3684  if (isRegExp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!");
3685  return String(defined(that));
3686};
3687
3688/***/ }),
3689
vendor: 1,438 bytes, lines 3690-3722
3690/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js":
3691/*!***********************************************************************************!*\
3692  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js ***!
3693  \***********************************************************************************/
3694/*! no static exports found */
3695/***/ (function(module, exports, __webpack_require__) {
3696
3697var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
3698
3699var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js");
3700
3701var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js");
3702
3703var quot = /"/g; // B.2.3.2.1 CreateHTML(string, tag, attribute, value)
3704
3705var createHTML = function createHTML(string, tag, attribute, value) {
3706  var S = String(defined(string));
3707  var p1 = '<' + tag;
3708  if (attribute !== '') p1 += ' ' + attribute + '="' + String(value).replace(quot, '&quot;') + '"';
3709  return p1 + '>' + S + '</' + tag + '>';
3710};
3711
3712module.exports = function (NAME, exec) {
3713  var O = {};
3714  O[NAME] = exec(createHTML);
3715  $export($export.P + $export.F * fails(function () {
3716    var test = ''[NAME]('"');
3717    return test !== test.toLowerCase() || test.split('"').length > 3;
3718  }), 'String', O);
3719};
3720
3721/***/ }),
3722
vendor: 1,474 bytes, lines 3723-3750
3723/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-pad.js":
3724/*!**********************************************************************************!*\
3725  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_string-pad.js ***!
3726  \**********************************************************************************/
3727/*! no static exports found */
3728/***/ (function(module, exports, __webpack_require__) {
3729
3730// https://github.com/tc39/proposal-string-pad-start-end
3731var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
3732
3733var repeat = __webpack_require__(/*! ./_string-repeat */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-repeat.js");
3734
3735var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js");
3736
3737module.exports = function (that, maxLength, fillString, left) {
3738  var S = String(defined(that));
3739  var stringLength = S.length;
3740  var fillStr = fillString === undefined ? ' ' : String(fillString);
3741  var intMaxLength = toLength(maxLength);
3742  if (intMaxLength <= stringLength || fillStr == '') return S;
3743  var fillLen = intMaxLength - stringLength;
3744  var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));
3745  if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);
3746  return left ? stringFiller + S : S + stringFiller;
3747};
3748
3749/***/ }),
3750
vendor: 1,033 bytes, lines 3751-3779
3751/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-repeat.js":
3752/*!*************************************************************************************!*\
3753  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_string-repeat.js ***!
3754  \*************************************************************************************/
3755/*! no static exports found */
3756/***/ (function(module, exports, __webpack_require__) {
3757
3758"use strict";
3759
3760
3761var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js");
3762
3763var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js");
3764
3765module.exports = function repeat(count) {
3766  var str = String(defined(this));
3767  var res = '';
3768  var n = toInteger(count);
3769  if (n < 0 || n == Infinity) throw RangeError("Count can't be negative");
3770
3771  for (; n > 0; (n >>>= 1) && (str += str)) {
3772    if (n & 1) res += str;
3773  }
3774
3775  return res;
3776};
3777
3778/***/ }),
3779
vendor: 1,724 bytes, lines 3780-3823
3780/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js":
3781/*!***********************************************************************************!*\
3782  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js ***!
3783  \***********************************************************************************/
3784/*! no static exports found */
3785/***/ (function(module, exports, __webpack_require__) {
3786
3787var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
3788
3789var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js");
3790
3791var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js");
3792
3793var spaces = __webpack_require__(/*! ./_string-ws */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-ws.js");
3794
3795var space = '[' + spaces + ']';
3796var non = "\u200B\x85";
3797var ltrim = RegExp('^' + space + space + '*');
3798var rtrim = RegExp(space + space + '*$');
3799
3800var exporter = function exporter(KEY, exec, ALIAS) {
3801  var exp = {};
3802  var FORCE = fails(function () {
3803    return !!spaces[KEY]() || non[KEY]() != non;
3804  });
3805  var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];
3806  if (ALIAS) exp[ALIAS] = fn;
3807  $export($export.P + $export.F * FORCE, 'String', exp);
3808}; // 1 -> String#trimLeft
3809// 2 -> String#trimRight
3810// 3 -> String#trim
3811
3812
3813var trim = exporter.trim = function (string, TYPE) {
3814  string = String(defined(string));
3815  if (TYPE & 1) string = string.replace(ltrim, '');
3816  if (TYPE & 2) string = string.replace(rtrim, '');
3817  return string;
3818};
3819
3820module.exports = exporter;
3821
3822/***/ }),
3823
vendor: 579 bytes, lines 3824-3834
3824/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-ws.js":
3825/*!*********************************************************************************!*\
3826  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_string-ws.js ***!
3827  \*********************************************************************************/
3828/*! no static exports found */
3829/***/ (function(module, exports) {
3830
3831module.exports = "\t\n\x0B\f\r \xA0\u1680\u180E\u2000\u2001\u2002\u2003" + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF";
3832
3833/***/ }),
3834
vendor: 3,502 bytes, lines 3835-3943
3835/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_task.js":
3836/*!****************************************************************************!*\
3837  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_task.js ***!
3838  \****************************************************************************/
3839/*! no static exports found */
3840/***/ (function(module, exports, __webpack_require__) {
3841
3842var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js");
3843
3844var invoke = __webpack_require__(/*! ./_invoke */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_invoke.js");
3845
3846var html = __webpack_require__(/*! ./_html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_html.js");
3847
3848var cel = __webpack_require__(/*! ./_dom-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_dom-create.js");
3849
3850var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
3851
3852var process = global.process;
3853var setTask = global.setImmediate;
3854var clearTask = global.clearImmediate;
3855var MessageChannel = global.MessageChannel;
3856var Dispatch = global.Dispatch;
3857var counter = 0;
3858var queue = {};
3859var ONREADYSTATECHANGE = 'onreadystatechange';
3860var defer, channel, port;
3861
3862var run = function run() {
3863  var id = +this; // eslint-disable-next-line no-prototype-builtins
3864
3865  if (queue.hasOwnProperty(id)) {
3866    var fn = queue[id];
3867    delete queue[id];
3868    fn();
3869  }
3870};
3871
3872var listener = function listener(event) {
3873  run.call(event.data);
3874}; // Node.js 0.9+ & IE10+ has setImmediate, otherwise:
3875
3876
3877if (!setTask || !clearTask) {
3878  setTask = function setImmediate(fn) {
3879    var args = [];
3880    var i = 1;
3881
3882    while (arguments.length > i) {
3883      args.push(arguments[i++]);
3884    }
3885
3886    queue[++counter] = function () {
3887      // eslint-disable-next-line no-new-func
3888      invoke(typeof fn == 'function' ? fn : Function(fn), args);
3889    };
3890
3891    defer(counter);
3892    return counter;
3893  };
3894
3895  clearTask = function clearImmediate(id) {
3896    delete queue[id];
3897  }; // Node.js 0.8-
3898
3899
3900  if (__webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js")(process) == 'process') {
3901    defer = function defer(id) {
3902      process.nextTick(ctx(run, id, 1));
3903    }; // Sphere (JS game engine) Dispatch API
3904
3905  } else if (Dispatch && Dispatch.now) {
3906    defer = function defer(id) {
3907      Dispatch.now(ctx(run, id, 1));
3908    }; // Browsers with MessageChannel, includes WebWorkers
3909
3910  } else if (MessageChannel) {
3911    channel = new MessageChannel();
3912    port = channel.port2;
3913    channel.port1.onmessage = listener;
3914    defer = ctx(port.postMessage, port, 1); // Browsers with postMessage, skip WebWorkers
3915    // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
3916  } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {
3917    defer = function defer(id) {
3918      global.postMessage(id + '', '*');
3919    };
3920
3921    global.addEventListener('message', listener, false); // IE8-
3922  } else if (ONREADYSTATECHANGE in cel('script')) {
3923    defer = function defer(id) {
3924      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {
3925        html.removeChild(this);
3926        run.call(id);
3927      };
3928    }; // Rest old browsers
3929
3930  } else {
3931    defer = function defer(id) {
3932      setTimeout(ctx(run, id, 1), 0);
3933    };
3934  }
3935}
3936
3937module.exports = {
3938  set: setTask,
3939  clear: clearTask
3940};
3941
3942/***/ }),
3943
vendor: 794 bytes, lines 3944-3962
3944/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js":
3945/*!*****************************************************************************************!*\
3946  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js ***!
3947  \*****************************************************************************************/
3948/*! no static exports found */
3949/***/ (function(module, exports, __webpack_require__) {
3950
3951var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js");
3952
3953var max = Math.max;
3954var min = Math.min;
3955
3956module.exports = function (index, length) {
3957  index = toInteger(index);
3958  return index < 0 ? max(index + length, 0) : min(index, length);
3959};
3960
3961/***/ }),
3962
vendor: 967 bytes, lines 3963-3984
3963/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-index.js":
3964/*!********************************************************************************!*\
3965  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_to-index.js ***!
3966  \********************************************************************************/
3967/*! no static exports found */
3968/***/ (function(module, exports, __webpack_require__) {
3969
3970// https://tc39.github.io/ecma262/#sec-toindex
3971var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js");
3972
3973var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
3974
3975module.exports = function (it) {
3976  if (it === undefined) return 0;
3977  var number = toInteger(it);
3978  var length = toLength(number);
3979  if (number !== length) throw RangeError('Wrong length!');
3980  return length;
3981};
3982
3983/***/ }),
3984
vendor: 588 bytes, lines 3985-4001
3985/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js":
3986/*!**********************************************************************************!*\
3987  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js ***!
3988  \**********************************************************************************/
3989/*! no static exports found */
3990/***/ (function(module, exports) {
3991
3992// 7.1.4 ToInteger
3993var ceil = Math.ceil;
3994var floor = Math.floor;
3995
3996module.exports = function (it) {
3997  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
3998};
3999
4000/***/ }),
4001
vendor: 848 bytes, lines 4002-4019
4002/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js":
4003/*!**********************************************************************************!*\
4004  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js ***!
4005  \**********************************************************************************/
4006/*! no static exports found */
4007/***/ (function(module, exports, __webpack_require__) {
4008
4009// to indexed object, toObject with fallback for non-array-like ES3 strings
4010var IObject = __webpack_require__(/*! ./_iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iobject.js");
4011
4012var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js");
4013
4014module.exports = function (it) {
4015  return IObject(defined(it));
4016};
4017
4018/***/ }),
4019
vendor: 754 bytes, lines 4020-4037
4020/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js":
4021/*!*********************************************************************************!*\
4022  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js ***!
4023  \*********************************************************************************/
4024/*! no static exports found */
4025/***/ (function(module, exports, __webpack_require__) {
4026
4027// 7.1.15 ToLength
4028var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js");
4029
4030var min = Math.min;
4031
4032module.exports = function (it) {
4033  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
4034};
4035
4036/***/ }),
4037
vendor: 667 bytes, lines 4038-4053
4038/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js":
4039/*!*********************************************************************************!*\
4040  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js ***!
4041  \*********************************************************************************/
4042/*! no static exports found */
4043/***/ (function(module, exports, __webpack_require__) {
4044
4045// 7.1.13 ToObject(argument)
4046var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js");
4047
4048module.exports = function (it) {
4049  return Object(defined(it));
4050};
4051
4052/***/ }),
4053
vendor: 1,205 bytes, lines 4054-4076
4054/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js":
4055/*!************************************************************************************!*\
4056  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js ***!
4057  \************************************************************************************/
4058/*! no static exports found */
4059/***/ (function(module, exports, __webpack_require__) {
4060
4061// 7.1.1 ToPrimitive(input [, PreferredType])
4062var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js"); // instead of the ES6 spec version, we didn't implement @@toPrimitive case
4063// and the second argument - flag - preferred type is a string
4064
4065
4066module.exports = function (it, S) {
4067  if (!isObject(it)) return it;
4068  var fn, val;
4069  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
4070  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
4071  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
4072  throw TypeError("Can't convert object to primitive value");
4073};
4074
4075/***/ }),
4076
vendor: 23,111 bytes, lines 4077-4674
4077/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js":
4078/*!***********************************************************************************!*\
4079  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js ***!
4080  \***********************************************************************************/
4081/*! no static exports found */
4082/***/ (function(module, exports, __webpack_require__) {
4083
4084"use strict";
4085
4086
4087function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
4088
4089if (__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js")) {
4090  var LIBRARY = __webpack_require__(/*! ./_library */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js");
4091
4092  var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
4093
4094  var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js");
4095
4096  var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
4097
4098  var $typed = __webpack_require__(/*! ./_typed */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed.js");
4099
4100  var $buffer = __webpack_require__(/*! ./_typed-buffer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-buffer.js");
4101
4102  var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js");
4103
4104  var anInstance = __webpack_require__(/*! ./_an-instance */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js");
4105
4106  var propertyDesc = __webpack_require__(/*! ./_property-desc */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js");
4107
4108  var hide = __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js");
4109
4110  var redefineAll = __webpack_require__(/*! ./_redefine-all */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js");
4111
4112  var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js");
4113
4114  var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
4115
4116  var toIndex = __webpack_require__(/*! ./_to-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-index.js");
4117
4118  var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js");
4119
4120  var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js");
4121
4122  var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js");
4123
4124  var classof = __webpack_require__(/*! ./_classof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js");
4125
4126  var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
4127
4128  var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js");
4129
4130  var isArrayIter = __webpack_require__(/*! ./_is-array-iter */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array-iter.js");
4131
4132  var create = __webpack_require__(/*! ./_object-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js");
4133
4134  var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js");
4135
4136  var gOPN = __webpack_require__(/*! ./_object-gopn */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js").f;
4137
4138  var getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/core.get-iterator-method.js");
4139
4140  var uid = __webpack_require__(/*! ./_uid */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js");
4141
4142  var wks = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js");
4143
4144  var createArrayMethod = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js");
4145
4146  var createArrayIncludes = __webpack_require__(/*! ./_array-includes */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-includes.js");
4147
4148  var speciesConstructor = __webpack_require__(/*! ./_species-constructor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_species-constructor.js");
4149
4150  var ArrayIterators = __webpack_require__(/*! ./es6.array.iterator */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.iterator.js");
4151
4152  var Iterators = __webpack_require__(/*! ./_iterators */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js");
4153
4154  var $iterDetect = __webpack_require__(/*! ./_iter-detect */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-detect.js");
4155
4156  var setSpecies = __webpack_require__(/*! ./_set-species */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js");
4157
4158  var arrayFill = __webpack_require__(/*! ./_array-fill */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-fill.js");
4159
4160  var arrayCopyWithin = __webpack_require__(/*! ./_array-copy-within */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-copy-within.js");
4161
4162  var $DP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js");
4163
4164  var $GOPD = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js");
4165
4166  var dP = $DP.f;
4167  var gOPD = $GOPD.f;
4168  var RangeError = global.RangeError;
4169  var TypeError = global.TypeError;
4170  var Uint8Array = global.Uint8Array;
4171  var ARRAY_BUFFER = 'ArrayBuffer';
4172  var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;
4173  var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';
4174  var PROTOTYPE = 'prototype';
4175  var ArrayProto = Array[PROTOTYPE];
4176  var $ArrayBuffer = $buffer.ArrayBuffer;
4177  var $DataView = $buffer.DataView;
4178  var arrayForEach = createArrayMethod(0);
4179  var arrayFilter = createArrayMethod(2);
4180  var arraySome = createArrayMethod(3);
4181  var arrayEvery = createArrayMethod(4);
4182  var arrayFind = createArrayMethod(5);
4183  var arrayFindIndex = createArrayMethod(6);
4184  var arrayIncludes = createArrayIncludes(true);
4185  var arrayIndexOf = createArrayIncludes(false);
4186  var arrayValues = ArrayIterators.values;
4187  var arrayKeys = ArrayIterators.keys;
4188  var arrayEntries = ArrayIterators.entries;
4189  var arrayLastIndexOf = ArrayProto.lastIndexOf;
4190  var arrayReduce = ArrayProto.reduce;
4191  var arrayReduceRight = ArrayProto.reduceRight;
4192  var arrayJoin = ArrayProto.join;
4193  var arraySort = ArrayProto.sort;
4194  var arraySlice = ArrayProto.slice;
4195  var arrayToString = ArrayProto.toString;
4196  var arrayToLocaleString = ArrayProto.toLocaleString;
4197  var ITERATOR = wks('iterator');
4198  var TAG = wks('toStringTag');
4199  var TYPED_CONSTRUCTOR = uid('typed_constructor');
4200  var DEF_CONSTRUCTOR = uid('def_constructor');
4201  var ALL_CONSTRUCTORS = $typed.CONSTR;
4202  var TYPED_ARRAY = $typed.TYPED;
4203  var VIEW = $typed.VIEW;
4204  var WRONG_LENGTH = 'Wrong length!';
4205  var $map = createArrayMethod(1, function (O, length) {
4206    return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);
4207  });
4208  var LITTLE_ENDIAN = fails(function () {
4209    // eslint-disable-next-line no-undef
4210    return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;
4211  });
4212  var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {
4213    new Uint8Array(1).set({});
4214  });
4215
4216  var toOffset = function toOffset(it, BYTES) {
4217    var offset = toInteger(it);
4218    if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');
4219    return offset;
4220  };
4221
4222  var validate = function validate(it) {
4223    if (isObject(it) && TYPED_ARRAY in it) return it;
4224    throw TypeError(it + ' is not a typed array!');
4225  };
4226
4227  var allocate = function allocate(C, length) {
4228    if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {
4229      throw TypeError('It is not a typed array constructor!');
4230    }
4231
4232    return new C(length);
4233  };
4234
4235  var speciesFromList = function speciesFromList(O, list) {
4236    return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);
4237  };
4238
4239  var fromList = function fromList(C, list) {
4240    var index = 0;
4241    var length = list.length;
4242    var result = allocate(C, length);
4243
4244    while (length > index) {
4245      result[index] = list[index++];
4246    }
4247
4248    return result;
4249  };
4250
4251  var addGetter = function addGetter(it, key, internal) {
4252    dP(it, key, {
4253      get: function get() {
4254        return this._d[internal];
4255      }
4256    });
4257  };
4258
4259  var $from = function from(source
4260  /* , mapfn, thisArg */
4261  ) {
4262    var O = toObject(source);
4263    var aLen = arguments.length;
4264    var mapfn = aLen > 1 ? arguments[1] : undefined;
4265    var mapping = mapfn !== undefined;
4266    var iterFn = getIterFn(O);
4267    var i, length, values, result, step, iterator;
4268
4269    if (iterFn != undefined && !isArrayIter(iterFn)) {
4270      for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {
4271        values.push(step.value);
4272      }
4273
4274      O = values;
4275    }
4276
4277    if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);
4278
4279    for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {
4280      result[i] = mapping ? mapfn(O[i], i) : O[i];
4281    }
4282
4283    return result;
4284  };
4285
4286  var $of = function of()
4287  /* ...items */
4288  {
4289    var index = 0;
4290    var length = arguments.length;
4291    var result = allocate(this, length);
4292
4293    while (length > index) {
4294      result[index] = arguments[index++];
4295    }
4296
4297    return result;
4298  }; // iOS Safari 6.x fails here
4299
4300
4301  var TO_LOCALE_BUG = !!Uint8Array && fails(function () {
4302    arrayToLocaleString.call(new Uint8Array(1));
4303  });
4304
4305  var $toLocaleString = function toLocaleString() {
4306    return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);
4307  };
4308
4309  var proto = {
4310    copyWithin: function copyWithin(target, start
4311    /* , end */
4312    ) {
4313      return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);
4314    },
4315    every: function every(callbackfn
4316    /* , thisArg */
4317    ) {
4318      return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
4319    },
4320    fill: function fill(value
4321    /* , start, end */
4322    ) {
4323      // eslint-disable-line no-unused-vars
4324      return arrayFill.apply(validate(this), arguments);
4325    },
4326    filter: function filter(callbackfn
4327    /* , thisArg */
4328    ) {
4329      return speciesFromList(this, arrayFilter(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined));
4330    },
4331    find: function find(predicate
4332    /* , thisArg */
4333    ) {
4334      return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
4335    },
4336    findIndex: function findIndex(predicate
4337    /* , thisArg */
4338    ) {
4339      return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
4340    },
4341    forEach: function forEach(callbackfn
4342    /* , thisArg */
4343    ) {
4344      arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
4345    },
4346    indexOf: function indexOf(searchElement
4347    /* , fromIndex */
4348    ) {
4349      return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
4350    },
4351    includes: function includes(searchElement
4352    /* , fromIndex */
4353    ) {
4354      return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
4355    },
4356    join: function join(separator) {
4357      // eslint-disable-line no-unused-vars
4358      return arrayJoin.apply(validate(this), arguments);
4359    },
4360    lastIndexOf: function lastIndexOf(searchElement
4361    /* , fromIndex */
4362    ) {
4363      // eslint-disable-line no-unused-vars
4364      return arrayLastIndexOf.apply(validate(this), arguments);
4365    },
4366    map: function map(mapfn
4367    /* , thisArg */
4368    ) {
4369      return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);
4370    },
4371    reduce: function reduce(callbackfn
4372    /* , initialValue */
4373    ) {
4374      // eslint-disable-line no-unused-vars
4375      return arrayReduce.apply(validate(this), arguments);
4376    },
4377    reduceRight: function reduceRight(callbackfn
4378    /* , initialValue */
4379    ) {
4380      // eslint-disable-line no-unused-vars
4381      return arrayReduceRight.apply(validate(this), arguments);
4382    },
4383    reverse: function reverse() {
4384      var that = this;
4385      var length = validate(that).length;
4386      var middle = Math.floor(length / 2);
4387      var index = 0;
4388      var value;
4389
4390      while (index < middle) {
4391        value = that[index];
4392        that[index++] = that[--length];
4393        that[length] = value;
4394      }
4395
4396      return that;
4397    },
4398    some: function some(callbackfn
4399    /* , thisArg */
4400    ) {
4401      return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
4402    },
4403    sort: function sort(comparefn) {
4404      return arraySort.call(validate(this), comparefn);
4405    },
4406    subarray: function subarray(begin, end) {
4407      var O = validate(this);
4408      var length = O.length;
4409      var $begin = toAbsoluteIndex(begin, length);
4410      return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(O.buffer, O.byteOffset + $begin * O.BYTES_PER_ELEMENT, toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin));
4411    }
4412  };
4413
4414  var $slice = function slice(start, end) {
4415    return speciesFromList(this, arraySlice.call(validate(this), start, end));
4416  };
4417
4418  var $set = function set(arrayLike
4419  /* , offset */
4420  ) {
4421    validate(this);
4422    var offset = toOffset(arguments[1], 1);
4423    var length = this.length;
4424    var src = toObject(arrayLike);
4425    var len = toLength(src.length);
4426    var index = 0;
4427    if (len + offset > length) throw RangeError(WRONG_LENGTH);
4428
4429    while (index < len) {
4430      this[offset + index] = src[index++];
4431    }
4432  };
4433
4434  var $iterators = {
4435    entries: function entries() {
4436      return arrayEntries.call(validate(this));
4437    },
4438    keys: function keys() {
4439      return arrayKeys.call(validate(this));
4440    },
4441    values: function values() {
4442      return arrayValues.call(validate(this));
4443    }
4444  };
4445
4446  var isTAIndex = function isTAIndex(target, key) {
4447    return isObject(target) && target[TYPED_ARRAY] && _typeof(key) != 'symbol' && key in target && String(+key) == String(key);
4448  };
4449
4450  var $getDesc = function getOwnPropertyDescriptor(target, key) {
4451    return isTAIndex(target, key = toPrimitive(key, true)) ? propertyDesc(2, target[key]) : gOPD(target, key);
4452  };
4453
4454  var $setDesc = function defineProperty(target, key, desc) {
4455    if (isTAIndex(target, key = toPrimitive(key, true)) && isObject(desc) && has(desc, 'value') && !has(desc, 'get') && !has(desc, 'set') // TODO: add validation descriptor w/o calling accessors
4456    && !desc.configurable && (!has(desc, 'writable') || desc.writable) && (!has(desc, 'enumerable') || desc.enumerable)) {
4457      target[key] = desc.value;
4458      return target;
4459    }
4460
4461    return dP(target, key, desc);
4462  };
4463
4464  if (!ALL_CONSTRUCTORS) {
4465    $GOPD.f = $getDesc;
4466    $DP.f = $setDesc;
4467  }
4468
4469  $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {
4470    getOwnPropertyDescriptor: $getDesc,
4471    defineProperty: $setDesc
4472  });
4473
4474  if (fails(function () {
4475    arrayToString.call({});
4476  })) {
4477    arrayToString = arrayToLocaleString = function toString() {
4478      return arrayJoin.call(this);
4479    };
4480  }
4481
4482  var $TypedArrayPrototype$ = redefineAll({}, proto);
4483  redefineAll($TypedArrayPrototype$, $iterators);
4484  hide($TypedArrayPrototype$, ITERATOR, $iterators.values);
4485  redefineAll($TypedArrayPrototype$, {
4486    slice: $slice,
4487    set: $set,
4488    constructor: function constructor() {
4489      /* noop */
4490    },
4491    toString: arrayToString,
4492    toLocaleString: $toLocaleString
4493  });
4494  addGetter($TypedArrayPrototype$, 'buffer', 'b');
4495  addGetter($TypedArrayPrototype$, 'byteOffset', 'o');
4496  addGetter($TypedArrayPrototype$, 'byteLength', 'l');
4497  addGetter($TypedArrayPrototype$, 'length', 'e');
4498  dP($TypedArrayPrototype$, TAG, {
4499    get: function get() {
4500      return this[TYPED_ARRAY];
4501    }
4502  }); // eslint-disable-next-line max-statements
4503
4504  module.exports = function (KEY, BYTES, wrapper, CLAMPED) {
4505    CLAMPED = !!CLAMPED;
4506    var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';
4507    var GETTER = 'get' + KEY;
4508    var SETTER = 'set' + KEY;
4509    var TypedArray = global[NAME];
4510    var Base = TypedArray || {};
4511    var TAC = TypedArray && getPrototypeOf(TypedArray);
4512    var FORCED = !TypedArray || !$typed.ABV;
4513    var O = {};
4514    var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];
4515
4516    var getter = function getter(that, index) {
4517      var data = that._d;
4518      return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);
4519    };
4520
4521    var setter = function setter(that, index, value) {
4522      var data = that._d;
4523      if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;
4524      data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);
4525    };
4526
4527    var addElement = function addElement(that, index) {
4528      dP(that, index, {
4529        get: function get() {
4530          return getter(this, index);
4531        },
4532        set: function set(value) {
4533          return setter(this, index, value);
4534        },
4535        enumerable: true
4536      });
4537    };
4538
4539    if (FORCED) {
4540      TypedArray = wrapper(function (that, data, $offset, $length) {
4541        anInstance(that, TypedArray, NAME, '_d');
4542        var index = 0;
4543        var offset = 0;
4544        var buffer, byteLength, length, klass;
4545
4546        if (!isObject(data)) {
4547          length = toIndex(data);
4548          byteLength = length * BYTES;
4549          buffer = new $ArrayBuffer(byteLength);
4550        } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {
4551          buffer = data;
4552          offset = toOffset($offset, BYTES);
4553          var $len = data.byteLength;
4554
4555          if ($length === undefined) {
4556            if ($len % BYTES) throw RangeError(WRONG_LENGTH);
4557            byteLength = $len - offset;
4558            if (byteLength < 0) throw RangeError(WRONG_LENGTH);
4559          } else {
4560            byteLength = toLength($length) * BYTES;
4561            if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);
4562          }
4563
4564          length = byteLength / BYTES;
4565        } else if (TYPED_ARRAY in data) {
4566          return fromList(TypedArray, data);
4567        } else {
4568          return $from.call(TypedArray, data);
4569        }
4570
4571        hide(that, '_d', {
4572          b: buffer,
4573          o: offset,
4574          l: byteLength,
4575          e: length,
4576          v: new $DataView(buffer)
4577        });
4578
4579        while (index < length) {
4580          addElement(that, index++);
4581        }
4582      });
4583      TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);
4584      hide(TypedArrayPrototype, 'constructor', TypedArray);
4585    } else if (!fails(function () {
4586      TypedArray(1);
4587    }) || !fails(function () {
4588      new TypedArray(-1); // eslint-disable-line no-new
4589    }) || !$iterDetect(function (iter) {
4590      new TypedArray(); // eslint-disable-line no-new
4591
4592      new TypedArray(null); // eslint-disable-line no-new
4593
4594      new TypedArray(1.5); // eslint-disable-line no-new
4595
4596      new TypedArray(iter); // eslint-disable-line no-new
4597    }, true)) {
4598      TypedArray = wrapper(function (that, data, $offset, $length) {
4599        anInstance(that, TypedArray, NAME);
4600        var klass; // `ws` module bug, temporarily remove validation length for Uint8Array
4601        // https://github.com/websockets/ws/pull/645
4602
4603        if (!isObject(data)) return new Base(toIndex(data));
4604
4605        if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {
4606          return $length !== undefined ? new Base(data, toOffset($offset, BYTES), $length) : $offset !== undefined ? new Base(data, toOffset($offset, BYTES)) : new Base(data);
4607        }
4608
4609        if (TYPED_ARRAY in data) return fromList(TypedArray, data);
4610        return $from.call(TypedArray, data);
4611      });
4612      arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {
4613        if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);
4614      });
4615      TypedArray[PROTOTYPE] = TypedArrayPrototype;
4616      if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;
4617    }
4618
4619    var $nativeIterator = TypedArrayPrototype[ITERATOR];
4620    var CORRECT_ITER_NAME = !!$nativeIterator && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);
4621    var $iterator = $iterators.values;
4622    hide(TypedArray, TYPED_CONSTRUCTOR, true);
4623    hide(TypedArrayPrototype, TYPED_ARRAY, NAME);
4624    hide(TypedArrayPrototype, VIEW, true);
4625    hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);
4626
4627    if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {
4628      dP(TypedArrayPrototype, TAG, {
4629        get: function get() {
4630          return NAME;
4631        }
4632      });
4633    }
4634
4635    O[NAME] = TypedArray;
4636    $export($export.G + $export.W + $export.F * (TypedArray != Base), O);
4637    $export($export.S, NAME, {
4638      BYTES_PER_ELEMENT: BYTES
4639    });
4640    $export($export.S + $export.F * fails(function () {
4641      Base.of.call(TypedArray, 1);
4642    }), NAME, {
4643      from: $from,
4644      of: $of
4645    });
4646    if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);
4647    $export($export.P, NAME, proto);
4648    setSpecies(NAME);
4649    $export($export.P + $export.F * FORCED_SET, NAME, {
4650      set: $set
4651    });
4652    $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);
4653    if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;
4654    $export($export.P + $export.F * fails(function () {
4655      new TypedArray(1).slice();
4656    }), NAME, {
4657      slice: $slice
4658    });
4659    $export($export.P + $export.F * (fails(function () {
4660      return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();
4661    }) || !fails(function () {
4662      TypedArrayPrototype.toLocaleString.call([1, 2]);
4663    })), NAME, {
4664      toLocaleString: $toLocaleString
4665    });
4666    Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;
4667    if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);
4668  };
4669} else module.exports = function () {
4670  /* empty */
4671};
4672
4673/***/ }),
4674
vendor: 11,557 bytes, lines 4675-5044
4675/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-buffer.js":
4676/*!************************************************************************************!*\
4677  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-buffer.js ***!
4678  \************************************************************************************/
4679/*! no static exports found */
4680/***/ (function(module, exports, __webpack_require__) {
4681
4682"use strict";
4683
4684
4685var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
4686
4687var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js");
4688
4689var LIBRARY = __webpack_require__(/*! ./_library */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js");
4690
4691var $typed = __webpack_require__(/*! ./_typed */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed.js");
4692
4693var hide = __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js");
4694
4695var redefineAll = __webpack_require__(/*! ./_redefine-all */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js");
4696
4697var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js");
4698
4699var anInstance = __webpack_require__(/*! ./_an-instance */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js");
4700
4701var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js");
4702
4703var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
4704
4705var toIndex = __webpack_require__(/*! ./_to-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-index.js");
4706
4707var gOPN = __webpack_require__(/*! ./_object-gopn */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js").f;
4708
4709var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f;
4710
4711var arrayFill = __webpack_require__(/*! ./_array-fill */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-fill.js");
4712
4713var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js");
4714
4715var ARRAY_BUFFER = 'ArrayBuffer';
4716var DATA_VIEW = 'DataView';
4717var PROTOTYPE = 'prototype';
4718var WRONG_LENGTH = 'Wrong length!';
4719var WRONG_INDEX = 'Wrong index!';
4720var $ArrayBuffer = global[ARRAY_BUFFER];
4721var $DataView = global[DATA_VIEW];
4722var Math = global.Math;
4723var RangeError = global.RangeError; // eslint-disable-next-line no-shadow-restricted-names
4724
4725var Infinity = global.Infinity;
4726var BaseBuffer = $ArrayBuffer;
4727var abs = Math.abs;
4728var pow = Math.pow;
4729var floor = Math.floor;
4730var log = Math.log;
4731var LN2 = Math.LN2;
4732var BUFFER = 'buffer';
4733var BYTE_LENGTH = 'byteLength';
4734var BYTE_OFFSET = 'byteOffset';
4735var $BUFFER = DESCRIPTORS ? '_b' : BUFFER;
4736var $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;
4737var $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET; // IEEE754 conversions based on https://github.com/feross/ieee754
4738
4739function packIEEE754(value, mLen, nBytes) {
4740  var buffer = new Array(nBytes);
4741  var eLen = nBytes * 8 - mLen - 1;
4742  var eMax = (1 << eLen) - 1;
4743  var eBias = eMax >> 1;
4744  var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;
4745  var i = 0;
4746  var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;
4747  var e, m, c;
4748  value = abs(value); // eslint-disable-next-line no-self-compare
4749
4750  if (value != value || value === Infinity) {
4751    // eslint-disable-next-line no-self-compare
4752    m = value != value ? 1 : 0;
4753    e = eMax;
4754  } else {
4755    e = floor(log(value) / LN2);
4756
4757    if (value * (c = pow(2, -e)) < 1) {
4758      e--;
4759      c *= 2;
4760    }
4761
4762    if (e + eBias >= 1) {
4763      value += rt / c;
4764    } else {
4765      value += rt * pow(2, 1 - eBias);
4766    }
4767
4768    if (value * c >= 2) {
4769      e++;
4770      c /= 2;
4771    }
4772
4773    if (e + eBias >= eMax) {
4774      m = 0;
4775      e = eMax;
4776    } else if (e + eBias >= 1) {
4777      m = (value * c - 1) * pow(2, mLen);
4778      e = e + eBias;
4779    } else {
4780      m = value * pow(2, eBias - 1) * pow(2, mLen);
4781      e = 0;
4782    }
4783  }
4784
4785  for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8) {
4786    ;
4787  }
4788
4789  e = e << mLen | m;
4790  eLen += mLen;
4791
4792  for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8) {
4793    ;
4794  }
4795
4796  buffer[--i] |= s * 128;
4797  return buffer;
4798}
4799
4800function unpackIEEE754(buffer, mLen, nBytes) {
4801  var eLen = nBytes * 8 - mLen - 1;
4802  var eMax = (1 << eLen) - 1;
4803  var eBias = eMax >> 1;
4804  var nBits = eLen - 7;
4805  var i = nBytes - 1;
4806  var s = buffer[i--];
4807  var e = s & 127;
4808  var m;
4809  s >>= 7;
4810
4811  for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8) {
4812    ;
4813  }
4814
4815  m = e & (1 << -nBits) - 1;
4816  e >>= -nBits;
4817  nBits += mLen;
4818
4819  for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8) {
4820    ;
4821  }
4822
4823  if (e === 0) {
4824    e = 1 - eBias;
4825  } else if (e === eMax) {
4826    return m ? NaN : s ? -Infinity : Infinity;
4827  } else {
4828    m = m + pow(2, mLen);
4829    e = e - eBias;
4830  }
4831
4832  return (s ? -1 : 1) * m * pow(2, e - mLen);
4833}
4834
4835function unpackI32(bytes) {
4836  return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];
4837}
4838
4839function packI8(it) {
4840  return [it & 0xff];
4841}
4842
4843function packI16(it) {
4844  return [it & 0xff, it >> 8 & 0xff];
4845}
4846
4847function packI32(it) {
4848  return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];
4849}
4850
4851function packF64(it) {
4852  return packIEEE754(it, 52, 8);
4853}
4854
4855function packF32(it) {
4856  return packIEEE754(it, 23, 4);
4857}
4858
4859function addGetter(C, key, internal) {
4860  dP(C[PROTOTYPE], key, {
4861    get: function get() {
4862      return this[internal];
4863    }
4864  });
4865}
4866
4867function get(view, bytes, index, isLittleEndian) {
4868  var numIndex = +index;
4869  var intIndex = toIndex(numIndex);
4870  if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);
4871  var store = view[$BUFFER]._b;
4872  var start = intIndex + view[$OFFSET];
4873  var pack = store.slice(start, start + bytes);
4874  return isLittleEndian ? pack : pack.reverse();
4875}
4876
4877function set(view, bytes, index, conversion, value, isLittleEndian) {
4878  var numIndex = +index;
4879  var intIndex = toIndex(numIndex);
4880  if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);
4881  var store = view[$BUFFER]._b;
4882  var start = intIndex + view[$OFFSET];
4883  var pack = conversion(+value);
4884
4885  for (var i = 0; i < bytes; i++) {
4886    store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];
4887  }
4888}
4889
4890if (!$typed.ABV) {
4891  $ArrayBuffer = function ArrayBuffer(length) {
4892    anInstance(this, $ArrayBuffer, ARRAY_BUFFER);
4893    var byteLength = toIndex(length);
4894    this._b = arrayFill.call(new Array(byteLength), 0);
4895    this[$LENGTH] = byteLength;
4896  };
4897
4898  $DataView = function DataView(buffer, byteOffset, byteLength) {
4899    anInstance(this, $DataView, DATA_VIEW);
4900    anInstance(buffer, $ArrayBuffer, DATA_VIEW);
4901    var bufferLength = buffer[$LENGTH];
4902    var offset = toInteger(byteOffset);
4903    if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');
4904    byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);
4905    if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);
4906    this[$BUFFER] = buffer;
4907    this[$OFFSET] = offset;
4908    this[$LENGTH] = byteLength;
4909  };
4910
4911  if (DESCRIPTORS) {
4912    addGetter($ArrayBuffer, BYTE_LENGTH, '_l');
4913    addGetter($DataView, BUFFER, '_b');
4914    addGetter($DataView, BYTE_LENGTH, '_l');
4915    addGetter($DataView, BYTE_OFFSET, '_o');
4916  }
4917
4918  redefineAll($DataView[PROTOTYPE], {
4919    getInt8: function getInt8(byteOffset) {
4920      return get(this, 1, byteOffset)[0] << 24 >> 24;
4921    },
4922    getUint8: function getUint8(byteOffset) {
4923      return get(this, 1, byteOffset)[0];
4924    },
4925    getInt16: function getInt16(byteOffset
4926    /* , littleEndian */
4927    ) {
4928      var bytes = get(this, 2, byteOffset, arguments[1]);
4929      return (bytes[1] << 8 | bytes[0]) << 16 >> 16;
4930    },
4931    getUint16: function getUint16(byteOffset
4932    /* , littleEndian */
4933    ) {
4934      var bytes = get(this, 2, byteOffset, arguments[1]);
4935      return bytes[1] << 8 | bytes[0];
4936    },
4937    getInt32: function getInt32(byteOffset
4938    /* , littleEndian */
4939    ) {
4940      return unpackI32(get(this, 4, byteOffset, arguments[1]));
4941    },
4942    getUint32: function getUint32(byteOffset
4943    /* , littleEndian */
4944    ) {
4945      return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;
4946    },
4947    getFloat32: function getFloat32(byteOffset
4948    /* , littleEndian */
4949    ) {
4950      return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);
4951    },
4952    getFloat64: function getFloat64(byteOffset
4953    /* , littleEndian */
4954    ) {
4955      return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);
4956    },
4957    setInt8: function setInt8(byteOffset, value) {
4958      set(this, 1, byteOffset, packI8, value);
4959    },
4960    setUint8: function setUint8(byteOffset, value) {
4961      set(this, 1, byteOffset, packI8, value);
4962    },
4963    setInt16: function setInt16(byteOffset, value
4964    /* , littleEndian */
4965    ) {
4966      set(this, 2, byteOffset, packI16, value, arguments[2]);
4967    },
4968    setUint16: function setUint16(byteOffset, value
4969    /* , littleEndian */
4970    ) {
4971      set(this, 2, byteOffset, packI16, value, arguments[2]);
4972    },
4973    setInt32: function setInt32(byteOffset, value
4974    /* , littleEndian */
4975    ) {
4976      set(this, 4, byteOffset, packI32, value, arguments[2]);
4977    },
4978    setUint32: function setUint32(byteOffset, value
4979    /* , littleEndian */
4980    ) {
4981      set(this, 4, byteOffset, packI32, value, arguments[2]);
4982    },
4983    setFloat32: function setFloat32(byteOffset, value
4984    /* , littleEndian */
4985    ) {
4986      set(this, 4, byteOffset, packF32, value, arguments[2]);
4987    },
4988    setFloat64: function setFloat64(byteOffset, value
4989    /* , littleEndian */
4990    ) {
4991      set(this, 8, byteOffset, packF64, value, arguments[2]);
4992    }
4993  });
4994} else {
4995  if (!fails(function () {
4996    $ArrayBuffer(1);
4997  }) || !fails(function () {
4998    new $ArrayBuffer(-1); // eslint-disable-line no-new
4999  }) || fails(function () {
5000    new $ArrayBuffer(); // eslint-disable-line no-new
5001
5002    new $ArrayBuffer(1.5); // eslint-disable-line no-new
5003
5004    new $ArrayBuffer(NaN); // eslint-disable-line no-new
5005
5006    return $ArrayBuffer.name != ARRAY_BUFFER;
5007  })) {
5008    $ArrayBuffer = function ArrayBuffer(length) {
5009      anInstance(this, $ArrayBuffer);
5010      return new BaseBuffer(toIndex(length));
5011    };
5012
5013    var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];
5014
5015    for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {
5016      if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);
5017    }
5018
5019    if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;
5020  } // iOS Safari 7.x bug
5021
5022
5023  var view = new $DataView(new $ArrayBuffer(2));
5024  var $setInt8 = $DataView[PROTOTYPE].setInt8;
5025  view.setInt8(0, 2147483648);
5026  view.setInt8(1, 2147483649);
5027  if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {
5028    setInt8: function setInt8(byteOffset, value) {
5029      $setInt8.call(this, byteOffset, value << 24 >> 24);
5030    },
5031    setUint8: function setUint8(byteOffset, value) {
5032      $setInt8.call(this, byteOffset, value << 24 >> 24);
5033    }
5034  }, true);
5035}
5036
5037setToStringTag($ArrayBuffer, ARRAY_BUFFER);
5038setToStringTag($DataView, DATA_VIEW);
5039hide($DataView[PROTOTYPE], $typed.VIEW, true);
5040exports[ARRAY_BUFFER] = $ArrayBuffer;
5041exports[DATA_VIEW] = $DataView;
5042
5043/***/ }),
5044
vendor: 1,362 bytes, lines 5045-5082
5045/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed.js":
5046/*!*****************************************************************************!*\
5047  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_typed.js ***!
5048  \*****************************************************************************/
5049/*! no static exports found */
5050/***/ (function(module, exports, __webpack_require__) {
5051
5052var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
5053
5054var hide = __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js");
5055
5056var uid = __webpack_require__(/*! ./_uid */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js");
5057
5058var TYPED = uid('typed_array');
5059var VIEW = uid('view');
5060var ABV = !!(global.ArrayBuffer && global.DataView);
5061var CONSTR = ABV;
5062var i = 0;
5063var l = 9;
5064var Typed;
5065var TypedArrayConstructors = 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'.split(',');
5066
5067while (i < l) {
5068  if (Typed = global[TypedArrayConstructors[i++]]) {
5069    hide(Typed.prototype, TYPED, true);
5070    hide(Typed.prototype, VIEW, true);
5071  } else CONSTR = false;
5072}
5073
5074module.exports = {
5075  ABV: ABV,
5076  CONSTR: CONSTR,
5077  TYPED: TYPED,
5078  VIEW: VIEW
5079};
5080
5081/***/ }),
5082
vendor: 561 bytes, lines 5083-5098
5083/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js":
5084/*!***************************************************************************!*\
5085  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js ***!
5086  \***************************************************************************/
5087/*! no static exports found */
5088/***/ (function(module, exports) {
5089
5090var id = 0;
5091var px = Math.random();
5092
5093module.exports = function (key) {
5094  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
5095};
5096
5097/***/ }),
5098
vendor: 664 bytes, lines 5099-5112
5099/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_user-agent.js":
5100/*!**********************************************************************************!*\
5101  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_user-agent.js ***!
5102  \**********************************************************************************/
5103/*! no static exports found */
5104/***/ (function(module, exports, __webpack_require__) {
5105
5106var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
5107
5108var navigator = global.navigator;
5109module.exports = navigator && navigator.userAgent || '';
5110
5111/***/ }),
5112
vendor: 777 bytes, lines 5113-5128
5113/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js":
5114/*!*******************************************************************************************!*\
5115  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js ***!
5116  \*******************************************************************************************/
5117/*! no static exports found */
5118/***/ (function(module, exports, __webpack_require__) {
5119
5120var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
5121
5122module.exports = function (it, TYPE) {
5123  if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');
5124  return it;
5125};
5126
5127/***/ }),
5128
vendor: 1,328 bytes, lines 5129-5154
5129/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-define.js":
5130/*!**********************************************************************************!*\
5131  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-define.js ***!
5132  \**********************************************************************************/
5133/*! no static exports found */
5134/***/ (function(module, exports, __webpack_require__) {
5135
5136var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
5137
5138var core = __webpack_require__(/*! ./_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js");
5139
5140var LIBRARY = __webpack_require__(/*! ./_library */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js");
5141
5142var wksExt = __webpack_require__(/*! ./_wks-ext */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-ext.js");
5143
5144var defineProperty = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f;
5145
5146module.exports = function (name) {
5147  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
5148  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, {
5149    value: wksExt.f(name)
5150  });
5151};
5152
5153/***/ }),
5154
vendor: 553 bytes, lines 5155-5165
5155/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-ext.js":
5156/*!*******************************************************************************!*\
5157  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-ext.js ***!
5158  \*******************************************************************************/
5159/*! no static exports found */
5160/***/ (function(module, exports, __webpack_require__) {
5161
5162exports.f = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js");
5163
5164/***/ }),
5165
vendor: 1,047 bytes, lines 5166-5188
5166/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js":
5167/*!***************************************************************************!*\
5168  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js ***!
5169  \***************************************************************************/
5170/*! no static exports found */
5171/***/ (function(module, exports, __webpack_require__) {
5172
5173var store = __webpack_require__(/*! ./_shared */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared.js")('wks');
5174
5175var uid = __webpack_require__(/*! ./_uid */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js");
5176
5177var _Symbol = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").Symbol;
5178
5179var USE_SYMBOL = typeof _Symbol == 'function';
5180
5181var $exports = module.exports = function (name) {
5182  return store[name] || (store[name] = USE_SYMBOL && _Symbol[name] || (USE_SYMBOL ? _Symbol : uid)('Symbol.' + name));
5183};
5184
5185$exports.store = store;
5186
5187/***/ }),
5188
vendor: 1,150 bytes, lines 5189-5207
5189/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/core.get-iterator-method.js":
5190/*!***********************************************************************************************!*\
5191  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/core.get-iterator-method.js ***!
5192  \***********************************************************************************************/
5193/*! no static exports found */
5194/***/ (function(module, exports, __webpack_require__) {
5195
5196var classof = __webpack_require__(/*! ./_classof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js");
5197
5198var ITERATOR = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('iterator');
5199
5200var Iterators = __webpack_require__(/*! ./_iterators */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js");
5201
5202module.exports = __webpack_require__(/*! ./_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js").getIteratorMethod = function (it) {
5203  if (it != undefined) return it[ITERATOR] || it['@@iterator'] || Iterators[classof(it)];
5204};
5205
5206/***/ }),
5207
vendor: 898 bytes, lines 5208-5227
5208/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/core.regexp.escape.js":
5209/*!*****************************************************************************************!*\
5210  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/core.regexp.escape.js ***!
5211  \*****************************************************************************************/
5212/*! no static exports found */
5213/***/ (function(module, exports, __webpack_require__) {
5214
5215// https://github.com/benjamingr/RexExp.escape
5216var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5217
5218var $re = __webpack_require__(/*! ./_replacer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_replacer.js")(/[\\^$*+?.()|[\]{}]/g, '\\$&');
5219
5220$export($export.S, 'RegExp', {
5221  escape: function escape(it) {
5222    return $re(it);
5223  }
5224});
5225
5226/***/ }),
5227
vendor: 1,019 bytes, lines 5228-5245
5228/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.copy-within.js":
5229/*!********************************************************************************************!*\
5230  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.copy-within.js ***!
5231  \********************************************************************************************/
5232/*! no static exports found */
5233/***/ (function(module, exports, __webpack_require__) {
5234
5235// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)
5236var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5237
5238$export($export.P, 'Array', {
5239  copyWithin: __webpack_require__(/*! ./_array-copy-within */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-copy-within.js")
5240});
5241
5242__webpack_require__(/*! ./_add-to-unscopables */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js")('copyWithin');
5243
5244/***/ }),
5245
vendor: 1,125 bytes, lines 5246-5270
5246/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.every.js":
5247/*!**************************************************************************************!*\
5248  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.every.js ***!
5249  \**************************************************************************************/
5250/*! no static exports found */
5251/***/ (function(module, exports, __webpack_require__) {
5252
5253"use strict";
5254
5255
5256var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5257
5258var $every = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js")(4);
5259
5260$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")([].every, true), 'Array', {
5261  // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg])
5262  every: function every(callbackfn
5263  /* , thisArg */
5264  ) {
5265    return $every(this, callbackfn, arguments[1]);
5266  }
5267});
5268
5269/***/ }),
5270
vendor: 962 bytes, lines 5271-5288
5271/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.fill.js":
5272/*!*************************************************************************************!*\
5273  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.fill.js ***!
5274  \*************************************************************************************/
5275/*! no static exports found */
5276/***/ (function(module, exports, __webpack_require__) {
5277
5278// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)
5279var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5280
5281$export($export.P, 'Array', {
5282  fill: __webpack_require__(/*! ./_array-fill */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-fill.js")
5283});
5284
5285__webpack_require__(/*! ./_add-to-unscopables */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js")('fill');
5286
5287/***/ }),
5288
vendor: 1,135 bytes, lines 5289-5313
5289/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.filter.js":
5290/*!***************************************************************************************!*\
5291  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.filter.js ***!
5292  \***************************************************************************************/
5293/*! no static exports found */
5294/***/ (function(module, exports, __webpack_require__) {
5295
5296"use strict";
5297
5298
5299var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5300
5301var $filter = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js")(2);
5302
5303$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")([].filter, true), 'Array', {
5304  // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])
5305  filter: function filter(callbackfn
5306  /* , thisArg */
5307  ) {
5308    return $filter(this, callbackfn, arguments[1]);
5309  }
5310});
5311
5312/***/ }),
5313
vendor: 1,332 bytes, lines 5314-5345
5314/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find-index.js":
5315/*!*******************************************************************************************!*\
5316  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find-index.js ***!
5317  \*******************************************************************************************/
5318/*! no static exports found */
5319/***/ (function(module, exports, __webpack_require__) {
5320
5321"use strict";
5322 // 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)
5323
5324var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5325
5326var $find = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js")(6);
5327
5328var KEY = 'findIndex';
5329var forced = true; // Shouldn't skip holes
5330
5331if (KEY in []) Array(1)[KEY](function () {
5332  forced = false;
5333});
5334$export($export.P + $export.F * forced, 'Array', {
5335  findIndex: function findIndex(callbackfn
5336  /* , that = undefined */
5337  ) {
5338    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
5339  }
5340});
5341
5342__webpack_require__(/*! ./_add-to-unscopables */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js")(KEY);
5343
5344/***/ }),
5345
vendor: 1,288 bytes, lines 5346-5377
5346/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find.js":
5347/*!*************************************************************************************!*\
5348  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find.js ***!
5349  \*************************************************************************************/
5350/*! no static exports found */
5351/***/ (function(module, exports, __webpack_require__) {
5352
5353"use strict";
5354 // 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)
5355
5356var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5357
5358var $find = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js")(5);
5359
5360var KEY = 'find';
5361var forced = true; // Shouldn't skip holes
5362
5363if (KEY in []) Array(1)[KEY](function () {
5364  forced = false;
5365});
5366$export($export.P + $export.F * forced, 'Array', {
5367  find: function find(callbackfn
5368  /* , that = undefined */
5369  ) {
5370    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
5371  }
5372});
5373
5374__webpack_require__(/*! ./_add-to-unscopables */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js")(KEY);
5375
5376/***/ }),
5377
vendor: 1,172 bytes, lines 5378-5404
5378/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.for-each.js":
5379/*!*****************************************************************************************!*\
5380  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.for-each.js ***!
5381  \*****************************************************************************************/
5382/*! no static exports found */
5383/***/ (function(module, exports, __webpack_require__) {
5384
5385"use strict";
5386
5387
5388var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5389
5390var $forEach = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js")(0);
5391
5392var STRICT = __webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")([].forEach, true);
5393
5394$export($export.P + $export.F * !STRICT, 'Array', {
5395  // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])
5396  forEach: function forEach(callbackfn
5397  /* , thisArg */
5398  ) {
5399    return $forEach(this, callbackfn, arguments[1]);
5400  }
5401});
5402
5403/***/ }),
5404
vendor: 2,963 bytes, lines 5405-5466
5405/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.from.js":
5406/*!*************************************************************************************!*\
5407  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.from.js ***!
5408  \*************************************************************************************/
5409/*! no static exports found */
5410/***/ (function(module, exports, __webpack_require__) {
5411
5412"use strict";
5413
5414
5415var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js");
5416
5417var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5418
5419var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js");
5420
5421var call = __webpack_require__(/*! ./_iter-call */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-call.js");
5422
5423var isArrayIter = __webpack_require__(/*! ./_is-array-iter */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array-iter.js");
5424
5425var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
5426
5427var createProperty = __webpack_require__(/*! ./_create-property */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_create-property.js");
5428
5429var getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/core.get-iterator-method.js");
5430
5431$export($export.S + $export.F * !__webpack_require__(/*! ./_iter-detect */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-detect.js")(function (iter) {
5432  Array.from(iter);
5433}), 'Array', {
5434  // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
5435  from: function from(arrayLike
5436  /* , mapfn = undefined, thisArg = undefined */
5437  ) {
5438    var O = toObject(arrayLike);
5439    var C = typeof this == 'function' ? this : Array;
5440    var aLen = arguments.length;
5441    var mapfn = aLen > 1 ? arguments[1] : undefined;
5442    var mapping = mapfn !== undefined;
5443    var index = 0;
5444    var iterFn = getIterFn(O);
5445    var length, result, step, iterator;
5446    if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2); // if object isn't iterable or it's array with default iterator - use simple case
5447
5448    if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {
5449      for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {
5450        createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);
5451      }
5452    } else {
5453      length = toLength(O.length);
5454
5455      for (result = new C(length); length > index; index++) {
5456        createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);
5457      }
5458    }
5459
5460    result.length = index;
5461    return result;
5462  }
5463});
5464
5465/***/ }),
5466
vendor: 1,348 bytes, lines 5467-5494
5467/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.index-of.js":
5468/*!*****************************************************************************************!*\
5469  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.index-of.js ***!
5470  \*****************************************************************************************/
5471/*! no static exports found */
5472/***/ (function(module, exports, __webpack_require__) {
5473
5474"use strict";
5475
5476
5477var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5478
5479var $indexOf = __webpack_require__(/*! ./_array-includes */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-includes.js")(false);
5480
5481var $native = [].indexOf;
5482var NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0;
5483$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")($native)), 'Array', {
5484  // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])
5485  indexOf: function indexOf(searchElement
5486  /* , fromIndex = 0 */
5487  ) {
5488    return NEGATIVE_ZERO // convert -0 to +0
5489    ? $native.apply(this, arguments) || 0 : $indexOf(this, searchElement, arguments[1]);
5490  }
5491});
5492
5493/***/ }),
5494
vendor: 804 bytes, lines 5495-5510
5495/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.is-array.js":
5496/*!*****************************************************************************************!*\
5497  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.is-array.js ***!
5498  \*****************************************************************************************/
5499/*! no static exports found */
5500/***/ (function(module, exports, __webpack_require__) {
5501
5502// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)
5503var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5504
5505$export($export.S, 'Array', {
5506  isArray: __webpack_require__(/*! ./_is-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array.js")
5507});
5508
5509/***/ }),
5510
vendor: 2,046 bytes, lines 5511-5561
5511/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.iterator.js":
5512/*!*****************************************************************************************!*\
5513  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.iterator.js ***!
5514  \*****************************************************************************************/
5515/*! no static exports found */
5516/***/ (function(module, exports, __webpack_require__) {
5517
5518"use strict";
5519
5520
5521var addToUnscopables = __webpack_require__(/*! ./_add-to-unscopables */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js");
5522
5523var step = __webpack_require__(/*! ./_iter-step */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-step.js");
5524
5525var Iterators = __webpack_require__(/*! ./_iterators */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js");
5526
5527var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js"); // 22.1.3.4 Array.prototype.entries()
5528// 22.1.3.13 Array.prototype.keys()
5529// 22.1.3.29 Array.prototype.values()
5530// 22.1.3.30 Array.prototype[@@iterator]()
5531
5532
5533module.exports = __webpack_require__(/*! ./_iter-define */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-define.js")(Array, 'Array', function (iterated, kind) {
5534  this._t = toIObject(iterated); // target
5535
5536  this._i = 0; // next index
5537
5538  this._k = kind; // kind
5539  // 22.1.5.2.1 %ArrayIteratorPrototype%.next()
5540}, function () {
5541  var O = this._t;
5542  var kind = this._k;
5543  var index = this._i++;
5544
5545  if (!O || index >= O.length) {
5546    this._t = undefined;
5547    return step(1);
5548  }
5549
5550  if (kind == 'keys') return step(0, index);
5551  if (kind == 'values') return step(0, O[index]);
5552  return step(0, [index, O[index]]);
5553}, 'values'); // argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
5554
5555Iterators.Arguments = Iterators.Array;
5556addToUnscopables('keys');
5557addToUnscopables('values');
5558addToUnscopables('entries');
5559
5560/***/ }),
5561
vendor: 1,288 bytes, lines 5562-5585
5562/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.join.js":
5563/*!*************************************************************************************!*\
5564  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.join.js ***!
5565  \*************************************************************************************/
5566/*! no static exports found */
5567/***/ (function(module, exports, __webpack_require__) {
5568
5569"use strict";
5570 // 22.1.3.13 Array.prototype.join(separator)
5571
5572var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5573
5574var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js");
5575
5576var arrayJoin = [].join; // fallback for not array-like strings
5577
5578$export($export.P + $export.F * (__webpack_require__(/*! ./_iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iobject.js") != Object || !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")(arrayJoin)), 'Array', {
5579  join: function join(separator) {
5580    return arrayJoin.call(toIObject(this), separator === undefined ? ',' : separator);
5581  }
5582});
5583
5584/***/ }),
5585
vendor: 1,954 bytes, lines 5586-5628
5586/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.last-index-of.js":
5587/*!**********************************************************************************************!*\
5588  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.last-index-of.js ***!
5589  \**********************************************************************************************/
5590/*! no static exports found */
5591/***/ (function(module, exports, __webpack_require__) {
5592
5593"use strict";
5594
5595
5596var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5597
5598var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js");
5599
5600var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js");
5601
5602var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
5603
5604var $native = [].lastIndexOf;
5605var NEGATIVE_ZERO = !!$native && 1 / [1].lastIndexOf(1, -0) < 0;
5606$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")($native)), 'Array', {
5607  // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex])
5608  lastIndexOf: function lastIndexOf(searchElement
5609  /* , fromIndex = @[*-1] */
5610  ) {
5611    // convert -0 to +0
5612    if (NEGATIVE_ZERO) return $native.apply(this, arguments) || 0;
5613    var O = toIObject(this);
5614    var length = toLength(O.length);
5615    var index = length - 1;
5616    if (arguments.length > 1) index = Math.min(index, toInteger(arguments[1]));
5617    if (index < 0) index = length + index;
5618
5619    for (; index >= 0; index--) {
5620      if (index in O) if (O[index] === searchElement) return index || 0;
5621    }
5622
5623    return -1;
5624  }
5625});
5626
5627/***/ }),
5628
vendor: 1,106 bytes, lines 5629-5653
5629/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.map.js":
5630/*!************************************************************************************!*\
5631  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.map.js ***!
5632  \************************************************************************************/
5633/*! no static exports found */
5634/***/ (function(module, exports, __webpack_require__) {
5635
5636"use strict";
5637
5638
5639var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5640
5641var $map = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js")(1);
5642
5643$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")([].map, true), 'Array', {
5644  // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])
5645  map: function map(callbackfn
5646  /* , thisArg */
5647  ) {
5648    return $map(this, callbackfn, arguments[1]);
5649  }
5650});
5651
5652/***/ }),
5653
vendor: 1,373 bytes, lines 5654-5694
5654/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.of.js":
5655/*!***********************************************************************************!*\
5656  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.of.js ***!
5657  \***********************************************************************************/
5658/*! no static exports found */
5659/***/ (function(module, exports, __webpack_require__) {
5660
5661"use strict";
5662
5663
5664var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5665
5666var createProperty = __webpack_require__(/*! ./_create-property */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_create-property.js"); // WebKit Array.of isn't generic
5667
5668
5669$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () {
5670  function F() {
5671    /* empty */
5672  }
5673
5674  return !(Array.of.call(F) instanceof F);
5675}), 'Array', {
5676  // 22.1.2.3 Array.of( ...items)
5677  of: function of()
5678  /* ...args */
5679  {
5680    var index = 0;
5681    var aLen = arguments.length;
5682    var result = new (typeof this == 'function' ? this : Array)(aLen);
5683
5684    while (aLen > index) {
5685      createProperty(result, index, arguments[index++]);
5686    }
5687
5688    result.length = aLen;
5689    return result;
5690  }
5691});
5692
5693/***/ }),
5694
vendor: 1,209 bytes, lines 5695-5719
5695/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce-right.js":
5696/*!*********************************************************************************************!*\
5697  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce-right.js ***!
5698  \*********************************************************************************************/
5699/*! no static exports found */
5700/***/ (function(module, exports, __webpack_require__) {
5701
5702"use strict";
5703
5704
5705var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5706
5707var $reduce = __webpack_require__(/*! ./_array-reduce */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-reduce.js");
5708
5709$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")([].reduceRight, true), 'Array', {
5710  // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue])
5711  reduceRight: function reduceRight(callbackfn
5712  /* , initialValue */
5713  ) {
5714    return $reduce(this, callbackfn, arguments.length, arguments[1], true);
5715  }
5716});
5717
5718/***/ }),
5719
vendor: 1,166 bytes, lines 5720-5744
5720/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce.js":
5721/*!***************************************************************************************!*\
5722  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce.js ***!
5723  \***************************************************************************************/
5724/*! no static exports found */
5725/***/ (function(module, exports, __webpack_require__) {
5726
5727"use strict";
5728
5729
5730var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5731
5732var $reduce = __webpack_require__(/*! ./_array-reduce */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-reduce.js");
5733
5734$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")([].reduce, true), 'Array', {
5735  // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])
5736  reduce: function reduce(callbackfn
5737  /* , initialValue */
5738  ) {
5739    return $reduce(this, callbackfn, arguments.length, arguments[1], false);
5740  }
5741});
5742
5743/***/ }),
5744
vendor: 1,955 bytes, lines 5745-5790
5745/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.slice.js":
5746/*!**************************************************************************************!*\
5747  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.slice.js ***!
5748  \**************************************************************************************/
5749/*! no static exports found */
5750/***/ (function(module, exports, __webpack_require__) {
5751
5752"use strict";
5753
5754
5755var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5756
5757var html = __webpack_require__(/*! ./_html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_html.js");
5758
5759var cof = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js");
5760
5761var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js");
5762
5763var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
5764
5765var arraySlice = [].slice; // fallback for not array-like ES3 strings and DOM objects
5766
5767$export($export.P + $export.F * __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () {
5768  if (html) arraySlice.call(html);
5769}), 'Array', {
5770  slice: function slice(begin, end) {
5771    var len = toLength(this.length);
5772    var klass = cof(this);
5773    end = end === undefined ? len : end;
5774    if (klass == 'Array') return arraySlice.call(this, begin, end);
5775    var start = toAbsoluteIndex(begin, len);
5776    var upTo = toAbsoluteIndex(end, len);
5777    var size = toLength(upTo - start);
5778    var cloned = new Array(size);
5779    var i = 0;
5780
5781    for (; i < size; i++) {
5782      cloned[i] = klass == 'String' ? this.charAt(start + i) : this[start + i];
5783    }
5784
5785    return cloned;
5786  }
5787});
5788
5789/***/ }),
5790
vendor: 1,116 bytes, lines 5791-5815
5791/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.some.js":
5792/*!*************************************************************************************!*\
5793  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.some.js ***!
5794  \*************************************************************************************/
5795/*! no static exports found */
5796/***/ (function(module, exports, __webpack_require__) {
5797
5798"use strict";
5799
5800
5801var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5802
5803var $some = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js")(3);
5804
5805$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")([].some, true), 'Array', {
5806  // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg])
5807  some: function some(callbackfn
5808  /* , thisArg */
5809  ) {
5810    return $some(this, callbackfn, arguments[1]);
5811  }
5812});
5813
5814/***/ }),
5815
vendor: 1,556 bytes, lines 5816-5850
5816/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.sort.js":
5817/*!*************************************************************************************!*\
5818  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.sort.js ***!
5819  \*************************************************************************************/
5820/*! no static exports found */
5821/***/ (function(module, exports, __webpack_require__) {
5822
5823"use strict";
5824
5825
5826var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5827
5828var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js");
5829
5830var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js");
5831
5832var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js");
5833
5834var $sort = [].sort;
5835var test = [1, 2, 3];
5836$export($export.P + $export.F * (fails(function () {
5837  // IE8-
5838  test.sort(undefined);
5839}) || !fails(function () {
5840  // V8 bug
5841  test.sort(null); // Old WebKit
5842}) || !__webpack_require__(/*! ./_strict-method */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js")($sort)), 'Array', {
5843  // 22.1.3.25 Array.prototype.sort(comparefn)
5844  sort: function sort(comparefn) {
5845    return comparefn === undefined ? $sort.call(toObject(this)) : $sort.call(toObject(this), aFunction(comparefn));
5846  }
5847});
5848
5849/***/ }),
5850
vendor: 602 bytes, lines 5851-5861
5851/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.species.js":
5852/*!****************************************************************************************!*\
5853  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.species.js ***!
5854  \****************************************************************************************/
5855/*! no static exports found */
5856/***/ (function(module, exports, __webpack_require__) {
5857
5858__webpack_require__(/*! ./_set-species */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js")('Array');
5859
5860/***/ }),
5861
vendor: 706 bytes, lines 5862-5879
5862/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.now.js":
5863/*!***********************************************************************************!*\
5864  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.now.js ***!
5865  \***********************************************************************************/
5866/*! no static exports found */
5867/***/ (function(module, exports, __webpack_require__) {
5868
5869// 20.3.3.1 / 15.9.4.4 Date.now()
5870var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5871
5872$export($export.S, 'Date', {
5873  now: function now() {
5874    return new Date().getTime();
5875  }
5876});
5877
5878/***/ }),
5879
vendor: 1,002 bytes, lines 5880-5898
5880/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-iso-string.js":
5881/*!*********************************************************************************************!*\
5882  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-iso-string.js ***!
5883  \*********************************************************************************************/
5884/*! no static exports found */
5885/***/ (function(module, exports, __webpack_require__) {
5886
5887// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()
5888var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5889
5890var toISOString = __webpack_require__(/*! ./_date-to-iso-string */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-iso-string.js"); // PhantomJS / old WebKit has a broken implementations
5891
5892
5893$export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'Date', {
5894  toISOString: toISOString
5895});
5896
5897/***/ }),
5898
vendor: 1,424 bytes, lines 5899-5931
5899/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-json.js":
5900/*!***************************************************************************************!*\
5901  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-json.js ***!
5902  \***************************************************************************************/
5903/*! no static exports found */
5904/***/ (function(module, exports, __webpack_require__) {
5905
5906"use strict";
5907
5908
5909var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5910
5911var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js");
5912
5913var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js");
5914
5915$export($export.P + $export.F * __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () {
5916  return new Date(NaN).toJSON() !== null || Date.prototype.toJSON.call({
5917    toISOString: function toISOString() {
5918      return 1;
5919    }
5920  }) !== 1;
5921}), 'Date', {
5922  // eslint-disable-next-line no-unused-vars
5923  toJSON: function toJSON(key) {
5924    var O = toObject(this);
5925    var pv = toPrimitive(O);
5926    return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString();
5927  }
5928});
5929
5930/***/ }),
5931
vendor: 949 bytes, lines 5932-5945
5932/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-primitive.js":
5933/*!********************************************************************************************!*\
5934  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-primitive.js ***!
5935  \********************************************************************************************/
5936/*! no static exports found */
5937/***/ (function(module, exports, __webpack_require__) {
5938
5939var TO_PRIMITIVE = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('toPrimitive');
5940
5941var proto = Date.prototype;
5942if (!(TO_PRIMITIVE in proto)) __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js")(proto, TO_PRIMITIVE, __webpack_require__(/*! ./_date-to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-primitive.js"));
5943
5944/***/ }),
5945
vendor: 1,000 bytes, lines 5946-5968
5946/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-string.js":
5947/*!*****************************************************************************************!*\
5948  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-string.js ***!
5949  \*****************************************************************************************/
5950/*! no static exports found */
5951/***/ (function(module, exports, __webpack_require__) {
5952
5953var DateProto = Date.prototype;
5954var INVALID_DATE = 'Invalid Date';
5955var TO_STRING = 'toString';
5956var $toString = DateProto[TO_STRING];
5957var getTime = DateProto.getTime;
5958
5959if (new Date(NaN) + '' != INVALID_DATE) {
5960  __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js")(DateProto, TO_STRING, function toString() {
5961    var value = getTime.call(this); // eslint-disable-next-line no-self-compare
5962
5963    return value === value ? $toString.call(this) : INVALID_DATE;
5964  });
5965}
5966
5967/***/ }),
5968
vendor: 815 bytes, lines 5969-5984
5969/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.bind.js":
5970/*!****************************************************************************************!*\
5971  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.bind.js ***!
5972  \****************************************************************************************/
5973/*! no static exports found */
5974/***/ (function(module, exports, __webpack_require__) {
5975
5976// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)
5977var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
5978
5979$export($export.P, 'Function', {
5980  bind: __webpack_require__(/*! ./_bind */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_bind.js")
5981});
5982
5983/***/ }),
5984
vendor: 1,571 bytes, lines 5985-6017
5985/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.has-instance.js":
5986/*!************************************************************************************************!*\
5987  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.has-instance.js ***!
5988  \************************************************************************************************/
5989/*! no static exports found */
5990/***/ (function(module, exports, __webpack_require__) {
5991
5992"use strict";
5993
5994
5995var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
5996
5997var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js");
5998
5999var HAS_INSTANCE = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('hasInstance');
6000
6001var FunctionProto = Function.prototype; // 19.2.3.6 Function.prototype[@@hasInstance](V)
6002
6003if (!(HAS_INSTANCE in FunctionProto)) __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f(FunctionProto, HAS_INSTANCE, {
6004  value: function value(O) {
6005    if (typeof this != 'function' || !isObject(O)) return false;
6006    if (!isObject(this.prototype)) return O instanceof this; // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:
6007
6008    while (O = getPrototypeOf(O)) {
6009      if (this.prototype === O) return true;
6010    }
6011
6012    return false;
6013  }
6014});
6015
6016/***/ }),
6017
vendor: 1,018 bytes, lines 6018-6043
6018/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.name.js":
6019/*!****************************************************************************************!*\
6020  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.name.js ***!
6021  \****************************************************************************************/
6022/*! no static exports found */
6023/***/ (function(module, exports, __webpack_require__) {
6024
6025var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f;
6026
6027var FProto = Function.prototype;
6028var nameRE = /^\s*function ([^ (]*)/;
6029var NAME = 'name'; // 19.2.4.2 name
6030
6031NAME in FProto || __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") && dP(FProto, NAME, {
6032  configurable: true,
6033  get: function get() {
6034    try {
6035      return ('' + this).match(nameRE)[1];
6036    } catch (e) {
6037      return '';
6038    }
6039  }
6040});
6041
6042/***/ }),
6043
vendor: 1,381 bytes, lines 6044-6077
6044/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.map.js":
6045/*!******************************************************************************!*\
6046  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.map.js ***!
6047  \******************************************************************************/
6048/*! no static exports found */
6049/***/ (function(module, exports, __webpack_require__) {
6050
6051"use strict";
6052
6053
6054var strong = __webpack_require__(/*! ./_collection-strong */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-strong.js");
6055
6056var validate = __webpack_require__(/*! ./_validate-collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js");
6057
6058var MAP = 'Map'; // 23.1 Map Objects
6059
6060module.exports = __webpack_require__(/*! ./_collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection.js")(MAP, function (get) {
6061  return function Map() {
6062    return get(this, arguments.length > 0 ? arguments[0] : undefined);
6063  };
6064}, {
6065  // 23.1.3.6 Map.prototype.get(key)
6066  get: function get(key) {
6067    var entry = strong.getEntry(validate(this, MAP), key);
6068    return entry && entry.v;
6069  },
6070  // 23.1.3.9 Map.prototype.set(key, value)
6071  set: function set(key, value) {
6072    return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);
6073  }
6074}, strong, true);
6075
6076/***/ }),
6077
vendor: 1,194 bytes, lines 6078-6101
6078/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.acosh.js":
6079/*!*************************************************************************************!*\
6080  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.acosh.js ***!
6081  \*************************************************************************************/
6082/*! no static exports found */
6083/***/ (function(module, exports, __webpack_require__) {
6084
6085// 20.2.2.3 Math.acosh(x)
6086var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6087
6088var log1p = __webpack_require__(/*! ./_math-log1p */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-log1p.js");
6089
6090var sqrt = Math.sqrt;
6091var $acosh = Math.acosh;
6092$export($export.S + $export.F * !($acosh // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509
6093&& Math.floor($acosh(Number.MAX_VALUE)) == 710 // Tor Browser bug: Math.acosh(Infinity) -> NaN
6094&& $acosh(Infinity) == Infinity), 'Math', {
6095  acosh: function acosh(x) {
6096    return (x = +x) < 1 ? NaN : x > 94906265.62425156 ? Math.log(x) + Math.LN2 : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));
6097  }
6098});
6099
6100/***/ }),
6101
vendor: 895 bytes, lines 6102-6124
6102/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.asinh.js":
6103/*!*************************************************************************************!*\
6104  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.asinh.js ***!
6105  \*************************************************************************************/
6106/*! no static exports found */
6107/***/ (function(module, exports, __webpack_require__) {
6108
6109// 20.2.2.5 Math.asinh(x)
6110var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6111
6112var $asinh = Math.asinh;
6113
6114function asinh(x) {
6115  return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));
6116} // Tor Browser bug: Math.asinh(0) -> -0
6117
6118
6119$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', {
6120  asinh: asinh
6121});
6122
6123/***/ }),
6124
vendor: 854 bytes, lines 6125-6144
6125/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.atanh.js":
6126/*!*************************************************************************************!*\
6127  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.atanh.js ***!
6128  \*************************************************************************************/
6129/*! no static exports found */
6130/***/ (function(module, exports, __webpack_require__) {
6131
6132// 20.2.2.7 Math.atanh(x)
6133var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6134
6135var $atanh = Math.atanh; // Tor Browser bug: Math.atanh(-0) -> 0
6136
6137$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {
6138  atanh: function atanh(x) {
6139    return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;
6140  }
6141});
6142
6143/***/ }),
6144
vendor: 857 bytes, lines 6145-6164
6145/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cbrt.js":
6146/*!************************************************************************************!*\
6147  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cbrt.js ***!
6148  \************************************************************************************/
6149/*! no static exports found */
6150/***/ (function(module, exports, __webpack_require__) {
6151
6152// 20.2.2.9 Math.cbrt(x)
6153var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6154
6155var sign = __webpack_require__(/*! ./_math-sign */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-sign.js");
6156
6157$export($export.S, 'Math', {
6158  cbrt: function cbrt(x) {
6159    return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);
6160  }
6161});
6162
6163/***/ }),
6164
vendor: 757 bytes, lines 6165-6182
6165/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.clz32.js":
6166/*!*************************************************************************************!*\
6167  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.clz32.js ***!
6168  \*************************************************************************************/
6169/*! no static exports found */
6170/***/ (function(module, exports, __webpack_require__) {
6171
6172// 20.2.2.11 Math.clz32(x)
6173var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6174
6175$export($export.S, 'Math', {
6176  clz32: function clz32(x) {
6177    return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;
6178  }
6179});
6180
6181/***/ }),
6182
vendor: 732 bytes, lines 6183-6201
6183/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cosh.js":
6184/*!************************************************************************************!*\
6185  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cosh.js ***!
6186  \************************************************************************************/
6187/*! no static exports found */
6188/***/ (function(module, exports, __webpack_require__) {
6189
6190// 20.2.2.12 Math.cosh(x)
6191var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6192
6193var exp = Math.exp;
6194$export($export.S, 'Math', {
6195  cosh: function cosh(x) {
6196    return (exp(x = +x) + exp(-x)) / 2;
6197  }
6198});
6199
6200/***/ }),
6201
vendor: 833 bytes, lines 6202-6219
6202/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.expm1.js":
6203/*!*************************************************************************************!*\
6204  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.expm1.js ***!
6205  \*************************************************************************************/
6206/*! no static exports found */
6207/***/ (function(module, exports, __webpack_require__) {
6208
6209// 20.2.2.14 Math.expm1(x)
6210var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6211
6212var $expm1 = __webpack_require__(/*! ./_math-expm1 */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-expm1.js");
6213
6214$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', {
6215  expm1: $expm1
6216});
6217
6218/***/ }),
6219
vendor: 782 bytes, lines 6220-6235
6220/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.fround.js":
6221/*!**************************************************************************************!*\
6222  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.fround.js ***!
6223  \**************************************************************************************/
6224/*! no static exports found */
6225/***/ (function(module, exports, __webpack_require__) {
6226
6227// 20.2.2.16 Math.fround(x)
6228var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6229
6230$export($export.S, 'Math', {
6231  fround: __webpack_require__(/*! ./_math-fround */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-fround.js")
6232});
6233
6234/***/ }),
6235
vendor: 1,220 bytes, lines 6236-6274
6236/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.hypot.js":
6237/*!*************************************************************************************!*\
6238  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.hypot.js ***!
6239  \*************************************************************************************/
6240/*! no static exports found */
6241/***/ (function(module, exports, __webpack_require__) {
6242
6243// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])
6244var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6245
6246var abs = Math.abs;
6247$export($export.S, 'Math', {
6248  hypot: function hypot(value1, value2) {
6249    // eslint-disable-line no-unused-vars
6250    var sum = 0;
6251    var i = 0;
6252    var aLen = arguments.length;
6253    var larg = 0;
6254    var arg, div;
6255
6256    while (i < aLen) {
6257      arg = abs(arguments[i++]);
6258
6259      if (larg < arg) {
6260        div = larg / arg;
6261        sum = sum * div * div + 1;
6262        larg = arg;
6263      } else if (arg > 0) {
6264        div = arg / larg;
6265        sum += div * div;
6266      } else sum += arg;
6267    }
6268
6269    return larg === Infinity ? Infinity : larg * Math.sqrt(sum);
6270  }
6271});
6272
6273/***/ }),
6274
vendor: 1,174 bytes, lines 6275-6301
6275/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.imul.js":
6276/*!************************************************************************************!*\
6277  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.imul.js ***!
6278  \************************************************************************************/
6279/*! no static exports found */
6280/***/ (function(module, exports, __webpack_require__) {
6281
6282// 20.2.2.18 Math.imul(x, y)
6283var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6284
6285var $imul = Math.imul; // some WebKit versions fails with big numbers, some has wrong arity
6286
6287$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () {
6288  return $imul(0xffffffff, 5) != -5 || $imul.length != 2;
6289}), 'Math', {
6290  imul: function imul(x, y) {
6291    var UINT16 = 0xffff;
6292    var xn = +x;
6293    var yn = +y;
6294    var xl = UINT16 & xn;
6295    var yl = UINT16 & yn;
6296    return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);
6297  }
6298});
6299
6300/***/ }),
6301
vendor: 717 bytes, lines 6302-6319
6302/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log10.js":
6303/*!*************************************************************************************!*\
6304  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log10.js ***!
6305  \*************************************************************************************/
6306/*! no static exports found */
6307/***/ (function(module, exports, __webpack_require__) {
6308
6309// 20.2.2.21 Math.log10(x)
6310var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6311
6312$export($export.S, 'Math', {
6313  log10: function log10(x) {
6314    return Math.log(x) * Math.LOG10E;
6315  }
6316});
6317
6318/***/ }),
6319
vendor: 774 bytes, lines 6320-6335
6320/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log1p.js":
6321/*!*************************************************************************************!*\
6322  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log1p.js ***!
6323  \*************************************************************************************/
6324/*! no static exports found */
6325/***/ (function(module, exports, __webpack_require__) {
6326
6327// 20.2.2.20 Math.log1p(x)
6328var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6329
6330$export($export.S, 'Math', {
6331  log1p: __webpack_require__(/*! ./_math-log1p */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-log1p.js")
6332});
6333
6334/***/ }),
6335
vendor: 707 bytes, lines 6336-6353
6336/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log2.js":
6337/*!************************************************************************************!*\
6338  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log2.js ***!
6339  \************************************************************************************/
6340/*! no static exports found */
6341/***/ (function(module, exports, __webpack_require__) {
6342
6343// 20.2.2.22 Math.log2(x)
6344var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6345
6346$export($export.S, 'Math', {
6347  log2: function log2(x) {
6348    return Math.log(x) / Math.LN2;
6349  }
6350});
6351
6352/***/ }),
6353
vendor: 766 bytes, lines 6354-6369
6354/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sign.js":
6355/*!************************************************************************************!*\
6356  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sign.js ***!
6357  \************************************************************************************/
6358/*! no static exports found */
6359/***/ (function(module, exports, __webpack_require__) {
6360
6361// 20.2.2.28 Math.sign(x)
6362var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6363
6364$export($export.S, 'Math', {
6365  sign: __webpack_require__(/*! ./_math-sign */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-sign.js")
6366});
6367
6368/***/ }),
6369
vendor: 1,172 bytes, lines 6370-6393
6370/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sinh.js":
6371/*!************************************************************************************!*\
6372  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sinh.js ***!
6373  \************************************************************************************/
6374/*! no static exports found */
6375/***/ (function(module, exports, __webpack_require__) {
6376
6377// 20.2.2.30 Math.sinh(x)
6378var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6379
6380var expm1 = __webpack_require__(/*! ./_math-expm1 */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-expm1.js");
6381
6382var exp = Math.exp; // V8 near Chromium 38 has a problem with very small numbers
6383
6384$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () {
6385  return !Math.sinh(-2e-17) != -2e-17;
6386}), 'Math', {
6387  sinh: function sinh(x) {
6388    return Math.abs(x = +x) < 1 ? (expm1(x) - expm1(-x)) / 2 : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);
6389  }
6390});
6391
6392/***/ }),
6393
vendor: 957 bytes, lines 6394-6416
6394/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.tanh.js":
6395/*!************************************************************************************!*\
6396  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.tanh.js ***!
6397  \************************************************************************************/
6398/*! no static exports found */
6399/***/ (function(module, exports, __webpack_require__) {
6400
6401// 20.2.2.33 Math.tanh(x)
6402var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6403
6404var expm1 = __webpack_require__(/*! ./_math-expm1 */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-expm1.js");
6405
6406var exp = Math.exp;
6407$export($export.S, 'Math', {
6408  tanh: function tanh(x) {
6409    var a = expm1(x = +x);
6410    var b = expm1(-x);
6411    return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));
6412  }
6413});
6414
6415/***/ }),
6416
vendor: 730 bytes, lines 6417-6434
6417/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.trunc.js":
6418/*!*************************************************************************************!*\
6419  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.trunc.js ***!
6420  \*************************************************************************************/
6421/*! no static exports found */
6422/***/ (function(module, exports, __webpack_require__) {
6423
6424// 20.2.2.34 Math.trunc(x)
6425var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6426
6427$export($export.S, 'Math', {
6428  trunc: function trunc(it) {
6429    return (it > 0 ? Math.floor : Math.ceil)(it);
6430  }
6431});
6432
6433/***/ }),
6434
vendor: 4,607 bytes, lines 6435-6543
6435/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.constructor.js":
6436/*!*********************************************************************************************!*\
6437  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.constructor.js ***!
6438  \*********************************************************************************************/
6439/*! no static exports found */
6440/***/ (function(module, exports, __webpack_require__) {
6441
6442"use strict";
6443
6444
6445var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
6446
6447var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js");
6448
6449var cof = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js");
6450
6451var inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_inherit-if-required.js");
6452
6453var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js");
6454
6455var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js");
6456
6457var gOPN = __webpack_require__(/*! ./_object-gopn */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js").f;
6458
6459var gOPD = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js").f;
6460
6461var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f;
6462
6463var $trim = __webpack_require__(/*! ./_string-trim */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js").trim;
6464
6465var NUMBER = 'Number';
6466var $Number = global[NUMBER];
6467var Base = $Number;
6468var proto = $Number.prototype; // Opera ~12 has broken Object#toString
6469
6470var BROKEN_COF = cof(__webpack_require__(/*! ./_object-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js")(proto)) == NUMBER;
6471var TRIM = 'trim' in String.prototype; // 7.1.3 ToNumber(argument)
6472
6473var toNumber = function toNumber(argument) {
6474  var it = toPrimitive(argument, false);
6475
6476  if (typeof it == 'string' && it.length > 2) {
6477    it = TRIM ? it.trim() : $trim(it, 3);
6478    var first = it.charCodeAt(0);
6479    var third, radix, maxCode;
6480
6481    if (first === 43 || first === 45) {
6482      third = it.charCodeAt(2);
6483      if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix
6484    } else if (first === 48) {
6485      switch (it.charCodeAt(1)) {
6486        case 66:
6487        case 98:
6488          radix = 2;
6489          maxCode = 49;
6490          break;
6491        // fast equal /^0b[01]+$/i
6492
6493        case 79:
6494        case 111:
6495          radix = 8;
6496          maxCode = 55;
6497          break;
6498        // fast equal /^0o[0-7]+$/i
6499
6500        default:
6501          return +it;
6502      }
6503
6504      for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {
6505        code = digits.charCodeAt(i); // parseInt parses a string to a first unavailable symbol
6506        // but ToNumber should return NaN if a string contains unavailable symbols
6507
6508        if (code < 48 || code > maxCode) return NaN;
6509      }
6510
6511      return parseInt(digits, radix);
6512    }
6513  }
6514
6515  return +it;
6516};
6517
6518if (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {
6519  $Number = function Number(value) {
6520    var it = arguments.length < 1 ? 0 : value;
6521    var that = this;
6522    return that instanceof $Number // check on 1..constructor(foo) case
6523    && (BROKEN_COF ? fails(function () {
6524      proto.valueOf.call(that);
6525    }) : cof(that) != NUMBER) ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);
6526  };
6527
6528  for (var keys = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") ? gOPN(Base) : ( // ES3:
6529  'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' + // ES6 (in case, if modules with ES6 Number statics required before):
6530  'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' + 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger').split(','), j = 0, key; keys.length > j; j++) {
6531    if (has(Base, key = keys[j]) && !has($Number, key)) {
6532      dP($Number, key, gOPD(Base, key));
6533    }
6534  }
6535
6536  $Number.prototype = proto;
6537  proto.constructor = $Number;
6538
6539  __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js")(global, NUMBER, $Number);
6540}
6541
6542/***/ }),
6543
vendor: 692 bytes, lines 6544-6559
6544/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.epsilon.js":
6545/*!*****************************************************************************************!*\
6546  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.epsilon.js ***!
6547  \*****************************************************************************************/
6548/*! no static exports found */
6549/***/ (function(module, exports, __webpack_require__) {
6550
6551// 20.1.2.1 Number.EPSILON
6552var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6553
6554$export($export.S, 'Number', {
6555  EPSILON: Math.pow(2, -52)
6556});
6557
6558/***/ }),
6559
vendor: 910 bytes, lines 6560-6579
6560/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-finite.js":
6561/*!*******************************************************************************************!*\
6562  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-finite.js ***!
6563  \*******************************************************************************************/
6564/*! no static exports found */
6565/***/ (function(module, exports, __webpack_require__) {
6566
6567// 20.1.2.2 Number.isFinite(number)
6568var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6569
6570var _isFinite = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").isFinite;
6571
6572$export($export.S, 'Number', {
6573  isFinite: function isFinite(it) {
6574    return typeof it == 'number' && _isFinite(it);
6575  }
6576});
6577
6578/***/ }),
6579
vendor: 818 bytes, lines 6580-6595
6580/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-integer.js":
6581/*!********************************************************************************************!*\
6582  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-integer.js ***!
6583  \********************************************************************************************/
6584/*! no static exports found */
6585/***/ (function(module, exports, __webpack_require__) {
6586
6587// 20.1.2.3 Number.isInteger(number)
6588var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6589
6590$export($export.S, 'Number', {
6591  isInteger: __webpack_require__(/*! ./_is-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-integer.js")
6592});
6593
6594/***/ }),
6595
vendor: 781 bytes, lines 6596-6614
6596/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-nan.js":
6597/*!****************************************************************************************!*\
6598  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-nan.js ***!
6599  \****************************************************************************************/
6600/*! no static exports found */
6601/***/ (function(module, exports, __webpack_require__) {
6602
6603// 20.1.2.4 Number.isNaN(number)
6604var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6605
6606$export($export.S, 'Number', {
6607  isNaN: function isNaN(number) {
6608    // eslint-disable-next-line no-self-compare
6609    return number != number;
6610  }
6611});
6612
6613/***/ }),
6614
vendor: 986 bytes, lines 6615-6635
6615/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-safe-integer.js":
6616/*!*************************************************************************************************!*\
6617  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-safe-integer.js ***!
6618  \*************************************************************************************************/
6619/*! no static exports found */
6620/***/ (function(module, exports, __webpack_require__) {
6621
6622// 20.1.2.5 Number.isSafeInteger(number)
6623var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6624
6625var isInteger = __webpack_require__(/*! ./_is-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-integer.js");
6626
6627var abs = Math.abs;
6628$export($export.S, 'Number', {
6629  isSafeInteger: function isSafeInteger(number) {
6630    return isInteger(number) && abs(number) <= 0x1fffffffffffff;
6631  }
6632});
6633
6634/***/ }),
6635
vendor: 746 bytes, lines 6636-6651
6636/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.max-safe-integer.js":
6637/*!**************************************************************************************************!*\
6638  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.max-safe-integer.js ***!
6639  \**************************************************************************************************/
6640/*! no static exports found */
6641/***/ (function(module, exports, __webpack_require__) {
6642
6643// 20.1.2.6 Number.MAX_SAFE_INTEGER
6644var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6645
6646$export($export.S, 'Number', {
6647  MAX_SAFE_INTEGER: 0x1fffffffffffff
6648});
6649
6650/***/ }),
6651
vendor: 748 bytes, lines 6652-6667
6652/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.min-safe-integer.js":
6653/*!**************************************************************************************************!*\
6654  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.min-safe-integer.js ***!
6655  \**************************************************************************************************/
6656/*! no static exports found */
6657/***/ (function(module, exports, __webpack_require__) {
6658
6659// 20.1.2.10 Number.MIN_SAFE_INTEGER
6660var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6661
6662$export($export.S, 'Number', {
6663  MIN_SAFE_INTEGER: -0x1fffffffffffff
6664});
6665
6666/***/ }),
6667
vendor: 909 bytes, lines 6668-6685
6668/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-float.js":
6669/*!*********************************************************************************************!*\
6670  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-float.js ***!
6671  \*********************************************************************************************/
6672/*! no static exports found */
6673/***/ (function(module, exports, __webpack_require__) {
6674
6675var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6676
6677var $parseFloat = __webpack_require__(/*! ./_parse-float */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_parse-float.js"); // 20.1.2.12 Number.parseFloat(string)
6678
6679
6680$export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', {
6681  parseFloat: $parseFloat
6682});
6683
6684/***/ }),
6685
vendor: 892 bytes, lines 6686-6703
6686/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-int.js":
6687/*!*******************************************************************************************!*\
6688  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-int.js ***!
6689  \*******************************************************************************************/
6690/*! no static exports found */
6691/***/ (function(module, exports, __webpack_require__) {
6692
6693var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6694
6695var $parseInt = __webpack_require__(/*! ./_parse-int */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_parse-int.js"); // 20.1.2.13 Number.parseInt(string, radix)
6696
6697
6698$export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', {
6699  parseInt: $parseInt
6700});
6701
6702/***/ }),
6703
vendor: 3,767 bytes, lines 6704-6851
6704/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-fixed.js":
6705/*!******************************************************************************************!*\
6706  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-fixed.js ***!
6707  \******************************************************************************************/
6708/*! no static exports found */
6709/***/ (function(module, exports, __webpack_require__) {
6710
6711"use strict";
6712
6713
6714var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6715
6716var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js");
6717
6718var aNumberValue = __webpack_require__(/*! ./_a-number-value */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-number-value.js");
6719
6720var repeat = __webpack_require__(/*! ./_string-repeat */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-repeat.js");
6721
6722var $toFixed = 1.0.toFixed;
6723var floor = Math.floor;
6724var data = [0, 0, 0, 0, 0, 0];
6725var ERROR = 'Number.toFixed: incorrect invocation!';
6726var ZERO = '0';
6727
6728var multiply = function multiply(n, c) {
6729  var i = -1;
6730  var c2 = c;
6731
6732  while (++i < 6) {
6733    c2 += n * data[i];
6734    data[i] = c2 % 1e7;
6735    c2 = floor(c2 / 1e7);
6736  }
6737};
6738
6739var divide = function divide(n) {
6740  var i = 6;
6741  var c = 0;
6742
6743  while (--i >= 0) {
6744    c += data[i];
6745    data[i] = floor(c / n);
6746    c = c % n * 1e7;
6747  }
6748};
6749
6750var numToString = function numToString() {
6751  var i = 6;
6752  var s = '';
6753
6754  while (--i >= 0) {
6755    if (s !== '' || i === 0 || data[i] !== 0) {
6756      var t = String(data[i]);
6757      s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t;
6758    }
6759  }
6760
6761  return s;
6762};
6763
6764var pow = function pow(x, n, acc) {
6765  return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);
6766};
6767
6768var log = function log(x) {
6769  var n = 0;
6770  var x2 = x;
6771
6772  while (x2 >= 4096) {
6773    n += 12;
6774    x2 /= 4096;
6775  }
6776
6777  while (x2 >= 2) {
6778    n += 1;
6779    x2 /= 2;
6780  }
6781
6782  return n;
6783};
6784
6785$export($export.P + $export.F * (!!$toFixed && (0.00008.toFixed(3) !== '0.000' || 0.9.toFixed(0) !== '1' || 1.255.toFixed(2) !== '1.25' || 1000000000000000128.0.toFixed(0) !== '1000000000000000128') || !__webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () {
6786  // V8 ~ Android 4.3-
6787  $toFixed.call({});
6788})), 'Number', {
6789  toFixed: function toFixed(fractionDigits) {
6790    var x = aNumberValue(this, ERROR);
6791    var f = toInteger(fractionDigits);
6792    var s = '';
6793    var m = ZERO;
6794    var e, z, j, k;
6795    if (f < 0 || f > 20) throw RangeError(ERROR); // eslint-disable-next-line no-self-compare
6796
6797    if (x != x) return 'NaN';
6798    if (x <= -1e21 || x >= 1e21) return String(x);
6799
6800    if (x < 0) {
6801      s = '-';
6802      x = -x;
6803    }
6804
6805    if (x > 1e-21) {
6806      e = log(x * pow(2, 69, 1)) - 69;
6807      z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1);
6808      z *= 0x10000000000000;
6809      e = 52 - e;
6810
6811      if (e > 0) {
6812        multiply(0, z);
6813        j = f;
6814
6815        while (j >= 7) {
6816          multiply(1e7, 0);
6817          j -= 7;
6818        }
6819
6820        multiply(pow(10, j, 1), 0);
6821        j = e - 1;
6822
6823        while (j >= 23) {
6824          divide(1 << 23);
6825          j -= 23;
6826        }
6827
6828        divide(1 << j);
6829        multiply(1, 1);
6830        divide(2);
6831        m = numToString();
6832      } else {
6833        multiply(0, z);
6834        multiply(1 << -e, 0);
6835        m = numToString() + repeat.call(ZERO, f);
6836      }
6837    }
6838
6839    if (f > 0) {
6840      k = m.length;
6841      m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f));
6842    } else {
6843      m = s + m;
6844    }
6845
6846    return m;
6847  }
6848});
6849
6850/***/ }),
6851
vendor: 1,389 bytes, lines 6852-6883
6852/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-precision.js":
6853/*!**********************************************************************************************!*\
6854  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-precision.js ***!
6855  \**********************************************************************************************/
6856/*! no static exports found */
6857/***/ (function(module, exports, __webpack_require__) {
6858
6859"use strict";
6860
6861
6862var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6863
6864var $fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js");
6865
6866var aNumberValue = __webpack_require__(/*! ./_a-number-value */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-number-value.js");
6867
6868var $toPrecision = 1.0.toPrecision;
6869$export($export.P + $export.F * ($fails(function () {
6870  // IE7-
6871  return $toPrecision.call(1, undefined) !== '1';
6872}) || !$fails(function () {
6873  // V8 ~ Android 4.3-
6874  $toPrecision.call({});
6875})), 'Number', {
6876  toPrecision: function toPrecision(precision) {
6877    var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!');
6878    return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision);
6879  }
6880});
6881
6882/***/ }),
6883
vendor: 822 bytes, lines 6884-6899
6884/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.assign.js":
6885/*!****************************************************************************************!*\
6886  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.assign.js ***!
6887  \****************************************************************************************/
6888/*! no static exports found */
6889/***/ (function(module, exports, __webpack_require__) {
6890
6891// 19.1.3.1 Object.assign(target, source)
6892var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
6893
6894$export($export.S + $export.F, 'Object', {
6895  assign: __webpack_require__(/*! ./_object-assign */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-assign.js")
6896});
6897
6898/***/ }),
6899
vendor: 824 bytes, lines 6900-6915
6900/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.create.js":
6901/*!****************************************************************************************!*\
6902  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.create.js ***!
6903  \****************************************************************************************/
6904/*! no static exports found */
6905/***/ (function(module, exports, __webpack_require__) {
6906
6907var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
6908
6909
6910$export($export.S, 'Object', {
6911  create: __webpack_require__(/*! ./_object-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js")
6912});
6913
6914/***/ }),
6915
vendor: 1,015 bytes, lines 6916-6931
6916/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-properties.js":
6917/*!***************************************************************************************************!*\
6918  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-properties.js ***!
6919  \***************************************************************************************************/
6920/*! no static exports found */
6921/***/ (function(module, exports, __webpack_require__) {
6922
6923var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); // 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)
6924
6925
6926$export($export.S + $export.F * !__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js"), 'Object', {
6927  defineProperties: __webpack_require__(/*! ./_object-dps */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dps.js")
6928});
6929
6930/***/ }),
6931
vendor: 1,006 bytes, lines 6932-6947
6932/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-property.js":
6933/*!*************************************************************************************************!*\
6934  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-property.js ***!
6935  \*************************************************************************************************/
6936/*! no static exports found */
6937/***/ (function(module, exports, __webpack_require__) {
6938
6939var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js"); // 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)
6940
6941
6942$export($export.S + $export.F * !__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js"), 'Object', {
6943  defineProperty: __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f
6944});
6945
6946/***/ }),
6947
vendor: 1,014 bytes, lines 6948-6967
6948/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.freeze.js":
6949/*!****************************************************************************************!*\
6950  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.freeze.js ***!
6951  \****************************************************************************************/
6952/*! no static exports found */
6953/***/ (function(module, exports, __webpack_require__) {
6954
6955// 19.1.2.5 Object.freeze(O)
6956var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
6957
6958var meta = __webpack_require__(/*! ./_meta */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js").onFreeze;
6959
6960__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('freeze', function ($freeze) {
6961  return function freeze(it) {
6962    return $freeze && isObject(it) ? $freeze(meta(it)) : it;
6963  };
6964});
6965
6966/***/ }),
6967
vendor: 1,181 bytes, lines 6968-6987
6968/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-descriptor.js":
6969/*!*************************************************************************************************************!*\
6970  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-descriptor.js ***!
6971  \*************************************************************************************************************/
6972/*! no static exports found */
6973/***/ (function(module, exports, __webpack_require__) {
6974
6975// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
6976var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js");
6977
6978var $getOwnPropertyDescriptor = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js").f;
6979
6980__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('getOwnPropertyDescriptor', function () {
6981  return function getOwnPropertyDescriptor(it, key) {
6982    return $getOwnPropertyDescriptor(toIObject(it), key);
6983  };
6984});
6985
6986/***/ }),
6987
vendor: 878 bytes, lines 6988-7001
6988/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-names.js":
6989/*!********************************************************************************************************!*\
6990  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-names.js ***!
6991  \********************************************************************************************************/
6992/*! no static exports found */
6993/***/ (function(module, exports, __webpack_require__) {
6994
6995// 19.1.2.7 Object.getOwnPropertyNames(O)
6996__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('getOwnPropertyNames', function () {
6997  return __webpack_require__(/*! ./_object-gopn-ext */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn-ext.js").f;
6998});
6999
7000/***/ }),
7001
vendor: 1,066 bytes, lines 7002-7021
7002/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-prototype-of.js":
7003/*!**************************************************************************************************!*\
7004  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-prototype-of.js ***!
7005  \**************************************************************************************************/
7006/*! no static exports found */
7007/***/ (function(module, exports, __webpack_require__) {
7008
7009// 19.1.2.9 Object.getPrototypeOf(O)
7010var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js");
7011
7012var $getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js");
7013
7014__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('getPrototypeOf', function () {
7015  return function getPrototypeOf(it) {
7016    return $getPrototypeOf(toObject(it));
7017  };
7018});
7019
7020/***/ }),
7021
vendor: 953 bytes, lines 7022-7039
7022/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-extensible.js":
7023/*!***********************************************************************************************!*\
7024  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-extensible.js ***!
7025  \***********************************************************************************************/
7026/*! no static exports found */
7027/***/ (function(module, exports, __webpack_require__) {
7028
7029// 19.1.2.11 Object.isExtensible(O)
7030var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
7031
7032__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('isExtensible', function ($isExtensible) {
7033  return function isExtensible(it) {
7034    return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;
7035  };
7036});
7037
7038/***/ }),
7039
vendor: 913 bytes, lines 7040-7057
7040/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-frozen.js":
7041/*!*******************************************************************************************!*\
7042  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-frozen.js ***!
7043  \*******************************************************************************************/
7044/*! no static exports found */
7045/***/ (function(module, exports, __webpack_require__) {
7046
7047// 19.1.2.12 Object.isFrozen(O)
7048var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
7049
7050__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('isFrozen', function ($isFrozen) {
7051  return function isFrozen(it) {
7052    return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;
7053  };
7054});
7055
7056/***/ }),
7057
vendor: 913 bytes, lines 7058-7075
7058/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-sealed.js":
7059/*!*******************************************************************************************!*\
7060  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-sealed.js ***!
7061  \*******************************************************************************************/
7062/*! no static exports found */
7063/***/ (function(module, exports, __webpack_require__) {
7064
7065// 19.1.2.13 Object.isSealed(O)
7066var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
7067
7068__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('isSealed', function ($isSealed) {
7069  return function isSealed(it) {
7070    return isObject(it) ? $isSealed ? $isSealed(it) : false : true;
7071  };
7072});
7073
7074/***/ }),
7075
vendor: 781 bytes, lines 7076-7091
7076/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is.js":
7077/*!************************************************************************************!*\
7078  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is.js ***!
7079  \************************************************************************************/
7080/*! no static exports found */
7081/***/ (function(module, exports, __webpack_require__) {
7082
7083// 19.1.3.10 Object.is(value1, value2)
7084var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
7085
7086$export($export.S, 'Object', {
7087  is: __webpack_require__(/*! ./_same-value */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_same-value.js")
7088});
7089
7090/***/ }),
7091
vendor: 971 bytes, lines 7092-7111
7092/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.keys.js":
7093/*!**************************************************************************************!*\
7094  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.keys.js ***!
7095  \**************************************************************************************/
7096/*! no static exports found */
7097/***/ (function(module, exports, __webpack_require__) {
7098
7099// 19.1.2.14 Object.keys(O)
7100var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js");
7101
7102var $keys = __webpack_require__(/*! ./_object-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js");
7103
7104__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('keys', function () {
7105  return function keys(it) {
7106    return $keys(toObject(it));
7107  };
7108});
7109
7110/***/ }),
7111
vendor: 1,129 bytes, lines 7112-7131
7112/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.prevent-extensions.js":
7113/*!****************************************************************************************************!*\
7114  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.prevent-extensions.js ***!
7115  \****************************************************************************************************/
7116/*! no static exports found */
7117/***/ (function(module, exports, __webpack_require__) {
7118
7119// 19.1.2.15 Object.preventExtensions(O)
7120var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
7121
7122var meta = __webpack_require__(/*! ./_meta */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js").onFreeze;
7123
7124__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('preventExtensions', function ($preventExtensions) {
7125  return function preventExtensions(it) {
7126    return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;
7127  };
7128});
7129
7130/***/ }),
7131
vendor: 995 bytes, lines 7132-7151
7132/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.seal.js":
7133/*!**************************************************************************************!*\
7134  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.seal.js ***!
7135  \**************************************************************************************/
7136/*! no static exports found */
7137/***/ (function(module, exports, __webpack_require__) {
7138
7139// 19.1.2.17 Object.seal(O)
7140var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
7141
7142var meta = __webpack_require__(/*! ./_meta */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js").onFreeze;
7143
7144__webpack_require__(/*! ./_object-sap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js")('seal', function ($seal) {
7145  return function seal(it) {
7146    return $seal && isObject(it) ? $seal(meta(it)) : it;
7147  };
7148});
7149
7150/***/ }),
7151
vendor: 857 bytes, lines 7152-7167
7152/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.set-prototype-of.js":
7153/*!**************************************************************************************************!*\
7154  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.set-prototype-of.js ***!
7155  \**************************************************************************************************/
7156/*! no static exports found */
7157/***/ (function(module, exports, __webpack_require__) {
7158
7159// 19.1.3.19 Object.setPrototypeOf(O, proto)
7160var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
7161
7162$export($export.S, 'Object', {
7163  setPrototypeOf: __webpack_require__(/*! ./_set-proto */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-proto.js").set
7164});
7165
7166/***/ }),
7167
vendor: 1,078 bytes, lines 7168-7190
7168/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.to-string.js":
7169/*!*******************************************************************************************!*\
7170  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.to-string.js ***!
7171  \*******************************************************************************************/
7172/*! no static exports found */
7173/***/ (function(module, exports, __webpack_require__) {
7174
7175"use strict";
7176 // 19.1.3.6 Object.prototype.toString()
7177
7178var classof = __webpack_require__(/*! ./_classof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js");
7179
7180var test = {};
7181test[__webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('toStringTag')] = 'z';
7182
7183if (test + '' != '[object z]') {
7184  __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js")(Object.prototype, 'toString', function toString() {
7185    return '[object ' + classof(this) + ']';
7186  }, true);
7187}
7188
7189/***/ }),
7190
vendor: 854 bytes, lines 7191-7208
7191/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-float.js":
7192/*!**************************************************************************************!*\
7193  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-float.js ***!
7194  \**************************************************************************************/
7195/*! no static exports found */
7196/***/ (function(module, exports, __webpack_require__) {
7197
7198var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
7199
7200var $parseFloat = __webpack_require__(/*! ./_parse-float */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_parse-float.js"); // 18.2.4 parseFloat(string)
7201
7202
7203$export($export.G + $export.F * (parseFloat != $parseFloat), {
7204  parseFloat: $parseFloat
7205});
7206
7207/***/ }),
7208
vendor: 837 bytes, lines 7209-7226
7209/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-int.js":
7210/*!************************************************************************************!*\
7211  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-int.js ***!
7212  \************************************************************************************/
7213/*! no static exports found */
7214/***/ (function(module, exports, __webpack_require__) {
7215
7216var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
7217
7218var $parseInt = __webpack_require__(/*! ./_parse-int */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_parse-int.js"); // 18.2.5 parseInt(string, radix)
7219
7220
7221$export($export.G + $export.F * (parseInt != $parseInt), {
7222  parseInt: $parseInt
7223});
7224
7225/***/ }),
7226
vendor: 12,505 bytes, lines 7227-7593
7227/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.promise.js":
7228/*!**********************************************************************************!*\
7229  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.promise.js ***!
7230  \**********************************************************************************/
7231/*! no static exports found */
7232/***/ (function(module, exports, __webpack_require__) {
7233
7234"use strict";
7235
7236
7237var LIBRARY = __webpack_require__(/*! ./_library */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js");
7238
7239var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
7240
7241var ctx = __webpack_require__(/*! ./_ctx */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js");
7242
7243var classof = __webpack_require__(/*! ./_classof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js");
7244
7245var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
7246
7247var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
7248
7249var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js");
7250
7251var anInstance = __webpack_require__(/*! ./_an-instance */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js");
7252
7253var forOf = __webpack_require__(/*! ./_for-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js");
7254
7255var speciesConstructor = __webpack_require__(/*! ./_species-constructor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_species-constructor.js");
7256
7257var task = __webpack_require__(/*! ./_task */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_task.js").set;
7258
7259var microtask = __webpack_require__(/*! ./_microtask */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_microtask.js")();
7260
7261var newPromiseCapabilityModule = __webpack_require__(/*! ./_new-promise-capability */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_new-promise-capability.js");
7262
7263var perform = __webpack_require__(/*! ./_perform */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_perform.js");
7264
7265var userAgent = __webpack_require__(/*! ./_user-agent */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_user-agent.js");
7266
7267var promiseResolve = __webpack_require__(/*! ./_promise-resolve */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_promise-resolve.js");
7268
7269var PROMISE = 'Promise';
7270var TypeError = global.TypeError;
7271var process = global.process;
7272var versions = process && process.versions;
7273var v8 = versions && versions.v8 || '';
7274var $Promise = global[PROMISE];
7275var isNode = classof(process) == 'process';
7276
7277var empty = function empty() {
7278  /* empty */
7279};
7280
7281var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;
7282var newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;
7283var USE_NATIVE = !!function () {
7284  try {
7285    // correct subclassing with @@species support
7286    var promise = $Promise.resolve(1);
7287
7288    var FakePromise = (promise.constructor = {})[__webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('species')] = function (exec) {
7289      exec(empty, empty);
7290    }; // unhandled rejections tracking support, NodeJS Promise without it fails @@species test
7291
7292
7293    return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
7294    // https://bugs.chromium.org/p/chromium/issues/detail?id=830565
7295    // we can't detect it synchronously, so just check versions
7296    && v8.indexOf('6.6') !== 0 && userAgent.indexOf('Chrome/66') === -1;
7297  } catch (e) {
7298    /* empty */
7299  }
7300}(); // helpers
7301
7302var isThenable = function isThenable(it) {
7303  var then;
7304  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;
7305};
7306
7307var notify = function notify(promise, isReject) {
7308  if (promise._n) return;
7309  promise._n = true;
7310  var chain = promise._c;
7311  microtask(function () {
7312    var value = promise._v;
7313    var ok = promise._s == 1;
7314    var i = 0;
7315
7316    var run = function run(reaction) {
7317      var handler = ok ? reaction.ok : reaction.fail;
7318      var resolve = reaction.resolve;
7319      var reject = reaction.reject;
7320      var domain = reaction.domain;
7321      var result, then, exited;
7322
7323      try {
7324        if (handler) {
7325          if (!ok) {
7326            if (promise._h == 2) onHandleUnhandled(promise);
7327            promise._h = 1;
7328          }
7329
7330          if (handler === true) result = value;else {
7331            if (domain) domain.enter();
7332            result = handler(value); // may throw
7333
7334            if (domain) {
7335              domain.exit();
7336              exited = true;
7337            }
7338          }
7339
7340          if (result === reaction.promise) {
7341            reject(TypeError('Promise-chain cycle'));
7342          } else if (then = isThenable(result)) {
7343            then.call(result, resolve, reject);
7344          } else resolve(result);
7345        } else reject(value);
7346      } catch (e) {
7347        if (domain && !exited) domain.exit();
7348        reject(e);
7349      }
7350    };
7351
7352    while (chain.length > i) {
7353      run(chain[i++]);
7354    } // variable length - can't use forEach
7355
7356
7357    promise._c = [];
7358    promise._n = false;
7359    if (isReject && !promise._h) onUnhandled(promise);
7360  });
7361};
7362
7363var onUnhandled = function onUnhandled(promise) {
7364  task.call(global, function () {
7365    var value = promise._v;
7366    var unhandled = isUnhandled(promise);
7367    var result, handler, console;
7368
7369    if (unhandled) {
7370      result = perform(function () {
7371        if (isNode) {
7372          process.emit('unhandledRejection', value, promise);
7373        } else if (handler = global.onunhandledrejection) {
7374          handler({
7375            promise: promise,
7376            reason: value
7377          });
7378        } else if ((console = global.console) && console.error) {
7379          console.error('Unhandled promise rejection', value);
7380        }
7381      }); // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
7382
7383      promise._h = isNode || isUnhandled(promise) ? 2 : 1;
7384    }
7385
7386    promise._a = undefined;
7387    if (unhandled && result.e) throw result.v;
7388  });
7389};
7390
7391var isUnhandled = function isUnhandled(promise) {
7392  return promise._h !== 1 && (promise._a || promise._c).length === 0;
7393};
7394
7395var onHandleUnhandled = function onHandleUnhandled(promise) {
7396  task.call(global, function () {
7397    var handler;
7398
7399    if (isNode) {
7400      process.emit('rejectionHandled', promise);
7401    } else if (handler = global.onrejectionhandled) {
7402      handler({
7403        promise: promise,
7404        reason: promise._v
7405      });
7406    }
7407  });
7408};
7409
7410var $reject = function $reject(value) {
7411  var promise = this;
7412  if (promise._d) return;
7413  promise._d = true;
7414  promise = promise._w || promise; // unwrap
7415
7416  promise._v = value;
7417  promise._s = 2;
7418  if (!promise._a) promise._a = promise._c.slice();
7419  notify(promise, true);
7420};
7421
7422var $resolve = function $resolve(value) {
7423  var promise = this;
7424  var then;
7425  if (promise._d) return;
7426  promise._d = true;
7427  promise = promise._w || promise; // unwrap
7428
7429  try {
7430    if (promise === value) throw TypeError("Promise can't be resolved itself");
7431
7432    if (then = isThenable(value)) {
7433      microtask(function () {
7434        var wrapper = {
7435          _w: promise,
7436          _d: false
7437        }; // wrap
7438
7439        try {
7440          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));
7441        } catch (e) {
7442          $reject.call(wrapper, e);
7443        }
7444      });
7445    } else {
7446      promise._v = value;
7447      promise._s = 1;
7448      notify(promise, false);
7449    }
7450  } catch (e) {
7451    $reject.call({
7452      _w: promise,
7453      _d: false
7454    }, e); // wrap
7455  }
7456}; // constructor polyfill
7457
7458
7459if (!USE_NATIVE) {
7460  // 25.4.3.1 Promise(executor)
7461  $Promise = function Promise(executor) {
7462    anInstance(this, $Promise, PROMISE, '_h');
7463    aFunction(executor);
7464    Internal.call(this);
7465
7466    try {
7467      executor(ctx($resolve, this, 1), ctx($reject, this, 1));
7468    } catch (err) {
7469      $reject.call(this, err);
7470    }
7471  }; // eslint-disable-next-line no-unused-vars
7472
7473
7474  Internal = function Promise(executor) {
7475    this._c = []; // <- awaiting reactions
7476
7477    this._a = undefined; // <- checked in isUnhandled reactions
7478
7479    this._s = 0; // <- state
7480
7481    this._d = false; // <- done
7482
7483    this._v = undefined; // <- value
7484
7485    this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled
7486
7487    this._n = false; // <- notify
7488  };
7489
7490  Internal.prototype = __webpack_require__(/*! ./_redefine-all */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js")($Promise.prototype, {
7491    // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
7492    then: function then(onFulfilled, onRejected) {
7493      var reaction = newPromiseCapability(speciesConstructor(this, $Promise));
7494      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
7495      reaction.fail = typeof onRejected == 'function' && onRejected;
7496      reaction.domain = isNode ? process.domain : undefined;
7497
7498      this._c.push(reaction);
7499
7500      if (this._a) this._a.push(reaction);
7501      if (this._s) notify(this, false);
7502      return reaction.promise;
7503    },
7504    // 25.4.5.1 Promise.prototype.catch(onRejected)
7505    'catch': function _catch(onRejected) {
7506      return this.then(undefined, onRejected);
7507    }
7508  });
7509
7510  OwnPromiseCapability = function OwnPromiseCapability() {
7511    var promise = new Internal();
7512    this.promise = promise;
7513    this.resolve = ctx($resolve, promise, 1);
7514    this.reject = ctx($reject, promise, 1);
7515  };
7516
7517  newPromiseCapabilityModule.f = newPromiseCapability = function newPromiseCapability(C) {
7518    return C === $Promise || C === Wrapper ? new OwnPromiseCapability(C) : newGenericPromiseCapability(C);
7519  };
7520}
7521
7522$export($export.G + $export.W + $export.F * !USE_NATIVE, {
7523  Promise: $Promise
7524});
7525
7526__webpack_require__(/*! ./_set-to-string-tag */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js")($Promise, PROMISE);
7527
7528__webpack_require__(/*! ./_set-species */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js")(PROMISE);
7529
7530Wrapper = __webpack_require__(/*! ./_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js")[PROMISE]; // statics
7531
7532$export($export.S + $export.F * !USE_NATIVE, PROMISE, {
7533  // 25.4.4.5 Promise.reject(r)
7534  reject: function reject(r) {
7535    var capability = newPromiseCapability(this);
7536    var $$reject = capability.reject;
7537    $$reject(r);
7538    return capability.promise;
7539  }
7540});
7541$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {
7542  // 25.4.4.6 Promise.resolve(x)
7543  resolve: function resolve(x) {
7544    return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);
7545  }
7546});
7547$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(/*! ./_iter-detect */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-detect.js")(function (iter) {
7548  $Promise.all(iter)['catch'](empty);
7549})), PROMISE, {
7550  // 25.4.4.1 Promise.all(iterable)
7551  all: function all(iterable) {
7552    var C = this;
7553    var capability = newPromiseCapability(C);
7554    var resolve = capability.resolve;
7555    var reject = capability.reject;
7556    var result = perform(function () {
7557      var values = [];
7558      var index = 0;
7559      var remaining = 1;
7560      forOf(iterable, false, function (promise) {
7561        var $index = index++;
7562        var alreadyCalled = false;
7563        values.push(undefined);
7564        remaining++;
7565        C.resolve(promise).then(function (value) {
7566          if (alreadyCalled) return;
7567          alreadyCalled = true;
7568          values[$index] = value;
7569          --remaining || resolve(values);
7570        }, reject);
7571      });
7572      --remaining || resolve(values);
7573    });
7574    if (result.e) reject(result.v);
7575    return capability.promise;
7576  },
7577  // 25.4.4.4 Promise.race(iterable)
7578  race: function race(iterable) {
7579    var C = this;
7580    var capability = newPromiseCapability(C);
7581    var reject = capability.reject;
7582    var result = perform(function () {
7583      forOf(iterable, false, function (promise) {
7584        C.resolve(promise).then(capability.resolve, reject);
7585      });
7586    });
7587    if (result.e) reject(result.v);
7588    return capability.promise;
7589  }
7590});
7591
7592/***/ }),
7593
vendor: 1,592 bytes, lines 7594-7624
7594/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.apply.js":
7595/*!****************************************************************************************!*\
7596  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.apply.js ***!
7597  \****************************************************************************************/
7598/*! no static exports found */
7599/***/ (function(module, exports, __webpack_require__) {
7600
7601// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)
7602var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
7603
7604var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js");
7605
7606var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
7607
7608var rApply = (__webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").Reflect || {}).apply;
7609var fApply = Function.apply; // MS Edge argumentsList argument is optional
7610
7611$export($export.S + $export.F * !__webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () {
7612  rApply(function () {
7613    /* empty */
7614  });
7615}), 'Reflect', {
7616  apply: function apply(target, thisArgument, argumentsList) {
7617    var T = aFunction(target);
7618    var L = anObject(argumentsList);
7619    return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);
7620  }
7621});
7622
7623/***/ }),
7624
vendor: 3,293 bytes, lines 7625-7707
7625/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.construct.js":
7626/*!********************************************************************************************!*\
7627  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.construct.js ***!
7628  \********************************************************************************************/
7629/*! no static exports found */
7630/***/ (function(module, exports, __webpack_require__) {
7631
7632// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])
7633var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
7634
7635var create = __webpack_require__(/*! ./_object-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js");
7636
7637var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js");
7638
7639var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
7640
7641var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
7642
7643var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js");
7644
7645var bind = __webpack_require__(/*! ./_bind */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_bind.js");
7646
7647var rConstruct = (__webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").Reflect || {}).construct; // MS Edge supports only 2 arguments and argumentsList argument is optional
7648// FF Nightly sets third argument as `new.target`, but does not create `this` from it
7649
7650var NEW_TARGET_BUG = fails(function () {
7651  function F() {
7652    /* empty */
7653  }
7654
7655  return !(rConstruct(function () {
7656    /* empty */
7657  }, [], F) instanceof F);
7658});
7659var ARGS_BUG = !fails(function () {
7660  rConstruct(function () {
7661    /* empty */
7662  });
7663});
7664$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {
7665  construct: function construct(Target, args
7666  /* , newTarget */
7667  ) {
7668    aFunction(Target);
7669    anObject(args);
7670    var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);
7671    if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);
7672
7673    if (Target == newTarget) {
7674      // w/o altered newTarget, optimization for 0-4 arguments
7675      switch (args.length) {
7676        case 0:
7677          return new Target();
7678
7679        case 1:
7680          return new Target(args[0]);
7681
7682        case 2:
7683          return new Target(args[0], args[1]);
7684
7685        case 3:
7686          return new Target(args[0], args[1], args[2]);
7687
7688        case 4:
7689          return new Target(args[0], args[1], args[2], args[3]);
7690      } // w/o altered newTarget, lot of arguments case
7691
7692
7693      var $args = [null];
7694      $args.push.apply($args, args);
7695      return new (bind.apply(Target, $args))();
7696    } // with altered newTarget, not support built-in constructors
7697
7698
7699    var proto = newTarget.prototype;
7700    var instance = create(isObject(proto) ? proto : Object.prototype);
7701    var result = Function.apply.call(Target, instance, args);
7702    return isObject(result) ? result : instance;
7703  }
7704});
7705
7706/***/ }),
7707
vendor: 1,788 bytes, lines 7708-7748
7708/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.define-property.js":
7709/*!**************************************************************************************************!*\
7710  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.define-property.js ***!
7711  \**************************************************************************************************/
7712/*! no static exports found */
7713/***/ (function(module, exports, __webpack_require__) {
7714
7715// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)
7716var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js");
7717
7718var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
7719
7720var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
7721
7722var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js"); // MS Edge has broken Reflect.defineProperty - throwing instead of returning false
7723
7724
7725$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () {
7726  // eslint-disable-next-line no-undef
7727  Reflect.defineProperty(dP.f({}, 1, {
7728    value: 1
7729  }), 1, {
7730    value: 2
7731  });
7732}), 'Reflect', {
7733  defineProperty: function defineProperty(target, propertyKey, attributes) {
7734    anObject(target);
7735    propertyKey = toPrimitive(propertyKey, true);
7736    anObject(attributes);
7737
7738    try {
7739      dP.f(target, propertyKey, attributes);
7740      return true;
7741    } catch (e) {
7742      return false;
7743    }
7744  }
7745});
7746
7747/***/ }),
7748
vendor: 1,195 bytes, lines 7749-7771
7749/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.delete-property.js":
7750/*!**************************************************************************************************!*\
7751  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.delete-property.js ***!
7752  \**************************************************************************************************/
7753/*! no static exports found */
7754/***/ (function(module, exports, __webpack_require__) {
7755
7756// 26.1.4 Reflect.deleteProperty(target, propertyKey)
7757var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
7758
7759var gOPD = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js").f;
7760
7761var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
7762
7763$export($export.S, 'Reflect', {
7764  deleteProperty: function deleteProperty(target, propertyKey) {
7765    var desc = gOPD(anObject(target), propertyKey);
7766    return desc && !desc.configurable ? false : delete target[propertyKey];
7767  }
7768});
7769
7770/***/ }),
7771
vendor: 1,548 bytes, lines 7772-7825
7772/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.enumerate.js":
7773/*!********************************************************************************************!*\
7774  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.enumerate.js ***!
7775  \********************************************************************************************/
7776/*! no static exports found */
7777/***/ (function(module, exports, __webpack_require__) {
7778
7779"use strict";
7780 // 26.1.5 Reflect.enumerate(target)
7781
7782var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
7783
7784var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
7785
7786var Enumerate = function Enumerate(iterated) {
7787  this._t = anObject(iterated); // target
7788
7789  this._i = 0; // next index
7790
7791  var keys = this._k = []; // keys
7792
7793  var key;
7794
7795  for (key in iterated) {
7796    keys.push(key);
7797  }
7798};
7799
7800__webpack_require__(/*! ./_iter-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-create.js")(Enumerate, 'Object', function () {
7801  var that = this;
7802  var keys = that._k;
7803  var key;
7804
7805  do {
7806    if (that._i >= keys.length) return {
7807      value: undefined,
7808      done: true
7809    };
7810  } while (!((key = keys[that._i++]) in that._t));
7811
7812  return {
7813    value: key,
7814    done: false
7815  };
7816});
7817
7818$export($export.S, 'Reflect', {
7819  enumerate: function enumerate(target) {
7820    return new Enumerate(target);
7821  }
7822});
7823
7824/***/ }),
7825
vendor: 1,193 bytes, lines 7826-7847
7826/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js":
7827/*!**************************************************************************************************************!*\
7828  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js ***!
7829  \**************************************************************************************************************/
7830/*! no static exports found */
7831/***/ (function(module, exports, __webpack_require__) {
7832
7833// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)
7834var gOPD = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js");
7835
7836var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
7837
7838var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
7839
7840$export($export.S, 'Reflect', {
7841  getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {
7842    return gOPD.f(anObject(target), propertyKey);
7843  }
7844});
7845
7846/***/ }),
7847
vendor: 1,084 bytes, lines 7848-7869
7848/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-prototype-of.js":
7849/*!***************************************************************************************************!*\
7850  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-prototype-of.js ***!
7851  \***************************************************************************************************/
7852/*! no static exports found */
7853/***/ (function(module, exports, __webpack_require__) {
7854
7855// 26.1.8 Reflect.getPrototypeOf(target)
7856var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
7857
7858var getProto = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js");
7859
7860var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
7861
7862$export($export.S, 'Reflect', {
7863  getPrototypeOf: function getPrototypeOf(target) {
7864    return getProto(anObject(target));
7865  }
7866});
7867
7868/***/ }),
7869
vendor: 1,793 bytes, lines 7870-7905
7870/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get.js":
7871/*!**************************************************************************************!*\
7872  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get.js ***!
7873  \**************************************************************************************/
7874/*! no static exports found */
7875/***/ (function(module, exports, __webpack_require__) {
7876
7877// 26.1.6 Reflect.get(target, propertyKey [, receiver])
7878var gOPD = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js");
7879
7880var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js");
7881
7882var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js");
7883
7884var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
7885
7886var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
7887
7888var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
7889
7890function get(target, propertyKey
7891/* , receiver */
7892) {
7893  var receiver = arguments.length < 3 ? target : arguments[2];
7894  var desc, proto;
7895  if (anObject(target) === receiver) return target[propertyKey];
7896  if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value') ? desc.value : desc.get !== undefined ? desc.get.call(receiver) : undefined;
7897  if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);
7898}
7899
7900$export($export.S, 'Reflect', {
7901  get: get
7902});
7903
7904/***/ }),
7905
vendor: 750 bytes, lines 7906-7923
7906/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.has.js":
7907/*!**************************************************************************************!*\
7908  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.has.js ***!
7909  \**************************************************************************************/
7910/*! no static exports found */
7911/***/ (function(module, exports, __webpack_require__) {
7912
7913// 26.1.9 Reflect.has(target, propertyKey)
7914var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
7915
7916$export($export.S, 'Reflect', {
7917  has: function has(target, propertyKey) {
7918    return propertyKey in target;
7919  }
7920});
7921
7922/***/ }),
7923
vendor: 1,012 bytes, lines 7924-7945
7924/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.is-extensible.js":
7925/*!************************************************************************************************!*\
7926  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.is-extensible.js ***!
7927  \************************************************************************************************/
7928/*! no static exports found */
7929/***/ (function(module, exports, __webpack_require__) {
7930
7931// 26.1.10 Reflect.isExtensible(target)
7932var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
7933
7934var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
7935
7936var $isExtensible = Object.isExtensible;
7937$export($export.S, 'Reflect', {
7938  isExtensible: function isExtensible(target) {
7939    anObject(target);
7940    return $isExtensible ? $isExtensible(target) : true;
7941  }
7942});
7943
7944/***/ }),
7945
vendor: 807 bytes, lines 7946-7961
7946/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.own-keys.js":
7947/*!*******************************************************************************************!*\
7948  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.own-keys.js ***!
7949  \*******************************************************************************************/
7950/*! no static exports found */
7951/***/ (function(module, exports, __webpack_require__) {
7952
7953// 26.1.11 Reflect.ownKeys(target)
7954var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
7955
7956$export($export.S, 'Reflect', {
7957  ownKeys: __webpack_require__(/*! ./_own-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_own-keys.js")
7958});
7959
7960/***/ }),
7961
vendor: 1,132 bytes, lines 7962-7989
7962/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.prevent-extensions.js":
7963/*!*****************************************************************************************************!*\
7964  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.prevent-extensions.js ***!
7965  \*****************************************************************************************************/
7966/*! no static exports found */
7967/***/ (function(module, exports, __webpack_require__) {
7968
7969// 26.1.12 Reflect.preventExtensions(target)
7970var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
7971
7972var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
7973
7974var $preventExtensions = Object.preventExtensions;
7975$export($export.S, 'Reflect', {
7976  preventExtensions: function preventExtensions(target) {
7977    anObject(target);
7978
7979    try {
7980      if ($preventExtensions) $preventExtensions(target);
7981      return true;
7982    } catch (e) {
7983      return false;
7984    }
7985  }
7986});
7987
7988/***/ }),
7989
vendor: 1,082 bytes, lines 7990-8016
7990/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set-prototype-of.js":
7991/*!***************************************************************************************************!*\
7992  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set-prototype-of.js ***!
7993  \***************************************************************************************************/
7994/*! no static exports found */
7995/***/ (function(module, exports, __webpack_require__) {
7996
7997// 26.1.14 Reflect.setPrototypeOf(target, proto)
7998var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
7999
8000var setProto = __webpack_require__(/*! ./_set-proto */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-proto.js");
8001
8002if (setProto) $export($export.S, 'Reflect', {
8003  setPrototypeOf: function setPrototypeOf(target, proto) {
8004    setProto.check(target, proto);
8005
8006    try {
8007      setProto.set(target, proto);
8008      return true;
8009    } catch (e) {
8010      return false;
8011    }
8012  }
8013});
8014
8015/***/ }),
8016
vendor: 2,542 bytes, lines 8017-8076
8017/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set.js":
8018/*!**************************************************************************************!*\
8019  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set.js ***!
8020  \**************************************************************************************/
8021/*! no static exports found */
8022/***/ (function(module, exports, __webpack_require__) {
8023
8024// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])
8025var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js");
8026
8027var gOPD = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js");
8028
8029var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js");
8030
8031var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js");
8032
8033var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
8034
8035var createDesc = __webpack_require__(/*! ./_property-desc */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js");
8036
8037var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
8038
8039var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
8040
8041function set(target, propertyKey, V
8042/* , receiver */
8043) {
8044  var receiver = arguments.length < 4 ? target : arguments[3];
8045  var ownDesc = gOPD.f(anObject(target), propertyKey);
8046  var existingDescriptor, proto;
8047
8048  if (!ownDesc) {
8049    if (isObject(proto = getPrototypeOf(target))) {
8050      return set(proto, propertyKey, V, receiver);
8051    }
8052
8053    ownDesc = createDesc(0);
8054  }
8055
8056  if (has(ownDesc, 'value')) {
8057    if (ownDesc.writable === false || !isObject(receiver)) return false;
8058
8059    if (existingDescriptor = gOPD.f(receiver, propertyKey)) {
8060      if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false;
8061      existingDescriptor.value = V;
8062      dP.f(receiver, propertyKey, existingDescriptor);
8063    } else dP.f(receiver, propertyKey, createDesc(0, V));
8064
8065    return true;
8066  }
8067
8068  return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);
8069}
8070
8071$export($export.S, 'Reflect', {
8072  set: set
8073});
8074
8075/***/ }),
8076
vendor: 3,150 bytes, lines 8077-8141
8077/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.constructor.js":
8078/*!*********************************************************************************************!*\
8079  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.constructor.js ***!
8080  \*********************************************************************************************/
8081/*! no static exports found */
8082/***/ (function(module, exports, __webpack_require__) {
8083
8084var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
8085
8086var inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_inherit-if-required.js");
8087
8088var dP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f;
8089
8090var gOPN = __webpack_require__(/*! ./_object-gopn */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js").f;
8091
8092var isRegExp = __webpack_require__(/*! ./_is-regexp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-regexp.js");
8093
8094var $flags = __webpack_require__(/*! ./_flags */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_flags.js");
8095
8096var $RegExp = global.RegExp;
8097var Base = $RegExp;
8098var proto = $RegExp.prototype;
8099var re1 = /a/g;
8100var re2 = /a/g; // "new" creates a new object, old webkit buggy here
8101
8102var CORRECT_NEW = new $RegExp(re1) !== re1;
8103
8104if (__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") && (!CORRECT_NEW || __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () {
8105  re2[__webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('match')] = false; // RegExp constructor can alter flags and IsRegExp works correct with @@match
8106
8107  return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';
8108}))) {
8109  $RegExp = function RegExp(p, f) {
8110    var tiRE = this instanceof $RegExp;
8111    var piRE = isRegExp(p);
8112    var fiU = f === undefined;
8113    return !tiRE && piRE && p.constructor === $RegExp && fiU ? p : inheritIfRequired(CORRECT_NEW ? new Base(piRE && !fiU ? p.source : p, f) : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f), tiRE ? this : proto, $RegExp);
8114  };
8115
8116  var proxy = function proxy(key) {
8117    key in $RegExp || dP($RegExp, key, {
8118      configurable: true,
8119      get: function get() {
8120        return Base[key];
8121      },
8122      set: function set(it) {
8123        Base[key] = it;
8124      }
8125    });
8126  };
8127
8128  for (var keys = gOPN(Base), i = 0; keys.length > i;) {
8129    proxy(keys[i++]);
8130  }
8131
8132  proto.constructor = $RegExp;
8133  $RegExp.prototype = proto;
8134
8135  __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js")(global, 'RegExp', $RegExp);
8136}
8137
8138__webpack_require__(/*! ./_set-species */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js")('RegExp');
8139
8140/***/ }),
8141
vendor: 829 bytes, lines 8142-8163
8142/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.exec.js":
8143/*!**************************************************************************************!*\
8144  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.exec.js ***!
8145  \**************************************************************************************/
8146/*! no static exports found */
8147/***/ (function(module, exports, __webpack_require__) {
8148
8149"use strict";
8150
8151
8152var regexpExec = __webpack_require__(/*! ./_regexp-exec */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec.js");
8153
8154__webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js")({
8155  target: 'RegExp',
8156  proto: true,
8157  forced: regexpExec !== /./.exec
8158}, {
8159  exec: regexpExec
8160});
8161
8162/***/ }),
8163
vendor: 945 bytes, lines 8164-8178
8164/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.flags.js":
8165/*!***************************************************************************************!*\
8166  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.flags.js ***!
8167  \***************************************************************************************/
8168/*! no static exports found */
8169/***/ (function(module, exports, __webpack_require__) {
8170
8171// 21.2.5.3 get RegExp.prototype.flags()
8172if (__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") && /./g.flags != 'g') __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js").f(RegExp.prototype, 'flags', {
8173  configurable: true,
8174  get: __webpack_require__(/*! ./_flags */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_flags.js")
8175});
8176
8177/***/ }),
8178
vendor: 2,294 bytes, lines 8179-8231
8179/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.match.js":
8180/*!***************************************************************************************!*\
8181  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.match.js ***!
8182  \***************************************************************************************/
8183/*! no static exports found */
8184/***/ (function(module, exports, __webpack_require__) {
8185
8186"use strict";
8187
8188
8189var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
8190
8191var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
8192
8193var advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_advance-string-index.js");
8194
8195var regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec-abstract.js"); // @@match logic
8196
8197
8198__webpack_require__(/*! ./_fix-re-wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fix-re-wks.js")('match', 1, function (defined, MATCH, $match, maybeCallNative) {
8199  return [// `String.prototype.match` method
8200  // https://tc39.github.io/ecma262/#sec-string.prototype.match
8201  function match(regexp) {
8202    var O = defined(this);
8203    var fn = regexp == undefined ? undefined : regexp[MATCH];
8204    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));
8205  }, // `RegExp.prototype[@@match]` method
8206  // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match
8207  function (regexp) {
8208    var res = maybeCallNative($match, regexp, this);
8209    if (res.done) return res.value;
8210    var rx = anObject(regexp);
8211    var S = String(this);
8212    if (!rx.global) return regExpExec(rx, S);
8213    var fullUnicode = rx.unicode;
8214    rx.lastIndex = 0;
8215    var A = [];
8216    var n = 0;
8217    var result;
8218
8219    while ((result = regExpExec(rx, S)) !== null) {
8220      var matchStr = String(result[0]);
8221      A[n] = matchStr;
8222      if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);
8223      n++;
8224    }
8225
8226    return n === 0 ? null : A;
8227  }];
8228});
8229
8230/***/ }),
8231
vendor: 5,766 bytes, lines 8232-8386
8232/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.replace.js":
8233/*!*****************************************************************************************!*\
8234  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.replace.js ***!
8235  \*****************************************************************************************/
8236/*! no static exports found */
8237/***/ (function(module, exports, __webpack_require__) {
8238
8239"use strict";
8240
8241
8242var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
8243
8244var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js");
8245
8246var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
8247
8248var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js");
8249
8250var advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_advance-string-index.js");
8251
8252var regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec-abstract.js");
8253
8254var max = Math.max;
8255var min = Math.min;
8256var floor = Math.floor;
8257var SUBSTITUTION_SYMBOLS = /\$([$&`']|\d\d?|<[^>]*>)/g;
8258var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&`']|\d\d?)/g;
8259
8260var maybeToString = function maybeToString(it) {
8261  return it === undefined ? it : String(it);
8262}; // @@replace logic
8263
8264
8265__webpack_require__(/*! ./_fix-re-wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fix-re-wks.js")('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {
8266  return [// `String.prototype.replace` method
8267  // https://tc39.github.io/ecma262/#sec-string.prototype.replace
8268  function replace(searchValue, replaceValue) {
8269    var O = defined(this);
8270    var fn = searchValue == undefined ? undefined : searchValue[REPLACE];
8271    return fn !== undefined ? fn.call(searchValue, O, replaceValue) : $replace.call(String(O), searchValue, replaceValue);
8272  }, // `RegExp.prototype[@@replace]` method
8273  // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace
8274  function (regexp, replaceValue) {
8275    var res = maybeCallNative($replace, regexp, this, replaceValue);
8276    if (res.done) return res.value;
8277    var rx = anObject(regexp);
8278    var S = String(this);
8279    var functionalReplace = typeof replaceValue === 'function';
8280    if (!functionalReplace) replaceValue = String(replaceValue);
8281    var global = rx.global;
8282
8283    if (global) {
8284      var fullUnicode = rx.unicode;
8285      rx.lastIndex = 0;
8286    }
8287
8288    var results = [];
8289
8290    while (true) {
8291      var result = regExpExec(rx, S);
8292      if (result === null) break;
8293      results.push(result);
8294      if (!global) break;
8295      var matchStr = String(result[0]);
8296      if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);
8297    }
8298
8299    var accumulatedResult = '';
8300    var nextSourcePosition = 0;
8301
8302    for (var i = 0; i < results.length; i++) {
8303      result = results[i];
8304      var matched = String(result[0]);
8305      var position = max(min(toInteger(result.index), S.length), 0);
8306      var captures = []; // NOTE: This is equivalent to
8307      //   captures = result.slice(1).map(maybeToString)
8308      // but for some reason `nativeSlice.call(result, 1, result.length)` (called in
8309      // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and
8310      // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.
8311
8312      for (var j = 1; j < result.length; j++) {
8313        captures.push(maybeToString(result[j]));
8314      }
8315
8316      var namedCaptures = result.groups;
8317
8318      if (functionalReplace) {
8319        var replacerArgs = [matched].concat(captures, position, S);
8320        if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);
8321        var replacement = String(replaceValue.apply(undefined, replacerArgs));
8322      } else {
8323        replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);
8324      }
8325
8326      if (position >= nextSourcePosition) {
8327        accumulatedResult += S.slice(nextSourcePosition, position) + replacement;
8328        nextSourcePosition = position + matched.length;
8329      }
8330    }
8331
8332    return accumulatedResult + S.slice(nextSourcePosition);
8333  }]; // https://tc39.github.io/ecma262/#sec-getsubstitution
8334
8335  function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {
8336    var tailPos = position + matched.length;
8337    var m = captures.length;
8338    var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;
8339
8340    if (namedCaptures !== undefined) {
8341      namedCaptures = toObject(namedCaptures);
8342      symbols = SUBSTITUTION_SYMBOLS;
8343    }
8344
8345    return $replace.call(replacement, symbols, function (match, ch) {
8346      var capture;
8347
8348      switch (ch.charAt(0)) {
8349        case '$':
8350          return '$';
8351
8352        case '&':
8353          return matched;
8354
8355        case '`':
8356          return str.slice(0, position);
8357
8358        case "'":
8359          return str.slice(tailPos);
8360
8361        case '<':
8362          capture = namedCaptures[ch.slice(1, -1)];
8363          break;
8364
8365        default:
8366          // \d\d?
8367          var n = +ch;
8368          if (n === 0) return match;
8369
8370          if (n > m) {
8371            var f = floor(n / 10);
8372            if (f === 0) return match;
8373            if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);
8374            return match;
8375          }
8376
8377          capture = captures[n - 1];
8378      }
8379
8380      return capture === undefined ? '' : capture;
8381    });
8382  }
8383});
8384
8385/***/ }),
8386
vendor: 2,004 bytes, lines 8387-8427
8387/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.search.js":
8388/*!****************************************************************************************!*\
8389  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.search.js ***!
8390  \****************************************************************************************/
8391/*! no static exports found */
8392/***/ (function(module, exports, __webpack_require__) {
8393
8394"use strict";
8395
8396
8397var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
8398
8399var sameValue = __webpack_require__(/*! ./_same-value */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_same-value.js");
8400
8401var regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec-abstract.js"); // @@search logic
8402
8403
8404__webpack_require__(/*! ./_fix-re-wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fix-re-wks.js")('search', 1, function (defined, SEARCH, $search, maybeCallNative) {
8405  return [// `String.prototype.search` method
8406  // https://tc39.github.io/ecma262/#sec-string.prototype.search
8407  function search(regexp) {
8408    var O = defined(this);
8409    var fn = regexp == undefined ? undefined : regexp[SEARCH];
8410    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));
8411  }, // `RegExp.prototype[@@search]` method
8412  // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search
8413  function (regexp) {
8414    var res = maybeCallNative($search, regexp, this);
8415    if (res.done) return res.value;
8416    var rx = anObject(regexp);
8417    var S = String(this);
8418    var previousLastIndex = rx.lastIndex;
8419    if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;
8420    var result = regExpExec(rx, S);
8421    if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;
8422    return result === null ? -1 : result.index;
8423  }];
8424});
8425
8426/***/ }),
8427
vendor: 6,307 bytes, lines 8428-8567
8428/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.split.js":
8429/*!***************************************************************************************!*\
8430  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.split.js ***!
8431  \***************************************************************************************/
8432/*! no static exports found */
8433/***/ (function(module, exports, __webpack_require__) {
8434
8435"use strict";
8436
8437
8438var isRegExp = __webpack_require__(/*! ./_is-regexp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-regexp.js");
8439
8440var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
8441
8442var speciesConstructor = __webpack_require__(/*! ./_species-constructor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_species-constructor.js");
8443
8444var advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_advance-string-index.js");
8445
8446var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
8447
8448var callRegExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec-abstract.js");
8449
8450var regexpExec = __webpack_require__(/*! ./_regexp-exec */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec.js");
8451
8452var fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js");
8453
8454var $min = Math.min;
8455var $push = [].push;
8456var $SPLIT = 'split';
8457var LENGTH = 'length';
8458var LAST_INDEX = 'lastIndex';
8459var MAX_UINT32 = 0xffffffff; // babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError
8460
8461var SUPPORTS_Y = !fails(function () {
8462  RegExp(MAX_UINT32, 'y');
8463}); // @@split logic
8464
8465__webpack_require__(/*! ./_fix-re-wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fix-re-wks.js")('split', 2, function (defined, SPLIT, $split, maybeCallNative) {
8466  var internalSplit;
8467
8468  if ('abbc'[$SPLIT](/(b)*/)[1] == 'c' || 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 || 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 || '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 || '.'[$SPLIT](/()()/)[LENGTH] > 1 || ''[$SPLIT](/.?/)[LENGTH]) {
8469    // based on es5-shim implementation, need to rework it
8470    internalSplit = function internalSplit(separator, limit) {
8471      var string = String(this);
8472      if (separator === undefined && limit === 0) return []; // If `separator` is not a regex, use native split
8473
8474      if (!isRegExp(separator)) return $split.call(string, separator, limit);
8475      var output = [];
8476      var flags = (separator.ignoreCase ? 'i' : '') + (separator.multiline ? 'm' : '') + (separator.unicode ? 'u' : '') + (separator.sticky ? 'y' : '');
8477      var lastLastIndex = 0;
8478      var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0; // Make `global` and avoid `lastIndex` issues by working with a copy
8479
8480      var separatorCopy = new RegExp(separator.source, flags + 'g');
8481      var match, lastIndex, lastLength;
8482
8483      while (match = regexpExec.call(separatorCopy, string)) {
8484        lastIndex = separatorCopy[LAST_INDEX];
8485
8486        if (lastIndex > lastLastIndex) {
8487          output.push(string.slice(lastLastIndex, match.index));
8488          if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));
8489          lastLength = match[0][LENGTH];
8490          lastLastIndex = lastIndex;
8491          if (output[LENGTH] >= splitLimit) break;
8492        }
8493
8494        if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop
8495      }
8496
8497      if (lastLastIndex === string[LENGTH]) {
8498        if (lastLength || !separatorCopy.test('')) output.push('');
8499      } else output.push(string.slice(lastLastIndex));
8500
8501      return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;
8502    }; // Chakra, V8
8503
8504  } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {
8505    internalSplit = function internalSplit(separator, limit) {
8506      return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit);
8507    };
8508  } else {
8509    internalSplit = $split;
8510  }
8511
8512  return [// `String.prototype.split` method
8513  // https://tc39.github.io/ecma262/#sec-string.prototype.split
8514  function split(separator, limit) {
8515    var O = defined(this);
8516    var splitter = separator == undefined ? undefined : separator[SPLIT];
8517    return splitter !== undefined ? splitter.call(separator, O, limit) : internalSplit.call(String(O), separator, limit);
8518  }, // `RegExp.prototype[@@split]` method
8519  // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split
8520  //
8521  // NOTE: This cannot be properly polyfilled in engines that don't support
8522  // the 'y' flag.
8523  function (regexp, limit) {
8524    var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split);
8525    if (res.done) return res.value;
8526    var rx = anObject(regexp);
8527    var S = String(this);
8528    var C = speciesConstructor(rx, RegExp);
8529    var unicodeMatching = rx.unicode;
8530    var flags = (rx.ignoreCase ? 'i' : '') + (rx.multiline ? 'm' : '') + (rx.unicode ? 'u' : '') + (SUPPORTS_Y ? 'y' : 'g'); // ^(? + rx + ) is needed, in combination with some S slicing, to
8531    // simulate the 'y' flag.
8532
8533    var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);
8534    var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;
8535    if (lim === 0) return [];
8536    if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];
8537    var p = 0;
8538    var q = 0;
8539    var A = [];
8540
8541    while (q < S.length) {
8542      splitter.lastIndex = SUPPORTS_Y ? q : 0;
8543      var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));
8544      var e;
8545
8546      if (z === null || (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p) {
8547        q = advanceStringIndex(S, q, unicodeMatching);
8548      } else {
8549        A.push(S.slice(p, q));
8550        if (A.length === lim) return A;
8551
8552        for (var i = 1; i <= z.length - 1; i++) {
8553          A.push(z[i]);
8554          if (A.length === lim) return A;
8555        }
8556
8557        q = p = e;
8558      }
8559    }
8560
8561    A.push(S.slice(p));
8562    return A;
8563  }];
8564});
8565
8566/***/ }),
8567
vendor: 1,885 bytes, lines 8568-8611
8568/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.to-string.js":
8569/*!*******************************************************************************************!*\
8570  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.to-string.js ***!
8571  \*******************************************************************************************/
8572/*! no static exports found */
8573/***/ (function(module, exports, __webpack_require__) {
8574
8575"use strict";
8576
8577
8578__webpack_require__(/*! ./es6.regexp.flags */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.flags.js");
8579
8580var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
8581
8582var $flags = __webpack_require__(/*! ./_flags */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_flags.js");
8583
8584var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js");
8585
8586var TO_STRING = 'toString';
8587var $toString = /./[TO_STRING];
8588
8589var define = function define(fn) {
8590  __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js")(RegExp.prototype, TO_STRING, fn, true);
8591}; // 21.2.5.14 RegExp.prototype.toString()
8592
8593
8594if (__webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () {
8595  return $toString.call({
8596    source: 'a',
8597    flags: 'b'
8598  }) != '/a/b';
8599})) {
8600  define(function toString() {
8601    var R = anObject(this);
8602    return '/'.concat(R.source, '/', 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);
8603  }); // FF44- RegExp#toString has a wrong name
8604} else if ($toString.name != TO_STRING) {
8605  define(function toString() {
8606    return $toString.call(this);
8607  });
8608}
8609
8610/***/ }),
8611
vendor: 1,220 bytes, lines 8612-8640
8612/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.set.js":
8613/*!******************************************************************************!*\
8614  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.set.js ***!
8615  \******************************************************************************/
8616/*! no static exports found */
8617/***/ (function(module, exports, __webpack_require__) {
8618
8619"use strict";
8620
8621
8622var strong = __webpack_require__(/*! ./_collection-strong */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-strong.js");
8623
8624var validate = __webpack_require__(/*! ./_validate-collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js");
8625
8626var SET = 'Set'; // 23.2 Set Objects
8627
8628module.exports = __webpack_require__(/*! ./_collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection.js")(SET, function (get) {
8629  return function Set() {
8630    return get(this, arguments.length > 0 ? arguments[0] : undefined);
8631  };
8632}, {
8633  // 23.2.3.1 Set.prototype.add(value)
8634  add: function add(value) {
8635    return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);
8636  }
8637}, strong);
8638
8639/***/ }),
8640
vendor: 773 bytes, lines 8641-8658
8641/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.anchor.js":
8642/*!****************************************************************************************!*\
8643  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.anchor.js ***!
8644  \****************************************************************************************/
8645/*! no static exports found */
8646/***/ (function(module, exports, __webpack_require__) {
8647
8648"use strict";
8649 // B.2.3.2 String.prototype.anchor(name)
8650
8651__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('anchor', function (createHTML) {
8652  return function anchor(name) {
8653    return createHTML(this, 'a', 'name', name);
8654  };
8655});
8656
8657/***/ }),
8658
vendor: 740 bytes, lines 8659-8676
8659/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.big.js":
8660/*!*************************************************************************************!*\
8661  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.big.js ***!
8662  \*************************************************************************************/
8663/*! no static exports found */
8664/***/ (function(module, exports, __webpack_require__) {
8665
8666"use strict";
8667 // B.2.3.3 String.prototype.big()
8668
8669__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('big', function (createHTML) {
8670  return function big() {
8671    return createHTML(this, 'big', '', '');
8672  };
8673});
8674
8675/***/ }),
8676
vendor: 756 bytes, lines 8677-8694
8677/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.blink.js":
8678/*!***************************************************************************************!*\
8679  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.blink.js ***!
8680  \***************************************************************************************/
8681/*! no static exports found */
8682/***/ (function(module, exports, __webpack_require__) {
8683
8684"use strict";
8685 // B.2.3.4 String.prototype.blink()
8686
8687__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('blink', function (createHTML) {
8688  return function blink() {
8689    return createHTML(this, 'blink', '', '');
8690  };
8691});
8692
8693/***/ }),
8694
vendor: 745 bytes, lines 8695-8712
8695/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.bold.js":
8696/*!**************************************************************************************!*\
8697  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.bold.js ***!
8698  \**************************************************************************************/
8699/*! no static exports found */
8700/***/ (function(module, exports, __webpack_require__) {
8701
8702"use strict";
8703 // B.2.3.5 String.prototype.bold()
8704
8705__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('bold', function (createHTML) {
8706  return function bold() {
8707    return createHTML(this, 'b', '', '');
8708  };
8709});
8710
8711/***/ }),
8712
vendor: 935 bytes, lines 8713-8735
8713/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.code-point-at.js":
8714/*!***********************************************************************************************!*\
8715  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.code-point-at.js ***!
8716  \***********************************************************************************************/
8717/*! no static exports found */
8718/***/ (function(module, exports, __webpack_require__) {
8719
8720"use strict";
8721
8722
8723var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
8724
8725var $at = __webpack_require__(/*! ./_string-at */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-at.js")(false);
8726
8727$export($export.P, 'String', {
8728  // 21.1.3.3 String.prototype.codePointAt(pos)
8729  codePointAt: function codePointAt(pos) {
8730    return $at(this, pos);
8731  }
8732});
8733
8734/***/ }),
8735
vendor: 1,700 bytes, lines 8736-8769
8736/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.ends-with.js":
8737/*!*******************************************************************************************!*\
8738  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.ends-with.js ***!
8739  \*******************************************************************************************/
8740/*! no static exports found */
8741/***/ (function(module, exports, __webpack_require__) {
8742
8743"use strict";
8744// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])
8745
8746
8747var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
8748
8749var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
8750
8751var context = __webpack_require__(/*! ./_string-context */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-context.js");
8752
8753var ENDS_WITH = 'endsWith';
8754var $endsWith = ''[ENDS_WITH];
8755$export($export.P + $export.F * __webpack_require__(/*! ./_fails-is-regexp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails-is-regexp.js")(ENDS_WITH), 'String', {
8756  endsWith: function endsWith(searchString
8757  /* , endPosition = @length */
8758  ) {
8759    var that = context(this, searchString, ENDS_WITH);
8760    var endPosition = arguments.length > 1 ? arguments[1] : undefined;
8761    var len = toLength(that.length);
8762    var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);
8763    var search = String(searchString);
8764    return $endsWith ? $endsWith.call(that, search, end) : that.slice(end - search.length, end) === search;
8765  }
8766});
8767
8768/***/ }),
8769
vendor: 753 bytes, lines 8770-8787
8770/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fixed.js":
8771/*!***************************************************************************************!*\
8772  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fixed.js ***!
8773  \***************************************************************************************/
8774/*! no static exports found */
8775/***/ (function(module, exports, __webpack_require__) {
8776
8777"use strict";
8778 // B.2.3.6 String.prototype.fixed()
8779
8780__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('fixed', function (createHTML) {
8781  return function fixed() {
8782    return createHTML(this, 'tt', '', '');
8783  };
8784});
8785
8786/***/ }),
8787
vendor: 801 bytes, lines 8788-8805
8788/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontcolor.js":
8789/*!*******************************************************************************************!*\
8790  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontcolor.js ***!
8791  \*******************************************************************************************/
8792/*! no static exports found */
8793/***/ (function(module, exports, __webpack_require__) {
8794
8795"use strict";
8796 // B.2.3.7 String.prototype.fontcolor(color)
8797
8798__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('fontcolor', function (createHTML) {
8799  return function fontcolor(color) {
8800    return createHTML(this, 'font', 'color', color);
8801  };
8802});
8803
8804/***/ }),
8805
vendor: 790 bytes, lines 8806-8823
8806/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontsize.js":
8807/*!******************************************************************************************!*\
8808  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontsize.js ***!
8809  \******************************************************************************************/
8810/*! no static exports found */
8811/***/ (function(module, exports, __webpack_require__) {
8812
8813"use strict";
8814 // B.2.3.8 String.prototype.fontsize(size)
8815
8816__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('fontsize', function (createHTML) {
8817  return function fontsize(size) {
8818    return createHTML(this, 'font', 'size', size);
8819  };
8820});
8821
8822/***/ }),
8823
vendor: 1,552 bytes, lines 8824-8858
8824/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.from-code-point.js":
8825/*!*************************************************************************************************!*\
8826  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.from-code-point.js ***!
8827  \*************************************************************************************************/
8828/*! no static exports found */
8829/***/ (function(module, exports, __webpack_require__) {
8830
8831var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
8832
8833var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js");
8834
8835var fromCharCode = String.fromCharCode;
8836var $fromCodePoint = String.fromCodePoint; // length should be 1, old FF problem
8837
8838$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
8839  // 21.1.2.2 String.fromCodePoint(...codePoints)
8840  fromCodePoint: function fromCodePoint(x) {
8841    // eslint-disable-line no-unused-vars
8842    var res = [];
8843    var aLen = arguments.length;
8844    var i = 0;
8845    var code;
8846
8847    while (aLen > i) {
8848      code = +arguments[i++];
8849      if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');
8850      res.push(code < 0x10000 ? fromCharCode(code) : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00));
8851    }
8852
8853    return res.join('');
8854  }
8855});
8856
8857/***/ }),
8858
vendor: 1,246 bytes, lines 8859-8884
8859/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.includes.js":
8860/*!******************************************************************************************!*\
8861  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.includes.js ***!
8862  \******************************************************************************************/
8863/*! no static exports found */
8864/***/ (function(module, exports, __webpack_require__) {
8865
8866"use strict";
8867// 21.1.3.7 String.prototype.includes(searchString, position = 0)
8868
8869
8870var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
8871
8872var context = __webpack_require__(/*! ./_string-context */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-context.js");
8873
8874var INCLUDES = 'includes';
8875$export($export.P + $export.F * __webpack_require__(/*! ./_fails-is-regexp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails-is-regexp.js")(INCLUDES), 'String', {
8876  includes: function includes(searchString
8877  /* , position = 0 */
8878  ) {
8879    return !!~context(this, searchString, INCLUDES).indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);
8880  }
8881});
8882
8883/***/ }),
8884
vendor: 766 bytes, lines 8885-8902
8885/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.italics.js":
8886/*!*****************************************************************************************!*\
8887  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.italics.js ***!
8888  \*****************************************************************************************/
8889/*! no static exports found */
8890/***/ (function(module, exports, __webpack_require__) {
8891
8892"use strict";
8893 // B.2.3.9 String.prototype.italics()
8894
8895__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('italics', function (createHTML) {
8896  return function italics() {
8897    return createHTML(this, 'i', '', '');
8898  };
8899});
8900
8901/***/ }),
8902
vendor: 1,209 bytes, lines 8903-8938
8903/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.iterator.js":
8904/*!******************************************************************************************!*\
8905  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.iterator.js ***!
8906  \******************************************************************************************/
8907/*! no static exports found */
8908/***/ (function(module, exports, __webpack_require__) {
8909
8910"use strict";
8911
8912
8913var $at = __webpack_require__(/*! ./_string-at */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-at.js")(true); // 21.1.3.27 String.prototype[@@iterator]()
8914
8915
8916__webpack_require__(/*! ./_iter-define */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-define.js")(String, 'String', function (iterated) {
8917  this._t = String(iterated); // target
8918
8919  this._i = 0; // next index
8920  // 21.1.5.2.1 %StringIteratorPrototype%.next()
8921}, function () {
8922  var O = this._t;
8923  var index = this._i;
8924  var point;
8925  if (index >= O.length) return {
8926    value: undefined,
8927    done: true
8928  };
8929  point = $at(O, index);
8930  this._i += point.length;
8931  return {
8932    value: point,
8933    done: false
8934  };
8935});
8936
8937/***/ }),
8938
vendor: 757 bytes, lines 8939-8956
8939/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.link.js":
8940/*!**************************************************************************************!*\
8941  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.link.js ***!
8942  \**************************************************************************************/
8943/*! no static exports found */
8944/***/ (function(module, exports, __webpack_require__) {
8945
8946"use strict";
8947 // B.2.3.10 String.prototype.link(url)
8948
8949__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('link', function (createHTML) {
8950  return function link(url) {
8951    return createHTML(this, 'a', 'href', url);
8952  };
8953});
8954
8955/***/ }),
8956
vendor: 1,263 bytes, lines 8957-8989
8957/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.raw.js":
8958/*!*************************************************************************************!*\
8959  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.raw.js ***!
8960  \*************************************************************************************/
8961/*! no static exports found */
8962/***/ (function(module, exports, __webpack_require__) {
8963
8964var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
8965
8966var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js");
8967
8968var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
8969
8970$export($export.S, 'String', {
8971  // 21.1.2.4 String.raw(callSite, ...substitutions)
8972  raw: function raw(callSite) {
8973    var tpl = toIObject(callSite.raw);
8974    var len = toLength(tpl.length);
8975    var aLen = arguments.length;
8976    var res = [];
8977    var i = 0;
8978
8979    while (len > i) {
8980      res.push(String(tpl[i++]));
8981      if (i < aLen) res.push(String(arguments[i]));
8982    }
8983
8984    return res.join('');
8985  }
8986});
8987
8988/***/ }),
8989
vendor: 814 bytes, lines 8990-9005
8990/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.repeat.js":
8991/*!****************************************************************************************!*\
8992  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.repeat.js ***!
8993  \****************************************************************************************/
8994/*! no static exports found */
8995/***/ (function(module, exports, __webpack_require__) {
8996
8997var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
8998
8999$export($export.P, 'String', {
9000  // 21.1.3.13 String.prototype.repeat(count)
9001  repeat: __webpack_require__(/*! ./_string-repeat */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-repeat.js")
9002});
9003
9004/***/ }),
9005
vendor: 757 bytes, lines 9006-9023
9006/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.small.js":
9007/*!***************************************************************************************!*\
9008  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.small.js ***!
9009  \***************************************************************************************/
9010/*! no static exports found */
9011/***/ (function(module, exports, __webpack_require__) {
9012
9013"use strict";
9014 // B.2.3.11 String.prototype.small()
9015
9016__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('small', function (createHTML) {
9017  return function small() {
9018    return createHTML(this, 'small', '', '');
9019  };
9020});
9021
9022/***/ }),
9023
vendor: 1,630 bytes, lines 9024-9055
9024/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.starts-with.js":
9025/*!*********************************************************************************************!*\
9026  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.starts-with.js ***!
9027  \*********************************************************************************************/
9028/*! no static exports found */
9029/***/ (function(module, exports, __webpack_require__) {
9030
9031"use strict";
9032// 21.1.3.18 String.prototype.startsWith(searchString [, position ])
9033
9034
9035var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
9036
9037var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
9038
9039var context = __webpack_require__(/*! ./_string-context */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-context.js");
9040
9041var STARTS_WITH = 'startsWith';
9042var $startsWith = ''[STARTS_WITH];
9043$export($export.P + $export.F * __webpack_require__(/*! ./_fails-is-regexp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails-is-regexp.js")(STARTS_WITH), 'String', {
9044  startsWith: function startsWith(searchString
9045  /* , position = 0 */
9046  ) {
9047    var that = context(this, searchString, STARTS_WITH);
9048    var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));
9049    var search = String(searchString);
9050    return $startsWith ? $startsWith.call(that, search, index) : that.slice(index, index + search.length) === search;
9051  }
9052});
9053
9054/***/ }),
9055
vendor: 765 bytes, lines 9056-9073
9056/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.strike.js":
9057/*!****************************************************************************************!*\
9058  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.strike.js ***!
9059  \****************************************************************************************/
9060/*! no static exports found */
9061/***/ (function(module, exports, __webpack_require__) {
9062
9063"use strict";
9064 // B.2.3.12 String.prototype.strike()
9065
9066__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('strike', function (createHTML) {
9067  return function strike() {
9068    return createHTML(this, 'strike', '', '');
9069  };
9070});
9071
9072/***/ }),
9073
vendor: 741 bytes, lines 9074-9091
9074/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sub.js":
9075/*!*************************************************************************************!*\
9076  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sub.js ***!
9077  \*************************************************************************************/
9078/*! no static exports found */
9079/***/ (function(module, exports, __webpack_require__) {
9080
9081"use strict";
9082 // B.2.3.13 String.prototype.sub()
9083
9084__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('sub', function (createHTML) {
9085  return function sub() {
9086    return createHTML(this, 'sub', '', '');
9087  };
9088});
9089
9090/***/ }),
9091
vendor: 741 bytes, lines 9092-9109
9092/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sup.js":
9093/*!*************************************************************************************!*\
9094  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sup.js ***!
9095  \*************************************************************************************/
9096/*! no static exports found */
9097/***/ (function(module, exports, __webpack_require__) {
9098
9099"use strict";
9100 // B.2.3.14 String.prototype.sup()
9101
9102__webpack_require__(/*! ./_string-html */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js")('sup', function (createHTML) {
9103  return function sup() {
9104    return createHTML(this, 'sup', '', '');
9105  };
9106});
9107
9108/***/ }),
9109
vendor: 727 bytes, lines 9110-9127
9110/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.trim.js":
9111/*!**************************************************************************************!*\
9112  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.trim.js ***!
9113  \**************************************************************************************/
9114/*! no static exports found */
9115/***/ (function(module, exports, __webpack_require__) {
9116
9117"use strict";
9118 // 21.1.3.25 String.prototype.trim()
9119
9120__webpack_require__(/*! ./_string-trim */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js")('trim', function ($trim) {
9121  return function trim() {
9122    return $trim(this, 3);
9123  };
9124});
9125
9126/***/ }),
9127
vendor: 12,643 bytes, lines 9128-9446
9128/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.symbol.js":
9129/*!*********************************************************************************!*\
9130  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.symbol.js ***!
9131  \*********************************************************************************/
9132/*! no static exports found */
9133/***/ (function(module, exports, __webpack_require__) {
9134
9135"use strict";
9136 // ECMAScript 6 symbols shim
9137
9138function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
9139
9140var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
9141
9142var has = __webpack_require__(/*! ./_has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js");
9143
9144var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js");
9145
9146var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
9147
9148var redefine = __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js");
9149
9150var META = __webpack_require__(/*! ./_meta */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js").KEY;
9151
9152var $fails = __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js");
9153
9154var shared = __webpack_require__(/*! ./_shared */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_shared.js");
9155
9156var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js");
9157
9158var uid = __webpack_require__(/*! ./_uid */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js");
9159
9160var wks = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js");
9161
9162var wksExt = __webpack_require__(/*! ./_wks-ext */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-ext.js");
9163
9164var wksDefine = __webpack_require__(/*! ./_wks-define */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-define.js");
9165
9166var enumKeys = __webpack_require__(/*! ./_enum-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_enum-keys.js");
9167
9168var isArray = __webpack_require__(/*! ./_is-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array.js");
9169
9170var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
9171
9172var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
9173
9174var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js");
9175
9176var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js");
9177
9178var createDesc = __webpack_require__(/*! ./_property-desc */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js");
9179
9180var _create = __webpack_require__(/*! ./_object-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js");
9181
9182var gOPNExt = __webpack_require__(/*! ./_object-gopn-ext */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn-ext.js");
9183
9184var $GOPD = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js");
9185
9186var $DP = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js");
9187
9188var $keys = __webpack_require__(/*! ./_object-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js");
9189
9190var gOPD = $GOPD.f;
9191var dP = $DP.f;
9192var gOPN = gOPNExt.f;
9193var $Symbol = global.Symbol;
9194var $JSON = global.JSON;
9195
9196var _stringify = $JSON && $JSON.stringify;
9197
9198var PROTOTYPE = 'prototype';
9199var HIDDEN = wks('_hidden');
9200var TO_PRIMITIVE = wks('toPrimitive');
9201var isEnum = {}.propertyIsEnumerable;
9202var SymbolRegistry = shared('symbol-registry');
9203var AllSymbols = shared('symbols');
9204var OPSymbols = shared('op-symbols');
9205var ObjectProto = Object[PROTOTYPE];
9206var USE_NATIVE = typeof $Symbol == 'function';
9207var QObject = global.QObject; // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
9208
9209var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
9210
9211var setSymbolDesc = DESCRIPTORS && $fails(function () {
9212  return _create(dP({}, 'a', {
9213    get: function get() {
9214      return dP(this, 'a', {
9215        value: 7
9216      }).a;
9217    }
9218  })).a != 7;
9219}) ? function (it, key, D) {
9220  var protoDesc = gOPD(ObjectProto, key);
9221  if (protoDesc) delete ObjectProto[key];
9222  dP(it, key, D);
9223  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
9224} : dP;
9225
9226var wrap = function wrap(tag) {
9227  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
9228
9229  sym._k = tag;
9230  return sym;
9231};
9232
9233var isSymbol = USE_NATIVE && _typeof($Symbol.iterator) == 'symbol' ? function (it) {
9234  return _typeof(it) == 'symbol';
9235} : function (it) {
9236  return it instanceof $Symbol;
9237};
9238
9239var $defineProperty = function defineProperty(it, key, D) {
9240  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
9241  anObject(it);
9242  key = toPrimitive(key, true);
9243  anObject(D);
9244
9245  if (has(AllSymbols, key)) {
9246    if (!D.enumerable) {
9247      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
9248      it[HIDDEN][key] = true;
9249    } else {
9250      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
9251      D = _create(D, {
9252        enumerable: createDesc(0, false)
9253      });
9254    }
9255
9256    return setSymbolDesc(it, key, D);
9257  }
9258
9259  return dP(it, key, D);
9260};
9261
9262var $defineProperties = function defineProperties(it, P) {
9263  anObject(it);
9264  var keys = enumKeys(P = toIObject(P));
9265  var i = 0;
9266  var l = keys.length;
9267  var key;
9268
9269  while (l > i) {
9270    $defineProperty(it, key = keys[i++], P[key]);
9271  }
9272
9273  return it;
9274};
9275
9276var $create = function create(it, P) {
9277  return P === undefined ? _create(it) : $defineProperties(_create(it), P);
9278};
9279
9280var $propertyIsEnumerable = function propertyIsEnumerable(key) {
9281  var E = isEnum.call(this, key = toPrimitive(key, true));
9282  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
9283  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
9284};
9285
9286var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
9287  it = toIObject(it);
9288  key = toPrimitive(key, true);
9289  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
9290  var D = gOPD(it, key);
9291  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
9292  return D;
9293};
9294
9295var $getOwnPropertyNames = function getOwnPropertyNames(it) {
9296  var names = gOPN(toIObject(it));
9297  var result = [];
9298  var i = 0;
9299  var key;
9300
9301  while (names.length > i) {
9302    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
9303  }
9304
9305  return result;
9306};
9307
9308var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
9309  var IS_OP = it === ObjectProto;
9310  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
9311  var result = [];
9312  var i = 0;
9313  var key;
9314
9315  while (names.length > i) {
9316    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
9317  }
9318
9319  return result;
9320}; // 19.4.1.1 Symbol([description])
9321
9322
9323if (!USE_NATIVE) {
9324  $Symbol = function _Symbol() {
9325    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
9326    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
9327
9328    var $set = function $set(value) {
9329      if (this === ObjectProto) $set.call(OPSymbols, value);
9330      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
9331      setSymbolDesc(this, tag, createDesc(1, value));
9332    };
9333
9334    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, {
9335      configurable: true,
9336      set: $set
9337    });
9338    return wrap(tag);
9339  };
9340
9341  redefine($Symbol[PROTOTYPE], 'toString', function toString() {
9342    return this._k;
9343  });
9344  $GOPD.f = $getOwnPropertyDescriptor;
9345  $DP.f = $defineProperty;
9346  __webpack_require__(/*! ./_object-gopn */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js").f = gOPNExt.f = $getOwnPropertyNames;
9347  __webpack_require__(/*! ./_object-pie */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-pie.js").f = $propertyIsEnumerable;
9348  __webpack_require__(/*! ./_object-gops */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gops.js").f = $getOwnPropertySymbols;
9349
9350  if (DESCRIPTORS && !__webpack_require__(/*! ./_library */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js")) {
9351    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
9352  }
9353
9354  wksExt.f = function (name) {
9355    return wrap(wks(name));
9356  };
9357}
9358
9359$export($export.G + $export.W + $export.F * !USE_NATIVE, {
9360  Symbol: $Symbol
9361});
9362
9363for (var es6Symbols = // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
9364'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'.split(','), j = 0; es6Symbols.length > j;) {
9365  wks(es6Symbols[j++]);
9366}
9367
9368for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) {
9369  wksDefine(wellKnownSymbols[k++]);
9370}
9371
9372$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
9373  // 19.4.2.1 Symbol.for(key)
9374  'for': function _for(key) {
9375    return has(SymbolRegistry, key += '') ? SymbolRegistry[key] : SymbolRegistry[key] = $Symbol(key);
9376  },
9377  // 19.4.2.5 Symbol.keyFor(sym)
9378  keyFor: function keyFor(sym) {
9379    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
9380
9381    for (var key in SymbolRegistry) {
9382      if (SymbolRegistry[key] === sym) return key;
9383    }
9384  },
9385  useSetter: function useSetter() {
9386    setter = true;
9387  },
9388  useSimple: function useSimple() {
9389    setter = false;
9390  }
9391});
9392$export($export.S + $export.F * !USE_NATIVE, 'Object', {
9393  // 19.1.2.2 Object.create(O [, Properties])
9394  create: $create,
9395  // 19.1.2.4 Object.defineProperty(O, P, Attributes)
9396  defineProperty: $defineProperty,
9397  // 19.1.2.3 Object.defineProperties(O, Properties)
9398  defineProperties: $defineProperties,
9399  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
9400  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
9401  // 19.1.2.7 Object.getOwnPropertyNames(O)
9402  getOwnPropertyNames: $getOwnPropertyNames,
9403  // 19.1.2.8 Object.getOwnPropertySymbols(O)
9404  getOwnPropertySymbols: $getOwnPropertySymbols
9405}); // 24.3.2 JSON.stringify(value [, replacer [, space]])
9406
9407$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
9408  var S = $Symbol(); // MS Edge converts symbol values to JSON as {}
9409  // WebKit converts symbol values to JSON as null
9410  // V8 throws on boxed symbols
9411
9412  return _stringify([S]) != '[null]' || _stringify({
9413    a: S
9414  }) != '{}' || _stringify(Object(S)) != '{}';
9415})), 'JSON', {
9416  stringify: function stringify(it) {
9417    var args = [it];
9418    var i = 1;
9419    var replacer, $replacer;
9420
9421    while (arguments.length > i) {
9422      args.push(arguments[i++]);
9423    }
9424
9425    $replacer = replacer = args[1];
9426    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
9427
9428    if (!isArray(replacer)) replacer = function replacer(key, value) {
9429      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
9430      if (!isSymbol(value)) return value;
9431    };
9432    args[1] = replacer;
9433    return _stringify.apply($JSON, args);
9434  }
9435}); // 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
9436
9437$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js")($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf); // 19.4.3.5 Symbol.prototype[@@toStringTag]
9438
9439setToStringTag($Symbol, 'Symbol'); // 20.2.1.9 Math[@@toStringTag]
9440
9441setToStringTag(Math, 'Math', true); // 24.3.3 JSON[@@toStringTag]
9442
9443setToStringTag(global.JSON, 'JSON', true);
9444
9445/***/ }),
9446
vendor: 3,334 bytes, lines 9447-9516
9447/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.array-buffer.js":
9448/*!*********************************************************************************************!*\
9449  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.array-buffer.js ***!
9450  \*********************************************************************************************/
9451/*! no static exports found */
9452/***/ (function(module, exports, __webpack_require__) {
9453
9454"use strict";
9455
9456
9457var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
9458
9459var $typed = __webpack_require__(/*! ./_typed */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed.js");
9460
9461var buffer = __webpack_require__(/*! ./_typed-buffer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-buffer.js");
9462
9463var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
9464
9465var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js");
9466
9467var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
9468
9469var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
9470
9471var ArrayBuffer = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").ArrayBuffer;
9472
9473var speciesConstructor = __webpack_require__(/*! ./_species-constructor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_species-constructor.js");
9474
9475var $ArrayBuffer = buffer.ArrayBuffer;
9476var $DataView = buffer.DataView;
9477var $isView = $typed.ABV && ArrayBuffer.isView;
9478var $slice = $ArrayBuffer.prototype.slice;
9479var VIEW = $typed.VIEW;
9480var ARRAY_BUFFER = 'ArrayBuffer';
9481$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), {
9482  ArrayBuffer: $ArrayBuffer
9483});
9484$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {
9485  // 24.1.3.1 ArrayBuffer.isView(arg)
9486  isView: function isView(it) {
9487    return $isView && $isView(it) || isObject(it) && VIEW in it;
9488  }
9489});
9490$export($export.P + $export.U + $export.F * __webpack_require__(/*! ./_fails */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js")(function () {
9491  return !new $ArrayBuffer(2).slice(1, undefined).byteLength;
9492}), ARRAY_BUFFER, {
9493  // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)
9494  slice: function slice(start, end) {
9495    if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix
9496
9497    var len = anObject(this).byteLength;
9498    var first = toAbsoluteIndex(start, len);
9499    var fin = toAbsoluteIndex(end === undefined ? len : end, len);
9500    var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(fin - first));
9501    var viewS = new $DataView(this);
9502    var viewT = new $DataView(result);
9503    var index = 0;
9504
9505    while (first < fin) {
9506      viewT.setUint8(index++, viewS.getUint8(first++));
9507    }
9508
9509    return result;
9510  }
9511});
9512
9513__webpack_require__(/*! ./_set-species */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js")(ARRAY_BUFFER);
9514
9515/***/ }),
9516
vendor: 915 bytes, lines 9517-9531
9517/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.data-view.js":
9518/*!******************************************************************************************!*\
9519  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.data-view.js ***!
9520  \******************************************************************************************/
9521/*! no static exports found */
9522/***/ (function(module, exports, __webpack_require__) {
9523
9524var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
9525
9526$export($export.G + $export.W + $export.F * !__webpack_require__(/*! ./_typed */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed.js").ABV, {
9527  DataView: __webpack_require__(/*! ./_typed-buffer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-buffer.js").DataView
9528});
9529
9530/***/ }),
9531
vendor: 765 bytes, lines 9532-9546
9532/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float32-array.js":
9533/*!**********************************************************************************************!*\
9534  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float32-array.js ***!
9535  \**********************************************************************************************/
9536/*! no static exports found */
9537/***/ (function(module, exports, __webpack_require__) {
9538
9539__webpack_require__(/*! ./_typed-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js")('Float32', 4, function (init) {
9540  return function Float32Array(data, byteOffset, length) {
9541    return init(this, data, byteOffset, length);
9542  };
9543});
9544
9545/***/ }),
9546
vendor: 765 bytes, lines 9547-9561
9547/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float64-array.js":
9548/*!**********************************************************************************************!*\
9549  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float64-array.js ***!
9550  \**********************************************************************************************/
9551/*! no static exports found */
9552/***/ (function(module, exports, __webpack_require__) {
9553
9554__webpack_require__(/*! ./_typed-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js")('Float64', 8, function (init) {
9555  return function Float64Array(data, byteOffset, length) {
9556    return init(this, data, byteOffset, length);
9557  };
9558});
9559
9560/***/ }),
9561
vendor: 753 bytes, lines 9562-9576
9562/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int16-array.js":
9563/*!********************************************************************************************!*\
9564  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int16-array.js ***!
9565  \********************************************************************************************/
9566/*! no static exports found */
9567/***/ (function(module, exports, __webpack_require__) {
9568
9569__webpack_require__(/*! ./_typed-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js")('Int16', 2, function (init) {
9570  return function Int16Array(data, byteOffset, length) {
9571    return init(this, data, byteOffset, length);
9572  };
9573});
9574
9575/***/ }),
9576
vendor: 753 bytes, lines 9577-9591
9577/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int32-array.js":
9578/*!********************************************************************************************!*\
9579  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int32-array.js ***!
9580  \********************************************************************************************/
9581/*! no static exports found */
9582/***/ (function(module, exports, __webpack_require__) {
9583
9584__webpack_require__(/*! ./_typed-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js")('Int32', 4, function (init) {
9585  return function Int32Array(data, byteOffset, length) {
9586    return init(this, data, byteOffset, length);
9587  };
9588});
9589
9590/***/ }),
9591
vendor: 747 bytes, lines 9592-9606
9592/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int8-array.js":
9593/*!*******************************************************************************************!*\
9594  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int8-array.js ***!
9595  \*******************************************************************************************/
9596/*! no static exports found */
9597/***/ (function(module, exports, __webpack_require__) {
9598
9599__webpack_require__(/*! ./_typed-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js")('Int8', 1, function (init) {
9600  return function Int8Array(data, byteOffset, length) {
9601    return init(this, data, byteOffset, length);
9602  };
9603});
9604
9605/***/ }),
9606
vendor: 759 bytes, lines 9607-9621
9607/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint16-array.js":
9608/*!*********************************************************************************************!*\
9609  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint16-array.js ***!
9610  \*********************************************************************************************/
9611/*! no static exports found */
9612/***/ (function(module, exports, __webpack_require__) {
9613
9614__webpack_require__(/*! ./_typed-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js")('Uint16', 2, function (init) {
9615  return function Uint16Array(data, byteOffset, length) {
9616    return init(this, data, byteOffset, length);
9617  };
9618});
9619
9620/***/ }),
9621
vendor: 759 bytes, lines 9622-9636
9622/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint32-array.js":
9623/*!*********************************************************************************************!*\
9624  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint32-array.js ***!
9625  \*********************************************************************************************/
9626/*! no static exports found */
9627/***/ (function(module, exports, __webpack_require__) {
9628
9629__webpack_require__(/*! ./_typed-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js")('Uint32', 4, function (init) {
9630  return function Uint32Array(data, byteOffset, length) {
9631    return init(this, data, byteOffset, length);
9632  };
9633});
9634
9635/***/ }),
9636
vendor: 753 bytes, lines 9637-9651
9637/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-array.js":
9638/*!********************************************************************************************!*\
9639  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-array.js ***!
9640  \********************************************************************************************/
9641/*! no static exports found */
9642/***/ (function(module, exports, __webpack_require__) {
9643
9644__webpack_require__(/*! ./_typed-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js")('Uint8', 1, function (init) {
9645  return function Uint8Array(data, byteOffset, length) {
9646    return init(this, data, byteOffset, length);
9647  };
9648});
9649
9650/***/ }),
9651
vendor: 798 bytes, lines 9652-9666
9652/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-clamped-array.js":
9653/*!****************************************************************************************************!*\
9654  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-clamped-array.js ***!
9655  \****************************************************************************************************/
9656/*! no static exports found */
9657/***/ (function(module, exports, __webpack_require__) {
9658
9659__webpack_require__(/*! ./_typed-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js")('Uint8', 1, function (init) {
9660  return function Uint8ClampedArray(data, byteOffset, length) {
9661    return init(this, data, byteOffset, length);
9662  };
9663}, true);
9664
9665/***/ }),
9666
vendor: 3,433 bytes, lines 9667-9749
9667/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-map.js":
9668/*!***********************************************************************************!*\
9669  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-map.js ***!
9670  \***********************************************************************************/
9671/*! no static exports found */
9672/***/ (function(module, exports, __webpack_require__) {
9673
9674"use strict";
9675
9676
9677var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
9678
9679var each = __webpack_require__(/*! ./_array-methods */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js")(0);
9680
9681var redefine = __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js");
9682
9683var meta = __webpack_require__(/*! ./_meta */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js");
9684
9685var assign = __webpack_require__(/*! ./_object-assign */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-assign.js");
9686
9687var weak = __webpack_require__(/*! ./_collection-weak */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-weak.js");
9688
9689var isObject = __webpack_require__(/*! ./_is-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js");
9690
9691var validate = __webpack_require__(/*! ./_validate-collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js");
9692
9693var NATIVE_WEAK_MAP = __webpack_require__(/*! ./_validate-collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js");
9694
9695var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;
9696var WEAK_MAP = 'WeakMap';
9697var getWeak = meta.getWeak;
9698var isExtensible = Object.isExtensible;
9699var uncaughtFrozenStore = weak.ufstore;
9700var InternalMap;
9701
9702var wrapper = function wrapper(get) {
9703  return function WeakMap() {
9704    return get(this, arguments.length > 0 ? arguments[0] : undefined);
9705  };
9706};
9707
9708var methods = {
9709  // 23.3.3.3 WeakMap.prototype.get(key)
9710  get: function get(key) {
9711    if (isObject(key)) {
9712      var data = getWeak(key);
9713      if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);
9714      return data ? data[this._i] : undefined;
9715    }
9716  },
9717  // 23.3.3.5 WeakMap.prototype.set(key, value)
9718  set: function set(key, value) {
9719    return weak.def(validate(this, WEAK_MAP), key, value);
9720  }
9721}; // 23.3 WeakMap Objects
9722
9723var $WeakMap = module.exports = __webpack_require__(/*! ./_collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection.js")(WEAK_MAP, wrapper, methods, weak, true, true); // IE11 WeakMap frozen keys fix
9724
9725
9726if (NATIVE_WEAK_MAP && IS_IE11) {
9727  InternalMap = weak.getConstructor(wrapper, WEAK_MAP);
9728  assign(InternalMap.prototype, methods);
9729  meta.NEED = true;
9730  each(['delete', 'has', 'get', 'set'], function (key) {
9731    var proto = $WeakMap.prototype;
9732    var method = proto[key];
9733    redefine(proto, key, function (a, b) {
9734      // store frozen objects on internal weakmap shim
9735      if (isObject(a) && !isExtensible(a)) {
9736        if (!this._f) this._f = new InternalMap();
9737
9738        var result = this._f[key](a, b);
9739
9740        return key == 'set' ? this : result; // store all the rest on native weakmap
9741      }
9742
9743      return method.call(this, a, b);
9744    });
9745  });
9746}
9747
9748/***/ }),
9749
vendor: 1,230 bytes, lines 9750-9778
9750/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-set.js":
9751/*!***********************************************************************************!*\
9752  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-set.js ***!
9753  \***********************************************************************************/
9754/*! no static exports found */
9755/***/ (function(module, exports, __webpack_require__) {
9756
9757"use strict";
9758
9759
9760var weak = __webpack_require__(/*! ./_collection-weak */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-weak.js");
9761
9762var validate = __webpack_require__(/*! ./_validate-collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js");
9763
9764var WEAK_SET = 'WeakSet'; // 23.4 WeakSet Objects
9765
9766__webpack_require__(/*! ./_collection */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection.js")(WEAK_SET, function (get) {
9767  return function WeakSet() {
9768    return get(this, arguments.length > 0 ? arguments[0] : undefined);
9769  };
9770}, {
9771  // 23.4.3.1 WeakSet.prototype.add(value)
9772  add: function add(value) {
9773    return weak.def(validate(this, WEAK_SET), value, true);
9774  }
9775}, weak, false, true);
9776
9777/***/ }),
9778
vendor: 1,905 bytes, lines 9779-9818
9779/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flat-map.js":
9780/*!*****************************************************************************************!*\
9781  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flat-map.js ***!
9782  \*****************************************************************************************/
9783/*! no static exports found */
9784/***/ (function(module, exports, __webpack_require__) {
9785
9786"use strict";
9787 // https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatMap
9788
9789var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
9790
9791var flattenIntoArray = __webpack_require__(/*! ./_flatten-into-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_flatten-into-array.js");
9792
9793var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js");
9794
9795var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
9796
9797var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js");
9798
9799var arraySpeciesCreate = __webpack_require__(/*! ./_array-species-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-create.js");
9800
9801$export($export.P, 'Array', {
9802  flatMap: function flatMap(callbackfn
9803  /* , thisArg */
9804  ) {
9805    var O = toObject(this);
9806    var sourceLen, A;
9807    aFunction(callbackfn);
9808    sourceLen = toLength(O.length);
9809    A = arraySpeciesCreate(O, 0);
9810    flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments[1]);
9811    return A;
9812  }
9813});
9814
9815__webpack_require__(/*! ./_add-to-unscopables */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js")('flatMap');
9816
9817/***/ }),
9818
vendor: 1,906 bytes, lines 9819-9857
9819/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flatten.js":
9820/*!****************************************************************************************!*\
9821  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flatten.js ***!
9822  \****************************************************************************************/
9823/*! no static exports found */
9824/***/ (function(module, exports, __webpack_require__) {
9825
9826"use strict";
9827 // https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatten
9828
9829var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
9830
9831var flattenIntoArray = __webpack_require__(/*! ./_flatten-into-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_flatten-into-array.js");
9832
9833var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js");
9834
9835var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
9836
9837var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js");
9838
9839var arraySpeciesCreate = __webpack_require__(/*! ./_array-species-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-create.js");
9840
9841$export($export.P, 'Array', {
9842  flatten: function flatten()
9843  /* depthArg = 1 */
9844  {
9845    var depthArg = arguments[0];
9846    var O = toObject(this);
9847    var sourceLen = toLength(O.length);
9848    var A = arraySpeciesCreate(O, 0);
9849    flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toInteger(depthArg));
9850    return A;
9851  }
9852});
9853
9854__webpack_require__(/*! ./_add-to-unscopables */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js")('flatten');
9855
9856/***/ }),
9857
vendor: 1,152 bytes, lines 9858-9883
9858/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.includes.js":
9859/*!*****************************************************************************************!*\
9860  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.includes.js ***!
9861  \*****************************************************************************************/
9862/*! no static exports found */
9863/***/ (function(module, exports, __webpack_require__) {
9864
9865"use strict";
9866 // https://github.com/tc39/Array.prototype.includes
9867
9868var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
9869
9870var $includes = __webpack_require__(/*! ./_array-includes */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-includes.js")(true);
9871
9872$export($export.P, 'Array', {
9873  includes: function includes(el
9874  /* , fromIndex = 0 */
9875  ) {
9876    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
9877  }
9878});
9879
9880__webpack_require__(/*! ./_add-to-unscopables */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js")('includes');
9881
9882/***/ }),
9883
vendor: 1,239 bytes, lines 9884-9907
9884/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.asap.js":
9885/*!*******************************************************************************!*\
9886  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.asap.js ***!
9887  \*******************************************************************************/
9888/*! no static exports found */
9889/***/ (function(module, exports, __webpack_require__) {
9890
9891// https://github.com/rwaldron/tc39-notes/blob/master/es6/2014-09/sept-25.md#510-globalasap-for-enqueuing-a-microtask
9892var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
9893
9894var microtask = __webpack_require__(/*! ./_microtask */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_microtask.js")();
9895
9896var process = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js").process;
9897
9898var isNode = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js")(process) == 'process';
9899$export($export.G, {
9900  asap: function asap(fn) {
9901    var domain = isNode && process.domain;
9902    microtask(domain ? domain.bind(fn) : fn);
9903  }
9904});
9905
9906/***/ }),
9907
vendor: 870 bytes, lines 9908-9927
9908/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.error.is-error.js":
9909/*!*****************************************************************************************!*\
9910  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.error.is-error.js ***!
9911  \*****************************************************************************************/
9912/*! no static exports found */
9913/***/ (function(module, exports, __webpack_require__) {
9914
9915// https://github.com/ljharb/proposal-is-error
9916var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
9917
9918var cof = __webpack_require__(/*! ./_cof */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js");
9919
9920$export($export.S, 'Error', {
9921  isError: function isError(it) {
9922    return cof(it) === 'Error';
9923  }
9924});
9925
9926/***/ }),
9927
vendor: 759 bytes, lines 9928-9943
9928/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.global.js":
9929/*!*********************************************************************************!*\
9930  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.global.js ***!
9931  \*********************************************************************************/
9932/*! no static exports found */
9933/***/ (function(module, exports, __webpack_require__) {
9934
9935// https://github.com/tc39/proposal-global
9936var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
9937
9938$export($export.G, {
9939  global: __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js")
9940});
9941
9942/***/ }),
9943
vendor: 659 bytes, lines 9944-9955
9944/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.from.js":
9945/*!***********************************************************************************!*\
9946  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.from.js ***!
9947  \***********************************************************************************/
9948/*! no static exports found */
9949/***/ (function(module, exports, __webpack_require__) {
9950
9951// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from
9952__webpack_require__(/*! ./_set-collection-from */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-from.js")('Map');
9953
9954/***/ }),
9955
vendor: 645 bytes, lines 9956-9967
9956/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.of.js":
9957/*!*********************************************************************************!*\
9958  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.of.js ***!
9959  \*********************************************************************************/
9960/*! no static exports found */
9961/***/ (function(module, exports, __webpack_require__) {
9962
9963// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of
9964__webpack_require__(/*! ./_set-collection-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-of.js")('Map');
9965
9966/***/ }),
9967
vendor: 845 bytes, lines 9968-9983
9968/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.to-json.js":
9969/*!**************************************************************************************!*\
9970  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.to-json.js ***!
9971  \**************************************************************************************/
9972/*! no static exports found */
9973/***/ (function(module, exports, __webpack_require__) {
9974
9975// https://github.com/DavidBruant/Map-Set.prototype.toJSON
9976var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
9977
9978$export($export.P + $export.R, 'Map', {
9979  toJSON: __webpack_require__(/*! ./_collection-to-json */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-to-json.js")('Map')
9980});
9981
9982/***/ }),
9983
vendor: 770 bytes, lines 9984-10001
9984/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.clamp.js":
9985/*!*************************************************************************************!*\
9986  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.clamp.js ***!
9987  \*************************************************************************************/
9988/*! no static exports found */
9989/***/ (function(module, exports, __webpack_require__) {
9990
9991// https://rwaldron.github.io/proposal-math-extensions/
9992var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
9993
9994$export($export.S, 'Math', {
9995  clamp: function clamp(x, lower, upper) {
9996    return Math.min(upper, Math.max(lower, x));
9997  }
9998});
9999
10000/***/ }),
10001
vendor: 728 bytes, lines 10002-10017
10002/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.deg-per-rad.js":
10003/*!*******************************************************************************************!*\
10004  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.deg-per-rad.js ***!
10005  \*******************************************************************************************/
10006/*! no static exports found */
10007/***/ (function(module, exports, __webpack_require__) {
10008
10009// https://rwaldron.github.io/proposal-math-extensions/
10010var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10011
10012$export($export.S, 'Math', {
10013  DEG_PER_RAD: Math.PI / 180
10014});
10015
10016/***/ }),
10017
vendor: 793 bytes, lines 10018-10036
10018/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.degrees.js":
10019/*!***************************************************************************************!*\
10020  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.degrees.js ***!
10021  \***************************************************************************************/
10022/*! no static exports found */
10023/***/ (function(module, exports, __webpack_require__) {
10024
10025// https://rwaldron.github.io/proposal-math-extensions/
10026var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10027
10028var RAD_PER_DEG = 180 / Math.PI;
10029$export($export.S, 'Math', {
10030  degrees: function degrees(radians) {
10031    return radians * RAD_PER_DEG;
10032  }
10033});
10034
10035/***/ }),
10036
vendor: 1,076 bytes, lines 10037-10058
10037/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.fscale.js":
10038/*!**************************************************************************************!*\
10039  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.fscale.js ***!
10040  \**************************************************************************************/
10041/*! no static exports found */
10042/***/ (function(module, exports, __webpack_require__) {
10043
10044// https://rwaldron.github.io/proposal-math-extensions/
10045var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10046
10047var scale = __webpack_require__(/*! ./_math-scale */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-scale.js");
10048
10049var fround = __webpack_require__(/*! ./_math-fround */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-fround.js");
10050
10051$export($export.S, 'Math', {
10052  fscale: function fscale(x, inLow, inHigh, outLow, outHigh) {
10053    return fround(scale(x, inLow, inHigh, outLow, outHigh));
10054  }
10055});
10056
10057/***/ }),
10058
vendor: 888 bytes, lines 10059-10079
10059/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.iaddh.js":
10060/*!*************************************************************************************!*\
10061  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.iaddh.js ***!
10062  \*************************************************************************************/
10063/*! no static exports found */
10064/***/ (function(module, exports, __webpack_require__) {
10065
10066// https://gist.github.com/BrendanEich/4294d5c212a6d2254703
10067var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10068
10069$export($export.S, 'Math', {
10070  iaddh: function iaddh(x0, x1, y0, y1) {
10071    var $x0 = x0 >>> 0;
10072    var $x1 = x1 >>> 0;
10073    var $y0 = y0 >>> 0;
10074    return $x1 + (y1 >>> 0) + (($x0 & $y0 | ($x0 | $y0) & ~($x0 + $y0 >>> 0)) >>> 31) | 0;
10075  }
10076});
10077
10078/***/ }),
10079
vendor: 993 bytes, lines 10080-10105
10080/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.imulh.js":
10081/*!*************************************************************************************!*\
10082  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.imulh.js ***!
10083  \*************************************************************************************/
10084/*! no static exports found */
10085/***/ (function(module, exports, __webpack_require__) {
10086
10087// https://gist.github.com/BrendanEich/4294d5c212a6d2254703
10088var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10089
10090$export($export.S, 'Math', {
10091  imulh: function imulh(u, v) {
10092    var UINT16 = 0xffff;
10093    var $u = +u;
10094    var $v = +v;
10095    var u0 = $u & UINT16;
10096    var v0 = $v & UINT16;
10097    var u1 = $u >> 16;
10098    var v1 = $v >> 16;
10099    var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);
10100    return u1 * v1 + (t >> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >> 16);
10101  }
10102});
10103
10104/***/ }),
10105
vendor: 887 bytes, lines 10106-10126
10106/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.isubh.js":
10107/*!*************************************************************************************!*\
10108  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.isubh.js ***!
10109  \*************************************************************************************/
10110/*! no static exports found */
10111/***/ (function(module, exports, __webpack_require__) {
10112
10113// https://gist.github.com/BrendanEich/4294d5c212a6d2254703
10114var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10115
10116$export($export.S, 'Math', {
10117  isubh: function isubh(x0, x1, y0, y1) {
10118    var $x0 = x0 >>> 0;
10119    var $x1 = x1 >>> 0;
10120    var $y0 = y0 >>> 0;
10121    return $x1 - (y1 >>> 0) - ((~$x0 & $y0 | ~($x0 ^ $y0) & $x0 - $y0 >>> 0) >>> 31) | 0;
10122  }
10123});
10124
10125/***/ }),
10126
vendor: 728 bytes, lines 10127-10142
10127/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.rad-per-deg.js":
10128/*!*******************************************************************************************!*\
10129  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.rad-per-deg.js ***!
10130  \*******************************************************************************************/
10131/*! no static exports found */
10132/***/ (function(module, exports, __webpack_require__) {
10133
10134// https://rwaldron.github.io/proposal-math-extensions/
10135var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10136
10137$export($export.S, 'Math', {
10138  RAD_PER_DEG: 180 / Math.PI
10139});
10140
10141/***/ }),
10142
vendor: 793 bytes, lines 10143-10161
10143/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.radians.js":
10144/*!***************************************************************************************!*\
10145  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.radians.js ***!
10146  \***************************************************************************************/
10147/*! no static exports found */
10148/***/ (function(module, exports, __webpack_require__) {
10149
10150// https://rwaldron.github.io/proposal-math-extensions/
10151var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10152
10153var DEG_PER_RAD = Math.PI / 180;
10154$export($export.S, 'Math', {
10155  radians: function radians(degrees) {
10156    return degrees * DEG_PER_RAD;
10157  }
10158});
10159
10160/***/ }),
10161
vendor: 803 bytes, lines 10162-10177
10162/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.scale.js":
10163/*!*************************************************************************************!*\
10164  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.scale.js ***!
10165  \*************************************************************************************/
10166/*! no static exports found */
10167/***/ (function(module, exports, __webpack_require__) {
10168
10169// https://rwaldron.github.io/proposal-math-extensions/
10170var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10171
10172$export($export.S, 'Math', {
10173  scale: __webpack_require__(/*! ./_math-scale */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_math-scale.js")
10174});
10175
10176/***/ }),
10177
vendor: 834 bytes, lines 10178-10196
10178/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.signbit.js":
10179/*!***************************************************************************************!*\
10180  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.signbit.js ***!
10181  \***************************************************************************************/
10182/*! no static exports found */
10183/***/ (function(module, exports, __webpack_require__) {
10184
10185// http://jfbastien.github.io/papers/Math.signbit.html
10186var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10187
10188$export($export.S, 'Math', {
10189  signbit: function signbit(x) {
10190    // eslint-disable-next-line no-self-compare
10191    return (x = +x) != x ? x : x == 0 ? 1 / x == Infinity : x > 0;
10192  }
10193});
10194
10195/***/ }),
10196
vendor: 997 bytes, lines 10197-10222
10197/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.umulh.js":
10198/*!*************************************************************************************!*\
10199  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.umulh.js ***!
10200  \*************************************************************************************/
10201/*! no static exports found */
10202/***/ (function(module, exports, __webpack_require__) {
10203
10204// https://gist.github.com/BrendanEich/4294d5c212a6d2254703
10205var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10206
10207$export($export.S, 'Math', {
10208  umulh: function umulh(u, v) {
10209    var UINT16 = 0xffff;
10210    var $u = +u;
10211    var $v = +v;
10212    var u0 = $u & UINT16;
10213    var v0 = $v & UINT16;
10214    var u1 = $u >>> 16;
10215    var v1 = $v >>> 16;
10216    var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);
10217    return u1 * v1 + (t >>> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >>> 16);
10218  }
10219});
10220
10221/***/ }),
10222
vendor: 1,598 bytes, lines 10223-10253
10223/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-getter.js":
10224/*!***********************************************************************************************!*\
10225  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-getter.js ***!
10226  \***********************************************************************************************/
10227/*! no static exports found */
10228/***/ (function(module, exports, __webpack_require__) {
10229
10230"use strict";
10231
10232
10233var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10234
10235var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js");
10236
10237var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js");
10238
10239var $defineProperty = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js"); // B.2.2.2 Object.prototype.__defineGetter__(P, getter)
10240
10241
10242__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") && $export($export.P + __webpack_require__(/*! ./_object-forced-pam */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-forced-pam.js"), 'Object', {
10243  __defineGetter__: function __defineGetter__(P, getter) {
10244    $defineProperty.f(toObject(this), P, {
10245      get: aFunction(getter),
10246      enumerable: true,
10247      configurable: true
10248    });
10249  }
10250});
10251
10252/***/ }),
10253
vendor: 1,598 bytes, lines 10254-10284
10254/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-setter.js":
10255/*!***********************************************************************************************!*\
10256  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-setter.js ***!
10257  \***********************************************************************************************/
10258/*! no static exports found */
10259/***/ (function(module, exports, __webpack_require__) {
10260
10261"use strict";
10262
10263
10264var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10265
10266var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js");
10267
10268var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js");
10269
10270var $defineProperty = __webpack_require__(/*! ./_object-dp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js"); // B.2.2.3 Object.prototype.__defineSetter__(P, setter)
10271
10272
10273__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") && $export($export.P + __webpack_require__(/*! ./_object-forced-pam */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-forced-pam.js"), 'Object', {
10274  __defineSetter__: function __defineSetter__(P, setter) {
10275    $defineProperty.f(toObject(this), P, {
10276      set: aFunction(setter),
10277      enumerable: true,
10278      configurable: true
10279    });
10280  }
10281});
10282
10283/***/ }),
10284
vendor: 910 bytes, lines 10285-10304
10285/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.entries.js":
10286/*!*****************************************************************************************!*\
10287  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.entries.js ***!
10288  \*****************************************************************************************/
10289/*! no static exports found */
10290/***/ (function(module, exports, __webpack_require__) {
10291
10292// https://github.com/tc39/proposal-object-values-entries
10293var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10294
10295var $entries = __webpack_require__(/*! ./_object-to-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-to-array.js")(true);
10296
10297$export($export.S, 'Object', {
10298  entries: function entries(it) {
10299    return $entries(it);
10300  }
10301});
10302
10303/***/ }),
10304
vendor: 1,725 bytes, lines 10305-10342
10305/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.get-own-property-descriptors.js":
10306/*!**************************************************************************************************************!*\
10307  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.get-own-property-descriptors.js ***!
10308  \**************************************************************************************************************/
10309/*! no static exports found */
10310/***/ (function(module, exports, __webpack_require__) {
10311
10312// https://github.com/tc39/proposal-object-getownpropertydescriptors
10313var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10314
10315var ownKeys = __webpack_require__(/*! ./_own-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_own-keys.js");
10316
10317var toIObject = __webpack_require__(/*! ./_to-iobject */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js");
10318
10319var gOPD = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js");
10320
10321var createProperty = __webpack_require__(/*! ./_create-property */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_create-property.js");
10322
10323$export($export.S, 'Object', {
10324  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {
10325    var O = toIObject(object);
10326    var getDesc = gOPD.f;
10327    var keys = ownKeys(O);
10328    var result = {};
10329    var i = 0;
10330    var key, desc;
10331
10332    while (keys.length > i) {
10333      desc = getDesc(O, key = keys[i++]);
10334      if (desc !== undefined) createProperty(result, key, desc);
10335    }
10336
10337    return result;
10338  }
10339});
10340
10341/***/ }),
10342
vendor: 1,795 bytes, lines 10343-10377
10343/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-getter.js":
10344/*!***********************************************************************************************!*\
10345  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-getter.js ***!
10346  \***********************************************************************************************/
10347/*! no static exports found */
10348/***/ (function(module, exports, __webpack_require__) {
10349
10350"use strict";
10351
10352
10353var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10354
10355var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js");
10356
10357var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js");
10358
10359var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js");
10360
10361var getOwnPropertyDescriptor = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js").f; // B.2.2.4 Object.prototype.__lookupGetter__(P)
10362
10363
10364__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") && $export($export.P + __webpack_require__(/*! ./_object-forced-pam */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-forced-pam.js"), 'Object', {
10365  __lookupGetter__: function __lookupGetter__(P) {
10366    var O = toObject(this);
10367    var K = toPrimitive(P, true);
10368    var D;
10369
10370    do {
10371      if (D = getOwnPropertyDescriptor(O, K)) return D.get;
10372    } while (O = getPrototypeOf(O));
10373  }
10374});
10375
10376/***/ }),
10377
vendor: 1,795 bytes, lines 10378-10412
10378/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-setter.js":
10379/*!***********************************************************************************************!*\
10380  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-setter.js ***!
10381  \***********************************************************************************************/
10382/*! no static exports found */
10383/***/ (function(module, exports, __webpack_require__) {
10384
10385"use strict";
10386
10387
10388var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10389
10390var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js");
10391
10392var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js");
10393
10394var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js");
10395
10396var getOwnPropertyDescriptor = __webpack_require__(/*! ./_object-gopd */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js").f; // B.2.2.5 Object.prototype.__lookupSetter__(P)
10397
10398
10399__webpack_require__(/*! ./_descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js") && $export($export.P + __webpack_require__(/*! ./_object-forced-pam */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-forced-pam.js"), 'Object', {
10400  __lookupSetter__: function __lookupSetter__(P) {
10401    var O = toObject(this);
10402    var K = toPrimitive(P, true);
10403    var D;
10404
10405    do {
10406      if (D = getOwnPropertyDescriptor(O, K)) return D.set;
10407    } while (O = getPrototypeOf(O));
10408  }
10409});
10410
10411/***/ }),
10412
vendor: 903 bytes, lines 10413-10432
10413/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.values.js":
10414/*!****************************************************************************************!*\
10415  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.values.js ***!
10416  \****************************************************************************************/
10417/*! no static exports found */
10418/***/ (function(module, exports, __webpack_require__) {
10419
10420// https://github.com/tc39/proposal-object-values-entries
10421var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10422
10423var $values = __webpack_require__(/*! ./_object-to-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-to-array.js")(false);
10424
10425$export($export.S, 'Object', {
10426  values: function values(it) {
10427    return $values(it);
10428  }
10429});
10430
10431/***/ }),
10432
vendor: 7,298 bytes, lines 10433-10684
10433/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.observable.js":
10434/*!*************************************************************************************!*\
10435  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.observable.js ***!
10436  \*************************************************************************************/
10437/*! no static exports found */
10438/***/ (function(module, exports, __webpack_require__) {
10439
10440"use strict";
10441 // https://github.com/zenparsing/es-observable
10442
10443var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10444
10445var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
10446
10447var core = __webpack_require__(/*! ./_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js");
10448
10449var microtask = __webpack_require__(/*! ./_microtask */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_microtask.js")();
10450
10451var OBSERVABLE = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js")('observable');
10452
10453var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js");
10454
10455var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
10456
10457var anInstance = __webpack_require__(/*! ./_an-instance */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js");
10458
10459var redefineAll = __webpack_require__(/*! ./_redefine-all */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js");
10460
10461var hide = __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js");
10462
10463var forOf = __webpack_require__(/*! ./_for-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js");
10464
10465var RETURN = forOf.RETURN;
10466
10467var getMethod = function getMethod(fn) {
10468  return fn == null ? undefined : aFunction(fn);
10469};
10470
10471var cleanupSubscription = function cleanupSubscription(subscription) {
10472  var cleanup = subscription._c;
10473
10474  if (cleanup) {
10475    subscription._c = undefined;
10476    cleanup();
10477  }
10478};
10479
10480var subscriptionClosed = function subscriptionClosed(subscription) {
10481  return subscription._o === undefined;
10482};
10483
10484var closeSubscription = function closeSubscription(subscription) {
10485  if (!subscriptionClosed(subscription)) {
10486    subscription._o = undefined;
10487    cleanupSubscription(subscription);
10488  }
10489};
10490
10491var Subscription = function Subscription(observer, subscriber) {
10492  anObject(observer);
10493  this._c = undefined;
10494  this._o = observer;
10495  observer = new SubscriptionObserver(this);
10496
10497  try {
10498    var cleanup = subscriber(observer);
10499    var subscription = cleanup;
10500
10501    if (cleanup != null) {
10502      if (typeof cleanup.unsubscribe === 'function') cleanup = function cleanup() {
10503        subscription.unsubscribe();
10504      };else aFunction(cleanup);
10505      this._c = cleanup;
10506    }
10507  } catch (e) {
10508    observer.error(e);
10509    return;
10510  }
10511
10512  if (subscriptionClosed(this)) cleanupSubscription(this);
10513};
10514
10515Subscription.prototype = redefineAll({}, {
10516  unsubscribe: function unsubscribe() {
10517    closeSubscription(this);
10518  }
10519});
10520
10521var SubscriptionObserver = function SubscriptionObserver(subscription) {
10522  this._s = subscription;
10523};
10524
10525SubscriptionObserver.prototype = redefineAll({}, {
10526  next: function next(value) {
10527    var subscription = this._s;
10528
10529    if (!subscriptionClosed(subscription)) {
10530      var observer = subscription._o;
10531
10532      try {
10533        var m = getMethod(observer.next);
10534        if (m) return m.call(observer, value);
10535      } catch (e) {
10536        try {
10537          closeSubscription(subscription);
10538        } finally {
10539          throw e;
10540        }
10541      }
10542    }
10543  },
10544  error: function error(value) {
10545    var subscription = this._s;
10546    if (subscriptionClosed(subscription)) throw value;
10547    var observer = subscription._o;
10548    subscription._o = undefined;
10549
10550    try {
10551      var m = getMethod(observer.error);
10552      if (!m) throw value;
10553      value = m.call(observer, value);
10554    } catch (e) {
10555      try {
10556        cleanupSubscription(subscription);
10557      } finally {
10558        throw e;
10559      }
10560    }
10561
10562    cleanupSubscription(subscription);
10563    return value;
10564  },
10565  complete: function complete(value) {
10566    var subscription = this._s;
10567
10568    if (!subscriptionClosed(subscription)) {
10569      var observer = subscription._o;
10570      subscription._o = undefined;
10571
10572      try {
10573        var m = getMethod(observer.complete);
10574        value = m ? m.call(observer, value) : undefined;
10575      } catch (e) {
10576        try {
10577          cleanupSubscription(subscription);
10578        } finally {
10579          throw e;
10580        }
10581      }
10582
10583      cleanupSubscription(subscription);
10584      return value;
10585    }
10586  }
10587});
10588
10589var $Observable = function Observable(subscriber) {
10590  anInstance(this, $Observable, 'Observable', '_f')._f = aFunction(subscriber);
10591};
10592
10593redefineAll($Observable.prototype, {
10594  subscribe: function subscribe(observer) {
10595    return new Subscription(observer, this._f);
10596  },
10597  forEach: function forEach(fn) {
10598    var that = this;
10599    return new (core.Promise || global.Promise)(function (resolve, reject) {
10600      aFunction(fn);
10601      var subscription = that.subscribe({
10602        next: function next(value) {
10603          try {
10604            return fn(value);
10605          } catch (e) {
10606            reject(e);
10607            subscription.unsubscribe();
10608          }
10609        },
10610        error: reject,
10611        complete: resolve
10612      });
10613    });
10614  }
10615});
10616redefineAll($Observable, {
10617  from: function from(x) {
10618    var C = typeof this === 'function' ? this : $Observable;
10619    var method = getMethod(anObject(x)[OBSERVABLE]);
10620
10621    if (method) {
10622      var observable = anObject(method.call(x));
10623      return observable.constructor === C ? observable : new C(function (observer) {
10624        return observable.subscribe(observer);
10625      });
10626    }
10627
10628    return new C(function (observer) {
10629      var done = false;
10630      microtask(function () {
10631        if (!done) {
10632          try {
10633            if (forOf(x, false, function (it) {
10634              observer.next(it);
10635              if (done) return RETURN;
10636            }) === RETURN) return;
10637          } catch (e) {
10638            if (done) throw e;
10639            observer.error(e);
10640            return;
10641          }
10642
10643          observer.complete();
10644        }
10645      });
10646      return function () {
10647        done = true;
10648      };
10649    });
10650  },
10651  of: function of() {
10652    for (var i = 0, l = arguments.length, items = new Array(l); i < l;) {
10653      items[i] = arguments[i++];
10654    }
10655
10656    return new (typeof this === 'function' ? this : $Observable)(function (observer) {
10657      var done = false;
10658      microtask(function () {
10659        if (!done) {
10660          for (var j = 0; j < items.length; ++j) {
10661            observer.next(items[j]);
10662            if (done) return;
10663          }
10664
10665          observer.complete();
10666        }
10667      });
10668      return function () {
10669        done = true;
10670      };
10671    });
10672  }
10673});
10674hide($Observable.prototype, OBSERVABLE, function () {
10675  return this;
10676});
10677$export($export.G, {
10678  Observable: $Observable
10679});
10680
10681__webpack_require__(/*! ./_set-species */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js")('Observable');
10682
10683/***/ }),
10684
vendor: 1,752 bytes, lines 10685-10723
10685/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.finally.js":
10686/*!******************************************************************************************!*\
10687  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.finally.js ***!
10688  \******************************************************************************************/
10689/*! no static exports found */
10690/***/ (function(module, exports, __webpack_require__) {
10691
10692"use strict";
10693// https://github.com/tc39/proposal-promise-finally
10694
10695
10696var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10697
10698var core = __webpack_require__(/*! ./_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js");
10699
10700var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
10701
10702var speciesConstructor = __webpack_require__(/*! ./_species-constructor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_species-constructor.js");
10703
10704var promiseResolve = __webpack_require__(/*! ./_promise-resolve */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_promise-resolve.js");
10705
10706$export($export.P + $export.R, 'Promise', {
10707  'finally': function _finally(onFinally) {
10708    var C = speciesConstructor(this, core.Promise || global.Promise);
10709    var isFunction = typeof onFinally == 'function';
10710    return this.then(isFunction ? function (x) {
10711      return promiseResolve(C, onFinally()).then(function () {
10712        return x;
10713      });
10714    } : onFinally, isFunction ? function (e) {
10715      return promiseResolve(C, onFinally()).then(function () {
10716        throw e;
10717      });
10718    } : onFinally);
10719  }
10720});
10721
10722/***/ }),
10723
vendor: 1,247 bytes, lines 10724-10750
10724/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.try.js":
10725/*!**************************************************************************************!*\
10726  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.try.js ***!
10727  \**************************************************************************************/
10728/*! no static exports found */
10729/***/ (function(module, exports, __webpack_require__) {
10730
10731"use strict";
10732 // https://github.com/tc39/proposal-promise-try
10733
10734var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
10735
10736var newPromiseCapability = __webpack_require__(/*! ./_new-promise-capability */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_new-promise-capability.js");
10737
10738var perform = __webpack_require__(/*! ./_perform */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_perform.js");
10739
10740$export($export.S, 'Promise', {
10741  'try': function _try(callbackfn) {
10742    var promiseCapability = newPromiseCapability.f(this);
10743    var result = perform(callbackfn);
10744    (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);
10745    return promiseCapability.promise;
10746  }
10747});
10748
10749/***/ }),
10750
vendor: 1,066 bytes, lines 10751-10771
10751/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.define-metadata.js":
10752/*!**************************************************************************************************!*\
10753  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.define-metadata.js ***!
10754  \**************************************************************************************************/
10755/*! no static exports found */
10756/***/ (function(module, exports, __webpack_require__) {
10757
10758var metadata = __webpack_require__(/*! ./_metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js");
10759
10760var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
10761
10762var toMetaKey = metadata.key;
10763var ordinaryDefineOwnMetadata = metadata.set;
10764metadata.exp({
10765  defineMetadata: function defineMetadata(metadataKey, metadataValue, target, targetKey) {
10766    ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), toMetaKey(targetKey));
10767  }
10768});
10769
10770/***/ }),
10771
vendor: 1,424 bytes, lines 10772-10801
10772/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.delete-metadata.js":
10773/*!**************************************************************************************************!*\
10774  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.delete-metadata.js ***!
10775  \**************************************************************************************************/
10776/*! no static exports found */
10777/***/ (function(module, exports, __webpack_require__) {
10778
10779var metadata = __webpack_require__(/*! ./_metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js");
10780
10781var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
10782
10783var toMetaKey = metadata.key;
10784var getOrCreateMetadataMap = metadata.map;
10785var store = metadata.store;
10786metadata.exp({
10787  deleteMetadata: function deleteMetadata(metadataKey, target
10788  /* , targetKey */
10789  ) {
10790    var targetKey = arguments.length < 3 ? undefined : toMetaKey(arguments[2]);
10791    var metadataMap = getOrCreateMetadataMap(anObject(target), targetKey, false);
10792    if (metadataMap === undefined || !metadataMap['delete'](metadataKey)) return false;
10793    if (metadataMap.size) return true;
10794    var targetMetadata = store.get(target);
10795    targetMetadata['delete'](targetKey);
10796    return !!targetMetadata.size || store['delete'](target);
10797  }
10798});
10799
10800/***/ }),
10801
vendor: 1,810 bytes, lines 10802-10839
10802/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata-keys.js":
10803/*!****************************************************************************************************!*\
10804  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata-keys.js ***!
10805  \****************************************************************************************************/
10806/*! no static exports found */
10807/***/ (function(module, exports, __webpack_require__) {
10808
10809var Set = __webpack_require__(/*! ./es6.set */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.set.js");
10810
10811var from = __webpack_require__(/*! ./_array-from-iterable */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_array-from-iterable.js");
10812
10813var metadata = __webpack_require__(/*! ./_metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js");
10814
10815var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
10816
10817var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js");
10818
10819var ordinaryOwnMetadataKeys = metadata.keys;
10820var toMetaKey = metadata.key;
10821
10822var ordinaryMetadataKeys = function ordinaryMetadataKeys(O, P) {
10823  var oKeys = ordinaryOwnMetadataKeys(O, P);
10824  var parent = getPrototypeOf(O);
10825  if (parent === null) return oKeys;
10826  var pKeys = ordinaryMetadataKeys(parent, P);
10827  return pKeys.length ? oKeys.length ? from(new Set(oKeys.concat(pKeys))) : pKeys : oKeys;
10828};
10829
10830metadata.exp({
10831  getMetadataKeys: function getMetadataKeys(target
10832  /* , targetKey */
10833  ) {
10834    return ordinaryMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1]));
10835  }
10836});
10837
10838/***/ }),
10839
vendor: 1,572 bytes, lines 10840-10873
10840/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata.js":
10841/*!***********************************************************************************************!*\
10842  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata.js ***!
10843  \***********************************************************************************************/
10844/*! no static exports found */
10845/***/ (function(module, exports, __webpack_require__) {
10846
10847var metadata = __webpack_require__(/*! ./_metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js");
10848
10849var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
10850
10851var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js");
10852
10853var ordinaryHasOwnMetadata = metadata.has;
10854var ordinaryGetOwnMetadata = metadata.get;
10855var toMetaKey = metadata.key;
10856
10857var ordinaryGetMetadata = function ordinaryGetMetadata(MetadataKey, O, P) {
10858  var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);
10859  if (hasOwn) return ordinaryGetOwnMetadata(MetadataKey, O, P);
10860  var parent = getPrototypeOf(O);
10861  return parent !== null ? ordinaryGetMetadata(MetadataKey, parent, P) : undefined;
10862};
10863
10864metadata.exp({
10865  getMetadata: function getMetadata(metadataKey, target
10866  /* , targetKey */
10867  ) {
10868    return ordinaryGetMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));
10869  }
10870});
10871
10872/***/ }),
10873
vendor: 1,096 bytes, lines 10874-10896
10874/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js":
10875/*!********************************************************************************************************!*\
10876  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js ***!
10877  \********************************************************************************************************/
10878/*! no static exports found */
10879/***/ (function(module, exports, __webpack_require__) {
10880
10881var metadata = __webpack_require__(/*! ./_metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js");
10882
10883var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
10884
10885var ordinaryOwnMetadataKeys = metadata.keys;
10886var toMetaKey = metadata.key;
10887metadata.exp({
10888  getOwnMetadataKeys: function getOwnMetadataKeys(target
10889  /* , targetKey */
10890  ) {
10891    return ordinaryOwnMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1]));
10892  }
10893});
10894
10895/***/ }),
10896
vendor: 1,091 bytes, lines 10897-10919
10897/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata.js":
10898/*!***************************************************************************************************!*\
10899  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata.js ***!
10900  \***************************************************************************************************/
10901/*! no static exports found */
10902/***/ (function(module, exports, __webpack_require__) {
10903
10904var metadata = __webpack_require__(/*! ./_metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js");
10905
10906var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
10907
10908var ordinaryGetOwnMetadata = metadata.get;
10909var toMetaKey = metadata.key;
10910metadata.exp({
10911  getOwnMetadata: function getOwnMetadata(metadataKey, target
10912  /* , targetKey */
10913  ) {
10914    return ordinaryGetOwnMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));
10915  }
10916});
10917
10918/***/ }),
10919
vendor: 1,488 bytes, lines 10920-10952
10920/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-metadata.js":
10921/*!***********************************************************************************************!*\
10922  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-metadata.js ***!
10923  \***********************************************************************************************/
10924/*! no static exports found */
10925/***/ (function(module, exports, __webpack_require__) {
10926
10927var metadata = __webpack_require__(/*! ./_metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js");
10928
10929var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
10930
10931var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js");
10932
10933var ordinaryHasOwnMetadata = metadata.has;
10934var toMetaKey = metadata.key;
10935
10936var ordinaryHasMetadata = function ordinaryHasMetadata(MetadataKey, O, P) {
10937  var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);
10938  if (hasOwn) return true;
10939  var parent = getPrototypeOf(O);
10940  return parent !== null ? ordinaryHasMetadata(MetadataKey, parent, P) : false;
10941};
10942
10943metadata.exp({
10944  hasMetadata: function hasMetadata(metadataKey, target
10945  /* , targetKey */
10946  ) {
10947    return ordinaryHasMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));
10948  }
10949});
10950
10951/***/ }),
10952
vendor: 1,091 bytes, lines 10953-10975
10953/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-own-metadata.js":
10954/*!***************************************************************************************************!*\
10955  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-own-metadata.js ***!
10956  \***************************************************************************************************/
10957/*! no static exports found */
10958/***/ (function(module, exports, __webpack_require__) {
10959
10960var metadata = __webpack_require__(/*! ./_metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js");
10961
10962var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
10963
10964var ordinaryHasOwnMetadata = metadata.has;
10965var toMetaKey = metadata.key;
10966metadata.exp({
10967  hasOwnMetadata: function hasOwnMetadata(metadataKey, target
10968  /* , targetKey */
10969  ) {
10970    return ordinaryHasOwnMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));
10971  }
10972});
10973
10974/***/ }),
10975
vendor: 1,248 bytes, lines 10976-11000
10976/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.metadata.js":
10977/*!*******************************************************************************************!*\
10978  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.metadata.js ***!
10979  \*******************************************************************************************/
10980/*! no static exports found */
10981/***/ (function(module, exports, __webpack_require__) {
10982
10983var $metadata = __webpack_require__(/*! ./_metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js");
10984
10985var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js");
10986
10987var aFunction = __webpack_require__(/*! ./_a-function */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js");
10988
10989var toMetaKey = $metadata.key;
10990var ordinaryDefineOwnMetadata = $metadata.set;
10991$metadata.exp({
10992  metadata: function metadata(metadataKey, metadataValue) {
10993    return function decorator(target, targetKey) {
10994      ordinaryDefineOwnMetadata(metadataKey, metadataValue, (targetKey !== undefined ? anObject : aFunction)(target), toMetaKey(targetKey));
10995    };
10996  }
10997});
10998
10999/***/ }),
11000
vendor: 659 bytes, lines 11001-11012
11001/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.from.js":
11002/*!***********************************************************************************!*\
11003  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.from.js ***!
11004  \***********************************************************************************/
11005/*! no static exports found */
11006/***/ (function(module, exports, __webpack_require__) {
11007
11008// https://tc39.github.io/proposal-setmap-offrom/#sec-set.from
11009__webpack_require__(/*! ./_set-collection-from */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-from.js")('Set');
11010
11011/***/ }),
11012
vendor: 645 bytes, lines 11013-11024
11013/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.of.js":
11014/*!*********************************************************************************!*\
11015  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.of.js ***!
11016  \*********************************************************************************/
11017/*! no static exports found */
11018/***/ (function(module, exports, __webpack_require__) {
11019
11020// https://tc39.github.io/proposal-setmap-offrom/#sec-set.of
11021__webpack_require__(/*! ./_set-collection-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-of.js")('Set');
11022
11023/***/ }),
11024
vendor: 845 bytes, lines 11025-11040
11025/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.to-json.js":
11026/*!**************************************************************************************!*\
11027  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.to-json.js ***!
11028  \**************************************************************************************/
11029/*! no static exports found */
11030/***/ (function(module, exports, __webpack_require__) {
11031
11032// https://github.com/DavidBruant/Map-Set.prototype.toJSON
11033var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
11034
11035$export($export.P + $export.R, 'Set', {
11036  toJSON: __webpack_require__(/*! ./_collection-to-json */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-to-json.js")('Set')
11037});
11038
11039/***/ }),
11040
vendor: 880 bytes, lines 11041-11062
11041/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.at.js":
11042/*!************************************************************************************!*\
11043  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.at.js ***!
11044  \************************************************************************************/
11045/*! no static exports found */
11046/***/ (function(module, exports, __webpack_require__) {
11047
11048"use strict";
11049 // https://github.com/mathiasbynens/String.prototype.at
11050
11051var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
11052
11053var $at = __webpack_require__(/*! ./_string-at */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-at.js")(true);
11054
11055$export($export.P, 'String', {
11056  at: function at(pos) {
11057    return $at(this, pos);
11058  }
11059});
11060
11061/***/ }),
11062
vendor: 2,101 bytes, lines 11063-11112
11063/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.match-all.js":
11064/*!*******************************************************************************************!*\
11065  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.match-all.js ***!
11066  \*******************************************************************************************/
11067/*! no static exports found */
11068/***/ (function(module, exports, __webpack_require__) {
11069
11070"use strict";
11071 // https://tc39.github.io/String.prototype.matchAll/
11072
11073var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
11074
11075var defined = __webpack_require__(/*! ./_defined */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js");
11076
11077var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js");
11078
11079var isRegExp = __webpack_require__(/*! ./_is-regexp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_is-regexp.js");
11080
11081var getFlags = __webpack_require__(/*! ./_flags */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_flags.js");
11082
11083var RegExpProto = RegExp.prototype;
11084
11085var $RegExpStringIterator = function $RegExpStringIterator(regexp, string) {
11086  this._r = regexp;
11087  this._s = string;
11088};
11089
11090__webpack_require__(/*! ./_iter-create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-create.js")($RegExpStringIterator, 'RegExp String', function next() {
11091  var match = this._r.exec(this._s);
11092
11093  return {
11094    value: match,
11095    done: match === null
11096  };
11097});
11098
11099$export($export.P, 'String', {
11100  matchAll: function matchAll(regexp) {
11101    defined(this);
11102    if (!isRegExp(regexp)) throw TypeError(regexp + ' is not a regexp!');
11103    var S = String(this);
11104    var flags = 'flags' in RegExpProto ? String(regexp.flags) : getFlags.call(regexp);
11105    var rx = new RegExp(regexp.source, ~flags.indexOf('g') ? flags : 'g' + flags);
11106    rx.lastIndex = toLength(regexp.lastIndex);
11107    return new $RegExpStringIterator(rx, S);
11108  }
11109});
11110
11111/***/ }),
11112
vendor: 1,303 bytes, lines 11113-11140
11113/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-end.js":
11114/*!*****************************************************************************************!*\
11115  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-end.js ***!
11116  \*****************************************************************************************/
11117/*! no static exports found */
11118/***/ (function(module, exports, __webpack_require__) {
11119
11120"use strict";
11121 // https://github.com/tc39/proposal-string-pad-start-end
11122
11123var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
11124
11125var $pad = __webpack_require__(/*! ./_string-pad */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-pad.js");
11126
11127var userAgent = __webpack_require__(/*! ./_user-agent */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_user-agent.js"); // https://github.com/zloirock/core-js/issues/280
11128
11129
11130var WEBKIT_BUG = /Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(userAgent);
11131$export($export.P + $export.F * WEBKIT_BUG, 'String', {
11132  padEnd: function padEnd(maxLength
11133  /* , fillString = ' ' */
11134  ) {
11135    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);
11136  }
11137});
11138
11139/***/ }),
11140
vendor: 1,314 bytes, lines 11141-11168
11141/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-start.js":
11142/*!*******************************************************************************************!*\
11143  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-start.js ***!
11144  \*******************************************************************************************/
11145/*! no static exports found */
11146/***/ (function(module, exports, __webpack_require__) {
11147
11148"use strict";
11149 // https://github.com/tc39/proposal-string-pad-start-end
11150
11151var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
11152
11153var $pad = __webpack_require__(/*! ./_string-pad */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-pad.js");
11154
11155var userAgent = __webpack_require__(/*! ./_user-agent */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_user-agent.js"); // https://github.com/zloirock/core-js/issues/280
11156
11157
11158var WEBKIT_BUG = /Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(userAgent);
11159$export($export.P + $export.F * WEBKIT_BUG, 'String', {
11160  padStart: function padStart(maxLength
11161  /* , fillString = ' ' */
11162  ) {
11163    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);
11164  }
11165});
11166
11167/***/ }),
11168
vendor: 799 bytes, lines 11169-11186
11169/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-left.js":
11170/*!*******************************************************************************************!*\
11171  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-left.js ***!
11172  \*******************************************************************************************/
11173/*! no static exports found */
11174/***/ (function(module, exports, __webpack_require__) {
11175
11176"use strict";
11177 // https://github.com/sebmarkbage/ecmascript-string-left-right-trim
11178
11179__webpack_require__(/*! ./_string-trim */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js")('trimLeft', function ($trim) {
11180  return function trimLeft() {
11181    return $trim(this, 1);
11182  };
11183}, 'trimStart');
11184
11185/***/ }),
11186
vendor: 803 bytes, lines 11187-11204
11187/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-right.js":
11188/*!********************************************************************************************!*\
11189  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-right.js ***!
11190  \********************************************************************************************/
11191/*! no static exports found */
11192/***/ (function(module, exports, __webpack_require__) {
11193
11194"use strict";
11195 // https://github.com/sebmarkbage/ecmascript-string-left-right-trim
11196
11197__webpack_require__(/*! ./_string-trim */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js")('trimRight', function ($trim) {
11198  return function trimRight() {
11199    return $trim(this, 2);
11200  };
11201}, 'trimEnd');
11202
11203/***/ }),
11204
vendor: 640 bytes, lines 11205-11215
11205/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.async-iterator.js":
11206/*!************************************************************************************************!*\
11207  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.async-iterator.js ***!
11208  \************************************************************************************************/
11209/*! no static exports found */
11210/***/ (function(module, exports, __webpack_require__) {
11211
11212__webpack_require__(/*! ./_wks-define */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-define.js")('asyncIterator');
11213
11214/***/ }),
11215
vendor: 621 bytes, lines 11216-11226
11216/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.observable.js":
11217/*!********************************************************************************************!*\
11218  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.observable.js ***!
11219  \********************************************************************************************/
11220/*! no static exports found */
11221/***/ (function(module, exports, __webpack_require__) {
11222
11223__webpack_require__(/*! ./_wks-define */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-define.js")('observable');
11224
11225/***/ }),
11226
vendor: 797 bytes, lines 11227-11242
11227/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.system.global.js":
11228/*!****************************************************************************************!*\
11229  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.system.global.js ***!
11230  \****************************************************************************************/
11231/*! no static exports found */
11232/***/ (function(module, exports, __webpack_require__) {
11233
11234// https://github.com/tc39/proposal-global
11235var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
11236
11237$export($export.S, 'System', {
11238  global: __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js")
11239});
11240
11241/***/ }),
11242
vendor: 687 bytes, lines 11243-11254
11243/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.from.js":
11244/*!****************************************************************************************!*\
11245  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.from.js ***!
11246  \****************************************************************************************/
11247/*! no static exports found */
11248/***/ (function(module, exports, __webpack_require__) {
11249
11250// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from
11251__webpack_require__(/*! ./_set-collection-from */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-from.js")('WeakMap');
11252
11253/***/ }),
11254
vendor: 673 bytes, lines 11255-11266
11255/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.of.js":
11256/*!**************************************************************************************!*\
11257  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.of.js ***!
11258  \**************************************************************************************/
11259/*! no static exports found */
11260/***/ (function(module, exports, __webpack_require__) {
11261
11262// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of
11263__webpack_require__(/*! ./_set-collection-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-of.js")('WeakMap');
11264
11265/***/ }),
11266
vendor: 687 bytes, lines 11267-11278
11267/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.from.js":
11268/*!****************************************************************************************!*\
11269  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.from.js ***!
11270  \****************************************************************************************/
11271/*! no static exports found */
11272/***/ (function(module, exports, __webpack_require__) {
11273
11274// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.from
11275__webpack_require__(/*! ./_set-collection-from */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-from.js")('WeakSet');
11276
11277/***/ }),
11278
vendor: 673 bytes, lines 11279-11290
11279/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.of.js":
11280/*!**************************************************************************************!*\
11281  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.of.js ***!
11282  \**************************************************************************************/
11283/*! no static exports found */
11284/***/ (function(module, exports, __webpack_require__) {
11285
11286// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.of
11287__webpack_require__(/*! ./_set-collection-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-of.js")('WeakSet');
11288
11289/***/ }),
11290
vendor: 2,950 bytes, lines 11291-11370
11291/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/web.dom.iterable.js":
11292/*!***************************************************************************************!*\
11293  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/web.dom.iterable.js ***!
11294  \***************************************************************************************/
11295/*! no static exports found */
11296/***/ (function(module, exports, __webpack_require__) {
11297
11298var $iterators = __webpack_require__(/*! ./es6.array.iterator */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.iterator.js");
11299
11300var getKeys = __webpack_require__(/*! ./_object-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js");
11301
11302var redefine = __webpack_require__(/*! ./_redefine */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js");
11303
11304var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
11305
11306var hide = __webpack_require__(/*! ./_hide */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js");
11307
11308var Iterators = __webpack_require__(/*! ./_iterators */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js");
11309
11310var wks = __webpack_require__(/*! ./_wks */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js");
11311
11312var ITERATOR = wks('iterator');
11313var TO_STRING_TAG = wks('toStringTag');
11314var ArrayValues = Iterators.Array;
11315var DOMIterables = {
11316  CSSRuleList: true,
11317  // TODO: Not spec compliant, should be false.
11318  CSSStyleDeclaration: false,
11319  CSSValueList: false,
11320  ClientRectList: false,
11321  DOMRectList: false,
11322  DOMStringList: false,
11323  DOMTokenList: true,
11324  DataTransferItemList: false,
11325  FileList: false,
11326  HTMLAllCollection: false,
11327  HTMLCollection: false,
11328  HTMLFormElement: false,
11329  HTMLSelectElement: false,
11330  MediaList: true,
11331  // TODO: Not spec compliant, should be false.
11332  MimeTypeArray: false,
11333  NamedNodeMap: false,
11334  NodeList: true,
11335  PaintRequestList: false,
11336  Plugin: false,
11337  PluginArray: false,
11338  SVGLengthList: false,
11339  SVGNumberList: false,
11340  SVGPathSegList: false,
11341  SVGPointList: false,
11342  SVGStringList: false,
11343  SVGTransformList: false,
11344  SourceBufferList: false,
11345  StyleSheetList: true,
11346  // TODO: Not spec compliant, should be false.
11347  TextTrackCueList: false,
11348  TextTrackList: false,
11349  TouchList: false
11350};
11351
11352for (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {
11353  var NAME = collections[i];
11354  var explicit = DOMIterables[NAME];
11355  var Collection = global[NAME];
11356  var proto = Collection && Collection.prototype;
11357  var key;
11358
11359  if (proto) {
11360    if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);
11361    if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
11362    Iterators[NAME] = ArrayValues;
11363    if (explicit) for (key in $iterators) {
11364      if (!proto[key]) redefine(proto, key, $iterators[key], true);
11365    }
11366  }
11367}
11368
11369/***/ }),
11370
vendor: 797 bytes, lines 11371-11388
11371/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/web.immediate.js":
11372/*!************************************************************************************!*\
11373  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/web.immediate.js ***!
11374  \************************************************************************************/
11375/*! no static exports found */
11376/***/ (function(module, exports, __webpack_require__) {
11377
11378var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
11379
11380var $task = __webpack_require__(/*! ./_task */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_task.js");
11381
11382$export($export.G + $export.B, {
11383  setImmediate: $task.set,
11384  clearImmediate: $task.clear
11385});
11386
11387/***/ }),
11388
vendor: 1,485 bytes, lines 11389-11425
11389/***/ "../node_modules/babel-polyfill/node_modules/core-js/modules/web.timers.js":
11390/*!*********************************************************************************!*\
11391  !*** ../node_modules/babel-polyfill/node_modules/core-js/modules/web.timers.js ***!
11392  \*********************************************************************************/
11393/*! no static exports found */
11394/***/ (function(module, exports, __webpack_require__) {
11395
11396// ie9- setTimeout & setInterval additional parameters fix
11397var global = __webpack_require__(/*! ./_global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js");
11398
11399var $export = __webpack_require__(/*! ./_export */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js");
11400
11401var userAgent = __webpack_require__(/*! ./_user-agent */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_user-agent.js");
11402
11403var slice = [].slice;
11404var MSIE = /MSIE .\./.test(userAgent); // <- dirty ie9- check
11405
11406var wrap = function wrap(set) {
11407  return function (fn, time
11408  /* , ...args */
11409  ) {
11410    var boundArgs = arguments.length > 2;
11411    var args = boundArgs ? slice.call(arguments, 2) : false;
11412    return set(boundArgs ? function () {
11413      // eslint-disable-next-line no-new-func
11414      (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);
11415    } : fn, time);
11416  };
11417};
11418
11419$export($export.G + $export.B + $export.F * MSIE, {
11420  setTimeout: wrap(global.setTimeout),
11421  setInterval: wrap(global.setInterval)
11422});
11423
11424/***/ }),
11425
vendor: 28,889 bytes, lines 11426-11830
11426/***/ "../node_modules/babel-polyfill/node_modules/core-js/shim.js":
11427/*!*******************************************************************!*\
11428  !*** ../node_modules/babel-polyfill/node_modules/core-js/shim.js ***!
11429  \*******************************************************************/
11430/*! no static exports found */
11431/***/ (function(module, exports, __webpack_require__) {
11432
11433__webpack_require__(/*! ./modules/es6.symbol */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.symbol.js");
11434
11435__webpack_require__(/*! ./modules/es6.object.create */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.create.js");
11436
11437__webpack_require__(/*! ./modules/es6.object.define-property */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-property.js");
11438
11439__webpack_require__(/*! ./modules/es6.object.define-properties */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-properties.js");
11440
11441__webpack_require__(/*! ./modules/es6.object.get-own-property-descriptor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-descriptor.js");
11442
11443__webpack_require__(/*! ./modules/es6.object.get-prototype-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-prototype-of.js");
11444
11445__webpack_require__(/*! ./modules/es6.object.keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.keys.js");
11446
11447__webpack_require__(/*! ./modules/es6.object.get-own-property-names */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-names.js");
11448
11449__webpack_require__(/*! ./modules/es6.object.freeze */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.freeze.js");
11450
11451__webpack_require__(/*! ./modules/es6.object.seal */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.seal.js");
11452
11453__webpack_require__(/*! ./modules/es6.object.prevent-extensions */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.prevent-extensions.js");
11454
11455__webpack_require__(/*! ./modules/es6.object.is-frozen */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-frozen.js");
11456
11457__webpack_require__(/*! ./modules/es6.object.is-sealed */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-sealed.js");
11458
11459__webpack_require__(/*! ./modules/es6.object.is-extensible */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-extensible.js");
11460
11461__webpack_require__(/*! ./modules/es6.object.assign */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.assign.js");
11462
11463__webpack_require__(/*! ./modules/es6.object.is */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is.js");
11464
11465__webpack_require__(/*! ./modules/es6.object.set-prototype-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.set-prototype-of.js");
11466
11467__webpack_require__(/*! ./modules/es6.object.to-string */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.to-string.js");
11468
11469__webpack_require__(/*! ./modules/es6.function.bind */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.bind.js");
11470
11471__webpack_require__(/*! ./modules/es6.function.name */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.name.js");
11472
11473__webpack_require__(/*! ./modules/es6.function.has-instance */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.has-instance.js");
11474
11475__webpack_require__(/*! ./modules/es6.parse-int */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-int.js");
11476
11477__webpack_require__(/*! ./modules/es6.parse-float */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-float.js");
11478
11479__webpack_require__(/*! ./modules/es6.number.constructor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.constructor.js");
11480
11481__webpack_require__(/*! ./modules/es6.number.to-fixed */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-fixed.js");
11482
11483__webpack_require__(/*! ./modules/es6.number.to-precision */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-precision.js");
11484
11485__webpack_require__(/*! ./modules/es6.number.epsilon */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.epsilon.js");
11486
11487__webpack_require__(/*! ./modules/es6.number.is-finite */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-finite.js");
11488
11489__webpack_require__(/*! ./modules/es6.number.is-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-integer.js");
11490
11491__webpack_require__(/*! ./modules/es6.number.is-nan */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-nan.js");
11492
11493__webpack_require__(/*! ./modules/es6.number.is-safe-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-safe-integer.js");
11494
11495__webpack_require__(/*! ./modules/es6.number.max-safe-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.max-safe-integer.js");
11496
11497__webpack_require__(/*! ./modules/es6.number.min-safe-integer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.min-safe-integer.js");
11498
11499__webpack_require__(/*! ./modules/es6.number.parse-float */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-float.js");
11500
11501__webpack_require__(/*! ./modules/es6.number.parse-int */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-int.js");
11502
11503__webpack_require__(/*! ./modules/es6.math.acosh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.acosh.js");
11504
11505__webpack_require__(/*! ./modules/es6.math.asinh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.asinh.js");
11506
11507__webpack_require__(/*! ./modules/es6.math.atanh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.atanh.js");
11508
11509__webpack_require__(/*! ./modules/es6.math.cbrt */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cbrt.js");
11510
11511__webpack_require__(/*! ./modules/es6.math.clz32 */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.clz32.js");
11512
11513__webpack_require__(/*! ./modules/es6.math.cosh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cosh.js");
11514
11515__webpack_require__(/*! ./modules/es6.math.expm1 */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.expm1.js");
11516
11517__webpack_require__(/*! ./modules/es6.math.fround */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.fround.js");
11518
11519__webpack_require__(/*! ./modules/es6.math.hypot */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.hypot.js");
11520
11521__webpack_require__(/*! ./modules/es6.math.imul */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.imul.js");
11522
11523__webpack_require__(/*! ./modules/es6.math.log10 */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log10.js");
11524
11525__webpack_require__(/*! ./modules/es6.math.log1p */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log1p.js");
11526
11527__webpack_require__(/*! ./modules/es6.math.log2 */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log2.js");
11528
11529__webpack_require__(/*! ./modules/es6.math.sign */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sign.js");
11530
11531__webpack_require__(/*! ./modules/es6.math.sinh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sinh.js");
11532
11533__webpack_require__(/*! ./modules/es6.math.tanh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.tanh.js");
11534
11535__webpack_require__(/*! ./modules/es6.math.trunc */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.trunc.js");
11536
11537__webpack_require__(/*! ./modules/es6.string.from-code-point */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.from-code-point.js");
11538
11539__webpack_require__(/*! ./modules/es6.string.raw */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.raw.js");
11540
11541__webpack_require__(/*! ./modules/es6.string.trim */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.trim.js");
11542
11543__webpack_require__(/*! ./modules/es6.string.iterator */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.iterator.js");
11544
11545__webpack_require__(/*! ./modules/es6.string.code-point-at */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.code-point-at.js");
11546
11547__webpack_require__(/*! ./modules/es6.string.ends-with */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.ends-with.js");
11548
11549__webpack_require__(/*! ./modules/es6.string.includes */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.includes.js");
11550
11551__webpack_require__(/*! ./modules/es6.string.repeat */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.repeat.js");
11552
11553__webpack_require__(/*! ./modules/es6.string.starts-with */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.starts-with.js");
11554
11555__webpack_require__(/*! ./modules/es6.string.anchor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.anchor.js");
11556
11557__webpack_require__(/*! ./modules/es6.string.big */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.big.js");
11558
11559__webpack_require__(/*! ./modules/es6.string.blink */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.blink.js");
11560
11561__webpack_require__(/*! ./modules/es6.string.bold */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.bold.js");
11562
11563__webpack_require__(/*! ./modules/es6.string.fixed */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fixed.js");
11564
11565__webpack_require__(/*! ./modules/es6.string.fontcolor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontcolor.js");
11566
11567__webpack_require__(/*! ./modules/es6.string.fontsize */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontsize.js");
11568
11569__webpack_require__(/*! ./modules/es6.string.italics */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.italics.js");
11570
11571__webpack_require__(/*! ./modules/es6.string.link */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.link.js");
11572
11573__webpack_require__(/*! ./modules/es6.string.small */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.small.js");
11574
11575__webpack_require__(/*! ./modules/es6.string.strike */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.strike.js");
11576
11577__webpack_require__(/*! ./modules/es6.string.sub */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sub.js");
11578
11579__webpack_require__(/*! ./modules/es6.string.sup */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sup.js");
11580
11581__webpack_require__(/*! ./modules/es6.date.now */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.now.js");
11582
11583__webpack_require__(/*! ./modules/es6.date.to-json */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-json.js");
11584
11585__webpack_require__(/*! ./modules/es6.date.to-iso-string */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-iso-string.js");
11586
11587__webpack_require__(/*! ./modules/es6.date.to-string */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-string.js");
11588
11589__webpack_require__(/*! ./modules/es6.date.to-primitive */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-primitive.js");
11590
11591__webpack_require__(/*! ./modules/es6.array.is-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.is-array.js");
11592
11593__webpack_require__(/*! ./modules/es6.array.from */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.from.js");
11594
11595__webpack_require__(/*! ./modules/es6.array.of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.of.js");
11596
11597__webpack_require__(/*! ./modules/es6.array.join */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.join.js");
11598
11599__webpack_require__(/*! ./modules/es6.array.slice */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.slice.js");
11600
11601__webpack_require__(/*! ./modules/es6.array.sort */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.sort.js");
11602
11603__webpack_require__(/*! ./modules/es6.array.for-each */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.for-each.js");
11604
11605__webpack_require__(/*! ./modules/es6.array.map */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.map.js");
11606
11607__webpack_require__(/*! ./modules/es6.array.filter */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.filter.js");
11608
11609__webpack_require__(/*! ./modules/es6.array.some */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.some.js");
11610
11611__webpack_require__(/*! ./modules/es6.array.every */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.every.js");
11612
11613__webpack_require__(/*! ./modules/es6.array.reduce */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce.js");
11614
11615__webpack_require__(/*! ./modules/es6.array.reduce-right */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce-right.js");
11616
11617__webpack_require__(/*! ./modules/es6.array.index-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.index-of.js");
11618
11619__webpack_require__(/*! ./modules/es6.array.last-index-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.last-index-of.js");
11620
11621__webpack_require__(/*! ./modules/es6.array.copy-within */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.copy-within.js");
11622
11623__webpack_require__(/*! ./modules/es6.array.fill */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.fill.js");
11624
11625__webpack_require__(/*! ./modules/es6.array.find */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find.js");
11626
11627__webpack_require__(/*! ./modules/es6.array.find-index */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find-index.js");
11628
11629__webpack_require__(/*! ./modules/es6.array.species */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.species.js");
11630
11631__webpack_require__(/*! ./modules/es6.array.iterator */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.iterator.js");
11632
11633__webpack_require__(/*! ./modules/es6.regexp.constructor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.constructor.js");
11634
11635__webpack_require__(/*! ./modules/es6.regexp.exec */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.exec.js");
11636
11637__webpack_require__(/*! ./modules/es6.regexp.to-string */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.to-string.js");
11638
11639__webpack_require__(/*! ./modules/es6.regexp.flags */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.flags.js");
11640
11641__webpack_require__(/*! ./modules/es6.regexp.match */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.match.js");
11642
11643__webpack_require__(/*! ./modules/es6.regexp.replace */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.replace.js");
11644
11645__webpack_require__(/*! ./modules/es6.regexp.search */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.search.js");
11646
11647__webpack_require__(/*! ./modules/es6.regexp.split */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.split.js");
11648
11649__webpack_require__(/*! ./modules/es6.promise */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.promise.js");
11650
11651__webpack_require__(/*! ./modules/es6.map */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.map.js");
11652
11653__webpack_require__(/*! ./modules/es6.set */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.set.js");
11654
11655__webpack_require__(/*! ./modules/es6.weak-map */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-map.js");
11656
11657__webpack_require__(/*! ./modules/es6.weak-set */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-set.js");
11658
11659__webpack_require__(/*! ./modules/es6.typed.array-buffer */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.array-buffer.js");
11660
11661__webpack_require__(/*! ./modules/es6.typed.data-view */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.data-view.js");
11662
11663__webpack_require__(/*! ./modules/es6.typed.int8-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int8-array.js");
11664
11665__webpack_require__(/*! ./modules/es6.typed.uint8-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-array.js");
11666
11667__webpack_require__(/*! ./modules/es6.typed.uint8-clamped-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-clamped-array.js");
11668
11669__webpack_require__(/*! ./modules/es6.typed.int16-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int16-array.js");
11670
11671__webpack_require__(/*! ./modules/es6.typed.uint16-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint16-array.js");
11672
11673__webpack_require__(/*! ./modules/es6.typed.int32-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int32-array.js");
11674
11675__webpack_require__(/*! ./modules/es6.typed.uint32-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint32-array.js");
11676
11677__webpack_require__(/*! ./modules/es6.typed.float32-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float32-array.js");
11678
11679__webpack_require__(/*! ./modules/es6.typed.float64-array */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float64-array.js");
11680
11681__webpack_require__(/*! ./modules/es6.reflect.apply */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.apply.js");
11682
11683__webpack_require__(/*! ./modules/es6.reflect.construct */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.construct.js");
11684
11685__webpack_require__(/*! ./modules/es6.reflect.define-property */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.define-property.js");
11686
11687__webpack_require__(/*! ./modules/es6.reflect.delete-property */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.delete-property.js");
11688
11689__webpack_require__(/*! ./modules/es6.reflect.enumerate */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.enumerate.js");
11690
11691__webpack_require__(/*! ./modules/es6.reflect.get */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get.js");
11692
11693__webpack_require__(/*! ./modules/es6.reflect.get-own-property-descriptor */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js");
11694
11695__webpack_require__(/*! ./modules/es6.reflect.get-prototype-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-prototype-of.js");
11696
11697__webpack_require__(/*! ./modules/es6.reflect.has */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.has.js");
11698
11699__webpack_require__(/*! ./modules/es6.reflect.is-extensible */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.is-extensible.js");
11700
11701__webpack_require__(/*! ./modules/es6.reflect.own-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.own-keys.js");
11702
11703__webpack_require__(/*! ./modules/es6.reflect.prevent-extensions */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.prevent-extensions.js");
11704
11705__webpack_require__(/*! ./modules/es6.reflect.set */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set.js");
11706
11707__webpack_require__(/*! ./modules/es6.reflect.set-prototype-of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set-prototype-of.js");
11708
11709__webpack_require__(/*! ./modules/es7.array.includes */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.includes.js");
11710
11711__webpack_require__(/*! ./modules/es7.array.flat-map */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flat-map.js");
11712
11713__webpack_require__(/*! ./modules/es7.array.flatten */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flatten.js");
11714
11715__webpack_require__(/*! ./modules/es7.string.at */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.at.js");
11716
11717__webpack_require__(/*! ./modules/es7.string.pad-start */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-start.js");
11718
11719__webpack_require__(/*! ./modules/es7.string.pad-end */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-end.js");
11720
11721__webpack_require__(/*! ./modules/es7.string.trim-left */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-left.js");
11722
11723__webpack_require__(/*! ./modules/es7.string.trim-right */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-right.js");
11724
11725__webpack_require__(/*! ./modules/es7.string.match-all */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.match-all.js");
11726
11727__webpack_require__(/*! ./modules/es7.symbol.async-iterator */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.async-iterator.js");
11728
11729__webpack_require__(/*! ./modules/es7.symbol.observable */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.observable.js");
11730
11731__webpack_require__(/*! ./modules/es7.object.get-own-property-descriptors */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.get-own-property-descriptors.js");
11732
11733__webpack_require__(/*! ./modules/es7.object.values */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.values.js");
11734
11735__webpack_require__(/*! ./modules/es7.object.entries */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.entries.js");
11736
11737__webpack_require__(/*! ./modules/es7.object.define-getter */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-getter.js");
11738
11739__webpack_require__(/*! ./modules/es7.object.define-setter */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-setter.js");
11740
11741__webpack_require__(/*! ./modules/es7.object.lookup-getter */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-getter.js");
11742
11743__webpack_require__(/*! ./modules/es7.object.lookup-setter */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-setter.js");
11744
11745__webpack_require__(/*! ./modules/es7.map.to-json */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.to-json.js");
11746
11747__webpack_require__(/*! ./modules/es7.set.to-json */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.to-json.js");
11748
11749__webpack_require__(/*! ./modules/es7.map.of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.of.js");
11750
11751__webpack_require__(/*! ./modules/es7.set.of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.of.js");
11752
11753__webpack_require__(/*! ./modules/es7.weak-map.of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.of.js");
11754
11755__webpack_require__(/*! ./modules/es7.weak-set.of */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.of.js");
11756
11757__webpack_require__(/*! ./modules/es7.map.from */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.from.js");
11758
11759__webpack_require__(/*! ./modules/es7.set.from */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.from.js");
11760
11761__webpack_require__(/*! ./modules/es7.weak-map.from */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.from.js");
11762
11763__webpack_require__(/*! ./modules/es7.weak-set.from */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.from.js");
11764
11765__webpack_require__(/*! ./modules/es7.global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.global.js");
11766
11767__webpack_require__(/*! ./modules/es7.system.global */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.system.global.js");
11768
11769__webpack_require__(/*! ./modules/es7.error.is-error */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.error.is-error.js");
11770
11771__webpack_require__(/*! ./modules/es7.math.clamp */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.clamp.js");
11772
11773__webpack_require__(/*! ./modules/es7.math.deg-per-rad */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.deg-per-rad.js");
11774
11775__webpack_require__(/*! ./modules/es7.math.degrees */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.degrees.js");
11776
11777__webpack_require__(/*! ./modules/es7.math.fscale */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.fscale.js");
11778
11779__webpack_require__(/*! ./modules/es7.math.iaddh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.iaddh.js");
11780
11781__webpack_require__(/*! ./modules/es7.math.isubh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.isubh.js");
11782
11783__webpack_require__(/*! ./modules/es7.math.imulh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.imulh.js");
11784
11785__webpack_require__(/*! ./modules/es7.math.rad-per-deg */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.rad-per-deg.js");
11786
11787__webpack_require__(/*! ./modules/es7.math.radians */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.radians.js");
11788
11789__webpack_require__(/*! ./modules/es7.math.scale */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.scale.js");
11790
11791__webpack_require__(/*! ./modules/es7.math.umulh */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.umulh.js");
11792
11793__webpack_require__(/*! ./modules/es7.math.signbit */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.signbit.js");
11794
11795__webpack_require__(/*! ./modules/es7.promise.finally */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.finally.js");
11796
11797__webpack_require__(/*! ./modules/es7.promise.try */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.try.js");
11798
11799__webpack_require__(/*! ./modules/es7.reflect.define-metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.define-metadata.js");
11800
11801__webpack_require__(/*! ./modules/es7.reflect.delete-metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.delete-metadata.js");
11802
11803__webpack_require__(/*! ./modules/es7.reflect.get-metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata.js");
11804
11805__webpack_require__(/*! ./modules/es7.reflect.get-metadata-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata-keys.js");
11806
11807__webpack_require__(/*! ./modules/es7.reflect.get-own-metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata.js");
11808
11809__webpack_require__(/*! ./modules/es7.reflect.get-own-metadata-keys */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js");
11810
11811__webpack_require__(/*! ./modules/es7.reflect.has-metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-metadata.js");
11812
11813__webpack_require__(/*! ./modules/es7.reflect.has-own-metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-own-metadata.js");
11814
11815__webpack_require__(/*! ./modules/es7.reflect.metadata */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.metadata.js");
11816
11817__webpack_require__(/*! ./modules/es7.asap */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.asap.js");
11818
11819__webpack_require__(/*! ./modules/es7.observable */ "../node_modules/babel-polyfill/node_modules/core-js/modules/es7.observable.js");
11820
11821__webpack_require__(/*! ./modules/web.timers */ "../node_modules/babel-polyfill/node_modules/core-js/modules/web.timers.js");
11822
11823__webpack_require__(/*! ./modules/web.immediate */ "../node_modules/babel-polyfill/node_modules/core-js/modules/web.immediate.js");
11824
11825__webpack_require__(/*! ./modules/web.dom.iterable */ "../node_modules/babel-polyfill/node_modules/core-js/modules/web.dom.iterable.js");
11826
11827module.exports = __webpack_require__(/*! ./modules/_core */ "../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js");
11828
11829/***/ }),
11830
vendor: 73,733 bytes, lines 11831-14485
11831/***/ "../node_modules/hammerjs/hammer.js":
11832/*!******************************************!*\
11833  !*** ../node_modules/hammerjs/hammer.js ***!
11834  \******************************************/
11835/*! no static exports found */
11836/***/ (function(module, exports, __webpack_require__) {
11837
11838var __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
11839
11840/*! Hammer.JS - v2.0.7 - 2016-04-22
11841 * http://hammerjs.github.io/
11842 *
11843 * Copyright (c) 2016 Jorik Tangelder;
11844 * Licensed under the MIT license */
11845(function (window, document, exportName, undefined) {
11846  'use strict';
11847
11848  var VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];
11849  var TEST_ELEMENT = document.createElement('div');
11850  var TYPE_FUNCTION = 'function';
11851  var round = Math.round;
11852  var abs = Math.abs;
11853  var now = Date.now;
11854  /**
11855   * set a timeout with a given scope
11856   * @param {Function} fn
11857   * @param {Number} timeout
11858   * @param {Object} context
11859   * @returns {number}
11860   */
11861
11862  function setTimeoutContext(fn, timeout, context) {
11863    return setTimeout(bindFn(fn, context), timeout);
11864  }
11865  /**
11866   * if the argument is an array, we want to execute the fn on each entry
11867   * if it aint an array we don't want to do a thing.
11868   * this is used by all the methods that accept a single and array argument.
11869   * @param {*|Array} arg
11870   * @param {String} fn
11871   * @param {Object} [context]
11872   * @returns {Boolean}
11873   */
11874
11875
11876  function invokeArrayArg(arg, fn, context) {
11877    if (Array.isArray(arg)) {
11878      each(arg, context[fn], context);
11879      return true;
11880    }
11881
11882    return false;
11883  }
11884  /**
11885   * walk objects and arrays
11886   * @param {Object} obj
11887   * @param {Function} iterator
11888   * @param {Object} context
11889   */
11890
11891
11892  function each(obj, iterator, context) {
11893    var i;
11894
11895    if (!obj) {
11896      return;
11897    }
11898
11899    if (obj.forEach) {
11900      obj.forEach(iterator, context);
11901    } else if (obj.length !== undefined) {
11902      i = 0;
11903
11904      while (i < obj.length) {
11905        iterator.call(context, obj[i], i, obj);
11906        i++;
11907      }
11908    } else {
11909      for (i in obj) {
11910        obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);
11911      }
11912    }
11913  }
11914  /**
11915   * wrap a method with a deprecation warning and stack trace
11916   * @param {Function} method
11917   * @param {String} name
11918   * @param {String} message
11919   * @returns {Function} A new function wrapping the supplied method.
11920   */
11921
11922
11923  function deprecate(method, name, message) {
11924    var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\n' + message + ' AT \n';
11925    return function () {
11926      var e = new Error('get-stack-trace');
11927      var stack = e && e.stack ? e.stack.replace(/^[^\(]+?[\n$]/gm, '').replace(/^\s+at\s+/gm, '').replace(/^Object.<anonymous>\s*\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';
11928      var log = window.console && (window.console.warn || window.console.log);
11929
11930      if (log) {
11931        log.call(window.console, deprecationMessage, stack);
11932      }
11933
11934      return method.apply(this, arguments);
11935    };
11936  }
11937  /**
11938   * extend object.
11939   * means that properties in dest will be overwritten by the ones in src.
11940   * @param {Object} target
11941   * @param {...Object} objects_to_assign
11942   * @returns {Object} target
11943   */
11944
11945
11946  var assign;
11947
11948  if (typeof Object.assign !== 'function') {
11949    assign = function assign(target) {
11950      if (target === undefined || target === null) {
11951        throw new TypeError('Cannot convert undefined or null to object');
11952      }
11953
11954      var output = Object(target);
11955
11956      for (var index = 1; index < arguments.length; index++) {
11957        var source = arguments[index];
11958
11959        if (source !== undefined && source !== null) {
11960          for (var nextKey in source) {
11961            if (source.hasOwnProperty(nextKey)) {
11962              output[nextKey] = source[nextKey];
11963            }
11964          }
11965        }
11966      }
11967
11968      return output;
11969    };
11970  } else {
11971    assign = Object.assign;
11972  }
11973  /**
11974   * extend object.
11975   * means that properties in dest will be overwritten by the ones in src.
11976   * @param {Object} dest
11977   * @param {Object} src
11978   * @param {Boolean} [merge=false]
11979   * @returns {Object} dest
11980   */
11981
11982
11983  var extend = deprecate(function extend(dest, src, merge) {
11984    var keys = Object.keys(src);
11985    var i = 0;
11986
11987    while (i < keys.length) {
11988      if (!merge || merge && dest[keys[i]] === undefined) {
11989        dest[keys[i]] = src[keys[i]];
11990      }
11991
11992      i++;
11993    }
11994
11995    return dest;
11996  }, 'extend', 'Use `assign`.');
11997  /**
11998   * merge the values from src in the dest.
11999   * means that properties that exist in dest will not be overwritten by src
12000   * @param {Object} dest
12001   * @param {Object} src
12002   * @returns {Object} dest
12003   */
12004
12005  var merge = deprecate(function merge(dest, src) {
12006    return extend(dest, src, true);
12007  }, 'merge', 'Use `assign`.');
12008  /**
12009   * simple class inheritance
12010   * @param {Function} child
12011   * @param {Function} base
12012   * @param {Object} [properties]
12013   */
12014
12015  function inherit(child, base, properties) {
12016    var baseP = base.prototype,
12017        childP;
12018    childP = child.prototype = Object.create(baseP);
12019    childP.constructor = child;
12020    childP._super = baseP;
12021
12022    if (properties) {
12023      assign(childP, properties);
12024    }
12025  }
12026  /**
12027   * simple function bind
12028   * @param {Function} fn
12029   * @param {Object} context
12030   * @returns {Function}
12031   */
12032
12033
12034  function bindFn(fn, context) {
12035    return function boundFn() {
12036      return fn.apply(context, arguments);
12037    };
12038  }
12039  /**
12040   * let a boolean value also be a function that must return a boolean
12041   * this first item in args will be used as the context
12042   * @param {Boolean|Function} val
12043   * @param {Array} [args]
12044   * @returns {Boolean}
12045   */
12046
12047
12048  function boolOrFn(val, args) {
12049    if (_typeof(val) == TYPE_FUNCTION) {
12050      return val.apply(args ? args[0] || undefined : undefined, args);
12051    }
12052
12053    return val;
12054  }
12055  /**
12056   * use the val2 when val1 is undefined
12057   * @param {*} val1
12058   * @param {*} val2
12059   * @returns {*}
12060   */
12061
12062
12063  function ifUndefined(val1, val2) {
12064    return val1 === undefined ? val2 : val1;
12065  }
12066  /**
12067   * addEventListener with multiple events at once
12068   * @param {EventTarget} target
12069   * @param {String} types
12070   * @param {Function} handler
12071   */
12072
12073
12074  function addEventListeners(target, types, handler) {
12075    each(splitStr(types), function (type) {
12076      target.addEventListener(type, handler, false);
12077    });
12078  }
12079  /**
12080   * removeEventListener with multiple events at once
12081   * @param {EventTarget} target
12082   * @param {String} types
12083   * @param {Function} handler
12084   */
12085
12086
12087  function removeEventListeners(target, types, handler) {
12088    each(splitStr(types), function (type) {
12089      target.removeEventListener(type, handler, false);
12090    });
12091  }
12092  /**
12093   * find if a node is in the given parent
12094   * @method hasParent
12095   * @param {HTMLElement} node
12096   * @param {HTMLElement} parent
12097   * @return {Boolean} found
12098   */
12099
12100
12101  function hasParent(node, parent) {
12102    while (node) {
12103      if (node == parent) {
12104        return true;
12105      }
12106
12107      node = node.parentNode;
12108    }
12109
12110    return false;
12111  }
12112  /**
12113   * small indexOf wrapper
12114   * @param {String} str
12115   * @param {String} find
12116   * @returns {Boolean} found
12117   */
12118
12119
12120  function inStr(str, find) {
12121    return str.indexOf(find) > -1;
12122  }
12123  /**
12124   * split string on whitespace
12125   * @param {String} str
12126   * @returns {Array} words
12127   */
12128
12129
12130  function splitStr(str) {
12131    return str.trim().split(/\s+/g);
12132  }
12133  /**
12134   * find if a array contains the object using indexOf or a simple polyFill
12135   * @param {Array} src
12136   * @param {String} find
12137   * @param {String} [findByKey]
12138   * @return {Boolean|Number} false when not found, or the index
12139   */
12140
12141
12142  function inArray(src, find, findByKey) {
12143    if (src.indexOf && !findByKey) {
12144      return src.indexOf(find);
12145    } else {
12146      var i = 0;
12147
12148      while (i < src.length) {
12149        if (findByKey && src[i][findByKey] == find || !findByKey && src[i] === find) {
12150          return i;
12151        }
12152
12153        i++;
12154      }
12155
12156      return -1;
12157    }
12158  }
12159  /**
12160   * convert array-like objects to real arrays
12161   * @param {Object} obj
12162   * @returns {Array}
12163   */
12164
12165
12166  function toArray(obj) {
12167    return Array.prototype.slice.call(obj, 0);
12168  }
12169  /**
12170   * unique array with objects based on a key (like 'id') or just by the array's value
12171   * @param {Array} src [{id:1},{id:2},{id:1}]
12172   * @param {String} [key]
12173   * @param {Boolean} [sort=False]
12174   * @returns {Array} [{id:1},{id:2}]
12175   */
12176
12177
12178  function uniqueArray(src, key, sort) {
12179    var results = [];
12180    var values = [];
12181    var i = 0;
12182
12183    while (i < src.length) {
12184      var val = key ? src[i][key] : src[i];
12185
12186      if (inArray(values, val) < 0) {
12187        results.push(src[i]);
12188      }
12189
12190      values[i] = val;
12191      i++;
12192    }
12193
12194    if (sort) {
12195      if (!key) {
12196        results = results.sort();
12197      } else {
12198        results = results.sort(function sortUniqueArray(a, b) {
12199          return a[key] > b[key];
12200        });
12201      }
12202    }
12203
12204    return results;
12205  }
12206  /**
12207   * get the prefixed property
12208   * @param {Object} obj
12209   * @param {String} property
12210   * @returns {String|Undefined} prefixed
12211   */
12212
12213
12214  function prefixed(obj, property) {
12215    var prefix, prop;
12216    var camelProp = property[0].toUpperCase() + property.slice(1);
12217    var i = 0;
12218
12219    while (i < VENDOR_PREFIXES.length) {
12220      prefix = VENDOR_PREFIXES[i];
12221      prop = prefix ? prefix + camelProp : property;
12222
12223      if (prop in obj) {
12224        return prop;
12225      }
12226
12227      i++;
12228    }
12229
12230    return undefined;
12231  }
12232  /**
12233   * get a unique id
12234   * @returns {number} uniqueId
12235   */
12236
12237
12238  var _uniqueId = 1;
12239
12240  function uniqueId() {
12241    return _uniqueId++;
12242  }
12243  /**
12244   * get the window object of an element
12245   * @param {HTMLElement} element
12246   * @returns {DocumentView|Window}
12247   */
12248
12249
12250  function getWindowForElement(element) {
12251    var doc = element.ownerDocument || element;
12252    return doc.defaultView || doc.parentWindow || window;
12253  }
12254
12255  var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;
12256  var SUPPORT_TOUCH = 'ontouchstart' in window;
12257  var SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;
12258  var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);
12259  var INPUT_TYPE_TOUCH = 'touch';
12260  var INPUT_TYPE_PEN = 'pen';
12261  var INPUT_TYPE_MOUSE = 'mouse';
12262  var INPUT_TYPE_KINECT = 'kinect';
12263  var COMPUTE_INTERVAL = 25;
12264  var INPUT_START = 1;
12265  var INPUT_MOVE = 2;
12266  var INPUT_END = 4;
12267  var INPUT_CANCEL = 8;
12268  var DIRECTION_NONE = 1;
12269  var DIRECTION_LEFT = 2;
12270  var DIRECTION_RIGHT = 4;
12271  var DIRECTION_UP = 8;
12272  var DIRECTION_DOWN = 16;
12273  var DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;
12274  var DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;
12275  var DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;
12276  var PROPS_XY = ['x', 'y'];
12277  var PROPS_CLIENT_XY = ['clientX', 'clientY'];
12278  /**
12279   * create new input type manager
12280   * @param {Manager} manager
12281   * @param {Function} callback
12282   * @returns {Input}
12283   * @constructor
12284   */
12285
12286  function Input(manager, callback) {
12287    var self = this;
12288    this.manager = manager;
12289    this.callback = callback;
12290    this.element = manager.element;
12291    this.target = manager.options.inputTarget; // smaller wrapper around the handler, for the scope and the enabled state of the manager,
12292    // so when disabled the input events are completely bypassed.
12293
12294    this.domHandler = function (ev) {
12295      if (boolOrFn(manager.options.enable, [manager])) {
12296        self.handler(ev);
12297      }
12298    };
12299
12300    this.init();
12301  }
12302
12303  Input.prototype = {
12304    /**
12305     * should handle the inputEvent data and trigger the callback
12306     * @virtual
12307     */
12308    handler: function handler() {},
12309
12310    /**
12311     * bind the events
12312     */
12313    init: function init() {
12314      this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);
12315      this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);
12316      this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);
12317    },
12318
12319    /**
12320     * unbind the events
12321     */
12322    destroy: function destroy() {
12323      this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);
12324      this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);
12325      this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);
12326    }
12327  };
12328  /**
12329   * create new input type manager
12330   * called by the Manager constructor
12331   * @param {Hammer} manager
12332   * @returns {Input}
12333   */
12334
12335  function createInputInstance(manager) {
12336    var Type;
12337    var inputClass = manager.options.inputClass;
12338
12339    if (inputClass) {
12340      Type = inputClass;
12341    } else if (SUPPORT_POINTER_EVENTS) {
12342      Type = PointerEventInput;
12343    } else if (SUPPORT_ONLY_TOUCH) {
12344      Type = TouchInput;
12345    } else if (!SUPPORT_TOUCH) {
12346      Type = MouseInput;
12347    } else {
12348      Type = TouchMouseInput;
12349    }
12350
12351    return new Type(manager, inputHandler);
12352  }
12353  /**
12354   * handle input events
12355   * @param {Manager} manager
12356   * @param {String} eventType
12357   * @param {Object} input
12358   */
12359
12360
12361  function inputHandler(manager, eventType, input) {
12362    var pointersLen = input.pointers.length;
12363    var changedPointersLen = input.changedPointers.length;
12364    var isFirst = eventType & INPUT_START && pointersLen - changedPointersLen === 0;
12365    var isFinal = eventType & (INPUT_END | INPUT_CANCEL) && pointersLen - changedPointersLen === 0;
12366    input.isFirst = !!isFirst;
12367    input.isFinal = !!isFinal;
12368
12369    if (isFirst) {
12370      manager.session = {};
12371    } // source event is the normalized value of the domEvents
12372    // like 'touchstart, mouseup, pointerdown'
12373
12374
12375    input.eventType = eventType; // compute scale, rotation etc
12376
12377    computeInputData(manager, input); // emit secret event
12378
12379    manager.emit('hammer.input', input);
12380    manager.recognize(input);
12381    manager.session.prevInput = input;
12382  }
12383  /**
12384   * extend the data with some usable properties like scale, rotate, velocity etc
12385   * @param {Object} manager
12386   * @param {Object} input
12387   */
12388
12389
12390  function computeInputData(manager, input) {
12391    var session = manager.session;
12392    var pointers = input.pointers;
12393    var pointersLength = pointers.length; // store the first input to calculate the distance and direction
12394
12395    if (!session.firstInput) {
12396      session.firstInput = simpleCloneInputData(input);
12397    } // to compute scale and rotation we need to store the multiple touches
12398
12399
12400    if (pointersLength > 1 && !session.firstMultiple) {
12401      session.firstMultiple = simpleCloneInputData(input);
12402    } else if (pointersLength === 1) {
12403      session.firstMultiple = false;
12404    }
12405
12406    var firstInput = session.firstInput;
12407    var firstMultiple = session.firstMultiple;
12408    var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;
12409    var center = input.center = getCenter(pointers);
12410    input.timeStamp = now();
12411    input.deltaTime = input.timeStamp - firstInput.timeStamp;
12412    input.angle = getAngle(offsetCenter, center);
12413    input.distance = getDistance(offsetCenter, center);
12414    computeDeltaXY(session, input);
12415    input.offsetDirection = getDirection(input.deltaX, input.deltaY);
12416    var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);
12417    input.overallVelocityX = overallVelocity.x;
12418    input.overallVelocityY = overallVelocity.y;
12419    input.overallVelocity = abs(overallVelocity.x) > abs(overallVelocity.y) ? overallVelocity.x : overallVelocity.y;
12420    input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;
12421    input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;
12422    input.maxPointers = !session.prevInput ? input.pointers.length : input.pointers.length > session.prevInput.maxPointers ? input.pointers.length : session.prevInput.maxPointers;
12423    computeIntervalInputData(session, input); // find the correct target
12424
12425    var target = manager.element;
12426
12427    if (hasParent(input.srcEvent.target, target)) {
12428      target = input.srcEvent.target;
12429    }
12430
12431    input.target = target;
12432  }
12433
12434  function computeDeltaXY(session, input) {
12435    var center = input.center;
12436    var offset = session.offsetDelta || {};
12437    var prevDelta = session.prevDelta || {};
12438    var prevInput = session.prevInput || {};
12439
12440    if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {
12441      prevDelta = session.prevDelta = {
12442        x: prevInput.deltaX || 0,
12443        y: prevInput.deltaY || 0
12444      };
12445      offset = session.offsetDelta = {
12446        x: center.x,
12447        y: center.y
12448      };
12449    }
12450
12451    input.deltaX = prevDelta.x + (center.x - offset.x);
12452    input.deltaY = prevDelta.y + (center.y - offset.y);
12453  }
12454  /**
12455   * velocity is calculated every x ms
12456   * @param {Object} session
12457   * @param {Object} input
12458   */
12459
12460
12461  function computeIntervalInputData(session, input) {
12462    var last = session.lastInterval || input,
12463        deltaTime = input.timeStamp - last.timeStamp,
12464        velocity,
12465        velocityX,
12466        velocityY,
12467        direction;
12468
12469    if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {
12470      var deltaX = input.deltaX - last.deltaX;
12471      var deltaY = input.deltaY - last.deltaY;
12472      var v = getVelocity(deltaTime, deltaX, deltaY);
12473      velocityX = v.x;
12474      velocityY = v.y;
12475      velocity = abs(v.x) > abs(v.y) ? v.x : v.y;
12476      direction = getDirection(deltaX, deltaY);
12477      session.lastInterval = input;
12478    } else {
12479      // use latest velocity info if it doesn't overtake a minimum period
12480      velocity = last.velocity;
12481      velocityX = last.velocityX;
12482      velocityY = last.velocityY;
12483      direction = last.direction;
12484    }
12485
12486    input.velocity = velocity;
12487    input.velocityX = velocityX;
12488    input.velocityY = velocityY;
12489    input.direction = direction;
12490  }
12491  /**
12492   * create a simple clone from the input used for storage of firstInput and firstMultiple
12493   * @param {Object} input
12494   * @returns {Object} clonedInputData
12495   */
12496
12497
12498  function simpleCloneInputData(input) {
12499    // make a simple copy of the pointers because we will get a reference if we don't
12500    // we only need clientXY for the calculations
12501    var pointers = [];
12502    var i = 0;
12503
12504    while (i < input.pointers.length) {
12505      pointers[i] = {
12506        clientX: round(input.pointers[i].clientX),
12507        clientY: round(input.pointers[i].clientY)
12508      };
12509      i++;
12510    }
12511
12512    return {
12513      timeStamp: now(),
12514      pointers: pointers,
12515      center: getCenter(pointers),
12516      deltaX: input.deltaX,
12517      deltaY: input.deltaY
12518    };
12519  }
12520  /**
12521   * get the center of all the pointers
12522   * @param {Array} pointers
12523   * @return {Object} center contains `x` and `y` properties
12524   */
12525
12526
12527  function getCenter(pointers) {
12528    var pointersLength = pointers.length; // no need to loop when only one touch
12529
12530    if (pointersLength === 1) {
12531      return {
12532        x: round(pointers[0].clientX),
12533        y: round(pointers[0].clientY)
12534      };
12535    }
12536
12537    var x = 0,
12538        y = 0,
12539        i = 0;
12540
12541    while (i < pointersLength) {
12542      x += pointers[i].clientX;
12543      y += pointers[i].clientY;
12544      i++;
12545    }
12546
12547    return {
12548      x: round(x / pointersLength),
12549      y: round(y / pointersLength)
12550    };
12551  }
12552  /**
12553   * calculate the velocity between two points. unit is in px per ms.
12554   * @param {Number} deltaTime
12555   * @param {Number} x
12556   * @param {Number} y
12557   * @return {Object} velocity `x` and `y`
12558   */
12559
12560
12561  function getVelocity(deltaTime, x, y) {
12562    return {
12563      x: x / deltaTime || 0,
12564      y: y / deltaTime || 0
12565    };
12566  }
12567  /**
12568   * get the direction between two points
12569   * @param {Number} x
12570   * @param {Number} y
12571   * @return {Number} direction
12572   */
12573
12574
12575  function getDirection(x, y) {
12576    if (x === y) {
12577      return DIRECTION_NONE;
12578    }
12579
12580    if (abs(x) >= abs(y)) {
12581      return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;
12582    }
12583
12584    return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;
12585  }
12586  /**
12587   * calculate the absolute distance between two points
12588   * @param {Object} p1 {x, y}
12589   * @param {Object} p2 {x, y}
12590   * @param {Array} [props] containing x and y keys
12591   * @return {Number} distance
12592   */
12593
12594
12595  function getDistance(p1, p2, props) {
12596    if (!props) {
12597      props = PROPS_XY;
12598    }
12599
12600    var x = p2[props[0]] - p1[props[0]],
12601        y = p2[props[1]] - p1[props[1]];
12602    return Math.sqrt(x * x + y * y);
12603  }
12604  /**
12605   * calculate the angle between two coordinates
12606   * @param {Object} p1
12607   * @param {Object} p2
12608   * @param {Array} [props] containing x and y keys
12609   * @return {Number} angle
12610   */
12611
12612
12613  function getAngle(p1, p2, props) {
12614    if (!props) {
12615      props = PROPS_XY;
12616    }
12617
12618    var x = p2[props[0]] - p1[props[0]],
12619        y = p2[props[1]] - p1[props[1]];
12620    return Math.atan2(y, x) * 180 / Math.PI;
12621  }
12622  /**
12623   * calculate the rotation degrees between two pointersets
12624   * @param {Array} start array of pointers
12625   * @param {Array} end array of pointers
12626   * @return {Number} rotation
12627   */
12628
12629
12630  function getRotation(start, end) {
12631    return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);
12632  }
12633  /**
12634   * calculate the scale factor between two pointersets
12635   * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out
12636   * @param {Array} start array of pointers
12637   * @param {Array} end array of pointers
12638   * @return {Number} scale
12639   */
12640
12641
12642  function getScale(start, end) {
12643    return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);
12644  }
12645
12646  var MOUSE_INPUT_MAP = {
12647    mousedown: INPUT_START,
12648    mousemove: INPUT_MOVE,
12649    mouseup: INPUT_END
12650  };
12651  var MOUSE_ELEMENT_EVENTS = 'mousedown';
12652  var MOUSE_WINDOW_EVENTS = 'mousemove mouseup';
12653  /**
12654   * Mouse events input
12655   * @constructor
12656   * @extends Input
12657   */
12658
12659  function MouseInput() {
12660    this.evEl = MOUSE_ELEMENT_EVENTS;
12661    this.evWin = MOUSE_WINDOW_EVENTS;
12662    this.pressed = false; // mousedown state
12663
12664    Input.apply(this, arguments);
12665  }
12666
12667  inherit(MouseInput, Input, {
12668    /**
12669     * handle mouse events
12670     * @param {Object} ev
12671     */
12672    handler: function MEhandler(ev) {
12673      var eventType = MOUSE_INPUT_MAP[ev.type]; // on start we want to have the left mouse button down
12674
12675      if (eventType & INPUT_START && ev.button === 0) {
12676        this.pressed = true;
12677      }
12678
12679      if (eventType & INPUT_MOVE && ev.which !== 1) {
12680        eventType = INPUT_END;
12681      } // mouse must be down
12682
12683
12684      if (!this.pressed) {
12685        return;
12686      }
12687
12688      if (eventType & INPUT_END) {
12689        this.pressed = false;
12690      }
12691
12692      this.callback(this.manager, eventType, {
12693        pointers: [ev],
12694        changedPointers: [ev],
12695        pointerType: INPUT_TYPE_MOUSE,
12696        srcEvent: ev
12697      });
12698    }
12699  });
12700  var POINTER_INPUT_MAP = {
12701    pointerdown: INPUT_START,
12702    pointermove: INPUT_MOVE,
12703    pointerup: INPUT_END,
12704    pointercancel: INPUT_CANCEL,
12705    pointerout: INPUT_CANCEL
12706  }; // in IE10 the pointer types is defined as an enum
12707
12708  var IE10_POINTER_TYPE_ENUM = {
12709    2: INPUT_TYPE_TOUCH,
12710    3: INPUT_TYPE_PEN,
12711    4: INPUT_TYPE_MOUSE,
12712    5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816
12713
12714  };
12715  var POINTER_ELEMENT_EVENTS = 'pointerdown';
12716  var POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel'; // IE10 has prefixed support, and case-sensitive
12717
12718  if (window.MSPointerEvent && !window.PointerEvent) {
12719    POINTER_ELEMENT_EVENTS = 'MSPointerDown';
12720    POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';
12721  }
12722  /**
12723   * Pointer events input
12724   * @constructor
12725   * @extends Input
12726   */
12727
12728
12729  function PointerEventInput() {
12730    this.evEl = POINTER_ELEMENT_EVENTS;
12731    this.evWin = POINTER_WINDOW_EVENTS;
12732    Input.apply(this, arguments);
12733    this.store = this.manager.session.pointerEvents = [];
12734  }
12735
12736  inherit(PointerEventInput, Input, {
12737    /**
12738     * handle mouse events
12739     * @param {Object} ev
12740     */
12741    handler: function PEhandler(ev) {
12742      var store = this.store;
12743      var removePointer = false;
12744      var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');
12745      var eventType = POINTER_INPUT_MAP[eventTypeNormalized];
12746      var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;
12747      var isTouch = pointerType == INPUT_TYPE_TOUCH; // get index of the event in the store
12748
12749      var storeIndex = inArray(store, ev.pointerId, 'pointerId'); // start and mouse must be down
12750
12751      if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {
12752        if (storeIndex < 0) {
12753          store.push(ev);
12754          storeIndex = store.length - 1;
12755        }
12756      } else if (eventType & (INPUT_END | INPUT_CANCEL)) {
12757        removePointer = true;
12758      } // it not found, so the pointer hasn't been down (so it's probably a hover)
12759
12760
12761      if (storeIndex < 0) {
12762        return;
12763      } // update the event in the store
12764
12765
12766      store[storeIndex] = ev;
12767      this.callback(this.manager, eventType, {
12768        pointers: store,
12769        changedPointers: [ev],
12770        pointerType: pointerType,
12771        srcEvent: ev
12772      });
12773
12774      if (removePointer) {
12775        // remove from the store
12776        store.splice(storeIndex, 1);
12777      }
12778    }
12779  });
12780  var SINGLE_TOUCH_INPUT_MAP = {
12781    touchstart: INPUT_START,
12782    touchmove: INPUT_MOVE,
12783    touchend: INPUT_END,
12784    touchcancel: INPUT_CANCEL
12785  };
12786  var SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';
12787  var SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';
12788  /**
12789   * Touch events input
12790   * @constructor
12791   * @extends Input
12792   */
12793
12794  function SingleTouchInput() {
12795    this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;
12796    this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;
12797    this.started = false;
12798    Input.apply(this, arguments);
12799  }
12800
12801  inherit(SingleTouchInput, Input, {
12802    handler: function TEhandler(ev) {
12803      var type = SINGLE_TOUCH_INPUT_MAP[ev.type]; // should we handle the touch events?
12804
12805      if (type === INPUT_START) {
12806        this.started = true;
12807      }
12808
12809      if (!this.started) {
12810        return;
12811      }
12812
12813      var touches = normalizeSingleTouches.call(this, ev, type); // when done, reset the started state
12814
12815      if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {
12816        this.started = false;
12817      }
12818
12819      this.callback(this.manager, type, {
12820        pointers: touches[0],
12821        changedPointers: touches[1],
12822        pointerType: INPUT_TYPE_TOUCH,
12823        srcEvent: ev
12824      });
12825    }
12826  });
12827  /**
12828   * @this {TouchInput}
12829   * @param {Object} ev
12830   * @param {Number} type flag
12831   * @returns {undefined|Array} [all, changed]
12832   */
12833
12834  function normalizeSingleTouches(ev, type) {
12835    var all = toArray(ev.touches);
12836    var changed = toArray(ev.changedTouches);
12837
12838    if (type & (INPUT_END | INPUT_CANCEL)) {
12839      all = uniqueArray(all.concat(changed), 'identifier', true);
12840    }
12841
12842    return [all, changed];
12843  }
12844
12845  var TOUCH_INPUT_MAP = {
12846    touchstart: INPUT_START,
12847    touchmove: INPUT_MOVE,
12848    touchend: INPUT_END,
12849    touchcancel: INPUT_CANCEL
12850  };
12851  var TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';
12852  /**
12853   * Multi-user touch events input
12854   * @constructor
12855   * @extends Input
12856   */
12857
12858  function TouchInput() {
12859    this.evTarget = TOUCH_TARGET_EVENTS;
12860    this.targetIds = {};
12861    Input.apply(this, arguments);
12862  }
12863
12864  inherit(TouchInput, Input, {
12865    handler: function MTEhandler(ev) {
12866      var type = TOUCH_INPUT_MAP[ev.type];
12867      var touches = getTouches.call(this, ev, type);
12868
12869      if (!touches) {
12870        return;
12871      }
12872
12873      this.callback(this.manager, type, {
12874        pointers: touches[0],
12875        changedPointers: touches[1],
12876        pointerType: INPUT_TYPE_TOUCH,
12877        srcEvent: ev
12878      });
12879    }
12880  });
12881  /**
12882   * @this {TouchInput}
12883   * @param {Object} ev
12884   * @param {Number} type flag
12885   * @returns {undefined|Array} [all, changed]
12886   */
12887
12888  function getTouches(ev, type) {
12889    var allTouches = toArray(ev.touches);
12890    var targetIds = this.targetIds; // when there is only one touch, the process can be simplified
12891
12892    if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {
12893      targetIds[allTouches[0].identifier] = true;
12894      return [allTouches, allTouches];
12895    }
12896
12897    var i,
12898        targetTouches,
12899        changedTouches = toArray(ev.changedTouches),
12900        changedTargetTouches = [],
12901        target = this.target; // get target touches from touches
12902
12903    targetTouches = allTouches.filter(function (touch) {
12904      return hasParent(touch.target, target);
12905    }); // collect touches
12906
12907    if (type === INPUT_START) {
12908      i = 0;
12909
12910      while (i < targetTouches.length) {
12911        targetIds[targetTouches[i].identifier] = true;
12912        i++;
12913      }
12914    } // filter changed touches to only contain touches that exist in the collected target ids
12915
12916
12917    i = 0;
12918
12919    while (i < changedTouches.length) {
12920      if (targetIds[changedTouches[i].identifier]) {
12921        changedTargetTouches.push(changedTouches[i]);
12922      } // cleanup removed touches
12923
12924
12925      if (type & (INPUT_END | INPUT_CANCEL)) {
12926        delete targetIds[changedTouches[i].identifier];
12927      }
12928
12929      i++;
12930    }
12931
12932    if (!changedTargetTouches.length) {
12933      return;
12934    }
12935
12936    return [// merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'
12937    uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true), changedTargetTouches];
12938  }
12939  /**
12940   * Combined touch and mouse input
12941   *
12942   * Touch has a higher priority then mouse, and while touching no mouse events are allowed.
12943   * This because touch devices also emit mouse events while doing a touch.
12944   *
12945   * @constructor
12946   * @extends Input
12947   */
12948
12949
12950  var DEDUP_TIMEOUT = 2500;
12951  var DEDUP_DISTANCE = 25;
12952
12953  function TouchMouseInput() {
12954    Input.apply(this, arguments);
12955    var handler = bindFn(this.handler, this);
12956    this.touch = new TouchInput(this.manager, handler);
12957    this.mouse = new MouseInput(this.manager, handler);
12958    this.primaryTouch = null;
12959    this.lastTouches = [];
12960  }
12961
12962  inherit(TouchMouseInput, Input, {
12963    /**
12964     * handle mouse and touch events
12965     * @param {Hammer} manager
12966     * @param {String} inputEvent
12967     * @param {Object} inputData
12968     */
12969    handler: function TMEhandler(manager, inputEvent, inputData) {
12970      var isTouch = inputData.pointerType == INPUT_TYPE_TOUCH,
12971          isMouse = inputData.pointerType == INPUT_TYPE_MOUSE;
12972
12973      if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {
12974        return;
12975      } // when we're in a touch event, record touches to  de-dupe synthetic mouse event
12976
12977
12978      if (isTouch) {
12979        recordTouches.call(this, inputEvent, inputData);
12980      } else if (isMouse && isSyntheticEvent.call(this, inputData)) {
12981        return;
12982      }
12983
12984      this.callback(manager, inputEvent, inputData);
12985    },
12986
12987    /**
12988     * remove the event listeners
12989     */
12990    destroy: function destroy() {
12991      this.touch.destroy();
12992      this.mouse.destroy();
12993    }
12994  });
12995
12996  function recordTouches(eventType, eventData) {
12997    if (eventType & INPUT_START) {
12998      this.primaryTouch = eventData.changedPointers[0].identifier;
12999      setLastTouch.call(this, eventData);
13000    } else if (eventType & (INPUT_END | INPUT_CANCEL)) {
13001      setLastTouch.call(this, eventData);
13002    }
13003  }
13004
13005  function setLastTouch(eventData) {
13006    var touch = eventData.changedPointers[0];
13007
13008    if (touch.identifier === this.primaryTouch) {
13009      var lastTouch = {
13010        x: touch.clientX,
13011        y: touch.clientY
13012      };
13013      this.lastTouches.push(lastTouch);
13014      var lts = this.lastTouches;
13015
13016      var removeLastTouch = function removeLastTouch() {
13017        var i = lts.indexOf(lastTouch);
13018
13019        if (i > -1) {
13020          lts.splice(i, 1);
13021        }
13022      };
13023
13024      setTimeout(removeLastTouch, DEDUP_TIMEOUT);
13025    }
13026  }
13027
13028  function isSyntheticEvent(eventData) {
13029    var x = eventData.srcEvent.clientX,
13030        y = eventData.srcEvent.clientY;
13031
13032    for (var i = 0; i < this.lastTouches.length; i++) {
13033      var t = this.lastTouches[i];
13034      var dx = Math.abs(x - t.x),
13035          dy = Math.abs(y - t.y);
13036
13037      if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {
13038        return true;
13039      }
13040    }
13041
13042    return false;
13043  }
13044
13045  var PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');
13046  var NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined; // magical touchAction value
13047
13048  var TOUCH_ACTION_COMPUTE = 'compute';
13049  var TOUCH_ACTION_AUTO = 'auto';
13050  var TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented
13051
13052  var TOUCH_ACTION_NONE = 'none';
13053  var TOUCH_ACTION_PAN_X = 'pan-x';
13054  var TOUCH_ACTION_PAN_Y = 'pan-y';
13055  var TOUCH_ACTION_MAP = getTouchActionProps();
13056  /**
13057   * Touch Action
13058   * sets the touchAction property or uses the js alternative
13059   * @param {Manager} manager
13060   * @param {String} value
13061   * @constructor
13062   */
13063
13064  function TouchAction(manager, value) {
13065    this.manager = manager;
13066    this.set(value);
13067  }
13068
13069  TouchAction.prototype = {
13070    /**
13071     * set the touchAction value on the element or enable the polyfill
13072     * @param {String} value
13073     */
13074    set: function set(value) {
13075      // find out the touch-action by the event handlers
13076      if (value == TOUCH_ACTION_COMPUTE) {
13077        value = this.compute();
13078      }
13079
13080      if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {
13081        this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;
13082      }
13083
13084      this.actions = value.toLowerCase().trim();
13085    },
13086
13087    /**
13088     * just re-set the touchAction value
13089     */
13090    update: function update() {
13091      this.set(this.manager.options.touchAction);
13092    },
13093
13094    /**
13095     * compute the value for the touchAction property based on the recognizer's settings
13096     * @returns {String} value
13097     */
13098    compute: function compute() {
13099      var actions = [];
13100      each(this.manager.recognizers, function (recognizer) {
13101        if (boolOrFn(recognizer.options.enable, [recognizer])) {
13102          actions = actions.concat(recognizer.getTouchAction());
13103        }
13104      });
13105      return cleanTouchActions(actions.join(' '));
13106    },
13107
13108    /**
13109     * this method is called on each input cycle and provides the preventing of the browser behavior
13110     * @param {Object} input
13111     */
13112    preventDefaults: function preventDefaults(input) {
13113      var srcEvent = input.srcEvent;
13114      var direction = input.offsetDirection; // if the touch action did prevented once this session
13115
13116      if (this.manager.session.prevented) {
13117        srcEvent.preventDefault();
13118        return;
13119      }
13120
13121      var actions = this.actions;
13122      var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];
13123      var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];
13124      var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];
13125
13126      if (hasNone) {
13127        //do not prevent defaults if this is a tap gesture
13128        var isTapPointer = input.pointers.length === 1;
13129        var isTapMovement = input.distance < 2;
13130        var isTapTouchTime = input.deltaTime < 250;
13131
13132        if (isTapPointer && isTapMovement && isTapTouchTime) {
13133          return;
13134        }
13135      }
13136
13137      if (hasPanX && hasPanY) {
13138        // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent
13139        return;
13140      }
13141
13142      if (hasNone || hasPanY && direction & DIRECTION_HORIZONTAL || hasPanX && direction & DIRECTION_VERTICAL) {
13143        return this.preventSrc(srcEvent);
13144      }
13145    },
13146
13147    /**
13148     * call preventDefault to prevent the browser's default behavior (scrolling in most cases)
13149     * @param {Object} srcEvent
13150     */
13151    preventSrc: function preventSrc(srcEvent) {
13152      this.manager.session.prevented = true;
13153      srcEvent.preventDefault();
13154    }
13155  };
13156  /**
13157   * when the touchActions are collected they are not a valid value, so we need to clean things up. *
13158   * @param {String} actions
13159   * @returns {*}
13160   */
13161
13162  function cleanTouchActions(actions) {
13163    // none
13164    if (inStr(actions, TOUCH_ACTION_NONE)) {
13165      return TOUCH_ACTION_NONE;
13166    }
13167
13168    var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);
13169    var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y); // if both pan-x and pan-y are set (different recognizers
13170    // for different directions, e.g. horizontal pan but vertical swipe?)
13171    // we need none (as otherwise with pan-x pan-y combined none of these
13172    // recognizers will work, since the browser would handle all panning
13173
13174    if (hasPanX && hasPanY) {
13175      return TOUCH_ACTION_NONE;
13176    } // pan-x OR pan-y
13177
13178
13179    if (hasPanX || hasPanY) {
13180      return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;
13181    } // manipulation
13182
13183
13184    if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {
13185      return TOUCH_ACTION_MANIPULATION;
13186    }
13187
13188    return TOUCH_ACTION_AUTO;
13189  }
13190
13191  function getTouchActionProps() {
13192    if (!NATIVE_TOUCH_ACTION) {
13193      return false;
13194    }
13195
13196    var touchMap = {};
13197    var cssSupports = window.CSS && window.CSS.supports;
13198    ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function (val) {
13199      // If css.supports is not supported but there is native touch-action assume it supports
13200      // all values. This is the case for IE 10 and 11.
13201      touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;
13202    });
13203    return touchMap;
13204  }
13205  /**
13206   * Recognizer flow explained; *
13207   * All recognizers have the initial state of POSSIBLE when a input session starts.
13208   * The definition of a input session is from the first input until the last input, with all it's movement in it. *
13209   * Example session for mouse-input: mousedown -> mousemove -> mouseup
13210   *
13211   * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed
13212   * which determines with state it should be.
13213   *
13214   * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to
13215   * POSSIBLE to give it another change on the next cycle.
13216   *
13217   *               Possible
13218   *                  |
13219   *            +-----+---------------+
13220   *            |                     |
13221   *      +-----+-----+               |
13222   *      |           |               |
13223   *   Failed      Cancelled          |
13224   *                          +-------+------+
13225   *                          |              |
13226   *                      Recognized       Began
13227   *                                         |
13228   *                                      Changed
13229   *                                         |
13230   *                                  Ended/Recognized
13231   */
13232
13233
13234  var STATE_POSSIBLE = 1;
13235  var STATE_BEGAN = 2;
13236  var STATE_CHANGED = 4;
13237  var STATE_ENDED = 8;
13238  var STATE_RECOGNIZED = STATE_ENDED;
13239  var STATE_CANCELLED = 16;
13240  var STATE_FAILED = 32;
13241  /**
13242   * Recognizer
13243   * Every recognizer needs to extend from this class.
13244   * @constructor
13245   * @param {Object} options
13246   */
13247
13248  function Recognizer(options) {
13249    this.options = assign({}, this.defaults, options || {});
13250    this.id = uniqueId();
13251    this.manager = null; // default is enable true
13252
13253    this.options.enable = ifUndefined(this.options.enable, true);
13254    this.state = STATE_POSSIBLE;
13255    this.simultaneous = {};
13256    this.requireFail = [];
13257  }
13258
13259  Recognizer.prototype = {
13260    /**
13261     * @virtual
13262     * @type {Object}
13263     */
13264    defaults: {},
13265
13266    /**
13267     * set options
13268     * @param {Object} options
13269     * @return {Recognizer}
13270     */
13271    set: function set(options) {
13272      assign(this.options, options); // also update the touchAction, in case something changed about the directions/enabled state
13273
13274      this.manager && this.manager.touchAction.update();
13275      return this;
13276    },
13277
13278    /**
13279     * recognize simultaneous with an other recognizer.
13280     * @param {Recognizer} otherRecognizer
13281     * @returns {Recognizer} this
13282     */
13283    recognizeWith: function recognizeWith(otherRecognizer) {
13284      if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {
13285        return this;
13286      }
13287
13288      var simultaneous = this.simultaneous;
13289      otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);
13290
13291      if (!simultaneous[otherRecognizer.id]) {
13292        simultaneous[otherRecognizer.id] = otherRecognizer;
13293        otherRecognizer.recognizeWith(this);
13294      }
13295
13296      return this;
13297    },
13298
13299    /**
13300     * drop the simultaneous link. it doesnt remove the link on the other recognizer.
13301     * @param {Recognizer} otherRecognizer
13302     * @returns {Recognizer} this
13303     */
13304    dropRecognizeWith: function dropRecognizeWith(otherRecognizer) {
13305      if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {
13306        return this;
13307      }
13308
13309      otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);
13310      delete this.simultaneous[otherRecognizer.id];
13311      return this;
13312    },
13313
13314    /**
13315     * recognizer can only run when an other is failing
13316     * @param {Recognizer} otherRecognizer
13317     * @returns {Recognizer} this
13318     */
13319    requireFailure: function requireFailure(otherRecognizer) {
13320      if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {
13321        return this;
13322      }
13323
13324      var requireFail = this.requireFail;
13325      otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);
13326
13327      if (inArray(requireFail, otherRecognizer) === -1) {
13328        requireFail.push(otherRecognizer);
13329        otherRecognizer.requireFailure(this);
13330      }
13331
13332      return this;
13333    },
13334
13335    /**
13336     * drop the requireFailure link. it does not remove the link on the other recognizer.
13337     * @param {Recognizer} otherRecognizer
13338     * @returns {Recognizer} this
13339     */
13340    dropRequireFailure: function dropRequireFailure(otherRecognizer) {
13341      if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {
13342        return this;
13343      }
13344
13345      otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);
13346      var index = inArray(this.requireFail, otherRecognizer);
13347
13348      if (index > -1) {
13349        this.requireFail.splice(index, 1);
13350      }
13351
13352      return this;
13353    },
13354
13355    /**
13356     * has require failures boolean
13357     * @returns {boolean}
13358     */
13359    hasRequireFailures: function hasRequireFailures() {
13360      return this.requireFail.length > 0;
13361    },
13362
13363    /**
13364     * if the recognizer can recognize simultaneous with an other recognizer
13365     * @param {Recognizer} otherRecognizer
13366     * @returns {Boolean}
13367     */
13368    canRecognizeWith: function canRecognizeWith(otherRecognizer) {
13369      return !!this.simultaneous[otherRecognizer.id];
13370    },
13371
13372    /**
13373     * You should use `tryEmit` instead of `emit` directly to check
13374     * that all the needed recognizers has failed before emitting.
13375     * @param {Object} input
13376     */
13377    emit: function emit(input) {
13378      var self = this;
13379      var state = this.state;
13380
13381      function emit(event) {
13382        self.manager.emit(event, input);
13383      } // 'panstart' and 'panmove'
13384
13385
13386      if (state < STATE_ENDED) {
13387        emit(self.options.event + stateStr(state));
13388      }
13389
13390      emit(self.options.event); // simple 'eventName' events
13391
13392      if (input.additionalEvent) {
13393        // additional event(panleft, panright, pinchin, pinchout...)
13394        emit(input.additionalEvent);
13395      } // panend and pancancel
13396
13397
13398      if (state >= STATE_ENDED) {
13399        emit(self.options.event + stateStr(state));
13400      }
13401    },
13402
13403    /**
13404     * Check that all the require failure recognizers has failed,
13405     * if true, it emits a gesture event,
13406     * otherwise, setup the state to FAILED.
13407     * @param {Object} input
13408     */
13409    tryEmit: function tryEmit(input) {
13410      if (this.canEmit()) {
13411        return this.emit(input);
13412      } // it's failing anyway
13413
13414
13415      this.state = STATE_FAILED;
13416    },
13417
13418    /**
13419     * can we emit?
13420     * @returns {boolean}
13421     */
13422    canEmit: function canEmit() {
13423      var i = 0;
13424
13425      while (i < this.requireFail.length) {
13426        if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {
13427          return false;
13428        }
13429
13430        i++;
13431      }
13432
13433      return true;
13434    },
13435
13436    /**
13437     * update the recognizer
13438     * @param {Object} inputData
13439     */
13440    recognize: function recognize(inputData) {
13441      // make a new copy of the inputData
13442      // so we can change the inputData without messing up the other recognizers
13443      var inputDataClone = assign({}, inputData); // is is enabled and allow recognizing?
13444
13445      if (!boolOrFn(this.options.enable, [this, inputDataClone])) {
13446        this.reset();
13447        this.state = STATE_FAILED;
13448        return;
13449      } // reset when we've reached the end
13450
13451
13452      if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {
13453        this.state = STATE_POSSIBLE;
13454      }
13455
13456      this.state = this.process(inputDataClone); // the recognizer has recognized a gesture
13457      // so trigger an event
13458
13459      if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {
13460        this.tryEmit(inputDataClone);
13461      }
13462    },
13463
13464    /**
13465     * return the state of the recognizer
13466     * the actual recognizing happens in this method
13467     * @virtual
13468     * @param {Object} inputData
13469     * @returns {Const} STATE
13470     */
13471    process: function process(inputData) {},
13472    // jshint ignore:line
13473
13474    /**
13475     * return the preferred touch-action
13476     * @virtual
13477     * @returns {Array}
13478     */
13479    getTouchAction: function getTouchAction() {},
13480
13481    /**
13482     * called when the gesture isn't allowed to recognize
13483     * like when another is being recognized or it is disabled
13484     * @virtual
13485     */
13486    reset: function reset() {}
13487  };
13488  /**
13489   * get a usable string, used as event postfix
13490   * @param {Const} state
13491   * @returns {String} state
13492   */
13493
13494  function stateStr(state) {
13495    if (state & STATE_CANCELLED) {
13496      return 'cancel';
13497    } else if (state & STATE_ENDED) {
13498      return 'end';
13499    } else if (state & STATE_CHANGED) {
13500      return 'move';
13501    } else if (state & STATE_BEGAN) {
13502      return 'start';
13503    }
13504
13505    return '';
13506  }
13507  /**
13508   * direction cons to string
13509   * @param {Const} direction
13510   * @returns {String}
13511   */
13512
13513
13514  function directionStr(direction) {
13515    if (direction == DIRECTION_DOWN) {
13516      return 'down';
13517    } else if (direction == DIRECTION_UP) {
13518      return 'up';
13519    } else if (direction == DIRECTION_LEFT) {
13520      return 'left';
13521    } else if (direction == DIRECTION_RIGHT) {
13522      return 'right';
13523    }
13524
13525    return '';
13526  }
13527  /**
13528   * get a recognizer by name if it is bound to a manager
13529   * @param {Recognizer|String} otherRecognizer
13530   * @param {Recognizer} recognizer
13531   * @returns {Recognizer}
13532   */
13533
13534
13535  function getRecognizerByNameIfManager(otherRecognizer, recognizer) {
13536    var manager = recognizer.manager;
13537
13538    if (manager) {
13539      return manager.get(otherRecognizer);
13540    }
13541
13542    return otherRecognizer;
13543  }
13544  /**
13545   * This recognizer is just used as a base for the simple attribute recognizers.
13546   * @constructor
13547   * @extends Recognizer
13548   */
13549
13550
13551  function AttrRecognizer() {
13552    Recognizer.apply(this, arguments);
13553  }
13554
13555  inherit(AttrRecognizer, Recognizer, {
13556    /**
13557     * @namespace
13558     * @memberof AttrRecognizer
13559     */
13560    defaults: {
13561      /**
13562       * @type {Number}
13563       * @default 1
13564       */
13565      pointers: 1
13566    },
13567
13568    /**
13569     * Used to check if it the recognizer receives valid input, like input.distance > 10.
13570     * @memberof AttrRecognizer
13571     * @param {Object} input
13572     * @returns {Boolean} recognized
13573     */
13574    attrTest: function attrTest(input) {
13575      var optionPointers = this.options.pointers;
13576      return optionPointers === 0 || input.pointers.length === optionPointers;
13577    },
13578
13579    /**
13580     * Process the input and return the state for the recognizer
13581     * @memberof AttrRecognizer
13582     * @param {Object} input
13583     * @returns {*} State
13584     */
13585    process: function process(input) {
13586      var state = this.state;
13587      var eventType = input.eventType;
13588      var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);
13589      var isValid = this.attrTest(input); // on cancel input and we've recognized before, return STATE_CANCELLED
13590
13591      if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {
13592        return state | STATE_CANCELLED;
13593      } else if (isRecognized || isValid) {
13594        if (eventType & INPUT_END) {
13595          return state | STATE_ENDED;
13596        } else if (!(state & STATE_BEGAN)) {
13597          return STATE_BEGAN;
13598        }
13599
13600        return state | STATE_CHANGED;
13601      }
13602
13603      return STATE_FAILED;
13604    }
13605  });
13606  /**
13607   * Pan
13608   * Recognized when the pointer is down and moved in the allowed direction.
13609   * @constructor
13610   * @extends AttrRecognizer
13611   */
13612
13613  function PanRecognizer() {
13614    AttrRecognizer.apply(this, arguments);
13615    this.pX = null;
13616    this.pY = null;
13617  }
13618
13619  inherit(PanRecognizer, AttrRecognizer, {
13620    /**
13621     * @namespace
13622     * @memberof PanRecognizer
13623     */
13624    defaults: {
13625      event: 'pan',
13626      threshold: 10,
13627      pointers: 1,
13628      direction: DIRECTION_ALL
13629    },
13630    getTouchAction: function getTouchAction() {
13631      var direction = this.options.direction;
13632      var actions = [];
13633
13634      if (direction & DIRECTION_HORIZONTAL) {
13635        actions.push(TOUCH_ACTION_PAN_Y);
13636      }
13637
13638      if (direction & DIRECTION_VERTICAL) {
13639        actions.push(TOUCH_ACTION_PAN_X);
13640      }
13641
13642      return actions;
13643    },
13644    directionTest: function directionTest(input) {
13645      var options = this.options;
13646      var hasMoved = true;
13647      var distance = input.distance;
13648      var direction = input.direction;
13649      var x = input.deltaX;
13650      var y = input.deltaY; // lock to axis?
13651
13652      if (!(direction & options.direction)) {
13653        if (options.direction & DIRECTION_HORIZONTAL) {
13654          direction = x === 0 ? DIRECTION_NONE : x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;
13655          hasMoved = x != this.pX;
13656          distance = Math.abs(input.deltaX);
13657        } else {
13658          direction = y === 0 ? DIRECTION_NONE : y < 0 ? DIRECTION_UP : DIRECTION_DOWN;
13659          hasMoved = y != this.pY;
13660          distance = Math.abs(input.deltaY);
13661        }
13662      }
13663
13664      input.direction = direction;
13665      return hasMoved && distance > options.threshold && direction & options.direction;
13666    },
13667    attrTest: function attrTest(input) {
13668      return AttrRecognizer.prototype.attrTest.call(this, input) && (this.state & STATE_BEGAN || !(this.state & STATE_BEGAN) && this.directionTest(input));
13669    },
13670    emit: function emit(input) {
13671      this.pX = input.deltaX;
13672      this.pY = input.deltaY;
13673      var direction = directionStr(input.direction);
13674
13675      if (direction) {
13676        input.additionalEvent = this.options.event + direction;
13677      }
13678
13679      this._super.emit.call(this, input);
13680    }
13681  });
13682  /**
13683   * Pinch
13684   * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).
13685   * @constructor
13686   * @extends AttrRecognizer
13687   */
13688
13689  function PinchRecognizer() {
13690    AttrRecognizer.apply(this, arguments);
13691  }
13692
13693  inherit(PinchRecognizer, AttrRecognizer, {
13694    /**
13695     * @namespace
13696     * @memberof PinchRecognizer
13697     */
13698    defaults: {
13699      event: 'pinch',
13700      threshold: 0,
13701      pointers: 2
13702    },
13703    getTouchAction: function getTouchAction() {
13704      return [TOUCH_ACTION_NONE];
13705    },
13706    attrTest: function attrTest(input) {
13707      return this._super.attrTest.call(this, input) && (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);
13708    },
13709    emit: function emit(input) {
13710      if (input.scale !== 1) {
13711        var inOut = input.scale < 1 ? 'in' : 'out';
13712        input.additionalEvent = this.options.event + inOut;
13713      }
13714
13715      this._super.emit.call(this, input);
13716    }
13717  });
13718  /**
13719   * Press
13720   * Recognized when the pointer is down for x ms without any movement.
13721   * @constructor
13722   * @extends Recognizer
13723   */
13724
13725  function PressRecognizer() {
13726    Recognizer.apply(this, arguments);
13727    this._timer = null;
13728    this._input = null;
13729  }
13730
13731  inherit(PressRecognizer, Recognizer, {
13732    /**
13733     * @namespace
13734     * @memberof PressRecognizer
13735     */
13736    defaults: {
13737      event: 'press',
13738      pointers: 1,
13739      time: 251,
13740      // minimal time of the pointer to be pressed
13741      threshold: 9 // a minimal movement is ok, but keep it low
13742
13743    },
13744    getTouchAction: function getTouchAction() {
13745      return [TOUCH_ACTION_AUTO];
13746    },
13747    process: function process(input) {
13748      var options = this.options;
13749      var validPointers = input.pointers.length === options.pointers;
13750      var validMovement = input.distance < options.threshold;
13751      var validTime = input.deltaTime > options.time;
13752      this._input = input; // we only allow little movement
13753      // and we've reached an end event, so a tap is possible
13754
13755      if (!validMovement || !validPointers || input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime) {
13756        this.reset();
13757      } else if (input.eventType & INPUT_START) {
13758        this.reset();
13759        this._timer = setTimeoutContext(function () {
13760          this.state = STATE_RECOGNIZED;
13761          this.tryEmit();
13762        }, options.time, this);
13763      } else if (input.eventType & INPUT_END) {
13764        return STATE_RECOGNIZED;
13765      }
13766
13767      return STATE_FAILED;
13768    },
13769    reset: function reset() {
13770      clearTimeout(this._timer);
13771    },
13772    emit: function emit(input) {
13773      if (this.state !== STATE_RECOGNIZED) {
13774        return;
13775      }
13776
13777      if (input && input.eventType & INPUT_END) {
13778        this.manager.emit(this.options.event + 'up', input);
13779      } else {
13780        this._input.timeStamp = now();
13781        this.manager.emit(this.options.event, this._input);
13782      }
13783    }
13784  });
13785  /**
13786   * Rotate
13787   * Recognized when two or more pointer are moving in a circular motion.
13788   * @constructor
13789   * @extends AttrRecognizer
13790   */
13791
13792  function RotateRecognizer() {
13793    AttrRecognizer.apply(this, arguments);
13794  }
13795
13796  inherit(RotateRecognizer, AttrRecognizer, {
13797    /**
13798     * @namespace
13799     * @memberof RotateRecognizer
13800     */
13801    defaults: {
13802      event: 'rotate',
13803      threshold: 0,
13804      pointers: 2
13805    },
13806    getTouchAction: function getTouchAction() {
13807      return [TOUCH_ACTION_NONE];
13808    },
13809    attrTest: function attrTest(input) {
13810      return this._super.attrTest.call(this, input) && (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);
13811    }
13812  });
13813  /**
13814   * Swipe
13815   * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.
13816   * @constructor
13817   * @extends AttrRecognizer
13818   */
13819
13820  function SwipeRecognizer() {
13821    AttrRecognizer.apply(this, arguments);
13822  }
13823
13824  inherit(SwipeRecognizer, AttrRecognizer, {
13825    /**
13826     * @namespace
13827     * @memberof SwipeRecognizer
13828     */
13829    defaults: {
13830      event: 'swipe',
13831      threshold: 10,
13832      velocity: 0.3,
13833      direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,
13834      pointers: 1
13835    },
13836    getTouchAction: function getTouchAction() {
13837      return PanRecognizer.prototype.getTouchAction.call(this);
13838    },
13839    attrTest: function attrTest(input) {
13840      var direction = this.options.direction;
13841      var velocity;
13842
13843      if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {
13844        velocity = input.overallVelocity;
13845      } else if (direction & DIRECTION_HORIZONTAL) {
13846        velocity = input.overallVelocityX;
13847      } else if (direction & DIRECTION_VERTICAL) {
13848        velocity = input.overallVelocityY;
13849      }
13850
13851      return this._super.attrTest.call(this, input) && direction & input.offsetDirection && input.distance > this.options.threshold && input.maxPointers == this.options.pointers && abs(velocity) > this.options.velocity && input.eventType & INPUT_END;
13852    },
13853    emit: function emit(input) {
13854      var direction = directionStr(input.offsetDirection);
13855
13856      if (direction) {
13857        this.manager.emit(this.options.event + direction, input);
13858      }
13859
13860      this.manager.emit(this.options.event, input);
13861    }
13862  });
13863  /**
13864   * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur
13865   * between the given interval and position. The delay option can be used to recognize multi-taps without firing
13866   * a single tap.
13867   *
13868   * The eventData from the emitted event contains the property `tapCount`, which contains the amount of
13869   * multi-taps being recognized.
13870   * @constructor
13871   * @extends Recognizer
13872   */
13873
13874  function TapRecognizer() {
13875    Recognizer.apply(this, arguments); // previous time and center,
13876    // used for tap counting
13877
13878    this.pTime = false;
13879    this.pCenter = false;
13880    this._timer = null;
13881    this._input = null;
13882    this.count = 0;
13883  }
13884
13885  inherit(TapRecognizer, Recognizer, {
13886    /**
13887     * @namespace
13888     * @memberof PinchRecognizer
13889     */
13890    defaults: {
13891      event: 'tap',
13892      pointers: 1,
13893      taps: 1,
13894      interval: 300,
13895      // max time between the multi-tap taps
13896      time: 250,
13897      // max time of the pointer to be down (like finger on the screen)
13898      threshold: 9,
13899      // a minimal movement is ok, but keep it low
13900      posThreshold: 10 // a multi-tap can be a bit off the initial position
13901
13902    },
13903    getTouchAction: function getTouchAction() {
13904      return [TOUCH_ACTION_MANIPULATION];
13905    },
13906    process: function process(input) {
13907      var options = this.options;
13908      var validPointers = input.pointers.length === options.pointers;
13909      var validMovement = input.distance < options.threshold;
13910      var validTouchTime = input.deltaTime < options.time;
13911      this.reset();
13912
13913      if (input.eventType & INPUT_START && this.count === 0) {
13914        return this.failTimeout();
13915      } // we only allow little movement
13916      // and we've reached an end event, so a tap is possible
13917
13918
13919      if (validMovement && validTouchTime && validPointers) {
13920        if (input.eventType != INPUT_END) {
13921          return this.failTimeout();
13922        }
13923
13924        var validInterval = this.pTime ? input.timeStamp - this.pTime < options.interval : true;
13925        var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;
13926        this.pTime = input.timeStamp;
13927        this.pCenter = input.center;
13928
13929        if (!validMultiTap || !validInterval) {
13930          this.count = 1;
13931        } else {
13932          this.count += 1;
13933        }
13934
13935        this._input = input; // if tap count matches we have recognized it,
13936        // else it has began recognizing...
13937
13938        var tapCount = this.count % options.taps;
13939
13940        if (tapCount === 0) {
13941          // no failing requirements, immediately trigger the tap event
13942          // or wait as long as the multitap interval to trigger
13943          if (!this.hasRequireFailures()) {
13944            return STATE_RECOGNIZED;
13945          } else {
13946            this._timer = setTimeoutContext(function () {
13947              this.state = STATE_RECOGNIZED;
13948              this.tryEmit();
13949            }, options.interval, this);
13950            return STATE_BEGAN;
13951          }
13952        }
13953      }
13954
13955      return STATE_FAILED;
13956    },
13957    failTimeout: function failTimeout() {
13958      this._timer = setTimeoutContext(function () {
13959        this.state = STATE_FAILED;
13960      }, this.options.interval, this);
13961      return STATE_FAILED;
13962    },
13963    reset: function reset() {
13964      clearTimeout(this._timer);
13965    },
13966    emit: function emit() {
13967      if (this.state == STATE_RECOGNIZED) {
13968        this._input.tapCount = this.count;
13969        this.manager.emit(this.options.event, this._input);
13970      }
13971    }
13972  });
13973  /**
13974   * Simple way to create a manager with a default set of recognizers.
13975   * @param {HTMLElement} element
13976   * @param {Object} [options]
13977   * @constructor
13978   */
13979
13980  function Hammer(element, options) {
13981    options = options || {};
13982    options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);
13983    return new Manager(element, options);
13984  }
13985  /**
13986   * @const {string}
13987   */
13988
13989
13990  Hammer.VERSION = '2.0.7';
13991  /**
13992   * default settings
13993   * @namespace
13994   */
13995
13996  Hammer.defaults = {
13997    /**
13998     * set if DOM events are being triggered.
13999     * But this is slower and unused by simple implementations, so disabled by default.
14000     * @type {Boolean}
14001     * @default false
14002     */
14003    domEvents: false,
14004
14005    /**
14006     * The value for the touchAction property/fallback.
14007     * When set to `compute` it will magically set the correct value based on the added recognizers.
14008     * @type {String}
14009     * @default compute
14010     */
14011    touchAction: TOUCH_ACTION_COMPUTE,
14012
14013    /**
14014     * @type {Boolean}
14015     * @default true
14016     */
14017    enable: true,
14018
14019    /**
14020     * EXPERIMENTAL FEATURE -- can be removed/changed
14021     * Change the parent input target element.
14022     * If Null, then it is being set the to main element.
14023     * @type {Null|EventTarget}
14024     * @default null
14025     */
14026    inputTarget: null,
14027
14028    /**
14029     * force an input class
14030     * @type {Null|Function}
14031     * @default null
14032     */
14033    inputClass: null,
14034
14035    /**
14036     * Default recognizer setup when calling `Hammer()`
14037     * When creating a new Manager these will be skipped.
14038     * @type {Array}
14039     */
14040    preset: [// RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]
14041    [RotateRecognizer, {
14042      enable: false
14043    }], [PinchRecognizer, {
14044      enable: false
14045    }, ['rotate']], [SwipeRecognizer, {
14046      direction: DIRECTION_HORIZONTAL
14047    }], [PanRecognizer, {
14048      direction: DIRECTION_HORIZONTAL
14049    }, ['swipe']], [TapRecognizer], [TapRecognizer, {
14050      event: 'doubletap',
14051      taps: 2
14052    }, ['tap']], [PressRecognizer]],
14053
14054    /**
14055     * Some CSS properties can be used to improve the working of Hammer.
14056     * Add them to this method and they will be set when creating a new Manager.
14057     * @namespace
14058     */
14059    cssProps: {
14060      /**
14061       * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.
14062       * @type {String}
14063       * @default 'none'
14064       */
14065      userSelect: 'none',
14066
14067      /**
14068       * Disable the Windows Phone grippers when pressing an element.
14069       * @type {String}
14070       * @default 'none'
14071       */
14072      touchSelect: 'none',
14073
14074      /**
14075       * Disables the default callout shown when you touch and hold a touch target.
14076       * On iOS, when you touch and hold a touch target such as a link, Safari displays
14077       * a callout containing information about the link. This property allows you to disable that callout.
14078       * @type {String}
14079       * @default 'none'
14080       */
14081      touchCallout: 'none',
14082
14083      /**
14084       * Specifies whether zooming is enabled. Used by IE10>
14085       * @type {String}
14086       * @default 'none'
14087       */
14088      contentZooming: 'none',
14089
14090      /**
14091       * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.
14092       * @type {String}
14093       * @default 'none'
14094       */
14095      userDrag: 'none',
14096
14097      /**
14098       * Overrides the highlight color shown when the user taps a link or a JavaScript
14099       * clickable element in iOS. This property obeys the alpha value, if specified.
14100       * @type {String}
14101       * @default 'rgba(0,0,0,0)'
14102       */
14103      tapHighlightColor: 'rgba(0,0,0,0)'
14104    }
14105  };
14106  var STOP = 1;
14107  var FORCED_STOP = 2;
14108  /**
14109   * Manager
14110   * @param {HTMLElement} element
14111   * @param {Object} [options]
14112   * @constructor
14113   */
14114
14115  function Manager(element, options) {
14116    this.options = assign({}, Hammer.defaults, options || {});
14117    this.options.inputTarget = this.options.inputTarget || element;
14118    this.handlers = {};
14119    this.session = {};
14120    this.recognizers = [];
14121    this.oldCssProps = {};
14122    this.element = element;
14123    this.input = createInputInstance(this);
14124    this.touchAction = new TouchAction(this, this.options.touchAction);
14125    toggleCssProps(this, true);
14126    each(this.options.recognizers, function (item) {
14127      var recognizer = this.add(new item[0](item[1]));
14128      item[2] && recognizer.recognizeWith(item[2]);
14129      item[3] && recognizer.requireFailure(item[3]);
14130    }, this);
14131  }
14132
14133  Manager.prototype = {
14134    /**
14135     * set options
14136     * @param {Object} options
14137     * @returns {Manager}
14138     */
14139    set: function set(options) {
14140      assign(this.options, options); // Options that need a little more setup
14141
14142      if (options.touchAction) {
14143        this.touchAction.update();
14144      }
14145
14146      if (options.inputTarget) {
14147        // Clean up existing event listeners and reinitialize
14148        this.input.destroy();
14149        this.input.target = options.inputTarget;
14150        this.input.init();
14151      }
14152
14153      return this;
14154    },
14155
14156    /**
14157     * stop recognizing for this session.
14158     * This session will be discarded, when a new [input]start event is fired.
14159     * When forced, the recognizer cycle is stopped immediately.
14160     * @param {Boolean} [force]
14161     */
14162    stop: function stop(force) {
14163      this.session.stopped = force ? FORCED_STOP : STOP;
14164    },
14165
14166    /**
14167     * run the recognizers!
14168     * called by the inputHandler function on every movement of the pointers (touches)
14169     * it walks through all the recognizers and tries to detect the gesture that is being made
14170     * @param {Object} inputData
14171     */
14172    recognize: function recognize(inputData) {
14173      var session = this.session;
14174
14175      if (session.stopped) {
14176        return;
14177      } // run the touch-action polyfill
14178
14179
14180      this.touchAction.preventDefaults(inputData);
14181      var recognizer;
14182      var recognizers = this.recognizers; // this holds the recognizer that is being recognized.
14183      // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED
14184      // if no recognizer is detecting a thing, it is set to `null`
14185
14186      var curRecognizer = session.curRecognizer; // reset when the last recognizer is recognized
14187      // or when we're in a new session
14188
14189      if (!curRecognizer || curRecognizer && curRecognizer.state & STATE_RECOGNIZED) {
14190        curRecognizer = session.curRecognizer = null;
14191      }
14192
14193      var i = 0;
14194
14195      while (i < recognizers.length) {
14196        recognizer = recognizers[i]; // find out if we are allowed try to recognize the input for this one.
14197        // 1.   allow if the session is NOT forced stopped (see the .stop() method)
14198        // 2.   allow if we still haven't recognized a gesture in this session, or the this recognizer is the one
14199        //      that is being recognized.
14200        // 3.   allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.
14201        //      this can be setup with the `recognizeWith()` method on the recognizer.
14202
14203        if (session.stopped !== FORCED_STOP && ( // 1
14204        !curRecognizer || recognizer == curRecognizer || // 2
14205        recognizer.canRecognizeWith(curRecognizer))) {
14206          // 3
14207          recognizer.recognize(inputData);
14208        } else {
14209          recognizer.reset();
14210        } // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the
14211        // current active recognizer. but only if we don't already have an active recognizer
14212
14213
14214        if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {
14215          curRecognizer = session.curRecognizer = recognizer;
14216        }
14217
14218        i++;
14219      }
14220    },
14221
14222    /**
14223     * get a recognizer by its event name.
14224     * @param {Recognizer|String} recognizer
14225     * @returns {Recognizer|Null}
14226     */
14227    get: function get(recognizer) {
14228      if (recognizer instanceof Recognizer) {
14229        return recognizer;
14230      }
14231
14232      var recognizers = this.recognizers;
14233
14234      for (var i = 0; i < recognizers.length; i++) {
14235        if (recognizers[i].options.event == recognizer) {
14236          return recognizers[i];
14237        }
14238      }
14239
14240      return null;
14241    },
14242
14243    /**
14244     * add a recognizer to the manager
14245     * existing recognizers with the same event name will be removed
14246     * @param {Recognizer} recognizer
14247     * @returns {Recognizer|Manager}
14248     */
14249    add: function add(recognizer) {
14250      if (invokeArrayArg(recognizer, 'add', this)) {
14251        return this;
14252      } // remove existing
14253
14254
14255      var existing = this.get(recognizer.options.event);
14256
14257      if (existing) {
14258        this.remove(existing);
14259      }
14260
14261      this.recognizers.push(recognizer);
14262      recognizer.manager = this;
14263      this.touchAction.update();
14264      return recognizer;
14265    },
14266
14267    /**
14268     * remove a recognizer by name or instance
14269     * @param {Recognizer|String} recognizer
14270     * @returns {Manager}
14271     */
14272    remove: function remove(recognizer) {
14273      if (invokeArrayArg(recognizer, 'remove', this)) {
14274        return this;
14275      }
14276
14277      recognizer = this.get(recognizer); // let's make sure this recognizer exists
14278
14279      if (recognizer) {
14280        var recognizers = this.recognizers;
14281        var index = inArray(recognizers, recognizer);
14282
14283        if (index !== -1) {
14284          recognizers.splice(index, 1);
14285          this.touchAction.update();
14286        }
14287      }
14288
14289      return this;
14290    },
14291
14292    /**
14293     * bind event
14294     * @param {String} events
14295     * @param {Function} handler
14296     * @returns {EventEmitter} this
14297     */
14298    on: function on(events, handler) {
14299      if (events === undefined) {
14300        return;
14301      }
14302
14303      if (handler === undefined) {
14304        return;
14305      }
14306
14307      var handlers = this.handlers;
14308      each(splitStr(events), function (event) {
14309        handlers[event] = handlers[event] || [];
14310        handlers[event].push(handler);
14311      });
14312      return this;
14313    },
14314
14315    /**
14316     * unbind event, leave emit blank to remove all handlers
14317     * @param {String} events
14318     * @param {Function} [handler]
14319     * @returns {EventEmitter} this
14320     */
14321    off: function off(events, handler) {
14322      if (events === undefined) {
14323        return;
14324      }
14325
14326      var handlers = this.handlers;
14327      each(splitStr(events), function (event) {
14328        if (!handler) {
14329          delete handlers[event];
14330        } else {
14331          handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);
14332        }
14333      });
14334      return this;
14335    },
14336
14337    /**
14338     * emit event to the listeners
14339     * @param {String} event
14340     * @param {Object} data
14341     */
14342    emit: function emit(event, data) {
14343      // we also want to trigger dom events
14344      if (this.options.domEvents) {
14345        triggerDomEvent(event, data);
14346      } // no handlers, so skip it all
14347
14348
14349      var handlers = this.handlers[event] && this.handlers[event].slice();
14350
14351      if (!handlers || !handlers.length) {
14352        return;
14353      }
14354
14355      data.type = event;
14356
14357      data.preventDefault = function () {
14358        data.srcEvent.preventDefault();
14359      };
14360
14361      var i = 0;
14362
14363      while (i < handlers.length) {
14364        handlers[i](data);
14365        i++;
14366      }
14367    },
14368
14369    /**
14370     * destroy the manager and unbinds all events
14371     * it doesn't unbind dom events, that is the user own responsibility
14372     */
14373    destroy: function destroy() {
14374      this.element && toggleCssProps(this, false);
14375      this.handlers = {};
14376      this.session = {};
14377      this.input.destroy();
14378      this.element = null;
14379    }
14380  };
14381  /**
14382   * add/remove the css properties as defined in manager.options.cssProps
14383   * @param {Manager} manager
14384   * @param {Boolean} add
14385   */
14386
14387  function toggleCssProps(manager, add) {
14388    var element = manager.element;
14389
14390    if (!element.style) {
14391      return;
14392    }
14393
14394    var prop;
14395    each(manager.options.cssProps, function (value, name) {
14396      prop = prefixed(element.style, name);
14397
14398      if (add) {
14399        manager.oldCssProps[prop] = element.style[prop];
14400        element.style[prop] = value;
14401      } else {
14402        element.style[prop] = manager.oldCssProps[prop] || '';
14403      }
14404    });
14405
14406    if (!add) {
14407      manager.oldCssProps = {};
14408    }
14409  }
14410  /**
14411   * trigger dom event
14412   * @param {String} event
14413   * @param {Object} data
14414   */
14415
14416
14417  function triggerDomEvent(event, data) {
14418    var gestureEvent = document.createEvent('Event');
14419    gestureEvent.initEvent(event, true, true);
14420    gestureEvent.gesture = data;
14421    data.target.dispatchEvent(gestureEvent);
14422  }
14423
14424  assign(Hammer, {
14425    INPUT_START: INPUT_START,
14426    INPUT_MOVE: INPUT_MOVE,
14427    INPUT_END: INPUT_END,
14428    INPUT_CANCEL: INPUT_CANCEL,
14429    STATE_POSSIBLE: STATE_POSSIBLE,
14430    STATE_BEGAN: STATE_BEGAN,
14431    STATE_CHANGED: STATE_CHANGED,
14432    STATE_ENDED: STATE_ENDED,
14433    STATE_RECOGNIZED: STATE_RECOGNIZED,
14434    STATE_CANCELLED: STATE_CANCELLED,
14435    STATE_FAILED: STATE_FAILED,
14436    DIRECTION_NONE: DIRECTION_NONE,
14437    DIRECTION_LEFT: DIRECTION_LEFT,
14438    DIRECTION_RIGHT: DIRECTION_RIGHT,
14439    DIRECTION_UP: DIRECTION_UP,
14440    DIRECTION_DOWN: DIRECTION_DOWN,
14441    DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,
14442    DIRECTION_VERTICAL: DIRECTION_VERTICAL,
14443    DIRECTION_ALL: DIRECTION_ALL,
14444    Manager: Manager,
14445    Input: Input,
14446    TouchAction: TouchAction,
14447    TouchInput: TouchInput,
14448    MouseInput: MouseInput,
14449    PointerEventInput: PointerEventInput,
14450    TouchMouseInput: TouchMouseInput,
14451    SingleTouchInput: SingleTouchInput,
14452    Recognizer: Recognizer,
14453    AttrRecognizer: AttrRecognizer,
14454    Tap: TapRecognizer,
14455    Pan: PanRecognizer,
14456    Swipe: SwipeRecognizer,
14457    Pinch: PinchRecognizer,
14458    Rotate: RotateRecognizer,
14459    Press: PressRecognizer,
14460    on: addEventListeners,
14461    off: removeEventListeners,
14462    each: each,
14463    merge: merge,
14464    extend: extend,
14465    assign: assign,
14466    inherit: inherit,
14467    bindFn: bindFn,
14468    prefixed: prefixed
14469  }); // this prevents errors when Hammer is loaded in the presence of an AMD
14470  //  style loader but by script tag, not by the loader.
14471
14472  var freeGlobal = typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}; // jshint ignore:line
14473
14474  freeGlobal.Hammer = Hammer;
14475
14476  if (true) {
14477    !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {
14478      return Hammer;
14479    }).call(exports, __webpack_require__, exports, module),
14480				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
14481  } else {}
14482})(window, document, 'Hammer');
14483
14484/***/ }),
14485
vendor: 2,055 bytes, lines 14486-14555
14486/***/ "../node_modules/hyperform/src/components/custom_messages.js":
14487/*!*******************************************************************!*\
14488  !*** ../node_modules/hyperform/src/components/custom_messages.js ***!
14489  \*******************************************************************/
14490/*! exports provided: default */
14491/***/ (function(module, __webpack_exports__, __webpack_require__) {
14492
14493"use strict";
14494__webpack_require__.r(__webpack_exports__);
14495
14496/**
14497 * internal storage for custom error messages
14498 */
14499
14500var store = new WeakMap();
14501/**
14502 * register custom error messages per element
14503 */
14504
14505var custom_messages = {
14506  set: function set(element, validator, message) {
14507    var messages = store.get(element) || {};
14508    messages[validator] = message;
14509    store.set(element, messages);
14510    return custom_messages;
14511  },
14512  get: function get(element, validator) {
14513    var _default = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
14514
14515    var messages = store.get(element);
14516
14517    if (messages === undefined || !(validator in messages)) {
14518      var data_id = 'data-' + validator.replace(/[A-Z]/g, '-$&').toLowerCase();
14519
14520      if (element.hasAttribute(data_id)) {
14521        /* if the element has a data-validator attribute, use this as fallback.
14522         * E.g., if validator == 'valueMissing', the element can specify a
14523         * custom validation message like this:
14524         *     <input data-value-missing="Oh noes!">
14525         */
14526        return element.getAttribute(data_id);
14527      }
14528
14529      return _default;
14530    }
14531
14532    return messages[validator];
14533  },
14534  delete: function _delete(element) {
14535    var validator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
14536
14537    if (!validator) {
14538      return store.delete(element);
14539    }
14540
14541    var messages = store.get(element) || {};
14542
14543    if (validator in messages) {
14544      delete messages[validator];
14545      store.set(element, messages);
14546      return true;
14547    }
14548
14549    return false;
14550  }
14551};
14552/* harmony default export */ __webpack_exports__["default"] = (custom_messages);
14553
14554/***/ }),
14555
vendor: 3,182 bytes, lines 14556-14658
14556/***/ "../node_modules/hyperform/src/components/hooks.js":
14557/*!*********************************************************!*\
14558  !*** ../node_modules/hyperform/src/components/hooks.js ***!
14559  \*********************************************************/
14560/*! exports provided: call_hook, do_filter, remove_hook, remove_filter, add_hook, add_filter */
14561/***/ (function(module, __webpack_exports__, __webpack_require__) {
14562
14563"use strict";
14564__webpack_require__.r(__webpack_exports__);
14565/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "call_hook", function() { return call_hook; });
14566/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "do_filter", function() { return do_filter; });
14567/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "remove_hook", function() { return remove_hook; });
14568/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "remove_filter", function() { return remove_hook; });
14569/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "add_hook", function() { return add_hook; });
14570/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "add_filter", function() { return add_hook; });
14571
14572
14573var registry = Object.create(null);
14574/**
14575 * run all actions registered for a hook
14576 *
14577 * Every action gets called with a state object as `this` argument and with the
14578 * hook's call arguments as call arguments.
14579 *
14580 * @return mixed the returned value of the action calls or undefined
14581 */
14582
14583function call_hook(hook) {
14584  var result;
14585  var call_args = Array.prototype.slice.call(arguments, 1);
14586
14587  if (hook in registry) {
14588    result = registry[hook].reduce(function (args) {
14589      return function (previousResult, currentAction) {
14590        var interimResult = currentAction.apply({
14591          state: previousResult,
14592          hook: hook
14593        }, args);
14594        return interimResult !== undefined ? interimResult : previousResult;
14595      };
14596    }(call_args), result);
14597  }
14598
14599  return result;
14600}
14601/**
14602 * Filter a value through hooked functions
14603 *
14604 * Allows for additional parameters:
14605 * js> do_filter('foo', null, current_element)
14606 */
14607
14608function do_filter(hook, initial_value) {
14609  var result = initial_value;
14610  var call_args = Array.prototype.slice.call(arguments, 1);
14611
14612  if (hook in registry) {
14613    result = registry[hook].reduce(function (previousResult, currentAction) {
14614      call_args[0] = previousResult;
14615      var interimResult = currentAction.apply({
14616        state: previousResult,
14617        hook: hook
14618      }, call_args);
14619      return interimResult !== undefined ? interimResult : previousResult;
14620    }, result);
14621  }
14622
14623  return result;
14624}
14625/**
14626 * remove an action again
14627 */
14628
14629function remove_hook(hook, action) {
14630  if (hook in registry) {
14631    for (var i = 0; i < registry[hook].length; i++) {
14632      if (registry[hook][i] === action) {
14633        registry[hook].splice(i, 1);
14634        break;
14635      }
14636    }
14637  }
14638}
14639
14640/**
14641 * add an action to a hook
14642 */
14643
14644function add_hook(hook, action, position) {
14645  if (!(hook in registry)) {
14646    registry[hook] = [];
14647  }
14648
14649  if (position === undefined) {
14650    position = registry[hook].length;
14651  }
14652
14653  registry[hook].splice(position, 0, action);
14654}
14655
14656
14657/***/ }),
14658
vendor: 3,439 bytes, lines 14659-14753
14659/***/ "../node_modules/hyperform/src/components/localization.js":
14660/*!****************************************************************!*\
14661  !*** ../node_modules/hyperform/src/components/localization.js ***!
14662  \****************************************************************/
14663/*! exports provided: set_language, add_translation, default */
14664/***/ (function(module, __webpack_exports__, __webpack_require__) {
14665
14666"use strict";
14667__webpack_require__.r(__webpack_exports__);
14668/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "set_language", function() { return set_language; });
14669/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "add_translation", function() { return add_translation; });
14670
14671/**
14672 * the following validation messages are from Firefox source,
14673 * http://mxr.mozilla.org/mozilla-central/source/dom/locales/en-US/chrome/dom/dom.properties
14674 * released under MPL license, http://mozilla.org/MPL/2.0/.
14675 */
14676
14677var catalog = {
14678  en: {
14679    TextTooLong: 'Please shorten this text to %l characters or less (you are currently using %l characters).',
14680    ValueMissing: 'Please fill out this field.',
14681    CheckboxMissing: 'Please check this box if you want to proceed.',
14682    RadioMissing: 'Please select one of these options.',
14683    FileMissing: 'Please select a file.',
14684    SelectMissing: 'Please select an item in the list.',
14685    InvalidEmail: 'Please enter an email address.',
14686    InvalidURL: 'Please enter a URL.',
14687    PatternMismatch: 'Please match the requested format.',
14688    PatternMismatchWithTitle: 'Please match the requested format: %l.',
14689    NumberRangeOverflow: 'Please select a value that is no more than %l.',
14690    DateRangeOverflow: 'Please select a value that is no later than %l.',
14691    TimeRangeOverflow: 'Please select a value that is no later than %l.',
14692    NumberRangeUnderflow: 'Please select a value that is no less than %l.',
14693    DateRangeUnderflow: 'Please select a value that is no earlier than %l.',
14694    TimeRangeUnderflow: 'Please select a value that is no earlier than %l.',
14695    StepMismatch: 'Please select a valid value. The two nearest valid values are %l and %l.',
14696    StepMismatchOneValue: 'Please select a valid value. The nearest valid value is %l.',
14697    BadInputNumber: 'Please enter a number.'
14698  }
14699};
14700/**
14701 * the global language Hyperform will use
14702 */
14703
14704var language = 'en';
14705/**
14706 * the base language according to BCP47, i.e., only the piece before the first hyphen
14707 */
14708
14709var base_lang = 'en';
14710/**
14711 * set the language for Hyperform’s messages
14712 */
14713
14714function set_language(newlang) {
14715  language = newlang;
14716  base_lang = newlang.replace(/[-_].*/, '');
14717}
14718/**
14719 * add a lookup catalog "string: translation" for a language
14720 */
14721
14722function add_translation(lang, new_catalog) {
14723  if (!(lang in catalog)) {
14724    catalog[lang] = {};
14725  }
14726
14727  for (var key in new_catalog) {
14728    if (new_catalog.hasOwnProperty(key)) {
14729      catalog[lang][key] = new_catalog[key];
14730    }
14731  }
14732}
14733/**
14734 * return `s` translated into the current language
14735 *
14736 * Defaults to the base language and then English if the former has no
14737 * translation for `s`.
14738 */
14739
14740/* harmony default export */ __webpack_exports__["default"] = (function (s) {
14741  if (language in catalog && s in catalog[language]) {
14742    return catalog[language][s];
14743  } else if (base_lang in catalog && s in catalog[base_lang]) {
14744    return catalog[base_lang][s];
14745  } else if (s in catalog.en) {
14746    return catalog.en[s];
14747  }
14748
14749  return s;
14750});
14751
14752/***/ }),
14753
vendor: 2,981 bytes, lines 14754-14850
14754/***/ "../node_modules/hyperform/src/components/message_store.js":
14755/*!*****************************************************************!*\
14756  !*** ../node_modules/hyperform/src/components/message_store.js ***!
14757  \*****************************************************************/
14758/*! exports provided: message_store */
14759/***/ (function(module, __webpack_exports__, __webpack_require__) {
14760
14761"use strict";
14762__webpack_require__.r(__webpack_exports__);
14763/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "message_store", function() { return message_store; });
14764/* harmony import */ var _wrapper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./wrapper */ "../node_modules/hyperform/src/components/wrapper.js");
14765/* harmony import */ var _tools_mark__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/mark */ "../node_modules/hyperform/src/tools/mark.js");
14766
14767
14768
14769
14770/**
14771 * the internal storage for messages
14772 */
14773
14774var store = new WeakMap();
14775/* jshint -W053 */
14776
14777/* allow new String() */
14778
14779/**
14780 * handle validation messages
14781 *
14782 * Falls back to browser-native errors, if any are available. The messages
14783 * are String objects so that we can mark() them.
14784 */
14785
14786var message_store = {
14787  set: function set(element, message) {
14788    var is_custom = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
14789
14790    if (element instanceof window.HTMLFieldSetElement) {
14791      var wrapped_form = Object(_wrapper__WEBPACK_IMPORTED_MODULE_0__["get_wrapper"])(element);
14792
14793      if (wrapped_form && !wrapped_form.settings.extendFieldset) {
14794        /* make this a no-op for <fieldset> in strict mode */
14795        return message_store;
14796      }
14797    }
14798
14799    if (typeof message === 'string') {
14800      message = new String(message);
14801    }
14802
14803    if (is_custom) {
14804      message.is_custom = true;
14805    }
14806
14807    Object(_tools_mark__WEBPACK_IMPORTED_MODULE_1__["default"])(message);
14808    store.set(element, message);
14809    /* allow the :invalid selector to match */
14810
14811    if ('_original_setCustomValidity' in element) {
14812      element._original_setCustomValidity(message.toString());
14813    }
14814
14815    return message_store;
14816  },
14817  get: function get(element) {
14818    var message = store.get(element);
14819
14820    if (message === undefined && '_original_validationMessage' in element) {
14821      /* get the browser's validation message, if we have none. Maybe it
14822       * knows more than we. */
14823      message = new String(element._original_validationMessage);
14824    }
14825
14826    return message ? message : new String('');
14827  },
14828  delete: function _delete(element) {
14829    var is_custom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
14830
14831    if ('_original_setCustomValidity' in element) {
14832      element._original_setCustomValidity('');
14833    }
14834
14835    var message = store.get(element);
14836
14837    if (message && is_custom && !message.is_custom) {
14838      /* do not delete "native" messages, if asked */
14839      return false;
14840    }
14841
14842    return store.delete(element);
14843  }
14844};
14845/* jshint +W053 */
14846
14847
14848
14849/***/ }),
14850
vendor: 1,148 bytes, lines 14851-14887
14851/***/ "../node_modules/hyperform/src/components/registry.js":
14852/*!************************************************************!*\
14853  !*** ../node_modules/hyperform/src/components/registry.js ***!
14854  \************************************************************/
14855/*! exports provided: default */
14856/***/ (function(module, __webpack_exports__, __webpack_require__) {
14857
14858"use strict";
14859__webpack_require__.r(__webpack_exports__);
14860
14861
14862var internal_registry = new WeakMap();
14863/**
14864 * A registry for custom validators
14865 *
14866 * slim wrapper around a WeakMap to ensure the values are arrays
14867 * (hence allowing > 1 validators per element)
14868 */
14869
14870var custom_validator_registry = {
14871  set: function set(element, validator) {
14872    var current = internal_registry.get(element) || [];
14873    current.push(validator);
14874    internal_registry.set(element, current);
14875    return custom_validator_registry;
14876  },
14877  get: function get(element) {
14878    return internal_registry.get(element) || [];
14879  },
14880  delete: function _delete(element) {
14881    return internal_registry.delete(element);
14882  }
14883};
14884/* harmony default export */ __webpack_exports__["default"] = (custom_validator_registry);
14885
14886/***/ }),
14887
vendor: 4,794 bytes, lines 14888-15013
14888/***/ "../node_modules/hyperform/src/components/renderer.js":
14889/*!************************************************************!*\
14890  !*** ../node_modules/hyperform/src/components/renderer.js ***!
14891  \************************************************************/
14892/*! exports provided: default */
14893/***/ (function(module, __webpack_exports__, __webpack_require__) {
14894
14895"use strict";
14896__webpack_require__.r(__webpack_exports__);
14897/* harmony import */ var _message_store__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./message_store */ "../node_modules/hyperform/src/components/message_store.js");
14898/* harmony import */ var _wrapper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./wrapper */ "../node_modules/hyperform/src/components/wrapper.js");
14899/* harmony import */ var _tools_generate_id__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tools/generate_id */ "../node_modules/hyperform/src/tools/generate_id.js");
14900/* harmony import */ var _tools_get_radiogroup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tools/get_radiogroup */ "../node_modules/hyperform/src/tools/get_radiogroup.js");
14901
14902
14903
14904
14905
14906
14907var warningsCache = new WeakMap();
14908var DefaultRenderer = {
14909  /**
14910   * called when a warning should become visible
14911   */
14912  attachWarning: function attachWarning(warning, element) {
14913    /* should also work, if element is last,
14914     * http://stackoverflow.com/a/4793630/113195 */
14915    element.parentNode.insertBefore(warning, element.nextSibling);
14916  },
14917
14918  /**
14919   * called when a warning should vanish
14920   */
14921  detachWarning: function detachWarning(warning, element) {
14922    /* be conservative here, since an overwritten attachWarning() might not
14923     * actually have attached the warning. */
14924    if (warning.parentNode) {
14925      warning.parentNode.removeChild(warning);
14926    }
14927  },
14928
14929  /**
14930   * called when feedback to an element's state should be handled
14931   *
14932   * i.e., showing and hiding warnings
14933   */
14934  showWarning: function showWarning(element) {
14935    var whole_form_validated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
14936
14937    /* don't render error messages on subsequent radio buttons of the
14938     * same group. This assumes, that element.validity.valueMissing is the only
14939     * possible validation failure for radio buttons. */
14940    if (whole_form_validated && element.type === 'radio' && Object(_tools_get_radiogroup__WEBPACK_IMPORTED_MODULE_3__["get_radiogroup"])(element)[0] !== element) {
14941      return;
14942    }
14943
14944    var msg = _message_store__WEBPACK_IMPORTED_MODULE_0__["message_store"].get(element).toString();
14945    var warning = warningsCache.get(element);
14946
14947    if (msg) {
14948      if (!warning) {
14949        var wrapper = Object(_wrapper__WEBPACK_IMPORTED_MODULE_1__["get_wrapper"])(element);
14950        warning = document.createElement('div');
14951        warning.className = wrapper && wrapper.settings.classes.warning || 'hf-warning';
14952        warning.id = Object(_tools_generate_id__WEBPACK_IMPORTED_MODULE_2__["default"])();
14953        warning.setAttribute('aria-live', 'polite');
14954        warningsCache.set(element, warning);
14955      }
14956
14957      element.setAttribute('aria-errormessage', warning.id);
14958
14959      if (!element.hasAttribute('aria-describedby')) {
14960        element.setAttribute('aria-describedby', warning.id);
14961      }
14962
14963      Renderer.setMessage(warning, msg, element);
14964      Renderer.attachWarning(warning, element);
14965    } else if (warning && warning.parentNode) {
14966      if (element.getAttribute('aria-describedby') === warning.id) {
14967        element.removeAttribute('aria-describedby');
14968      }
14969
14970      element.removeAttribute('aria-errormessage');
14971      Renderer.detachWarning(warning, element);
14972    }
14973  },
14974
14975  /**
14976   * set the warning's content
14977   *
14978   * Overwrite this method, if you want, e.g., to allow HTML in warnings
14979   * or preprocess the content.
14980   */
14981  setMessage: function setMessage(warning, message, element) {
14982    warning.textContent = message;
14983  }
14984};
14985var Renderer = {
14986  attachWarning: DefaultRenderer.attachWarning,
14987  detachWarning: DefaultRenderer.detachWarning,
14988  showWarning: DefaultRenderer.showWarning,
14989  setMessage: DefaultRenderer.setMessage,
14990  set: function set(renderer, action) {
14991    if (renderer.indexOf('_') > -1) {
14992      /* global console */
14993      // TODO delete before next non-patch version
14994      console.log('Renderer.set: please use camelCase names. ' + renderer + ' will be removed in the next non-patch release.');
14995      renderer = renderer.replace(/_([a-z])/g, function (g) {
14996        return g[1].toUpperCase();
14997      });
14998    }
14999
15000    if (!action) {
15001      action = DefaultRenderer[renderer];
15002    }
15003
15004    Renderer[renderer] = action;
15005  },
15006  getWarning: function getWarning(element) {
15007    return warningsCache.get(element);
15008  }
15009};
15010/* harmony default export */ __webpack_exports__["default"] = (Renderer);
15011
15012/***/ }),
15013
vendor: 1,494 bytes, lines 15014-15053
15014/***/ "../node_modules/hyperform/src/components/step_defaults.js":
15015/*!*****************************************************************!*\
15016  !*** ../node_modules/hyperform/src/components/step_defaults.js ***!
15017  \*****************************************************************/
15018/*! exports provided: default_step, step_scale_factor, default_step_base, default_min, default_max */
15019/***/ (function(module, __webpack_exports__, __webpack_require__) {
15020
15021"use strict";
15022__webpack_require__.r(__webpack_exports__);
15023/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default_step", function() { return default_step; });
15024/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "step_scale_factor", function() { return step_scale_factor; });
15025/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default_step_base", function() { return default_step_base; });
15026/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default_min", function() { return default_min; });
15027/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default_max", function() { return default_max; });
15028
15029
15030var default_step = {
15031  'datetime-local': 60,
15032  datetime: 60,
15033  time: 60
15034};
15035var step_scale_factor = {
15036  'datetime-local': 1000,
15037  datetime: 1000,
15038  date: 86400000,
15039  week: 604800000,
15040  time: 1000
15041};
15042var default_step_base = {
15043  week: -259200000
15044};
15045var default_min = {
15046  range: 0
15047};
15048var default_max = {
15049  range: 100
15050};
15051
15052/***/ }),
15053
vendor: 2,854 bytes, lines 15054-15102
15054/***/ "../node_modules/hyperform/src/components/types.js":
15055/*!*********************************************************!*\
15056  !*** ../node_modules/hyperform/src/components/types.js ***!
15057  \*********************************************************/
15058/*! exports provided: dates, plain_numbers, numbers, type_checked, input_checked, text, validation_candidates, inputs, non_inputs */
15059/***/ (function(module, __webpack_exports__, __webpack_require__) {
15060
15061"use strict";
15062__webpack_require__.r(__webpack_exports__);
15063/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dates", function() { return dates; });
15064/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "plain_numbers", function() { return plain_numbers; });
15065/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "numbers", function() { return numbers; });
15066/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "type_checked", function() { return type_checked; });
15067/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "input_checked", function() { return input_checked; });
15068/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "text", function() { return text; });
15069/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validation_candidates", function() { return validation_candidates; });
15070/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "inputs", function() { return inputs; });
15071/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "non_inputs", function() { return non_inputs; });
15072
15073/* and datetime-local? Spec says “Nah!” */
15074
15075var dates = ['datetime', 'date', 'month', 'week', 'time'];
15076var plain_numbers = ['number', 'range'];
15077/* everything that returns something meaningful for valueAsNumber and
15078 * can have the step attribute */
15079
15080var numbers = dates.concat(plain_numbers, 'datetime-local');
15081/* the spec says to only check those for syntax in validity.typeMismatch.
15082 * ¯\_(ツ)_/¯ */
15083
15084var type_checked = ['email', 'url'];
15085/* check these for validity.badInput */
15086
15087var input_checked = ['email', 'date', 'month', 'week', 'time', 'datetime', 'datetime-local', 'number', 'range', 'color'];
15088var text = ['text', 'search', 'tel', 'password'].concat(type_checked);
15089/* input element types, that are candidates for the validation API.
15090 * Missing from this set are: button, hidden, menu (from <button>), reset and
15091 * the types for non-<input> elements. */
15092
15093var validation_candidates = ['checkbox', 'color', 'file', 'image', 'radio', 'submit'].concat(numbers, text);
15094/* all known types of <input> */
15095
15096var inputs = ['button', 'hidden', 'reset'].concat(validation_candidates);
15097/* apparently <select> and <textarea> have types of their own */
15098
15099var non_inputs = ['select-one', 'select-multiple', 'textarea'];
15100
15101/***/ }),
15102
vendor: 8,204 bytes, lines 15103-15291
15103/***/ "../node_modules/hyperform/src/components/wrapper.js":
15104/*!***********************************************************!*\
15105  !*** ../node_modules/hyperform/src/components/wrapper.js ***!
15106  \***********************************************************/
15107/*! exports provided: default, get_wrapper */
15108/***/ (function(module, __webpack_exports__, __webpack_require__) {
15109
15110"use strict";
15111__webpack_require__.r(__webpack_exports__);
15112/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Wrapper; });
15113/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "get_wrapper", function() { return get_wrapper; });
15114/* harmony import */ var _tools_catch_submit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/catch_submit */ "../node_modules/hyperform/src/tools/catch_submit.js");
15115/* harmony import */ var _polyfills_validityState__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../polyfills/validityState */ "../node_modules/hyperform/src/polyfills/validityState.js");
15116/* harmony import */ var _polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../polyfills/reportValidity */ "../node_modules/hyperform/src/polyfills/reportValidity.js");
15117/* harmony import */ var _tools_property_uninstaller__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tools/property_uninstaller */ "../node_modules/hyperform/src/tools/property_uninstaller.js");
15118/* harmony import */ var _tools_polyfill__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../tools/polyfill */ "../node_modules/hyperform/src/tools/polyfill.js");
15119/* harmony import */ var _tools_polyunfill__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../tools/polyunfill */ "../node_modules/hyperform/src/tools/polyunfill.js");
15120
15121
15122
15123
15124
15125
15126
15127
15128var instances = new WeakMap();
15129/**
15130 * wrap <form>s, window or document, that get treated with the global
15131 * hyperform()
15132 */
15133
15134function Wrapper(form, settings) {
15135  /* do not allow more than one instance per form. Otherwise we'd end
15136   * up with double event handlers, polyfills re-applied, ... */
15137  var existing = instances.get(form);
15138
15139  if (existing) {
15140    existing.settings = settings;
15141    return existing;
15142  }
15143
15144  this.form = form;
15145  this.settings = settings;
15146  this.revalidator = this.revalidate.bind(this);
15147  instances.set(form, this);
15148  Object(_tools_catch_submit__WEBPACK_IMPORTED_MODULE_0__["catch_submit"])(form, settings.revalidate === 'never');
15149
15150  if (form === window || form.nodeType === 9) {
15151    /* install on the prototypes, when called for the whole document */
15152    this.install([window.HTMLButtonElement.prototype, window.HTMLInputElement.prototype, window.HTMLSelectElement.prototype, window.HTMLTextAreaElement.prototype, window.HTMLFieldSetElement.prototype]);
15153    Object(_tools_polyfill__WEBPACK_IMPORTED_MODULE_4__["default"])(window.HTMLFormElement);
15154  } else if (form instanceof window.HTMLFormElement || form instanceof window.HTMLFieldSetElement) {
15155    this.install(form.elements);
15156
15157    if (form instanceof window.HTMLFormElement) {
15158      Object(_tools_polyfill__WEBPACK_IMPORTED_MODULE_4__["default"])(form);
15159    }
15160  }
15161
15162  if (settings.revalidate === 'oninput' || settings.revalidate === 'hybrid') {
15163    /* in a perfect world we'd just bind to "input", but support here is
15164     * abysmal: http://caniuse.com/#feat=input-event */
15165    form.addEventListener('keyup', this.revalidator);
15166    form.addEventListener('change', this.revalidator);
15167  }
15168
15169  if (settings.revalidate === 'onblur' || settings.revalidate === 'hybrid') {
15170    /* useCapture=true, because `blur` doesn't bubble. See
15171     * https://developer.mozilla.org/en-US/docs/Web/Events/blur#Event_delegation
15172     * for a discussion */
15173    form.addEventListener('blur', this.revalidator, true);
15174  }
15175}
15176Wrapper.prototype = {
15177  destroy: function destroy() {
15178    Object(_tools_catch_submit__WEBPACK_IMPORTED_MODULE_0__["uncatch_submit"])(this.form);
15179    instances.delete(this.form);
15180    this.form.removeEventListener('keyup', this.revalidator);
15181    this.form.removeEventListener('change', this.revalidator);
15182    this.form.removeEventListener('blur', this.revalidator, true);
15183
15184    if (this.form === window || this.form.nodeType === 9) {
15185      this.uninstall([window.HTMLButtonElement.prototype, window.HTMLInputElement.prototype, window.HTMLSelectElement.prototype, window.HTMLTextAreaElement.prototype, window.HTMLFieldSetElement.prototype]);
15186      Object(_tools_polyunfill__WEBPACK_IMPORTED_MODULE_5__["default"])(window.HTMLFormElement);
15187    } else if (this.form instanceof window.HTMLFormElement || this.form instanceof window.HTMLFieldSetElement) {
15188      this.uninstall(this.form.elements);
15189
15190      if (this.form instanceof window.HTMLFormElement) {
15191        Object(_tools_polyunfill__WEBPACK_IMPORTED_MODULE_5__["default"])(this.form);
15192      }
15193    }
15194  },
15195
15196  /**
15197   * revalidate an input element
15198   */
15199  revalidate: function revalidate(event) {
15200    if (event.target instanceof window.HTMLButtonElement || event.target instanceof window.HTMLTextAreaElement || event.target instanceof window.HTMLSelectElement || event.target instanceof window.HTMLInputElement) {
15201      if (this.settings.revalidate === 'hybrid') {
15202        /* "hybrid" somewhat simulates what browsers do. See for example
15203         * Firefox's :-moz-ui-invalid pseudo-class:
15204         * https://developer.mozilla.org/en-US/docs/Web/CSS/:-moz-ui-invalid */
15205        if (event.type === 'blur' && event.target.value !== event.target.defaultValue || Object(_polyfills_validityState__WEBPACK_IMPORTED_MODULE_1__["default"])(event.target).valid) {
15206          /* on blur, update the report when the value has changed from the
15207           * default or when the element is valid (possibly removing a still
15208           * standing invalidity report). */
15209          Object(_polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_2__["default"])(event.target);
15210        } else if (event.type === 'keyup' && event.keyCode !== 9 || event.type === 'change') {
15211          if (Object(_polyfills_validityState__WEBPACK_IMPORTED_MODULE_1__["default"])(event.target).valid) {
15212            // report instantly, when an element becomes valid,
15213            // postpone report to blur event, when an element is invalid
15214            Object(_polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_2__["default"])(event.target);
15215          }
15216        }
15217      } else if (event.type !== 'keyup' || event.keyCode !== 9) {
15218        /* do _not_ validate, when the user "tabbed" into the field initially,
15219         * i.e., a keyup event with keyCode 9 */
15220        Object(_polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_2__["default"])(event.target);
15221      }
15222    }
15223  },
15224
15225  /**
15226   * install the polyfills on each given element
15227   *
15228   * If you add elements dynamically, you have to call install() on them
15229   * yourself:
15230   *
15231   * js> var form = hyperform(document.forms[0]);
15232   * js> document.forms[0].appendChild(input);
15233   * js> form.install(input);
15234   *
15235   * You can skip this, if you called hyperform on window or document.
15236   */
15237  install: function install(els) {
15238    if (els instanceof window.Element) {
15239      els = [els];
15240    }
15241
15242    var els_length = els.length;
15243
15244    for (var i = 0; i < els_length; i++) {
15245      Object(_tools_polyfill__WEBPACK_IMPORTED_MODULE_4__["default"])(els[i]);
15246    }
15247  },
15248  uninstall: function uninstall(els) {
15249    if (els instanceof window.Element) {
15250      els = [els];
15251    }
15252
15253    var els_length = els.length;
15254
15255    for (var i = 0; i < els_length; i++) {
15256      Object(_tools_polyunfill__WEBPACK_IMPORTED_MODULE_5__["default"])(els[i]);
15257    }
15258  }
15259};
15260/**
15261 * try to get the appropriate wrapper for a specific element by looking up
15262 * its parent chain
15263 *
15264 * @return Wrapper | undefined
15265 */
15266
15267function get_wrapper(element) {
15268  var wrapped;
15269
15270  if (element.form) {
15271    /* try a shortcut with the element's <form> */
15272    wrapped = instances.get(element.form);
15273  }
15274  /* walk up the parent nodes until document (including) */
15275
15276
15277  while (!wrapped && element) {
15278    wrapped = instances.get(element);
15279    element = element.parentNode;
15280  }
15281
15282  if (!wrapped) {
15283    /* try the global instance, if exists. This may also be undefined. */
15284    wrapped = instances.get(window);
15285  }
15286
15287  return wrapped;
15288}
15289
15290/***/ }),
15291
vendor: 10,628 bytes, lines 15292-15537
15292/***/ "../node_modules/hyperform/src/hyperform.js":
15293/*!**************************************************!*\
15294  !*** ../node_modules/hyperform/src/hyperform.js ***!
15295  \**************************************************/
15296/*! exports provided: default */
15297/***/ (function(module, __webpack_exports__, __webpack_require__) {
15298
15299"use strict";
15300__webpack_require__.r(__webpack_exports__);
15301/* harmony import */ var _polyfills_checkValidity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./polyfills/checkValidity */ "../node_modules/hyperform/src/polyfills/checkValidity.js");
15302/* harmony import */ var _polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./polyfills/reportValidity */ "../node_modules/hyperform/src/polyfills/reportValidity.js");
15303/* harmony import */ var _polyfills_setCustomValidity__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./polyfills/setCustomValidity */ "../node_modules/hyperform/src/polyfills/setCustomValidity.js");
15304/* harmony import */ var _polyfills_stepDown__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./polyfills/stepDown */ "../node_modules/hyperform/src/polyfills/stepDown.js");
15305/* harmony import */ var _polyfills_stepUp__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./polyfills/stepUp */ "../node_modules/hyperform/src/polyfills/stepUp.js");
15306/* harmony import */ var _polyfills_validationMessage__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./polyfills/validationMessage */ "../node_modules/hyperform/src/polyfills/validationMessage.js");
15307/* harmony import */ var _polyfills_validityState__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./polyfills/validityState */ "../node_modules/hyperform/src/polyfills/validityState.js");
15308/* harmony import */ var _polyfills_valueAsDate__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./polyfills/valueAsDate */ "../node_modules/hyperform/src/polyfills/valueAsDate.js");
15309/* harmony import */ var _polyfills_valueAsNumber__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./polyfills/valueAsNumber */ "../node_modules/hyperform/src/polyfills/valueAsNumber.js");
15310/* harmony import */ var _polyfills_willValidate__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./polyfills/willValidate */ "../node_modules/hyperform/src/polyfills/willValidate.js");
15311/* harmony import */ var _components_custom_messages__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./components/custom_messages */ "../node_modules/hyperform/src/components/custom_messages.js");
15312/* harmony import */ var _components_hooks__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./components/hooks */ "../node_modules/hyperform/src/components/hooks.js");
15313/* harmony import */ var _components_localization__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./components/localization */ "../node_modules/hyperform/src/components/localization.js");
15314/* harmony import */ var _components_registry__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./components/registry */ "../node_modules/hyperform/src/components/registry.js");
15315/* harmony import */ var _components_renderer__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./components/renderer */ "../node_modules/hyperform/src/components/renderer.js");
15316/* harmony import */ var _components_wrapper__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./components/wrapper */ "../node_modules/hyperform/src/components/wrapper.js");
15317/* harmony import */ var _tools_sprintf__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./tools/sprintf */ "../node_modules/hyperform/src/tools/sprintf.js");
15318/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./version */ "../node_modules/hyperform/src/version.js");
15319
15320
15321
15322
15323
15324
15325
15326
15327
15328
15329
15330
15331
15332
15333
15334
15335
15336
15337
15338
15339/* deprecate the old snake_case names
15340 * TODO: delme before next non-patch release
15341 */
15342
15343function w(name) {
15344  var deprecated_message = 'Please use camelCase method names! The name "%s" is deprecated and will be removed in the next non-patch release.';
15345  /* global console */
15346
15347  console.log(Object(_tools_sprintf__WEBPACK_IMPORTED_MODULE_16__["default"])(deprecated_message, name));
15348}
15349/**
15350 * public hyperform interface:
15351 */
15352
15353
15354function hyperform(form) {
15355  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
15356      classes = _ref.classes,
15357      _ref$debug = _ref.debug,
15358      debug = _ref$debug === void 0 ? false : _ref$debug,
15359      extend_fieldset = _ref.extend_fieldset,
15360      extendFieldset = _ref.extendFieldset,
15361      novalidate_on_elements = _ref.novalidate_on_elements,
15362      novalidateOnElements = _ref.novalidateOnElements,
15363      prevent_implicit_submit = _ref.prevent_implicit_submit,
15364      preventImplicitSubmit = _ref.preventImplicitSubmit,
15365      revalidate = _ref.revalidate,
15366      _ref$strict = _ref.strict,
15367      strict = _ref$strict === void 0 ? false : _ref$strict,
15368      valid_event = _ref.valid_event,
15369      validEvent = _ref.validEvent,
15370      _ref$validateNameless = _ref.validateNameless,
15371      validateNameless = _ref$validateNameless === void 0 ? false : _ref$validateNameless;
15372
15373  if (!classes) {
15374    classes = {};
15375  } // TODO: clean up before next non-patch release
15376
15377
15378  if (extendFieldset === undefined) {
15379    if (extend_fieldset === undefined) {
15380      extendFieldset = !strict;
15381    } else {
15382      w('extend_fieldset');
15383      extendFieldset = extend_fieldset;
15384    }
15385  }
15386
15387  if (novalidateOnElements === undefined) {
15388    if (novalidate_on_elements === undefined) {
15389      novalidateOnElements = !strict;
15390    } else {
15391      w('novalidate_on_elements');
15392      novalidateOnElements = novalidate_on_elements;
15393    }
15394  }
15395
15396  if (preventImplicitSubmit === undefined) {
15397    if (prevent_implicit_submit === undefined) {
15398      preventImplicitSubmit = false;
15399    } else {
15400      w('prevent_implicit_submit');
15401      preventImplicitSubmit = prevent_implicit_submit;
15402    }
15403  }
15404
15405  if (revalidate === undefined) {
15406    /* other recognized values: 'oninput', 'onblur', 'onsubmit' and 'never' */
15407    revalidate = strict ? 'onsubmit' : 'hybrid';
15408  }
15409
15410  if (validEvent === undefined) {
15411    if (valid_event === undefined) {
15412      validEvent = !strict;
15413    } else {
15414      w('valid_event');
15415      validEvent = valid_event;
15416    }
15417  }
15418
15419  var settings = {
15420    debug: debug,
15421    strict: strict,
15422    preventImplicitSubmit: preventImplicitSubmit,
15423    revalidate: revalidate,
15424    validEvent: validEvent,
15425    extendFieldset: extendFieldset,
15426    classes: classes,
15427    novalidateOnElements: novalidateOnElements,
15428    validateNameless: validateNameless
15429  };
15430
15431  if (form instanceof window.NodeList || form instanceof window.HTMLCollection || form instanceof Array) {
15432    return Array.prototype.map.call(form, function (element) {
15433      return hyperform(element, settings);
15434    });
15435  }
15436
15437  return new _components_wrapper__WEBPACK_IMPORTED_MODULE_15__["default"](form, settings);
15438}
15439
15440hyperform.version = _version__WEBPACK_IMPORTED_MODULE_17__["default"];
15441hyperform.checkValidity = _polyfills_checkValidity__WEBPACK_IMPORTED_MODULE_0__["default"];
15442hyperform.reportValidity = _polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_1__["default"];
15443hyperform.setCustomValidity = _polyfills_setCustomValidity__WEBPACK_IMPORTED_MODULE_2__["default"];
15444hyperform.stepDown = _polyfills_stepDown__WEBPACK_IMPORTED_MODULE_3__["default"];
15445hyperform.stepUp = _polyfills_stepUp__WEBPACK_IMPORTED_MODULE_4__["default"];
15446hyperform.validationMessage = _polyfills_validationMessage__WEBPACK_IMPORTED_MODULE_5__["default"];
15447hyperform.ValidityState = _polyfills_validityState__WEBPACK_IMPORTED_MODULE_6__["default"];
15448hyperform.valueAsDate = _polyfills_valueAsDate__WEBPACK_IMPORTED_MODULE_7__["default"];
15449hyperform.valueAsNumber = _polyfills_valueAsNumber__WEBPACK_IMPORTED_MODULE_8__["default"];
15450hyperform.willValidate = _polyfills_willValidate__WEBPACK_IMPORTED_MODULE_9__["default"];
15451
15452hyperform.setLanguage = function (lang) {
15453  Object(_components_localization__WEBPACK_IMPORTED_MODULE_12__["set_language"])(lang);
15454  return hyperform;
15455};
15456
15457hyperform.addTranslation = function (lang, catalog) {
15458  Object(_components_localization__WEBPACK_IMPORTED_MODULE_12__["add_translation"])(lang, catalog);
15459  return hyperform;
15460};
15461
15462hyperform.setRenderer = function (renderer, action) {
15463  _components_renderer__WEBPACK_IMPORTED_MODULE_14__["default"].set(renderer, action);
15464  return hyperform;
15465};
15466
15467hyperform.addValidator = function (element, validator) {
15468  _components_registry__WEBPACK_IMPORTED_MODULE_13__["default"].set(element, validator);
15469  return hyperform;
15470};
15471
15472hyperform.setMessage = function (element, validator, message) {
15473  _components_custom_messages__WEBPACK_IMPORTED_MODULE_10__["default"].set(element, validator, message);
15474  return hyperform;
15475};
15476
15477hyperform.addHook = function (hook, action, position) {
15478  Object(_components_hooks__WEBPACK_IMPORTED_MODULE_11__["add_hook"])(hook, action, position);
15479  return hyperform;
15480};
15481
15482hyperform.removeHook = function (hook, action) {
15483  Object(_components_hooks__WEBPACK_IMPORTED_MODULE_11__["remove_hook"])(hook, action);
15484  return hyperform;
15485}; // TODO: Remove in next non-patch version
15486
15487
15488hyperform.set_language = function (lang) {
15489  w('set_language');
15490  Object(_components_localization__WEBPACK_IMPORTED_MODULE_12__["set_language"])(lang);
15491  return hyperform;
15492};
15493
15494hyperform.add_translation = function (lang, catalog) {
15495  w('add_translation');
15496  Object(_components_localization__WEBPACK_IMPORTED_MODULE_12__["add_translation"])(lang, catalog);
15497  return hyperform;
15498};
15499
15500hyperform.set_renderer = function (renderer, action) {
15501  w('set_renderer');
15502  _components_renderer__WEBPACK_IMPORTED_MODULE_14__["default"].set(renderer, action);
15503  return hyperform;
15504};
15505
15506hyperform.add_validator = function (element, validator) {
15507  w('add_validator');
15508  _components_registry__WEBPACK_IMPORTED_MODULE_13__["default"].set(element, validator);
15509  return hyperform;
15510};
15511
15512hyperform.set_message = function (element, validator, message) {
15513  w('set_message');
15514  _components_custom_messages__WEBPACK_IMPORTED_MODULE_10__["default"].set(element, validator, message);
15515  return hyperform;
15516};
15517
15518hyperform.add_hook = function (hook, action, position) {
15519  w('add_hook');
15520  Object(_components_hooks__WEBPACK_IMPORTED_MODULE_11__["add_hook"])(hook, action, position);
15521  return hyperform;
15522};
15523
15524hyperform.remove_hook = function (hook, action) {
15525  w('remove_hook');
15526  Object(_components_hooks__WEBPACK_IMPORTED_MODULE_11__["remove_hook"])(hook, action);
15527  return hyperform;
15528};
15529
15530if (document.currentScript && document.currentScript.hasAttribute('data-hf-autoload')) {
15531  hyperform(window);
15532}
15533
15534/* harmony default export */ __webpack_exports__["default"] = (hyperform);
15535
15536/***/ }),
15537
vendor: 2,577 bytes, lines 15538-15592
15538/***/ "../node_modules/hyperform/src/polyfills/checkValidity.js":
15539/*!****************************************************************!*\
15540  !*** ../node_modules/hyperform/src/polyfills/checkValidity.js ***!
15541  \****************************************************************/
15542/*! exports provided: default */
15543/***/ (function(module, __webpack_exports__, __webpack_require__) {
15544
15545"use strict";
15546__webpack_require__.r(__webpack_exports__);
15547/* harmony import */ var _tools_get_validated_elements__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_validated_elements */ "../node_modules/hyperform/src/tools/get_validated_elements.js");
15548/* harmony import */ var _tools_return_hook_or__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/return_hook_or */ "../node_modules/hyperform/src/tools/return_hook_or.js");
15549/* harmony import */ var _tools_trigger_event__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tools/trigger_event */ "../node_modules/hyperform/src/tools/trigger_event.js");
15550/* harmony import */ var _validityState__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./validityState */ "../node_modules/hyperform/src/polyfills/validityState.js");
15551/* harmony import */ var _components_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/wrapper */ "../node_modules/hyperform/src/components/wrapper.js");
15552
15553
15554
15555
15556
15557
15558
15559/**
15560 * check an element's validity with respect to it's form
15561 */
15562
15563var checkValidity = Object(_tools_return_hook_or__WEBPACK_IMPORTED_MODULE_1__["default"])('checkValidity', function (element) {
15564  /* if this is a <form>, check validity of all child inputs */
15565  if (element instanceof window.HTMLFormElement) {
15566    return Object(_tools_get_validated_elements__WEBPACK_IMPORTED_MODULE_0__["get_validated_elements"])(element).map(checkValidity).every(function (b) {
15567      return b;
15568    });
15569  }
15570  /* default is true, also for elements that are no validation candidates */
15571
15572
15573  var valid = Object(_validityState__WEBPACK_IMPORTED_MODULE_3__["default"])(element).valid;
15574
15575  if (valid) {
15576    var wrapped_form = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_4__["get_wrapper"])(element);
15577
15578    if (wrapped_form && wrapped_form.settings.validEvent) {
15579      Object(_tools_trigger_event__WEBPACK_IMPORTED_MODULE_2__["default"])(element, 'valid');
15580    }
15581  } else {
15582    Object(_tools_trigger_event__WEBPACK_IMPORTED_MODULE_2__["default"])(element, 'invalid', {
15583      cancelable: true
15584    });
15585  }
15586
15587  return valid;
15588});
15589/* harmony default export */ __webpack_exports__["default"] = (checkValidity);
15590
15591/***/ }),
15592
vendor: 3,948 bytes, lines 15593-15693
15593/***/ "../node_modules/hyperform/src/polyfills/properties.js":
15594/*!*************************************************************!*\
15595  !*** ../node_modules/hyperform/src/polyfills/properties.js ***!
15596  \*************************************************************/
15597/*! exports provided: install_properties, uninstall_properties */
15598/***/ (function(module, __webpack_exports__, __webpack_require__) {
15599
15600"use strict";
15601__webpack_require__.r(__webpack_exports__);
15602/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "install_properties", function() { return install_properties; });
15603/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uninstall_properties", function() { return uninstall_properties; });
15604/* harmony import */ var _tools_property_installer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/property_installer */ "../node_modules/hyperform/src/tools/property_installer.js");
15605/* harmony import */ var _tools_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/property_uninstaller */ "../node_modules/hyperform/src/tools/property_uninstaller.js");
15606/* harmony import */ var _components_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/hooks */ "../node_modules/hyperform/src/components/hooks.js");
15607
15608
15609
15610
15611
15612
15613var gA = function gA(prop) {
15614  return function () {
15615    return Object(_components_hooks__WEBPACK_IMPORTED_MODULE_2__["do_filter"])('attr_get_' + prop, this.getAttribute(prop), this);
15616  };
15617};
15618
15619var sA = function sA(prop) {
15620  return function (value) {
15621    this.setAttribute(prop, Object(_components_hooks__WEBPACK_IMPORTED_MODULE_2__["do_filter"])('attr_set_' + prop, value, this));
15622  };
15623};
15624
15625var gAb = function gAb(prop) {
15626  return function () {
15627    return Object(_components_hooks__WEBPACK_IMPORTED_MODULE_2__["do_filter"])('attr_get_' + prop, this.hasAttribute(prop), this);
15628  };
15629};
15630
15631var sAb = function sAb(prop) {
15632  return function (value) {
15633    if (Object(_components_hooks__WEBPACK_IMPORTED_MODULE_2__["do_filter"])('attr_set_' + prop, value, this)) {
15634      this.setAttribute(prop, prop);
15635    } else {
15636      this.removeAttribute(prop);
15637    }
15638  };
15639};
15640
15641var gAn = function gAn(prop) {
15642  return function () {
15643    return Object(_components_hooks__WEBPACK_IMPORTED_MODULE_2__["do_filter"])('attr_get_' + prop, Math.max(0, Number(this.getAttribute(prop))), this);
15644  };
15645};
15646
15647var sAn = function sAn(prop) {
15648  return function (value) {
15649    value = Object(_components_hooks__WEBPACK_IMPORTED_MODULE_2__["do_filter"])('attr_set_' + prop, value, this);
15650
15651    if (/^[0-9]+$/.test(value)) {
15652      this.setAttribute(prop, value);
15653    }
15654  };
15655};
15656
15657function install_properties(element) {
15658  for (var _i = 0, _arr = ['accept', 'max', 'min', 'pattern', 'placeholder', 'step']; _i < _arr.length; _i++) {
15659    var prop = _arr[_i];
15660    Object(_tools_property_installer__WEBPACK_IMPORTED_MODULE_0__["default"])(element, prop, {
15661      get: gA(prop),
15662      set: sA(prop)
15663    });
15664  }
15665
15666  for (var _i2 = 0, _arr2 = ['multiple', 'required', 'readOnly']; _i2 < _arr2.length; _i2++) {
15667    var _prop = _arr2[_i2];
15668    Object(_tools_property_installer__WEBPACK_IMPORTED_MODULE_0__["default"])(element, _prop, {
15669      get: gAb(_prop.toLowerCase()),
15670      set: sAb(_prop.toLowerCase())
15671    });
15672  }
15673
15674  for (var _i3 = 0, _arr3 = ['minLength', 'maxLength']; _i3 < _arr3.length; _i3++) {
15675    var _prop2 = _arr3[_i3];
15676    Object(_tools_property_installer__WEBPACK_IMPORTED_MODULE_0__["default"])(element, _prop2, {
15677      get: gAn(_prop2.toLowerCase()),
15678      set: sAn(_prop2.toLowerCase())
15679    });
15680  }
15681}
15682
15683function uninstall_properties(element) {
15684  for (var _i4 = 0, _arr4 = ['accept', 'max', 'min', 'pattern', 'placeholder', 'step', 'multiple', 'required', 'readOnly', 'minLength', 'maxLength']; _i4 < _arr4.length; _i4++) {
15685    var prop = _arr4[_i4];
15686    Object(_tools_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, prop);
15687  }
15688}
15689
15690
15691
15692/***/ }),
15693
vendor: 2,915 bytes, lines 15694-15759
15694/***/ "../node_modules/hyperform/src/polyfills/reportValidity.js":
15695/*!*****************************************************************!*\
15696  !*** ../node_modules/hyperform/src/polyfills/reportValidity.js ***!
15697  \*****************************************************************/
15698/*! exports provided: default */
15699/***/ (function(module, __webpack_exports__, __webpack_require__) {
15700
15701"use strict";
15702__webpack_require__.r(__webpack_exports__);
15703/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return reportValidity; });
15704/* harmony import */ var _tools_get_validated_elements__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_validated_elements */ "../node_modules/hyperform/src/tools/get_validated_elements.js");
15705/* harmony import */ var _tools_trigger_event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/trigger_event */ "../node_modules/hyperform/src/tools/trigger_event.js");
15706/* harmony import */ var _components_renderer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/renderer */ "../node_modules/hyperform/src/components/renderer.js");
15707/* harmony import */ var _validityState__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./validityState */ "../node_modules/hyperform/src/polyfills/validityState.js");
15708/* harmony import */ var _components_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/wrapper */ "../node_modules/hyperform/src/components/wrapper.js");
15709
15710
15711
15712
15713
15714
15715
15716/**
15717 * check element's validity and report an error back to the user
15718 */
15719
15720function reportValidity(element) {
15721  /* if this is a <form>, report validity of all child inputs */
15722  if (element instanceof window.HTMLFormElement) {
15723    element.__hf_form_validation = true;
15724    var form_valid = Object(_tools_get_validated_elements__WEBPACK_IMPORTED_MODULE_0__["get_validated_elements"])(element).map(reportValidity).every(function (b) {
15725      return b;
15726    });
15727    delete element.__hf_form_validation;
15728    return form_valid;
15729  }
15730  /* we copy checkValidity() here, b/c we have to check if the "invalid"
15731   * event was canceled. */
15732
15733
15734  var valid = Object(_validityState__WEBPACK_IMPORTED_MODULE_3__["default"])(element).valid;
15735  var event;
15736
15737  if (valid) {
15738    var wrapped_form = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_4__["get_wrapper"])(element);
15739
15740    if (wrapped_form && wrapped_form.settings.validEvent) {
15741      event = Object(_tools_trigger_event__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'valid', {
15742        cancelable: true
15743      });
15744    }
15745  } else {
15746    event = Object(_tools_trigger_event__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'invalid', {
15747      cancelable: true
15748    });
15749  }
15750
15751  if (!event || !event.defaultPrevented) {
15752    _components_renderer__WEBPACK_IMPORTED_MODULE_2__["default"].showWarning(element, !!element.form.__hf_form_validation);
15753  }
15754
15755  return valid;
15756}
15757
15758/***/ }),
15759
vendor: 1,945 bytes, lines 15760-15803
15760/***/ "../node_modules/hyperform/src/polyfills/setCustomValidity.js":
15761/*!********************************************************************!*\
15762  !*** ../node_modules/hyperform/src/polyfills/setCustomValidity.js ***!
15763  \********************************************************************/
15764/*! exports provided: default */
15765/***/ (function(module, __webpack_exports__, __webpack_require__) {
15766
15767"use strict";
15768__webpack_require__.r(__webpack_exports__);
15769/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return setCustomValidity; });
15770/* harmony import */ var _components_message_store__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/message_store */ "../node_modules/hyperform/src/components/message_store.js");
15771/* harmony import */ var _components_renderer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/renderer */ "../node_modules/hyperform/src/components/renderer.js");
15772/* harmony import */ var _tools_validity_state_checkers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tools/validity_state_checkers */ "../node_modules/hyperform/src/tools/validity_state_checkers.js");
15773
15774
15775
15776
15777
15778/**
15779 * set a custom validity message or delete it with an empty string
15780 */
15781
15782function setCustomValidity(element, msg) {
15783  if (!msg) {
15784    _components_message_store__WEBPACK_IMPORTED_MODULE_0__["message_store"].delete(element, true);
15785  } else {
15786    _components_message_store__WEBPACK_IMPORTED_MODULE_0__["message_store"].set(element, msg, true);
15787  }
15788  /* live-update the warning */
15789
15790
15791  var warning = _components_renderer__WEBPACK_IMPORTED_MODULE_1__["default"].getWarning(element);
15792
15793  if (warning) {
15794    _components_renderer__WEBPACK_IMPORTED_MODULE_1__["default"].setMessage(warning, msg, element);
15795  }
15796  /* update any classes if the validity state changes */
15797
15798
15799  _tools_validity_state_checkers__WEBPACK_IMPORTED_MODULE_2__["default"].valid(element);
15800}
15801
15802/***/ }),
15803
vendor: 2,013 bytes, lines 15804-15847
15804/***/ "../node_modules/hyperform/src/polyfills/stepDown.js":
15805/*!***********************************************************!*\
15806  !*** ../node_modules/hyperform/src/polyfills/stepDown.js ***!
15807  \***********************************************************/
15808/*! exports provided: default */
15809/***/ (function(module, __webpack_exports__, __webpack_require__) {
15810
15811"use strict";
15812__webpack_require__.r(__webpack_exports__);
15813/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return stepDown; });
15814/* harmony import */ var _tools_get_next_valid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_next_valid */ "../node_modules/hyperform/src/tools/get_next_valid.js");
15815/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js");
15816/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js");
15817/* harmony import */ var _valueAsNumber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./valueAsNumber */ "../node_modules/hyperform/src/polyfills/valueAsNumber.js");
15818
15819
15820
15821
15822
15823
15824/**
15825 *
15826 */
15827
15828function stepDown(element) {
15829  var n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
15830
15831  if (_components_types__WEBPACK_IMPORTED_MODULE_2__["numbers"].indexOf(Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_1__["default"])(element)) === -1) {
15832    throw new window.DOMException('stepDown encountered invalid type', 'InvalidStateError');
15833  }
15834
15835  if ((element.getAttribute('step') || '').toLowerCase() === 'any') {
15836    throw new window.DOMException('stepDown encountered step "any"', 'InvalidStateError');
15837  }
15838
15839  var prev = Object(_tools_get_next_valid__WEBPACK_IMPORTED_MODULE_0__["default"])(element, n)[0];
15840
15841  if (prev !== null) {
15842    Object(_valueAsNumber__WEBPACK_IMPORTED_MODULE_3__["default"])(element, prev);
15843  }
15844}
15845
15846/***/ }),
15847
vendor: 1,997 bytes, lines 15848-15891
15848/***/ "../node_modules/hyperform/src/polyfills/stepUp.js":
15849/*!*********************************************************!*\
15850  !*** ../node_modules/hyperform/src/polyfills/stepUp.js ***!
15851  \*********************************************************/
15852/*! exports provided: default */
15853/***/ (function(module, __webpack_exports__, __webpack_require__) {
15854
15855"use strict";
15856__webpack_require__.r(__webpack_exports__);
15857/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return stepUp; });
15858/* harmony import */ var _tools_get_next_valid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_next_valid */ "../node_modules/hyperform/src/tools/get_next_valid.js");
15859/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js");
15860/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js");
15861/* harmony import */ var _valueAsNumber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./valueAsNumber */ "../node_modules/hyperform/src/polyfills/valueAsNumber.js");
15862
15863
15864
15865
15866
15867
15868/**
15869 *
15870 */
15871
15872function stepUp(element) {
15873  var n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
15874
15875  if (_components_types__WEBPACK_IMPORTED_MODULE_2__["numbers"].indexOf(Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_1__["default"])(element)) === -1) {
15876    throw new window.DOMException('stepUp encountered invalid type', 'InvalidStateError');
15877  }
15878
15879  if ((element.getAttribute('step') || '').toLowerCase() === 'any') {
15880    throw new window.DOMException('stepUp encountered step "any"', 'InvalidStateError');
15881  }
15882
15883  var next = Object(_tools_get_next_valid__WEBPACK_IMPORTED_MODULE_0__["default"])(element, n)[1];
15884
15885  if (next !== null) {
15886    Object(_valueAsNumber__WEBPACK_IMPORTED_MODULE_3__["default"])(element, next);
15887  }
15888}
15889
15890/***/ }),
15891
vendor: 1,179 bytes, lines 15892-15924
15892/***/ "../node_modules/hyperform/src/polyfills/validationMessage.js":
15893/*!********************************************************************!*\
15894  !*** ../node_modules/hyperform/src/polyfills/validationMessage.js ***!
15895  \********************************************************************/
15896/*! exports provided: default */
15897/***/ (function(module, __webpack_exports__, __webpack_require__) {
15898
15899"use strict";
15900__webpack_require__.r(__webpack_exports__);
15901/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return validationMessage; });
15902/* harmony import */ var _components_message_store__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/message_store */ "../node_modules/hyperform/src/components/message_store.js");
15903
15904
15905
15906/**
15907 * get the validation message for an element, empty string, if the element
15908 * satisfies all constraints.
15909 */
15910
15911function validationMessage(element) {
15912  var msg = _components_message_store__WEBPACK_IMPORTED_MODULE_0__["message_store"].get(element);
15913
15914  if (!msg) {
15915    return '';
15916  }
15917  /* make it a primitive again, since message_store returns String(). */
15918
15919
15920  return msg.toString();
15921}
15922
15923/***/ }),
15924
vendor: 2,897 bytes, lines 15925-16009
15925/***/ "../node_modules/hyperform/src/polyfills/validityState.js":
15926/*!****************************************************************!*\
15927  !*** ../node_modules/hyperform/src/polyfills/validityState.js ***!
15928  \****************************************************************/
15929/*! exports provided: default */
15930/***/ (function(module, __webpack_exports__, __webpack_require__) {
15931
15932"use strict";
15933__webpack_require__.r(__webpack_exports__);
15934/* harmony import */ var _tools_is_validation_candidate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/is_validation_candidate */ "../node_modules/hyperform/src/tools/is_validation_candidate.js");
15935/* harmony import */ var _tools_mark__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/mark */ "../node_modules/hyperform/src/tools/mark.js");
15936/* harmony import */ var _tools_validity_state_checkers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tools/validity_state_checkers */ "../node_modules/hyperform/src/tools/validity_state_checkers.js");
15937
15938
15939
15940
15941
15942/**
15943 * the validity state constructor
15944 */
15945
15946var ValidityState = function ValidityState(element) {
15947  if (!(element instanceof window.HTMLElement)) {
15948    throw new Error('cannot create a ValidityState for a non-element');
15949  }
15950
15951  var cached = ValidityState.cache.get(element);
15952
15953  if (cached) {
15954    return cached;
15955  }
15956
15957  if (!(this instanceof ValidityState)) {
15958    /* working around a forgotten `new` */
15959    return new ValidityState(element);
15960  }
15961
15962  this.element = element;
15963  ValidityState.cache.set(element, this);
15964};
15965/**
15966 * the prototype for new validityState instances
15967 */
15968
15969
15970var ValidityStatePrototype = {};
15971ValidityState.prototype = ValidityStatePrototype;
15972ValidityState.cache = new WeakMap();
15973/* small wrapper around the actual validator to check if the validator
15974 * should actually be called. `this` refers to the ValidityState object. */
15975
15976var checker_getter = function checker_getter(func) {
15977  return function () {
15978    if (!Object(_tools_is_validation_candidate__WEBPACK_IMPORTED_MODULE_0__["default"])(this.element)) {
15979      /* not being validated == valid by default */
15980      return true;
15981    }
15982
15983    return func(this.element);
15984  };
15985};
15986/**
15987 * copy functionality from the validity checkers to the ValidityState
15988 * prototype
15989 */
15990
15991
15992for (var prop in _tools_validity_state_checkers__WEBPACK_IMPORTED_MODULE_2__["default"]) {
15993  Object.defineProperty(ValidityStatePrototype, prop, {
15994    configurable: true,
15995    enumerable: true,
15996    get: checker_getter(_tools_validity_state_checkers__WEBPACK_IMPORTED_MODULE_2__["default"][prop]),
15997    set: undefined
15998  });
15999}
16000/**
16001 * mark the validity prototype, because that is what the client-facing
16002 * code deals with mostly, not the property descriptor thing */
16003
16004
16005Object(_tools_mark__WEBPACK_IMPORTED_MODULE_1__["default"])(ValidityStatePrototype);
16006/* harmony default export */ __webpack_exports__["default"] = (ValidityState);
16007
16008/***/ }),
16009
vendor: 2,644 bytes, lines 16010-16069
16010/***/ "../node_modules/hyperform/src/polyfills/valueAsDate.js":
16011/*!**************************************************************!*\
16012  !*** ../node_modules/hyperform/src/polyfills/valueAsDate.js ***!
16013  \**************************************************************/
16014/*! exports provided: default */
16015/***/ (function(module, __webpack_exports__, __webpack_require__) {
16016
16017"use strict";
16018__webpack_require__.r(__webpack_exports__);
16019/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return valueAsDate; });
16020/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js");
16021/* harmony import */ var _tools_string_to_date__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/string_to_date */ "../node_modules/hyperform/src/tools/string_to_date.js");
16022/* harmony import */ var _tools_date_to_string__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tools/date_to_string */ "../node_modules/hyperform/src/tools/date_to_string.js");
16023/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js");
16024
16025
16026
16027
16028
16029
16030/**
16031 * implement the valueAsDate functionality
16032 *
16033 * @see https://html.spec.whatwg.org/multipage/forms.html#dom-input-valueasdate
16034 */
16035
16036function valueAsDate(element) {
16037  var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
16038  var type = Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_0__["default"])(element);
16039
16040  if (_components_types__WEBPACK_IMPORTED_MODULE_3__["dates"].indexOf(type) > -1) {
16041    if (value !== undefined) {
16042      /* setter: value must be null or a Date() */
16043      if (value === null) {
16044        element.value = '';
16045      } else if (value instanceof Date) {
16046        if (isNaN(value.getTime())) {
16047          element.value = '';
16048        } else {
16049          element.value = Object(_tools_date_to_string__WEBPACK_IMPORTED_MODULE_2__["default"])(value, type);
16050        }
16051      } else {
16052        throw new window.DOMException('valueAsDate setter encountered invalid value', 'TypeError');
16053      }
16054
16055      return;
16056    }
16057
16058    var value_date = Object(_tools_string_to_date__WEBPACK_IMPORTED_MODULE_1__["default"])(element.value, type);
16059    return value_date instanceof Date ? value_date : null;
16060  } else if (value !== undefined) {
16061    /* trying to set a date on a not-date input fails */
16062    throw new window.DOMException('valueAsDate setter cannot set date on this element', 'InvalidStateError');
16063  }
16064
16065  return null;
16066}
16067
16068/***/ }),
16069
vendor: 3,023 bytes, lines 16070-16141
16070/***/ "../node_modules/hyperform/src/polyfills/valueAsNumber.js":
16071/*!****************************************************************!*\
16072  !*** ../node_modules/hyperform/src/polyfills/valueAsNumber.js ***!
16073  \****************************************************************/
16074/*! exports provided: default */
16075/***/ (function(module, __webpack_exports__, __webpack_require__) {
16076
16077"use strict";
16078__webpack_require__.r(__webpack_exports__);
16079/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return valueAsNumber; });
16080/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js");
16081/* harmony import */ var _tools_string_to_number__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/string_to_number */ "../node_modules/hyperform/src/tools/string_to_number.js");
16082/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js");
16083/* harmony import */ var _valueAsDate__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./valueAsDate */ "../node_modules/hyperform/src/polyfills/valueAsDate.js");
16084
16085
16086
16087
16088
16089
16090/**
16091 * implement the valueAsNumber functionality
16092 *
16093 * @see https://html.spec.whatwg.org/multipage/forms.html#dom-input-valueasnumber
16094 */
16095
16096function valueAsNumber(element) {
16097  var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
16098  var type = Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_0__["default"])(element);
16099
16100  if (_components_types__WEBPACK_IMPORTED_MODULE_2__["numbers"].indexOf(type) > -1) {
16101    if (type === 'range' && element.hasAttribute('multiple')) {
16102      /* @see https://html.spec.whatwg.org/multipage/forms.html#do-not-apply */
16103      return NaN;
16104    }
16105
16106    if (value !== undefined) {
16107      /* setter: value must be NaN or a finite number */
16108      if (isNaN(value)) {
16109        element.value = '';
16110      } else if (typeof value === 'number' && window.isFinite(value)) {
16111        try {
16112          /* try setting as a date, but... */
16113          Object(_valueAsDate__WEBPACK_IMPORTED_MODULE_3__["default"])(element, new Date(value));
16114        } catch (e) {
16115          /* ... when valueAsDate is not responsible, ... */
16116          if (!(e instanceof window.DOMException)) {
16117            throw e;
16118          }
16119          /* ... set it via Number.toString(). */
16120
16121
16122          element.value = value.toString();
16123        }
16124      } else {
16125        throw new window.DOMException('valueAsNumber setter encountered invalid value', 'TypeError');
16126      }
16127
16128      return;
16129    }
16130
16131    return Object(_tools_string_to_number__WEBPACK_IMPORTED_MODULE_1__["default"])(element.value, type);
16132  } else if (value !== undefined) {
16133    /* trying to set a number on a not-number input fails */
16134    throw new window.DOMException('valueAsNumber setter cannot set number on this element', 'InvalidStateError');
16135  }
16136
16137  return NaN;
16138}
16139
16140/***/ }),
16141
vendor: 992 bytes, lines 16142-16165
16142/***/ "../node_modules/hyperform/src/polyfills/willValidate.js":
16143/*!***************************************************************!*\
16144  !*** ../node_modules/hyperform/src/polyfills/willValidate.js ***!
16145  \***************************************************************/
16146/*! exports provided: default */
16147/***/ (function(module, __webpack_exports__, __webpack_require__) {
16148
16149"use strict";
16150__webpack_require__.r(__webpack_exports__);
16151/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return willValidate; });
16152/* harmony import */ var _tools_is_validation_candidate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/is_validation_candidate */ "../node_modules/hyperform/src/tools/is_validation_candidate.js");
16153
16154
16155
16156/**
16157 * check, if an element will be subject to HTML5 validation at all
16158 */
16159
16160function willValidate(element) {
16161  return Object(_tools_is_validation_candidate__WEBPACK_IMPORTED_MODULE_0__["default"])(element);
16162}
16163
16164/***/ }),
16165
vendor: 11,324 bytes, lines 16166-16497
16166/***/ "../node_modules/hyperform/src/tools/catch_submit.js":
16167/*!***********************************************************!*\
16168  !*** ../node_modules/hyperform/src/tools/catch_submit.js ***!
16169  \***********************************************************/
16170/*! exports provided: catch_submit, uncatch_submit */
16171/***/ (function(module, __webpack_exports__, __webpack_require__) {
16172
16173"use strict";
16174__webpack_require__.r(__webpack_exports__);
16175/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "catch_submit", function() { return catch_submit; });
16176/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uncatch_submit", function() { return uncatch_submit; });
16177/* harmony import */ var _trigger_event__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./trigger_event */ "../node_modules/hyperform/src/tools/trigger_event.js");
16178/* harmony import */ var _matches__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./matches */ "../node_modules/hyperform/src/tools/matches.js");
16179/* harmony import */ var _get_validated_elements__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./get_validated_elements */ "../node_modules/hyperform/src/tools/get_validated_elements.js");
16180/* harmony import */ var _polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../polyfills/reportValidity */ "../node_modules/hyperform/src/polyfills/reportValidity.js");
16181/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js");
16182/* harmony import */ var _components_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/wrapper */ "../node_modules/hyperform/src/components/wrapper.js");
16183
16184
16185
16186
16187
16188
16189
16190
16191/**
16192 * submit a form, because `element` triggered it
16193 *
16194 * This method also dispatches a submit event on the form prior to the
16195 * submission. The event contains the trigger element as `submittedVia`.
16196 *
16197 * If the element is a button with a name, the name=value pair will be added
16198 * to the submitted data.
16199 */
16200
16201function submit_form_via(element) {
16202  /* apparently, the submit event is not triggered in most browsers on
16203   * the submit() method, so we do it manually here to model a natural
16204   * submit as closely as possible.
16205   * Now to the fun fact: If you trigger a submit event from a form, what
16206   * do you think should happen?
16207   * 1) the form will be automagically submitted by the browser, or
16208   * 2) nothing.
16209   * And as you already suspected, the correct answer is: both! Firefox
16210   * opts for 1), Chrome for 2). Yay! */
16211  var event_got_cancelled;
16212  var submit_event = Object(_trigger_event__WEBPACK_IMPORTED_MODULE_0__["create_event"])('submit', {
16213    cancelable: true
16214  });
16215  /* force Firefox to not submit the form, then fake preventDefault() */
16216
16217  submit_event.preventDefault();
16218  Object.defineProperty(submit_event, 'defaultPrevented', {
16219    value: false,
16220    writable: true
16221  });
16222  Object.defineProperty(submit_event, 'preventDefault', {
16223    value: function value() {
16224      return submit_event.defaultPrevented = event_got_cancelled = true;
16225    },
16226    writable: true
16227  });
16228  Object(_trigger_event__WEBPACK_IMPORTED_MODULE_0__["default"])(element.form, submit_event, {}, {
16229    submittedVia: element
16230  });
16231
16232  if (!event_got_cancelled) {
16233    add_submit_field(element);
16234    window.HTMLFormElement.prototype.submit.call(element.form);
16235    window.setTimeout(function () {
16236      return remove_submit_field(element);
16237    });
16238  }
16239}
16240/**
16241 * if a submit button was clicked, add its name=value by means of a type=hidden
16242 * input field
16243 */
16244
16245
16246function add_submit_field(button) {
16247  if (['image', 'submit'].indexOf(button.type) > -1 && button.name) {
16248    var wrapper = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_5__["get_wrapper"])(button.form) || {};
16249    var submit_helper = wrapper.submit_helper;
16250
16251    if (submit_helper) {
16252      if (submit_helper.parentNode) {
16253        submit_helper.parentNode.removeChild(submit_helper);
16254      }
16255    } else {
16256      submit_helper = document.createElement('input');
16257      submit_helper.type = 'hidden';
16258      wrapper.submit_helper = submit_helper;
16259    }
16260
16261    submit_helper.name = button.name;
16262    submit_helper.value = button.value;
16263    button.form.appendChild(submit_helper);
16264  }
16265}
16266/**
16267 * remove a possible helper input, that was added by `add_submit_field`
16268 */
16269
16270
16271function remove_submit_field(button) {
16272  if (['image', 'submit'].indexOf(button.type) > -1 && button.name) {
16273    var wrapper = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_5__["get_wrapper"])(button.form) || {};
16274    var submit_helper = wrapper.submit_helper;
16275
16276    if (submit_helper && submit_helper.parentNode) {
16277      submit_helper.parentNode.removeChild(submit_helper);
16278    }
16279  }
16280}
16281/**
16282 * check a form's validity and submit it
16283 *
16284 * The method triggers a cancellable `validate` event on the form. If the
16285 * event is cancelled, form submission will be aborted, too.
16286 *
16287 * If the form is found to contain invalid fields, focus the first field.
16288 */
16289
16290
16291function check(button) {
16292  /* trigger a "validate" event on the form to be submitted */
16293  var val_event = Object(_trigger_event__WEBPACK_IMPORTED_MODULE_0__["default"])(button.form, 'validate', {
16294    cancelable: true
16295  });
16296
16297  if (val_event.defaultPrevented) {
16298    /* skip the whole submit thing, if the validation is canceled. A user
16299     * can still call form.submit() afterwards. */
16300    return;
16301  }
16302
16303  var valid = true;
16304  var first_invalid;
16305  button.form.__hf_form_validation = true;
16306  Object(_get_validated_elements__WEBPACK_IMPORTED_MODULE_2__["get_validated_elements"])(button.form).map(function (element) {
16307    if (!Object(_polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_3__["default"])(element)) {
16308      valid = false;
16309
16310      if (!first_invalid && 'focus' in element) {
16311        first_invalid = element;
16312      }
16313    }
16314  });
16315  delete button.form.__hf_form_validation;
16316
16317  if (valid) {
16318    submit_form_via(button);
16319  } else if (first_invalid) {
16320    /* focus the first invalid element, if validation went south */
16321    first_invalid.focus();
16322    /* tell the tale, if anyone wants to react to it */
16323
16324    Object(_trigger_event__WEBPACK_IMPORTED_MODULE_0__["default"])(button.form, 'forminvalid');
16325  }
16326}
16327/**
16328 * test if node is a submit button
16329 */
16330
16331
16332function is_submit_button(node) {
16333  return (
16334    /* must be an input or button element... */
16335    (node.nodeName === 'INPUT' || node.nodeName === 'BUTTON') && (
16336    /* ...and have a submitting type */
16337    node.type === 'image' || node.type === 'submit')
16338  );
16339}
16340/**
16341 * test, if the click event would trigger a submit
16342 */
16343
16344
16345function is_submitting_click(event, button) {
16346  return (
16347    /* prevented default: won't trigger a submit */
16348    !event.defaultPrevented && (
16349    /* left button or middle button (submits in Chrome) */
16350    !('button' in event) || event.button < 2) &&
16351    /* must be a submit button... */
16352    is_submit_button(button) &&
16353    /* the button needs a form, that's going to be submitted */
16354    button.form &&
16355    /* again, if the form should not be validated, we're out of the game */
16356    !button.form.hasAttribute('novalidate')
16357  );
16358}
16359/**
16360 * test, if the keypress event would trigger a submit
16361 */
16362
16363
16364function is_submitting_keypress(event) {
16365  return (
16366    /* prevented default: won't trigger a submit */
16367    !event.defaultPrevented && (
16368    /* ...and <Enter> was pressed... */
16369    event.keyCode === 13 &&
16370    /* ...on an <input> that is... */
16371    event.target.nodeName === 'INPUT' &&
16372    /* ...a standard text input field (not checkbox, ...) */
16373    _components_types__WEBPACK_IMPORTED_MODULE_4__["text"].indexOf(event.target.type) > -1 ||
16374    /* or <Enter> or <Space> was pressed... */
16375    (event.keyCode === 13 || event.keyCode === 32) &&
16376    /* ...on a submit button */
16377    is_submit_button(event.target)) &&
16378    /* there's a form... */
16379    event.target.form &&
16380    /* ...and the form allows validation */
16381    !event.target.form.hasAttribute('novalidate')
16382  );
16383}
16384/**
16385 * catch clicks to children of <button>s
16386 */
16387
16388
16389function get_clicked_button(element) {
16390  if (is_submit_button(element)) {
16391    return element;
16392  } else if (Object(_matches__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'button:not([type]) *, button[type="submit"] *')) {
16393    return get_clicked_button(element.parentNode);
16394  } else {
16395    return null;
16396  }
16397}
16398/**
16399 * return event handler to catch explicit submission by click on a button
16400 */
16401
16402
16403function get_click_handler() {
16404  var ignore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
16405  return function (event) {
16406    var button = get_clicked_button(event.target);
16407
16408    if (button && is_submitting_click(event, button)) {
16409      event.preventDefault();
16410
16411      if (ignore || button.hasAttribute('formnovalidate')) {
16412        /* if validation should be ignored, we're not interested in any checks */
16413        submit_form_via(button);
16414      } else {
16415        check(button);
16416      }
16417    }
16418  };
16419}
16420
16421var click_handler = get_click_handler();
16422var ignored_click_handler = get_click_handler(true);
16423/**
16424 * catch implicit submission by pressing <Enter> in some situations
16425 */
16426
16427function get_keypress_handler(ignore) {
16428  return function keypress_handler(event) {
16429    if (is_submitting_keypress(event)) {
16430      event.preventDefault();
16431      var wrapper = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_5__["get_wrapper"])(event.target.form) || {
16432        settings: {}
16433      };
16434
16435      if (wrapper.settings.preventImplicitSubmit) {
16436        /* user doesn't want an implicit submit. Cancel here. */
16437        return;
16438      }
16439      /* check, that there is no submit button in the form. Otherwise
16440      * that should be clicked. */
16441
16442
16443      var el = event.target.form.elements.length;
16444      var submit;
16445
16446      for (var i = 0; i < el; i++) {
16447        if (['image', 'submit'].indexOf(event.target.form.elements[i].type) > -1) {
16448          submit = event.target.form.elements[i];
16449          break;
16450        }
16451      }
16452
16453      if (submit) {
16454        submit.click();
16455      } else if (ignore) {
16456        submit_form_via(event.target);
16457      } else {
16458        check(event.target);
16459      }
16460    }
16461  };
16462}
16463
16464var keypress_handler = get_keypress_handler();
16465var ignored_keypress_handler = get_keypress_handler(true);
16466/**
16467 * catch all relevant events _prior_ to a form being submitted
16468 *
16469 * @param bool ignore bypass validation, when an attempt to submit the
16470 *                    form is detected. True, when the wrapper's revalidate
16471 *                    setting is 'never'.
16472 */
16473
16474function catch_submit(listening_node) {
16475  var ignore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
16476
16477  if (ignore) {
16478    listening_node.addEventListener('click', ignored_click_handler);
16479    listening_node.addEventListener('keypress', ignored_keypress_handler);
16480  } else {
16481    listening_node.addEventListener('click', click_handler);
16482    listening_node.addEventListener('keypress', keypress_handler);
16483  }
16484}
16485/**
16486 * decommission the event listeners from catch_submit() again
16487 */
16488
16489function uncatch_submit(listening_node) {
16490  listening_node.removeEventListener('click', ignored_click_handler);
16491  listening_node.removeEventListener('keypress', ignored_keypress_handler);
16492  listening_node.removeEventListener('click', click_handler);
16493  listening_node.removeEventListener('keypress', keypress_handler);
16494}
16495
16496/***/ }),
16497
vendor: 1,020 bytes, lines 16498-16528
16498/***/ "../node_modules/hyperform/src/tools/comma_split.js":
16499/*!**********************************************************!*\
16500  !*** ../node_modules/hyperform/src/tools/comma_split.js ***!
16501  \**********************************************************/
16502/*! exports provided: default */
16503/***/ (function(module, __webpack_exports__, __webpack_require__) {
16504
16505"use strict";
16506__webpack_require__.r(__webpack_exports__);
16507/* harmony import */ var _trim__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./trim */ "../node_modules/hyperform/src/tools/trim.js");
16508
16509
16510
16511/**
16512 * split a string on comma and trim the components
16513 *
16514 * As specified at
16515 * https://html.spec.whatwg.org/multipage/infrastructure.html#split-a-string-on-commas
16516 * plus removing empty entries.
16517 */
16518
16519/* harmony default export */ __webpack_exports__["default"] = (function (str) {
16520  return str.split(',').map(function (item) {
16521    return Object(_trim__WEBPACK_IMPORTED_MODULE_0__["default"])(item);
16522  }).filter(function (b) {
16523    return b;
16524  });
16525});
16526
16527/***/ }),
16528
vendor: 2,515 bytes, lines 16529-16591
16529/***/ "../node_modules/hyperform/src/tools/date_to_string.js":
16530/*!*************************************************************!*\
16531  !*** ../node_modules/hyperform/src/tools/date_to_string.js ***!
16532  \*************************************************************/
16533/*! exports provided: default */
16534/***/ (function(module, __webpack_exports__, __webpack_require__) {
16535
16536"use strict";
16537__webpack_require__.r(__webpack_exports__);
16538/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return date_to_string; });
16539/* harmony import */ var _sprintf__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sprintf */ "../node_modules/hyperform/src/tools/sprintf.js");
16540/* harmony import */ var _get_week_of_year__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./get_week_of_year */ "../node_modules/hyperform/src/tools/get_week_of_year.js");
16541
16542
16543
16544
16545
16546function pad(num) {
16547  var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;
16548  var s = num + '';
16549
16550  while (s.length < size) {
16551    s = '0' + s;
16552  }
16553
16554  return s;
16555}
16556/**
16557 * calculate a string from a date according to HTML5
16558 */
16559
16560
16561function date_to_string(date, element_type) {
16562  if (!(date instanceof Date)) {
16563    return null;
16564  }
16565
16566  switch (element_type) {
16567    case 'datetime':
16568      return date_to_string(date, 'date') + 'T' + date_to_string(date, 'time');
16569
16570    case 'datetime-local':
16571      return Object(_sprintf__WEBPACK_IMPORTED_MODULE_0__["default"])('%s-%s-%sT%s:%s:%s.%s', date.getFullYear(), pad(date.getMonth() + 1), pad(date.getDate()), pad(date.getHours()), pad(date.getMinutes()), pad(date.getSeconds()), pad(date.getMilliseconds(), 3)).replace(/(:00)?\.000$/, '');
16572
16573    case 'date':
16574      return Object(_sprintf__WEBPACK_IMPORTED_MODULE_0__["default"])('%s-%s-%s', date.getUTCFullYear(), pad(date.getUTCMonth() + 1), pad(date.getUTCDate()));
16575
16576    case 'month':
16577      return Object(_sprintf__WEBPACK_IMPORTED_MODULE_0__["default"])('%s-%s', date.getUTCFullYear(), pad(date.getUTCMonth() + 1));
16578
16579    case 'week':
16580      var params = Object(_get_week_of_year__WEBPACK_IMPORTED_MODULE_1__["default"])(date);
16581      return _sprintf__WEBPACK_IMPORTED_MODULE_0__["default"].call(null, '%s-W%s', params[0], pad(params[1]));
16582
16583    case 'time':
16584      return Object(_sprintf__WEBPACK_IMPORTED_MODULE_0__["default"])('%s:%s:%s.%s', pad(date.getUTCHours()), pad(date.getUTCMinutes()), pad(date.getUTCSeconds()), pad(date.getUTCMilliseconds(), 3)).replace(/(:00)?\.000$/, '');
16585  }
16586
16587  return null;
16588}
16589
16590/***/ }),
16591
vendor: 1,096 bytes, lines 16592-16627
16592/***/ "../node_modules/hyperform/src/tools/format_date.js":
16593/*!**********************************************************!*\
16594  !*** ../node_modules/hyperform/src/tools/format_date.js ***!
16595  \**********************************************************/
16596/*! exports provided: default */
16597/***/ (function(module, __webpack_exports__, __webpack_require__) {
16598
16599"use strict";
16600__webpack_require__.r(__webpack_exports__);
16601
16602
16603/* harmony default export */ __webpack_exports__["default"] = (function (date) {
16604  var part = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
16605
16606  switch (part) {
16607    case 'date':
16608      return (date.toLocaleDateString || date.toDateString).call(date);
16609
16610    case 'time':
16611      return (date.toLocaleTimeString || date.toTimeString).call(date);
16612
16613    case 'month':
16614      return 'toLocaleDateString' in date ? date.toLocaleDateString(undefined, {
16615        year: 'numeric',
16616        month: '2-digit'
16617      }) : date.toDateString();
16618    // case 'week':
16619    // TODO
16620
16621    default:
16622      return (date.toLocaleString || date.toString).call(date);
16623  }
16624});
16625
16626/***/ }),
16627
vendor: 967 bytes, lines 16628-16658
16628/***/ "../node_modules/hyperform/src/tools/generate_id.js":
16629/*!**********************************************************!*\
16630  !*** ../node_modules/hyperform/src/tools/generate_id.js ***!
16631  \**********************************************************/
16632/*! exports provided: default */
16633/***/ (function(module, __webpack_exports__, __webpack_require__) {
16634
16635"use strict";
16636__webpack_require__.r(__webpack_exports__);
16637
16638/**
16639 * counter that will be incremented with every call
16640 *
16641 * Will enforce uniqueness, as long as no more than 1 hyperform scripts
16642 * are loaded. (In that case we still have the "random" part below.)
16643 */
16644
16645var uid = 0;
16646/**
16647 * generate a random ID
16648 *
16649 * @see https://gist.github.com/gordonbrander/2230317
16650 */
16651
16652/* harmony default export */ __webpack_exports__["default"] = (function () {
16653  var prefix = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'hf_';
16654  return prefix + uid++ + Math.random().toString(36).substr(2);
16655});
16656
16657/***/ }),
16658
vendor: 948 bytes, lines 16659-16690
16659/***/ "../node_modules/hyperform/src/tools/get_date_from_week.js":
16660/*!*****************************************************************!*\
16661  !*** ../node_modules/hyperform/src/tools/get_date_from_week.js ***!
16662  \*****************************************************************/
16663/*! exports provided: default */
16664/***/ (function(module, __webpack_exports__, __webpack_require__) {
16665
16666"use strict";
16667__webpack_require__.r(__webpack_exports__);
16668
16669/**
16670 * return a new Date() representing the ISO date for a week number
16671 *
16672 * @see http://stackoverflow.com/a/16591175/113195
16673 */
16674
16675/* harmony default export */ __webpack_exports__["default"] = (function (week, year) {
16676  var date = new Date(Date.UTC(year, 0, 1 + (week - 1) * 7));
16677
16678  if (date.getUTCDay() <= 4
16679  /* thursday */
16680  ) {
16681      date.setUTCDate(date.getUTCDate() - date.getUTCDay() + 1);
16682    } else {
16683    date.setUTCDate(date.getUTCDate() + 8 - date.getUTCDay());
16684  }
16685
16686  return date;
16687});
16688
16689/***/ }),
16690
vendor: 4,606 bytes, lines 16691-16793
16691/***/ "../node_modules/hyperform/src/tools/get_next_valid.js":
16692/*!*************************************************************!*\
16693  !*** ../node_modules/hyperform/src/tools/get_next_valid.js ***!
16694  \*************************************************************/
16695/*! exports provided: default */
16696/***/ (function(module, __webpack_exports__, __webpack_require__) {
16697
16698"use strict";
16699__webpack_require__.r(__webpack_exports__);
16700/* harmony import */ var _date_to_string__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./date_to_string */ "../node_modules/hyperform/src/tools/date_to_string.js");
16701/* harmony import */ var _string_to_number__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./string_to_number */ "../node_modules/hyperform/src/tools/string_to_number.js");
16702/* harmony import */ var _get_type__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./get_type */ "../node_modules/hyperform/src/tools/get_type.js");
16703/* harmony import */ var _components_localization__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/localization */ "../node_modules/hyperform/src/components/localization.js");
16704/* harmony import */ var _components_step_defaults__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/step_defaults */ "../node_modules/hyperform/src/components/step_defaults.js");
16705/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js");
16706
16707
16708
16709
16710
16711
16712
16713
16714/**
16715 * get previous and next valid values for a stepped input element
16716 */
16717
16718/* harmony default export */ __webpack_exports__["default"] = (function (element) {
16719  var n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
16720  var type = Object(_get_type__WEBPACK_IMPORTED_MODULE_2__["default"])(element);
16721  var aMin = element.getAttribute('min');
16722  var min = _components_step_defaults__WEBPACK_IMPORTED_MODULE_4__["default_min"][type] || NaN;
16723
16724  if (aMin) {
16725    var pMin = Object(_string_to_number__WEBPACK_IMPORTED_MODULE_1__["default"])(aMin, type);
16726
16727    if (!isNaN(pMin)) {
16728      min = pMin;
16729    }
16730  }
16731
16732  var aMax = element.getAttribute('max');
16733  var max = _components_step_defaults__WEBPACK_IMPORTED_MODULE_4__["default_max"][type] || NaN;
16734
16735  if (aMax) {
16736    var pMax = Object(_string_to_number__WEBPACK_IMPORTED_MODULE_1__["default"])(aMax, type);
16737
16738    if (!isNaN(pMax)) {
16739      max = pMax;
16740    }
16741  }
16742
16743  var aStep = element.getAttribute('step');
16744  var step = _components_step_defaults__WEBPACK_IMPORTED_MODULE_4__["default_step"][type] || 1;
16745
16746  if (aStep && aStep.toLowerCase() === 'any') {
16747    /* quick return: we cannot calculate prev and next */
16748    return [Object(_components_localization__WEBPACK_IMPORTED_MODULE_3__["default"])('any value'), Object(_components_localization__WEBPACK_IMPORTED_MODULE_3__["default"])('any value')];
16749  } else if (aStep) {
16750    var pStep = Object(_string_to_number__WEBPACK_IMPORTED_MODULE_1__["default"])(aStep, type);
16751
16752    if (!isNaN(pStep)) {
16753      step = pStep;
16754    }
16755  }
16756
16757  var default_value = Object(_string_to_number__WEBPACK_IMPORTED_MODULE_1__["default"])(element.getAttribute('value'), type);
16758  var value = Object(_string_to_number__WEBPACK_IMPORTED_MODULE_1__["default"])(element.value || element.getAttribute('value'), type);
16759
16760  if (isNaN(value)) {
16761    /* quick return: we cannot calculate without a solid base */
16762    return [Object(_components_localization__WEBPACK_IMPORTED_MODULE_3__["default"])('any valid value'), Object(_components_localization__WEBPACK_IMPORTED_MODULE_3__["default"])('any valid value')];
16763  }
16764
16765  var step_base = !isNaN(min) ? min : !isNaN(default_value) ? default_value : _components_step_defaults__WEBPACK_IMPORTED_MODULE_4__["default_step_base"][type] || 0;
16766  var scale = _components_step_defaults__WEBPACK_IMPORTED_MODULE_4__["step_scale_factor"][type] || 1;
16767  var prev = step_base + Math.floor((value - step_base) / (step * scale)) * (step * scale) * n;
16768  var next = step_base + (Math.floor((value - step_base) / (step * scale)) + 1) * (step * scale) * n;
16769
16770  if (prev < min) {
16771    prev = null;
16772  } else if (prev > max) {
16773    prev = max;
16774  }
16775
16776  if (next > max) {
16777    next = null;
16778  } else if (next < min) {
16779    next = min;
16780  }
16781  /* convert to date objects, if appropriate */
16782
16783
16784  if (_components_types__WEBPACK_IMPORTED_MODULE_5__["dates"].indexOf(type) > -1) {
16785    prev = Object(_date_to_string__WEBPACK_IMPORTED_MODULE_0__["default"])(new Date(prev), type);
16786    next = Object(_date_to_string__WEBPACK_IMPORTED_MODULE_0__["default"])(new Date(next), type);
16787  }
16788
16789  return [prev, next];
16790});
16791
16792/***/ }),
16793
vendor: 912 bytes, lines 16794-16821
16794/***/ "../node_modules/hyperform/src/tools/get_radiogroup.js":
16795/*!*************************************************************!*\
16796  !*** ../node_modules/hyperform/src/tools/get_radiogroup.js ***!
16797  \*************************************************************/
16798/*! exports provided: get_radiogroup */
16799/***/ (function(module, __webpack_exports__, __webpack_require__) {
16800
16801"use strict";
16802__webpack_require__.r(__webpack_exports__);
16803/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "get_radiogroup", function() { return get_radiogroup; });
16804
16805/**
16806 * get all radio buttons (including `element`) that belong to element's
16807 * radio group
16808 */
16809
16810function get_radiogroup(element) {
16811  if (element.form) {
16812    return Array.prototype.filter.call(element.form.elements, function (radio) {
16813      return radio.type === 'radio' && radio.name === element.name;
16814    });
16815  }
16816
16817  return [element];
16818}
16819
16820/***/ }),
16821
vendor: 1,500 bytes, lines 16822-16862
16822/***/ "../node_modules/hyperform/src/tools/get_type.js":
16823/*!*******************************************************!*\
16824  !*** ../node_modules/hyperform/src/tools/get_type.js ***!
16825  \*******************************************************/
16826/*! exports provided: default */
16827/***/ (function(module, __webpack_exports__, __webpack_require__) {
16828
16829"use strict";
16830__webpack_require__.r(__webpack_exports__);
16831/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js");
16832
16833
16834
16835/**
16836 * get the element's type in a backwards-compatible way
16837 */
16838
16839/* harmony default export */ __webpack_exports__["default"] = (function (element) {
16840  if (element instanceof window.HTMLTextAreaElement) {
16841    return 'textarea';
16842  } else if (element instanceof window.HTMLSelectElement) {
16843    return element.hasAttribute('multiple') ? 'select-multiple' : 'select-one';
16844  } else if (element instanceof window.HTMLButtonElement) {
16845    return (element.getAttribute('type') || 'submit').toLowerCase();
16846  } else if (element instanceof window.HTMLInputElement) {
16847    var attr = (element.getAttribute('type') || '').toLowerCase();
16848
16849    if (attr && _components_types__WEBPACK_IMPORTED_MODULE_0__["inputs"].indexOf(attr) > -1) {
16850      return attr;
16851    } else {
16852      /* perhaps the DOM has in-depth knowledge. Take that before returning
16853       * 'text'. */
16854      return element.type || 'text';
16855    }
16856  }
16857
16858  return '';
16859});
16860
16861/***/ }),
16862
vendor: 1,381 bytes, lines 16863-16897
16863/***/ "../node_modules/hyperform/src/tools/get_validated_elements.js":
16864/*!*********************************************************************!*\
16865  !*** ../node_modules/hyperform/src/tools/get_validated_elements.js ***!
16866  \*********************************************************************/
16867/*! exports provided: get_validated_elements */
16868/***/ (function(module, __webpack_exports__, __webpack_require__) {
16869
16870"use strict";
16871__webpack_require__.r(__webpack_exports__);
16872/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "get_validated_elements", function() { return get_validated_elements; });
16873/* harmony import */ var _components_wrapper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/wrapper */ "../node_modules/hyperform/src/components/wrapper.js");
16874
16875
16876
16877/**
16878 * filter a form's elements for the ones needing validation prior to
16879 * a submit
16880 *
16881 * Returns an array of form elements.
16882 */
16883
16884function get_validated_elements(form) {
16885  var wrapped_form = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_0__["get_wrapper"])(form);
16886  return Array.prototype.filter.call(form.elements, function (element) {
16887    /* it must have a name (or validating nameless inputs is allowed) */
16888    if (element.getAttribute('name') || wrapped_form && wrapped_form.settings.validateNameless) {
16889      return true;
16890    }
16891
16892    return false;
16893  });
16894}
16895
16896/***/ }),
16897
vendor: 1,613 bytes, lines 16898-16947
16898/***/ "../node_modules/hyperform/src/tools/get_week_of_year.js":
16899/*!***************************************************************!*\
16900  !*** ../node_modules/hyperform/src/tools/get_week_of_year.js ***!
16901  \***************************************************************/
16902/*! exports provided: default */
16903/***/ (function(module, __webpack_exports__, __webpack_require__) {
16904
16905"use strict";
16906__webpack_require__.r(__webpack_exports__);
16907
16908/* For a given date, get the ISO week number
16909 *
16910 * Source: http://stackoverflow.com/a/6117889/113195
16911 *
16912 * Based on information at:
16913 *
16914 *    http://www.merlyn.demon.co.uk/weekcalc.htm#WNR
16915 *
16916 * Algorithm is to find nearest thursday, it's year
16917 * is the year of the week number. Then get weeks
16918 * between that date and the first day of that year.
16919 *
16920 * Note that dates in one year can be weeks of previous
16921 * or next year, overlap is up to 3 days.
16922 *
16923 * e.g. 2014/12/29 is Monday in week  1 of 2015
16924 *      2012/1/1   is Sunday in week 52 of 2011
16925 */
16926
16927/* harmony default export */ __webpack_exports__["default"] = (function (d) {
16928  /* Copy date so don't modify original */
16929  d = new Date(+d);
16930  d.setUTCHours(0, 0, 0);
16931  /* Set to nearest Thursday: current date + 4 - current day number
16932   * Make Sunday's day number 7 */
16933
16934  d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));
16935  /* Get first day of year */
16936
16937  var yearStart = new Date(d.getUTCFullYear(), 0, 1);
16938  /* Calculate full weeks to nearest Thursday */
16939
16940  var weekNo = Math.ceil(((d - yearStart) / 86400000 + 1) / 7);
16941  /* Return array of year and week number */
16942
16943  return [d.getUTCFullYear(), weekNo];
16944});
16945
16946/***/ }),
16947
vendor: 999 bytes, lines 16948-16964
16948/***/ "../node_modules/hyperform/src/tools/is_field.js":
16949/*!*******************************************************!*\
16950  !*** ../node_modules/hyperform/src/tools/is_field.js ***!
16951  \*******************************************************/
16952/*! exports provided: default */
16953/***/ (function(module, __webpack_exports__, __webpack_require__) {
16954
16955"use strict";
16956__webpack_require__.r(__webpack_exports__);
16957
16958
16959/* harmony default export */ __webpack_exports__["default"] = (function (element) {
16960  return element instanceof window.HTMLButtonElement || element instanceof window.HTMLInputElement || element instanceof window.HTMLSelectElement || element instanceof window.HTMLTextAreaElement || element instanceof window.HTMLFieldSetElement || element === window.HTMLButtonElement.prototype || element === window.HTMLInputElement.prototype || element === window.HTMLSelectElement.prototype || element === window.HTMLTextAreaElement.prototype || element === window.HTMLFieldSetElement.prototype;
16961});
16962
16963/***/ }),
16964
vendor: 3,984 bytes, lines 16965-17061
16965/***/ "../node_modules/hyperform/src/tools/is_validation_candidate.js":
16966/*!**********************************************************************!*\
16967  !*** ../node_modules/hyperform/src/tools/is_validation_candidate.js ***!
16968  \**********************************************************************/
16969/*! exports provided: default */
16970/***/ (function(module, __webpack_exports__, __webpack_require__) {
16971
16972"use strict";
16973__webpack_require__.r(__webpack_exports__);
16974/* harmony import */ var _components_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/hooks */ "../node_modules/hyperform/src/components/hooks.js");
16975/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js");
16976/* harmony import */ var _components_wrapper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/wrapper */ "../node_modules/hyperform/src/components/wrapper.js");
16977/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js");
16978
16979
16980
16981
16982
16983
16984/**
16985 * check if an element should be ignored due to any of its parents
16986 *
16987 * Checks <fieldset disabled> and <datalist>.
16988 */
16989
16990function is_in_disallowed_parent(element) {
16991  var p = element.parentNode;
16992
16993  while (p && p.nodeType === 1) {
16994    if (p instanceof window.HTMLFieldSetElement && p.hasAttribute('disabled')) {
16995      /* quick return, if it's a child of a disabled fieldset */
16996      return true;
16997    } else if (p.nodeName.toUpperCase() === 'DATALIST') {
16998      /* quick return, if it's a child of a datalist
16999       * Do not use HTMLDataListElement to support older browsers,
17000       * too.
17001       * @see https://html.spec.whatwg.org/multipage/forms.html#the-datalist-element:barred-from-constraint-validation
17002       */
17003      return true;
17004    } else if (p === element.form) {
17005      /* the outer boundary. We can stop looking for relevant elements. */
17006      break;
17007    }
17008
17009    p = p.parentNode;
17010  }
17011
17012  return false;
17013}
17014/**
17015 * check if an element is a candidate for constraint validation
17016 *
17017 * @see https://html.spec.whatwg.org/multipage/forms.html#barred-from-constraint-validation
17018 */
17019
17020
17021/* harmony default export */ __webpack_exports__["default"] = (function (element) {
17022  /* allow a shortcut via filters, e.g. to validate type=hidden fields */
17023  var filtered = Object(_components_hooks__WEBPACK_IMPORTED_MODULE_0__["do_filter"])('is_validation_candidate', null, element);
17024
17025  if (filtered !== null) {
17026    return !!filtered;
17027  }
17028  /* it must be any of those elements */
17029
17030
17031  if (element instanceof window.HTMLSelectElement || element instanceof window.HTMLTextAreaElement || element instanceof window.HTMLButtonElement || element instanceof window.HTMLInputElement) {
17032    var type = Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_3__["default"])(element);
17033    /* its type must be in the whitelist */
17034
17035    if (_components_types__WEBPACK_IMPORTED_MODULE_1__["non_inputs"].indexOf(type) > -1 || _components_types__WEBPACK_IMPORTED_MODULE_1__["validation_candidates"].indexOf(type) > -1) {
17036      /* it mustn't be disabled or readonly */
17037      if (!element.hasAttribute('disabled') && !element.hasAttribute('readonly')) {
17038        var wrapped_form = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_2__["get_wrapper"])(element);
17039
17040        if (
17041        /* the parent form doesn't allow non-standard "novalidate" attributes... */
17042        wrapped_form && !wrapped_form.settings.novalidateOnElements ||
17043        /* ...or it doesn't have such an attribute/property */
17044        !element.hasAttribute('novalidate') && !element.noValidate) {
17045          /* it isn't part of a <fieldset disabled> */
17046          if (!is_in_disallowed_parent(element)) {
17047            /* then it's a candidate */
17048            return true;
17049          }
17050        }
17051      }
17052    }
17053  }
17054  /* this is no HTML5 validation candidate... */
17055
17056
17057  return false;
17058});
17059
17060/***/ }),
17061
vendor: 1,261 bytes, lines 17062-17096
17062/***/ "../node_modules/hyperform/src/tools/mark.js":
17063/*!***************************************************!*\
17064  !*** ../node_modules/hyperform/src/tools/mark.js ***!
17065  \***************************************************/
17066/*! exports provided: default */
17067/***/ (function(module, __webpack_exports__, __webpack_require__) {
17068
17069"use strict";
17070__webpack_require__.r(__webpack_exports__);
17071
17072/**
17073 * mark an object with a '__hyperform=true' property
17074 *
17075 * We use this to distinguish our properties from the native ones. Usage:
17076 * js> mark(obj);
17077 * js> assert(obj.__hyperform === true)
17078 */
17079
17080function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
17081
17082/* harmony default export */ __webpack_exports__["default"] = (function (obj) {
17083  if (['object', 'function'].indexOf(_typeof(obj)) > -1) {
17084    delete obj.__hyperform;
17085    Object.defineProperty(obj, '__hyperform', {
17086      configurable: true,
17087      enumerable: false,
17088      value: true
17089    });
17090  }
17091
17092  return obj;
17093});
17094
17095/***/ }),
17096
vendor: 746 bytes, lines 17097-17116
17097/***/ "../node_modules/hyperform/src/tools/matches.js":
17098/*!******************************************************!*\
17099  !*** ../node_modules/hyperform/src/tools/matches.js ***!
17100  \******************************************************/
17101/*! exports provided: default */
17102/***/ (function(module, __webpack_exports__, __webpack_require__) {
17103
17104"use strict";
17105__webpack_require__.r(__webpack_exports__);
17106
17107/* shim layer for the Element.matches method */
17108
17109var ep = window.Element.prototype;
17110var native_matches = ep.matches || ep.matchesSelector || ep.msMatchesSelector || ep.webkitMatchesSelector;
17111/* harmony default export */ __webpack_exports__["default"] = (function (element, selector) {
17112  return native_matches.call(element, selector);
17113});
17114
17115/***/ }),
17116
vendor: 6,390 bytes, lines 17117-17230
17117/***/ "../node_modules/hyperform/src/tools/polyfill.js":
17118/*!*******************************************************!*\
17119  !*** ../node_modules/hyperform/src/tools/polyfill.js ***!
17120  \*******************************************************/
17121/*! exports provided: default */
17122/***/ (function(module, __webpack_exports__, __webpack_require__) {
17123
17124"use strict";
17125__webpack_require__.r(__webpack_exports__);
17126/* harmony import */ var _property_installer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./property_installer */ "../node_modules/hyperform/src/tools/property_installer.js");
17127/* harmony import */ var _is_field__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./is_field */ "../node_modules/hyperform/src/tools/is_field.js");
17128/* harmony import */ var _mark__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mark */ "../node_modules/hyperform/src/tools/mark.js");
17129/* harmony import */ var _polyfills_checkValidity__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../polyfills/checkValidity */ "../node_modules/hyperform/src/polyfills/checkValidity.js");
17130/* harmony import */ var _polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../polyfills/reportValidity */ "../node_modules/hyperform/src/polyfills/reportValidity.js");
17131/* harmony import */ var _polyfills_setCustomValidity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../polyfills/setCustomValidity */ "../node_modules/hyperform/src/polyfills/setCustomValidity.js");
17132/* harmony import */ var _polyfills_stepDown__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../polyfills/stepDown */ "../node_modules/hyperform/src/polyfills/stepDown.js");
17133/* harmony import */ var _polyfills_stepUp__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../polyfills/stepUp */ "../node_modules/hyperform/src/polyfills/stepUp.js");
17134/* harmony import */ var _polyfills_validationMessage__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../polyfills/validationMessage */ "../node_modules/hyperform/src/polyfills/validationMessage.js");
17135/* harmony import */ var _polyfills_validityState__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../polyfills/validityState */ "../node_modules/hyperform/src/polyfills/validityState.js");
17136/* harmony import */ var _polyfills_valueAsDate__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../polyfills/valueAsDate */ "../node_modules/hyperform/src/polyfills/valueAsDate.js");
17137/* harmony import */ var _polyfills_valueAsNumber__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../polyfills/valueAsNumber */ "../node_modules/hyperform/src/polyfills/valueAsNumber.js");
17138/* harmony import */ var _polyfills_willValidate__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../polyfills/willValidate */ "../node_modules/hyperform/src/polyfills/willValidate.js");
17139/* harmony import */ var _polyfills_properties__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../polyfills/properties */ "../node_modules/hyperform/src/polyfills/properties.js");
17140
17141
17142
17143
17144
17145
17146
17147
17148
17149
17150
17151
17152
17153
17154
17155
17156var polyfills = {
17157  checkValidity: {
17158    value: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function () {
17159      return Object(_polyfills_checkValidity__WEBPACK_IMPORTED_MODULE_3__["default"])(this);
17160    })
17161  },
17162  reportValidity: {
17163    value: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function () {
17164      return Object(_polyfills_reportValidity__WEBPACK_IMPORTED_MODULE_4__["default"])(this);
17165    })
17166  },
17167  setCustomValidity: {
17168    value: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function (msg) {
17169      return Object(_polyfills_setCustomValidity__WEBPACK_IMPORTED_MODULE_5__["default"])(this, msg);
17170    })
17171  },
17172  stepDown: {
17173    value: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function () {
17174      var n = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
17175      return Object(_polyfills_stepDown__WEBPACK_IMPORTED_MODULE_6__["default"])(this, n);
17176    })
17177  },
17178  stepUp: {
17179    value: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function () {
17180      var n = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
17181      return Object(_polyfills_stepUp__WEBPACK_IMPORTED_MODULE_7__["default"])(this, n);
17182    })
17183  },
17184  validationMessage: {
17185    get: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function () {
17186      return Object(_polyfills_validationMessage__WEBPACK_IMPORTED_MODULE_8__["default"])(this);
17187    })
17188  },
17189  validity: {
17190    get: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function () {
17191      return Object(_polyfills_validityState__WEBPACK_IMPORTED_MODULE_9__["default"])(this);
17192    })
17193  },
17194  valueAsDate: {
17195    get: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function () {
17196      return Object(_polyfills_valueAsDate__WEBPACK_IMPORTED_MODULE_10__["default"])(this);
17197    }),
17198    set: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function (value) {
17199      Object(_polyfills_valueAsDate__WEBPACK_IMPORTED_MODULE_10__["default"])(this, value);
17200    })
17201  },
17202  valueAsNumber: {
17203    get: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function () {
17204      return Object(_polyfills_valueAsNumber__WEBPACK_IMPORTED_MODULE_11__["default"])(this);
17205    }),
17206    set: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function (value) {
17207      Object(_polyfills_valueAsNumber__WEBPACK_IMPORTED_MODULE_11__["default"])(this, value);
17208    })
17209  },
17210  willValidate: {
17211    get: Object(_mark__WEBPACK_IMPORTED_MODULE_2__["default"])(function () {
17212      return Object(_polyfills_willValidate__WEBPACK_IMPORTED_MODULE_12__["default"])(this);
17213    })
17214  }
17215};
17216/* harmony default export */ __webpack_exports__["default"] = (function (element) {
17217  if (Object(_is_field__WEBPACK_IMPORTED_MODULE_1__["default"])(element)) {
17218    for (var prop in polyfills) {
17219      Object(_property_installer__WEBPACK_IMPORTED_MODULE_0__["default"])(element, prop, polyfills[prop]);
17220    }
17221
17222    Object(_polyfills_properties__WEBPACK_IMPORTED_MODULE_13__["install_properties"])(element);
17223  } else if (element instanceof window.HTMLFormElement || element === window.HTMLFormElement.prototype) {
17224    Object(_property_installer__WEBPACK_IMPORTED_MODULE_0__["default"])(element, 'checkValidity', polyfills.checkValidity);
17225    Object(_property_installer__WEBPACK_IMPORTED_MODULE_0__["default"])(element, 'reportValidity', polyfills.reportValidity);
17226  }
17227});
17228
17229/***/ }),
17230
vendor: 2,484 bytes, lines 17231-17268
17231/***/ "../node_modules/hyperform/src/tools/polyunfill.js":
17232/*!*********************************************************!*\
17233  !*** ../node_modules/hyperform/src/tools/polyunfill.js ***!
17234  \*********************************************************/
17235/*! exports provided: default */
17236/***/ (function(module, __webpack_exports__, __webpack_require__) {
17237
17238"use strict";
17239__webpack_require__.r(__webpack_exports__);
17240/* harmony import */ var _is_field__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./is_field */ "../node_modules/hyperform/src/tools/is_field.js");
17241/* harmony import */ var _property_uninstaller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./property_uninstaller */ "../node_modules/hyperform/src/tools/property_uninstaller.js");
17242/* harmony import */ var _polyfills_properties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../polyfills/properties */ "../node_modules/hyperform/src/polyfills/properties.js");
17243
17244
17245
17246
17247
17248/* harmony default export */ __webpack_exports__["default"] = (function (element) {
17249  if (Object(_is_field__WEBPACK_IMPORTED_MODULE_0__["default"])(element)) {
17250    Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'checkValidity');
17251    Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'reportValidity');
17252    Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'setCustomValidity');
17253    Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'stepDown');
17254    Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'stepUp');
17255    Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'validationMessage');
17256    Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'validity');
17257    Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'valueAsDate');
17258    Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'valueAsNumber');
17259    Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'willValidate');
17260    Object(_polyfills_properties__WEBPACK_IMPORTED_MODULE_2__["uninstall_properties"])(element);
17261  } else if (element instanceof window.HTMLFormElement) {
17262    Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'checkValidity');
17263    Object(_property_uninstaller__WEBPACK_IMPORTED_MODULE_1__["default"])(element, 'reportValidity');
17264  }
17265});
17266
17267/***/ }),
17268
vendor: 2,606 bytes, lines 17269-17342
17269/***/ "../node_modules/hyperform/src/tools/property_installer.js":
17270/*!*****************************************************************!*\
17271  !*** ../node_modules/hyperform/src/tools/property_installer.js ***!
17272  \*****************************************************************/
17273/*! exports provided: default */
17274/***/ (function(module, __webpack_exports__, __webpack_require__) {
17275
17276"use strict";
17277__webpack_require__.r(__webpack_exports__);
17278/* harmony import */ var _components_wrapper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/wrapper */ "../node_modules/hyperform/src/components/wrapper.js");
17279
17280
17281
17282/**
17283 * add `property` to an element
17284 *
17285 * ATTENTION! This function will search for an equally named property on the
17286 * *prototype* of an element, if element is a concrete DOM node. Do not use
17287 * it as general-purpose property installer.
17288 *
17289 * js> installer(element, 'foo', { value: 'bar' });
17290 * js> assert(element.foo === 'bar');
17291 */
17292
17293/* harmony default export */ __webpack_exports__["default"] = (function (element, property, descriptor) {
17294  descriptor.configurable = true;
17295  descriptor.enumerable = true;
17296
17297  if ('value' in descriptor) {
17298    descriptor.writable = true;
17299  }
17300  /* on concrete instances, i.e., <input> elements, the naive lookup
17301   * yields undefined. We have to look on its prototype then. On elements
17302   * like the actual HTMLInputElement object the first line works. */
17303
17304
17305  var original_descriptor = Object.getOwnPropertyDescriptor(element, property);
17306
17307  if (original_descriptor === undefined) {
17308    original_descriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(element), property);
17309  }
17310
17311  if (original_descriptor) {
17312    if (original_descriptor.configurable === false) {
17313      /* Safari <= 9 and PhantomJS will end up here :-( Nothing to do except
17314       * warning */
17315      var wrapper = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_0__["get_wrapper"])(element);
17316
17317      if (wrapper && wrapper.settings.debug) {
17318        /* global console */
17319        console.log('[hyperform] cannot install custom property ' + property);
17320      }
17321
17322      return false;
17323    }
17324    /* we already installed that property... */
17325
17326
17327    if (original_descriptor.get && original_descriptor.get.__hyperform || original_descriptor.value && original_descriptor.value.__hyperform) {
17328      return;
17329    }
17330    /* publish existing property under new name, if it's not from us */
17331
17332
17333    Object.defineProperty(element, '_original_' + property, original_descriptor);
17334  }
17335
17336  delete element[property];
17337  Object.defineProperty(element, property, descriptor);
17338  return true;
17339});
17340
17341/***/ }),
17342
vendor: 1,452 bytes, lines 17343-17384
17343/***/ "../node_modules/hyperform/src/tools/property_uninstaller.js":
17344/*!*******************************************************************!*\
17345  !*** ../node_modules/hyperform/src/tools/property_uninstaller.js ***!
17346  \*******************************************************************/
17347/*! exports provided: default */
17348/***/ (function(module, __webpack_exports__, __webpack_require__) {
17349
17350"use strict";
17351__webpack_require__.r(__webpack_exports__);
17352/* harmony import */ var _components_wrapper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/wrapper */ "../node_modules/hyperform/src/components/wrapper.js");
17353
17354
17355
17356/**
17357 * remove `property` from element and restore _original_property, if present
17358 */
17359
17360/* harmony default export */ __webpack_exports__["default"] = (function (element, property) {
17361  try {
17362    delete element[property];
17363  } catch (e) {
17364    /* Safari <= 9 and PhantomJS will end up here :-( Nothing to do except
17365     * warning */
17366    var wrapper = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_0__["get_wrapper"])(element);
17367
17368    if (wrapper && wrapper.settings.debug) {
17369      /* global console */
17370      console.log('[hyperform] cannot uninstall custom property ' + property);
17371    }
17372
17373    return false;
17374  }
17375
17376  var original_descriptor = Object.getOwnPropertyDescriptor(element, '_original_' + property);
17377
17378  if (original_descriptor) {
17379    Object.defineProperty(element, property, original_descriptor);
17380  }
17381});
17382
17383/***/ }),
17384
vendor: 1,132 bytes, lines 17385-17418
17385/***/ "../node_modules/hyperform/src/tools/return_hook_or.js":
17386/*!*************************************************************!*\
17387  !*** ../node_modules/hyperform/src/tools/return_hook_or.js ***!
17388  \*************************************************************/
17389/*! exports provided: default */
17390/***/ (function(module, __webpack_exports__, __webpack_require__) {
17391
17392"use strict";
17393__webpack_require__.r(__webpack_exports__);
17394/* harmony import */ var _components_hooks_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/hooks.js */ "../node_modules/hyperform/src/components/hooks.js");
17395
17396
17397
17398/**
17399 * return either the data of a hook call or the result of action, if the
17400 * former is undefined
17401 *
17402 * @return function a function wrapper around action
17403 */
17404
17405/* harmony default export */ __webpack_exports__["default"] = (function (hook, action) {
17406  return function () {
17407    var data = Object(_components_hooks_js__WEBPACK_IMPORTED_MODULE_0__["call_hook"])(hook, Array.prototype.slice.call(arguments));
17408
17409    if (data !== undefined) {
17410      return data;
17411    }
17412
17413    return action.apply(this, arguments);
17414  };
17415});
17416
17417/***/ }),
17418
vendor: 1,390 bytes, lines 17419-17466
17419/***/ "../node_modules/hyperform/src/tools/sprintf.js":
17420/*!******************************************************!*\
17421  !*** ../node_modules/hyperform/src/tools/sprintf.js ***!
17422  \******************************************************/
17423/*! exports provided: default */
17424/***/ (function(module, __webpack_exports__, __webpack_require__) {
17425
17426"use strict";
17427__webpack_require__.r(__webpack_exports__);
17428
17429
17430/* harmony default export */ __webpack_exports__["default"] = (function (str) {
17431  for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
17432    args[_key - 1] = arguments[_key];
17433  }
17434
17435  var args_length = args.length;
17436  var global_index = 0;
17437  return str.replace(/%([0-9]+\$)?([sl])/g, function (match, position, type) {
17438    var local_index = global_index;
17439
17440    if (position) {
17441      local_index = Number(position.replace(/\$$/, '')) - 1;
17442    }
17443
17444    global_index += 1;
17445    var arg = '';
17446
17447    if (args_length > local_index) {
17448      arg = args[local_index];
17449    }
17450
17451    if (arg instanceof Date || typeof arg === 'number' || arg instanceof Number) {
17452      /* try getting a localized representation of dates and numbers, if the
17453       * browser supports this */
17454      if (type === 'l') {
17455        arg = (arg.toLocaleString || arg.toString).call(arg);
17456      } else {
17457        arg = arg.toString();
17458      }
17459    }
17460
17461    return arg;
17462  });
17463});
17464
17465/***/ }),
17466
vendor: 1,995 bytes, lines 17467-17532
17467/***/ "../node_modules/hyperform/src/tools/string_to_date.js":
17468/*!*************************************************************!*\
17469  !*** ../node_modules/hyperform/src/tools/string_to_date.js ***!
17470  \*************************************************************/
17471/*! exports provided: default */
17472/***/ (function(module, __webpack_exports__, __webpack_require__) {
17473
17474"use strict";
17475__webpack_require__.r(__webpack_exports__);
17476/* harmony import */ var _get_date_from_week__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./get_date_from_week */ "../node_modules/hyperform/src/tools/get_date_from_week.js");
17477
17478
17479
17480/**
17481 * calculate a date from a string according to HTML5
17482 */
17483
17484/* harmony default export */ __webpack_exports__["default"] = (function (string, element_type) {
17485  var date;
17486
17487  switch (element_type) {
17488    case 'datetime':
17489      if (!/^([0-9]{4})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):([0-5][0-9])(?::([0-5][0-9])(?:\.([0-9]{1,3}))?)?$/.test(string)) {
17490        return null;
17491      }
17492
17493      date = new Date(string + 'z');
17494      return isNaN(date.valueOf()) ? null : date;
17495
17496    case 'date':
17497      if (!/^([0-9]{4})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/.test(string)) {
17498        return null;
17499      }
17500
17501      date = new Date(string);
17502      return isNaN(date.valueOf()) ? null : date;
17503
17504    case 'month':
17505      if (!/^([0-9]{4})-(0[1-9]|1[012])$/.test(string)) {
17506        return null;
17507      }
17508
17509      date = new Date(string);
17510      return isNaN(date.valueOf()) ? null : date;
17511
17512    case 'week':
17513      if (!/^([0-9]{4})-W(0[1-9]|[1234][0-9]|5[0-3])$/.test(string)) {
17514        return null;
17515      }
17516
17517      return Object(_get_date_from_week__WEBPACK_IMPORTED_MODULE_0__["default"])(Number(RegExp.$2), Number(RegExp.$1));
17518
17519    case 'time':
17520      if (!/^([01][0-9]|2[0-3]):([0-5][0-9])(?::([0-5][0-9])(?:\.([0-9]{1,3}))?)?$/.test(string)) {
17521        return null;
17522      }
17523
17524      date = new Date('1970-01-01T' + string + 'z');
17525      return date;
17526  }
17527
17528  return null;
17529});
17530
17531/***/ }),
17532
vendor: 1,035 bytes, lines 17533-17563
17533/***/ "../node_modules/hyperform/src/tools/string_to_number.js":
17534/*!***************************************************************!*\
17535  !*** ../node_modules/hyperform/src/tools/string_to_number.js ***!
17536  \***************************************************************/
17537/*! exports provided: default */
17538/***/ (function(module, __webpack_exports__, __webpack_require__) {
17539
17540"use strict";
17541__webpack_require__.r(__webpack_exports__);
17542/* harmony import */ var _string_to_date__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./string_to_date */ "../node_modules/hyperform/src/tools/string_to_date.js");
17543
17544
17545
17546/**
17547 * calculate a number from a string according to HTML5
17548 */
17549
17550/* harmony default export */ __webpack_exports__["default"] = (function (string, element_type) {
17551  var rval = Object(_string_to_date__WEBPACK_IMPORTED_MODULE_0__["default"])(string, element_type);
17552
17553  if (rval !== null) {
17554    return +rval;
17555  }
17556  /* not parseFloat, because we want NaN for invalid values like "1.2xxy" */
17557
17558
17559  return Number(string);
17560});
17561
17562/***/ }),
17563
vendor: 2,813 bytes, lines 17564-17647
17564/***/ "../node_modules/hyperform/src/tools/trigger_event.js":
17565/*!************************************************************!*\
17566  !*** ../node_modules/hyperform/src/tools/trigger_event.js ***!
17567  \************************************************************/
17568/*! exports provided: create_event, default */
17569/***/ (function(module, __webpack_exports__, __webpack_require__) {
17570
17571"use strict";
17572__webpack_require__.r(__webpack_exports__);
17573/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "create_event", function() { return create_event; });
17574
17575/* the following code is borrowed from the WebComponents project, licensed
17576 * under the BSD license. Source:
17577 * <https://github.com/webcomponents/webcomponentsjs/blob/5283db1459fa2323e5bfc8b9b5cc1753ed85e3d0/src/WebComponents/dom.js#L53-L78>
17578 */
17579// defaultPrevented is broken in IE.
17580// https://connect.microsoft.com/IE/feedback/details/790389/event-defaultprevented-returns-false-after-preventdefault-was-called
17581
17582var workingDefaultPrevented = function () {
17583  var e = document.createEvent('Event');
17584  e.initEvent('foo', true, true);
17585  e.preventDefault();
17586  return e.defaultPrevented;
17587}();
17588
17589if (!workingDefaultPrevented) {
17590  var origPreventDefault = window.Event.prototype.preventDefault;
17591
17592  window.Event.prototype.preventDefault = function () {
17593    if (!this.cancelable) {
17594      return;
17595    }
17596
17597    origPreventDefault.call(this);
17598    Object.defineProperty(this, 'defaultPrevented', {
17599      get: function get() {
17600        return true;
17601      },
17602      configurable: true
17603    });
17604  };
17605}
17606/* end of borrowed code */
17607
17608
17609function create_event(name) {
17610  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
17611      _ref$bubbles = _ref.bubbles,
17612      bubbles = _ref$bubbles === void 0 ? true : _ref$bubbles,
17613      _ref$cancelable = _ref.cancelable,
17614      cancelable = _ref$cancelable === void 0 ? false : _ref$cancelable;
17615
17616  var event = document.createEvent('Event');
17617  event.initEvent(name, bubbles, cancelable);
17618  return event;
17619}
17620/* harmony default export */ __webpack_exports__["default"] = (function (element, event) {
17621  var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
17622      _ref2$bubbles = _ref2.bubbles,
17623      bubbles = _ref2$bubbles === void 0 ? true : _ref2$bubbles,
17624      _ref2$cancelable = _ref2.cancelable,
17625      cancelable = _ref2$cancelable === void 0 ? false : _ref2$cancelable;
17626
17627  var payload = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
17628
17629  if (!(event instanceof window.Event)) {
17630    event = create_event(event, {
17631      bubbles: bubbles,
17632      cancelable: cancelable
17633    });
17634  }
17635
17636  for (var key in payload) {
17637    if (payload.hasOwnProperty(key)) {
17638      event[key] = payload[key];
17639    }
17640  }
17641
17642  element.dispatchEvent(event);
17643  return event;
17644});
17645
17646/***/ }),
17647
vendor: 698 bytes, lines 17648-17671
17648/***/ "../node_modules/hyperform/src/tools/trim.js":
17649/*!***************************************************!*\
17650  !*** ../node_modules/hyperform/src/tools/trim.js ***!
17651  \***************************************************/
17652/*! exports provided: default */
17653/***/ (function(module, __webpack_exports__, __webpack_require__) {
17654
17655"use strict";
17656__webpack_require__.r(__webpack_exports__);
17657
17658
17659var ws_on_start_or_end = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
17660/**
17661 * trim a string of whitespace
17662 *
17663 * We don't use String.trim() to remove the need to polyfill it.
17664 */
17665
17666/* harmony default export */ __webpack_exports__["default"] = (function (str) {
17667  return str.replace(ws_on_start_or_end, '');
17668});
17669
17670/***/ }),
17671
vendor: 938 bytes, lines 17672-17695
17672/***/ "../node_modules/hyperform/src/tools/unicode_string_length.js":
17673/*!********************************************************************!*\
17674  !*** ../node_modules/hyperform/src/tools/unicode_string_length.js ***!
17675  \********************************************************************/
17676/*! exports provided: default */
17677/***/ (function(module, __webpack_exports__, __webpack_require__) {
17678
17679"use strict";
17680__webpack_require__.r(__webpack_exports__);
17681
17682/**
17683 * patch String.length to account for non-BMP characters
17684 *
17685 * @see https://mathiasbynens.be/notes/javascript-unicode
17686 * We do not use the simple [...str].length, because it needs a ton of
17687 * polyfills in older browsers.
17688 */
17689
17690/* harmony default export */ __webpack_exports__["default"] = (function (str) {
17691  return str.match(/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/g).length;
17692});
17693
17694/***/ }),
17695
vendor: 17,125 bytes, lines 17696-18031
17696/***/ "../node_modules/hyperform/src/tools/validity_state_checkers.js":
17697/*!**********************************************************************!*\
17698  !*** ../node_modules/hyperform/src/tools/validity_state_checkers.js ***!
17699  \**********************************************************************/
17700/*! exports provided: default */
17701/***/ (function(module, __webpack_exports__, __webpack_require__) {
17702
17703"use strict";
17704__webpack_require__.r(__webpack_exports__);
17705/* harmony import */ var _format_date__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./format_date */ "../node_modules/hyperform/src/tools/format_date.js");
17706/* harmony import */ var _get_next_valid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./get_next_valid */ "../node_modules/hyperform/src/tools/get_next_valid.js");
17707/* harmony import */ var _get_type__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./get_type */ "../node_modules/hyperform/src/tools/get_type.js");
17708/* harmony import */ var _sprintf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sprintf */ "../node_modules/hyperform/src/tools/sprintf.js");
17709/* harmony import */ var _string_to_number__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./string_to_number */ "../node_modules/hyperform/src/tools/string_to_number.js");
17710/* harmony import */ var _string_to_date__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./string_to_date */ "../node_modules/hyperform/src/tools/string_to_date.js");
17711/* harmony import */ var _unicode_string_length__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./unicode_string_length */ "../node_modules/hyperform/src/tools/unicode_string_length.js");
17712/* harmony import */ var _components_custom_messages__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/custom_messages */ "../node_modules/hyperform/src/components/custom_messages.js");
17713/* harmony import */ var _components_localization__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../components/localization */ "../node_modules/hyperform/src/components/localization.js");
17714/* harmony import */ var _components_message_store__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../components/message_store */ "../node_modules/hyperform/src/components/message_store.js");
17715/* harmony import */ var _components_registry__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../components/registry */ "../node_modules/hyperform/src/components/registry.js");
17716/* harmony import */ var _components_wrapper__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../components/wrapper */ "../node_modules/hyperform/src/components/wrapper.js");
17717/* harmony import */ var _validators_bad_input__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../validators/bad_input */ "../node_modules/hyperform/src/validators/bad_input.js");
17718/* harmony import */ var _validators_max__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../validators/max */ "../node_modules/hyperform/src/validators/max.js");
17719/* harmony import */ var _validators_maxlength__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../validators/maxlength */ "../node_modules/hyperform/src/validators/maxlength.js");
17720/* harmony import */ var _validators_min__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../validators/min */ "../node_modules/hyperform/src/validators/min.js");
17721/* harmony import */ var _validators_minlength__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../validators/minlength */ "../node_modules/hyperform/src/validators/minlength.js");
17722/* harmony import */ var _validators_pattern__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../validators/pattern */ "../node_modules/hyperform/src/validators/pattern.js");
17723/* harmony import */ var _validators_required__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../validators/required */ "../node_modules/hyperform/src/validators/required.js");
17724/* harmony import */ var _validators_step__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../validators/step */ "../node_modules/hyperform/src/validators/step.js");
17725/* harmony import */ var _validators_type__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../validators/type */ "../node_modules/hyperform/src/validators/type.js");
17726
17727/**
17728 * Implement constraint checking functionality defined in the HTML5 standard
17729 *
17730 * @see https://html.spec.whatwg.org/multipage/forms.html#dom-cva-validity
17731 * @return bool true if the test fails [!], false otherwise
17732 */
17733
17734
17735
17736
17737
17738
17739
17740
17741
17742
17743
17744
17745
17746
17747
17748
17749
17750
17751
17752
17753
17754
17755/**
17756 * boilerplate function for all tests but customError
17757 */
17758
17759function check(test, react) {
17760  return function (element) {
17761    var invalid = !test(element);
17762
17763    if (invalid) {
17764      react(element);
17765    }
17766
17767    return invalid;
17768  };
17769}
17770/**
17771 * create a common function to set error messages
17772 */
17773
17774
17775function set_msg(element, msgtype, _default) {
17776  _components_message_store__WEBPACK_IMPORTED_MODULE_9__["message_store"].set(element, _components_custom_messages__WEBPACK_IMPORTED_MODULE_7__["default"].get(element, msgtype, _default));
17777}
17778
17779var badInput = check(_validators_bad_input__WEBPACK_IMPORTED_MODULE_12__["default"], function (element) {
17780  return set_msg(element, 'badInput', Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('Please match the requested type.'));
17781});
17782
17783function customError(element) {
17784  /* prevent infinite loops when the custom validators call setCustomValidity(),
17785   * which in turn calls this code again. We check, if there is an already set
17786   * custom validity message there. */
17787  if (element.__hf_custom_validation_running) {
17788    var msg = _components_message_store__WEBPACK_IMPORTED_MODULE_9__["message_store"].get(element);
17789    return msg && msg.is_custom;
17790  }
17791  /* check, if there are custom validators in the registry, and call
17792   * them. */
17793
17794
17795  var custom_validators = _components_registry__WEBPACK_IMPORTED_MODULE_10__["default"].get(element);
17796  var cvl = custom_validators.length;
17797  var valid = true;
17798
17799  if (cvl) {
17800    element.__hf_custom_validation_running = true;
17801
17802    for (var i = 0; i < cvl; i++) {
17803      var result = custom_validators[i](element);
17804
17805      if (result !== undefined && !result) {
17806        valid = false;
17807        /* break on first invalid response */
17808
17809        break;
17810      }
17811    }
17812
17813    delete element.__hf_custom_validation_running;
17814  }
17815  /* check, if there are other validity messages already */
17816
17817
17818  if (valid) {
17819    var _msg = _components_message_store__WEBPACK_IMPORTED_MODULE_9__["message_store"].get(element);
17820
17821    valid = !(_msg.toString() && 'is_custom' in _msg);
17822  }
17823
17824  return !valid;
17825}
17826
17827var patternMismatch = check(_validators_pattern__WEBPACK_IMPORTED_MODULE_17__["default"], function (element) {
17828  set_msg(element, 'patternMismatch', element.title ? Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('PatternMismatchWithTitle'), element.title) : Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('PatternMismatch'));
17829});
17830/**
17831 * TODO: when rangeOverflow and rangeUnderflow are both called directly and
17832 * successful, the inRange and outOfRange classes won't get removed, unless
17833 * element.validityState.valid is queried, too.
17834 */
17835
17836var rangeOverflow = check(_validators_max__WEBPACK_IMPORTED_MODULE_13__["default"], function (element) {
17837  var type = Object(_get_type__WEBPACK_IMPORTED_MODULE_2__["default"])(element);
17838  var wrapper = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_11__["get_wrapper"])(element);
17839  var outOfRangeClass = wrapper && wrapper.settings.classes.outOfRange || 'hf-out-of-range';
17840  var inRangeClass = wrapper && wrapper.settings.classes.inRange || 'hf-in-range';
17841  var msg;
17842
17843  switch (type) {
17844    case 'date':
17845    case 'datetime':
17846    case 'datetime-local':
17847      msg = Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('DateRangeOverflow'), Object(_format_date__WEBPACK_IMPORTED_MODULE_0__["default"])(Object(_string_to_date__WEBPACK_IMPORTED_MODULE_5__["default"])(element.getAttribute('max'), type), type));
17848      break;
17849
17850    case 'time':
17851      msg = Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('TimeRangeOverflow'), Object(_format_date__WEBPACK_IMPORTED_MODULE_0__["default"])(Object(_string_to_date__WEBPACK_IMPORTED_MODULE_5__["default"])(element.getAttribute('max'), type), type));
17852      break;
17853    // case 'number':
17854
17855    default:
17856      msg = Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('NumberRangeOverflow'), Object(_string_to_number__WEBPACK_IMPORTED_MODULE_4__["default"])(element.getAttribute('max'), type));
17857      break;
17858  }
17859
17860  set_msg(element, 'rangeOverflow', msg);
17861  element.classList.add(outOfRangeClass);
17862  element.classList.remove(inRangeClass);
17863});
17864var rangeUnderflow = check(_validators_min__WEBPACK_IMPORTED_MODULE_15__["default"], function (element) {
17865  var type = Object(_get_type__WEBPACK_IMPORTED_MODULE_2__["default"])(element);
17866  var wrapper = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_11__["get_wrapper"])(element);
17867  var outOfRangeClass = wrapper && wrapper.settings.classes.outOfRange || 'hf-out-of-range';
17868  var inRangeClass = wrapper && wrapper.settings.classes.inRange || 'hf-in-range';
17869  var msg;
17870
17871  switch (type) {
17872    case 'date':
17873    case 'datetime':
17874    case 'datetime-local':
17875      msg = Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('DateRangeUnderflow'), Object(_format_date__WEBPACK_IMPORTED_MODULE_0__["default"])(Object(_string_to_date__WEBPACK_IMPORTED_MODULE_5__["default"])(element.getAttribute('min'), type), type));
17876      break;
17877
17878    case 'time':
17879      msg = Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('TimeRangeUnderflow'), Object(_format_date__WEBPACK_IMPORTED_MODULE_0__["default"])(Object(_string_to_date__WEBPACK_IMPORTED_MODULE_5__["default"])(element.getAttribute('min'), type), type));
17880      break;
17881    // case 'number':
17882
17883    default:
17884      msg = Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('NumberRangeUnderflow'), Object(_string_to_number__WEBPACK_IMPORTED_MODULE_4__["default"])(element.getAttribute('min'), type));
17885      break;
17886  }
17887
17888  set_msg(element, 'rangeUnderflow', msg);
17889  element.classList.add(outOfRangeClass);
17890  element.classList.remove(inRangeClass);
17891});
17892var stepMismatch = check(_validators_step__WEBPACK_IMPORTED_MODULE_19__["default"], function (element) {
17893  var list = Object(_get_next_valid__WEBPACK_IMPORTED_MODULE_1__["default"])(element);
17894  var min = list[0];
17895  var max = list[1];
17896  var sole = false;
17897  var msg;
17898
17899  if (min === null) {
17900    sole = max;
17901  } else if (max === null) {
17902    sole = min;
17903  }
17904
17905  if (sole !== false) {
17906    msg = Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('StepMismatchOneValue'), sole);
17907  } else {
17908    msg = Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('StepMismatch'), min, max);
17909  }
17910
17911  set_msg(element, 'stepMismatch', msg);
17912});
17913var tooLong = check(_validators_maxlength__WEBPACK_IMPORTED_MODULE_14__["default"], function (element) {
17914  set_msg(element, 'tooLong', Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('TextTooLong'), element.getAttribute('maxlength'), Object(_unicode_string_length__WEBPACK_IMPORTED_MODULE_6__["default"])(element.value)));
17915});
17916var tooShort = check(_validators_minlength__WEBPACK_IMPORTED_MODULE_16__["default"], function (element) {
17917  set_msg(element, 'tooShort', Object(_sprintf__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('Please lengthen this text to %l characters or more (you are currently using %l characters).'), element.getAttribute('minlength'), Object(_unicode_string_length__WEBPACK_IMPORTED_MODULE_6__["default"])(element.value)));
17918});
17919var typeMismatch = check(_validators_type__WEBPACK_IMPORTED_MODULE_20__["default"], function (element) {
17920  var msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('Please use the appropriate format.');
17921
17922  var type = Object(_get_type__WEBPACK_IMPORTED_MODULE_2__["default"])(element);
17923
17924  if (type === 'email') {
17925    if (element.hasAttribute('multiple')) {
17926      msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('Please enter a comma separated list of email addresses.');
17927    } else {
17928      msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('InvalidEmail');
17929    }
17930  } else if (type === 'url') {
17931    msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('InvalidURL');
17932  } else if (type === 'file') {
17933    msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('Please select a file of the correct type.');
17934  }
17935
17936  set_msg(element, 'typeMismatch', msg);
17937});
17938var valueMissing = check(_validators_required__WEBPACK_IMPORTED_MODULE_18__["default"], function (element) {
17939  var msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('ValueMissing');
17940
17941  var type = Object(_get_type__WEBPACK_IMPORTED_MODULE_2__["default"])(element);
17942
17943  if (type === 'checkbox') {
17944    msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('CheckboxMissing');
17945  } else if (type === 'radio') {
17946    msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('RadioMissing');
17947  } else if (type === 'file') {
17948    if (element.hasAttribute('multiple')) {
17949      msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('Please select one or more files.');
17950    } else {
17951      msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('FileMissing');
17952    }
17953  } else if (element instanceof window.HTMLSelectElement) {
17954    msg = Object(_components_localization__WEBPACK_IMPORTED_MODULE_8__["default"])('SelectMissing');
17955  }
17956
17957  set_msg(element, 'valueMissing', msg);
17958});
17959/**
17960 * the "valid" property calls all other validity checkers and returns true,
17961 * if all those return false.
17962 *
17963 * This is the major access point for _all_ other API methods, namely
17964 * (check|report)Validity().
17965 */
17966
17967var valid = function valid(element) {
17968  var wrapper = Object(_components_wrapper__WEBPACK_IMPORTED_MODULE_11__["get_wrapper"])(element);
17969  var validClass = wrapper && wrapper.settings.classes.valid || 'hf-valid';
17970  var invalidClass = wrapper && wrapper.settings.classes.invalid || 'hf-invalid';
17971  var userInvalidClass = wrapper && wrapper.settings.classes.userInvalid || 'hf-user-invalid';
17972  var userValidClass = wrapper && wrapper.settings.classes.userValid || 'hf-user-valid';
17973  var inRangeClass = wrapper && wrapper.settings.classes.inRange || 'hf-in-range';
17974  var outOfRangeClass = wrapper && wrapper.settings.classes.outOfRange || 'hf-out-of-range';
17975  var validatedClass = wrapper && wrapper.settings.classes.validated || 'hf-validated';
17976  element.classList.add(validatedClass);
17977
17978  for (var _i = 0, _arr = [badInput, customError, patternMismatch, rangeOverflow, rangeUnderflow, stepMismatch, tooLong, tooShort, typeMismatch, valueMissing]; _i < _arr.length; _i++) {
17979    var checker = _arr[_i];
17980
17981    if (checker(element)) {
17982      element.classList.add(invalidClass);
17983      element.classList.remove(validClass);
17984      element.classList.remove(userValidClass);
17985
17986      if ((element.type === 'checkbox' || element.type === 'radio') && element.checked !== element.defaultChecked ||
17987      /* the following test is trivially false for checkboxes/radios */
17988      element.value !== element.defaultValue) {
17989        element.classList.add(userInvalidClass);
17990      } else {
17991        element.classList.remove(userInvalidClass);
17992      }
17993
17994      element.setAttribute('aria-invalid', 'true');
17995      return false;
17996    }
17997  }
17998
17999  _components_message_store__WEBPACK_IMPORTED_MODULE_9__["message_store"].delete(element);
18000  element.classList.remove(invalidClass);
18001  element.classList.remove(userInvalidClass);
18002  element.classList.remove(outOfRangeClass);
18003  element.classList.add(validClass);
18004  element.classList.add(inRangeClass);
18005
18006  if (element.value !== element.defaultValue) {
18007    element.classList.add(userValidClass);
18008  } else {
18009    element.classList.remove(userValidClass);
18010  }
18011
18012  element.setAttribute('aria-invalid', 'false');
18013  return true;
18014};
18015
18016/* harmony default export */ __webpack_exports__["default"] = ({
18017  badInput: badInput,
18018  customError: customError,
18019  patternMismatch: patternMismatch,
18020  rangeOverflow: rangeOverflow,
18021  rangeUnderflow: rangeUnderflow,
18022  stepMismatch: stepMismatch,
18023  tooLong: tooLong,
18024  tooShort: tooShort,
18025  typeMismatch: typeMismatch,
18026  valueMissing: valueMissing,
18027  valid: valid
18028});
18029
18030/***/ }),
18031
vendor: 2,869 bytes, lines 18032-18115
18032/***/ "../node_modules/hyperform/src/validators/bad_input.js":
18033/*!*************************************************************!*\
18034  !*** ../node_modules/hyperform/src/validators/bad_input.js ***!
18035  \*************************************************************/
18036/*! exports provided: default */
18037/***/ (function(module, __webpack_exports__, __webpack_require__) {
18038
18039"use strict";
18040__webpack_require__.r(__webpack_exports__);
18041/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js");
18042/* harmony import */ var _tools_string_to_date__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/string_to_date */ "../node_modules/hyperform/src/tools/string_to_date.js");
18043/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js");
18044
18045
18046
18047
18048
18049/**
18050 * test whether the element suffers from bad input
18051 */
18052
18053/* harmony default export */ __webpack_exports__["default"] = (function (element) {
18054  var type = Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_0__["default"])(element);
18055
18056  if (_components_types__WEBPACK_IMPORTED_MODULE_2__["input_checked"].indexOf(type) === -1) {
18057    /* we're not interested, thanks! */
18058    return true;
18059  }
18060  /* the browser hides some bad input from the DOM, e.g. malformed numbers,
18061   * email addresses with invalid punycode representation, ... We try to resort
18062   * to the original method here. The assumption is, that a browser hiding
18063   * bad input will hopefully also always support a proper
18064   * ValidityState.badInput */
18065
18066
18067  if (!element.value) {
18068    if ('_original_validity' in element && !element._original_validity.__hyperform) {
18069      return !element._original_validity.badInput;
18070    }
18071    /* no value and no original badInput: Assume all's right. */
18072
18073
18074    return true;
18075  }
18076
18077  var result = true;
18078
18079  switch (type) {
18080    case 'color':
18081      result = /^#[a-f0-9]{6}$/.test(element.value);
18082      break;
18083
18084    case 'number':
18085    case 'range':
18086      result = !isNaN(Number(element.value));
18087      break;
18088
18089    case 'datetime':
18090    case 'date':
18091    case 'month':
18092    case 'week':
18093    case 'time':
18094      result = Object(_tools_string_to_date__WEBPACK_IMPORTED_MODULE_1__["default"])(element.value, type) !== null;
18095      break;
18096
18097    case 'datetime-local':
18098      result = /^([0-9]{4,})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):([0-5][0-9])(?::([0-5][0-9])(?:\.([0-9]{1,3}))?)?$/.test(element.value);
18099      break;
18100
18101    case 'tel':
18102      /* spec says No! Phone numbers can have all kinds of formats, so this
18103       * is expected to be a free-text field. */
18104      // TODO we could allow a setting 'phone_regex' to be evaluated here.
18105      break;
18106
18107    case 'email':
18108      break;
18109  }
18110
18111  return result;
18112});
18113
18114/***/ }),
18115
vendor: 2,035 bytes, lines 18116-18166
18116/***/ "../node_modules/hyperform/src/validators/max.js":
18117/*!*******************************************************!*\
18118  !*** ../node_modules/hyperform/src/validators/max.js ***!
18119  \*******************************************************/
18120/*! exports provided: default */
18121/***/ (function(module, __webpack_exports__, __webpack_require__) {
18122
18123"use strict";
18124__webpack_require__.r(__webpack_exports__);
18125/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js");
18126/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js");
18127/* harmony import */ var _tools_string_to_date__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tools/string_to_date */ "../node_modules/hyperform/src/tools/string_to_date.js");
18128
18129
18130
18131
18132
18133/**
18134 * test the max attribute
18135 *
18136 * we use Number() instead of parseFloat(), because an invalid attribute
18137 * value like "123abc" should result in an error.
18138 */
18139
18140/* harmony default export */ __webpack_exports__["default"] = (function (element) {
18141  var type = Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_0__["default"])(element);
18142
18143  if (!element.value || !element.hasAttribute('max')) {
18144    /* we're not responsible here */
18145    return true;
18146  }
18147
18148  var value, max;
18149
18150  if (_components_types__WEBPACK_IMPORTED_MODULE_1__["dates"].indexOf(type) > -1) {
18151    value = Object(_tools_string_to_date__WEBPACK_IMPORTED_MODULE_2__["default"])(element.value, type);
18152    value = value === null ? NaN : +value;
18153    max = Object(_tools_string_to_date__WEBPACK_IMPORTED_MODULE_2__["default"])(element.getAttribute('max'), type);
18154    max = max === null ? NaN : +max;
18155  } else {
18156    value = Number(element.value);
18157    max = Number(element.getAttribute('max'));
18158  }
18159  /* we cannot validate invalid values and trust on badInput, if isNaN(value) */
18160
18161
18162  return isNaN(max) || isNaN(value) || value <= max;
18163});
18164
18165/***/ }),
18166
vendor: 1,804 bytes, lines 18167-18207
18167/***/ "../node_modules/hyperform/src/validators/maxlength.js":
18168/*!*************************************************************!*\
18169  !*** ../node_modules/hyperform/src/validators/maxlength.js ***!
18170  \*************************************************************/
18171/*! exports provided: default */
18172/***/ (function(module, __webpack_exports__, __webpack_require__) {
18173
18174"use strict";
18175__webpack_require__.r(__webpack_exports__);
18176/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js");
18177/* harmony import */ var _tools_unicode_string_length__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/unicode_string_length */ "../node_modules/hyperform/src/tools/unicode_string_length.js");
18178/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js");
18179
18180
18181
18182
18183
18184/**
18185 * test the maxlength attribute
18186 */
18187
18188/* harmony default export */ __webpack_exports__["default"] = (function (element) {
18189  if (!element.value || _components_types__WEBPACK_IMPORTED_MODULE_2__["text"].indexOf(Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_0__["default"])(element)) === -1 || !element.hasAttribute('maxlength') || !element.getAttribute('maxlength') // catch maxlength=""
18190  ) {
18191      return true;
18192    }
18193
18194  var maxlength = parseInt(element.getAttribute('maxlength'), 10);
18195  /* check, if the maxlength value is usable at all.
18196   * We allow maxlength === 0 to basically disable input (Firefox does, too).
18197   */
18198
18199  if (isNaN(maxlength) || maxlength < 0) {
18200    return true;
18201  }
18202
18203  return Object(_tools_unicode_string_length__WEBPACK_IMPORTED_MODULE_1__["default"])(element.value) <= maxlength;
18204});
18205
18206/***/ }),
18207
vendor: 2,035 bytes, lines 18208-18258
18208/***/ "../node_modules/hyperform/src/validators/min.js":
18209/*!*******************************************************!*\
18210  !*** ../node_modules/hyperform/src/validators/min.js ***!
18211  \*******************************************************/
18212/*! exports provided: default */
18213/***/ (function(module, __webpack_exports__, __webpack_require__) {
18214
18215"use strict";
18216__webpack_require__.r(__webpack_exports__);
18217/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js");
18218/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js");
18219/* harmony import */ var _tools_string_to_date__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tools/string_to_date */ "../node_modules/hyperform/src/tools/string_to_date.js");
18220
18221
18222
18223
18224
18225/**
18226 * test the min attribute
18227 *
18228 * we use Number() instead of parseFloat(), because an invalid attribute
18229 * value like "123abc" should result in an error.
18230 */
18231
18232/* harmony default export */ __webpack_exports__["default"] = (function (element) {
18233  var type = Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_0__["default"])(element);
18234
18235  if (!element.value || !element.hasAttribute('min')) {
18236    /* we're not responsible here */
18237    return true;
18238  }
18239
18240  var value, min;
18241
18242  if (_components_types__WEBPACK_IMPORTED_MODULE_1__["dates"].indexOf(type) > -1) {
18243    value = Object(_tools_string_to_date__WEBPACK_IMPORTED_MODULE_2__["default"])(element.value, type);
18244    value = value === null ? NaN : +value;
18245    min = Object(_tools_string_to_date__WEBPACK_IMPORTED_MODULE_2__["default"])(element.getAttribute('min'), type);
18246    min = min === null ? NaN : +min;
18247  } else {
18248    value = Number(element.value);
18249    min = Number(element.getAttribute('min'));
18250  }
18251  /* we cannot validate invalid values and trust on badInput, if isNaN(value) */
18252
18253
18254  return isNaN(min) || isNaN(value) || value >= min;
18255});
18256
18257/***/ }),
18258
vendor: 1,723 bytes, lines 18259-18297
18259/***/ "../node_modules/hyperform/src/validators/minlength.js":
18260/*!*************************************************************!*\
18261  !*** ../node_modules/hyperform/src/validators/minlength.js ***!
18262  \*************************************************************/
18263/*! exports provided: default */
18264/***/ (function(module, __webpack_exports__, __webpack_require__) {
18265
18266"use strict";
18267__webpack_require__.r(__webpack_exports__);
18268/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js");
18269/* harmony import */ var _tools_unicode_string_length__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/unicode_string_length */ "../node_modules/hyperform/src/tools/unicode_string_length.js");
18270/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js");
18271
18272
18273
18274
18275
18276/**
18277 * test the minlength attribute
18278 */
18279
18280/* harmony default export */ __webpack_exports__["default"] = (function (element) {
18281  if (!element.value || _components_types__WEBPACK_IMPORTED_MODULE_2__["text"].indexOf(Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_0__["default"])(element)) === -1 || !element.hasAttribute('minlength') || !element.getAttribute('minlength') // catch minlength=""
18282  ) {
18283      return true;
18284    }
18285
18286  var minlength = parseInt(element.getAttribute('minlength'), 10);
18287  /* check, if the minlength value is usable at all. */
18288
18289  if (isNaN(minlength) || minlength < 0) {
18290    return true;
18291  }
18292
18293  return Object(_tools_unicode_string_length__WEBPACK_IMPORTED_MODULE_1__["default"])(element.value) >= minlength;
18294});
18295
18296/***/ }),
18297
vendor: 699 bytes, lines 18298-18317
18298/***/ "../node_modules/hyperform/src/validators/pattern.js":
18299/*!***********************************************************!*\
18300  !*** ../node_modules/hyperform/src/validators/pattern.js ***!
18301  \***********************************************************/
18302/*! exports provided: default */
18303/***/ (function(module, __webpack_exports__, __webpack_require__) {
18304
18305"use strict";
18306__webpack_require__.r(__webpack_exports__);
18307
18308/**
18309 * test the pattern attribute
18310 */
18311
18312/* harmony default export */ __webpack_exports__["default"] = (function (element) {
18313  return !element.value || !element.hasAttribute('pattern') || new RegExp('^(?:' + element.getAttribute('pattern') + ')$').test(element.value);
18314});
18315
18316/***/ }),
18317
vendor: 2,671 bytes, lines 18318-18396
18318/***/ "../node_modules/hyperform/src/validators/required.js":
18319/*!************************************************************!*\
18320  !*** ../node_modules/hyperform/src/validators/required.js ***!
18321  \************************************************************/
18322/*! exports provided: default */
18323/***/ (function(module, __webpack_exports__, __webpack_require__) {
18324
18325"use strict";
18326__webpack_require__.r(__webpack_exports__);
18327/* harmony import */ var _tools_get_radiogroup__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_radiogroup */ "../node_modules/hyperform/src/tools/get_radiogroup.js");
18328
18329
18330
18331
18332function has_submittable_option(select) {
18333  /* Definition of the placeholder label option:
18334   * https://www.w3.org/TR/html5/sec-forms.html#element-attrdef-select-required
18335   * Being required (the first constraint in the spec) is trivially true, since
18336   * this function is only called for such selects.
18337   */
18338  var has_placeholder_option = !select.multiple && select.size <= 1 && select.options.length > 0 && select.options[0].parentNode == select && select.options[0].value === '';
18339  return (
18340    /* anything selected at all? That's redundant with the .some() call below,
18341     * but more performant in the most probable error case. */
18342    select.selectedIndex > -1 && Array.prototype.some.call(select.options, function (option) {
18343      return (
18344        /* it isn't the placeholder option */
18345        (!has_placeholder_option || option.index !== 0) &&
18346        /* it isn't disabled */
18347        !option.disabled &&
18348        /* and it is, in fact, selected */
18349        option.selected
18350      );
18351    })
18352  );
18353}
18354/**
18355 * test the required attribute
18356 */
18357
18358
18359/* harmony default export */ __webpack_exports__["default"] = (function (element) {
18360  if (element.type === 'radio') {
18361    /* the happy (and quick) path for radios: */
18362    if (element.hasAttribute('required') && element.checked) {
18363      return true;
18364    }
18365
18366    var radiogroup = Object(_tools_get_radiogroup__WEBPACK_IMPORTED_MODULE_0__["get_radiogroup"])(element);
18367    /* if any radio in the group is required, we need any (not necessarily the
18368     * same) radio to be checked */
18369
18370    if (radiogroup.some(function (radio) {
18371      return radio.hasAttribute('required');
18372    })) {
18373      return radiogroup.some(function (radio) {
18374        return radio.checked;
18375      });
18376    }
18377    /* not required, validation passes */
18378
18379
18380    return true;
18381  }
18382
18383  if (!element.hasAttribute('required')) {
18384    /* nothing to do */
18385    return true;
18386  }
18387
18388  if (element instanceof window.HTMLSelectElement) {
18389    return has_submittable_option(element);
18390  }
18391
18392  return element.type === 'checkbox' ? element.checked : !!element.value;
18393});
18394
18395/***/ }),
18396
vendor: 3,263 bytes, lines 18397-18472
18397/***/ "../node_modules/hyperform/src/validators/step.js":
18398/*!********************************************************!*\
18399  !*** ../node_modules/hyperform/src/validators/step.js ***!
18400  \********************************************************/
18401/*! exports provided: default */
18402/***/ (function(module, __webpack_exports__, __webpack_require__) {
18403
18404"use strict";
18405__webpack_require__.r(__webpack_exports__);
18406/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js");
18407/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js");
18408/* harmony import */ var _components_step_defaults__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/step_defaults */ "../node_modules/hyperform/src/components/step_defaults.js");
18409/* harmony import */ var _tools_string_to_number__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tools/string_to_number */ "../node_modules/hyperform/src/tools/string_to_number.js");
18410
18411
18412
18413
18414
18415
18416/**
18417 * test the step attribute
18418 */
18419
18420/* harmony default export */ __webpack_exports__["default"] = (function (element) {
18421  var type = Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_0__["default"])(element);
18422
18423  if (!element.value || _components_types__WEBPACK_IMPORTED_MODULE_1__["numbers"].indexOf(type) === -1 || (element.getAttribute('step') || '').toLowerCase() === 'any') {
18424    /* we're not responsible here. Note: If no step attribute is given, we
18425     * need to validate against the default step as per spec. */
18426    return true;
18427  }
18428
18429  var step = element.getAttribute('step');
18430
18431  if (step) {
18432    step = Object(_tools_string_to_number__WEBPACK_IMPORTED_MODULE_3__["default"])(step, type);
18433  } else {
18434    step = _components_step_defaults__WEBPACK_IMPORTED_MODULE_2__["default_step"][type] || 1;
18435  }
18436
18437  if (step <= 0 || isNaN(step)) {
18438    /* error in specified "step". We cannot validate against it, so the value
18439     * is true. */
18440    return true;
18441  }
18442
18443  var scale = _components_step_defaults__WEBPACK_IMPORTED_MODULE_2__["step_scale_factor"][type] || 1;
18444  var value = Object(_tools_string_to_number__WEBPACK_IMPORTED_MODULE_3__["default"])(element.value, type);
18445  var min = Object(_tools_string_to_number__WEBPACK_IMPORTED_MODULE_3__["default"])(element.getAttribute('min') || element.getAttribute('value') || '', type);
18446
18447  if (isNaN(value)) {
18448    /* we cannot compare an invalid value and trust that the badInput validator
18449     * takes over from here */
18450    return true;
18451  }
18452
18453  if (isNaN(min)) {
18454    min = _components_step_defaults__WEBPACK_IMPORTED_MODULE_2__["default_step_base"][type] || 0;
18455  }
18456
18457  if (type === 'month') {
18458    /* type=month has month-wide steps. See
18459     * https://html.spec.whatwg.org/multipage/forms.html#month-state-%28type=month%29
18460     */
18461    min = new Date(min).getUTCFullYear() * 12 + new Date(min).getUTCMonth();
18462    value = new Date(value).getUTCFullYear() * 12 + new Date(value).getUTCMonth();
18463  }
18464
18465  var result = Math.abs(min - value) % (step * scale);
18466  return result < 0.00000001 ||
18467  /* crappy floating-point arithmetics! */
18468  result > step * scale - 0.00000001;
18469});
18470
18471/***/ }),
18472
vendor: 4,249 bytes, lines 18473-18589
18473/***/ "../node_modules/hyperform/src/validators/type.js":
18474/*!********************************************************!*\
18475  !*** ../node_modules/hyperform/src/validators/type.js ***!
18476  \********************************************************/
18477/*! exports provided: default */
18478/***/ (function(module, __webpack_exports__, __webpack_require__) {
18479
18480"use strict";
18481__webpack_require__.r(__webpack_exports__);
18482/* harmony import */ var _tools_comma_split__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/comma_split */ "../node_modules/hyperform/src/tools/comma_split.js");
18483/* harmony import */ var _tools_get_type__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/get_type */ "../node_modules/hyperform/src/tools/get_type.js");
18484/* harmony import */ var _tools_trim__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tools/trim */ "../node_modules/hyperform/src/tools/trim.js");
18485/* harmony import */ var _components_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/types */ "../node_modules/hyperform/src/components/types.js");
18486
18487
18488
18489
18490
18491
18492/* we use a dummy <a> where we set the href to test URL validity
18493 * The definition is out of the "global" scope so that JSDOM can be instantiated
18494 * after loading Hyperform for tests.
18495 */
18496
18497var url_canary;
18498/* see https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address */
18499
18500var email_pattern = /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
18501/**
18502 * test the type-inherent syntax
18503 */
18504
18505/* harmony default export */ __webpack_exports__["default"] = (function (element) {
18506  var type = Object(_tools_get_type__WEBPACK_IMPORTED_MODULE_1__["default"])(element);
18507
18508  if (type !== 'file' && !element.value || type !== 'file' && _components_types__WEBPACK_IMPORTED_MODULE_3__["type_checked"].indexOf(type) === -1) {
18509    /* we're not responsible for this element */
18510    return true;
18511  }
18512
18513  var is_valid = true;
18514
18515  switch (type) {
18516    case 'url':
18517      if (!url_canary) {
18518        url_canary = document.createElement('a');
18519      }
18520
18521      var value = Object(_tools_trim__WEBPACK_IMPORTED_MODULE_2__["default"])(element.value);
18522      url_canary.href = value;
18523      is_valid = url_canary.href === value || url_canary.href === value + '/';
18524      break;
18525
18526    case 'email':
18527      if (element.hasAttribute('multiple')) {
18528        is_valid = Object(_tools_comma_split__WEBPACK_IMPORTED_MODULE_0__["default"])(element.value).every(function (value) {
18529          return email_pattern.test(value);
18530        });
18531      } else {
18532        is_valid = email_pattern.test(Object(_tools_trim__WEBPACK_IMPORTED_MODULE_2__["default"])(element.value));
18533      }
18534
18535      break;
18536
18537    case 'file':
18538      if ('files' in element && element.files.length && element.hasAttribute('accept')) {
18539        var patterns = Object(_tools_comma_split__WEBPACK_IMPORTED_MODULE_0__["default"])(element.getAttribute('accept')).map(function (pattern) {
18540          if (/^(audio|video|image)\/\*$/.test(pattern)) {
18541            pattern = new RegExp('^' + RegExp.$1 + '/.+$');
18542          }
18543
18544          return pattern;
18545        });
18546
18547        if (!patterns.length) {
18548          break;
18549        }
18550
18551        fileloop: for (var i = 0; i < element.files.length; i++) {
18552          /* we need to match a whitelist, so pre-set with false */
18553          var file_valid = false;
18554
18555          patternloop: for (var j = 0; j < patterns.length; j++) {
18556            var file = element.files[i];
18557            var pattern = patterns[j];
18558            var fileprop = file.type;
18559
18560            if (typeof pattern === 'string' && pattern.substr(0, 1) === '.') {
18561              if (file.name.search('.') === -1) {
18562                /* no match with any file ending */
18563                continue patternloop;
18564              }
18565
18566              fileprop = file.name.substr(file.name.lastIndexOf('.'));
18567            }
18568
18569            if (fileprop.search(pattern) === 0) {
18570              /* we found one match and can quit looking */
18571              file_valid = true;
18572              break patternloop;
18573            }
18574          }
18575
18576          if (!file_valid) {
18577            is_valid = false;
18578            break fileloop;
18579          }
18580        }
18581      }
18582
18583  }
18584
18585  return is_valid;
18586});
18587
18588/***/ }),
18589
vendor: 459 bytes, lines 18590-18604
18590/***/ "../node_modules/hyperform/src/version.js":
18591/*!************************************************!*\
18592  !*** ../node_modules/hyperform/src/version.js ***!
18593  \************************************************/
18594/*! exports provided: default */
18595/***/ (function(module, __webpack_exports__, __webpack_require__) {
18596
18597"use strict";
18598__webpack_require__.r(__webpack_exports__);
18599
18600
18601/* harmony default export */ __webpack_exports__["default"] = ('0.9.23');
18602
18603/***/ }),
18604
vendor: 12,269 bytes, lines 18605-19002
18605/***/ "../node_modules/inputmask/dist/inputmask/dependencyLibs/inputmask.dependencyLib.js":
18606/*!******************************************************************************************!*\
18607  !*** ../node_modules/inputmask/dist/inputmask/dependencyLibs/inputmask.dependencyLib.js ***!
18608  \******************************************************************************************/
18609/*! no static exports found */
18610/***/ (function(module, exports, __webpack_require__) {
18611
18612var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
18613
18614/*!
18615* dependencyLibs/inputmask.dependencyLib.js
18616* https://github.com/RobinHerbots/Inputmask
18617* Copyright (c) 2010 - 2019 Robin Herbots
18618* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
18619* Version: 4.0.6
18620*/
18621(function (factory) {
18622  if (true) {
18623    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ../global/window */ "../node_modules/inputmask/dist/inputmask/global/window.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
18624				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
18625				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
18626				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
18627  } else {}
18628})(function (window) {
18629  var document = window.document;
18630
18631  function indexOf(list, elem) {
18632    var i = 0,
18633        len = list.length;
18634
18635    for (; i < len; i++) {
18636      if (list[i] === elem) {
18637        return i;
18638      }
18639    }
18640
18641    return -1;
18642  }
18643
18644  function isWindow(obj) {
18645    return obj != null && obj === obj.window;
18646  }
18647
18648  function isArraylike(obj) {
18649    var length = "length" in obj && obj.length,
18650        ltype = _typeof(obj);
18651
18652    if (ltype === "function" || isWindow(obj)) {
18653      return false;
18654    }
18655
18656    if (obj.nodeType === 1 && length) {
18657      return true;
18658    }
18659
18660    return ltype === "array" || length === 0 || typeof length === "number" && length > 0 && length - 1 in obj;
18661  }
18662
18663  function isValidElement(elem) {
18664    return elem instanceof Element;
18665  }
18666
18667  function DependencyLib(elem) {
18668    if (elem instanceof DependencyLib) {
18669      return elem;
18670    }
18671
18672    if (!(this instanceof DependencyLib)) {
18673      return new DependencyLib(elem);
18674    }
18675
18676    if (elem !== undefined && elem !== null && elem !== window) {
18677      this[0] = elem.nodeName ? elem : elem[0] !== undefined && elem[0].nodeName ? elem[0] : document.querySelector(elem);
18678
18679      if (this[0] !== undefined && this[0] !== null) {
18680        this[0].eventRegistry = this[0].eventRegistry || {};
18681      }
18682    }
18683  }
18684
18685  function getWindow(elem) {
18686    return isWindow(elem) ? elem : elem.nodeType === 9 ? elem.defaultView || elem.parentWindow : false;
18687  }
18688
18689  DependencyLib.prototype = {
18690    on: function on(events, handler) {
18691      if (isValidElement(this[0])) {
18692        var addEvent = function addEvent(ev, namespace) {
18693          if (elem.addEventListener) {
18694            elem.addEventListener(ev, handler, false);
18695          } else if (elem.attachEvent) {
18696            elem.attachEvent("on" + ev, handler);
18697          }
18698
18699          eventRegistry[ev] = eventRegistry[ev] || {};
18700          eventRegistry[ev][namespace] = eventRegistry[ev][namespace] || [];
18701          eventRegistry[ev][namespace].push(handler);
18702        };
18703
18704        var eventRegistry = this[0].eventRegistry,
18705            elem = this[0];
18706
18707        var _events = events.split(" ");
18708
18709        for (var endx = 0; endx < _events.length; endx++) {
18710          var nsEvent = _events[endx].split("."),
18711              ev = nsEvent[0],
18712              namespace = nsEvent[1] || "global";
18713
18714          addEvent(ev, namespace);
18715        }
18716      }
18717
18718      return this;
18719    },
18720    off: function off(events, handler) {
18721      if (isValidElement(this[0])) {
18722        var removeEvent = function removeEvent(ev, namespace, handler) {
18723          if (ev in eventRegistry === true) {
18724            if (elem.removeEventListener) {
18725              elem.removeEventListener(ev, handler, false);
18726            } else if (elem.detachEvent) {
18727              elem.detachEvent("on" + ev, handler);
18728            }
18729
18730            if (namespace === "global") {
18731              for (var nmsp in eventRegistry[ev]) {
18732                eventRegistry[ev][nmsp].splice(eventRegistry[ev][nmsp].indexOf(handler), 1);
18733              }
18734            } else {
18735              eventRegistry[ev][namespace].splice(eventRegistry[ev][namespace].indexOf(handler), 1);
18736            }
18737          }
18738        };
18739
18740        var resolveNamespace = function resolveNamespace(ev, namespace) {
18741          var evts = [],
18742              hndx,
18743              hndL;
18744
18745          if (ev.length > 0) {
18746            if (handler === undefined) {
18747              for (hndx = 0, hndL = eventRegistry[ev][namespace].length; hndx < hndL; hndx++) {
18748                evts.push({
18749                  ev: ev,
18750                  namespace: namespace && namespace.length > 0 ? namespace : "global",
18751                  handler: eventRegistry[ev][namespace][hndx]
18752                });
18753              }
18754            } else {
18755              evts.push({
18756                ev: ev,
18757                namespace: namespace && namespace.length > 0 ? namespace : "global",
18758                handler: handler
18759              });
18760            }
18761          } else if (namespace.length > 0) {
18762            for (var evNdx in eventRegistry) {
18763              for (var nmsp in eventRegistry[evNdx]) {
18764                if (nmsp === namespace) {
18765                  if (handler === undefined) {
18766                    for (hndx = 0, hndL = eventRegistry[evNdx][nmsp].length; hndx < hndL; hndx++) {
18767                      evts.push({
18768                        ev: evNdx,
18769                        namespace: nmsp,
18770                        handler: eventRegistry[evNdx][nmsp][hndx]
18771                      });
18772                    }
18773                  } else {
18774                    evts.push({
18775                      ev: evNdx,
18776                      namespace: nmsp,
18777                      handler: handler
18778                    });
18779                  }
18780                }
18781              }
18782            }
18783          }
18784
18785          return evts;
18786        };
18787
18788        var eventRegistry = this[0].eventRegistry,
18789            elem = this[0];
18790
18791        var _events = events.split(" ");
18792
18793        for (var endx = 0; endx < _events.length; endx++) {
18794          var nsEvent = _events[endx].split("."),
18795              offEvents = resolveNamespace(nsEvent[0], nsEvent[1]);
18796
18797          for (var i = 0, offEventsL = offEvents.length; i < offEventsL; i++) {
18798            removeEvent(offEvents[i].ev, offEvents[i].namespace, offEvents[i].handler);
18799          }
18800        }
18801      }
18802
18803      return this;
18804    },
18805    trigger: function trigger(events) {
18806      if (isValidElement(this[0])) {
18807        var eventRegistry = this[0].eventRegistry,
18808            elem = this[0];
18809
18810        var _events = typeof events === "string" ? events.split(" ") : [events.type];
18811
18812        for (var endx = 0; endx < _events.length; endx++) {
18813          var nsEvent = _events[endx].split("."),
18814              ev = nsEvent[0],
18815              namespace = nsEvent[1] || "global";
18816
18817          if (document !== undefined && namespace === "global") {
18818            var evnt,
18819                i,
18820                params = {
18821              bubbles: true,
18822              cancelable: true,
18823              detail: arguments[1]
18824            };
18825
18826            if (document.createEvent) {
18827              try {
18828                evnt = new CustomEvent(ev, params);
18829              } catch (e) {
18830                evnt = document.createEvent("CustomEvent");
18831                evnt.initCustomEvent(ev, params.bubbles, params.cancelable, params.detail);
18832              }
18833
18834              if (events.type) DependencyLib.extend(evnt, events);
18835              elem.dispatchEvent(evnt);
18836            } else {
18837              evnt = document.createEventObject();
18838              evnt.eventType = ev;
18839              evnt.detail = arguments[1];
18840              if (events.type) DependencyLib.extend(evnt, events);
18841              elem.fireEvent("on" + evnt.eventType, evnt);
18842            }
18843          } else if (eventRegistry[ev] !== undefined) {
18844            arguments[0] = arguments[0].type ? arguments[0] : DependencyLib.Event(arguments[0]);
18845
18846            if (namespace === "global") {
18847              for (var nmsp in eventRegistry[ev]) {
18848                for (i = 0; i < eventRegistry[ev][nmsp].length; i++) {
18849                  eventRegistry[ev][nmsp][i].apply(elem, arguments);
18850                }
18851              }
18852            } else {
18853              for (i = 0; i < eventRegistry[ev][namespace].length; i++) {
18854                eventRegistry[ev][namespace][i].apply(elem, arguments);
18855              }
18856            }
18857          }
18858        }
18859      }
18860
18861      return this;
18862    }
18863  };
18864
18865  DependencyLib.isFunction = function (obj) {
18866    return typeof obj === "function";
18867  };
18868
18869  DependencyLib.noop = function () {};
18870
18871  DependencyLib.isArray = Array.isArray;
18872
18873  DependencyLib.inArray = function (elem, arr, i) {
18874    return arr == null ? -1 : indexOf(arr, elem, i);
18875  };
18876
18877  DependencyLib.valHooks = undefined;
18878
18879  DependencyLib.isPlainObject = function (obj) {
18880    if (_typeof(obj) !== "object" || obj.nodeType || isWindow(obj)) {
18881      return false;
18882    }
18883
18884    if (obj.constructor && !Object.hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf")) {
18885      return false;
18886    }
18887
18888    return true;
18889  };
18890
18891  DependencyLib.extend = function () {
18892    var options,
18893        name,
18894        src,
18895        copy,
18896        copyIsArray,
18897        clone,
18898        target = arguments[0] || {},
18899        i = 1,
18900        length = arguments.length,
18901        deep = false;
18902
18903    if (typeof target === "boolean") {
18904      deep = target;
18905      target = arguments[i] || {};
18906      i++;
18907    }
18908
18909    if (_typeof(target) !== "object" && !DependencyLib.isFunction(target)) {
18910      target = {};
18911    }
18912
18913    if (i === length) {
18914      target = this;
18915      i--;
18916    }
18917
18918    for (; i < length; i++) {
18919      if ((options = arguments[i]) != null) {
18920        for (name in options) {
18921          src = target[name];
18922          copy = options[name];
18923
18924          if (target === copy) {
18925            continue;
18926          }
18927
18928          if (deep && copy && (DependencyLib.isPlainObject(copy) || (copyIsArray = DependencyLib.isArray(copy)))) {
18929            if (copyIsArray) {
18930              copyIsArray = false;
18931              clone = src && DependencyLib.isArray(src) ? src : [];
18932            } else {
18933              clone = src && DependencyLib.isPlainObject(src) ? src : {};
18934            }
18935
18936            target[name] = DependencyLib.extend(deep, clone, copy);
18937          } else if (copy !== undefined) {
18938            target[name] = copy;
18939          }
18940        }
18941      }
18942    }
18943
18944    return target;
18945  };
18946
18947  DependencyLib.each = function (obj, callback) {
18948    var value,
18949        i = 0;
18950
18951    if (isArraylike(obj)) {
18952      for (var length = obj.length; i < length; i++) {
18953        value = callback.call(obj[i], i, obj[i]);
18954
18955        if (value === false) {
18956          break;
18957        }
18958      }
18959    } else {
18960      for (i in obj) {
18961        value = callback.call(obj[i], i, obj[i]);
18962
18963        if (value === false) {
18964          break;
18965        }
18966      }
18967    }
18968
18969    return obj;
18970  };
18971
18972  DependencyLib.data = function (owner, key, value) {
18973    if (value === undefined) {
18974      return owner.__data ? owner.__data[key] : null;
18975    } else {
18976      owner.__data = owner.__data || {};
18977      owner.__data[key] = value;
18978    }
18979  };
18980
18981  if (typeof window.CustomEvent === "function") {
18982    DependencyLib.Event = window.CustomEvent;
18983  } else {
18984    DependencyLib.Event = function (event, params) {
18985      params = params || {
18986        bubbles: false,
18987        cancelable: false,
18988        detail: undefined
18989      };
18990      var evt = document.createEvent("CustomEvent");
18991      evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
18992      return evt;
18993    };
18994
18995    DependencyLib.Event.prototype = window.Event.prototype;
18996  }
18997
18998  return DependencyLib;
18999});
19000
19001/***/ }),
19002
vendor: 1,304 bytes, lines 19003-19025
19003/***/ "../node_modules/inputmask/dist/inputmask/global/window.js":
19004/*!*****************************************************************!*\
19005  !*** ../node_modules/inputmask/dist/inputmask/global/window.js ***!
19006  \*****************************************************************/
19007/*! no static exports found */
19008/***/ (function(module, exports, __webpack_require__) {
19009
19010var __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
19011
19012/*!
19013* global/window.js
19014* https://github.com/RobinHerbots/Inputmask
19015* Copyright (c) 2010 - 2019 Robin Herbots
19016* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
19017* Version: 4.0.6
19018*/
19019if (true) !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {
19020  return typeof window !== "undefined" ? window : new (eval("require('jsdom').JSDOM"))("").window;
19021}).call(exports, __webpack_require__, exports, module),
19022				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));else {}
19023
19024/***/ }),
19025
vendor: 11,905 bytes, lines 19026-19336
19026/***/ "../node_modules/inputmask/dist/inputmask/inputmask.date.extensions.js":
19027/*!*****************************************************************************!*\
19028  !*** ../node_modules/inputmask/dist/inputmask/inputmask.date.extensions.js ***!
19029  \*****************************************************************************/
19030/*! no static exports found */
19031/***/ (function(module, exports, __webpack_require__) {
19032
19033var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
19034
19035/*!
19036* inputmask.date.extensions.js
19037* https://github.com/RobinHerbots/Inputmask
19038* Copyright (c) 2010 - 2019 Robin Herbots
19039* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
19040* Version: 4.0.6
19041*/
19042(function (factory) {
19043  if (true) {
19044    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ./inputmask */ "../node_modules/inputmask/dist/inputmask/inputmask.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
19045				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
19046				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
19047				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
19048  } else {}
19049})(function (Inputmask) {
19050  var $ = Inputmask.dependencyLib;
19051  var formatCode = {
19052    d: ["[1-9]|[12][0-9]|3[01]", Date.prototype.setDate, "day", Date.prototype.getDate],
19053    dd: ["0[1-9]|[12][0-9]|3[01]", Date.prototype.setDate, "day", function () {
19054      return pad(Date.prototype.getDate.call(this), 2);
19055    }],
19056    ddd: [""],
19057    dddd: [""],
19058    m: ["[1-9]|1[012]", Date.prototype.setMonth, "month", function () {
19059      return Date.prototype.getMonth.call(this) + 1;
19060    }],
19061    mm: ["0[1-9]|1[012]", Date.prototype.setMonth, "month", function () {
19062      return pad(Date.prototype.getMonth.call(this) + 1, 2);
19063    }],
19064    mmm: [""],
19065    mmmm: [""],
19066    yy: ["[0-9]{2}", Date.prototype.setFullYear, "year", function () {
19067      return pad(Date.prototype.getFullYear.call(this), 2);
19068    }],
19069    yyyy: ["[0-9]{4}", Date.prototype.setFullYear, "year", function () {
19070      return pad(Date.prototype.getFullYear.call(this), 4);
19071    }],
19072    h: ["[1-9]|1[0-2]", Date.prototype.setHours, "hours", Date.prototype.getHours],
19073    hh: ["0[1-9]|1[0-2]", Date.prototype.setHours, "hours", function () {
19074      return pad(Date.prototype.getHours.call(this), 2);
19075    }],
19076    hhh: ["[0-9]+", Date.prototype.setHours, "hours", Date.prototype.getHours],
19077    H: ["1?[0-9]|2[0-3]", Date.prototype.setHours, "hours", Date.prototype.getHours],
19078    HH: ["0[0-9]|1[0-9]|2[0-3]", Date.prototype.setHours, "hours", function () {
19079      return pad(Date.prototype.getHours.call(this), 2);
19080    }],
19081    HHH: ["[0-9]+", Date.prototype.setHours, "hours", Date.prototype.getHours],
19082    M: ["[1-5]?[0-9]", Date.prototype.setMinutes, "minutes", Date.prototype.getMinutes],
19083    MM: ["0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]", Date.prototype.setMinutes, "minutes", function () {
19084      return pad(Date.prototype.getMinutes.call(this), 2);
19085    }],
19086    ss: ["[0-5][0-9]", Date.prototype.setSeconds, "seconds", function () {
19087      return pad(Date.prototype.getSeconds.call(this), 2);
19088    }],
19089    l: ["[0-9]{3}", Date.prototype.setMilliseconds, "milliseconds", function () {
19090      return pad(Date.prototype.getMilliseconds.call(this), 3);
19091    }],
19092    L: ["[0-9]{2}", Date.prototype.setMilliseconds, "milliseconds", function () {
19093      return pad(Date.prototype.getMilliseconds.call(this), 2);
19094    }],
19095    t: ["[ap]"],
19096    tt: ["[ap]m"],
19097    T: ["[AP]"],
19098    TT: ["[AP]M"],
19099    Z: [""],
19100    o: [""],
19101    S: [""]
19102  },
19103      formatAlias = {
19104    isoDate: "yyyy-mm-dd",
19105    isoTime: "HH:MM:ss",
19106    isoDateTime: "yyyy-mm-dd'T'HH:MM:ss",
19107    isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
19108  };
19109
19110  function getTokenizer(opts) {
19111    if (!opts.tokenizer) {
19112      var tokens = [];
19113
19114      for (var ndx in formatCode) {
19115        if (tokens.indexOf(ndx[0]) === -1) tokens.push(ndx[0]);
19116      }
19117
19118      opts.tokenizer = "(" + tokens.join("+|") + ")+?|.";
19119      opts.tokenizer = new RegExp(opts.tokenizer, "g");
19120    }
19121
19122    return opts.tokenizer;
19123  }
19124
19125  function isValidDate(dateParts, currentResult) {
19126    return !isFinite(dateParts.rawday) || dateParts.day == "29" && !isFinite(dateParts.rawyear) || new Date(dateParts.date.getFullYear(), isFinite(dateParts.rawmonth) ? dateParts.month : dateParts.date.getMonth() + 1, 0).getDate() >= dateParts.day ? currentResult : false;
19127  }
19128
19129  function isDateInRange(dateParts, opts) {
19130    var result = true;
19131
19132    if (opts.min) {
19133      if (dateParts["rawyear"]) {
19134        var rawYear = dateParts["rawyear"].replace(/[^0-9]/g, ""),
19135            minYear = opts.min.year.substr(0, rawYear.length);
19136        result = minYear <= rawYear;
19137      }
19138
19139      if (dateParts["year"] === dateParts["rawyear"]) {
19140        if (opts.min.date.getTime() === opts.min.date.getTime()) {
19141          result = opts.min.date.getTime() <= dateParts.date.getTime();
19142        }
19143      }
19144    }
19145
19146    if (result && opts.max && opts.max.date.getTime() === opts.max.date.getTime()) {
19147      result = opts.max.date.getTime() >= dateParts.date.getTime();
19148    }
19149
19150    return result;
19151  }
19152
19153  function parse(format, dateObjValue, opts, raw) {
19154    var mask = "",
19155        match;
19156
19157    while (match = getTokenizer(opts).exec(format)) {
19158      if (dateObjValue === undefined) {
19159        if (formatCode[match[0]]) {
19160          mask += "(" + formatCode[match[0]][0] + ")";
19161        } else {
19162          switch (match[0]) {
19163            case "[":
19164              mask += "(";
19165              break;
19166
19167            case "]":
19168              mask += ")?";
19169              break;
19170
19171            default:
19172              mask += Inputmask.escapeRegex(match[0]);
19173          }
19174        }
19175      } else {
19176        if (formatCode[match[0]]) {
19177          if (raw !== true && formatCode[match[0]][3]) {
19178            var getFn = formatCode[match[0]][3];
19179            mask += getFn.call(dateObjValue.date);
19180          } else if (formatCode[match[0]][2]) mask += dateObjValue["raw" + formatCode[match[0]][2]];else mask += match[0];
19181        } else mask += match[0];
19182      }
19183    }
19184
19185    return mask;
19186  }
19187
19188  function pad(val, len) {
19189    val = String(val);
19190    len = len || 2;
19191
19192    while (val.length < len) {
19193      val = "0" + val;
19194    }
19195
19196    return val;
19197  }
19198
19199  function analyseMask(maskString, format, opts) {
19200    var dateObj = {
19201      date: new Date(1, 0, 1)
19202    },
19203        targetProp,
19204        mask = maskString,
19205        match,
19206        dateOperation,
19207        targetValidator;
19208
19209    function extendProperty(value) {
19210      var correctedValue = value.replace(/[^0-9]/g, "0");
19211
19212      if (correctedValue != value) {
19213        var enteredPart = value.replace(/[^0-9]/g, ""),
19214            min = (opts.min && opts.min[targetProp] || value).toString(),
19215            max = (opts.max && opts.max[targetProp] || value).toString();
19216        correctedValue = enteredPart + (enteredPart < min.slice(0, enteredPart.length) ? min.slice(enteredPart.length) : enteredPart > max.slice(0, enteredPart.length) ? max.slice(enteredPart.length) : correctedValue.toString().slice(enteredPart.length));
19217      }
19218
19219      return correctedValue;
19220    }
19221
19222    function setValue(dateObj, value, opts) {
19223      dateObj[targetProp] = extendProperty(value);
19224      dateObj["raw" + targetProp] = value;
19225      if (dateOperation !== undefined) dateOperation.call(dateObj.date, targetProp == "month" ? parseInt(dateObj[targetProp]) - 1 : dateObj[targetProp]);
19226    }
19227
19228    if (typeof mask === "string") {
19229      while (match = getTokenizer(opts).exec(format)) {
19230        var value = mask.slice(0, match[0].length);
19231
19232        if (formatCode.hasOwnProperty(match[0])) {
19233          targetValidator = formatCode[match[0]][0];
19234          targetProp = formatCode[match[0]][2];
19235          dateOperation = formatCode[match[0]][1];
19236          setValue(dateObj, value, opts);
19237        }
19238
19239        mask = mask.slice(value.length);
19240      }
19241
19242      return dateObj;
19243    } else if (mask && _typeof(mask) === "object" && mask.hasOwnProperty("date")) {
19244      return mask;
19245    }
19246
19247    return undefined;
19248  }
19249
19250  Inputmask.extendAliases({
19251    datetime: {
19252      mask: function mask(opts) {
19253        formatCode.S = opts.i18n.ordinalSuffix.join("|");
19254        opts.inputFormat = formatAlias[opts.inputFormat] || opts.inputFormat;
19255        opts.displayFormat = formatAlias[opts.displayFormat] || opts.displayFormat || opts.inputFormat;
19256        opts.outputFormat = formatAlias[opts.outputFormat] || opts.outputFormat || opts.inputFormat;
19257        opts.placeholder = opts.placeholder !== "" ? opts.placeholder : opts.inputFormat.replace(/[\[\]]/, "");
19258        opts.regex = parse(opts.inputFormat, undefined, opts);
19259        return null;
19260      },
19261      placeholder: "",
19262      inputFormat: "isoDateTime",
19263      displayFormat: undefined,
19264      outputFormat: undefined,
19265      min: null,
19266      max: null,
19267      i18n: {
19268        dayNames: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
19269        monthNames: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
19270        ordinalSuffix: ["st", "nd", "rd", "th"]
19271      },
19272      postValidation: function postValidation(buffer, pos, currentResult, opts) {
19273        opts.min = analyseMask(opts.min, opts.inputFormat, opts);
19274        opts.max = analyseMask(opts.max, opts.inputFormat, opts);
19275        var result = currentResult,
19276            dateParts = analyseMask(buffer.join(""), opts.inputFormat, opts);
19277
19278        if (result && dateParts.date.getTime() === dateParts.date.getTime()) {
19279          result = isValidDate(dateParts, result);
19280          result = result && isDateInRange(dateParts, opts);
19281        }
19282
19283        if (pos && result && currentResult.pos !== pos) {
19284          return {
19285            buffer: parse(opts.inputFormat, dateParts, opts),
19286            refreshFromBuffer: {
19287              start: pos,
19288              end: currentResult.pos
19289            }
19290          };
19291        }
19292
19293        return result;
19294      },
19295      onKeyDown: function onKeyDown(e, buffer, caretPos, opts) {
19296        var input = this;
19297
19298        if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) {
19299          var today = new Date(),
19300              match,
19301              date = "";
19302
19303          while (match = getTokenizer(opts).exec(opts.inputFormat)) {
19304            if (match[0].charAt(0) === "d") {
19305              date += pad(today.getDate(), match[0].length);
19306            } else if (match[0].charAt(0) === "m") {
19307              date += pad(today.getMonth() + 1, match[0].length);
19308            } else if (match[0] === "yyyy") {
19309              date += today.getFullYear().toString();
19310            } else if (match[0].charAt(0) === "y") {
19311              date += pad(today.getYear(), match[0].length);
19312            }
19313          }
19314
19315          input.inputmask._valueSet(date);
19316
19317          $(input).trigger("setvalue");
19318        }
19319      },
19320      onUnMask: function onUnMask(maskedValue, unmaskedValue, opts) {
19321        return parse(opts.outputFormat, analyseMask(maskedValue, opts.inputFormat, opts), opts, true);
19322      },
19323      casing: function casing(elem, test, pos, validPositions) {
19324        if (test.nativeDef.indexOf("[ap]") == 0) return elem.toLowerCase();
19325        if (test.nativeDef.indexOf("[AP]") == 0) return elem.toUpperCase();
19326        return elem;
19327      },
19328      insertMode: false,
19329      shiftPositions: false
19330    }
19331  });
19332  return Inputmask;
19333});
19334
19335/***/ }),
19336
vendor: 3,891 bytes, lines 19337-19445
19337/***/ "../node_modules/inputmask/dist/inputmask/inputmask.extensions.js":
19338/*!************************************************************************!*\
19339  !*** ../node_modules/inputmask/dist/inputmask/inputmask.extensions.js ***!
19340  \************************************************************************/
19341/*! no static exports found */
19342/***/ (function(module, exports, __webpack_require__) {
19343
19344var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
19345
19346/*!
19347* inputmask.extensions.js
19348* https://github.com/RobinHerbots/Inputmask
19349* Copyright (c) 2010 - 2019 Robin Herbots
19350* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
19351* Version: 4.0.6
19352*/
19353(function (factory) {
19354  if (true) {
19355    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ./inputmask */ "../node_modules/inputmask/dist/inputmask/inputmask.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
19356				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
19357				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
19358				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
19359  } else {}
19360})(function (Inputmask) {
19361  Inputmask.extendDefinitions({
19362    A: {
19363      validator: "[A-Za-z\u0410-\u044F\u0401\u0451\xC0-\xFF\xB5]",
19364      casing: "upper"
19365    },
19366    "&": {
19367      validator: "[0-9A-Za-z\u0410-\u044F\u0401\u0451\xC0-\xFF\xB5]",
19368      casing: "upper"
19369    },
19370    "#": {
19371      validator: "[0-9A-Fa-f]",
19372      casing: "upper"
19373    }
19374  });
19375  Inputmask.extendAliases({
19376    cssunit: {
19377      regex: "[+-]?[0-9]+\\.?([0-9]+)?(px|em|rem|ex|%|in|cm|mm|pt|pc)"
19378    },
19379    url: {
19380      regex: "(https?|ftp)//.*",
19381      autoUnmask: false
19382    },
19383    ip: {
19384      mask: "i[i[i]].i[i[i]].i[i[i]].i[i[i]]",
19385      definitions: {
19386        i: {
19387          validator: function validator(chrs, maskset, pos, strict, opts) {
19388            if (pos - 1 > -1 && maskset.buffer[pos - 1] !== ".") {
19389              chrs = maskset.buffer[pos - 1] + chrs;
19390
19391              if (pos - 2 > -1 && maskset.buffer[pos - 2] !== ".") {
19392                chrs = maskset.buffer[pos - 2] + chrs;
19393              } else chrs = "0" + chrs;
19394            } else chrs = "00" + chrs;
19395
19396            return new RegExp("25[0-5]|2[0-4][0-9]|[01][0-9][0-9]").test(chrs);
19397          }
19398        }
19399      },
19400      onUnMask: function onUnMask(maskedValue, unmaskedValue, opts) {
19401        return maskedValue;
19402      },
19403      inputmode: "numeric"
19404    },
19405    email: {
19406      mask: "*{1,64}[.*{1,64}][.*{1,64}][.*{1,63}]@-{1,63}.-{1,63}[.-{1,63}][.-{1,63}]",
19407      greedy: false,
19408      casing: "lower",
19409      onBeforePaste: function onBeforePaste(pastedValue, opts) {
19410        pastedValue = pastedValue.toLowerCase();
19411        return pastedValue.replace("mailto:", "");
19412      },
19413      definitions: {
19414        "*": {
19415          validator: "[0-9\uFF11-\uFF19A-Za-z\u0410-\u044F\u0401\u0451\xC0-\xFF\xB5!#$%&'*+/=?^_`{|}~-]"
19416        },
19417        "-": {
19418          validator: "[0-9A-Za-z-]"
19419        }
19420      },
19421      onUnMask: function onUnMask(maskedValue, unmaskedValue, opts) {
19422        return maskedValue;
19423      },
19424      inputmode: "email"
19425    },
19426    mac: {
19427      mask: "##:##:##:##:##:##"
19428    },
19429    vin: {
19430      mask: "V{13}9{4}",
19431      definitions: {
19432        V: {
19433          validator: "[A-HJ-NPR-Za-hj-npr-z\\d]",
19434          casing: "upper"
19435        }
19436      },
19437      clearIncomplete: true,
19438      autoUnmask: true
19439    }
19440  });
19441  return Inputmask;
19442});
19443
19444/***/ }),
19445
vendor: 126,181 bytes, lines 19446-22924
19446/***/ "../node_modules/inputmask/dist/inputmask/inputmask.js":
19447/*!*************************************************************!*\
19448  !*** ../node_modules/inputmask/dist/inputmask/inputmask.js ***!
19449  \*************************************************************/
19450/*! no static exports found */
19451/***/ (function(module, exports, __webpack_require__) {
19452
19453var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
19454
19455/*!
19456* inputmask.js
19457* https://github.com/RobinHerbots/Inputmask
19458* Copyright (c) 2010 - 2019 Robin Herbots
19459* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
19460* Version: 4.0.6
19461*/
19462(function (factory) {
19463  if (true) {
19464    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ./dependencyLibs/inputmask.dependencyLib */ "../node_modules/inputmask/dist/inputmask/dependencyLibs/inputmask.dependencyLib.js"), __webpack_require__(/*! ./global/window */ "../node_modules/inputmask/dist/inputmask/global/window.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
19465				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
19466				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
19467				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
19468  } else {}
19469})(function ($, window, undefined) {
19470  var document = window.document,
19471      ua = navigator.userAgent,
19472      ie = ua.indexOf("MSIE ") > 0 || ua.indexOf("Trident/") > 0,
19473      mobile = isInputEventSupported("touchstart"),
19474      iemobile = /iemobile/i.test(ua),
19475      iphone = /iphone/i.test(ua) && !iemobile;
19476
19477  function Inputmask(alias, options, internal) {
19478    if (!(this instanceof Inputmask)) {
19479      return new Inputmask(alias, options, internal);
19480    }
19481
19482    this.el = undefined;
19483    this.events = {};
19484    this.maskset = undefined;
19485    this.refreshValue = false;
19486
19487    if (internal !== true) {
19488      if ($.isPlainObject(alias)) {
19489        options = alias;
19490      } else {
19491        options = options || {};
19492        if (alias) options.alias = alias;
19493      }
19494
19495      this.opts = $.extend(true, {}, this.defaults, options);
19496      this.noMasksCache = options && options.definitions !== undefined;
19497      this.userOptions = options || {};
19498      this.isRTL = this.opts.numericInput;
19499      resolveAlias(this.opts.alias, options, this.opts);
19500    }
19501  }
19502
19503  Inputmask.prototype = {
19504    dataAttribute: "data-inputmask",
19505    defaults: {
19506      placeholder: "_",
19507      optionalmarker: ["[", "]"],
19508      quantifiermarker: ["{", "}"],
19509      groupmarker: ["(", ")"],
19510      alternatormarker: "|",
19511      escapeChar: "\\",
19512      mask: null,
19513      regex: null,
19514      oncomplete: $.noop,
19515      onincomplete: $.noop,
19516      oncleared: $.noop,
19517      repeat: 0,
19518      greedy: false,
19519      autoUnmask: false,
19520      removeMaskOnSubmit: false,
19521      clearMaskOnLostFocus: true,
19522      insertMode: true,
19523      clearIncomplete: false,
19524      alias: null,
19525      onKeyDown: $.noop,
19526      onBeforeMask: null,
19527      onBeforePaste: function onBeforePaste(pastedValue, opts) {
19528        return $.isFunction(opts.onBeforeMask) ? opts.onBeforeMask.call(this, pastedValue, opts) : pastedValue;
19529      },
19530      onBeforeWrite: null,
19531      onUnMask: null,
19532      showMaskOnFocus: true,
19533      showMaskOnHover: true,
19534      onKeyValidation: $.noop,
19535      skipOptionalPartCharacter: " ",
19536      numericInput: false,
19537      rightAlign: false,
19538      undoOnEscape: true,
19539      radixPoint: "",
19540      _radixDance: false,
19541      groupSeparator: "",
19542      keepStatic: null,
19543      positionCaretOnTab: true,
19544      tabThrough: false,
19545      supportsInputType: ["text", "tel", "url", "password", "search"],
19546      ignorables: [8, 9, 13, 19, 27, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 93, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 0, 229],
19547      isComplete: null,
19548      preValidation: null,
19549      postValidation: null,
19550      staticDefinitionSymbol: undefined,
19551      jitMasking: false,
19552      nullable: true,
19553      inputEventOnly: false,
19554      noValuePatching: false,
19555      positionCaretOnClick: "lvp",
19556      casing: null,
19557      inputmode: "verbatim",
19558      colorMask: false,
19559      disablePredictiveText: false,
19560      importDataAttributes: true,
19561      shiftPositions: true
19562    },
19563    definitions: {
19564      9: {
19565        validator: "[0-9\uFF11-\uFF19]",
19566        definitionSymbol: "*"
19567      },
19568      a: {
19569        validator: "[A-Za-z\u0410-\u044F\u0401\u0451\xC0-\xFF\xB5]",
19570        definitionSymbol: "*"
19571      },
19572      "*": {
19573        validator: "[0-9\uFF11-\uFF19A-Za-z\u0410-\u044F\u0401\u0451\xC0-\xFF\xB5]"
19574      }
19575    },
19576    aliases: {},
19577    masksCache: {},
19578    mask: function mask(elems) {
19579      var that = this;
19580
19581      function importAttributeOptions(npt, opts, userOptions, dataAttribute) {
19582        if (opts.importDataAttributes === true) {
19583          var importOption = function importOption(option, optionData) {
19584            optionData = optionData !== undefined ? optionData : npt.getAttribute(dataAttribute + "-" + option);
19585
19586            if (optionData !== null) {
19587              if (typeof optionData === "string") {
19588                if (option.indexOf("on") === 0) optionData = window[optionData];else if (optionData === "false") optionData = false;else if (optionData === "true") optionData = true;
19589              }
19590
19591              userOptions[option] = optionData;
19592            }
19593          };
19594
19595          var attrOptions = npt.getAttribute(dataAttribute),
19596              option,
19597              dataoptions,
19598              optionData,
19599              p;
19600
19601          if (attrOptions && attrOptions !== "") {
19602            attrOptions = attrOptions.replace(/'/g, '"');
19603            dataoptions = JSON.parse("{" + attrOptions + "}");
19604          }
19605
19606          if (dataoptions) {
19607            optionData = undefined;
19608
19609            for (p in dataoptions) {
19610              if (p.toLowerCase() === "alias") {
19611                optionData = dataoptions[p];
19612                break;
19613              }
19614            }
19615          }
19616
19617          importOption("alias", optionData);
19618
19619          if (userOptions.alias) {
19620            resolveAlias(userOptions.alias, userOptions, opts);
19621          }
19622
19623          for (option in opts) {
19624            if (dataoptions) {
19625              optionData = undefined;
19626
19627              for (p in dataoptions) {
19628                if (p.toLowerCase() === option.toLowerCase()) {
19629                  optionData = dataoptions[p];
19630                  break;
19631                }
19632              }
19633            }
19634
19635            importOption(option, optionData);
19636          }
19637        }
19638
19639        $.extend(true, opts, userOptions);
19640
19641        if (npt.dir === "rtl" || opts.rightAlign) {
19642          npt.style.textAlign = "right";
19643        }
19644
19645        if (npt.dir === "rtl" || opts.numericInput) {
19646          npt.dir = "ltr";
19647          npt.removeAttribute("dir");
19648          opts.isRTL = true;
19649        }
19650
19651        return Object.keys(userOptions).length;
19652      }
19653
19654      if (typeof elems === "string") {
19655        elems = document.getElementById(elems) || document.querySelectorAll(elems);
19656      }
19657
19658      elems = elems.nodeName ? [elems] : elems;
19659      $.each(elems, function (ndx, el) {
19660        var scopedOpts = $.extend(true, {}, that.opts);
19661
19662        if (importAttributeOptions(el, scopedOpts, $.extend(true, {}, that.userOptions), that.dataAttribute)) {
19663          var maskset = generateMaskSet(scopedOpts, that.noMasksCache);
19664
19665          if (maskset !== undefined) {
19666            if (el.inputmask !== undefined) {
19667              el.inputmask.opts.autoUnmask = true;
19668              el.inputmask.remove();
19669            }
19670
19671            el.inputmask = new Inputmask(undefined, undefined, true);
19672            el.inputmask.opts = scopedOpts;
19673            el.inputmask.noMasksCache = that.noMasksCache;
19674            el.inputmask.userOptions = $.extend(true, {}, that.userOptions);
19675            el.inputmask.isRTL = scopedOpts.isRTL || scopedOpts.numericInput;
19676            el.inputmask.el = el;
19677            el.inputmask.maskset = maskset;
19678            $.data(el, "_inputmask_opts", scopedOpts);
19679            maskScope.call(el.inputmask, {
19680              action: "mask"
19681            });
19682          }
19683        }
19684      });
19685      return elems && elems[0] ? elems[0].inputmask || this : this;
19686    },
19687    option: function option(options, noremask) {
19688      if (typeof options === "string") {
19689        return this.opts[options];
19690      } else if (_typeof(options) === "object") {
19691        $.extend(this.userOptions, options);
19692
19693        if (this.el && noremask !== true) {
19694          this.mask(this.el);
19695        }
19696
19697        return this;
19698      }
19699    },
19700    unmaskedvalue: function unmaskedvalue(value) {
19701      this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache);
19702      return maskScope.call(this, {
19703        action: "unmaskedvalue",
19704        value: value
19705      });
19706    },
19707    remove: function remove() {
19708      return maskScope.call(this, {
19709        action: "remove"
19710      });
19711    },
19712    getemptymask: function getemptymask() {
19713      this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache);
19714      return maskScope.call(this, {
19715        action: "getemptymask"
19716      });
19717    },
19718    hasMaskedValue: function hasMaskedValue() {
19719      return !this.opts.autoUnmask;
19720    },
19721    isComplete: function isComplete() {
19722      this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache);
19723      return maskScope.call(this, {
19724        action: "isComplete"
19725      });
19726    },
19727    getmetadata: function getmetadata() {
19728      this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache);
19729      return maskScope.call(this, {
19730        action: "getmetadata"
19731      });
19732    },
19733    isValid: function isValid(value) {
19734      this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache);
19735      return maskScope.call(this, {
19736        action: "isValid",
19737        value: value
19738      });
19739    },
19740    format: function format(value, metadata) {
19741      this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache);
19742      return maskScope.call(this, {
19743        action: "format",
19744        value: value,
19745        metadata: metadata
19746      });
19747    },
19748    setValue: function setValue(value) {
19749      if (this.el) {
19750        $(this.el).trigger("setvalue", [value]);
19751      }
19752    },
19753    analyseMask: function analyseMask(mask, regexMask, opts) {
19754      var tokenizer = /(?:[?*+]|\{[0-9\+\*]+(?:,[0-9\+\*]*)?(?:\|[0-9\+\*]*)?\})|[^.?*+^${[]()|\\]+|./g,
19755          regexTokenizer = /\[\^?]?(?:[^\\\]]+|\\[\S\s]?)*]?|\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9][0-9]*|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|c[A-Za-z]|[\S\s]?)|\((?:\?[:=!]?)?|(?:[?*+]|\{[0-9]+(?:,[0-9]*)?\})\??|[^.?*+^${[()|\\]+|./g,
19756          escaped = false,
19757          currentToken = new MaskToken(),
19758          match,
19759          m,
19760          openenings = [],
19761          maskTokens = [],
19762          openingToken,
19763          currentOpeningToken,
19764          alternator,
19765          lastMatch,
19766          groupToken;
19767
19768      function MaskToken(isGroup, isOptional, isQuantifier, isAlternator) {
19769        this.matches = [];
19770        this.openGroup = isGroup || false;
19771        this.alternatorGroup = false;
19772        this.isGroup = isGroup || false;
19773        this.isOptional = isOptional || false;
19774        this.isQuantifier = isQuantifier || false;
19775        this.isAlternator = isAlternator || false;
19776        this.quantifier = {
19777          min: 1,
19778          max: 1
19779        };
19780      }
19781
19782      function insertTestDefinition(mtoken, element, position) {
19783        position = position !== undefined ? position : mtoken.matches.length;
19784        var prevMatch = mtoken.matches[position - 1];
19785
19786        if (regexMask) {
19787          if (element.indexOf("[") === 0 || escaped && /\\d|\\s|\\w]/i.test(element) || element === ".") {
19788            mtoken.matches.splice(position++, 0, {
19789              fn: new RegExp(element, opts.casing ? "i" : ""),
19790              optionality: false,
19791              newBlockMarker: prevMatch === undefined ? "master" : prevMatch.def !== element,
19792              casing: null,
19793              def: element,
19794              placeholder: undefined,
19795              nativeDef: element
19796            });
19797          } else {
19798            if (escaped) element = element[element.length - 1];
19799            $.each(element.split(""), function (ndx, lmnt) {
19800              prevMatch = mtoken.matches[position - 1];
19801              mtoken.matches.splice(position++, 0, {
19802                fn: null,
19803                optionality: false,
19804                newBlockMarker: prevMatch === undefined ? "master" : prevMatch.def !== lmnt && prevMatch.fn !== null,
19805                casing: null,
19806                def: opts.staticDefinitionSymbol || lmnt,
19807                placeholder: opts.staticDefinitionSymbol !== undefined ? lmnt : undefined,
19808                nativeDef: (escaped ? "'" : "") + lmnt
19809              });
19810            });
19811          }
19812
19813          escaped = false;
19814        } else {
19815          var maskdef = (opts.definitions ? opts.definitions[element] : undefined) || Inputmask.prototype.definitions[element];
19816
19817          if (maskdef && !escaped) {
19818            mtoken.matches.splice(position++, 0, {
19819              fn: maskdef.validator ? typeof maskdef.validator == "string" ? new RegExp(maskdef.validator, opts.casing ? "i" : "") : new function () {
19820                this.test = maskdef.validator;
19821              }() : new RegExp("."),
19822              optionality: false,
19823              newBlockMarker: prevMatch === undefined ? "master" : prevMatch.def !== (maskdef.definitionSymbol || element),
19824              casing: maskdef.casing,
19825              def: maskdef.definitionSymbol || element,
19826              placeholder: maskdef.placeholder,
19827              nativeDef: element
19828            });
19829          } else {
19830            mtoken.matches.splice(position++, 0, {
19831              fn: null,
19832              optionality: false,
19833              newBlockMarker: prevMatch === undefined ? "master" : prevMatch.def !== element && prevMatch.fn !== null,
19834              casing: null,
19835              def: opts.staticDefinitionSymbol || element,
19836              placeholder: opts.staticDefinitionSymbol !== undefined ? element : undefined,
19837              nativeDef: (escaped ? "'" : "") + element
19838            });
19839            escaped = false;
19840          }
19841        }
19842      }
19843
19844      function verifyGroupMarker(maskToken) {
19845        if (maskToken && maskToken.matches) {
19846          $.each(maskToken.matches, function (ndx, token) {
19847            var nextToken = maskToken.matches[ndx + 1];
19848
19849            if ((nextToken === undefined || nextToken.matches === undefined || nextToken.isQuantifier === false) && token && token.isGroup) {
19850              token.isGroup = false;
19851
19852              if (!regexMask) {
19853                insertTestDefinition(token, opts.groupmarker[0], 0);
19854
19855                if (token.openGroup !== true) {
19856                  insertTestDefinition(token, opts.groupmarker[1]);
19857                }
19858              }
19859            }
19860
19861            verifyGroupMarker(token);
19862          });
19863        }
19864      }
19865
19866      function defaultCase() {
19867        if (openenings.length > 0) {
19868          currentOpeningToken = openenings[openenings.length - 1];
19869          insertTestDefinition(currentOpeningToken, m);
19870
19871          if (currentOpeningToken.isAlternator) {
19872            alternator = openenings.pop();
19873
19874            for (var mndx = 0; mndx < alternator.matches.length; mndx++) {
19875              if (alternator.matches[mndx].isGroup) alternator.matches[mndx].isGroup = false;
19876            }
19877
19878            if (openenings.length > 0) {
19879              currentOpeningToken = openenings[openenings.length - 1];
19880              currentOpeningToken.matches.push(alternator);
19881            } else {
19882              currentToken.matches.push(alternator);
19883            }
19884          }
19885        } else {
19886          insertTestDefinition(currentToken, m);
19887        }
19888      }
19889
19890      function reverseTokens(maskToken) {
19891        function reverseStatic(st) {
19892          if (st === opts.optionalmarker[0]) st = opts.optionalmarker[1];else if (st === opts.optionalmarker[1]) st = opts.optionalmarker[0];else if (st === opts.groupmarker[0]) st = opts.groupmarker[1];else if (st === opts.groupmarker[1]) st = opts.groupmarker[0];
19893          return st;
19894        }
19895
19896        maskToken.matches = maskToken.matches.reverse();
19897
19898        for (var match in maskToken.matches) {
19899          if (maskToken.matches.hasOwnProperty(match)) {
19900            var intMatch = parseInt(match);
19901
19902            if (maskToken.matches[match].isQuantifier && maskToken.matches[intMatch + 1] && maskToken.matches[intMatch + 1].isGroup) {
19903              var qt = maskToken.matches[match];
19904              maskToken.matches.splice(match, 1);
19905              maskToken.matches.splice(intMatch + 1, 0, qt);
19906            }
19907
19908            if (maskToken.matches[match].matches !== undefined) {
19909              maskToken.matches[match] = reverseTokens(maskToken.matches[match]);
19910            } else {
19911              maskToken.matches[match] = reverseStatic(maskToken.matches[match]);
19912            }
19913          }
19914        }
19915
19916        return maskToken;
19917      }
19918
19919      function groupify(matches) {
19920        var groupToken = new MaskToken(true);
19921        groupToken.openGroup = false;
19922        groupToken.matches = matches;
19923        return groupToken;
19924      }
19925
19926      if (regexMask) {
19927        opts.optionalmarker[0] = undefined;
19928        opts.optionalmarker[1] = undefined;
19929      }
19930
19931      while (match = regexMask ? regexTokenizer.exec(mask) : tokenizer.exec(mask)) {
19932        m = match[0];
19933
19934        if (regexMask) {
19935          switch (m.charAt(0)) {
19936            case "?":
19937              m = "{0,1}";
19938              break;
19939
19940            case "+":
19941            case "*":
19942              m = "{" + m + "}";
19943              break;
19944          }
19945        }
19946
19947        if (escaped) {
19948          defaultCase();
19949          continue;
19950        }
19951
19952        switch (m.charAt(0)) {
19953          case "(?=":
19954            break;
19955
19956          case "(?!":
19957            break;
19958
19959          case "(?<=":
19960            break;
19961
19962          case "(?<!":
19963            break;
19964
19965          case opts.escapeChar:
19966            escaped = true;
19967
19968            if (regexMask) {
19969              defaultCase();
19970            }
19971
19972            break;
19973
19974          case opts.optionalmarker[1]:
19975          case opts.groupmarker[1]:
19976            openingToken = openenings.pop();
19977            openingToken.openGroup = false;
19978
19979            if (openingToken !== undefined) {
19980              if (openenings.length > 0) {
19981                currentOpeningToken = openenings[openenings.length - 1];
19982                currentOpeningToken.matches.push(openingToken);
19983
19984                if (currentOpeningToken.isAlternator) {
19985                  alternator = openenings.pop();
19986
19987                  for (var mndx = 0; mndx < alternator.matches.length; mndx++) {
19988                    alternator.matches[mndx].isGroup = false;
19989                    alternator.matches[mndx].alternatorGroup = false;
19990                  }
19991
19992                  if (openenings.length > 0) {
19993                    currentOpeningToken = openenings[openenings.length - 1];
19994                    currentOpeningToken.matches.push(alternator);
19995                  } else {
19996                    currentToken.matches.push(alternator);
19997                  }
19998                }
19999              } else {
20000                currentToken.matches.push(openingToken);
20001              }
20002            } else defaultCase();
20003
20004            break;
20005
20006          case opts.optionalmarker[0]:
20007            openenings.push(new MaskToken(false, true));
20008            break;
20009
20010          case opts.groupmarker[0]:
20011            openenings.push(new MaskToken(true));
20012            break;
20013
20014          case opts.quantifiermarker[0]:
20015            var quantifier = new MaskToken(false, false, true);
20016            m = m.replace(/[{}]/g, "");
20017            var mqj = m.split("|"),
20018                mq = mqj[0].split(","),
20019                mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]),
20020                mq1 = mq.length === 1 ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]);
20021
20022            if (mq0 === "*" || mq0 === "+") {
20023              mq0 = mq1 === "*" ? 0 : 1;
20024            }
20025
20026            quantifier.quantifier = {
20027              min: mq0,
20028              max: mq1,
20029              jit: mqj[1]
20030            };
20031            var matches = openenings.length > 0 ? openenings[openenings.length - 1].matches : currentToken.matches;
20032            match = matches.pop();
20033
20034            if (match.isAlternator) {
20035              matches.push(match);
20036              matches = match.matches;
20037              var groupToken = new MaskToken(true);
20038              var tmpMatch = matches.pop();
20039              matches.push(groupToken);
20040              matches = groupToken.matches;
20041              match = tmpMatch;
20042            }
20043
20044            if (!match.isGroup) {
20045              match = groupify([match]);
20046            }
20047
20048            matches.push(match);
20049            matches.push(quantifier);
20050            break;
20051
20052          case opts.alternatormarker:
20053            var groupQuantifier = function groupQuantifier(matches) {
20054              var lastMatch = matches.pop();
20055
20056              if (lastMatch.isQuantifier) {
20057                lastMatch = groupify([matches.pop(), lastMatch]);
20058              }
20059
20060              return lastMatch;
20061            };
20062
20063            if (openenings.length > 0) {
20064              currentOpeningToken = openenings[openenings.length - 1];
20065              var subToken = currentOpeningToken.matches[currentOpeningToken.matches.length - 1];
20066
20067              if (currentOpeningToken.openGroup && (subToken.matches === undefined || subToken.isGroup === false && subToken.isAlternator === false)) {
20068                lastMatch = openenings.pop();
20069              } else {
20070                lastMatch = groupQuantifier(currentOpeningToken.matches);
20071              }
20072            } else {
20073              lastMatch = groupQuantifier(currentToken.matches);
20074            }
20075
20076            if (lastMatch.isAlternator) {
20077              openenings.push(lastMatch);
20078            } else {
20079              if (lastMatch.alternatorGroup) {
20080                alternator = openenings.pop();
20081                lastMatch.alternatorGroup = false;
20082              } else {
20083                alternator = new MaskToken(false, false, false, true);
20084              }
20085
20086              alternator.matches.push(lastMatch);
20087              openenings.push(alternator);
20088
20089              if (lastMatch.openGroup) {
20090                lastMatch.openGroup = false;
20091                var alternatorGroup = new MaskToken(true);
20092                alternatorGroup.alternatorGroup = true;
20093                openenings.push(alternatorGroup);
20094              }
20095            }
20096
20097            break;
20098
20099          default:
20100            defaultCase();
20101        }
20102      }
20103
20104      while (openenings.length > 0) {
20105        openingToken = openenings.pop();
20106        currentToken.matches.push(openingToken);
20107      }
20108
20109      if (currentToken.matches.length > 0) {
20110        verifyGroupMarker(currentToken);
20111        maskTokens.push(currentToken);
20112      }
20113
20114      if (opts.numericInput || opts.isRTL) {
20115        reverseTokens(maskTokens[0]);
20116      }
20117
20118      return maskTokens;
20119    }
20120  };
20121
20122  Inputmask.extendDefaults = function (options) {
20123    $.extend(true, Inputmask.prototype.defaults, options);
20124  };
20125
20126  Inputmask.extendDefinitions = function (definition) {
20127    $.extend(true, Inputmask.prototype.definitions, definition);
20128  };
20129
20130  Inputmask.extendAliases = function (alias) {
20131    $.extend(true, Inputmask.prototype.aliases, alias);
20132  };
20133
20134  Inputmask.format = function (value, options, metadata) {
20135    return Inputmask(options).format(value, metadata);
20136  };
20137
20138  Inputmask.unmask = function (value, options) {
20139    return Inputmask(options).unmaskedvalue(value);
20140  };
20141
20142  Inputmask.isValid = function (value, options) {
20143    return Inputmask(options).isValid(value);
20144  };
20145
20146  Inputmask.remove = function (elems) {
20147    if (typeof elems === "string") {
20148      elems = document.getElementById(elems) || document.querySelectorAll(elems);
20149    }
20150
20151    elems = elems.nodeName ? [elems] : elems;
20152    $.each(elems, function (ndx, el) {
20153      if (el.inputmask) el.inputmask.remove();
20154    });
20155  };
20156
20157  Inputmask.setValue = function (elems, value) {
20158    if (typeof elems === "string") {
20159      elems = document.getElementById(elems) || document.querySelectorAll(elems);
20160    }
20161
20162    elems = elems.nodeName ? [elems] : elems;
20163    $.each(elems, function (ndx, el) {
20164      if (el.inputmask) el.inputmask.setValue(value);else $(el).trigger("setvalue", [value]);
20165    });
20166  };
20167
20168  Inputmask.escapeRegex = function (str) {
20169    var specials = ["/", ".", "*", "+", "?", "|", "(", ")", "[", "]", "{", "}", "\\", "$", "^"];
20170    return str.replace(new RegExp("(\\" + specials.join("|\\") + ")", "gim"), "\\$1");
20171  };
20172
20173  Inputmask.keyCode = {
20174    BACKSPACE: 8,
20175    BACKSPACE_SAFARI: 127,
20176    DELETE: 46,
20177    DOWN: 40,
20178    END: 35,
20179    ENTER: 13,
20180    ESCAPE: 27,
20181    HOME: 36,
20182    INSERT: 45,
20183    LEFT: 37,
20184    PAGE_DOWN: 34,
20185    PAGE_UP: 33,
20186    RIGHT: 39,
20187    SPACE: 32,
20188    TAB: 9,
20189    UP: 38,
20190    X: 88,
20191    CONTROL: 17
20192  };
20193  Inputmask.dependencyLib = $;
20194
20195  function resolveAlias(aliasStr, options, opts) {
20196    var aliasDefinition = Inputmask.prototype.aliases[aliasStr];
20197
20198    if (aliasDefinition) {
20199      if (aliasDefinition.alias) resolveAlias(aliasDefinition.alias, undefined, opts);
20200      $.extend(true, opts, aliasDefinition);
20201      $.extend(true, opts, options);
20202      return true;
20203    } else if (opts.mask === null) {
20204      opts.mask = aliasStr;
20205    }
20206
20207    return false;
20208  }
20209
20210  function generateMaskSet(opts, nocache) {
20211    function generateMask(mask, metadata, opts) {
20212      var regexMask = false;
20213
20214      if (mask === null || mask === "") {
20215        regexMask = opts.regex !== null;
20216
20217        if (regexMask) {
20218          mask = opts.regex;
20219          mask = mask.replace(/^(\^)(.*)(\$)$/, "$2");
20220        } else {
20221          regexMask = true;
20222          mask = ".*";
20223        }
20224      }
20225
20226      if (mask.length === 1 && opts.greedy === false && opts.repeat !== 0) {
20227        opts.placeholder = "";
20228      }
20229
20230      if (opts.repeat > 0 || opts.repeat === "*" || opts.repeat === "+") {
20231        var repeatStart = opts.repeat === "*" ? 0 : opts.repeat === "+" ? 1 : opts.repeat;
20232        mask = opts.groupmarker[0] + mask + opts.groupmarker[1] + opts.quantifiermarker[0] + repeatStart + "," + opts.repeat + opts.quantifiermarker[1];
20233      }
20234
20235      var masksetDefinition,
20236          maskdefKey = regexMask ? "regex_" + opts.regex : opts.numericInput ? mask.split("").reverse().join("") : mask;
20237
20238      if (Inputmask.prototype.masksCache[maskdefKey] === undefined || nocache === true) {
20239        masksetDefinition = {
20240          mask: mask,
20241          maskToken: Inputmask.prototype.analyseMask(mask, regexMask, opts),
20242          validPositions: {},
20243          _buffer: undefined,
20244          buffer: undefined,
20245          tests: {},
20246          excludes: {},
20247          metadata: metadata,
20248          maskLength: undefined,
20249          jitOffset: {}
20250        };
20251
20252        if (nocache !== true) {
20253          Inputmask.prototype.masksCache[maskdefKey] = masksetDefinition;
20254          masksetDefinition = $.extend(true, {}, Inputmask.prototype.masksCache[maskdefKey]);
20255        }
20256      } else masksetDefinition = $.extend(true, {}, Inputmask.prototype.masksCache[maskdefKey]);
20257
20258      return masksetDefinition;
20259    }
20260
20261    var ms;
20262
20263    if ($.isFunction(opts.mask)) {
20264      opts.mask = opts.mask(opts);
20265    }
20266
20267    if ($.isArray(opts.mask)) {
20268      if (opts.mask.length > 1) {
20269        if (opts.keepStatic === null) {
20270          opts.keepStatic = "auto";
20271
20272          for (var i = 0; i < opts.mask.length; i++) {
20273            if (opts.mask[i].charAt(0) !== opts.mask[0].charAt(0)) {
20274              opts.keepStatic = true;
20275              break;
20276            }
20277          }
20278        }
20279
20280        var altMask = opts.groupmarker[0];
20281        $.each(opts.isRTL ? opts.mask.reverse() : opts.mask, function (ndx, msk) {
20282          if (altMask.length > 1) {
20283            altMask += opts.groupmarker[1] + opts.alternatormarker + opts.groupmarker[0];
20284          }
20285
20286          if (msk.mask !== undefined && !$.isFunction(msk.mask)) {
20287            altMask += msk.mask;
20288          } else {
20289            altMask += msk;
20290          }
20291        });
20292        altMask += opts.groupmarker[1];
20293        return generateMask(altMask, opts.mask, opts);
20294      } else opts.mask = opts.mask.pop();
20295    }
20296
20297    if (opts.mask && opts.mask.mask !== undefined && !$.isFunction(opts.mask.mask)) {
20298      ms = generateMask(opts.mask.mask, opts.mask, opts);
20299    } else {
20300      ms = generateMask(opts.mask, opts.mask, opts);
20301    }
20302
20303    return ms;
20304  }
20305
20306  function isInputEventSupported(eventName) {
20307    var el = document.createElement("input"),
20308        evName = "on" + eventName,
20309        isSupported = evName in el;
20310
20311    if (!isSupported) {
20312      el.setAttribute(evName, "return;");
20313      isSupported = typeof el[evName] === "function";
20314    }
20315
20316    el = null;
20317    return isSupported;
20318  }
20319
20320  function maskScope(actionObj, maskset, opts) {
20321    maskset = maskset || this.maskset;
20322    opts = opts || this.opts;
20323    var inputmask = this,
20324        el = this.el,
20325        isRTL = this.isRTL,
20326        undoValue,
20327        $el,
20328        skipKeyPressEvent = false,
20329        skipInputEvent = false,
20330        ignorable = false,
20331        maxLength,
20332        mouseEnter = false,
20333        colorMask,
20334        originalPlaceholder;
20335
20336    function getMaskTemplate(baseOnInput, minimalPos, includeMode, noJit, clearOptionalTail) {
20337      var greedy = opts.greedy;
20338      if (clearOptionalTail) opts.greedy = false;
20339      minimalPos = minimalPos || 0;
20340      var maskTemplate = [],
20341          ndxIntlzr,
20342          pos = 0,
20343          test,
20344          testPos,
20345          lvp = getLastValidPosition();
20346
20347      do {
20348        if (baseOnInput === true && getMaskSet().validPositions[pos]) {
20349          testPos = clearOptionalTail && getMaskSet().validPositions[pos].match.optionality === true && getMaskSet().validPositions[pos + 1] === undefined && (getMaskSet().validPositions[pos].generatedInput === true || getMaskSet().validPositions[pos].input == opts.skipOptionalPartCharacter && pos > 0) ? determineTestTemplate(pos, getTests(pos, ndxIntlzr, pos - 1)) : getMaskSet().validPositions[pos];
20350          test = testPos.match;
20351          ndxIntlzr = testPos.locator.slice();
20352          maskTemplate.push(includeMode === true ? testPos.input : includeMode === false ? test.nativeDef : getPlaceholder(pos, test));
20353        } else {
20354          testPos = getTestTemplate(pos, ndxIntlzr, pos - 1);
20355          test = testPos.match;
20356          ndxIntlzr = testPos.locator.slice();
20357          var jitMasking = noJit === true ? false : opts.jitMasking !== false ? opts.jitMasking : test.jit;
20358
20359          if (jitMasking === false || jitMasking === undefined || typeof jitMasking === "number" && isFinite(jitMasking) && jitMasking > pos) {
20360            maskTemplate.push(includeMode === false ? test.nativeDef : getPlaceholder(pos, test));
20361          }
20362        }
20363
20364        if (opts.keepStatic === "auto") {
20365          if (test.newBlockMarker && test.fn !== null) {
20366            opts.keepStatic = pos - 1;
20367          }
20368        }
20369
20370        pos++;
20371      } while ((maxLength === undefined || pos < maxLength) && (test.fn !== null || test.def !== "") || minimalPos > pos);
20372
20373      if (maskTemplate[maskTemplate.length - 1] === "") {
20374        maskTemplate.pop();
20375      }
20376
20377      if (includeMode !== false || getMaskSet().maskLength === undefined) getMaskSet().maskLength = pos - 1;
20378      opts.greedy = greedy;
20379      return maskTemplate;
20380    }
20381
20382    function getMaskSet() {
20383      return maskset;
20384    }
20385
20386    function resetMaskSet(soft) {
20387      var maskset = getMaskSet();
20388      maskset.buffer = undefined;
20389
20390      if (soft !== true) {
20391        maskset.validPositions = {};
20392        maskset.p = 0;
20393      }
20394    }
20395
20396    function getLastValidPosition(closestTo, strict, validPositions) {
20397      var before = -1,
20398          after = -1,
20399          valids = validPositions || getMaskSet().validPositions;
20400      if (closestTo === undefined) closestTo = -1;
20401
20402      for (var posNdx in valids) {
20403        var psNdx = parseInt(posNdx);
20404
20405        if (valids[psNdx] && (strict || valids[psNdx].generatedInput !== true)) {
20406          if (psNdx <= closestTo) before = psNdx;
20407          if (psNdx >= closestTo) after = psNdx;
20408        }
20409      }
20410
20411      return before === -1 || before == closestTo ? after : after == -1 ? before : closestTo - before < after - closestTo ? before : after;
20412    }
20413
20414    function getDecisionTaker(tst) {
20415      var decisionTaker = tst.locator[tst.alternation];
20416
20417      if (typeof decisionTaker == "string" && decisionTaker.length > 0) {
20418        decisionTaker = decisionTaker.split(",")[0];
20419      }
20420
20421      return decisionTaker !== undefined ? decisionTaker.toString() : "";
20422    }
20423
20424    function getLocator(tst, align) {
20425      var locator = (tst.alternation != undefined ? tst.mloc[getDecisionTaker(tst)] : tst.locator).join("");
20426      if (locator !== "") while (locator.length < align) {
20427        locator += "0";
20428      }
20429      return locator;
20430    }
20431
20432    function determineTestTemplate(pos, tests) {
20433      pos = pos > 0 ? pos - 1 : 0;
20434      var altTest = getTest(pos),
20435          targetLocator = getLocator(altTest),
20436          tstLocator,
20437          closest,
20438          bestMatch;
20439
20440      for (var ndx = 0; ndx < tests.length; ndx++) {
20441        var tst = tests[ndx];
20442        tstLocator = getLocator(tst, targetLocator.length);
20443        var distance = Math.abs(tstLocator - targetLocator);
20444
20445        if (closest === undefined || tstLocator !== "" && distance < closest || bestMatch && !opts.greedy && bestMatch.match.optionality && bestMatch.match.newBlockMarker === "master" && (!tst.match.optionality || !tst.match.newBlockMarker) || bestMatch && bestMatch.match.optionalQuantifier && !tst.match.optionalQuantifier) {
20446          closest = distance;
20447          bestMatch = tst;
20448        }
20449      }
20450
20451      return bestMatch;
20452    }
20453
20454    function getTestTemplate(pos, ndxIntlzr, tstPs) {
20455      return getMaskSet().validPositions[pos] || determineTestTemplate(pos, getTests(pos, ndxIntlzr ? ndxIntlzr.slice() : ndxIntlzr, tstPs));
20456    }
20457
20458    function getTest(pos, tests) {
20459      if (getMaskSet().validPositions[pos]) {
20460        return getMaskSet().validPositions[pos];
20461      }
20462
20463      return (tests || getTests(pos))[0];
20464    }
20465
20466    function positionCanMatchDefinition(pos, def) {
20467      var valid = false,
20468          tests = getTests(pos);
20469
20470      for (var tndx = 0; tndx < tests.length; tndx++) {
20471        if (tests[tndx].match && tests[tndx].match.def === def) {
20472          valid = true;
20473          break;
20474        }
20475      }
20476
20477      return valid;
20478    }
20479
20480    function getTests(pos, ndxIntlzr, tstPs) {
20481      var maskTokens = getMaskSet().maskToken,
20482          testPos = ndxIntlzr ? tstPs : 0,
20483          ndxInitializer = ndxIntlzr ? ndxIntlzr.slice() : [0],
20484          matches = [],
20485          insertStop = false,
20486          latestMatch,
20487          cacheDependency = ndxIntlzr ? ndxIntlzr.join("") : "";
20488
20489      function resolveTestFromToken(maskToken, ndxInitializer, loopNdx, quantifierRecurse) {
20490        function handleMatch(match, loopNdx, quantifierRecurse) {
20491          function isFirstMatch(latestMatch, tokenGroup) {
20492            var firstMatch = $.inArray(latestMatch, tokenGroup.matches) === 0;
20493
20494            if (!firstMatch) {
20495              $.each(tokenGroup.matches, function (ndx, match) {
20496                if (match.isQuantifier === true) firstMatch = isFirstMatch(latestMatch, tokenGroup.matches[ndx - 1]);else if (match.hasOwnProperty("matches")) firstMatch = isFirstMatch(latestMatch, match);
20497                if (firstMatch) return false;
20498              });
20499            }
20500
20501            return firstMatch;
20502          }
20503
20504          function resolveNdxInitializer(pos, alternateNdx, targetAlternation) {
20505            var bestMatch, indexPos;
20506
20507            if (getMaskSet().tests[pos] || getMaskSet().validPositions[pos]) {
20508              $.each(getMaskSet().tests[pos] || [getMaskSet().validPositions[pos]], function (ndx, lmnt) {
20509                if (lmnt.mloc[alternateNdx]) {
20510                  bestMatch = lmnt;
20511                  return false;
20512                }
20513
20514                var alternation = targetAlternation !== undefined ? targetAlternation : lmnt.alternation,
20515                    ndxPos = lmnt.locator[alternation] !== undefined ? lmnt.locator[alternation].toString().indexOf(alternateNdx) : -1;
20516
20517                if ((indexPos === undefined || ndxPos < indexPos) && ndxPos !== -1) {
20518                  bestMatch = lmnt;
20519                  indexPos = ndxPos;
20520                }
20521              });
20522            }
20523
20524            if (bestMatch) {
20525              var bestMatchAltIndex = bestMatch.locator[bestMatch.alternation];
20526              var locator = bestMatch.mloc[alternateNdx] || bestMatch.mloc[bestMatchAltIndex] || bestMatch.locator;
20527              return locator.slice((targetAlternation !== undefined ? targetAlternation : bestMatch.alternation) + 1);
20528            } else {
20529              return targetAlternation !== undefined ? resolveNdxInitializer(pos, alternateNdx) : undefined;
20530            }
20531          }
20532
20533          function isSubsetOf(source, target) {
20534            function expand(pattern) {
20535              var expanded = [],
20536                  start,
20537                  end;
20538
20539              for (var i = 0, l = pattern.length; i < l; i++) {
20540                if (pattern.charAt(i) === "-") {
20541                  end = pattern.charCodeAt(i + 1);
20542
20543                  while (++start < end) {
20544                    expanded.push(String.fromCharCode(start));
20545                  }
20546                } else {
20547                  start = pattern.charCodeAt(i);
20548                  expanded.push(pattern.charAt(i));
20549                }
20550              }
20551
20552              return expanded.join("");
20553            }
20554
20555            if (opts.regex && source.match.fn !== null && target.match.fn !== null) {
20556              return expand(target.match.def.replace(/[\[\]]/g, "")).indexOf(expand(source.match.def.replace(/[\[\]]/g, ""))) !== -1;
20557            }
20558
20559            return source.match.def === target.match.nativeDef;
20560          }
20561
20562          function staticCanMatchDefinition(source, target) {
20563            var sloc = source.locator.slice(source.alternation).join(""),
20564                tloc = target.locator.slice(target.alternation).join(""),
20565                canMatch = sloc == tloc;
20566            canMatch = canMatch && source.match.fn === null && target.match.fn !== null ? target.match.fn.test(source.match.def, getMaskSet(), pos, false, opts, false) : false;
20567            return canMatch;
20568          }
20569
20570          function setMergeLocators(targetMatch, altMatch) {
20571            if (altMatch === undefined || targetMatch.alternation === altMatch.alternation && targetMatch.locator[targetMatch.alternation].toString().indexOf(altMatch.locator[altMatch.alternation]) === -1) {
20572              targetMatch.mloc = targetMatch.mloc || {};
20573              var locNdx = targetMatch.locator[targetMatch.alternation];
20574              if (locNdx === undefined) targetMatch.alternation = undefined;else {
20575                if (typeof locNdx === "string") locNdx = locNdx.split(",")[0];
20576                if (targetMatch.mloc[locNdx] === undefined) targetMatch.mloc[locNdx] = targetMatch.locator.slice();
20577
20578                if (altMatch !== undefined) {
20579                  for (var ndx in altMatch.mloc) {
20580                    if (typeof ndx === "string") ndx = ndx.split(",")[0];
20581                    if (targetMatch.mloc[ndx] === undefined) targetMatch.mloc[ndx] = altMatch.mloc[ndx];
20582                  }
20583
20584                  targetMatch.locator[targetMatch.alternation] = Object.keys(targetMatch.mloc).join(",");
20585                }
20586
20587                return true;
20588              }
20589            }
20590
20591            return false;
20592          }
20593
20594          if (testPos > 500 && quantifierRecurse !== undefined) {
20595            throw "Inputmask: There is probably an error in your mask definition or in the code. Create an issue on github with an example of the mask you are using. " + getMaskSet().mask;
20596          }
20597
20598          if (testPos === pos && match.matches === undefined) {
20599            matches.push({
20600              match: match,
20601              locator: loopNdx.reverse(),
20602              cd: cacheDependency,
20603              mloc: {}
20604            });
20605            return true;
20606          } else if (match.matches !== undefined) {
20607            if (match.isGroup && quantifierRecurse !== match) {
20608              match = handleMatch(maskToken.matches[$.inArray(match, maskToken.matches) + 1], loopNdx, quantifierRecurse);
20609              if (match) return true;
20610            } else if (match.isOptional) {
20611              var optionalToken = match;
20612              match = resolveTestFromToken(match, ndxInitializer, loopNdx, quantifierRecurse);
20613
20614              if (match) {
20615                $.each(matches, function (ndx, mtch) {
20616                  mtch.match.optionality = true;
20617                });
20618                latestMatch = matches[matches.length - 1].match;
20619
20620                if (quantifierRecurse === undefined && isFirstMatch(latestMatch, optionalToken)) {
20621                  insertStop = true;
20622                  testPos = pos;
20623                } else return true;
20624              }
20625            } else if (match.isAlternator) {
20626              var alternateToken = match,
20627                  malternateMatches = [],
20628                  maltMatches,
20629                  currentMatches = matches.slice(),
20630                  loopNdxCnt = loopNdx.length;
20631              var altIndex = ndxInitializer.length > 0 ? ndxInitializer.shift() : -1;
20632
20633              if (altIndex === -1 || typeof altIndex === "string") {
20634                var currentPos = testPos,
20635                    ndxInitializerClone = ndxInitializer.slice(),
20636                    altIndexArr = [],
20637                    amndx;
20638
20639                if (typeof altIndex == "string") {
20640                  altIndexArr = altIndex.split(",");
20641                } else {
20642                  for (amndx = 0; amndx < alternateToken.matches.length; amndx++) {
20643                    altIndexArr.push(amndx.toString());
20644                  }
20645                }
20646
20647                if (getMaskSet().excludes[pos]) {
20648                  var altIndexArrClone = altIndexArr.slice();
20649
20650                  for (var i = 0, el = getMaskSet().excludes[pos].length; i < el; i++) {
20651                    altIndexArr.splice(altIndexArr.indexOf(getMaskSet().excludes[pos][i].toString()), 1);
20652                  }
20653
20654                  if (altIndexArr.length === 0) {
20655                    getMaskSet().excludes[pos] = undefined;
20656                    altIndexArr = altIndexArrClone;
20657                  }
20658                }
20659
20660                if (opts.keepStatic === true || isFinite(parseInt(opts.keepStatic)) && currentPos >= opts.keepStatic) altIndexArr = altIndexArr.slice(0, 1);
20661                var unMatchedAlternation = false;
20662
20663                for (var ndx = 0; ndx < altIndexArr.length; ndx++) {
20664                  amndx = parseInt(altIndexArr[ndx]);
20665                  matches = [];
20666                  ndxInitializer = typeof altIndex === "string" ? resolveNdxInitializer(testPos, amndx, loopNdxCnt) || ndxInitializerClone.slice() : ndxInitializerClone.slice();
20667                  if (alternateToken.matches[amndx] && handleMatch(alternateToken.matches[amndx], [amndx].concat(loopNdx), quantifierRecurse)) match = true;else if (ndx === 0) {
20668                    unMatchedAlternation = true;
20669                  }
20670                  maltMatches = matches.slice();
20671                  testPos = currentPos;
20672                  matches = [];
20673
20674                  for (var ndx1 = 0; ndx1 < maltMatches.length; ndx1++) {
20675                    var altMatch = maltMatches[ndx1],
20676                        dropMatch = false;
20677                    altMatch.match.jit = altMatch.match.jit || unMatchedAlternation;
20678                    altMatch.alternation = altMatch.alternation || loopNdxCnt;
20679                    setMergeLocators(altMatch);
20680
20681                    for (var ndx2 = 0; ndx2 < malternateMatches.length; ndx2++) {
20682                      var altMatch2 = malternateMatches[ndx2];
20683
20684                      if (typeof altIndex !== "string" || altMatch.alternation !== undefined && $.inArray(altMatch.locator[altMatch.alternation].toString(), altIndexArr) !== -1) {
20685                        if (altMatch.match.nativeDef === altMatch2.match.nativeDef) {
20686                          dropMatch = true;
20687                          setMergeLocators(altMatch2, altMatch);
20688                          break;
20689                        } else if (isSubsetOf(altMatch, altMatch2)) {
20690                          if (setMergeLocators(altMatch, altMatch2)) {
20691                            dropMatch = true;
20692                            malternateMatches.splice(malternateMatches.indexOf(altMatch2), 0, altMatch);
20693                          }
20694
20695                          break;
20696                        } else if (isSubsetOf(altMatch2, altMatch)) {
20697                          setMergeLocators(altMatch2, altMatch);
20698                          break;
20699                        } else if (staticCanMatchDefinition(altMatch, altMatch2)) {
20700                          if (setMergeLocators(altMatch, altMatch2)) {
20701                            dropMatch = true;
20702                            malternateMatches.splice(malternateMatches.indexOf(altMatch2), 0, altMatch);
20703                          }
20704
20705                          break;
20706                        }
20707                      }
20708                    }
20709
20710                    if (!dropMatch) {
20711                      malternateMatches.push(altMatch);
20712                    }
20713                  }
20714                }
20715
20716                matches = currentMatches.concat(malternateMatches);
20717                testPos = pos;
20718                insertStop = matches.length > 0;
20719                match = malternateMatches.length > 0;
20720                ndxInitializer = ndxInitializerClone.slice();
20721              } else match = handleMatch(alternateToken.matches[altIndex] || maskToken.matches[altIndex], [altIndex].concat(loopNdx), quantifierRecurse);
20722
20723              if (match) return true;
20724            } else if (match.isQuantifier && quantifierRecurse !== maskToken.matches[$.inArray(match, maskToken.matches) - 1]) {
20725              var qt = match;
20726
20727              for (var qndx = ndxInitializer.length > 0 ? ndxInitializer.shift() : 0; qndx < (isNaN(qt.quantifier.max) ? qndx + 1 : qt.quantifier.max) && testPos <= pos; qndx++) {
20728                var tokenGroup = maskToken.matches[$.inArray(qt, maskToken.matches) - 1];
20729                match = handleMatch(tokenGroup, [qndx].concat(loopNdx), tokenGroup);
20730
20731                if (match) {
20732                  latestMatch = matches[matches.length - 1].match;
20733                  latestMatch.optionalQuantifier = qndx >= qt.quantifier.min;
20734                  latestMatch.jit = (qndx || 1) * tokenGroup.matches.indexOf(latestMatch) >= qt.quantifier.jit;
20735
20736                  if (latestMatch.optionalQuantifier && isFirstMatch(latestMatch, tokenGroup)) {
20737                    insertStop = true;
20738                    testPos = pos;
20739                    break;
20740                  }
20741
20742                  if (latestMatch.jit) {
20743                    getMaskSet().jitOffset[pos] = tokenGroup.matches.indexOf(latestMatch);
20744                  }
20745
20746                  return true;
20747                }
20748              }
20749            } else {
20750              match = resolveTestFromToken(match, ndxInitializer, loopNdx, quantifierRecurse);
20751              if (match) return true;
20752            }
20753          } else {
20754            testPos++;
20755          }
20756        }
20757
20758        for (var tndx = ndxInitializer.length > 0 ? ndxInitializer.shift() : 0; tndx < maskToken.matches.length; tndx++) {
20759          if (maskToken.matches[tndx].isQuantifier !== true) {
20760            var match = handleMatch(maskToken.matches[tndx], [tndx].concat(loopNdx), quantifierRecurse);
20761
20762            if (match && testPos === pos) {
20763              return match;
20764            } else if (testPos > pos) {
20765              break;
20766            }
20767          }
20768        }
20769      }
20770
20771      function mergeLocators(pos, tests) {
20772        var locator = [];
20773        if (!$.isArray(tests)) tests = [tests];
20774
20775        if (tests.length > 0) {
20776          if (tests[0].alternation === undefined) {
20777            locator = determineTestTemplate(pos, tests.slice()).locator.slice();
20778            if (locator.length === 0) locator = tests[0].locator.slice();
20779          } else {
20780            $.each(tests, function (ndx, tst) {
20781              if (tst.def !== "") {
20782                if (locator.length === 0) locator = tst.locator.slice();else {
20783                  for (var i = 0; i < locator.length; i++) {
20784                    if (tst.locator[i] && locator[i].toString().indexOf(tst.locator[i]) === -1) {
20785                      locator[i] += "," + tst.locator[i];
20786                    }
20787                  }
20788                }
20789              }
20790            });
20791          }
20792        }
20793
20794        return locator;
20795      }
20796
20797      if (pos > -1) {
20798        if (ndxIntlzr === undefined) {
20799          var previousPos = pos - 1,
20800              test;
20801
20802          while ((test = getMaskSet().validPositions[previousPos] || getMaskSet().tests[previousPos]) === undefined && previousPos > -1) {
20803            previousPos--;
20804          }
20805
20806          if (test !== undefined && previousPos > -1) {
20807            ndxInitializer = mergeLocators(previousPos, test);
20808            cacheDependency = ndxInitializer.join("");
20809            testPos = previousPos;
20810          }
20811        }
20812
20813        if (getMaskSet().tests[pos] && getMaskSet().tests[pos][0].cd === cacheDependency) {
20814          return getMaskSet().tests[pos];
20815        }
20816
20817        for (var mtndx = ndxInitializer.shift(); mtndx < maskTokens.length; mtndx++) {
20818          var match = resolveTestFromToken(maskTokens[mtndx], ndxInitializer, [mtndx]);
20819
20820          if (match && testPos === pos || testPos > pos) {
20821            break;
20822          }
20823        }
20824      }
20825
20826      if (matches.length === 0 || insertStop) {
20827        matches.push({
20828          match: {
20829            fn: null,
20830            optionality: false,
20831            casing: null,
20832            def: "",
20833            placeholder: ""
20834          },
20835          locator: [],
20836          mloc: {},
20837          cd: cacheDependency
20838        });
20839      }
20840
20841      if (ndxIntlzr !== undefined && getMaskSet().tests[pos]) {
20842        return $.extend(true, [], matches);
20843      }
20844
20845      getMaskSet().tests[pos] = $.extend(true, [], matches);
20846      return getMaskSet().tests[pos];
20847    }
20848
20849    function getBufferTemplate() {
20850      if (getMaskSet()._buffer === undefined) {
20851        getMaskSet()._buffer = getMaskTemplate(false, 1);
20852        if (getMaskSet().buffer === undefined) getMaskSet().buffer = getMaskSet()._buffer.slice();
20853      }
20854
20855      return getMaskSet()._buffer;
20856    }
20857
20858    function getBuffer(noCache) {
20859      if (getMaskSet().buffer === undefined || noCache === true) {
20860        getMaskSet().buffer = getMaskTemplate(true, getLastValidPosition(), true);
20861        if (getMaskSet()._buffer === undefined) getMaskSet()._buffer = getMaskSet().buffer.slice();
20862      }
20863
20864      return getMaskSet().buffer;
20865    }
20866
20867    function refreshFromBuffer(start, end, buffer) {
20868      var i, p;
20869
20870      if (start === true) {
20871        resetMaskSet();
20872        start = 0;
20873        end = buffer.length;
20874      } else {
20875        for (i = start; i < end; i++) {
20876          delete getMaskSet().validPositions[i];
20877        }
20878      }
20879
20880      p = start;
20881
20882      for (i = start; i < end; i++) {
20883        resetMaskSet(true);
20884
20885        if (buffer[i] !== opts.skipOptionalPartCharacter) {
20886          var valResult = isValid(p, buffer[i], true, true);
20887
20888          if (valResult !== false) {
20889            resetMaskSet(true);
20890            p = valResult.caret !== undefined ? valResult.caret : valResult.pos + 1;
20891          }
20892        }
20893      }
20894    }
20895
20896    function casing(elem, test, pos) {
20897      switch (opts.casing || test.casing) {
20898        case "upper":
20899          elem = elem.toUpperCase();
20900          break;
20901
20902        case "lower":
20903          elem = elem.toLowerCase();
20904          break;
20905
20906        case "title":
20907          var posBefore = getMaskSet().validPositions[pos - 1];
20908
20909          if (pos === 0 || posBefore && posBefore.input === String.fromCharCode(Inputmask.keyCode.SPACE)) {
20910            elem = elem.toUpperCase();
20911          } else {
20912            elem = elem.toLowerCase();
20913          }
20914
20915          break;
20916
20917        default:
20918          if ($.isFunction(opts.casing)) {
20919            var args = Array.prototype.slice.call(arguments);
20920            args.push(getMaskSet().validPositions);
20921            elem = opts.casing.apply(this, args);
20922          }
20923
20924      }
20925
20926      return elem;
20927    }
20928
20929    function checkAlternationMatch(altArr1, altArr2, na) {
20930      var altArrC = opts.greedy ? altArr2 : altArr2.slice(0, 1),
20931          isMatch = false,
20932          naArr = na !== undefined ? na.split(",") : [],
20933          naNdx;
20934
20935      for (var i = 0; i < naArr.length; i++) {
20936        if ((naNdx = altArr1.indexOf(naArr[i])) !== -1) {
20937          altArr1.splice(naNdx, 1);
20938        }
20939      }
20940
20941      for (var alndx = 0; alndx < altArr1.length; alndx++) {
20942        if ($.inArray(altArr1[alndx], altArrC) !== -1) {
20943          isMatch = true;
20944          break;
20945        }
20946      }
20947
20948      return isMatch;
20949    }
20950
20951    function alternate(pos, c, strict, fromSetValid, rAltPos) {
20952      var validPsClone = $.extend(true, {}, getMaskSet().validPositions),
20953          lastAlt,
20954          alternation,
20955          isValidRslt = false,
20956          altPos,
20957          prevAltPos,
20958          i,
20959          validPos,
20960          decisionPos,
20961          lAltPos = rAltPos !== undefined ? rAltPos : getLastValidPosition();
20962
20963      if (lAltPos === -1 && rAltPos === undefined) {
20964        lastAlt = 0;
20965        prevAltPos = getTest(lastAlt);
20966        alternation = prevAltPos.alternation;
20967      } else {
20968        for (; lAltPos >= 0; lAltPos--) {
20969          altPos = getMaskSet().validPositions[lAltPos];
20970
20971          if (altPos && altPos.alternation !== undefined) {
20972            if (prevAltPos && prevAltPos.locator[altPos.alternation] !== altPos.locator[altPos.alternation]) {
20973              break;
20974            }
20975
20976            lastAlt = lAltPos;
20977            alternation = getMaskSet().validPositions[lastAlt].alternation;
20978            prevAltPos = altPos;
20979          }
20980        }
20981      }
20982
20983      if (alternation !== undefined) {
20984        decisionPos = parseInt(lastAlt);
20985        getMaskSet().excludes[decisionPos] = getMaskSet().excludes[decisionPos] || [];
20986
20987        if (pos !== true) {
20988          getMaskSet().excludes[decisionPos].push(getDecisionTaker(prevAltPos));
20989        }
20990
20991        var validInputsClone = [],
20992            staticInputsBeforePos = 0;
20993
20994        for (i = decisionPos; i < getLastValidPosition(undefined, true) + 1; i++) {
20995          validPos = getMaskSet().validPositions[i];
20996
20997          if (validPos && validPos.generatedInput !== true) {
20998            validInputsClone.push(validPos.input);
20999          } else if (i < pos) staticInputsBeforePos++;
21000
21001          delete getMaskSet().validPositions[i];
21002        }
21003
21004        while (getMaskSet().excludes[decisionPos] && getMaskSet().excludes[decisionPos].length < 10) {
21005          var posOffset = staticInputsBeforePos * -1,
21006              validInputs = validInputsClone.slice();
21007          getMaskSet().tests[decisionPos] = undefined;
21008          resetMaskSet(true);
21009          isValidRslt = true;
21010
21011          while (validInputs.length > 0) {
21012            var input = validInputs.shift();
21013
21014            if (!(isValidRslt = isValid(getLastValidPosition(undefined, true) + 1, input, false, fromSetValid, true))) {
21015              break;
21016            }
21017          }
21018
21019          if (isValidRslt && c !== undefined) {
21020            var targetLvp = getLastValidPosition(pos) + 1;
21021
21022            for (i = decisionPos; i < getLastValidPosition() + 1; i++) {
21023              validPos = getMaskSet().validPositions[i];
21024
21025              if ((validPos === undefined || validPos.match.fn == null) && i < pos + posOffset) {
21026                posOffset++;
21027              }
21028            }
21029
21030            pos = pos + posOffset;
21031            isValidRslt = isValid(pos > targetLvp ? targetLvp : pos, c, strict, fromSetValid, true);
21032          }
21033
21034          if (!isValidRslt) {
21035            resetMaskSet();
21036            prevAltPos = getTest(decisionPos);
21037            getMaskSet().validPositions = $.extend(true, {}, validPsClone);
21038
21039            if (getMaskSet().excludes[decisionPos]) {
21040              var decisionTaker = getDecisionTaker(prevAltPos);
21041
21042              if (getMaskSet().excludes[decisionPos].indexOf(decisionTaker) !== -1) {
21043                isValidRslt = alternate(pos, c, strict, fromSetValid, decisionPos - 1);
21044                break;
21045              }
21046
21047              getMaskSet().excludes[decisionPos].push(decisionTaker);
21048
21049              for (i = decisionPos; i < getLastValidPosition(undefined, true) + 1; i++) {
21050                delete getMaskSet().validPositions[i];
21051              }
21052            } else {
21053              isValidRslt = alternate(pos, c, strict, fromSetValid, decisionPos - 1);
21054              break;
21055            }
21056          } else break;
21057        }
21058      }
21059
21060      getMaskSet().excludes[decisionPos] = undefined;
21061      return isValidRslt;
21062    }
21063
21064    function isValid(pos, c, strict, fromSetValid, fromAlternate, validateOnly) {
21065      function isSelection(posObj) {
21066        return isRTL ? posObj.begin - posObj.end > 1 || posObj.begin - posObj.end === 1 : posObj.end - posObj.begin > 1 || posObj.end - posObj.begin === 1;
21067      }
21068
21069      strict = strict === true;
21070      var maskPos = pos;
21071
21072      if (pos.begin !== undefined) {
21073        maskPos = isRTL ? pos.end : pos.begin;
21074      }
21075
21076      function _isValid(position, c, strict) {
21077        var rslt = false;
21078        $.each(getTests(position), function (ndx, tst) {
21079          var test = tst.match;
21080          getBuffer(true);
21081          rslt = test.fn != null ? test.fn.test(c, getMaskSet(), position, strict, opts, isSelection(pos)) : (c === test.def || c === opts.skipOptionalPartCharacter) && test.def !== "" ? {
21082            c: getPlaceholder(position, test, true) || test.def,
21083            pos: position
21084          } : false;
21085
21086          if (rslt !== false) {
21087            var elem = rslt.c !== undefined ? rslt.c : c,
21088                validatedPos = position;
21089            elem = elem === opts.skipOptionalPartCharacter && test.fn === null ? getPlaceholder(position, test, true) || test.def : elem;
21090
21091            if (rslt.remove !== undefined) {
21092              if (!$.isArray(rslt.remove)) rslt.remove = [rslt.remove];
21093              $.each(rslt.remove.sort(function (a, b) {
21094                return b - a;
21095              }), function (ndx, lmnt) {
21096                revalidateMask({
21097                  begin: lmnt,
21098                  end: lmnt + 1
21099                });
21100              });
21101            }
21102
21103            if (rslt.insert !== undefined) {
21104              if (!$.isArray(rslt.insert)) rslt.insert = [rslt.insert];
21105              $.each(rslt.insert.sort(function (a, b) {
21106                return a - b;
21107              }), function (ndx, lmnt) {
21108                isValid(lmnt.pos, lmnt.c, true, fromSetValid);
21109              });
21110            }
21111
21112            if (rslt !== true && rslt.pos !== undefined && rslt.pos !== position) {
21113              validatedPos = rslt.pos;
21114            }
21115
21116            if (rslt !== true && rslt.pos === undefined && rslt.c === undefined) {
21117              return false;
21118            }
21119
21120            if (!revalidateMask(pos, $.extend({}, tst, {
21121              input: casing(elem, test, validatedPos)
21122            }), fromSetValid, validatedPos)) {
21123              rslt = false;
21124            }
21125
21126            return false;
21127          }
21128        });
21129        return rslt;
21130      }
21131
21132      var result = true,
21133          positionsClone = $.extend(true, {}, getMaskSet().validPositions);
21134
21135      if ($.isFunction(opts.preValidation) && !strict && fromSetValid !== true && validateOnly !== true) {
21136        result = opts.preValidation(getBuffer(), maskPos, c, isSelection(pos), opts, getMaskSet());
21137      }
21138
21139      if (result === true) {
21140        trackbackPositions(undefined, maskPos, true);
21141
21142        if (maxLength === undefined || maskPos < maxLength) {
21143          result = _isValid(maskPos, c, strict);
21144
21145          if ((!strict || fromSetValid === true) && result === false && validateOnly !== true) {
21146            var currentPosValid = getMaskSet().validPositions[maskPos];
21147
21148            if (currentPosValid && currentPosValid.match.fn === null && (currentPosValid.match.def === c || c === opts.skipOptionalPartCharacter)) {
21149              result = {
21150                caret: seekNext(maskPos)
21151              };
21152            } else {
21153              if ((opts.insertMode || getMaskSet().validPositions[seekNext(maskPos)] === undefined) && (!isMask(maskPos, true) || getMaskSet().jitOffset[maskPos])) {
21154                if (getMaskSet().jitOffset[maskPos] && getMaskSet().validPositions[seekNext(maskPos)] === undefined) {
21155                  result = isValid(maskPos + getMaskSet().jitOffset[maskPos], c, strict);
21156                  if (result !== false) result.caret = maskPos;
21157                } else for (var nPos = maskPos + 1, snPos = seekNext(maskPos); nPos <= snPos; nPos++) {
21158                  result = _isValid(nPos, c, strict);
21159
21160                  if (result !== false) {
21161                    result = trackbackPositions(maskPos, result.pos !== undefined ? result.pos : nPos) || result;
21162                    maskPos = nPos;
21163                    break;
21164                  }
21165                }
21166              }
21167            }
21168          }
21169        }
21170
21171        if (result === false && opts.keepStatic !== false && (opts.regex == null || isComplete(getBuffer())) && !strict && fromAlternate !== true) {
21172          result = alternate(maskPos, c, strict, fromSetValid);
21173        }
21174
21175        if (result === true) {
21176          result = {
21177            pos: maskPos
21178          };
21179        }
21180      }
21181
21182      if ($.isFunction(opts.postValidation) && result !== false && !strict && fromSetValid !== true && validateOnly !== true) {
21183        var postResult = opts.postValidation(getBuffer(true), pos.begin !== undefined ? isRTL ? pos.end : pos.begin : pos, result, opts);
21184
21185        if (postResult !== undefined) {
21186          if (postResult.refreshFromBuffer && postResult.buffer) {
21187            var refresh = postResult.refreshFromBuffer;
21188            refreshFromBuffer(refresh === true ? refresh : refresh.start, refresh.end, postResult.buffer);
21189          }
21190
21191          result = postResult === true ? result : postResult;
21192        }
21193      }
21194
21195      if (result && result.pos === undefined) {
21196        result.pos = maskPos;
21197      }
21198
21199      if (result === false || validateOnly === true) {
21200        resetMaskSet(true);
21201        getMaskSet().validPositions = $.extend(true, {}, positionsClone);
21202      }
21203
21204      return result;
21205    }
21206
21207    function trackbackPositions(originalPos, newPos, fillOnly) {
21208      var result;
21209
21210      if (originalPos === undefined) {
21211        for (originalPos = newPos - 1; originalPos > 0; originalPos--) {
21212          if (getMaskSet().validPositions[originalPos]) break;
21213        }
21214      }
21215
21216      for (var ps = originalPos; ps < newPos; ps++) {
21217        if (getMaskSet().validPositions[ps] === undefined && !isMask(ps, true)) {
21218          var vp = ps == 0 ? getTest(ps) : getMaskSet().validPositions[ps - 1];
21219
21220          if (vp) {
21221            var tests = getTests(ps).slice();
21222            if (tests[tests.length - 1].match.def === "") tests.pop();
21223            var bestMatch = determineTestTemplate(ps, tests);
21224            bestMatch = $.extend({}, bestMatch, {
21225              input: getPlaceholder(ps, bestMatch.match, true) || bestMatch.match.def
21226            });
21227            bestMatch.generatedInput = true;
21228            revalidateMask(ps, bestMatch, true);
21229
21230            if (fillOnly !== true) {
21231              var cvpInput = getMaskSet().validPositions[newPos].input;
21232              getMaskSet().validPositions[newPos] = undefined;
21233              result = isValid(newPos, cvpInput, true, true);
21234            }
21235          }
21236        }
21237      }
21238
21239      return result;
21240    }
21241
21242    function revalidateMask(pos, validTest, fromSetValid, validatedPos) {
21243      function IsEnclosedStatic(pos, valids, selection) {
21244        var posMatch = valids[pos];
21245
21246        if (posMatch !== undefined && (posMatch.match.fn === null && posMatch.match.optionality !== true || posMatch.input === opts.radixPoint)) {
21247          var prevMatch = selection.begin <= pos - 1 ? valids[pos - 1] && valids[pos - 1].match.fn === null && valids[pos - 1] : valids[pos - 1],
21248              nextMatch = selection.end > pos + 1 ? valids[pos + 1] && valids[pos + 1].match.fn === null && valids[pos + 1] : valids[pos + 1];
21249          return prevMatch && nextMatch;
21250        }
21251
21252        return false;
21253      }
21254
21255      var begin = pos.begin !== undefined ? pos.begin : pos,
21256          end = pos.end !== undefined ? pos.end : pos;
21257
21258      if (pos.begin > pos.end) {
21259        begin = pos.end;
21260        end = pos.begin;
21261      }
21262
21263      validatedPos = validatedPos !== undefined ? validatedPos : begin;
21264
21265      if (begin !== end || opts.insertMode && getMaskSet().validPositions[validatedPos] !== undefined && fromSetValid === undefined) {
21266        var positionsClone = $.extend(true, {}, getMaskSet().validPositions),
21267            lvp = getLastValidPosition(undefined, true),
21268            i;
21269        getMaskSet().p = begin;
21270
21271        for (i = lvp; i >= begin; i--) {
21272          if (getMaskSet().validPositions[i] && getMaskSet().validPositions[i].match.nativeDef === "+") {
21273            opts.isNegative = false;
21274          }
21275
21276          delete getMaskSet().validPositions[i];
21277        }
21278
21279        var valid = true,
21280            j = validatedPos,
21281            vps = getMaskSet().validPositions,
21282            needsValidation = false,
21283            posMatch = j,
21284            i = j;
21285
21286        if (validTest) {
21287          getMaskSet().validPositions[validatedPos] = $.extend(true, {}, validTest);
21288          posMatch++;
21289          j++;
21290          if (begin < end) i++;
21291        }
21292
21293        for (; i <= lvp; i++) {
21294          var t = positionsClone[i];
21295
21296          if (t !== undefined && (i >= end || i >= begin && t.generatedInput !== true && IsEnclosedStatic(i, positionsClone, {
21297            begin: begin,
21298            end: end
21299          }))) {
21300            while (getTest(posMatch).match.def !== "") {
21301              if (needsValidation === false && positionsClone[posMatch] && positionsClone[posMatch].match.nativeDef === t.match.nativeDef) {
21302                getMaskSet().validPositions[posMatch] = $.extend(true, {}, positionsClone[posMatch]);
21303                getMaskSet().validPositions[posMatch].input = t.input;
21304                trackbackPositions(undefined, posMatch, true);
21305                j = posMatch + 1;
21306                valid = true;
21307              } else if (opts.shiftPositions && positionCanMatchDefinition(posMatch, t.match.def)) {
21308                var result = isValid(posMatch, t.input, true, true);
21309                valid = result !== false;
21310                j = result.caret || result.insert ? getLastValidPosition() : posMatch + 1;
21311                needsValidation = true;
21312              } else {
21313                valid = t.generatedInput === true || t.input === opts.radixPoint && opts.numericInput === true;
21314              }
21315
21316              if (valid) break;
21317
21318              if (!valid && posMatch > end && isMask(posMatch, true) && (t.match.fn !== null || posMatch > getMaskSet().maskLength)) {
21319                break;
21320              }
21321
21322              posMatch++;
21323            }
21324
21325            if (getTest(posMatch).match.def == "") valid = false;
21326            posMatch = j;
21327          }
21328
21329          if (!valid) break;
21330        }
21331
21332        if (!valid) {
21333          getMaskSet().validPositions = $.extend(true, {}, positionsClone);
21334          resetMaskSet(true);
21335          return false;
21336        }
21337      } else if (validTest) {
21338        getMaskSet().validPositions[validatedPos] = $.extend(true, {}, validTest);
21339      }
21340
21341      resetMaskSet(true);
21342      return true;
21343    }
21344
21345    function isMask(pos, strict) {
21346      var test = getTestTemplate(pos).match;
21347      if (test.def === "") test = getTest(pos).match;
21348
21349      if (test.fn != null) {
21350        return test.fn;
21351      }
21352
21353      if (strict !== true && pos > -1) {
21354        var tests = getTests(pos);
21355        return tests.length > 1 + (tests[tests.length - 1].match.def === "" ? 1 : 0);
21356      }
21357
21358      return false;
21359    }
21360
21361    function seekNext(pos, newBlock) {
21362      var position = pos + 1;
21363
21364      while (getTest(position).match.def !== "" && (newBlock === true && (getTest(position).match.newBlockMarker !== true || !isMask(position)) || newBlock !== true && !isMask(position))) {
21365        position++;
21366      }
21367
21368      return position;
21369    }
21370
21371    function seekPrevious(pos, newBlock) {
21372      var position = pos,
21373          tests;
21374      if (position <= 0) return 0;
21375
21376      while (--position > 0 && (newBlock === true && getTest(position).match.newBlockMarker !== true || newBlock !== true && !isMask(position) && (tests = getTests(position), tests.length < 2 || tests.length === 2 && tests[1].match.def === ""))) {}
21377
21378      return position;
21379    }
21380
21381    function writeBuffer(input, buffer, caretPos, event, triggerEvents) {
21382      if (event && $.isFunction(opts.onBeforeWrite)) {
21383        var result = opts.onBeforeWrite.call(inputmask, event, buffer, caretPos, opts);
21384
21385        if (result) {
21386          if (result.refreshFromBuffer) {
21387            var refresh = result.refreshFromBuffer;
21388            refreshFromBuffer(refresh === true ? refresh : refresh.start, refresh.end, result.buffer || buffer);
21389            buffer = getBuffer(true);
21390          }
21391
21392          if (caretPos !== undefined) caretPos = result.caret !== undefined ? result.caret : caretPos;
21393        }
21394      }
21395
21396      if (input !== undefined) {
21397        input.inputmask._valueSet(buffer.join(""));
21398
21399        if (caretPos !== undefined && (event === undefined || event.type !== "blur")) {
21400          caret(input, caretPos);
21401        } else renderColorMask(input, caretPos, buffer.length === 0);
21402
21403        if (triggerEvents === true) {
21404          var $input = $(input),
21405              nptVal = input.inputmask._valueGet();
21406
21407          skipInputEvent = true;
21408          $input.trigger("input");
21409          setTimeout(function () {
21410            if (nptVal === getBufferTemplate().join("")) {
21411              $input.trigger("cleared");
21412            } else if (isComplete(buffer) === true) {
21413              $input.trigger("complete");
21414            }
21415          }, 0);
21416        }
21417      }
21418    }
21419
21420    function getPlaceholder(pos, test, returnPL) {
21421      test = test || getTest(pos).match;
21422
21423      if (test.placeholder !== undefined || returnPL === true) {
21424        return $.isFunction(test.placeholder) ? test.placeholder(opts) : test.placeholder;
21425      } else if (test.fn === null) {
21426        if (pos > -1 && getMaskSet().validPositions[pos] === undefined) {
21427          var tests = getTests(pos),
21428              staticAlternations = [],
21429              prevTest;
21430
21431          if (tests.length > 1 + (tests[tests.length - 1].match.def === "" ? 1 : 0)) {
21432            for (var i = 0; i < tests.length; i++) {
21433              if (tests[i].match.optionality !== true && tests[i].match.optionalQuantifier !== true && (tests[i].match.fn === null || prevTest === undefined || tests[i].match.fn.test(prevTest.match.def, getMaskSet(), pos, true, opts) !== false)) {
21434                staticAlternations.push(tests[i]);
21435                if (tests[i].match.fn === null) prevTest = tests[i];
21436
21437                if (staticAlternations.length > 1) {
21438                  if (/[0-9a-bA-Z]/.test(staticAlternations[0].match.def)) {
21439                    return opts.placeholder.charAt(pos % opts.placeholder.length);
21440                  }
21441                }
21442              }
21443            }
21444          }
21445        }
21446
21447        return test.def;
21448      }
21449
21450      return opts.placeholder.charAt(pos % opts.placeholder.length);
21451    }
21452
21453    function HandleNativePlaceholder(npt, value) {
21454      if (ie) {
21455        if (npt.inputmask._valueGet() !== value && (npt.placeholder !== value || npt.placeholder === "")) {
21456          var buffer = getBuffer().slice(),
21457              nptValue = npt.inputmask._valueGet();
21458
21459          if (nptValue !== value) {
21460            var lvp = getLastValidPosition();
21461
21462            if (lvp === -1 && nptValue === getBufferTemplate().join("")) {
21463              buffer = [];
21464            } else if (lvp !== -1) {
21465              clearOptionalTail(buffer);
21466            }
21467
21468            writeBuffer(npt, buffer);
21469          }
21470        }
21471      } else if (npt.placeholder !== value) {
21472        npt.placeholder = value;
21473        if (npt.placeholder === "") npt.removeAttribute("placeholder");
21474      }
21475    }
21476
21477    var EventRuler = {
21478      on: function on(input, eventName, eventHandler) {
21479        var ev = function ev(e) {
21480          var that = this;
21481
21482          if (that.inputmask === undefined && this.nodeName !== "FORM") {
21483            var imOpts = $.data(that, "_inputmask_opts");
21484            if (imOpts) new Inputmask(imOpts).mask(that);else EventRuler.off(that);
21485          } else if (e.type !== "setvalue" && this.nodeName !== "FORM" && (that.disabled || that.readOnly && !(e.type === "keydown" && e.ctrlKey && e.keyCode === 67 || opts.tabThrough === false && e.keyCode === Inputmask.keyCode.TAB))) {
21486            e.preventDefault();
21487          } else {
21488            switch (e.type) {
21489              case "input":
21490                if (skipInputEvent === true) {
21491                  skipInputEvent = false;
21492                  return e.preventDefault();
21493                }
21494
21495                if (mobile) {
21496                  var args = arguments;
21497                  setTimeout(function () {
21498                    eventHandler.apply(that, args);
21499                    caret(that, that.inputmask.caretPos, undefined, true);
21500                  }, 0);
21501                  return false;
21502                }
21503
21504                break;
21505
21506              case "keydown":
21507                skipKeyPressEvent = false;
21508                skipInputEvent = false;
21509                break;
21510
21511              case "keypress":
21512                if (skipKeyPressEvent === true) {
21513                  return e.preventDefault();
21514                }
21515
21516                skipKeyPressEvent = true;
21517                break;
21518
21519              case "click":
21520                if (iemobile || iphone) {
21521                  var args = arguments;
21522                  setTimeout(function () {
21523                    eventHandler.apply(that, args);
21524                  }, 0);
21525                  return false;
21526                }
21527
21528                break;
21529            }
21530
21531            var returnVal = eventHandler.apply(that, arguments);
21532
21533            if (returnVal === false) {
21534              e.preventDefault();
21535              e.stopPropagation();
21536            }
21537
21538            return returnVal;
21539          }
21540        };
21541
21542        input.inputmask.events[eventName] = input.inputmask.events[eventName] || [];
21543        input.inputmask.events[eventName].push(ev);
21544
21545        if ($.inArray(eventName, ["submit", "reset"]) !== -1) {
21546          if (input.form !== null) $(input.form).on(eventName, ev);
21547        } else {
21548          $(input).on(eventName, ev);
21549        }
21550      },
21551      off: function off(input, event) {
21552        if (input.inputmask && input.inputmask.events) {
21553          var events;
21554
21555          if (event) {
21556            events = [];
21557            events[event] = input.inputmask.events[event];
21558          } else {
21559            events = input.inputmask.events;
21560          }
21561
21562          $.each(events, function (eventName, evArr) {
21563            while (evArr.length > 0) {
21564              var ev = evArr.pop();
21565
21566              if ($.inArray(eventName, ["submit", "reset"]) !== -1) {
21567                if (input.form !== null) $(input.form).off(eventName, ev);
21568              } else {
21569                $(input).off(eventName, ev);
21570              }
21571            }
21572
21573            delete input.inputmask.events[eventName];
21574          });
21575        }
21576      }
21577    };
21578    var EventHandlers = {
21579      keydownEvent: function keydownEvent(e) {
21580        var input = this,
21581            $input = $(input),
21582            k = e.keyCode,
21583            pos = caret(input);
21584
21585        if (k === Inputmask.keyCode.BACKSPACE || k === Inputmask.keyCode.DELETE || iphone && k === Inputmask.keyCode.BACKSPACE_SAFARI || e.ctrlKey && k === Inputmask.keyCode.X && !isInputEventSupported("cut")) {
21586          e.preventDefault();
21587          handleRemove(input, k, pos);
21588          writeBuffer(input, getBuffer(true), getMaskSet().p, e, input.inputmask._valueGet() !== getBuffer().join(""));
21589        } else if (k === Inputmask.keyCode.END || k === Inputmask.keyCode.PAGE_DOWN) {
21590          e.preventDefault();
21591          var caretPos = seekNext(getLastValidPosition());
21592          caret(input, e.shiftKey ? pos.begin : caretPos, caretPos, true);
21593        } else if (k === Inputmask.keyCode.HOME && !e.shiftKey || k === Inputmask.keyCode.PAGE_UP) {
21594          e.preventDefault();
21595          caret(input, 0, e.shiftKey ? pos.begin : 0, true);
21596        } else if ((opts.undoOnEscape && k === Inputmask.keyCode.ESCAPE || k === 90 && e.ctrlKey) && e.altKey !== true) {
21597          checkVal(input, true, false, undoValue.split(""));
21598          $input.trigger("click");
21599        } else if (k === Inputmask.keyCode.INSERT && !(e.shiftKey || e.ctrlKey)) {
21600          opts.insertMode = !opts.insertMode;
21601          input.setAttribute("im-insert", opts.insertMode);
21602        } else if (opts.tabThrough === true && k === Inputmask.keyCode.TAB) {
21603          if (e.shiftKey === true) {
21604            if (getTest(pos.begin).match.fn === null) {
21605              pos.begin = seekNext(pos.begin);
21606            }
21607
21608            pos.end = seekPrevious(pos.begin, true);
21609            pos.begin = seekPrevious(pos.end, true);
21610          } else {
21611            pos.begin = seekNext(pos.begin, true);
21612            pos.end = seekNext(pos.begin, true);
21613            if (pos.end < getMaskSet().maskLength) pos.end--;
21614          }
21615
21616          if (pos.begin < getMaskSet().maskLength) {
21617            e.preventDefault();
21618            caret(input, pos.begin, pos.end);
21619          }
21620        }
21621
21622        opts.onKeyDown.call(this, e, getBuffer(), caret(input).begin, opts);
21623        ignorable = $.inArray(k, opts.ignorables) !== -1;
21624      },
21625      keypressEvent: function keypressEvent(e, checkval, writeOut, strict, ndx) {
21626        var input = this,
21627            $input = $(input),
21628            k = e.which || e.charCode || e.keyCode;
21629
21630        if (checkval !== true && !(e.ctrlKey && e.altKey) && (e.ctrlKey || e.metaKey || ignorable)) {
21631          if (k === Inputmask.keyCode.ENTER && undoValue !== getBuffer().join("")) {
21632            undoValue = getBuffer().join("");
21633            setTimeout(function () {
21634              $input.trigger("change");
21635            }, 0);
21636          }
21637
21638          return true;
21639        } else {
21640          if (k) {
21641            if (k === 46 && e.shiftKey === false && opts.radixPoint !== "") k = opts.radixPoint.charCodeAt(0);
21642            var pos = checkval ? {
21643              begin: ndx,
21644              end: ndx
21645            } : caret(input),
21646                forwardPosition,
21647                c = String.fromCharCode(k),
21648                offset = 0;
21649
21650            if (opts._radixDance && opts.numericInput) {
21651              var caretPos = getBuffer().indexOf(opts.radixPoint.charAt(0)) + 1;
21652
21653              if (pos.begin <= caretPos) {
21654                if (k === opts.radixPoint.charCodeAt(0)) offset = 1;
21655                pos.begin -= 1;
21656                pos.end -= 1;
21657              }
21658            }
21659
21660            getMaskSet().writeOutBuffer = true;
21661            var valResult = isValid(pos, c, strict);
21662
21663            if (valResult !== false) {
21664              resetMaskSet(true);
21665              forwardPosition = valResult.caret !== undefined ? valResult.caret : seekNext(valResult.pos.begin ? valResult.pos.begin : valResult.pos);
21666              getMaskSet().p = forwardPosition;
21667            }
21668
21669            forwardPosition = (opts.numericInput && valResult.caret === undefined ? seekPrevious(forwardPosition) : forwardPosition) + offset;
21670
21671            if (writeOut !== false) {
21672              setTimeout(function () {
21673                opts.onKeyValidation.call(input, k, valResult, opts);
21674              }, 0);
21675
21676              if (getMaskSet().writeOutBuffer && valResult !== false) {
21677                var buffer = getBuffer();
21678                writeBuffer(input, buffer, forwardPosition, e, checkval !== true);
21679              }
21680            }
21681
21682            e.preventDefault();
21683
21684            if (checkval) {
21685              if (valResult !== false) valResult.forwardPosition = forwardPosition;
21686              return valResult;
21687            }
21688          }
21689        }
21690      },
21691      pasteEvent: function pasteEvent(e) {
21692        var input = this,
21693            ev = e.originalEvent || e,
21694            $input = $(input),
21695            inputValue = input.inputmask._valueGet(true),
21696            caretPos = caret(input),
21697            tempValue;
21698
21699        if (isRTL) {
21700          tempValue = caretPos.end;
21701          caretPos.end = caretPos.begin;
21702          caretPos.begin = tempValue;
21703        }
21704
21705        var valueBeforeCaret = inputValue.substr(0, caretPos.begin),
21706            valueAfterCaret = inputValue.substr(caretPos.end, inputValue.length);
21707        if (valueBeforeCaret === (isRTL ? getBufferTemplate().reverse() : getBufferTemplate()).slice(0, caretPos.begin).join("")) valueBeforeCaret = "";
21708        if (valueAfterCaret === (isRTL ? getBufferTemplate().reverse() : getBufferTemplate()).slice(caretPos.end).join("")) valueAfterCaret = "";
21709
21710        if (window.clipboardData && window.clipboardData.getData) {
21711          inputValue = valueBeforeCaret + window.clipboardData.getData("Text") + valueAfterCaret;
21712        } else if (ev.clipboardData && ev.clipboardData.getData) {
21713          inputValue = valueBeforeCaret + ev.clipboardData.getData("text/plain") + valueAfterCaret;
21714        } else return true;
21715
21716        var pasteValue = inputValue;
21717
21718        if ($.isFunction(opts.onBeforePaste)) {
21719          pasteValue = opts.onBeforePaste.call(inputmask, inputValue, opts);
21720
21721          if (pasteValue === false) {
21722            return e.preventDefault();
21723          }
21724
21725          if (!pasteValue) {
21726            pasteValue = inputValue;
21727          }
21728        }
21729
21730        checkVal(input, false, false, pasteValue.toString().split(""));
21731        writeBuffer(input, getBuffer(), seekNext(getLastValidPosition()), e, undoValue !== getBuffer().join(""));
21732        return e.preventDefault();
21733      },
21734      inputFallBackEvent: function inputFallBackEvent(e) {
21735        function radixPointHandler(input, inputValue, caretPos) {
21736          if (inputValue.charAt(caretPos.begin - 1) === "." && opts.radixPoint !== "") {
21737            inputValue = inputValue.split("");
21738            inputValue[caretPos.begin - 1] = opts.radixPoint.charAt(0);
21739            inputValue = inputValue.join("");
21740          }
21741
21742          return inputValue;
21743        }
21744
21745        function ieMobileHandler(input, inputValue, caretPos) {
21746          if (iemobile) {
21747            var inputChar = inputValue.replace(getBuffer().join(""), "");
21748
21749            if (inputChar.length === 1) {
21750              var iv = inputValue.split("");
21751              iv.splice(caretPos.begin, 0, inputChar);
21752              inputValue = iv.join("");
21753            }
21754          }
21755
21756          return inputValue;
21757        }
21758
21759        var input = this,
21760            inputValue = input.inputmask._valueGet();
21761
21762        if (getBuffer().join("") !== inputValue) {
21763          var caretPos = caret(input);
21764          inputValue = radixPointHandler(input, inputValue, caretPos);
21765          inputValue = ieMobileHandler(input, inputValue, caretPos);
21766
21767          if (getBuffer().join("") !== inputValue) {
21768            var buffer = getBuffer().join(""),
21769                offset = !opts.numericInput && inputValue.length > buffer.length ? -1 : 0,
21770                frontPart = inputValue.substr(0, caretPos.begin),
21771                backPart = inputValue.substr(caretPos.begin),
21772                frontBufferPart = buffer.substr(0, caretPos.begin + offset),
21773                backBufferPart = buffer.substr(caretPos.begin + offset);
21774            var selection = caretPos,
21775                entries = "",
21776                isEntry = false;
21777
21778            if (frontPart !== frontBufferPart) {
21779              var fpl = (isEntry = frontPart.length >= frontBufferPart.length) ? frontPart.length : frontBufferPart.length,
21780                  i;
21781
21782              for (i = 0; frontPart.charAt(i) === frontBufferPart.charAt(i) && i < fpl; i++) {
21783                ;
21784              }
21785
21786              if (isEntry) {
21787                selection.begin = i - offset;
21788                entries += frontPart.slice(i, selection.end);
21789              }
21790            }
21791
21792            if (backPart !== backBufferPart) {
21793              if (backPart.length > backBufferPart.length) {
21794                entries += backPart.slice(0, 1);
21795              } else {
21796                if (backPart.length < backBufferPart.length) {
21797                  selection.end += backBufferPart.length - backPart.length;
21798
21799                  if (!isEntry && opts.radixPoint !== "" && backPart === "" && frontPart.charAt(selection.begin + offset - 1) === opts.radixPoint) {
21800                    selection.begin--;
21801                    entries = opts.radixPoint;
21802                  }
21803                }
21804              }
21805            }
21806
21807            writeBuffer(input, getBuffer(), {
21808              begin: selection.begin + offset,
21809              end: selection.end + offset
21810            });
21811
21812            if (entries.length > 0) {
21813              $.each(entries.split(""), function (ndx, entry) {
21814                var keypress = new $.Event("keypress");
21815                keypress.which = entry.charCodeAt(0);
21816                ignorable = false;
21817                EventHandlers.keypressEvent.call(input, keypress);
21818              });
21819            } else {
21820              if (selection.begin === selection.end - 1) {
21821                selection.begin = seekPrevious(selection.begin + 1);
21822
21823                if (selection.begin === selection.end - 1) {
21824                  caret(input, selection.begin);
21825                } else {
21826                  caret(input, selection.begin, selection.end);
21827                }
21828              }
21829
21830              var keydown = new $.Event("keydown");
21831              keydown.keyCode = opts.numericInput ? Inputmask.keyCode.BACKSPACE : Inputmask.keyCode.DELETE;
21832              EventHandlers.keydownEvent.call(input, keydown);
21833            }
21834
21835            e.preventDefault();
21836          }
21837        }
21838      },
21839      beforeInputEvent: function beforeInputEvent(e) {
21840        if (e.cancelable) {
21841          var input = this;
21842
21843          switch (e.inputType) {
21844            case "insertText":
21845              $.each(e.data.split(""), function (ndx, entry) {
21846                var keypress = new $.Event("keypress");
21847                keypress.which = entry.charCodeAt(0);
21848                ignorable = false;
21849                EventHandlers.keypressEvent.call(input, keypress);
21850              });
21851              return e.preventDefault();
21852
21853            case "deleteContentBackward":
21854              var keydown = new $.Event("keydown");
21855              keydown.keyCode = Inputmask.keyCode.BACKSPACE;
21856              EventHandlers.keydownEvent.call(input, keydown);
21857              return e.preventDefault();
21858
21859            case "deleteContentForward":
21860              var keydown = new $.Event("keydown");
21861              keydown.keyCode = Inputmask.keyCode.DELETE;
21862              EventHandlers.keydownEvent.call(input, keydown);
21863              return e.preventDefault();
21864          }
21865        }
21866      },
21867      setValueEvent: function setValueEvent(e) {
21868        this.inputmask.refreshValue = false;
21869
21870        var input = this,
21871            value = e && e.detail ? e.detail[0] : arguments[1],
21872            value = value || input.inputmask._valueGet(true);
21873
21874        if ($.isFunction(opts.onBeforeMask)) value = opts.onBeforeMask.call(inputmask, value, opts) || value;
21875        value = value.split("");
21876        checkVal(input, true, false, value);
21877        undoValue = getBuffer().join("");
21878
21879        if ((opts.clearMaskOnLostFocus || opts.clearIncomplete) && input.inputmask._valueGet() === getBufferTemplate().join("")) {
21880          input.inputmask._valueSet("");
21881        }
21882      },
21883      focusEvent: function focusEvent(e) {
21884        var input = this,
21885            nptValue = input.inputmask._valueGet();
21886
21887        if (opts.showMaskOnFocus) {
21888          if (nptValue !== getBuffer().join("")) {
21889            writeBuffer(input, getBuffer(), seekNext(getLastValidPosition()));
21890          } else if (mouseEnter === false) {
21891            caret(input, seekNext(getLastValidPosition()));
21892          }
21893        }
21894
21895        if (opts.positionCaretOnTab === true && mouseEnter === false) {
21896          EventHandlers.clickEvent.apply(input, [e, true]);
21897        }
21898
21899        undoValue = getBuffer().join("");
21900      },
21901      mouseleaveEvent: function mouseleaveEvent(e) {
21902        var input = this;
21903        mouseEnter = false;
21904
21905        if (opts.clearMaskOnLostFocus && document.activeElement !== input) {
21906          HandleNativePlaceholder(input, originalPlaceholder);
21907        }
21908      },
21909      clickEvent: function clickEvent(e, tabbed) {
21910        function doRadixFocus(clickPos) {
21911          if (opts.radixPoint !== "") {
21912            var vps = getMaskSet().validPositions;
21913
21914            if (vps[clickPos] === undefined || vps[clickPos].input === getPlaceholder(clickPos)) {
21915              if (clickPos < seekNext(-1)) return true;
21916              var radixPos = $.inArray(opts.radixPoint, getBuffer());
21917
21918              if (radixPos !== -1) {
21919                for (var vp in vps) {
21920                  if (radixPos < vp && vps[vp].input !== getPlaceholder(vp)) {
21921                    return false;
21922                  }
21923                }
21924
21925                return true;
21926              }
21927            }
21928          }
21929
21930          return false;
21931        }
21932
21933        var input = this;
21934        setTimeout(function () {
21935          if (document.activeElement === input) {
21936            var selectedCaret = caret(input);
21937
21938            if (tabbed) {
21939              if (isRTL) {
21940                selectedCaret.end = selectedCaret.begin;
21941              } else {
21942                selectedCaret.begin = selectedCaret.end;
21943              }
21944            }
21945
21946            if (selectedCaret.begin === selectedCaret.end) {
21947              switch (opts.positionCaretOnClick) {
21948                case "none":
21949                  break;
21950
21951                case "select":
21952                  caret(input, 0, getBuffer().length);
21953                  break;
21954
21955                case "ignore":
21956                  caret(input, seekNext(getLastValidPosition()));
21957                  break;
21958
21959                case "radixFocus":
21960                  if (doRadixFocus(selectedCaret.begin)) {
21961                    var radixPos = getBuffer().join("").indexOf(opts.radixPoint);
21962                    caret(input, opts.numericInput ? seekNext(radixPos) : radixPos);
21963                    break;
21964                  }
21965
21966                default:
21967                  var clickPosition = selectedCaret.begin,
21968                      lvclickPosition = getLastValidPosition(clickPosition, true),
21969                      lastPosition = seekNext(lvclickPosition);
21970
21971                  if (clickPosition < lastPosition) {
21972                    caret(input, !isMask(clickPosition, true) && !isMask(clickPosition - 1, true) ? seekNext(clickPosition) : clickPosition);
21973                  } else {
21974                    var lvp = getMaskSet().validPositions[lvclickPosition],
21975                        tt = getTestTemplate(lastPosition, lvp ? lvp.match.locator : undefined, lvp),
21976                        placeholder = getPlaceholder(lastPosition, tt.match);
21977
21978                    if (placeholder !== "" && getBuffer()[lastPosition] !== placeholder && tt.match.optionalQuantifier !== true && tt.match.newBlockMarker !== true || !isMask(lastPosition, opts.keepStatic) && tt.match.def === placeholder) {
21979                      var newPos = seekNext(lastPosition);
21980
21981                      if (clickPosition >= newPos || clickPosition === lastPosition) {
21982                        lastPosition = newPos;
21983                      }
21984                    }
21985
21986                    caret(input, lastPosition);
21987                  }
21988
21989                  break;
21990              }
21991            }
21992          }
21993        }, 0);
21994      },
21995      cutEvent: function cutEvent(e) {
21996        var input = this,
21997            $input = $(input),
21998            pos = caret(input),
21999            ev = e.originalEvent || e;
22000        var clipboardData = window.clipboardData || ev.clipboardData,
22001            clipData = isRTL ? getBuffer().slice(pos.end, pos.begin) : getBuffer().slice(pos.begin, pos.end);
22002        clipboardData.setData("text", isRTL ? clipData.reverse().join("") : clipData.join(""));
22003        if (document.execCommand) document.execCommand("copy");
22004        handleRemove(input, Inputmask.keyCode.DELETE, pos);
22005        writeBuffer(input, getBuffer(), getMaskSet().p, e, undoValue !== getBuffer().join(""));
22006      },
22007      blurEvent: function blurEvent(e) {
22008        var $input = $(this),
22009            input = this;
22010
22011        if (input.inputmask) {
22012          HandleNativePlaceholder(input, originalPlaceholder);
22013
22014          var nptValue = input.inputmask._valueGet(),
22015              buffer = getBuffer().slice();
22016
22017          if (nptValue !== "" || colorMask !== undefined) {
22018            if (opts.clearMaskOnLostFocus) {
22019              if (getLastValidPosition() === -1 && nptValue === getBufferTemplate().join("")) {
22020                buffer = [];
22021              } else {
22022                clearOptionalTail(buffer);
22023              }
22024            }
22025
22026            if (isComplete(buffer) === false) {
22027              setTimeout(function () {
22028                $input.trigger("incomplete");
22029              }, 0);
22030
22031              if (opts.clearIncomplete) {
22032                resetMaskSet();
22033
22034                if (opts.clearMaskOnLostFocus) {
22035                  buffer = [];
22036                } else {
22037                  buffer = getBufferTemplate().slice();
22038                }
22039              }
22040            }
22041
22042            writeBuffer(input, buffer, undefined, e);
22043          }
22044
22045          if (undoValue !== getBuffer().join("")) {
22046            undoValue = buffer.join("");
22047            $input.trigger("change");
22048          }
22049        }
22050      },
22051      mouseenterEvent: function mouseenterEvent(e) {
22052        var input = this;
22053        mouseEnter = true;
22054
22055        if (document.activeElement !== input && opts.showMaskOnHover) {
22056          HandleNativePlaceholder(input, (isRTL ? getBuffer().slice().reverse() : getBuffer()).join(""));
22057        }
22058      },
22059      submitEvent: function submitEvent(e) {
22060        if (undoValue !== getBuffer().join("")) {
22061          $el.trigger("change");
22062        }
22063
22064        if (opts.clearMaskOnLostFocus && getLastValidPosition() === -1 && el.inputmask._valueGet && el.inputmask._valueGet() === getBufferTemplate().join("")) {
22065          el.inputmask._valueSet("");
22066        }
22067
22068        if (opts.clearIncomplete && isComplete(getBuffer()) === false) {
22069          el.inputmask._valueSet("");
22070        }
22071
22072        if (opts.removeMaskOnSubmit) {
22073          el.inputmask._valueSet(el.inputmask.unmaskedvalue(), true);
22074
22075          setTimeout(function () {
22076            writeBuffer(el, getBuffer());
22077          }, 0);
22078        }
22079      },
22080      resetEvent: function resetEvent(e) {
22081        el.inputmask.refreshValue = true;
22082        setTimeout(function () {
22083          $el.trigger("setvalue");
22084        }, 0);
22085      }
22086    };
22087
22088    function checkVal(input, writeOut, strict, nptvl, initiatingEvent) {
22089      var inputmask = this || input.inputmask,
22090          inputValue = nptvl.slice(),
22091          charCodes = "",
22092          initialNdx = -1,
22093          result = undefined;
22094
22095      function isTemplateMatch(ndx, charCodes) {
22096        var charCodeNdx = getMaskTemplate(true, 0, false).slice(ndx, seekNext(ndx)).join("").replace(/'/g, "").indexOf(charCodes);
22097        return charCodeNdx !== -1 && !isMask(ndx) && (getTest(ndx).match.nativeDef === charCodes.charAt(0) || getTest(ndx).match.fn === null && getTest(ndx).match.nativeDef === "'" + charCodes.charAt(0) || getTest(ndx).match.nativeDef === " " && (getTest(ndx + 1).match.nativeDef === charCodes.charAt(0) || getTest(ndx + 1).match.fn === null && getTest(ndx + 1).match.nativeDef === "'" + charCodes.charAt(0)));
22098      }
22099
22100      resetMaskSet();
22101
22102      if (!strict && opts.autoUnmask !== true) {
22103        var staticInput = getBufferTemplate().slice(0, seekNext(-1)).join(""),
22104            matches = inputValue.join("").match(new RegExp("^" + Inputmask.escapeRegex(staticInput), "g"));
22105
22106        if (matches && matches.length > 0) {
22107          inputValue.splice(0, matches.length * staticInput.length);
22108          initialNdx = seekNext(initialNdx);
22109        }
22110      } else {
22111        initialNdx = seekNext(initialNdx);
22112      }
22113
22114      if (initialNdx === -1) {
22115        getMaskSet().p = seekNext(initialNdx);
22116        initialNdx = 0;
22117      } else getMaskSet().p = initialNdx;
22118
22119      inputmask.caretPos = {
22120        begin: initialNdx
22121      };
22122      $.each(inputValue, function (ndx, charCode) {
22123        if (charCode !== undefined) {
22124          if (getMaskSet().validPositions[ndx] === undefined && inputValue[ndx] === getPlaceholder(ndx) && isMask(ndx, true) && isValid(ndx, inputValue[ndx], true, undefined, undefined, true) === false) {
22125            getMaskSet().p++;
22126          } else {
22127            var keypress = new $.Event("_checkval");
22128            keypress.which = charCode.charCodeAt(0);
22129            charCodes += charCode;
22130            var lvp = getLastValidPosition(undefined, true);
22131
22132            if (!isTemplateMatch(initialNdx, charCodes)) {
22133              result = EventHandlers.keypressEvent.call(input, keypress, true, false, strict, inputmask.caretPos.begin);
22134
22135              if (result) {
22136                initialNdx = inputmask.caretPos.begin + 1;
22137                charCodes = "";
22138              }
22139            } else {
22140              result = EventHandlers.keypressEvent.call(input, keypress, true, false, strict, lvp + 1);
22141            }
22142
22143            if (result) {
22144              writeBuffer(undefined, getBuffer(), result.forwardPosition, keypress, false);
22145              inputmask.caretPos = {
22146                begin: result.forwardPosition,
22147                end: result.forwardPosition
22148              };
22149            }
22150          }
22151        }
22152      });
22153      if (writeOut) writeBuffer(input, getBuffer(), result ? result.forwardPosition : undefined, initiatingEvent || new $.Event("checkval"), initiatingEvent && initiatingEvent.type === "input");
22154    }
22155
22156    function unmaskedvalue(input) {
22157      if (input) {
22158        if (input.inputmask === undefined) {
22159          return input.value;
22160        }
22161
22162        if (input.inputmask && input.inputmask.refreshValue) {
22163          EventHandlers.setValueEvent.call(input);
22164        }
22165      }
22166
22167      var umValue = [],
22168          vps = getMaskSet().validPositions;
22169
22170      for (var pndx in vps) {
22171        if (vps[pndx].match && vps[pndx].match.fn != null) {
22172          umValue.push(vps[pndx].input);
22173        }
22174      }
22175
22176      var unmaskedValue = umValue.length === 0 ? "" : (isRTL ? umValue.reverse() : umValue).join("");
22177
22178      if ($.isFunction(opts.onUnMask)) {
22179        var bufferValue = (isRTL ? getBuffer().slice().reverse() : getBuffer()).join("");
22180        unmaskedValue = opts.onUnMask.call(inputmask, bufferValue, unmaskedValue, opts);
22181      }
22182
22183      return unmaskedValue;
22184    }
22185
22186    function caret(input, begin, end, notranslate) {
22187      function translatePosition(pos) {
22188        if (isRTL && typeof pos === "number" && (!opts.greedy || opts.placeholder !== "") && el) {
22189          pos = el.inputmask._valueGet().length - pos;
22190        }
22191
22192        return pos;
22193      }
22194
22195      var range;
22196
22197      if (begin !== undefined) {
22198        if ($.isArray(begin)) {
22199          end = isRTL ? begin[0] : begin[1];
22200          begin = isRTL ? begin[1] : begin[0];
22201        }
22202
22203        if (begin.begin !== undefined) {
22204          end = isRTL ? begin.begin : begin.end;
22205          begin = isRTL ? begin.end : begin.begin;
22206        }
22207
22208        if (typeof begin === "number") {
22209          begin = notranslate ? begin : translatePosition(begin);
22210          end = notranslate ? end : translatePosition(end);
22211          end = typeof end == "number" ? end : begin;
22212          var scrollCalc = parseInt(((input.ownerDocument.defaultView || window).getComputedStyle ? (input.ownerDocument.defaultView || window).getComputedStyle(input, null) : input.currentStyle).fontSize) * end;
22213          input.scrollLeft = scrollCalc > input.scrollWidth ? scrollCalc : 0;
22214          input.inputmask.caretPos = {
22215            begin: begin,
22216            end: end
22217          };
22218
22219          if (input === document.activeElement) {
22220            if ("selectionStart" in input) {
22221              input.selectionStart = begin;
22222              input.selectionEnd = end;
22223            } else if (window.getSelection) {
22224              range = document.createRange();
22225
22226              if (input.firstChild === undefined || input.firstChild === null) {
22227                var textNode = document.createTextNode("");
22228                input.appendChild(textNode);
22229              }
22230
22231              range.setStart(input.firstChild, begin < input.inputmask._valueGet().length ? begin : input.inputmask._valueGet().length);
22232              range.setEnd(input.firstChild, end < input.inputmask._valueGet().length ? end : input.inputmask._valueGet().length);
22233              range.collapse(true);
22234              var sel = window.getSelection();
22235              sel.removeAllRanges();
22236              sel.addRange(range);
22237            } else if (input.createTextRange) {
22238              range = input.createTextRange();
22239              range.collapse(true);
22240              range.moveEnd("character", end);
22241              range.moveStart("character", begin);
22242              range.select();
22243            }
22244
22245            renderColorMask(input, {
22246              begin: begin,
22247              end: end
22248            });
22249          }
22250        }
22251      } else {
22252        if ("selectionStart" in input) {
22253          begin = input.selectionStart;
22254          end = input.selectionEnd;
22255        } else if (window.getSelection) {
22256          range = window.getSelection().getRangeAt(0);
22257
22258          if (range.commonAncestorContainer.parentNode === input || range.commonAncestorContainer === input) {
22259            begin = range.startOffset;
22260            end = range.endOffset;
22261          }
22262        } else if (document.selection && document.selection.createRange) {
22263          range = document.selection.createRange();
22264          begin = 0 - range.duplicate().moveStart("character", -input.inputmask._valueGet().length);
22265          end = begin + range.text.length;
22266        }
22267
22268        return {
22269          begin: notranslate ? begin : translatePosition(begin),
22270          end: notranslate ? end : translatePosition(end)
22271        };
22272      }
22273    }
22274
22275    function determineLastRequiredPosition(returnDefinition) {
22276      var buffer = getMaskTemplate(true, getLastValidPosition(), true, true),
22277          bl = buffer.length,
22278          pos,
22279          lvp = getLastValidPosition(),
22280          positions = {},
22281          lvTest = getMaskSet().validPositions[lvp],
22282          ndxIntlzr = lvTest !== undefined ? lvTest.locator.slice() : undefined,
22283          testPos;
22284
22285      for (pos = lvp + 1; pos < buffer.length; pos++) {
22286        testPos = getTestTemplate(pos, ndxIntlzr, pos - 1);
22287        ndxIntlzr = testPos.locator.slice();
22288        positions[pos] = $.extend(true, {}, testPos);
22289      }
22290
22291      var lvTestAlt = lvTest && lvTest.alternation !== undefined ? lvTest.locator[lvTest.alternation] : undefined;
22292
22293      for (pos = bl - 1; pos > lvp; pos--) {
22294        testPos = positions[pos];
22295
22296        if ((testPos.match.optionality || testPos.match.optionalQuantifier && testPos.match.newBlockMarker || lvTestAlt && (lvTestAlt !== positions[pos].locator[lvTest.alternation] && testPos.match.fn != null || testPos.match.fn === null && testPos.locator[lvTest.alternation] && checkAlternationMatch(testPos.locator[lvTest.alternation].toString().split(","), lvTestAlt.toString().split(",")) && getTests(pos)[0].def !== "")) && buffer[pos] === getPlaceholder(pos, testPos.match)) {
22297          bl--;
22298        } else break;
22299      }
22300
22301      return returnDefinition ? {
22302        l: bl,
22303        def: positions[bl] ? positions[bl].match : undefined
22304      } : bl;
22305    }
22306
22307    function clearOptionalTail(buffer) {
22308      buffer.length = 0;
22309      var template = getMaskTemplate(true, 0, true, undefined, true),
22310          lmnt,
22311          validPos;
22312
22313      while (lmnt = template.shift(), lmnt !== undefined) {
22314        buffer.push(lmnt);
22315      }
22316
22317      return buffer;
22318    }
22319
22320    function isComplete(buffer) {
22321      if ($.isFunction(opts.isComplete)) return opts.isComplete(buffer, opts);
22322      if (opts.repeat === "*") return undefined;
22323      var complete = false,
22324          lrp = determineLastRequiredPosition(true),
22325          aml = seekPrevious(lrp.l);
22326
22327      if (lrp.def === undefined || lrp.def.newBlockMarker || lrp.def.optionality || lrp.def.optionalQuantifier) {
22328        complete = true;
22329
22330        for (var i = 0; i <= aml; i++) {
22331          var test = getTestTemplate(i).match;
22332
22333          if (test.fn !== null && getMaskSet().validPositions[i] === undefined && test.optionality !== true && test.optionalQuantifier !== true || test.fn === null && buffer[i] !== getPlaceholder(i, test)) {
22334            complete = false;
22335            break;
22336          }
22337        }
22338      }
22339
22340      return complete;
22341    }
22342
22343    function handleRemove(input, k, pos, strict, fromIsValid) {
22344      if (opts.numericInput || isRTL) {
22345        if (k === Inputmask.keyCode.BACKSPACE) {
22346          k = Inputmask.keyCode.DELETE;
22347        } else if (k === Inputmask.keyCode.DELETE) {
22348          k = Inputmask.keyCode.BACKSPACE;
22349        }
22350
22351        if (isRTL) {
22352          var pend = pos.end;
22353          pos.end = pos.begin;
22354          pos.begin = pend;
22355        }
22356      }
22357
22358      if (k === Inputmask.keyCode.BACKSPACE && pos.end - pos.begin < 1) {
22359        pos.begin = seekPrevious(pos.begin);
22360
22361        if (getMaskSet().validPositions[pos.begin] !== undefined && getMaskSet().validPositions[pos.begin].input === opts.groupSeparator) {
22362          pos.begin--;
22363        }
22364      } else if (k === Inputmask.keyCode.DELETE && pos.begin === pos.end) {
22365        pos.end = isMask(pos.end, true) && getMaskSet().validPositions[pos.end] && getMaskSet().validPositions[pos.end].input !== opts.radixPoint ? pos.end + 1 : seekNext(pos.end) + 1;
22366
22367        if (getMaskSet().validPositions[pos.begin] !== undefined && getMaskSet().validPositions[pos.begin].input === opts.groupSeparator) {
22368          pos.end++;
22369        }
22370      }
22371
22372      revalidateMask(pos);
22373
22374      if (strict !== true && opts.keepStatic !== false || opts.regex !== null) {
22375        var result = alternate(true);
22376
22377        if (result) {
22378          var newPos = result.caret !== undefined ? result.caret : result.pos ? seekNext(result.pos.begin ? result.pos.begin : result.pos) : getLastValidPosition(-1, true);
22379
22380          if (k !== Inputmask.keyCode.DELETE || pos.begin > newPos) {
22381            pos.begin == newPos;
22382          }
22383        }
22384      }
22385
22386      var lvp = getLastValidPosition(pos.begin, true);
22387
22388      if (lvp < pos.begin || pos.begin === -1) {
22389        getMaskSet().p = seekNext(lvp);
22390      } else if (strict !== true) {
22391        getMaskSet().p = pos.begin;
22392
22393        if (fromIsValid !== true) {
22394          while (getMaskSet().p < lvp && getMaskSet().validPositions[getMaskSet().p] === undefined) {
22395            getMaskSet().p++;
22396          }
22397        }
22398      }
22399    }
22400
22401    function initializeColorMask(input) {
22402      var computedStyle = (input.ownerDocument.defaultView || window).getComputedStyle(input, null);
22403
22404      function findCaretPos(clientx) {
22405        var e = document.createElement("span"),
22406            caretPos;
22407
22408        for (var style in computedStyle) {
22409          if (isNaN(style) && style.indexOf("font") !== -1) {
22410            e.style[style] = computedStyle[style];
22411          }
22412        }
22413
22414        e.style.textTransform = computedStyle.textTransform;
22415        e.style.letterSpacing = computedStyle.letterSpacing;
22416        e.style.position = "absolute";
22417        e.style.height = "auto";
22418        e.style.width = "auto";
22419        e.style.visibility = "hidden";
22420        e.style.whiteSpace = "nowrap";
22421        document.body.appendChild(e);
22422
22423        var inputText = input.inputmask._valueGet(),
22424            previousWidth = 0,
22425            itl;
22426
22427        for (caretPos = 0, itl = inputText.length; caretPos <= itl; caretPos++) {
22428          e.innerHTML += inputText.charAt(caretPos) || "_";
22429
22430          if (e.offsetWidth >= clientx) {
22431            var offset1 = clientx - previousWidth;
22432            var offset2 = e.offsetWidth - clientx;
22433            e.innerHTML = inputText.charAt(caretPos);
22434            offset1 -= e.offsetWidth / 3;
22435            caretPos = offset1 < offset2 ? caretPos - 1 : caretPos;
22436            break;
22437          }
22438
22439          previousWidth = e.offsetWidth;
22440        }
22441
22442        document.body.removeChild(e);
22443        return caretPos;
22444      }
22445
22446      var template = document.createElement("div");
22447      template.style.width = computedStyle.width;
22448      template.style.textAlign = computedStyle.textAlign;
22449      colorMask = document.createElement("div");
22450      input.inputmask.colorMask = colorMask;
22451      colorMask.className = "im-colormask";
22452      input.parentNode.insertBefore(colorMask, input);
22453      input.parentNode.removeChild(input);
22454      colorMask.appendChild(input);
22455      colorMask.appendChild(template);
22456      input.style.left = template.offsetLeft + "px";
22457      $(colorMask).on("mouseleave", function (e) {
22458        return EventHandlers.mouseleaveEvent.call(input, [e]);
22459      });
22460      $(colorMask).on("mouseenter", function (e) {
22461        return EventHandlers.mouseenterEvent.call(input, [e]);
22462      });
22463      $(colorMask).on("click", function (e) {
22464        caret(input, findCaretPos(e.clientX));
22465        return EventHandlers.clickEvent.call(input, [e]);
22466      });
22467    }
22468
22469    Inputmask.prototype.positionColorMask = function (input, template) {
22470      input.style.left = template.offsetLeft + "px";
22471    };
22472
22473    function renderColorMask(input, caretPos, clear) {
22474      var maskTemplate = [],
22475          isStatic = false,
22476          test,
22477          testPos,
22478          ndxIntlzr,
22479          pos = 0;
22480
22481      function setEntry(entry) {
22482        if (entry === undefined) entry = "";
22483
22484        if (!isStatic && (test.fn === null || testPos.input === undefined)) {
22485          isStatic = true;
22486          maskTemplate.push("<span class='im-static'>" + entry);
22487        } else if (isStatic && (test.fn !== null && testPos.input !== undefined || test.def === "")) {
22488          isStatic = false;
22489          var mtl = maskTemplate.length;
22490          maskTemplate[mtl - 1] = maskTemplate[mtl - 1] + "</span>";
22491          maskTemplate.push(entry);
22492        } else maskTemplate.push(entry);
22493      }
22494
22495      function setCaret() {
22496        if (document.activeElement === input) {
22497          maskTemplate.splice(caretPos.begin, 0, caretPos.begin === caretPos.end || caretPos.end > getMaskSet().maskLength ? '<mark class="im-caret" style="border-right-width: 1px;border-right-style: solid;">' : '<mark class="im-caret-select">');
22498          maskTemplate.splice(caretPos.end + 1, 0, "</mark>");
22499        }
22500      }
22501
22502      if (colorMask !== undefined) {
22503        var buffer = getBuffer();
22504
22505        if (caretPos === undefined) {
22506          caretPos = caret(input);
22507        } else if (caretPos.begin === undefined) {
22508          caretPos = {
22509            begin: caretPos,
22510            end: caretPos
22511          };
22512        }
22513
22514        if (clear !== true) {
22515          var lvp = getLastValidPosition();
22516
22517          do {
22518            if (getMaskSet().validPositions[pos]) {
22519              testPos = getMaskSet().validPositions[pos];
22520              test = testPos.match;
22521              ndxIntlzr = testPos.locator.slice();
22522              setEntry(buffer[pos]);
22523            } else {
22524              testPos = getTestTemplate(pos, ndxIntlzr, pos - 1);
22525              test = testPos.match;
22526              ndxIntlzr = testPos.locator.slice();
22527
22528              if (opts.jitMasking === false || pos < lvp || typeof opts.jitMasking === "number" && isFinite(opts.jitMasking) && opts.jitMasking > pos) {
22529                setEntry(getPlaceholder(pos, test));
22530              } else isStatic = false;
22531            }
22532
22533            pos++;
22534          } while ((maxLength === undefined || pos < maxLength) && (test.fn !== null || test.def !== "") || lvp > pos || isStatic);
22535
22536          if (isStatic) setEntry();
22537          setCaret();
22538        }
22539
22540        var template = colorMask.getElementsByTagName("div")[0];
22541        template.innerHTML = maskTemplate.join("");
22542        input.inputmask.positionColorMask(input, template);
22543      }
22544    }
22545
22546    function mask(elem) {
22547      function isElementTypeSupported(input, opts) {
22548        function patchValueProperty(npt) {
22549          var valueGet;
22550          var valueSet;
22551
22552          function patchValhook(type) {
22553            if ($.valHooks && ($.valHooks[type] === undefined || $.valHooks[type].inputmaskpatch !== true)) {
22554              var valhookGet = $.valHooks[type] && $.valHooks[type].get ? $.valHooks[type].get : function (elem) {
22555                return elem.value;
22556              };
22557              var valhookSet = $.valHooks[type] && $.valHooks[type].set ? $.valHooks[type].set : function (elem, value) {
22558                elem.value = value;
22559                return elem;
22560              };
22561              $.valHooks[type] = {
22562                get: function get(elem) {
22563                  if (elem.inputmask) {
22564                    if (elem.inputmask.opts.autoUnmask) {
22565                      return elem.inputmask.unmaskedvalue();
22566                    } else {
22567                      var result = valhookGet(elem);
22568                      return getLastValidPosition(undefined, undefined, elem.inputmask.maskset.validPositions) !== -1 || opts.nullable !== true ? result : "";
22569                    }
22570                  } else return valhookGet(elem);
22571                },
22572                set: function set(elem, value) {
22573                  var $elem = $(elem),
22574                      result;
22575                  result = valhookSet(elem, value);
22576
22577                  if (elem.inputmask) {
22578                    $elem.trigger("setvalue", [value]);
22579                  }
22580
22581                  return result;
22582                },
22583                inputmaskpatch: true
22584              };
22585            }
22586          }
22587
22588          function getter() {
22589            if (this.inputmask) {
22590              return this.inputmask.opts.autoUnmask ? this.inputmask.unmaskedvalue() : getLastValidPosition() !== -1 || opts.nullable !== true ? document.activeElement === this && opts.clearMaskOnLostFocus ? (isRTL ? clearOptionalTail(getBuffer().slice()).reverse() : clearOptionalTail(getBuffer().slice())).join("") : valueGet.call(this) : "";
22591            } else return valueGet.call(this);
22592          }
22593
22594          function setter(value) {
22595            valueSet.call(this, value);
22596
22597            if (this.inputmask) {
22598              $(this).trigger("setvalue", [value]);
22599            }
22600          }
22601
22602          function installNativeValueSetFallback(npt) {
22603            EventRuler.on(npt, "mouseenter", function (event) {
22604              var $input = $(this),
22605                  input = this,
22606                  value = input.inputmask._valueGet();
22607
22608              if (value !== getBuffer().join("")) {
22609                $input.trigger("setvalue");
22610              }
22611            });
22612          }
22613
22614          if (!npt.inputmask.__valueGet) {
22615            if (opts.noValuePatching !== true) {
22616              if (Object.getOwnPropertyDescriptor) {
22617                if (typeof Object.getPrototypeOf !== "function") {
22618                  Object.getPrototypeOf = _typeof("test".__proto__) === "object" ? function (object) {
22619                    return object.__proto__;
22620                  } : function (object) {
22621                    return object.constructor.prototype;
22622                  };
22623                }
22624
22625                var valueProperty = Object.getPrototypeOf ? Object.getOwnPropertyDescriptor(Object.getPrototypeOf(npt), "value") : undefined;
22626
22627                if (valueProperty && valueProperty.get && valueProperty.set) {
22628                  valueGet = valueProperty.get;
22629                  valueSet = valueProperty.set;
22630                  Object.defineProperty(npt, "value", {
22631                    get: getter,
22632                    set: setter,
22633                    configurable: true
22634                  });
22635                } else if (npt.tagName !== "INPUT") {
22636                  valueGet = function valueGet() {
22637                    return this.textContent;
22638                  };
22639
22640                  valueSet = function valueSet(value) {
22641                    this.textContent = value;
22642                  };
22643
22644                  Object.defineProperty(npt, "value", {
22645                    get: getter,
22646                    set: setter,
22647                    configurable: true
22648                  });
22649                }
22650              } else if (document.__lookupGetter__ && npt.__lookupGetter__("value")) {
22651                valueGet = npt.__lookupGetter__("value");
22652                valueSet = npt.__lookupSetter__("value");
22653
22654                npt.__defineGetter__("value", getter);
22655
22656                npt.__defineSetter__("value", setter);
22657              }
22658
22659              npt.inputmask.__valueGet = valueGet;
22660              npt.inputmask.__valueSet = valueSet;
22661            }
22662
22663            npt.inputmask._valueGet = function (overruleRTL) {
22664              return isRTL && overruleRTL !== true ? valueGet.call(this.el).split("").reverse().join("") : valueGet.call(this.el);
22665            };
22666
22667            npt.inputmask._valueSet = function (value, overruleRTL) {
22668              valueSet.call(this.el, value === null || value === undefined ? "" : overruleRTL !== true && isRTL ? value.split("").reverse().join("") : value);
22669            };
22670
22671            if (valueGet === undefined) {
22672              valueGet = function valueGet() {
22673                return this.value;
22674              };
22675
22676              valueSet = function valueSet(value) {
22677                this.value = value;
22678              };
22679
22680              patchValhook(npt.type);
22681              installNativeValueSetFallback(npt);
22682            }
22683          }
22684        }
22685
22686        var elementType = input.getAttribute("type");
22687        var isSupported = input.tagName === "INPUT" && $.inArray(elementType, opts.supportsInputType) !== -1 || input.isContentEditable || input.tagName === "TEXTAREA";
22688
22689        if (!isSupported) {
22690          if (input.tagName === "INPUT") {
22691            var el = document.createElement("input");
22692            el.setAttribute("type", elementType);
22693            isSupported = el.type === "text";
22694            el = null;
22695          } else isSupported = "partial";
22696        }
22697
22698        if (isSupported !== false) {
22699          patchValueProperty(input);
22700        } else input.inputmask = undefined;
22701
22702        return isSupported;
22703      }
22704
22705      EventRuler.off(elem);
22706      var isSupported = isElementTypeSupported(elem, opts);
22707
22708      if (isSupported !== false) {
22709        el = elem;
22710        $el = $(el);
22711        originalPlaceholder = el.placeholder;
22712        maxLength = el !== undefined ? el.maxLength : undefined;
22713        if (maxLength === -1) maxLength = undefined;
22714
22715        if (opts.colorMask === true) {
22716          initializeColorMask(el);
22717        }
22718
22719        if (mobile) {
22720          if ("inputmode" in el) {
22721            el.inputmode = opts.inputmode;
22722            el.setAttribute("inputmode", opts.inputmode);
22723          }
22724
22725          if (opts.disablePredictiveText === true) {
22726            if ("autocorrect" in el) {
22727              el.autocorrect = false;
22728            } else {
22729              if (opts.colorMask !== true) {
22730                initializeColorMask(el);
22731              }
22732
22733              el.type = "password";
22734            }
22735          }
22736        }
22737
22738        if (isSupported === true) {
22739          el.setAttribute("im-insert", opts.insertMode);
22740          EventRuler.on(el, "submit", EventHandlers.submitEvent);
22741          EventRuler.on(el, "reset", EventHandlers.resetEvent);
22742          EventRuler.on(el, "blur", EventHandlers.blurEvent);
22743          EventRuler.on(el, "focus", EventHandlers.focusEvent);
22744
22745          if (opts.colorMask !== true) {
22746            EventRuler.on(el, "click", EventHandlers.clickEvent);
22747            EventRuler.on(el, "mouseleave", EventHandlers.mouseleaveEvent);
22748            EventRuler.on(el, "mouseenter", EventHandlers.mouseenterEvent);
22749          }
22750
22751          EventRuler.on(el, "paste", EventHandlers.pasteEvent);
22752          EventRuler.on(el, "cut", EventHandlers.cutEvent);
22753          EventRuler.on(el, "complete", opts.oncomplete);
22754          EventRuler.on(el, "incomplete", opts.onincomplete);
22755          EventRuler.on(el, "cleared", opts.oncleared);
22756
22757          if (!mobile && opts.inputEventOnly !== true) {
22758            EventRuler.on(el, "keydown", EventHandlers.keydownEvent);
22759            EventRuler.on(el, "keypress", EventHandlers.keypressEvent);
22760          } else {
22761            el.removeAttribute("maxLength");
22762          }
22763
22764          EventRuler.on(el, "input", EventHandlers.inputFallBackEvent);
22765          EventRuler.on(el, "beforeinput", EventHandlers.beforeInputEvent);
22766        }
22767
22768        EventRuler.on(el, "setvalue", EventHandlers.setValueEvent);
22769        undoValue = getBufferTemplate().join("");
22770
22771        if (el.inputmask._valueGet(true) !== "" || opts.clearMaskOnLostFocus === false || document.activeElement === el) {
22772          var initialValue = $.isFunction(opts.onBeforeMask) ? opts.onBeforeMask.call(inputmask, el.inputmask._valueGet(true), opts) || el.inputmask._valueGet(true) : el.inputmask._valueGet(true);
22773          if (initialValue !== "") checkVal(el, true, false, initialValue.split(""));
22774          var buffer = getBuffer().slice();
22775          undoValue = buffer.join("");
22776
22777          if (isComplete(buffer) === false) {
22778            if (opts.clearIncomplete) {
22779              resetMaskSet();
22780            }
22781          }
22782
22783          if (opts.clearMaskOnLostFocus && document.activeElement !== el) {
22784            if (getLastValidPosition() === -1) {
22785              buffer = [];
22786            } else {
22787              clearOptionalTail(buffer);
22788            }
22789          }
22790
22791          if (opts.clearMaskOnLostFocus === false || opts.showMaskOnFocus && document.activeElement === el || el.inputmask._valueGet(true) !== "") writeBuffer(el, buffer);
22792
22793          if (document.activeElement === el) {
22794            caret(el, seekNext(getLastValidPosition()));
22795          }
22796        }
22797      }
22798    }
22799
22800    var valueBuffer;
22801
22802    if (actionObj !== undefined) {
22803      switch (actionObj.action) {
22804        case "isComplete":
22805          el = actionObj.el;
22806          return isComplete(getBuffer());
22807
22808        case "unmaskedvalue":
22809          if (el === undefined || actionObj.value !== undefined) {
22810            valueBuffer = actionObj.value;
22811            valueBuffer = ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask.call(inputmask, valueBuffer, opts) || valueBuffer : valueBuffer).split("");
22812            checkVal.call(this, undefined, false, false, valueBuffer);
22813            if ($.isFunction(opts.onBeforeWrite)) opts.onBeforeWrite.call(inputmask, undefined, getBuffer(), 0, opts);
22814          }
22815
22816          return unmaskedvalue(el);
22817
22818        case "mask":
22819          mask(el);
22820          break;
22821
22822        case "format":
22823          valueBuffer = ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask.call(inputmask, actionObj.value, opts) || actionObj.value : actionObj.value).split("");
22824          checkVal.call(this, undefined, true, false, valueBuffer);
22825
22826          if (actionObj.metadata) {
22827            return {
22828              value: isRTL ? getBuffer().slice().reverse().join("") : getBuffer().join(""),
22829              metadata: maskScope.call(this, {
22830                action: "getmetadata"
22831              }, maskset, opts)
22832            };
22833          }
22834
22835          return isRTL ? getBuffer().slice().reverse().join("") : getBuffer().join("");
22836
22837        case "isValid":
22838          if (actionObj.value) {
22839            valueBuffer = actionObj.value.split("");
22840            checkVal.call(this, undefined, true, true, valueBuffer);
22841          } else {
22842            actionObj.value = getBuffer().join("");
22843          }
22844
22845          var buffer = getBuffer();
22846          var rl = determineLastRequiredPosition(),
22847              lmib = buffer.length - 1;
22848
22849          for (; lmib > rl; lmib--) {
22850            if (isMask(lmib)) break;
22851          }
22852
22853          buffer.splice(rl, lmib + 1 - rl);
22854          return isComplete(buffer) && actionObj.value === getBuffer().join("");
22855
22856        case "getemptymask":
22857          return getBufferTemplate().join("");
22858
22859        case "remove":
22860          if (el && el.inputmask) {
22861            $.data(el, "_inputmask_opts", null);
22862            $el = $(el);
22863
22864            el.inputmask._valueSet(opts.autoUnmask ? unmaskedvalue(el) : el.inputmask._valueGet(true));
22865
22866            EventRuler.off(el);
22867
22868            if (el.inputmask.colorMask) {
22869              colorMask = el.inputmask.colorMask;
22870              colorMask.removeChild(el);
22871              colorMask.parentNode.insertBefore(el, colorMask);
22872              colorMask.parentNode.removeChild(colorMask);
22873            }
22874
22875            var valueProperty;
22876
22877            if (Object.getOwnPropertyDescriptor && Object.getPrototypeOf) {
22878              valueProperty = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(el), "value");
22879
22880              if (valueProperty) {
22881                if (el.inputmask.__valueGet) {
22882                  Object.defineProperty(el, "value", {
22883                    get: el.inputmask.__valueGet,
22884                    set: el.inputmask.__valueSet,
22885                    configurable: true
22886                  });
22887                }
22888              }
22889            } else if (document.__lookupGetter__ && el.__lookupGetter__("value")) {
22890              if (el.inputmask.__valueGet) {
22891                el.__defineGetter__("value", el.inputmask.__valueGet);
22892
22893                el.__defineSetter__("value", el.inputmask.__valueSet);
22894              }
22895            }
22896
22897            el.inputmask = undefined;
22898          }
22899
22900          return el;
22901          break;
22902
22903        case "getmetadata":
22904          if ($.isArray(maskset.metadata)) {
22905            var maskTarget = getMaskTemplate(true, 0, false).join("");
22906            $.each(maskset.metadata, function (ndx, mtdt) {
22907              if (mtdt.mask === maskTarget) {
22908                maskTarget = mtdt;
22909                return false;
22910              }
22911            });
22912            return maskTarget;
22913          }
22914
22915          return maskset.metadata;
22916      }
22917    }
22918  }
22919
22920  return Inputmask;
22921});
22922
22923/***/ }),
22924
vendor: 26,127 bytes, lines 22925-23582
22925/***/ "../node_modules/inputmask/dist/inputmask/inputmask.numeric.extensions.js":
22926/*!********************************************************************************!*\
22927  !*** ../node_modules/inputmask/dist/inputmask/inputmask.numeric.extensions.js ***!
22928  \********************************************************************************/
22929/*! no static exports found */
22930/***/ (function(module, exports, __webpack_require__) {
22931
22932var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
22933
22934/*!
22935* inputmask.numeric.extensions.js
22936* https://github.com/RobinHerbots/Inputmask
22937* Copyright (c) 2010 - 2019 Robin Herbots
22938* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
22939* Version: 4.0.6
22940*/
22941(function (factory) {
22942  if (true) {
22943    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ./inputmask */ "../node_modules/inputmask/dist/inputmask/inputmask.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
22944				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
22945				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
22946				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
22947  } else {}
22948})(function (Inputmask) {
22949  var $ = Inputmask.dependencyLib;
22950
22951  function autoEscape(txt, opts) {
22952    var escapedTxt = "";
22953
22954    for (var i = 0; i < txt.length; i++) {
22955      if (Inputmask.prototype.definitions[txt.charAt(i)] || opts.definitions[txt.charAt(i)] || opts.optionalmarker.start === txt.charAt(i) || opts.optionalmarker.end === txt.charAt(i) || opts.quantifiermarker.start === txt.charAt(i) || opts.quantifiermarker.end === txt.charAt(i) || opts.groupmarker.start === txt.charAt(i) || opts.groupmarker.end === txt.charAt(i) || opts.alternatormarker === txt.charAt(i)) {
22956        escapedTxt += "\\" + txt.charAt(i);
22957      } else escapedTxt += txt.charAt(i);
22958    }
22959
22960    return escapedTxt;
22961  }
22962
22963  function alignDigits(buffer, digits, opts) {
22964    if (digits > 0) {
22965      var radixPosition = $.inArray(opts.radixPoint, buffer);
22966
22967      if (radixPosition === -1) {
22968        buffer.push(opts.radixPoint);
22969        radixPosition = buffer.length - 1;
22970      }
22971
22972      for (var i = 1; i <= digits; i++) {
22973        buffer[radixPosition + i] = buffer[radixPosition + i] || "0";
22974      }
22975    }
22976
22977    return buffer;
22978  }
22979
22980  Inputmask.extendAliases({
22981    numeric: {
22982      mask: function mask(opts) {
22983        if (opts.repeat !== 0 && isNaN(opts.integerDigits)) {
22984          opts.integerDigits = opts.repeat;
22985        }
22986
22987        opts.repeat = 0;
22988
22989        if (opts.groupSeparator === opts.radixPoint && opts.digits && opts.digits !== "0") {
22990          if (opts.radixPoint === ".") {
22991            opts.groupSeparator = ",";
22992          } else if (opts.radixPoint === ",") {
22993            opts.groupSeparator = ".";
22994          } else opts.groupSeparator = "";
22995        }
22996
22997        if (opts.groupSeparator === " ") {
22998          opts.skipOptionalPartCharacter = undefined;
22999        }
23000
23001        opts.autoGroup = opts.autoGroup && opts.groupSeparator !== "";
23002
23003        if (opts.autoGroup) {
23004          if (typeof opts.groupSize == "string" && isFinite(opts.groupSize)) opts.groupSize = parseInt(opts.groupSize);
23005
23006          if (isFinite(opts.integerDigits)) {
23007            var seps = Math.floor(opts.integerDigits / opts.groupSize);
23008            var mod = opts.integerDigits % opts.groupSize;
23009            opts.integerDigits = parseInt(opts.integerDigits) + (mod === 0 ? seps - 1 : seps);
23010
23011            if (opts.integerDigits < 1) {
23012              opts.integerDigits = "*";
23013            }
23014          }
23015        }
23016
23017        if (opts.placeholder.length > 1) {
23018          opts.placeholder = opts.placeholder.charAt(0);
23019        }
23020
23021        if (opts.positionCaretOnClick === "radixFocus" && opts.placeholder === "" && opts.integerOptional === false) {
23022          opts.positionCaretOnClick = "lvp";
23023        }
23024
23025        opts.definitions[";"] = opts.definitions["~"];
23026        opts.definitions[";"].definitionSymbol = "~";
23027
23028        if (opts.numericInput === true) {
23029          opts.positionCaretOnClick = opts.positionCaretOnClick === "radixFocus" ? "lvp" : opts.positionCaretOnClick;
23030          opts.digitsOptional = false;
23031          if (isNaN(opts.digits)) opts.digits = 2;
23032          opts.decimalProtect = false;
23033        }
23034
23035        var mask = "[+]";
23036        mask += autoEscape(opts.prefix, opts);
23037
23038        if (opts.integerOptional === true) {
23039          mask += "~{1," + opts.integerDigits + "}";
23040        } else mask += "~{" + opts.integerDigits + "}";
23041
23042        if (opts.digits !== undefined) {
23043          var radixDef = opts.decimalProtect ? ":" : opts.radixPoint;
23044          var dq = opts.digits.toString().split(",");
23045
23046          if (isFinite(dq[0]) && dq[1] && isFinite(dq[1])) {
23047            mask += radixDef + ";{" + opts.digits + "}";
23048          } else if (isNaN(opts.digits) || parseInt(opts.digits) > 0) {
23049            if (opts.digitsOptional) {
23050              mask += "[" + radixDef + ";{1," + opts.digits + "}]";
23051            } else mask += radixDef + ";{" + opts.digits + "}";
23052          }
23053        }
23054
23055        mask += autoEscape(opts.suffix, opts);
23056        mask += "[-]";
23057        opts.greedy = false;
23058        return mask;
23059      },
23060      placeholder: "",
23061      greedy: false,
23062      digits: "*",
23063      digitsOptional: true,
23064      enforceDigitsOnBlur: false,
23065      radixPoint: ".",
23066      positionCaretOnClick: "radixFocus",
23067      groupSize: 3,
23068      groupSeparator: "",
23069      autoGroup: false,
23070      allowMinus: true,
23071      negationSymbol: {
23072        front: "-",
23073        back: ""
23074      },
23075      integerDigits: "+",
23076      integerOptional: true,
23077      prefix: "",
23078      suffix: "",
23079      rightAlign: true,
23080      decimalProtect: true,
23081      min: null,
23082      max: null,
23083      step: 1,
23084      insertMode: true,
23085      autoUnmask: false,
23086      unmaskAsNumber: false,
23087      inputType: "text",
23088      inputmode: "numeric",
23089      preValidation: function preValidation(buffer, pos, c, isSelection, opts, maskset) {
23090        if (c === "-" || c === opts.negationSymbol.front) {
23091          if (opts.allowMinus !== true) return false;
23092          opts.isNegative = opts.isNegative === undefined ? true : !opts.isNegative;
23093          if (buffer.join("") === "") return true;
23094          return {
23095            caret: maskset.validPositions[pos] ? pos : undefined,
23096            dopost: true
23097          };
23098        }
23099
23100        if (isSelection === false && c === opts.radixPoint && opts.digits !== undefined && (isNaN(opts.digits) || parseInt(opts.digits) > 0)) {
23101          var radixPos = $.inArray(opts.radixPoint, buffer);
23102
23103          if (radixPos !== -1 && maskset.validPositions[radixPos] !== undefined) {
23104            if (opts.numericInput === true) {
23105              return pos === radixPos;
23106            }
23107
23108            return {
23109              caret: radixPos + 1
23110            };
23111          }
23112        }
23113
23114        return true;
23115      },
23116      postValidation: function postValidation(buffer, pos, currentResult, opts) {
23117        function buildPostMask(buffer, opts) {
23118          var postMask = "";
23119          postMask += "(" + opts.groupSeparator + "*{" + opts.groupSize + "}){*}";
23120
23121          if (opts.radixPoint !== "") {
23122            var radixSplit = buffer.join("").split(opts.radixPoint);
23123
23124            if (radixSplit[1]) {
23125              postMask += opts.radixPoint + "*{" + radixSplit[1].match(/^\d*\??\d*/)[0].length + "}";
23126            }
23127          }
23128
23129          return postMask;
23130        }
23131
23132        var suffix = opts.suffix.split(""),
23133            prefix = opts.prefix.split("");
23134        if (currentResult.pos === undefined && currentResult.caret !== undefined && currentResult.dopost !== true) return currentResult;
23135        var caretPos = currentResult.caret !== undefined ? currentResult.caret : currentResult.pos;
23136        var maskedValue = buffer.slice();
23137
23138        if (opts.numericInput) {
23139          caretPos = maskedValue.length - caretPos - 1;
23140          maskedValue = maskedValue.reverse();
23141        }
23142
23143        var charAtPos = maskedValue[caretPos];
23144
23145        if (charAtPos === opts.groupSeparator) {
23146          caretPos += 1;
23147          charAtPos = maskedValue[caretPos];
23148        }
23149
23150        if (caretPos === maskedValue.length - opts.suffix.length - 1 && charAtPos === opts.radixPoint) return currentResult;
23151
23152        if (charAtPos !== undefined) {
23153          if (charAtPos !== opts.radixPoint && charAtPos !== opts.negationSymbol.front && charAtPos !== opts.negationSymbol.back) {
23154            maskedValue[caretPos] = "?";
23155
23156            if (opts.prefix.length > 0 && caretPos >= (opts.isNegative === false ? 1 : 0) && caretPos < opts.prefix.length - 1 + (opts.isNegative === false ? 1 : 0)) {
23157              prefix[caretPos - (opts.isNegative === false ? 1 : 0)] = "?";
23158            } else if (opts.suffix.length > 0 && caretPos >= maskedValue.length - opts.suffix.length - (opts.isNegative === false ? 1 : 0)) {
23159              suffix[caretPos - (maskedValue.length - opts.suffix.length - (opts.isNegative === false ? 1 : 0))] = "?";
23160            }
23161          }
23162        }
23163
23164        prefix = prefix.join("");
23165        suffix = suffix.join("");
23166        var processValue = maskedValue.join("").replace(prefix, "");
23167        processValue = processValue.replace(suffix, "");
23168        processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "");
23169        processValue = processValue.replace(new RegExp("[-" + Inputmask.escapeRegex(opts.negationSymbol.front) + "]", "g"), "");
23170        processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), "");
23171
23172        if (isNaN(opts.placeholder)) {
23173          processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.placeholder), "g"), "");
23174        }
23175
23176        if (processValue.length > 1 && processValue.indexOf(opts.radixPoint) !== 1) {
23177          if (charAtPos === "0") {
23178            processValue = processValue.replace(/^\?/g, "");
23179          }
23180
23181          processValue = processValue.replace(/^0/g, "");
23182        }
23183
23184        if (processValue.charAt(0) === opts.radixPoint && opts.radixPoint !== "" && opts.numericInput !== true) {
23185          processValue = "0" + processValue;
23186        }
23187
23188        if (processValue !== "") {
23189          processValue = processValue.split("");
23190
23191          if ((!opts.digitsOptional || opts.enforceDigitsOnBlur && currentResult.event === "blur") && isFinite(opts.digits)) {
23192            var radixPosition = $.inArray(opts.radixPoint, processValue);
23193            var rpb = $.inArray(opts.radixPoint, maskedValue);
23194
23195            if (radixPosition === -1) {
23196              processValue.push(opts.radixPoint);
23197              radixPosition = processValue.length - 1;
23198            }
23199
23200            for (var i = 1; i <= opts.digits; i++) {
23201              if ((!opts.digitsOptional || opts.enforceDigitsOnBlur && currentResult.event === "blur") && (processValue[radixPosition + i] === undefined || processValue[radixPosition + i] === opts.placeholder.charAt(0))) {
23202                processValue[radixPosition + i] = currentResult.placeholder || opts.placeholder.charAt(0);
23203              } else if (rpb !== -1 && maskedValue[rpb + i] !== undefined) {
23204                processValue[radixPosition + i] = processValue[radixPosition + i] || maskedValue[rpb + i];
23205              }
23206            }
23207          }
23208
23209          if (opts.autoGroup === true && opts.groupSeparator !== "" && (charAtPos !== opts.radixPoint || currentResult.pos !== undefined || currentResult.dopost)) {
23210            var addRadix = processValue[processValue.length - 1] === opts.radixPoint && currentResult.c === opts.radixPoint;
23211            processValue = Inputmask(buildPostMask(processValue, opts), {
23212              numericInput: true,
23213              jitMasking: true,
23214              definitions: {
23215                "*": {
23216                  validator: "[0-9?]",
23217                  cardinality: 1
23218                }
23219              }
23220            }).format(processValue.join(""));
23221            if (addRadix) processValue += opts.radixPoint;
23222
23223            if (processValue.charAt(0) === opts.groupSeparator) {
23224              processValue.substr(1);
23225            }
23226          } else processValue = processValue.join("");
23227        }
23228
23229        if (opts.isNegative && currentResult.event === "blur") {
23230          opts.isNegative = processValue !== "0";
23231        }
23232
23233        processValue = prefix + processValue;
23234        processValue += suffix;
23235
23236        if (opts.isNegative) {
23237          processValue = opts.negationSymbol.front + processValue;
23238          processValue += opts.negationSymbol.back;
23239        }
23240
23241        processValue = processValue.split("");
23242
23243        if (charAtPos !== undefined) {
23244          if (charAtPos !== opts.radixPoint && charAtPos !== opts.negationSymbol.front && charAtPos !== opts.negationSymbol.back) {
23245            caretPos = $.inArray("?", processValue);
23246
23247            if (caretPos > -1) {
23248              processValue[caretPos] = charAtPos;
23249            } else caretPos = currentResult.caret || 0;
23250          } else if (charAtPos === opts.radixPoint || charAtPos === opts.negationSymbol.front || charAtPos === opts.negationSymbol.back) {
23251            var newCaretPos = $.inArray(charAtPos, processValue);
23252            if (newCaretPos !== -1) caretPos = newCaretPos;
23253          }
23254        }
23255
23256        if (opts.numericInput) {
23257          caretPos = processValue.length - caretPos - 1;
23258          processValue = processValue.reverse();
23259        }
23260
23261        var rslt = {
23262          caret: (charAtPos === undefined || currentResult.pos !== undefined) && caretPos !== undefined ? caretPos + (opts.numericInput ? -1 : 1) : caretPos,
23263          buffer: processValue,
23264          refreshFromBuffer: currentResult.dopost || buffer.join("") !== processValue.join("")
23265        };
23266        return rslt.refreshFromBuffer ? rslt : currentResult;
23267      },
23268      onBeforeWrite: function onBeforeWrite(e, buffer, caretPos, opts) {
23269        function parseMinMaxOptions(opts) {
23270          if (opts.parseMinMaxOptions === undefined) {
23271            if (opts.min !== null) {
23272              opts.min = opts.min.toString().replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "");
23273              if (opts.radixPoint === ",") opts.min = opts.min.replace(opts.radixPoint, ".");
23274              opts.min = isFinite(opts.min) ? parseFloat(opts.min) : NaN;
23275              if (isNaN(opts.min)) opts.min = Number.MIN_VALUE;
23276            }
23277
23278            if (opts.max !== null) {
23279              opts.max = opts.max.toString().replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "");
23280              if (opts.radixPoint === ",") opts.max = opts.max.replace(opts.radixPoint, ".");
23281              opts.max = isFinite(opts.max) ? parseFloat(opts.max) : NaN;
23282              if (isNaN(opts.max)) opts.max = Number.MAX_VALUE;
23283            }
23284
23285            opts.parseMinMaxOptions = "done";
23286          }
23287        }
23288
23289        if (e) {
23290          switch (e.type) {
23291            case "keydown":
23292              return opts.postValidation(buffer, caretPos, {
23293                caret: caretPos,
23294                dopost: true
23295              }, opts);
23296
23297            case "blur":
23298            case "checkval":
23299              var unmasked;
23300              parseMinMaxOptions(opts);
23301
23302              if (opts.min !== null || opts.max !== null) {
23303                unmasked = opts.onUnMask(buffer.join(""), undefined, $.extend({}, opts, {
23304                  unmaskAsNumber: true
23305                }));
23306
23307                if (opts.min !== null && unmasked < opts.min) {
23308                  opts.isNegative = opts.min < 0;
23309                  return opts.postValidation(opts.min.toString().replace(".", opts.radixPoint).split(""), caretPos, {
23310                    caret: caretPos,
23311                    dopost: true,
23312                    placeholder: "0"
23313                  }, opts);
23314                } else if (opts.max !== null && unmasked > opts.max) {
23315                  opts.isNegative = opts.max < 0;
23316                  return opts.postValidation(opts.max.toString().replace(".", opts.radixPoint).split(""), caretPos, {
23317                    caret: caretPos,
23318                    dopost: true,
23319                    placeholder: "0"
23320                  }, opts);
23321                }
23322              }
23323
23324              return opts.postValidation(buffer, caretPos, {
23325                caret: caretPos,
23326                placeholder: "0",
23327                event: "blur"
23328              }, opts);
23329
23330            case "_checkval":
23331              return {
23332                caret: caretPos
23333              };
23334
23335            default:
23336              break;
23337          }
23338        }
23339      },
23340      regex: {
23341        integerPart: function integerPart(opts, emptyCheck) {
23342          return emptyCheck ? new RegExp("[" + Inputmask.escapeRegex(opts.negationSymbol.front) + "+]?") : new RegExp("[" + Inputmask.escapeRegex(opts.negationSymbol.front) + "+]?\\d+");
23343        },
23344        integerNPart: function integerNPart(opts) {
23345          return new RegExp("[\\d" + Inputmask.escapeRegex(opts.groupSeparator) + Inputmask.escapeRegex(opts.placeholder.charAt(0)) + "]+");
23346        }
23347      },
23348      definitions: {
23349        "~": {
23350          validator: function validator(chrs, maskset, pos, strict, opts, isSelection) {
23351            var isValid, l;
23352
23353            if (chrs === "k" || chrs === "m") {
23354              isValid = {
23355                insert: [],
23356                c: 0
23357              };
23358
23359              for (var i = 0, l = chrs === "k" ? 2 : 5; i < l; i++) {
23360                isValid.insert.push({
23361                  pos: pos + i,
23362                  c: 0
23363                });
23364              }
23365
23366              isValid.pos = pos + l;
23367              return isValid;
23368            }
23369
23370            isValid = strict ? new RegExp("[0-9" + Inputmask.escapeRegex(opts.groupSeparator) + "]").test(chrs) : new RegExp("[0-9]").test(chrs);
23371
23372            if (isValid === true) {
23373              if (opts.numericInput !== true && maskset.validPositions[pos] !== undefined && maskset.validPositions[pos].match.def === "~" && !isSelection) {
23374                var processValue = maskset.buffer.join("");
23375                processValue = processValue.replace(new RegExp("[-" + Inputmask.escapeRegex(opts.negationSymbol.front) + "]", "g"), "");
23376                processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), "");
23377                var pvRadixSplit = processValue.split(opts.radixPoint);
23378
23379                if (pvRadixSplit.length > 1) {
23380                  pvRadixSplit[1] = pvRadixSplit[1].replace(/0/g, opts.placeholder.charAt(0));
23381                }
23382
23383                if (pvRadixSplit[0] === "0") {
23384                  pvRadixSplit[0] = pvRadixSplit[0].replace(/0/g, opts.placeholder.charAt(0));
23385                }
23386
23387                processValue = pvRadixSplit[0] + opts.radixPoint + pvRadixSplit[1] || "";
23388
23389                var bufferTemplate = maskset._buffer.join("");
23390
23391                if (processValue === opts.radixPoint) {
23392                  processValue = bufferTemplate;
23393                }
23394
23395                while (processValue.match(Inputmask.escapeRegex(bufferTemplate) + "$") === null) {
23396                  bufferTemplate = bufferTemplate.slice(1);
23397                }
23398
23399                processValue = processValue.replace(bufferTemplate, "");
23400                processValue = processValue.split("");
23401
23402                if (processValue[pos] === undefined) {
23403                  isValid = {
23404                    pos: pos,
23405                    remove: pos
23406                  };
23407                } else {
23408                  isValid = {
23409                    pos: pos
23410                  };
23411                }
23412              }
23413            } else if (!strict && chrs === opts.radixPoint && maskset.validPositions[pos - 1] === undefined) {
23414              isValid = {
23415                insert: {
23416                  pos: pos,
23417                  c: 0
23418                },
23419                pos: pos + 1
23420              };
23421            }
23422
23423            return isValid;
23424          },
23425          cardinality: 1
23426        },
23427        "+": {
23428          validator: function validator(chrs, maskset, pos, strict, opts) {
23429            return opts.allowMinus && (chrs === "-" || chrs === opts.negationSymbol.front);
23430          },
23431          cardinality: 1,
23432          placeholder: ""
23433        },
23434        "-": {
23435          validator: function validator(chrs, maskset, pos, strict, opts) {
23436            return opts.allowMinus && chrs === opts.negationSymbol.back;
23437          },
23438          cardinality: 1,
23439          placeholder: ""
23440        },
23441        ":": {
23442          validator: function validator(chrs, maskset, pos, strict, opts) {
23443            var radix = "[" + Inputmask.escapeRegex(opts.radixPoint) + "]";
23444            var isValid = new RegExp(radix).test(chrs);
23445
23446            if (isValid && maskset.validPositions[pos] && maskset.validPositions[pos].match.placeholder === opts.radixPoint) {
23447              isValid = {
23448                caret: pos + 1
23449              };
23450            }
23451
23452            return isValid;
23453          },
23454          cardinality: 1,
23455          placeholder: function placeholder(opts) {
23456            return opts.radixPoint;
23457          }
23458        }
23459      },
23460      onUnMask: function onUnMask(maskedValue, unmaskedValue, opts) {
23461        if (unmaskedValue === "" && opts.nullable === true) {
23462          return unmaskedValue;
23463        }
23464
23465        var processValue = maskedValue.replace(opts.prefix, "");
23466        processValue = processValue.replace(opts.suffix, "");
23467        processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "");
23468
23469        if (opts.placeholder.charAt(0) !== "") {
23470          processValue = processValue.replace(new RegExp(opts.placeholder.charAt(0), "g"), "0");
23471        }
23472
23473        if (opts.unmaskAsNumber) {
23474          if (opts.radixPoint !== "" && processValue.indexOf(opts.radixPoint) !== -1) processValue = processValue.replace(Inputmask.escapeRegex.call(this, opts.radixPoint), ".");
23475          processValue = processValue.replace(new RegExp("^" + Inputmask.escapeRegex(opts.negationSymbol.front)), "-");
23476          processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), "");
23477          return Number(processValue);
23478        }
23479
23480        return processValue;
23481      },
23482      isComplete: function isComplete(buffer, opts) {
23483        var maskedValue = (opts.numericInput ? buffer.slice().reverse() : buffer).join("");
23484        maskedValue = maskedValue.replace(new RegExp("^" + Inputmask.escapeRegex(opts.negationSymbol.front)), "-");
23485        maskedValue = maskedValue.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), "");
23486        maskedValue = maskedValue.replace(opts.prefix, "");
23487        maskedValue = maskedValue.replace(opts.suffix, "");
23488        maskedValue = maskedValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator) + "([0-9]{3})", "g"), "$1");
23489        if (opts.radixPoint === ",") maskedValue = maskedValue.replace(Inputmask.escapeRegex(opts.radixPoint), ".");
23490        return isFinite(maskedValue);
23491      },
23492      onBeforeMask: function onBeforeMask(initialValue, opts) {
23493        opts.isNegative = undefined;
23494        var radixPoint = opts.radixPoint || ",";
23495
23496        if ((typeof initialValue == "number" || opts.inputType === "number") && radixPoint !== "") {
23497          initialValue = initialValue.toString().replace(".", radixPoint);
23498        }
23499
23500        var valueParts = initialValue.split(radixPoint),
23501            integerPart = valueParts[0].replace(/[^\-0-9]/g, ""),
23502            decimalPart = valueParts.length > 1 ? valueParts[1].replace(/[^0-9]/g, "") : "";
23503        initialValue = integerPart + (decimalPart !== "" ? radixPoint + decimalPart : decimalPart);
23504        var digits = 0;
23505
23506        if (radixPoint !== "") {
23507          digits = decimalPart.length;
23508
23509          if (decimalPart !== "") {
23510            var digitsFactor = Math.pow(10, digits || 1);
23511
23512            if (isFinite(opts.digits)) {
23513              digits = parseInt(opts.digits);
23514              digitsFactor = Math.pow(10, digits);
23515            }
23516
23517            initialValue = initialValue.replace(Inputmask.escapeRegex(radixPoint), ".");
23518            if (isFinite(initialValue)) initialValue = Math.round(parseFloat(initialValue) * digitsFactor) / digitsFactor;
23519            initialValue = initialValue.toString().replace(".", radixPoint);
23520          }
23521        }
23522
23523        if (opts.digits === 0 && initialValue.indexOf(Inputmask.escapeRegex(radixPoint)) !== -1) {
23524          initialValue = initialValue.substring(0, initialValue.indexOf(Inputmask.escapeRegex(radixPoint)));
23525        }
23526
23527        return alignDigits(initialValue.toString().split(""), digits, opts).join("");
23528      },
23529      onKeyDown: function onKeyDown(e, buffer, caretPos, opts) {
23530        var $input = $(this);
23531
23532        if (e.ctrlKey) {
23533          switch (e.keyCode) {
23534            case Inputmask.keyCode.UP:
23535              $input.val(parseFloat(this.inputmask.unmaskedvalue()) + parseInt(opts.step));
23536              $input.trigger("setvalue");
23537              break;
23538
23539            case Inputmask.keyCode.DOWN:
23540              $input.val(parseFloat(this.inputmask.unmaskedvalue()) - parseInt(opts.step));
23541              $input.trigger("setvalue");
23542              break;
23543          }
23544        }
23545      }
23546    },
23547    currency: {
23548      prefix: "$ ",
23549      groupSeparator: ",",
23550      alias: "numeric",
23551      placeholder: "0",
23552      autoGroup: true,
23553      digits: 2,
23554      digitsOptional: false,
23555      clearMaskOnLostFocus: false
23556    },
23557    decimal: {
23558      alias: "numeric"
23559    },
23560    integer: {
23561      alias: "numeric",
23562      digits: 0,
23563      radixPoint: ""
23564    },
23565    percentage: {
23566      alias: "numeric",
23567      digits: 2,
23568      digitsOptional: true,
23569      radixPoint: ".",
23570      placeholder: "0",
23571      autoGroup: false,
23572      min: 0,
23573      max: 100,
23574      suffix: " %",
23575      allowMinus: false
23576    }
23577  });
23578  return Inputmask;
23579});
23580
23581/***/ }),
23582
vendor: 850 bytes, lines 23583-23599
23583/***/ "../node_modules/inputmask/index.js":
23584/*!******************************************!*\
23585  !*** ../node_modules/inputmask/index.js ***!
23586  \******************************************/
23587/*! no static exports found */
23588/***/ (function(module, exports, __webpack_require__) {
23589
23590__webpack_require__(/*! ./dist/inputmask/inputmask.extensions */ "../node_modules/inputmask/dist/inputmask/inputmask.extensions.js");
23591
23592__webpack_require__(/*! ./dist/inputmask/inputmask.date.extensions */ "../node_modules/inputmask/dist/inputmask/inputmask.date.extensions.js");
23593
23594__webpack_require__(/*! ./dist/inputmask/inputmask.numeric.extensions */ "../node_modules/inputmask/dist/inputmask/inputmask.numeric.extensions.js");
23595
23596module.exports = __webpack_require__(/*! ./dist/inputmask/inputmask.js */ "../node_modules/inputmask/dist/inputmask/inputmask.js");
23597
23598/***/ }),
23599
vendor: 300,076 bytes, lines 23600-32732
23600/***/ "../node_modules/jquery/dist/jquery.js":
23601/*!*********************************************!*\
23602  !*** ../node_modules/jquery/dist/jquery.js ***!
23603  \*********************************************/
23604/*! no static exports found */
23605/***/ (function(module, exports, __webpack_require__) {
23606
23607/* WEBPACK VAR INJECTION */(function(module) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
23608
23609/*!
23610 * jQuery JavaScript Library v3.3.1
23611 * https://jquery.com/
23612 *
23613 * Includes Sizzle.js
23614 * https://sizzlejs.com/
23615 *
23616 * Copyright JS Foundation and other contributors
23617 * Released under the MIT license
23618 * https://jquery.org/license
23619 *
23620 * Date: 2018-01-20T17:24Z
23621 */
23622(function (global, factory) {
23623  "use strict";
23624
23625  if (( false ? undefined : _typeof(module)) === "object" && _typeof(module.exports) === "object") {
23626    // For CommonJS and CommonJS-like environments where a proper `window`
23627    // is present, execute the factory and get jQuery.
23628    // For environments that do not have a `window` with a `document`
23629    // (such as Node.js), expose a factory as module.exports.
23630    // This accentuates the need for the creation of a real `window`.
23631    // e.g. var jQuery = require("jquery")(window);
23632    // See ticket #14549 for more info.
23633    module.exports = global.document ? factory(global, true) : function (w) {
23634      if (!w.document) {
23635        throw new Error("jQuery requires a window with a document");
23636      }
23637
23638      return factory(w);
23639    };
23640  } else {
23641    factory(global);
23642  } // Pass this if window is not defined yet
23643
23644})(typeof window !== "undefined" ? window : this, function (window, noGlobal) {
23645  // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
23646  // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
23647  // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
23648  // enough that all such attempts are guarded in a try block.
23649  "use strict";
23650
23651  var arr = [];
23652  var document = window.document;
23653  var getProto = Object.getPrototypeOf;
23654  var _slice = arr.slice;
23655  var concat = arr.concat;
23656  var push = arr.push;
23657  var indexOf = arr.indexOf;
23658  var class2type = {};
23659  var toString = class2type.toString;
23660  var hasOwn = class2type.hasOwnProperty;
23661  var fnToString = hasOwn.toString;
23662  var ObjectFunctionString = fnToString.call(Object);
23663  var support = {};
23664
23665  var isFunction = function isFunction(obj) {
23666    // Support: Chrome <=57, Firefox <=52
23667    // In some browsers, typeof returns "function" for HTML <object> elements
23668    // (i.e., `typeof document.createElement( "object" ) === "function"`).
23669    // We don't want to classify *any* DOM node as a function.
23670    return typeof obj === "function" && typeof obj.nodeType !== "number";
23671  };
23672
23673  var isWindow = function isWindow(obj) {
23674    return obj != null && obj === obj.window;
23675  };
23676
23677  var preservedScriptAttributes = {
23678    type: true,
23679    src: true,
23680    noModule: true
23681  };
23682
23683  function DOMEval(code, doc, node) {
23684    doc = doc || document;
23685    var i,
23686        script = doc.createElement("script");
23687    script.text = code;
23688
23689    if (node) {
23690      for (i in preservedScriptAttributes) {
23691        if (node[i]) {
23692          script[i] = node[i];
23693        }
23694      }
23695    }
23696
23697    doc.head.appendChild(script).parentNode.removeChild(script);
23698  }
23699
23700  function toType(obj) {
23701    if (obj == null) {
23702      return obj + "";
23703    } // Support: Android <=2.3 only (functionish RegExp)
23704
23705
23706    return _typeof(obj) === "object" || typeof obj === "function" ? class2type[toString.call(obj)] || "object" : _typeof(obj);
23707  }
23708  /* global Symbol */
23709  // Defining this global in .eslintrc.json would create a danger of using the global
23710  // unguarded in another place, it seems safer to define global only for this module
23711
23712
23713  var version = "3.3.1",
23714      // Define a local copy of jQuery
23715  jQuery = function jQuery(selector, context) {
23716    // The jQuery object is actually just the init constructor 'enhanced'
23717    // Need init if jQuery is called (just allow error to be thrown if not included)
23718    return new jQuery.fn.init(selector, context);
23719  },
23720      // Support: Android <=4.0 only
23721  // Make sure we trim BOM and NBSP
23722  rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
23723
23724  jQuery.fn = jQuery.prototype = {
23725    // The current version of jQuery being used
23726    jquery: version,
23727    constructor: jQuery,
23728    // The default length of a jQuery object is 0
23729    length: 0,
23730    toArray: function toArray() {
23731      return _slice.call(this);
23732    },
23733    // Get the Nth element in the matched element set OR
23734    // Get the whole matched element set as a clean array
23735    get: function get(num) {
23736      // Return all the elements in a clean array
23737      if (num == null) {
23738        return _slice.call(this);
23739      } // Return just the one element from the set
23740
23741
23742      return num < 0 ? this[num + this.length] : this[num];
23743    },
23744    // Take an array of elements and push it onto the stack
23745    // (returning the new matched element set)
23746    pushStack: function pushStack(elems) {
23747      // Build a new jQuery matched element set
23748      var ret = jQuery.merge(this.constructor(), elems); // Add the old object onto the stack (as a reference)
23749
23750      ret.prevObject = this; // Return the newly-formed element set
23751
23752      return ret;
23753    },
23754    // Execute a callback for every element in the matched set.
23755    each: function each(callback) {
23756      return jQuery.each(this, callback);
23757    },
23758    map: function map(callback) {
23759      return this.pushStack(jQuery.map(this, function (elem, i) {
23760        return callback.call(elem, i, elem);
23761      }));
23762    },
23763    slice: function slice() {
23764      return this.pushStack(_slice.apply(this, arguments));
23765    },
23766    first: function first() {
23767      return this.eq(0);
23768    },
23769    last: function last() {
23770      return this.eq(-1);
23771    },
23772    eq: function eq(i) {
23773      var len = this.length,
23774          j = +i + (i < 0 ? len : 0);
23775      return this.pushStack(j >= 0 && j < len ? [this[j]] : []);
23776    },
23777    end: function end() {
23778      return this.prevObject || this.constructor();
23779    },
23780    // For internal use only.
23781    // Behaves like an Array's method, not like a jQuery method.
23782    push: push,
23783    sort: arr.sort,
23784    splice: arr.splice
23785  };
23786
23787  jQuery.extend = jQuery.fn.extend = function () {
23788    var options,
23789        name,
23790        src,
23791        copy,
23792        copyIsArray,
23793        clone,
23794        target = arguments[0] || {},
23795        i = 1,
23796        length = arguments.length,
23797        deep = false; // Handle a deep copy situation
23798
23799    if (typeof target === "boolean") {
23800      deep = target; // Skip the boolean and the target
23801
23802      target = arguments[i] || {};
23803      i++;
23804    } // Handle case when target is a string or something (possible in deep copy)
23805
23806
23807    if (_typeof(target) !== "object" && !isFunction(target)) {
23808      target = {};
23809    } // Extend jQuery itself if only one argument is passed
23810
23811
23812    if (i === length) {
23813      target = this;
23814      i--;
23815    }
23816
23817    for (; i < length; i++) {
23818      // Only deal with non-null/undefined values
23819      if ((options = arguments[i]) != null) {
23820        // Extend the base object
23821        for (name in options) {
23822          src = target[name];
23823          copy = options[name]; // Prevent never-ending loop
23824
23825          if (target === copy) {
23826            continue;
23827          } // Recurse if we're merging plain objects or arrays
23828
23829
23830          if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) {
23831            if (copyIsArray) {
23832              copyIsArray = false;
23833              clone = src && Array.isArray(src) ? src : [];
23834            } else {
23835              clone = src && jQuery.isPlainObject(src) ? src : {};
23836            } // Never move original objects, clone them
23837
23838
23839            target[name] = jQuery.extend(deep, clone, copy); // Don't bring in undefined values
23840          } else if (copy !== undefined) {
23841            target[name] = copy;
23842          }
23843        }
23844      }
23845    } // Return the modified object
23846
23847
23848    return target;
23849  };
23850
23851  jQuery.extend({
23852    // Unique for each copy of jQuery on the page
23853    expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""),
23854    // Assume jQuery is ready without the ready module
23855    isReady: true,
23856    error: function error(msg) {
23857      throw new Error(msg);
23858    },
23859    noop: function noop() {},
23860    isPlainObject: function isPlainObject(obj) {
23861      var proto, Ctor; // Detect obvious negatives
23862      // Use toString instead of jQuery.type to catch host objects
23863
23864      if (!obj || toString.call(obj) !== "[object Object]") {
23865        return false;
23866      }
23867
23868      proto = getProto(obj); // Objects with no prototype (e.g., `Object.create( null )`) are plain
23869
23870      if (!proto) {
23871        return true;
23872      } // Objects with prototype are plain iff they were constructed by a global Object function
23873
23874
23875      Ctor = hasOwn.call(proto, "constructor") && proto.constructor;
23876      return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString;
23877    },
23878    isEmptyObject: function isEmptyObject(obj) {
23879      /* eslint-disable no-unused-vars */
23880      // See https://github.com/eslint/eslint/issues/6125
23881      var name;
23882
23883      for (name in obj) {
23884        return false;
23885      }
23886
23887      return true;
23888    },
23889    // Evaluates a script in a global context
23890    globalEval: function globalEval(code) {
23891      DOMEval(code);
23892    },
23893    each: function each(obj, callback) {
23894      var length,
23895          i = 0;
23896
23897      if (isArrayLike(obj)) {
23898        length = obj.length;
23899
23900        for (; i < length; i++) {
23901          if (callback.call(obj[i], i, obj[i]) === false) {
23902            break;
23903          }
23904        }
23905      } else {
23906        for (i in obj) {
23907          if (callback.call(obj[i], i, obj[i]) === false) {
23908            break;
23909          }
23910        }
23911      }
23912
23913      return obj;
23914    },
23915    // Support: Android <=4.0 only
23916    trim: function trim(text) {
23917      return text == null ? "" : (text + "").replace(rtrim, "");
23918    },
23919    // results is for internal usage only
23920    makeArray: function makeArray(arr, results) {
23921      var ret = results || [];
23922
23923      if (arr != null) {
23924        if (isArrayLike(Object(arr))) {
23925          jQuery.merge(ret, typeof arr === "string" ? [arr] : arr);
23926        } else {
23927          push.call(ret, arr);
23928        }
23929      }
23930
23931      return ret;
23932    },
23933    inArray: function inArray(elem, arr, i) {
23934      return arr == null ? -1 : indexOf.call(arr, elem, i);
23935    },
23936    // Support: Android <=4.0 only, PhantomJS 1 only
23937    // push.apply(_, arraylike) throws on ancient WebKit
23938    merge: function merge(first, second) {
23939      var len = +second.length,
23940          j = 0,
23941          i = first.length;
23942
23943      for (; j < len; j++) {
23944        first[i++] = second[j];
23945      }
23946
23947      first.length = i;
23948      return first;
23949    },
23950    grep: function grep(elems, callback, invert) {
23951      var callbackInverse,
23952          matches = [],
23953          i = 0,
23954          length = elems.length,
23955          callbackExpect = !invert; // Go through the array, only saving the items
23956      // that pass the validator function
23957
23958      for (; i < length; i++) {
23959        callbackInverse = !callback(elems[i], i);
23960
23961        if (callbackInverse !== callbackExpect) {
23962          matches.push(elems[i]);
23963        }
23964      }
23965
23966      return matches;
23967    },
23968    // arg is for internal usage only
23969    map: function map(elems, callback, arg) {
23970      var length,
23971          value,
23972          i = 0,
23973          ret = []; // Go through the array, translating each of the items to their new values
23974
23975      if (isArrayLike(elems)) {
23976        length = elems.length;
23977
23978        for (; i < length; i++) {
23979          value = callback(elems[i], i, arg);
23980
23981          if (value != null) {
23982            ret.push(value);
23983          }
23984        } // Go through every key on the object,
23985
23986      } else {
23987        for (i in elems) {
23988          value = callback(elems[i], i, arg);
23989
23990          if (value != null) {
23991            ret.push(value);
23992          }
23993        }
23994      } // Flatten any nested arrays
23995
23996
23997      return concat.apply([], ret);
23998    },
23999    // A global GUID counter for objects
24000    guid: 1,
24001    // jQuery.support is not used in Core but other projects attach their
24002    // properties to it so it needs to exist.
24003    support: support
24004  });
24005
24006  if (typeof Symbol === "function") {
24007    jQuery.fn[Symbol.iterator] = arr[Symbol.iterator];
24008  } // Populate the class2type map
24009
24010
24011  jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function (i, name) {
24012    class2type["[object " + name + "]"] = name.toLowerCase();
24013  });
24014
24015  function isArrayLike(obj) {
24016    // Support: real iOS 8.2 only (not reproducible in simulator)
24017    // `in` check used to prevent JIT error (gh-2145)
24018    // hasOwn isn't used here due to false negatives
24019    // regarding Nodelist length in IE
24020    var length = !!obj && "length" in obj && obj.length,
24021        type = toType(obj);
24022
24023    if (isFunction(obj) || isWindow(obj)) {
24024      return false;
24025    }
24026
24027    return type === "array" || length === 0 || typeof length === "number" && length > 0 && length - 1 in obj;
24028  }
24029
24030  var Sizzle =
24031  /*!
24032   * Sizzle CSS Selector Engine v2.3.3
24033   * https://sizzlejs.com/
24034   *
24035   * Copyright jQuery Foundation and other contributors
24036   * Released under the MIT license
24037   * http://jquery.org/license
24038   *
24039   * Date: 2016-08-08
24040   */
24041  function (window) {
24042    var i,
24043        support,
24044        Expr,
24045        getText,
24046        isXML,
24047        tokenize,
24048        compile,
24049        select,
24050        outermostContext,
24051        sortInput,
24052        hasDuplicate,
24053        // Local document vars
24054    setDocument,
24055        document,
24056        docElem,
24057        documentIsHTML,
24058        rbuggyQSA,
24059        rbuggyMatches,
24060        matches,
24061        contains,
24062        // Instance-specific data
24063    expando = "sizzle" + 1 * new Date(),
24064        preferredDoc = window.document,
24065        dirruns = 0,
24066        done = 0,
24067        classCache = createCache(),
24068        tokenCache = createCache(),
24069        compilerCache = createCache(),
24070        sortOrder = function sortOrder(a, b) {
24071      if (a === b) {
24072        hasDuplicate = true;
24073      }
24074
24075      return 0;
24076    },
24077        // Instance methods
24078    hasOwn = {}.hasOwnProperty,
24079        arr = [],
24080        pop = arr.pop,
24081        push_native = arr.push,
24082        push = arr.push,
24083        slice = arr.slice,
24084        // Use a stripped-down indexOf as it's faster than native
24085    // https://jsperf.com/thor-indexof-vs-for/5
24086    indexOf = function indexOf(list, elem) {
24087      var i = 0,
24088          len = list.length;
24089
24090      for (; i < len; i++) {
24091        if (list[i] === elem) {
24092          return i;
24093        }
24094      }
24095
24096      return -1;
24097    },
24098        booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
24099        // Regular expressions
24100    // http://www.w3.org/TR/css3-selectors/#whitespace
24101    whitespace = "[\\x20\\t\\r\\n\\f]",
24102        // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
24103    identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
24104        // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
24105    attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2)
24106    "*([*^$|!~]?=)" + whitespace + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
24107    "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]",
24108        pseudos = ":(" + identifier + ")(?:\\((" + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
24109    // 1. quoted (capture 3; capture 4 or capture 5)
24110    "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + // 2. simple (capture 6)
24111    "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + // 3. anything else (capture 2)
24112    ".*" + ")\\)|)",
24113        // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
24114    rwhitespace = new RegExp(whitespace + "+", "g"),
24115        rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"),
24116        rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"),
24117        rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"),
24118        rattributeQuotes = new RegExp("=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g"),
24119        rpseudo = new RegExp(pseudos),
24120        ridentifier = new RegExp("^" + identifier + "$"),
24121        matchExpr = {
24122      "ID": new RegExp("^#(" + identifier + ")"),
24123      "CLASS": new RegExp("^\\.(" + identifier + ")"),
24124      "TAG": new RegExp("^(" + identifier + "|[*])"),
24125      "ATTR": new RegExp("^" + attributes),
24126      "PSEUDO": new RegExp("^" + pseudos),
24127      "CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"),
24128      "bool": new RegExp("^(?:" + booleans + ")$", "i"),
24129      // For use in libraries implementing .is()
24130      // We use this for POS matching in `select`
24131      "needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i")
24132    },
24133        rinputs = /^(?:input|select|textarea|button)$/i,
24134        rheader = /^h\d$/i,
24135        rnative = /^[^{]+\{\s*\[native \w/,
24136        // Easily-parseable/retrievable ID or TAG or CLASS selectors
24137    rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
24138        rsibling = /[+~]/,
24139        // CSS escapes
24140    // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
24141    runescape = new RegExp("\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig"),
24142        funescape = function funescape(_, escaped, escapedWhitespace) {
24143      var high = "0x" + escaped - 0x10000; // NaN means non-codepoint
24144      // Support: Firefox<24
24145      // Workaround erroneous numeric interpretation of +"0x"
24146
24147      return high !== high || escapedWhitespace ? escaped : high < 0 ? // BMP codepoint
24148      String.fromCharCode(high + 0x10000) : // Supplemental Plane codepoint (surrogate pair)
24149      String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00);
24150    },
24151        // CSS string/identifier serialization
24152    // https://drafts.csswg.org/cssom/#common-serializing-idioms
24153    rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
24154        fcssescape = function fcssescape(ch, asCodePoint) {
24155      if (asCodePoint) {
24156        // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
24157        if (ch === "\0") {
24158          return "\uFFFD";
24159        } // Control characters and (dependent upon position) numbers get escaped as code points
24160
24161
24162        return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " ";
24163      } // Other potentially-special ASCII characters get backslash-escaped
24164
24165
24166      return "\\" + ch;
24167    },
24168        // Used for iframes
24169    // See setDocument()
24170    // Removing the function wrapper causes a "Permission Denied"
24171    // error in IE
24172    unloadHandler = function unloadHandler() {
24173      setDocument();
24174    },
24175        disabledAncestor = addCombinator(function (elem) {
24176      return elem.disabled === true && ("form" in elem || "label" in elem);
24177    }, {
24178      dir: "parentNode",
24179      next: "legend"
24180    }); // Optimize for push.apply( _, NodeList )
24181
24182
24183    try {
24184      push.apply(arr = slice.call(preferredDoc.childNodes), preferredDoc.childNodes); // Support: Android<4.0
24185      // Detect silently failing push.apply
24186
24187      arr[preferredDoc.childNodes.length].nodeType;
24188    } catch (e) {
24189      push = {
24190        apply: arr.length ? // Leverage slice if possible
24191        function (target, els) {
24192          push_native.apply(target, slice.call(els));
24193        } : // Support: IE<9
24194        // Otherwise append directly
24195        function (target, els) {
24196          var j = target.length,
24197              i = 0; // Can't trust NodeList.length
24198
24199          while (target[j++] = els[i++]) {}
24200
24201          target.length = j - 1;
24202        }
24203      };
24204    }
24205
24206    function Sizzle(selector, context, results, seed) {
24207      var m,
24208          i,
24209          elem,
24210          nid,
24211          match,
24212          groups,
24213          newSelector,
24214          newContext = context && context.ownerDocument,
24215          // nodeType defaults to 9, since context defaults to document
24216      nodeType = context ? context.nodeType : 9;
24217      results = results || []; // Return early from calls with invalid selector or context
24218
24219      if (typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11) {
24220        return results;
24221      } // Try to shortcut find operations (as opposed to filters) in HTML documents
24222
24223
24224      if (!seed) {
24225        if ((context ? context.ownerDocument || context : preferredDoc) !== document) {
24226          setDocument(context);
24227        }
24228
24229        context = context || document;
24230
24231        if (documentIsHTML) {
24232          // If the selector is sufficiently simple, try using a "get*By*" DOM method
24233          // (excepting DocumentFragment context, where the methods don't exist)
24234          if (nodeType !== 11 && (match = rquickExpr.exec(selector))) {
24235            // ID selector
24236            if (m = match[1]) {
24237              // Document context
24238              if (nodeType === 9) {
24239                if (elem = context.getElementById(m)) {
24240                  // Support: IE, Opera, Webkit
24241                  // TODO: identify versions
24242                  // getElementById can match elements by name instead of ID
24243                  if (elem.id === m) {
24244                    results.push(elem);
24245                    return results;
24246                  }
24247                } else {
24248                  return results;
24249                } // Element context
24250
24251              } else {
24252                // Support: IE, Opera, Webkit
24253                // TODO: identify versions
24254                // getElementById can match elements by name instead of ID
24255                if (newContext && (elem = newContext.getElementById(m)) && contains(context, elem) && elem.id === m) {
24256                  results.push(elem);
24257                  return results;
24258                }
24259              } // Type selector
24260
24261            } else if (match[2]) {
24262              push.apply(results, context.getElementsByTagName(selector));
24263              return results; // Class selector
24264            } else if ((m = match[3]) && support.getElementsByClassName && context.getElementsByClassName) {
24265              push.apply(results, context.getElementsByClassName(m));
24266              return results;
24267            }
24268          } // Take advantage of querySelectorAll
24269
24270
24271          if (support.qsa && !compilerCache[selector + " "] && (!rbuggyQSA || !rbuggyQSA.test(selector))) {
24272            if (nodeType !== 1) {
24273              newContext = context;
24274              newSelector = selector; // qSA looks outside Element context, which is not what we want
24275              // Thanks to Andrew Dupont for this workaround technique
24276              // Support: IE <=8
24277              // Exclude object elements
24278            } else if (context.nodeName.toLowerCase() !== "object") {
24279              // Capture the context ID, setting it first if necessary
24280              if (nid = context.getAttribute("id")) {
24281                nid = nid.replace(rcssescape, fcssescape);
24282              } else {
24283                context.setAttribute("id", nid = expando);
24284              } // Prefix every selector in the list
24285
24286
24287              groups = tokenize(selector);
24288              i = groups.length;
24289
24290              while (i--) {
24291                groups[i] = "#" + nid + " " + toSelector(groups[i]);
24292              }
24293
24294              newSelector = groups.join(","); // Expand context for sibling selectors
24295
24296              newContext = rsibling.test(selector) && testContext(context.parentNode) || context;
24297            }
24298
24299            if (newSelector) {
24300              try {
24301                push.apply(results, newContext.querySelectorAll(newSelector));
24302                return results;
24303              } catch (qsaError) {} finally {
24304                if (nid === expando) {
24305                  context.removeAttribute("id");
24306                }
24307              }
24308            }
24309          }
24310        }
24311      } // All others
24312
24313
24314      return select(selector.replace(rtrim, "$1"), context, results, seed);
24315    }
24316    /**
24317     * Create key-value caches of limited size
24318     * @returns {function(string, object)} Returns the Object data after storing it on itself with
24319     *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
24320     *	deleting the oldest entry
24321     */
24322
24323
24324    function createCache() {
24325      var keys = [];
24326
24327      function cache(key, value) {
24328        // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
24329        if (keys.push(key + " ") > Expr.cacheLength) {
24330          // Only keep the most recent entries
24331          delete cache[keys.shift()];
24332        }
24333
24334        return cache[key + " "] = value;
24335      }
24336
24337      return cache;
24338    }
24339    /**
24340     * Mark a function for special use by Sizzle
24341     * @param {Function} fn The function to mark
24342     */
24343
24344
24345    function markFunction(fn) {
24346      fn[expando] = true;
24347      return fn;
24348    }
24349    /**
24350     * Support testing using an element
24351     * @param {Function} fn Passed the created element and returns a boolean result
24352     */
24353
24354
24355    function assert(fn) {
24356      var el = document.createElement("fieldset");
24357
24358      try {
24359        return !!fn(el);
24360      } catch (e) {
24361        return false;
24362      } finally {
24363        // Remove from its parent by default
24364        if (el.parentNode) {
24365          el.parentNode.removeChild(el);
24366        } // release memory in IE
24367
24368
24369        el = null;
24370      }
24371    }
24372    /**
24373     * Adds the same handler for all of the specified attrs
24374     * @param {String} attrs Pipe-separated list of attributes
24375     * @param {Function} handler The method that will be applied
24376     */
24377
24378
24379    function addHandle(attrs, handler) {
24380      var arr = attrs.split("|"),
24381          i = arr.length;
24382
24383      while (i--) {
24384        Expr.attrHandle[arr[i]] = handler;
24385      }
24386    }
24387    /**
24388     * Checks document order of two siblings
24389     * @param {Element} a
24390     * @param {Element} b
24391     * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
24392     */
24393
24394
24395    function siblingCheck(a, b) {
24396      var cur = b && a,
24397          diff = cur && a.nodeType === 1 && b.nodeType === 1 && a.sourceIndex - b.sourceIndex; // Use IE sourceIndex if available on both nodes
24398
24399      if (diff) {
24400        return diff;
24401      } // Check if b follows a
24402
24403
24404      if (cur) {
24405        while (cur = cur.nextSibling) {
24406          if (cur === b) {
24407            return -1;
24408          }
24409        }
24410      }
24411
24412      return a ? 1 : -1;
24413    }
24414    /**
24415     * Returns a function to use in pseudos for input types
24416     * @param {String} type
24417     */
24418
24419
24420    function createInputPseudo(type) {
24421      return function (elem) {
24422        var name = elem.nodeName.toLowerCase();
24423        return name === "input" && elem.type === type;
24424      };
24425    }
24426    /**
24427     * Returns a function to use in pseudos for buttons
24428     * @param {String} type
24429     */
24430
24431
24432    function createButtonPseudo(type) {
24433      return function (elem) {
24434        var name = elem.nodeName.toLowerCase();
24435        return (name === "input" || name === "button") && elem.type === type;
24436      };
24437    }
24438    /**
24439     * Returns a function to use in pseudos for :enabled/:disabled
24440     * @param {Boolean} disabled true for :disabled; false for :enabled
24441     */
24442
24443
24444    function createDisabledPseudo(disabled) {
24445      // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
24446      return function (elem) {
24447        // Only certain elements can match :enabled or :disabled
24448        // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
24449        // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
24450        if ("form" in elem) {
24451          // Check for inherited disabledness on relevant non-disabled elements:
24452          // * listed form-associated elements in a disabled fieldset
24453          //   https://html.spec.whatwg.org/multipage/forms.html#category-listed
24454          //   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
24455          // * option elements in a disabled optgroup
24456          //   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
24457          // All such elements have a "form" property.
24458          if (elem.parentNode && elem.disabled === false) {
24459            // Option elements defer to a parent optgroup if present
24460            if ("label" in elem) {
24461              if ("label" in elem.parentNode) {
24462                return elem.parentNode.disabled === disabled;
24463              } else {
24464                return elem.disabled === disabled;
24465              }
24466            } // Support: IE 6 - 11
24467            // Use the isDisabled shortcut property to check for disabled fieldset ancestors
24468
24469
24470            return elem.isDisabled === disabled || // Where there is no isDisabled, check manually
24471
24472            /* jshint -W018 */
24473            elem.isDisabled !== !disabled && disabledAncestor(elem) === disabled;
24474          }
24475
24476          return elem.disabled === disabled; // Try to winnow out elements that can't be disabled before trusting the disabled property.
24477          // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
24478          // even exist on them, let alone have a boolean value.
24479        } else if ("label" in elem) {
24480          return elem.disabled === disabled;
24481        } // Remaining elements are neither :enabled nor :disabled
24482
24483
24484        return false;
24485      };
24486    }
24487    /**
24488     * Returns a function to use in pseudos for positionals
24489     * @param {Function} fn
24490     */
24491
24492
24493    function createPositionalPseudo(fn) {
24494      return markFunction(function (argument) {
24495        argument = +argument;
24496        return markFunction(function (seed, matches) {
24497          var j,
24498              matchIndexes = fn([], seed.length, argument),
24499              i = matchIndexes.length; // Match elements found at the specified indexes
24500
24501          while (i--) {
24502            if (seed[j = matchIndexes[i]]) {
24503              seed[j] = !(matches[j] = seed[j]);
24504            }
24505          }
24506        });
24507      });
24508    }
24509    /**
24510     * Checks a node for validity as a Sizzle context
24511     * @param {Element|Object=} context
24512     * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
24513     */
24514
24515
24516    function testContext(context) {
24517      return context && typeof context.getElementsByTagName !== "undefined" && context;
24518    } // Expose support vars for convenience
24519
24520
24521    support = Sizzle.support = {};
24522    /**
24523     * Detects XML nodes
24524     * @param {Element|Object} elem An element or a document
24525     * @returns {Boolean} True iff elem is a non-HTML XML node
24526     */
24527
24528    isXML = Sizzle.isXML = function (elem) {
24529      // documentElement is verified for cases where it doesn't yet exist
24530      // (such as loading iframes in IE - #4833)
24531      var documentElement = elem && (elem.ownerDocument || elem).documentElement;
24532      return documentElement ? documentElement.nodeName !== "HTML" : false;
24533    };
24534    /**
24535     * Sets document-related variables once based on the current document
24536     * @param {Element|Object} [doc] An element or document object to use to set the document
24537     * @returns {Object} Returns the current document
24538     */
24539
24540
24541    setDocument = Sizzle.setDocument = function (node) {
24542      var hasCompare,
24543          subWindow,
24544          doc = node ? node.ownerDocument || node : preferredDoc; // Return early if doc is invalid or already selected
24545
24546      if (doc === document || doc.nodeType !== 9 || !doc.documentElement) {
24547        return document;
24548      } // Update global variables
24549
24550
24551      document = doc;
24552      docElem = document.documentElement;
24553      documentIsHTML = !isXML(document); // Support: IE 9-11, Edge
24554      // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
24555
24556      if (preferredDoc !== document && (subWindow = document.defaultView) && subWindow.top !== subWindow) {
24557        // Support: IE 11, Edge
24558        if (subWindow.addEventListener) {
24559          subWindow.addEventListener("unload", unloadHandler, false); // Support: IE 9 - 10 only
24560        } else if (subWindow.attachEvent) {
24561          subWindow.attachEvent("onunload", unloadHandler);
24562        }
24563      }
24564      /* Attributes
24565      ---------------------------------------------------------------------- */
24566      // Support: IE<8
24567      // Verify that getAttribute really returns attributes and not properties
24568      // (excepting IE8 booleans)
24569
24570
24571      support.attributes = assert(function (el) {
24572        el.className = "i";
24573        return !el.getAttribute("className");
24574      });
24575      /* getElement(s)By*
24576      ---------------------------------------------------------------------- */
24577      // Check if getElementsByTagName("*") returns only elements
24578
24579      support.getElementsByTagName = assert(function (el) {
24580        el.appendChild(document.createComment(""));
24581        return !el.getElementsByTagName("*").length;
24582      }); // Support: IE<9
24583
24584      support.getElementsByClassName = rnative.test(document.getElementsByClassName); // Support: IE<10
24585      // Check if getElementById returns elements by name
24586      // The broken getElementById methods don't pick up programmatically-set names,
24587      // so use a roundabout getElementsByName test
24588
24589      support.getById = assert(function (el) {
24590        docElem.appendChild(el).id = expando;
24591        return !document.getElementsByName || !document.getElementsByName(expando).length;
24592      }); // ID filter and find
24593
24594      if (support.getById) {
24595        Expr.filter["ID"] = function (id) {
24596          var attrId = id.replace(runescape, funescape);
24597          return function (elem) {
24598            return elem.getAttribute("id") === attrId;
24599          };
24600        };
24601
24602        Expr.find["ID"] = function (id, context) {
24603          if (typeof context.getElementById !== "undefined" && documentIsHTML) {
24604            var elem = context.getElementById(id);
24605            return elem ? [elem] : [];
24606          }
24607        };
24608      } else {
24609        Expr.filter["ID"] = function (id) {
24610          var attrId = id.replace(runescape, funescape);
24611          return function (elem) {
24612            var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
24613            return node && node.value === attrId;
24614          };
24615        }; // Support: IE 6 - 7 only
24616        // getElementById is not reliable as a find shortcut
24617
24618
24619        Expr.find["ID"] = function (id, context) {
24620          if (typeof context.getElementById !== "undefined" && documentIsHTML) {
24621            var node,
24622                i,
24623                elems,
24624                elem = context.getElementById(id);
24625
24626            if (elem) {
24627              // Verify the id attribute
24628              node = elem.getAttributeNode("id");
24629
24630              if (node && node.value === id) {
24631                return [elem];
24632              } // Fall back on getElementsByName
24633
24634
24635              elems = context.getElementsByName(id);
24636              i = 0;
24637
24638              while (elem = elems[i++]) {
24639                node = elem.getAttributeNode("id");
24640
24641                if (node && node.value === id) {
24642                  return [elem];
24643                }
24644              }
24645            }
24646
24647            return [];
24648          }
24649        };
24650      } // Tag
24651
24652
24653      Expr.find["TAG"] = support.getElementsByTagName ? function (tag, context) {
24654        if (typeof context.getElementsByTagName !== "undefined") {
24655          return context.getElementsByTagName(tag); // DocumentFragment nodes don't have gEBTN
24656        } else if (support.qsa) {
24657          return context.querySelectorAll(tag);
24658        }
24659      } : function (tag, context) {
24660        var elem,
24661            tmp = [],
24662            i = 0,
24663            // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
24664        results = context.getElementsByTagName(tag); // Filter out possible comments
24665
24666        if (tag === "*") {
24667          while (elem = results[i++]) {
24668            if (elem.nodeType === 1) {
24669              tmp.push(elem);
24670            }
24671          }
24672
24673          return tmp;
24674        }
24675
24676        return results;
24677      }; // Class
24678
24679      Expr.find["CLASS"] = support.getElementsByClassName && function (className, context) {
24680        if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) {
24681          return context.getElementsByClassName(className);
24682        }
24683      };
24684      /* QSA/matchesSelector
24685      ---------------------------------------------------------------------- */
24686      // QSA and matchesSelector support
24687      // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
24688
24689
24690      rbuggyMatches = []; // qSa(:focus) reports false when true (Chrome 21)
24691      // We allow this because of a bug in IE8/9 that throws an error
24692      // whenever `document.activeElement` is accessed on an iframe
24693      // So, we allow :focus to pass through QSA all the time to avoid the IE error
24694      // See https://bugs.jquery.com/ticket/13378
24695
24696      rbuggyQSA = [];
24697
24698      if (support.qsa = rnative.test(document.querySelectorAll)) {
24699        // Build QSA regex
24700        // Regex strategy adopted from Diego Perini
24701        assert(function (el) {
24702          // Select is set to empty string on purpose
24703          // This is to test IE's treatment of not explicitly
24704          // setting a boolean content attribute,
24705          // since its presence should be enough
24706          // https://bugs.jquery.com/ticket/12359
24707          docElem.appendChild(el).innerHTML = "<a id='" + expando + "'></a>" + "<select id='" + expando + "-\r\\' msallowcapture=''>" + "<option selected=''></option></select>"; // Support: IE8, Opera 11-12.16
24708          // Nothing should be selected when empty strings follow ^= or $= or *=
24709          // The test attribute must be unknown in Opera but "safe" for WinRT
24710          // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
24711
24712          if (el.querySelectorAll("[msallowcapture^='']").length) {
24713            rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")");
24714          } // Support: IE8
24715          // Boolean attributes and "value" are not treated correctly
24716
24717
24718          if (!el.querySelectorAll("[selected]").length) {
24719            rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")");
24720          } // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
24721
24722
24723          if (!el.querySelectorAll("[id~=" + expando + "-]").length) {
24724            rbuggyQSA.push("~=");
24725          } // Webkit/Opera - :checked should return selected option elements
24726          // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
24727          // IE8 throws error here and will not see later tests
24728
24729
24730          if (!el.querySelectorAll(":checked").length) {
24731            rbuggyQSA.push(":checked");
24732          } // Support: Safari 8+, iOS 8+
24733          // https://bugs.webkit.org/show_bug.cgi?id=136851
24734          // In-page `selector#id sibling-combinator selector` fails
24735
24736
24737          if (!el.querySelectorAll("a#" + expando + "+*").length) {
24738            rbuggyQSA.push(".#.+[+~]");
24739          }
24740        });
24741        assert(function (el) {
24742          el.innerHTML = "<a href='' disabled='disabled'></a>" + "<select disabled='disabled'><option/></select>"; // Support: Windows 8 Native Apps
24743          // The type and name attributes are restricted during .innerHTML assignment
24744
24745          var input = document.createElement("input");
24746          input.setAttribute("type", "hidden");
24747          el.appendChild(input).setAttribute("name", "D"); // Support: IE8
24748          // Enforce case-sensitivity of name attribute
24749
24750          if (el.querySelectorAll("[name=d]").length) {
24751            rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?=");
24752          } // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
24753          // IE8 throws error here and will not see later tests
24754
24755
24756          if (el.querySelectorAll(":enabled").length !== 2) {
24757            rbuggyQSA.push(":enabled", ":disabled");
24758          } // Support: IE9-11+
24759          // IE's :disabled selector does not pick up the children of disabled fieldsets
24760
24761
24762          docElem.appendChild(el).disabled = true;
24763
24764          if (el.querySelectorAll(":disabled").length !== 2) {
24765            rbuggyQSA.push(":enabled", ":disabled");
24766          } // Opera 10-11 does not throw on post-comma invalid pseudos
24767
24768
24769          el.querySelectorAll("*,:x");
24770          rbuggyQSA.push(",.*:");
24771        });
24772      }
24773
24774      if (support.matchesSelector = rnative.test(matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector)) {
24775        assert(function (el) {
24776          // Check to see if it's possible to do matchesSelector
24777          // on a disconnected node (IE 9)
24778          support.disconnectedMatch = matches.call(el, "*"); // This should fail with an exception
24779          // Gecko does not error, returns false instead
24780
24781          matches.call(el, "[s!='']:x");
24782          rbuggyMatches.push("!=", pseudos);
24783        });
24784      }
24785
24786      rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|"));
24787      rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|"));
24788      /* Contains
24789      ---------------------------------------------------------------------- */
24790
24791      hasCompare = rnative.test(docElem.compareDocumentPosition); // Element contains another
24792      // Purposefully self-exclusive
24793      // As in, an element does not contain itself
24794
24795      contains = hasCompare || rnative.test(docElem.contains) ? function (a, b) {
24796        var adown = a.nodeType === 9 ? a.documentElement : a,
24797            bup = b && b.parentNode;
24798        return a === bup || !!(bup && bup.nodeType === 1 && (adown.contains ? adown.contains(bup) : a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16));
24799      } : function (a, b) {
24800        if (b) {
24801          while (b = b.parentNode) {
24802            if (b === a) {
24803              return true;
24804            }
24805          }
24806        }
24807
24808        return false;
24809      };
24810      /* Sorting
24811      ---------------------------------------------------------------------- */
24812      // Document order sorting
24813
24814      sortOrder = hasCompare ? function (a, b) {
24815        // Flag for duplicate removal
24816        if (a === b) {
24817          hasDuplicate = true;
24818          return 0;
24819        } // Sort on method existence if only one input has compareDocumentPosition
24820
24821
24822        var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
24823
24824        if (compare) {
24825          return compare;
24826        } // Calculate position if both inputs belong to the same document
24827
24828
24829        compare = (a.ownerDocument || a) === (b.ownerDocument || b) ? a.compareDocumentPosition(b) : // Otherwise we know they are disconnected
24830        1; // Disconnected nodes
24831
24832        if (compare & 1 || !support.sortDetached && b.compareDocumentPosition(a) === compare) {
24833          // Choose the first element that is related to our preferred document
24834          if (a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a)) {
24835            return -1;
24836          }
24837
24838          if (b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b)) {
24839            return 1;
24840          } // Maintain original order
24841
24842
24843          return sortInput ? indexOf(sortInput, a) - indexOf(sortInput, b) : 0;
24844        }
24845
24846        return compare & 4 ? -1 : 1;
24847      } : function (a, b) {
24848        // Exit early if the nodes are identical
24849        if (a === b) {
24850          hasDuplicate = true;
24851          return 0;
24852        }
24853
24854        var cur,
24855            i = 0,
24856            aup = a.parentNode,
24857            bup = b.parentNode,
24858            ap = [a],
24859            bp = [b]; // Parentless nodes are either documents or disconnected
24860
24861        if (!aup || !bup) {
24862          return a === document ? -1 : b === document ? 1 : aup ? -1 : bup ? 1 : sortInput ? indexOf(sortInput, a) - indexOf(sortInput, b) : 0; // If the nodes are siblings, we can do a quick check
24863        } else if (aup === bup) {
24864          return siblingCheck(a, b);
24865        } // Otherwise we need full lists of their ancestors for comparison
24866
24867
24868        cur = a;
24869
24870        while (cur = cur.parentNode) {
24871          ap.unshift(cur);
24872        }
24873
24874        cur = b;
24875
24876        while (cur = cur.parentNode) {
24877          bp.unshift(cur);
24878        } // Walk down the tree looking for a discrepancy
24879
24880
24881        while (ap[i] === bp[i]) {
24882          i++;
24883        }
24884
24885        return i ? // Do a sibling check if the nodes have a common ancestor
24886        siblingCheck(ap[i], bp[i]) : // Otherwise nodes in our document sort first
24887        ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0;
24888      };
24889      return document;
24890    };
24891
24892    Sizzle.matches = function (expr, elements) {
24893      return Sizzle(expr, null, null, elements);
24894    };
24895
24896    Sizzle.matchesSelector = function (elem, expr) {
24897      // Set document vars if needed
24898      if ((elem.ownerDocument || elem) !== document) {
24899        setDocument(elem);
24900      } // Make sure that attribute selectors are quoted
24901
24902
24903      expr = expr.replace(rattributeQuotes, "='$1']");
24904
24905      if (support.matchesSelector && documentIsHTML && !compilerCache[expr + " "] && (!rbuggyMatches || !rbuggyMatches.test(expr)) && (!rbuggyQSA || !rbuggyQSA.test(expr))) {
24906        try {
24907          var ret = matches.call(elem, expr); // IE 9's matchesSelector returns false on disconnected nodes
24908
24909          if (ret || support.disconnectedMatch || // As well, disconnected nodes are said to be in a document
24910          // fragment in IE 9
24911          elem.document && elem.document.nodeType !== 11) {
24912            return ret;
24913          }
24914        } catch (e) {}
24915      }
24916
24917      return Sizzle(expr, document, null, [elem]).length > 0;
24918    };
24919
24920    Sizzle.contains = function (context, elem) {
24921      // Set document vars if needed
24922      if ((context.ownerDocument || context) !== document) {
24923        setDocument(context);
24924      }
24925
24926      return contains(context, elem);
24927    };
24928
24929    Sizzle.attr = function (elem, name) {
24930      // Set document vars if needed
24931      if ((elem.ownerDocument || elem) !== document) {
24932        setDocument(elem);
24933      }
24934
24935      var fn = Expr.attrHandle[name.toLowerCase()],
24936          // Don't get fooled by Object.prototype properties (jQuery #13807)
24937      val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? fn(elem, name, !documentIsHTML) : undefined;
24938      return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute(name) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;
24939    };
24940
24941    Sizzle.escape = function (sel) {
24942      return (sel + "").replace(rcssescape, fcssescape);
24943    };
24944
24945    Sizzle.error = function (msg) {
24946      throw new Error("Syntax error, unrecognized expression: " + msg);
24947    };
24948    /**
24949     * Document sorting and removing duplicates
24950     * @param {ArrayLike} results
24951     */
24952
24953
24954    Sizzle.uniqueSort = function (results) {
24955      var elem,
24956          duplicates = [],
24957          j = 0,
24958          i = 0; // Unless we *know* we can detect duplicates, assume their presence
24959
24960      hasDuplicate = !support.detectDuplicates;
24961      sortInput = !support.sortStable && results.slice(0);
24962      results.sort(sortOrder);
24963
24964      if (hasDuplicate) {
24965        while (elem = results[i++]) {
24966          if (elem === results[i]) {
24967            j = duplicates.push(i);
24968          }
24969        }
24970
24971        while (j--) {
24972          results.splice(duplicates[j], 1);
24973        }
24974      } // Clear input after sorting to release objects
24975      // See https://github.com/jquery/sizzle/pull/225
24976
24977
24978      sortInput = null;
24979      return results;
24980    };
24981    /**
24982     * Utility function for retrieving the text value of an array of DOM nodes
24983     * @param {Array|Element} elem
24984     */
24985
24986
24987    getText = Sizzle.getText = function (elem) {
24988      var node,
24989          ret = "",
24990          i = 0,
24991          nodeType = elem.nodeType;
24992
24993      if (!nodeType) {
24994        // If no nodeType, this is expected to be an array
24995        while (node = elem[i++]) {
24996          // Do not traverse comment nodes
24997          ret += getText(node);
24998        }
24999      } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
25000        // Use textContent for elements
25001        // innerText usage removed for consistency of new lines (jQuery #11153)
25002        if (typeof elem.textContent === "string") {
25003          return elem.textContent;
25004        } else {
25005          // Traverse its children
25006          for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
25007            ret += getText(elem);
25008          }
25009        }
25010      } else if (nodeType === 3 || nodeType === 4) {
25011        return elem.nodeValue;
25012      } // Do not include comment or processing instruction nodes
25013
25014
25015      return ret;
25016    };
25017
25018    Expr = Sizzle.selectors = {
25019      // Can be adjusted by the user
25020      cacheLength: 50,
25021      createPseudo: markFunction,
25022      match: matchExpr,
25023      attrHandle: {},
25024      find: {},
25025      relative: {
25026        ">": {
25027          dir: "parentNode",
25028          first: true
25029        },
25030        " ": {
25031          dir: "parentNode"
25032        },
25033        "+": {
25034          dir: "previousSibling",
25035          first: true
25036        },
25037        "~": {
25038          dir: "previousSibling"
25039        }
25040      },
25041      preFilter: {
25042        "ATTR": function ATTR(match) {
25043          match[1] = match[1].replace(runescape, funescape); // Move the given value to match[3] whether quoted or unquoted
25044
25045          match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape);
25046
25047          if (match[2] === "~=") {
25048            match[3] = " " + match[3] + " ";
25049          }
25050
25051          return match.slice(0, 4);
25052        },
25053        "CHILD": function CHILD(match) {
25054          /* matches from matchExpr["CHILD"]
25055          	1 type (only|nth|...)
25056          	2 what (child|of-type)
25057          	3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
25058          	4 xn-component of xn+y argument ([+-]?\d*n|)
25059          	5 sign of xn-component
25060          	6 x of xn-component
25061          	7 sign of y-component
25062          	8 y of y-component
25063          */
25064          match[1] = match[1].toLowerCase();
25065
25066          if (match[1].slice(0, 3) === "nth") {
25067            // nth-* requires argument
25068            if (!match[3]) {
25069              Sizzle.error(match[0]);
25070            } // numeric x and y parameters for Expr.filter.CHILD
25071            // remember that false/true cast respectively to 0/1
25072
25073
25074            match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd"));
25075            match[5] = +(match[7] + match[8] || match[3] === "odd"); // other types prohibit arguments
25076          } else if (match[3]) {
25077            Sizzle.error(match[0]);
25078          }
25079
25080          return match;
25081        },
25082        "PSEUDO": function PSEUDO(match) {
25083          var excess,
25084              unquoted = !match[6] && match[2];
25085
25086          if (matchExpr["CHILD"].test(match[0])) {
25087            return null;
25088          } // Accept quoted arguments as-is
25089
25090
25091          if (match[3]) {
25092            match[2] = match[4] || match[5] || ""; // Strip excess characters from unquoted arguments
25093          } else if (unquoted && rpseudo.test(unquoted) && ( // Get excess from tokenize (recursively)
25094          excess = tokenize(unquoted, true)) && ( // advance to the next closing parenthesis
25095          excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) {
25096            // excess is a negative index
25097            match[0] = match[0].slice(0, excess);
25098            match[2] = unquoted.slice(0, excess);
25099          } // Return only captures needed by the pseudo filter method (type and argument)
25100
25101
25102          return match.slice(0, 3);
25103        }
25104      },
25105      filter: {
25106        "TAG": function TAG(nodeNameSelector) {
25107          var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase();
25108          return nodeNameSelector === "*" ? function () {
25109            return true;
25110          } : function (elem) {
25111            return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
25112          };
25113        },
25114        "CLASS": function CLASS(className) {
25115          var pattern = classCache[className + " "];
25116          return pattern || (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && classCache(className, function (elem) {
25117            return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "");
25118          });
25119        },
25120        "ATTR": function ATTR(name, operator, check) {
25121          return function (elem) {
25122            var result = Sizzle.attr(elem, name);
25123
25124            if (result == null) {
25125              return operator === "!=";
25126            }
25127
25128            if (!operator) {
25129              return true;
25130            }
25131
25132            result += "";
25133            return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf(check) === 0 : operator === "*=" ? check && result.indexOf(check) > -1 : operator === "$=" ? check && result.slice(-check.length) === check : operator === "~=" ? (" " + result.replace(rwhitespace, " ") + " ").indexOf(check) > -1 : operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" : false;
25134          };
25135        },
25136        "CHILD": function CHILD(type, what, argument, first, last) {
25137          var simple = type.slice(0, 3) !== "nth",
25138              forward = type.slice(-4) !== "last",
25139              ofType = what === "of-type";
25140          return first === 1 && last === 0 ? // Shortcut for :nth-*(n)
25141          function (elem) {
25142            return !!elem.parentNode;
25143          } : function (elem, context, xml) {
25144            var cache,
25145                uniqueCache,
25146                outerCache,
25147                node,
25148                nodeIndex,
25149                start,
25150                dir = simple !== forward ? "nextSibling" : "previousSibling",
25151                parent = elem.parentNode,
25152                name = ofType && elem.nodeName.toLowerCase(),
25153                useCache = !xml && !ofType,
25154                diff = false;
25155
25156            if (parent) {
25157              // :(first|last|only)-(child|of-type)
25158              if (simple) {
25159                while (dir) {
25160                  node = elem;
25161
25162                  while (node = node[dir]) {
25163                    if (ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) {
25164                      return false;
25165                    }
25166                  } // Reverse direction for :only-* (if we haven't yet done so)
25167
25168
25169                  start = dir = type === "only" && !start && "nextSibling";
25170                }
25171
25172                return true;
25173              }
25174
25175              start = [forward ? parent.firstChild : parent.lastChild]; // non-xml :nth-child(...) stores cache data on `parent`
25176
25177              if (forward && useCache) {
25178                // Seek `elem` from a previously-cached index
25179                // ...in a gzip-friendly way
25180                node = parent;
25181                outerCache = node[expando] || (node[expando] = {}); // Support: IE <9 only
25182                // Defend against cloned attroperties (jQuery gh-1709)
25183
25184                uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});
25185                cache = uniqueCache[type] || [];
25186                nodeIndex = cache[0] === dirruns && cache[1];
25187                diff = nodeIndex && cache[2];
25188                node = nodeIndex && parent.childNodes[nodeIndex];
25189
25190                while (node = ++nodeIndex && node && node[dir] || ( // Fallback to seeking `elem` from the start
25191                diff = nodeIndex = 0) || start.pop()) {
25192                  // When found, cache indexes on `parent` and break
25193                  if (node.nodeType === 1 && ++diff && node === elem) {
25194                    uniqueCache[type] = [dirruns, nodeIndex, diff];
25195                    break;
25196                  }
25197                }
25198              } else {
25199                // Use previously-cached element index if available
25200                if (useCache) {
25201                  // ...in a gzip-friendly way
25202                  node = elem;
25203                  outerCache = node[expando] || (node[expando] = {}); // Support: IE <9 only
25204                  // Defend against cloned attroperties (jQuery gh-1709)
25205
25206                  uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});
25207                  cache = uniqueCache[type] || [];
25208                  nodeIndex = cache[0] === dirruns && cache[1];
25209                  diff = nodeIndex;
25210                } // xml :nth-child(...)
25211                // or :nth-last-child(...) or :nth(-last)?-of-type(...)
25212
25213
25214                if (diff === false) {
25215                  // Use the same loop as above to seek `elem` from the start
25216                  while (node = ++nodeIndex && node && node[dir] || (diff = nodeIndex = 0) || start.pop()) {
25217                    if ((ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) && ++diff) {
25218                      // Cache the index of each encountered element
25219                      if (useCache) {
25220                        outerCache = node[expando] || (node[expando] = {}); // Support: IE <9 only
25221                        // Defend against cloned attroperties (jQuery gh-1709)
25222
25223                        uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});
25224                        uniqueCache[type] = [dirruns, diff];
25225                      }
25226
25227                      if (node === elem) {
25228                        break;
25229                      }
25230                    }
25231                  }
25232                }
25233              } // Incorporate the offset, then check against cycle size
25234
25235
25236              diff -= last;
25237              return diff === first || diff % first === 0 && diff / first >= 0;
25238            }
25239          };
25240        },
25241        "PSEUDO": function PSEUDO(pseudo, argument) {
25242          // pseudo-class names are case-insensitive
25243          // http://www.w3.org/TR/selectors/#pseudo-classes
25244          // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
25245          // Remember that setFilters inherits from pseudos
25246          var args,
25247              fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || Sizzle.error("unsupported pseudo: " + pseudo); // The user may use createPseudo to indicate that
25248          // arguments are needed to create the filter function
25249          // just as Sizzle does
25250
25251          if (fn[expando]) {
25252            return fn(argument);
25253          } // But maintain support for old signatures
25254
25255
25256          if (fn.length > 1) {
25257            args = [pseudo, pseudo, "", argument];
25258            return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function (seed, matches) {
25259              var idx,
25260                  matched = fn(seed, argument),
25261                  i = matched.length;
25262
25263              while (i--) {
25264                idx = indexOf(seed, matched[i]);
25265                seed[idx] = !(matches[idx] = matched[i]);
25266              }
25267            }) : function (elem) {
25268              return fn(elem, 0, args);
25269            };
25270          }
25271
25272          return fn;
25273        }
25274      },
25275      pseudos: {
25276        // Potentially complex pseudos
25277        "not": markFunction(function (selector) {
25278          // Trim the selector passed to compile
25279          // to avoid treating leading and trailing
25280          // spaces as combinators
25281          var input = [],
25282              results = [],
25283              matcher = compile(selector.replace(rtrim, "$1"));
25284          return matcher[expando] ? markFunction(function (seed, matches, context, xml) {
25285            var elem,
25286                unmatched = matcher(seed, null, xml, []),
25287                i = seed.length; // Match elements unmatched by `matcher`
25288
25289            while (i--) {
25290              if (elem = unmatched[i]) {
25291                seed[i] = !(matches[i] = elem);
25292              }
25293            }
25294          }) : function (elem, context, xml) {
25295            input[0] = elem;
25296            matcher(input, null, xml, results); // Don't keep the element (issue #299)
25297
25298            input[0] = null;
25299            return !results.pop();
25300          };
25301        }),
25302        "has": markFunction(function (selector) {
25303          return function (elem) {
25304            return Sizzle(selector, elem).length > 0;
25305          };
25306        }),
25307        "contains": markFunction(function (text) {
25308          text = text.replace(runescape, funescape);
25309          return function (elem) {
25310            return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1;
25311          };
25312        }),
25313        // "Whether an element is represented by a :lang() selector
25314        // is based solely on the element's language value
25315        // being equal to the identifier C,
25316        // or beginning with the identifier C immediately followed by "-".
25317        // The matching of C against the element's language value is performed case-insensitively.
25318        // The identifier C does not have to be a valid language name."
25319        // http://www.w3.org/TR/selectors/#lang-pseudo
25320        "lang": markFunction(function (lang) {
25321          // lang value must be a valid identifier
25322          if (!ridentifier.test(lang || "")) {
25323            Sizzle.error("unsupported lang: " + lang);
25324          }
25325
25326          lang = lang.replace(runescape, funescape).toLowerCase();
25327          return function (elem) {
25328            var elemLang;
25329
25330            do {
25331              if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) {
25332                elemLang = elemLang.toLowerCase();
25333                return elemLang === lang || elemLang.indexOf(lang + "-") === 0;
25334              }
25335            } while ((elem = elem.parentNode) && elem.nodeType === 1);
25336
25337            return false;
25338          };
25339        }),
25340        // Miscellaneous
25341        "target": function target(elem) {
25342          var hash = window.location && window.location.hash;
25343          return hash && hash.slice(1) === elem.id;
25344        },
25345        "root": function root(elem) {
25346          return elem === docElem;
25347        },
25348        "focus": function focus(elem) {
25349          return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
25350        },
25351        // Boolean properties
25352        "enabled": createDisabledPseudo(false),
25353        "disabled": createDisabledPseudo(true),
25354        "checked": function checked(elem) {
25355          // In CSS3, :checked should return both checked and selected elements
25356          // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
25357          var nodeName = elem.nodeName.toLowerCase();
25358          return nodeName === "input" && !!elem.checked || nodeName === "option" && !!elem.selected;
25359        },
25360        "selected": function selected(elem) {
25361          // Accessing this property makes selected-by-default
25362          // options in Safari work properly
25363          if (elem.parentNode) {
25364            elem.parentNode.selectedIndex;
25365          }
25366
25367          return elem.selected === true;
25368        },
25369        // Contents
25370        "empty": function empty(elem) {
25371          // http://www.w3.org/TR/selectors/#empty-pseudo
25372          // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
25373          //   but not by others (comment: 8; processing instruction: 7; etc.)
25374          // nodeType < 6 works because attributes (2) do not appear as children
25375          for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
25376            if (elem.nodeType < 6) {
25377              return false;
25378            }
25379          }
25380
25381          return true;
25382        },
25383        "parent": function parent(elem) {
25384          return !Expr.pseudos["empty"](elem);
25385        },
25386        // Element/input types
25387        "header": function header(elem) {
25388          return rheader.test(elem.nodeName);
25389        },
25390        "input": function input(elem) {
25391          return rinputs.test(elem.nodeName);
25392        },
25393        "button": function button(elem) {
25394          var name = elem.nodeName.toLowerCase();
25395          return name === "input" && elem.type === "button" || name === "button";
25396        },
25397        "text": function text(elem) {
25398          var attr;
25399          return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && ( // Support: IE<8
25400          // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
25401          (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text");
25402        },
25403        // Position-in-collection
25404        "first": createPositionalPseudo(function () {
25405          return [0];
25406        }),
25407        "last": createPositionalPseudo(function (matchIndexes, length) {
25408          return [length - 1];
25409        }),
25410        "eq": createPositionalPseudo(function (matchIndexes, length, argument) {
25411          return [argument < 0 ? argument + length : argument];
25412        }),
25413        "even": createPositionalPseudo(function (matchIndexes, length) {
25414          var i = 0;
25415
25416          for (; i < length; i += 2) {
25417            matchIndexes.push(i);
25418          }
25419
25420          return matchIndexes;
25421        }),
25422        "odd": createPositionalPseudo(function (matchIndexes, length) {
25423          var i = 1;
25424
25425          for (; i < length; i += 2) {
25426            matchIndexes.push(i);
25427          }
25428
25429          return matchIndexes;
25430        }),
25431        "lt": createPositionalPseudo(function (matchIndexes, length, argument) {
25432          var i = argument < 0 ? argument + length : argument;
25433
25434          for (; --i >= 0;) {
25435            matchIndexes.push(i);
25436          }
25437
25438          return matchIndexes;
25439        }),
25440        "gt": createPositionalPseudo(function (matchIndexes, length, argument) {
25441          var i = argument < 0 ? argument + length : argument;
25442
25443          for (; ++i < length;) {
25444            matchIndexes.push(i);
25445          }
25446
25447          return matchIndexes;
25448        })
25449      }
25450    };
25451    Expr.pseudos["nth"] = Expr.pseudos["eq"]; // Add button/input type pseudos
25452
25453    for (i in {
25454      radio: true,
25455      checkbox: true,
25456      file: true,
25457      password: true,
25458      image: true
25459    }) {
25460      Expr.pseudos[i] = createInputPseudo(i);
25461    }
25462
25463    for (i in {
25464      submit: true,
25465      reset: true
25466    }) {
25467      Expr.pseudos[i] = createButtonPseudo(i);
25468    } // Easy API for creating new setFilters
25469
25470
25471    function setFilters() {}
25472
25473    setFilters.prototype = Expr.filters = Expr.pseudos;
25474    Expr.setFilters = new setFilters();
25475
25476    tokenize = Sizzle.tokenize = function (selector, parseOnly) {
25477      var matched,
25478          match,
25479          tokens,
25480          type,
25481          soFar,
25482          groups,
25483          preFilters,
25484          cached = tokenCache[selector + " "];
25485
25486      if (cached) {
25487        return parseOnly ? 0 : cached.slice(0);
25488      }
25489
25490      soFar = selector;
25491      groups = [];
25492      preFilters = Expr.preFilter;
25493
25494      while (soFar) {
25495        // Comma and first run
25496        if (!matched || (match = rcomma.exec(soFar))) {
25497          if (match) {
25498            // Don't consume trailing commas as valid
25499            soFar = soFar.slice(match[0].length) || soFar;
25500          }
25501
25502          groups.push(tokens = []);
25503        }
25504
25505        matched = false; // Combinators
25506
25507        if (match = rcombinators.exec(soFar)) {
25508          matched = match.shift();
25509          tokens.push({
25510            value: matched,
25511            // Cast descendant combinators to space
25512            type: match[0].replace(rtrim, " ")
25513          });
25514          soFar = soFar.slice(matched.length);
25515        } // Filters
25516
25517
25518        for (type in Expr.filter) {
25519          if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match)))) {
25520            matched = match.shift();
25521            tokens.push({
25522              value: matched,
25523              type: type,
25524              matches: match
25525            });
25526            soFar = soFar.slice(matched.length);
25527          }
25528        }
25529
25530        if (!matched) {
25531          break;
25532        }
25533      } // Return the length of the invalid excess
25534      // if we're just parsing
25535      // Otherwise, throw an error or return tokens
25536
25537
25538      return parseOnly ? soFar.length : soFar ? Sizzle.error(selector) : // Cache the tokens
25539      tokenCache(selector, groups).slice(0);
25540    };
25541
25542    function toSelector(tokens) {
25543      var i = 0,
25544          len = tokens.length,
25545          selector = "";
25546
25547      for (; i < len; i++) {
25548        selector += tokens[i].value;
25549      }
25550
25551      return selector;
25552    }
25553
25554    function addCombinator(matcher, combinator, base) {
25555      var dir = combinator.dir,
25556          skip = combinator.next,
25557          key = skip || dir,
25558          checkNonElements = base && key === "parentNode",
25559          doneName = done++;
25560      return combinator.first ? // Check against closest ancestor/preceding element
25561      function (elem, context, xml) {
25562        while (elem = elem[dir]) {
25563          if (elem.nodeType === 1 || checkNonElements) {
25564            return matcher(elem, context, xml);
25565          }
25566        }
25567
25568        return false;
25569      } : // Check against all ancestor/preceding elements
25570      function (elem, context, xml) {
25571        var oldCache,
25572            uniqueCache,
25573            outerCache,
25574            newCache = [dirruns, doneName]; // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
25575
25576        if (xml) {
25577          while (elem = elem[dir]) {
25578            if (elem.nodeType === 1 || checkNonElements) {
25579              if (matcher(elem, context, xml)) {
25580                return true;
25581              }
25582            }
25583          }
25584        } else {
25585          while (elem = elem[dir]) {
25586            if (elem.nodeType === 1 || checkNonElements) {
25587              outerCache = elem[expando] || (elem[expando] = {}); // Support: IE <9 only
25588              // Defend against cloned attroperties (jQuery gh-1709)
25589
25590              uniqueCache = outerCache[elem.uniqueID] || (outerCache[elem.uniqueID] = {});
25591
25592              if (skip && skip === elem.nodeName.toLowerCase()) {
25593                elem = elem[dir] || elem;
25594              } else if ((oldCache = uniqueCache[key]) && oldCache[0] === dirruns && oldCache[1] === doneName) {
25595                // Assign to newCache so results back-propagate to previous elements
25596                return newCache[2] = oldCache[2];
25597              } else {
25598                // Reuse newcache so results back-propagate to previous elements
25599                uniqueCache[key] = newCache; // A match means we're done; a fail means we have to keep checking
25600
25601                if (newCache[2] = matcher(elem, context, xml)) {
25602                  return true;
25603                }
25604              }
25605            }
25606          }
25607        }
25608
25609        return false;
25610      };
25611    }
25612
25613    function elementMatcher(matchers) {
25614      return matchers.length > 1 ? function (elem, context, xml) {
25615        var i = matchers.length;
25616
25617        while (i--) {
25618          if (!matchers[i](elem, context, xml)) {
25619            return false;
25620          }
25621        }
25622
25623        return true;
25624      } : matchers[0];
25625    }
25626
25627    function multipleContexts(selector, contexts, results) {
25628      var i = 0,
25629          len = contexts.length;
25630
25631      for (; i < len; i++) {
25632        Sizzle(selector, contexts[i], results);
25633      }
25634
25635      return results;
25636    }
25637
25638    function condense(unmatched, map, filter, context, xml) {
25639      var elem,
25640          newUnmatched = [],
25641          i = 0,
25642          len = unmatched.length,
25643          mapped = map != null;
25644
25645      for (; i < len; i++) {
25646        if (elem = unmatched[i]) {
25647          if (!filter || filter(elem, context, xml)) {
25648            newUnmatched.push(elem);
25649
25650            if (mapped) {
25651              map.push(i);
25652            }
25653          }
25654        }
25655      }
25656
25657      return newUnmatched;
25658    }
25659
25660    function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {
25661      if (postFilter && !postFilter[expando]) {
25662        postFilter = setMatcher(postFilter);
25663      }
25664
25665      if (postFinder && !postFinder[expando]) {
25666        postFinder = setMatcher(postFinder, postSelector);
25667      }
25668
25669      return markFunction(function (seed, results, context, xml) {
25670        var temp,
25671            i,
25672            elem,
25673            preMap = [],
25674            postMap = [],
25675            preexisting = results.length,
25676            // Get initial elements from seed or context
25677        elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []),
25678            // Prefilter to get matcher input, preserving a map for seed-results synchronization
25679        matcherIn = preFilter && (seed || !selector) ? condense(elems, preMap, preFilter, context, xml) : elems,
25680            matcherOut = matcher ? // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
25681        postFinder || (seed ? preFilter : preexisting || postFilter) ? // ...intermediate processing is necessary
25682        [] : // ...otherwise use results directly
25683        results : matcherIn; // Find primary matches
25684
25685        if (matcher) {
25686          matcher(matcherIn, matcherOut, context, xml);
25687        } // Apply postFilter
25688
25689
25690        if (postFilter) {
25691          temp = condense(matcherOut, postMap);
25692          postFilter(temp, [], context, xml); // Un-match failing elements by moving them back to matcherIn
25693
25694          i = temp.length;
25695
25696          while (i--) {
25697            if (elem = temp[i]) {
25698              matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem);
25699            }
25700          }
25701        }
25702
25703        if (seed) {
25704          if (postFinder || preFilter) {
25705            if (postFinder) {
25706              // Get the final matcherOut by condensing this intermediate into postFinder contexts
25707              temp = [];
25708              i = matcherOut.length;
25709
25710              while (i--) {
25711                if (elem = matcherOut[i]) {
25712                  // Restore matcherIn since elem is not yet a final match
25713                  temp.push(matcherIn[i] = elem);
25714                }
25715              }
25716
25717              postFinder(null, matcherOut = [], temp, xml);
25718            } // Move matched elements from seed to results to keep them synchronized
25719
25720
25721            i = matcherOut.length;
25722
25723            while (i--) {
25724              if ((elem = matcherOut[i]) && (temp = postFinder ? indexOf(seed, elem) : preMap[i]) > -1) {
25725                seed[temp] = !(results[temp] = elem);
25726              }
25727            }
25728          } // Add elements to results, through postFinder if defined
25729
25730        } else {
25731          matcherOut = condense(matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut);
25732
25733          if (postFinder) {
25734            postFinder(null, results, matcherOut, xml);
25735          } else {
25736            push.apply(results, matcherOut);
25737          }
25738        }
25739      });
25740    }
25741
25742    function matcherFromTokens(tokens) {
25743      var checkContext,
25744          matcher,
25745          j,
25746          len = tokens.length,
25747          leadingRelative = Expr.relative[tokens[0].type],
25748          implicitRelative = leadingRelative || Expr.relative[" "],
25749          i = leadingRelative ? 1 : 0,
25750          // The foundational matcher ensures that elements are reachable from top-level context(s)
25751      matchContext = addCombinator(function (elem) {
25752        return elem === checkContext;
25753      }, implicitRelative, true),
25754          matchAnyContext = addCombinator(function (elem) {
25755        return indexOf(checkContext, elem) > -1;
25756      }, implicitRelative, true),
25757          matchers = [function (elem, context, xml) {
25758        var ret = !leadingRelative && (xml || context !== outermostContext) || ((checkContext = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml)); // Avoid hanging onto element (issue #299)
25759
25760        checkContext = null;
25761        return ret;
25762      }];
25763
25764      for (; i < len; i++) {
25765        if (matcher = Expr.relative[tokens[i].type]) {
25766          matchers = [addCombinator(elementMatcher(matchers), matcher)];
25767        } else {
25768          matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches); // Return special upon seeing a positional matcher
25769
25770          if (matcher[expando]) {
25771            // Find the next relative operator (if any) for proper handling
25772            j = ++i;
25773
25774            for (; j < len; j++) {
25775              if (Expr.relative[tokens[j].type]) {
25776                break;
25777              }
25778            }
25779
25780            return setMatcher(i > 1 && elementMatcher(matchers), i > 1 && toSelector( // If the preceding token was a descendant combinator, insert an implicit any-element `*`
25781            tokens.slice(0, i - 1).concat({
25782              value: tokens[i - 2].type === " " ? "*" : ""
25783            })).replace(rtrim, "$1"), matcher, i < j && matcherFromTokens(tokens.slice(i, j)), j < len && matcherFromTokens(tokens = tokens.slice(j)), j < len && toSelector(tokens));
25784          }
25785
25786          matchers.push(matcher);
25787        }
25788      }
25789
25790      return elementMatcher(matchers);
25791    }
25792
25793    function matcherFromGroupMatchers(elementMatchers, setMatchers) {
25794      var bySet = setMatchers.length > 0,
25795          byElement = elementMatchers.length > 0,
25796          superMatcher = function superMatcher(seed, context, xml, results, outermost) {
25797        var elem,
25798            j,
25799            matcher,
25800            matchedCount = 0,
25801            i = "0",
25802            unmatched = seed && [],
25803            setMatched = [],
25804            contextBackup = outermostContext,
25805            // We must always have either seed elements or outermost context
25806        elems = seed || byElement && Expr.find["TAG"]("*", outermost),
25807            // Use integer dirruns iff this is the outermost matcher
25808        dirrunsUnique = dirruns += contextBackup == null ? 1 : Math.random() || 0.1,
25809            len = elems.length;
25810
25811        if (outermost) {
25812          outermostContext = context === document || context || outermost;
25813        } // Add elements passing elementMatchers directly to results
25814        // Support: IE<9, Safari
25815        // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
25816
25817
25818        for (; i !== len && (elem = elems[i]) != null; i++) {
25819          if (byElement && elem) {
25820            j = 0;
25821
25822            if (!context && elem.ownerDocument !== document) {
25823              setDocument(elem);
25824              xml = !documentIsHTML;
25825            }
25826
25827            while (matcher = elementMatchers[j++]) {
25828              if (matcher(elem, context || document, xml)) {
25829                results.push(elem);
25830                break;
25831              }
25832            }
25833
25834            if (outermost) {
25835              dirruns = dirrunsUnique;
25836            }
25837          } // Track unmatched elements for set filters
25838
25839
25840          if (bySet) {
25841            // They will have gone through all possible matchers
25842            if (elem = !matcher && elem) {
25843              matchedCount--;
25844            } // Lengthen the array for every element, matched or not
25845
25846
25847            if (seed) {
25848              unmatched.push(elem);
25849            }
25850          }
25851        } // `i` is now the count of elements visited above, and adding it to `matchedCount`
25852        // makes the latter nonnegative.
25853
25854
25855        matchedCount += i; // Apply set filters to unmatched elements
25856        // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
25857        // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
25858        // no element matchers and no seed.
25859        // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
25860        // case, which will result in a "00" `matchedCount` that differs from `i` but is also
25861        // numerically zero.
25862
25863        if (bySet && i !== matchedCount) {
25864          j = 0;
25865
25866          while (matcher = setMatchers[j++]) {
25867            matcher(unmatched, setMatched, context, xml);
25868          }
25869
25870          if (seed) {
25871            // Reintegrate element matches to eliminate the need for sorting
25872            if (matchedCount > 0) {
25873              while (i--) {
25874                if (!(unmatched[i] || setMatched[i])) {
25875                  setMatched[i] = pop.call(results);
25876                }
25877              }
25878            } // Discard index placeholder values to get only actual matches
25879
25880
25881            setMatched = condense(setMatched);
25882          } // Add matches to results
25883
25884
25885          push.apply(results, setMatched); // Seedless set matches succeeding multiple successful matchers stipulate sorting
25886
25887          if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) {
25888            Sizzle.uniqueSort(results);
25889          }
25890        } // Override manipulation of globals by nested matchers
25891
25892
25893        if (outermost) {
25894          dirruns = dirrunsUnique;
25895          outermostContext = contextBackup;
25896        }
25897
25898        return unmatched;
25899      };
25900
25901      return bySet ? markFunction(superMatcher) : superMatcher;
25902    }
25903
25904    compile = Sizzle.compile = function (selector, match
25905    /* Internal Use Only */
25906    ) {
25907      var i,
25908          setMatchers = [],
25909          elementMatchers = [],
25910          cached = compilerCache[selector + " "];
25911
25912      if (!cached) {
25913        // Generate a function of recursive functions that can be used to check each element
25914        if (!match) {
25915          match = tokenize(selector);
25916        }
25917
25918        i = match.length;
25919
25920        while (i--) {
25921          cached = matcherFromTokens(match[i]);
25922
25923          if (cached[expando]) {
25924            setMatchers.push(cached);
25925          } else {
25926            elementMatchers.push(cached);
25927          }
25928        } // Cache the compiled function
25929
25930
25931        cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers)); // Save selector and tokenization
25932
25933        cached.selector = selector;
25934      }
25935
25936      return cached;
25937    };
25938    /**
25939     * A low-level selection function that works with Sizzle's compiled
25940     *  selector functions
25941     * @param {String|Function} selector A selector or a pre-compiled
25942     *  selector function built with Sizzle.compile
25943     * @param {Element} context
25944     * @param {Array} [results]
25945     * @param {Array} [seed] A set of elements to match against
25946     */
25947
25948
25949    select = Sizzle.select = function (selector, context, results, seed) {
25950      var i,
25951          tokens,
25952          token,
25953          type,
25954          find,
25955          compiled = typeof selector === "function" && selector,
25956          match = !seed && tokenize(selector = compiled.selector || selector);
25957      results = results || []; // Try to minimize operations if there is only one selector in the list and no seed
25958      // (the latter of which guarantees us context)
25959
25960      if (match.length === 1) {
25961        // Reduce context if the leading compound selector is an ID
25962        tokens = match[0] = match[0].slice(0);
25963
25964        if (tokens.length > 2 && (token = tokens[0]).type === "ID" && context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) {
25965          context = (Expr.find["ID"](token.matches[0].replace(runescape, funescape), context) || [])[0];
25966
25967          if (!context) {
25968            return results; // Precompiled matchers will still verify ancestry, so step up a level
25969          } else if (compiled) {
25970            context = context.parentNode;
25971          }
25972
25973          selector = selector.slice(tokens.shift().value.length);
25974        } // Fetch a seed set for right-to-left matching
25975
25976
25977        i = matchExpr["needsContext"].test(selector) ? 0 : tokens.length;
25978
25979        while (i--) {
25980          token = tokens[i]; // Abort if we hit a combinator
25981
25982          if (Expr.relative[type = token.type]) {
25983            break;
25984          }
25985
25986          if (find = Expr.find[type]) {
25987            // Search, expanding context for leading sibling combinators
25988            if (seed = find(token.matches[0].replace(runescape, funescape), rsibling.test(tokens[0].type) && testContext(context.parentNode) || context)) {
25989              // If seed is empty or no tokens remain, we can return early
25990              tokens.splice(i, 1);
25991              selector = seed.length && toSelector(tokens);
25992
25993              if (!selector) {
25994                push.apply(results, seed);
25995                return results;
25996              }
25997
25998              break;
25999            }
26000          }
26001        }
26002      } // Compile and execute a filtering function if one is not provided
26003      // Provide `match` to avoid retokenization if we modified the selector above
26004
26005
26006      (compiled || compile(selector, match))(seed, context, !documentIsHTML, results, !context || rsibling.test(selector) && testContext(context.parentNode) || context);
26007      return results;
26008    }; // One-time assignments
26009    // Sort stability
26010
26011
26012    support.sortStable = expando.split("").sort(sortOrder).join("") === expando; // Support: Chrome 14-35+
26013    // Always assume duplicates if they aren't passed to the comparison function
26014
26015    support.detectDuplicates = !!hasDuplicate; // Initialize against the default document
26016
26017    setDocument(); // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
26018    // Detached nodes confoundingly follow *each other*
26019
26020    support.sortDetached = assert(function (el) {
26021      // Should return 1, but returns 4 (following)
26022      return el.compareDocumentPosition(document.createElement("fieldset")) & 1;
26023    }); // Support: IE<8
26024    // Prevent attribute/property "interpolation"
26025    // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
26026
26027    if (!assert(function (el) {
26028      el.innerHTML = "<a href='#'></a>";
26029      return el.firstChild.getAttribute("href") === "#";
26030    })) {
26031      addHandle("type|href|height|width", function (elem, name, isXML) {
26032        if (!isXML) {
26033          return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2);
26034        }
26035      });
26036    } // Support: IE<9
26037    // Use defaultValue in place of getAttribute("value")
26038
26039
26040    if (!support.attributes || !assert(function (el) {
26041      el.innerHTML = "<input/>";
26042      el.firstChild.setAttribute("value", "");
26043      return el.firstChild.getAttribute("value") === "";
26044    })) {
26045      addHandle("value", function (elem, name, isXML) {
26046        if (!isXML && elem.nodeName.toLowerCase() === "input") {
26047          return elem.defaultValue;
26048        }
26049      });
26050    } // Support: IE<9
26051    // Use getAttributeNode to fetch booleans when getAttribute lies
26052
26053
26054    if (!assert(function (el) {
26055      return el.getAttribute("disabled") == null;
26056    })) {
26057      addHandle(booleans, function (elem, name, isXML) {
26058        var val;
26059
26060        if (!isXML) {
26061          return elem[name] === true ? name.toLowerCase() : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;
26062        }
26063      });
26064    }
26065
26066    return Sizzle;
26067  }(window);
26068
26069  jQuery.find = Sizzle;
26070  jQuery.expr = Sizzle.selectors; // Deprecated
26071
26072  jQuery.expr[":"] = jQuery.expr.pseudos;
26073  jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
26074  jQuery.text = Sizzle.getText;
26075  jQuery.isXMLDoc = Sizzle.isXML;
26076  jQuery.contains = Sizzle.contains;
26077  jQuery.escapeSelector = Sizzle.escape;
26078
26079  var dir = function dir(elem, _dir, until) {
26080    var matched = [],
26081        truncate = until !== undefined;
26082
26083    while ((elem = elem[_dir]) && elem.nodeType !== 9) {
26084      if (elem.nodeType === 1) {
26085        if (truncate && jQuery(elem).is(until)) {
26086          break;
26087        }
26088
26089        matched.push(elem);
26090      }
26091    }
26092
26093    return matched;
26094  };
26095
26096  var _siblings = function siblings(n, elem) {
26097    var matched = [];
26098
26099    for (; n; n = n.nextSibling) {
26100      if (n.nodeType === 1 && n !== elem) {
26101        matched.push(n);
26102      }
26103    }
26104
26105    return matched;
26106  };
26107
26108  var rneedsContext = jQuery.expr.match.needsContext;
26109
26110  function nodeName(elem, name) {
26111    return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
26112  }
26113
26114  ;
26115  var rsingleTag = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; // Implement the identical functionality for filter and not
26116
26117  function winnow(elements, qualifier, not) {
26118    if (isFunction(qualifier)) {
26119      return jQuery.grep(elements, function (elem, i) {
26120        return !!qualifier.call(elem, i, elem) !== not;
26121      });
26122    } // Single element
26123
26124
26125    if (qualifier.nodeType) {
26126      return jQuery.grep(elements, function (elem) {
26127        return elem === qualifier !== not;
26128      });
26129    } // Arraylike of elements (jQuery, arguments, Array)
26130
26131
26132    if (typeof qualifier !== "string") {
26133      return jQuery.grep(elements, function (elem) {
26134        return indexOf.call(qualifier, elem) > -1 !== not;
26135      });
26136    } // Filtered directly for both simple and complex selectors
26137
26138
26139    return jQuery.filter(qualifier, elements, not);
26140  }
26141
26142  jQuery.filter = function (expr, elems, not) {
26143    var elem = elems[0];
26144
26145    if (not) {
26146      expr = ":not(" + expr + ")";
26147    }
26148
26149    if (elems.length === 1 && elem.nodeType === 1) {
26150      return jQuery.find.matchesSelector(elem, expr) ? [elem] : [];
26151    }
26152
26153    return jQuery.find.matches(expr, jQuery.grep(elems, function (elem) {
26154      return elem.nodeType === 1;
26155    }));
26156  };
26157
26158  jQuery.fn.extend({
26159    find: function find(selector) {
26160      var i,
26161          ret,
26162          len = this.length,
26163          self = this;
26164
26165      if (typeof selector !== "string") {
26166        return this.pushStack(jQuery(selector).filter(function () {
26167          for (i = 0; i < len; i++) {
26168            if (jQuery.contains(self[i], this)) {
26169              return true;
26170            }
26171          }
26172        }));
26173      }
26174
26175      ret = this.pushStack([]);
26176
26177      for (i = 0; i < len; i++) {
26178        jQuery.find(selector, self[i], ret);
26179      }
26180
26181      return len > 1 ? jQuery.uniqueSort(ret) : ret;
26182    },
26183    filter: function filter(selector) {
26184      return this.pushStack(winnow(this, selector || [], false));
26185    },
26186    not: function not(selector) {
26187      return this.pushStack(winnow(this, selector || [], true));
26188    },
26189    is: function is(selector) {
26190      return !!winnow(this, // If this is a positional/relative selector, check membership in the returned set
26191      // so $("p:first").is("p:last") won't return true for a doc with two "p".
26192      typeof selector === "string" && rneedsContext.test(selector) ? jQuery(selector) : selector || [], false).length;
26193    }
26194  }); // Initialize a jQuery object
26195  // A central reference to the root jQuery(document)
26196
26197  var rootjQuery,
26198      // A simple way to check for HTML strings
26199  // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
26200  // Strict HTML recognition (#11290: must start with <)
26201  // Shortcut simple #id case for speed
26202  rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
26203      init = jQuery.fn.init = function (selector, context, root) {
26204    var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false)
26205
26206    if (!selector) {
26207      return this;
26208    } // Method init() accepts an alternate rootjQuery
26209    // so migrate can support jQuery.sub (gh-2101)
26210
26211
26212    root = root || rootjQuery; // Handle HTML strings
26213
26214    if (typeof selector === "string") {
26215      if (selector[0] === "<" && selector[selector.length - 1] === ">" && selector.length >= 3) {
26216        // Assume that strings that start and end with <> are HTML and skip the regex check
26217        match = [null, selector, null];
26218      } else {
26219        match = rquickExpr.exec(selector);
26220      } // Match html or make sure no context is specified for #id
26221
26222
26223      if (match && (match[1] || !context)) {
26224        // HANDLE: $(html) -> $(array)
26225        if (match[1]) {
26226          context = context instanceof jQuery ? context[0] : context; // Option to run scripts is true for back-compat
26227          // Intentionally let the error be thrown if parseHTML is not present
26228
26229          jQuery.merge(this, jQuery.parseHTML(match[1], context && context.nodeType ? context.ownerDocument || context : document, true)); // HANDLE: $(html, props)
26230
26231          if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {
26232            for (match in context) {
26233              // Properties of context are called as methods if possible
26234              if (isFunction(this[match])) {
26235                this[match](context[match]); // ...and otherwise set as attributes
26236              } else {
26237                this.attr(match, context[match]);
26238              }
26239            }
26240          }
26241
26242          return this; // HANDLE: $(#id)
26243        } else {
26244          elem = document.getElementById(match[2]);
26245
26246          if (elem) {
26247            // Inject the element directly into the jQuery object
26248            this[0] = elem;
26249            this.length = 1;
26250          }
26251
26252          return this;
26253        } // HANDLE: $(expr, $(...))
26254
26255      } else if (!context || context.jquery) {
26256        return (context || root).find(selector); // HANDLE: $(expr, context)
26257        // (which is just equivalent to: $(context).find(expr)
26258      } else {
26259        return this.constructor(context).find(selector);
26260      } // HANDLE: $(DOMElement)
26261
26262    } else if (selector.nodeType) {
26263      this[0] = selector;
26264      this.length = 1;
26265      return this; // HANDLE: $(function)
26266      // Shortcut for document ready
26267    } else if (isFunction(selector)) {
26268      return root.ready !== undefined ? root.ready(selector) : // Execute immediately if ready is not present
26269      selector(jQuery);
26270    }
26271
26272    return jQuery.makeArray(selector, this);
26273  }; // Give the init function the jQuery prototype for later instantiation
26274
26275
26276  init.prototype = jQuery.fn; // Initialize central reference
26277
26278  rootjQuery = jQuery(document);
26279  var rparentsprev = /^(?:parents|prev(?:Until|All))/,
26280      // Methods guaranteed to produce a unique set when starting from a unique set
26281  guaranteedUnique = {
26282    children: true,
26283    contents: true,
26284    next: true,
26285    prev: true
26286  };
26287  jQuery.fn.extend({
26288    has: function has(target) {
26289      var targets = jQuery(target, this),
26290          l = targets.length;
26291      return this.filter(function () {
26292        var i = 0;
26293
26294        for (; i < l; i++) {
26295          if (jQuery.contains(this, targets[i])) {
26296            return true;
26297          }
26298        }
26299      });
26300    },
26301    closest: function closest(selectors, context) {
26302      var cur,
26303          i = 0,
26304          l = this.length,
26305          matched = [],
26306          targets = typeof selectors !== "string" && jQuery(selectors); // Positional selectors never match, since there's no _selection_ context
26307
26308      if (!rneedsContext.test(selectors)) {
26309        for (; i < l; i++) {
26310          for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) {
26311            // Always skip document fragments
26312            if (cur.nodeType < 11 && (targets ? targets.index(cur) > -1 : // Don't pass non-elements to Sizzle
26313            cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors))) {
26314              matched.push(cur);
26315              break;
26316            }
26317          }
26318        }
26319      }
26320
26321      return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched);
26322    },
26323    // Determine the position of an element within the set
26324    index: function index(elem) {
26325      // No argument, return index in parent
26326      if (!elem) {
26327        return this[0] && this[0].parentNode ? this.first().prevAll().length : -1;
26328      } // Index in selector
26329
26330
26331      if (typeof elem === "string") {
26332        return indexOf.call(jQuery(elem), this[0]);
26333      } // Locate the position of the desired element
26334
26335
26336      return indexOf.call(this, // If it receives a jQuery object, the first element is used
26337      elem.jquery ? elem[0] : elem);
26338    },
26339    add: function add(selector, context) {
26340      return this.pushStack(jQuery.uniqueSort(jQuery.merge(this.get(), jQuery(selector, context))));
26341    },
26342    addBack: function addBack(selector) {
26343      return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector));
26344    }
26345  });
26346
26347  function sibling(cur, dir) {
26348    while ((cur = cur[dir]) && cur.nodeType !== 1) {}
26349
26350    return cur;
26351  }
26352
26353  jQuery.each({
26354    parent: function parent(elem) {
26355      var parent = elem.parentNode;
26356      return parent && parent.nodeType !== 11 ? parent : null;
26357    },
26358    parents: function parents(elem) {
26359      return dir(elem, "parentNode");
26360    },
26361    parentsUntil: function parentsUntil(elem, i, until) {
26362      return dir(elem, "parentNode", until);
26363    },
26364    next: function next(elem) {
26365      return sibling(elem, "nextSibling");
26366    },
26367    prev: function prev(elem) {
26368      return sibling(elem, "previousSibling");
26369    },
26370    nextAll: function nextAll(elem) {
26371      return dir(elem, "nextSibling");
26372    },
26373    prevAll: function prevAll(elem) {
26374      return dir(elem, "previousSibling");
26375    },
26376    nextUntil: function nextUntil(elem, i, until) {
26377      return dir(elem, "nextSibling", until);
26378    },
26379    prevUntil: function prevUntil(elem, i, until) {
26380      return dir(elem, "previousSibling", until);
26381    },
26382    siblings: function siblings(elem) {
26383      return _siblings((elem.parentNode || {}).firstChild, elem);
26384    },
26385    children: function children(elem) {
26386      return _siblings(elem.firstChild);
26387    },
26388    contents: function contents(elem) {
26389      if (nodeName(elem, "iframe")) {
26390        return elem.contentDocument;
26391      } // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
26392      // Treat the template element as a regular one in browsers that
26393      // don't support it.
26394
26395
26396      if (nodeName(elem, "template")) {
26397        elem = elem.content || elem;
26398      }
26399
26400      return jQuery.merge([], elem.childNodes);
26401    }
26402  }, function (name, fn) {
26403    jQuery.fn[name] = function (until, selector) {
26404      var matched = jQuery.map(this, fn, until);
26405
26406      if (name.slice(-5) !== "Until") {
26407        selector = until;
26408      }
26409
26410      if (selector && typeof selector === "string") {
26411        matched = jQuery.filter(selector, matched);
26412      }
26413
26414      if (this.length > 1) {
26415        // Remove duplicates
26416        if (!guaranteedUnique[name]) {
26417          jQuery.uniqueSort(matched);
26418        } // Reverse order for parents* and prev-derivatives
26419
26420
26421        if (rparentsprev.test(name)) {
26422          matched.reverse();
26423        }
26424      }
26425
26426      return this.pushStack(matched);
26427    };
26428  });
26429  var rnothtmlwhite = /[^\x20\t\r\n\f]+/g; // Convert String-formatted options into Object-formatted ones
26430
26431  function createOptions(options) {
26432    var object = {};
26433    jQuery.each(options.match(rnothtmlwhite) || [], function (_, flag) {
26434      object[flag] = true;
26435    });
26436    return object;
26437  }
26438  /*
26439   * Create a callback list using the following parameters:
26440   *
26441   *	options: an optional list of space-separated options that will change how
26442   *			the callback list behaves or a more traditional option object
26443   *
26444   * By default a callback list will act like an event callback list and can be
26445   * "fired" multiple times.
26446   *
26447   * Possible options:
26448   *
26449   *	once:			will ensure the callback list can only be fired once (like a Deferred)
26450   *
26451   *	memory:			will keep track of previous values and will call any callback added
26452   *					after the list has been fired right away with the latest "memorized"
26453   *					values (like a Deferred)
26454   *
26455   *	unique:			will ensure a callback can only be added once (no duplicate in the list)
26456   *
26457   *	stopOnFalse:	interrupt callings when a callback returns false
26458   *
26459   */
26460
26461
26462  jQuery.Callbacks = function (options) {
26463    // Convert options from String-formatted to Object-formatted if needed
26464    // (we check in cache first)
26465    options = typeof options === "string" ? createOptions(options) : jQuery.extend({}, options);
26466
26467    var // Flag to know if list is currently firing
26468    firing,
26469        // Last fire value for non-forgettable lists
26470    memory,
26471        // Flag to know if list was already fired
26472    _fired,
26473        // Flag to prevent firing
26474    _locked,
26475        // Actual callback list
26476    list = [],
26477        // Queue of execution data for repeatable lists
26478    queue = [],
26479        // Index of currently firing callback (modified by add/remove as needed)
26480    firingIndex = -1,
26481        // Fire callbacks
26482    fire = function fire() {
26483      // Enforce single-firing
26484      _locked = _locked || options.once; // Execute callbacks for all pending executions,
26485      // respecting firingIndex overrides and runtime changes
26486
26487      _fired = firing = true;
26488
26489      for (; queue.length; firingIndex = -1) {
26490        memory = queue.shift();
26491
26492        while (++firingIndex < list.length) {
26493          // Run callback and check for early termination
26494          if (list[firingIndex].apply(memory[0], memory[1]) === false && options.stopOnFalse) {
26495            // Jump to end and forget the data so .add doesn't re-fire
26496            firingIndex = list.length;
26497            memory = false;
26498          }
26499        }
26500      } // Forget the data if we're done with it
26501
26502
26503      if (!options.memory) {
26504        memory = false;
26505      }
26506
26507      firing = false; // Clean up if we're done firing for good
26508
26509      if (_locked) {
26510        // Keep an empty list if we have data for future add calls
26511        if (memory) {
26512          list = []; // Otherwise, this object is spent
26513        } else {
26514          list = "";
26515        }
26516      }
26517    },
26518        // Actual Callbacks object
26519    self = {
26520      // Add a callback or a collection of callbacks to the list
26521      add: function add() {
26522        if (list) {
26523          // If we have memory from a past run, we should fire after adding
26524          if (memory && !firing) {
26525            firingIndex = list.length - 1;
26526            queue.push(memory);
26527          }
26528
26529          (function add(args) {
26530            jQuery.each(args, function (_, arg) {
26531              if (isFunction(arg)) {
26532                if (!options.unique || !self.has(arg)) {
26533                  list.push(arg);
26534                }
26535              } else if (arg && arg.length && toType(arg) !== "string") {
26536                // Inspect recursively
26537                add(arg);
26538              }
26539            });
26540          })(arguments);
26541
26542          if (memory && !firing) {
26543            fire();
26544          }
26545        }
26546
26547        return this;
26548      },
26549      // Remove a callback from the list
26550      remove: function remove() {
26551        jQuery.each(arguments, function (_, arg) {
26552          var index;
26553
26554          while ((index = jQuery.inArray(arg, list, index)) > -1) {
26555            list.splice(index, 1); // Handle firing indexes
26556
26557            if (index <= firingIndex) {
26558              firingIndex--;
26559            }
26560          }
26561        });
26562        return this;
26563      },
26564      // Check if a given callback is in the list.
26565      // If no argument is given, return whether or not list has callbacks attached.
26566      has: function has(fn) {
26567        return fn ? jQuery.inArray(fn, list) > -1 : list.length > 0;
26568      },
26569      // Remove all callbacks from the list
26570      empty: function empty() {
26571        if (list) {
26572          list = [];
26573        }
26574
26575        return this;
26576      },
26577      // Disable .fire and .add
26578      // Abort any current/pending executions
26579      // Clear all callbacks and values
26580      disable: function disable() {
26581        _locked = queue = [];
26582        list = memory = "";
26583        return this;
26584      },
26585      disabled: function disabled() {
26586        return !list;
26587      },
26588      // Disable .fire
26589      // Also disable .add unless we have memory (since it would have no effect)
26590      // Abort any pending executions
26591      lock: function lock() {
26592        _locked = queue = [];
26593
26594        if (!memory && !firing) {
26595          list = memory = "";
26596        }
26597
26598        return this;
26599      },
26600      locked: function locked() {
26601        return !!_locked;
26602      },
26603      // Call all callbacks with the given context and arguments
26604      fireWith: function fireWith(context, args) {
26605        if (!_locked) {
26606          args = args || [];
26607          args = [context, args.slice ? args.slice() : args];
26608          queue.push(args);
26609
26610          if (!firing) {
26611            fire();
26612          }
26613        }
26614
26615        return this;
26616      },
26617      // Call all the callbacks with the given arguments
26618      fire: function fire() {
26619        self.fireWith(this, arguments);
26620        return this;
26621      },
26622      // To know if the callbacks have already been called at least once
26623      fired: function fired() {
26624        return !!_fired;
26625      }
26626    };
26627
26628    return self;
26629  };
26630
26631  function Identity(v) {
26632    return v;
26633  }
26634
26635  function Thrower(ex) {
26636    throw ex;
26637  }
26638
26639  function adoptValue(value, resolve, reject, noValue) {
26640    var method;
26641
26642    try {
26643      // Check for promise aspect first to privilege synchronous behavior
26644      if (value && isFunction(method = value.promise)) {
26645        method.call(value).done(resolve).fail(reject); // Other thenables
26646      } else if (value && isFunction(method = value.then)) {
26647        method.call(value, resolve, reject); // Other non-thenables
26648      } else {
26649        // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
26650        // * false: [ value ].slice( 0 ) => resolve( value )
26651        // * true: [ value ].slice( 1 ) => resolve()
26652        resolve.apply(undefined, [value].slice(noValue));
26653      } // For Promises/A+, convert exceptions into rejections
26654      // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
26655      // Deferred#then to conditionally suppress rejection.
26656
26657    } catch (value) {
26658      // Support: Android 4.0 only
26659      // Strict mode functions invoked without .call/.apply get global-object context
26660      reject.apply(undefined, [value]);
26661    }
26662  }
26663
26664  jQuery.extend({
26665    Deferred: function Deferred(func) {
26666      var tuples = [// action, add listener, callbacks,
26667      // ... .then handlers, argument index, [final state]
26668      ["notify", "progress", jQuery.Callbacks("memory"), jQuery.Callbacks("memory"), 2], ["resolve", "done", jQuery.Callbacks("once memory"), jQuery.Callbacks("once memory"), 0, "resolved"], ["reject", "fail", jQuery.Callbacks("once memory"), jQuery.Callbacks("once memory"), 1, "rejected"]],
26669          _state = "pending",
26670          _promise = {
26671        state: function state() {
26672          return _state;
26673        },
26674        always: function always() {
26675          deferred.done(arguments).fail(arguments);
26676          return this;
26677        },
26678        "catch": function _catch(fn) {
26679          return _promise.then(null, fn);
26680        },
26681        // Keep pipe for back-compat
26682        pipe: function pipe()
26683        /* fnDone, fnFail, fnProgress */
26684        {
26685          var fns = arguments;
26686          return jQuery.Deferred(function (newDefer) {
26687            jQuery.each(tuples, function (i, tuple) {
26688              // Map tuples (progress, done, fail) to arguments (done, fail, progress)
26689              var fn = isFunction(fns[tuple[4]]) && fns[tuple[4]]; // deferred.progress(function() { bind to newDefer or newDefer.notify })
26690              // deferred.done(function() { bind to newDefer or newDefer.resolve })
26691              // deferred.fail(function() { bind to newDefer or newDefer.reject })
26692
26693              deferred[tuple[1]](function () {
26694                var returned = fn && fn.apply(this, arguments);
26695
26696                if (returned && isFunction(returned.promise)) {
26697                  returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject);
26698                } else {
26699                  newDefer[tuple[0] + "With"](this, fn ? [returned] : arguments);
26700                }
26701              });
26702            });
26703            fns = null;
26704          }).promise();
26705        },
26706        then: function then(onFulfilled, onRejected, onProgress) {
26707          var maxDepth = 0;
26708
26709          function resolve(depth, deferred, handler, special) {
26710            return function () {
26711              var that = this,
26712                  args = arguments,
26713                  mightThrow = function mightThrow() {
26714                var returned, then; // Support: Promises/A+ section 2.3.3.3.3
26715                // https://promisesaplus.com/#point-59
26716                // Ignore double-resolution attempts
26717
26718                if (depth < maxDepth) {
26719                  return;
26720                }
26721
26722                returned = handler.apply(that, args); // Support: Promises/A+ section 2.3.1
26723                // https://promisesaplus.com/#point-48
26724
26725                if (returned === deferred.promise()) {
26726                  throw new TypeError("Thenable self-resolution");
26727                } // Support: Promises/A+ sections 2.3.3.1, 3.5
26728                // https://promisesaplus.com/#point-54
26729                // https://promisesaplus.com/#point-75
26730                // Retrieve `then` only once
26731
26732
26733                then = returned && ( // Support: Promises/A+ section 2.3.4
26734                // https://promisesaplus.com/#point-64
26735                // Only check objects and functions for thenability
26736                _typeof(returned) === "object" || typeof returned === "function") && returned.then; // Handle a returned thenable
26737
26738                if (isFunction(then)) {
26739                  // Special processors (notify) just wait for resolution
26740                  if (special) {
26741                    then.call(returned, resolve(maxDepth, deferred, Identity, special), resolve(maxDepth, deferred, Thrower, special)); // Normal processors (resolve) also hook into progress
26742                  } else {
26743                    // ...and disregard older resolution values
26744                    maxDepth++;
26745                    then.call(returned, resolve(maxDepth, deferred, Identity, special), resolve(maxDepth, deferred, Thrower, special), resolve(maxDepth, deferred, Identity, deferred.notifyWith));
26746                  } // Handle all other returned values
26747
26748                } else {
26749                  // Only substitute handlers pass on context
26750                  // and multiple values (non-spec behavior)
26751                  if (handler !== Identity) {
26752                    that = undefined;
26753                    args = [returned];
26754                  } // Process the value(s)
26755                  // Default process is resolve
26756
26757
26758                  (special || deferred.resolveWith)(that, args);
26759                }
26760              },
26761                  // Only normal processors (resolve) catch and reject exceptions
26762              process = special ? mightThrow : function () {
26763                try {
26764                  mightThrow();
26765                } catch (e) {
26766                  if (jQuery.Deferred.exceptionHook) {
26767                    jQuery.Deferred.exceptionHook(e, process.stackTrace);
26768                  } // Support: Promises/A+ section 2.3.3.3.4.1
26769                  // https://promisesaplus.com/#point-61
26770                  // Ignore post-resolution exceptions
26771
26772
26773                  if (depth + 1 >= maxDepth) {
26774                    // Only substitute handlers pass on context
26775                    // and multiple values (non-spec behavior)
26776                    if (handler !== Thrower) {
26777                      that = undefined;
26778                      args = [e];
26779                    }
26780
26781                    deferred.rejectWith(that, args);
26782                  }
26783                }
26784              }; // Support: Promises/A+ section 2.3.3.3.1
26785              // https://promisesaplus.com/#point-57
26786              // Re-resolve promises immediately to dodge false rejection from
26787              // subsequent errors
26788
26789
26790              if (depth) {
26791                process();
26792              } else {
26793                // Call an optional hook to record the stack, in case of exception
26794                // since it's otherwise lost when execution goes async
26795                if (jQuery.Deferred.getStackHook) {
26796                  process.stackTrace = jQuery.Deferred.getStackHook();
26797                }
26798
26799                window.setTimeout(process);
26800              }
26801            };
26802          }
26803
26804          return jQuery.Deferred(function (newDefer) {
26805            // progress_handlers.add( ... )
26806            tuples[0][3].add(resolve(0, newDefer, isFunction(onProgress) ? onProgress : Identity, newDefer.notifyWith)); // fulfilled_handlers.add( ... )
26807
26808            tuples[1][3].add(resolve(0, newDefer, isFunction(onFulfilled) ? onFulfilled : Identity)); // rejected_handlers.add( ... )
26809
26810            tuples[2][3].add(resolve(0, newDefer, isFunction(onRejected) ? onRejected : Thrower));
26811          }).promise();
26812        },
26813        // Get a promise for this deferred
26814        // If obj is provided, the promise aspect is added to the object
26815        promise: function promise(obj) {
26816          return obj != null ? jQuery.extend(obj, _promise) : _promise;
26817        }
26818      },
26819          deferred = {}; // Add list-specific methods
26820
26821      jQuery.each(tuples, function (i, tuple) {
26822        var list = tuple[2],
26823            stateString = tuple[5]; // promise.progress = list.add
26824        // promise.done = list.add
26825        // promise.fail = list.add
26826
26827        _promise[tuple[1]] = list.add; // Handle state
26828
26829        if (stateString) {
26830          list.add(function () {
26831            // state = "resolved" (i.e., fulfilled)
26832            // state = "rejected"
26833            _state = stateString;
26834          }, // rejected_callbacks.disable
26835          // fulfilled_callbacks.disable
26836          tuples[3 - i][2].disable, // rejected_handlers.disable
26837          // fulfilled_handlers.disable
26838          tuples[3 - i][3].disable, // progress_callbacks.lock
26839          tuples[0][2].lock, // progress_handlers.lock
26840          tuples[0][3].lock);
26841        } // progress_handlers.fire
26842        // fulfilled_handlers.fire
26843        // rejected_handlers.fire
26844
26845
26846        list.add(tuple[3].fire); // deferred.notify = function() { deferred.notifyWith(...) }
26847        // deferred.resolve = function() { deferred.resolveWith(...) }
26848        // deferred.reject = function() { deferred.rejectWith(...) }
26849
26850        deferred[tuple[0]] = function () {
26851          deferred[tuple[0] + "With"](this === deferred ? undefined : this, arguments);
26852          return this;
26853        }; // deferred.notifyWith = list.fireWith
26854        // deferred.resolveWith = list.fireWith
26855        // deferred.rejectWith = list.fireWith
26856
26857
26858        deferred[tuple[0] + "With"] = list.fireWith;
26859      }); // Make the deferred a promise
26860
26861      _promise.promise(deferred); // Call given func if any
26862
26863
26864      if (func) {
26865        func.call(deferred, deferred);
26866      } // All done!
26867
26868
26869      return deferred;
26870    },
26871    // Deferred helper
26872    when: function when(singleValue) {
26873      var // count of uncompleted subordinates
26874      remaining = arguments.length,
26875          // count of unprocessed arguments
26876      i = remaining,
26877          // subordinate fulfillment data
26878      resolveContexts = Array(i),
26879          resolveValues = _slice.call(arguments),
26880          // the master Deferred
26881      master = jQuery.Deferred(),
26882          // subordinate callback factory
26883      updateFunc = function updateFunc(i) {
26884        return function (value) {
26885          resolveContexts[i] = this;
26886          resolveValues[i] = arguments.length > 1 ? _slice.call(arguments) : value;
26887
26888          if (! --remaining) {
26889            master.resolveWith(resolveContexts, resolveValues);
26890          }
26891        };
26892      }; // Single- and empty arguments are adopted like Promise.resolve
26893
26894
26895      if (remaining <= 1) {
26896        adoptValue(singleValue, master.done(updateFunc(i)).resolve, master.reject, !remaining); // Use .then() to unwrap secondary thenables (cf. gh-3000)
26897
26898        if (master.state() === "pending" || isFunction(resolveValues[i] && resolveValues[i].then)) {
26899          return master.then();
26900        }
26901      } // Multiple arguments are aggregated like Promise.all array elements
26902
26903
26904      while (i--) {
26905        adoptValue(resolveValues[i], updateFunc(i), master.reject);
26906      }
26907
26908      return master.promise();
26909    }
26910  }); // These usually indicate a programmer mistake during development,
26911  // warn about them ASAP rather than swallowing them by default.
26912
26913  var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
26914
26915  jQuery.Deferred.exceptionHook = function (error, stack) {
26916    // Support: IE 8 - 9 only
26917    // Console exists when dev tools are open, which can happen at any time
26918    if (window.console && window.console.warn && error && rerrorNames.test(error.name)) {
26919      window.console.warn("jQuery.Deferred exception: " + error.message, error.stack, stack);
26920    }
26921  };
26922
26923  jQuery.readyException = function (error) {
26924    window.setTimeout(function () {
26925      throw error;
26926    });
26927  }; // The deferred used on DOM ready
26928
26929
26930  var readyList = jQuery.Deferred();
26931
26932  jQuery.fn.ready = function (fn) {
26933    readyList.then(fn) // Wrap jQuery.readyException in a function so that the lookup
26934    // happens at the time of error handling instead of callback
26935    // registration.
26936    .catch(function (error) {
26937      jQuery.readyException(error);
26938    });
26939    return this;
26940  };
26941
26942  jQuery.extend({
26943    // Is the DOM ready to be used? Set to true once it occurs.
26944    isReady: false,
26945    // A counter to track how many items to wait for before
26946    // the ready event fires. See #6781
26947    readyWait: 1,
26948    // Handle when the DOM is ready
26949    ready: function ready(wait) {
26950      // Abort if there are pending holds or we're already ready
26951      if (wait === true ? --jQuery.readyWait : jQuery.isReady) {
26952        return;
26953      } // Remember that the DOM is ready
26954
26955
26956      jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be
26957
26958      if (wait !== true && --jQuery.readyWait > 0) {
26959        return;
26960      } // If there are functions bound, to execute
26961
26962
26963      readyList.resolveWith(document, [jQuery]);
26964    }
26965  });
26966  jQuery.ready.then = readyList.then; // The ready event handler and self cleanup method
26967
26968  function completed() {
26969    document.removeEventListener("DOMContentLoaded", completed);
26970    window.removeEventListener("load", completed);
26971    jQuery.ready();
26972  } // Catch cases where $(document).ready() is called
26973  // after the browser event has already occurred.
26974  // Support: IE <=9 - 10 only
26975  // Older IE sometimes signals "interactive" too soon
26976
26977
26978  if (document.readyState === "complete" || document.readyState !== "loading" && !document.documentElement.doScroll) {
26979    // Handle it asynchronously to allow scripts the opportunity to delay ready
26980    window.setTimeout(jQuery.ready);
26981  } else {
26982    // Use the handy event callback
26983    document.addEventListener("DOMContentLoaded", completed); // A fallback to window.onload, that will always work
26984
26985    window.addEventListener("load", completed);
26986  } // Multifunctional method to get and set values of a collection
26987  // The value/s can optionally be executed if it's a function
26988
26989
26990  var access = function access(elems, fn, key, value, chainable, emptyGet, raw) {
26991    var i = 0,
26992        len = elems.length,
26993        bulk = key == null; // Sets many values
26994
26995    if (toType(key) === "object") {
26996      chainable = true;
26997
26998      for (i in key) {
26999        access(elems, fn, i, key[i], true, emptyGet, raw);
27000      } // Sets one value
27001
27002    } else if (value !== undefined) {
27003      chainable = true;
27004
27005      if (!isFunction(value)) {
27006        raw = true;
27007      }
27008
27009      if (bulk) {
27010        // Bulk operations run against the entire set
27011        if (raw) {
27012          fn.call(elems, value);
27013          fn = null; // ...except when executing function values
27014        } else {
27015          bulk = fn;
27016
27017          fn = function fn(elem, key, value) {
27018            return bulk.call(jQuery(elem), value);
27019          };
27020        }
27021      }
27022
27023      if (fn) {
27024        for (; i < len; i++) {
27025          fn(elems[i], key, raw ? value : value.call(elems[i], i, fn(elems[i], key)));
27026        }
27027      }
27028    }
27029
27030    if (chainable) {
27031      return elems;
27032    } // Gets
27033
27034
27035    if (bulk) {
27036      return fn.call(elems);
27037    }
27038
27039    return len ? fn(elems[0], key) : emptyGet;
27040  }; // Matches dashed string for camelizing
27041
27042
27043  var rmsPrefix = /^-ms-/,
27044      rdashAlpha = /-([a-z])/g; // Used by camelCase as callback to replace()
27045
27046  function fcamelCase(all, letter) {
27047    return letter.toUpperCase();
27048  } // Convert dashed to camelCase; used by the css and data modules
27049  // Support: IE <=9 - 11, Edge 12 - 15
27050  // Microsoft forgot to hump their vendor prefix (#9572)
27051
27052
27053  function camelCase(string) {
27054    return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase);
27055  }
27056
27057  var acceptData = function acceptData(owner) {
27058    // Accepts only:
27059    //  - Node
27060    //    - Node.ELEMENT_NODE
27061    //    - Node.DOCUMENT_NODE
27062    //  - Object
27063    //    - Any
27064    return owner.nodeType === 1 || owner.nodeType === 9 || !+owner.nodeType;
27065  };
27066
27067  function Data() {
27068    this.expando = jQuery.expando + Data.uid++;
27069  }
27070
27071  Data.uid = 1;
27072  Data.prototype = {
27073    cache: function cache(owner) {
27074      // Check if the owner object already has a cache
27075      var value = owner[this.expando]; // If not, create one
27076
27077      if (!value) {
27078        value = {}; // We can accept data for non-element nodes in modern browsers,
27079        // but we should not, see #8335.
27080        // Always return an empty object.
27081
27082        if (acceptData(owner)) {
27083          // If it is a node unlikely to be stringify-ed or looped over
27084          // use plain assignment
27085          if (owner.nodeType) {
27086            owner[this.expando] = value; // Otherwise secure it in a non-enumerable property
27087            // configurable must be true to allow the property to be
27088            // deleted when data is removed
27089          } else {
27090            Object.defineProperty(owner, this.expando, {
27091              value: value,
27092              configurable: true
27093            });
27094          }
27095        }
27096      }
27097
27098      return value;
27099    },
27100    set: function set(owner, data, value) {
27101      var prop,
27102          cache = this.cache(owner); // Handle: [ owner, key, value ] args
27103      // Always use camelCase key (gh-2257)
27104
27105      if (typeof data === "string") {
27106        cache[camelCase(data)] = value; // Handle: [ owner, { properties } ] args
27107      } else {
27108        // Copy the properties one-by-one to the cache object
27109        for (prop in data) {
27110          cache[camelCase(prop)] = data[prop];
27111        }
27112      }
27113
27114      return cache;
27115    },
27116    get: function get(owner, key) {
27117      return key === undefined ? this.cache(owner) : // Always use camelCase key (gh-2257)
27118      owner[this.expando] && owner[this.expando][camelCase(key)];
27119    },
27120    access: function access(owner, key, value) {
27121      // In cases where either:
27122      //
27123      //   1. No key was specified
27124      //   2. A string key was specified, but no value provided
27125      //
27126      // Take the "read" path and allow the get method to determine
27127      // which value to return, respectively either:
27128      //
27129      //   1. The entire cache object
27130      //   2. The data stored at the key
27131      //
27132      if (key === undefined || key && typeof key === "string" && value === undefined) {
27133        return this.get(owner, key);
27134      } // When the key is not a string, or both a key and value
27135      // are specified, set or extend (existing objects) with either:
27136      //
27137      //   1. An object of properties
27138      //   2. A key and value
27139      //
27140
27141
27142      this.set(owner, key, value); // Since the "set" path can have two possible entry points
27143      // return the expected data based on which path was taken[*]
27144
27145      return value !== undefined ? value : key;
27146    },
27147    remove: function remove(owner, key) {
27148      var i,
27149          cache = owner[this.expando];
27150
27151      if (cache === undefined) {
27152        return;
27153      }
27154
27155      if (key !== undefined) {
27156        // Support array or space separated string of keys
27157        if (Array.isArray(key)) {
27158          // If key is an array of keys...
27159          // We always set camelCase keys, so remove that.
27160          key = key.map(camelCase);
27161        } else {
27162          key = camelCase(key); // If a key with the spaces exists, use it.
27163          // Otherwise, create an array by matching non-whitespace
27164
27165          key = key in cache ? [key] : key.match(rnothtmlwhite) || [];
27166        }
27167
27168        i = key.length;
27169
27170        while (i--) {
27171          delete cache[key[i]];
27172        }
27173      } // Remove the expando if there's no more data
27174
27175
27176      if (key === undefined || jQuery.isEmptyObject(cache)) {
27177        // Support: Chrome <=35 - 45
27178        // Webkit & Blink performance suffers when deleting properties
27179        // from DOM nodes, so set to undefined instead
27180        // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
27181        if (owner.nodeType) {
27182          owner[this.expando] = undefined;
27183        } else {
27184          delete owner[this.expando];
27185        }
27186      }
27187    },
27188    hasData: function hasData(owner) {
27189      var cache = owner[this.expando];
27190      return cache !== undefined && !jQuery.isEmptyObject(cache);
27191    }
27192  };
27193  var dataPriv = new Data();
27194  var dataUser = new Data(); //	Implementation Summary
27195  //
27196  //	1. Enforce API surface and semantic compatibility with 1.9.x branch
27197  //	2. Improve the module's maintainability by reducing the storage
27198  //		paths to a single mechanism.
27199  //	3. Use the same single mechanism to support "private" and "user" data.
27200  //	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
27201  //	5. Avoid exposing implementation details on user objects (eg. expando properties)
27202  //	6. Provide a clear path for implementation upgrade to WeakMap in 2014
27203
27204  var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
27205      rmultiDash = /[A-Z]/g;
27206
27207  function getData(data) {
27208    if (data === "true") {
27209      return true;
27210    }
27211
27212    if (data === "false") {
27213      return false;
27214    }
27215
27216    if (data === "null") {
27217      return null;
27218    } // Only convert to a number if it doesn't change the string
27219
27220
27221    if (data === +data + "") {
27222      return +data;
27223    }
27224
27225    if (rbrace.test(data)) {
27226      return JSON.parse(data);
27227    }
27228
27229    return data;
27230  }
27231
27232  function dataAttr(elem, key, data) {
27233    var name; // If nothing was found internally, try to fetch any
27234    // data from the HTML5 data-* attribute
27235
27236    if (data === undefined && elem.nodeType === 1) {
27237      name = "data-" + key.replace(rmultiDash, "-$&").toLowerCase();
27238      data = elem.getAttribute(name);
27239
27240      if (typeof data === "string") {
27241        try {
27242          data = getData(data);
27243        } catch (e) {} // Make sure we set the data so it isn't changed later
27244
27245
27246        dataUser.set(elem, key, data);
27247      } else {
27248        data = undefined;
27249      }
27250    }
27251
27252    return data;
27253  }
27254
27255  jQuery.extend({
27256    hasData: function hasData(elem) {
27257      return dataUser.hasData(elem) || dataPriv.hasData(elem);
27258    },
27259    data: function data(elem, name, _data) {
27260      return dataUser.access(elem, name, _data);
27261    },
27262    removeData: function removeData(elem, name) {
27263      dataUser.remove(elem, name);
27264    },
27265    // TODO: Now that all calls to _data and _removeData have been replaced
27266    // with direct calls to dataPriv methods, these can be deprecated.
27267    _data: function _data(elem, name, data) {
27268      return dataPriv.access(elem, name, data);
27269    },
27270    _removeData: function _removeData(elem, name) {
27271      dataPriv.remove(elem, name);
27272    }
27273  });
27274  jQuery.fn.extend({
27275    data: function data(key, value) {
27276      var i,
27277          name,
27278          data,
27279          elem = this[0],
27280          attrs = elem && elem.attributes; // Gets all values
27281
27282      if (key === undefined) {
27283        if (this.length) {
27284          data = dataUser.get(elem);
27285
27286          if (elem.nodeType === 1 && !dataPriv.get(elem, "hasDataAttrs")) {
27287            i = attrs.length;
27288
27289            while (i--) {
27290              // Support: IE 11 only
27291              // The attrs elements can be null (#14894)
27292              if (attrs[i]) {
27293                name = attrs[i].name;
27294
27295                if (name.indexOf("data-") === 0) {
27296                  name = camelCase(name.slice(5));
27297                  dataAttr(elem, name, data[name]);
27298                }
27299              }
27300            }
27301
27302            dataPriv.set(elem, "hasDataAttrs", true);
27303          }
27304        }
27305
27306        return data;
27307      } // Sets multiple values
27308
27309
27310      if (_typeof(key) === "object") {
27311        return this.each(function () {
27312          dataUser.set(this, key);
27313        });
27314      }
27315
27316      return access(this, function (value) {
27317        var data; // The calling jQuery object (element matches) is not empty
27318        // (and therefore has an element appears at this[ 0 ]) and the
27319        // `value` parameter was not undefined. An empty jQuery object
27320        // will result in `undefined` for elem = this[ 0 ] which will
27321        // throw an exception if an attempt to read a data cache is made.
27322
27323        if (elem && value === undefined) {
27324          // Attempt to get data from the cache
27325          // The key will always be camelCased in Data
27326          data = dataUser.get(elem, key);
27327
27328          if (data !== undefined) {
27329            return data;
27330          } // Attempt to "discover" the data in
27331          // HTML5 custom data-* attrs
27332
27333
27334          data = dataAttr(elem, key);
27335
27336          if (data !== undefined) {
27337            return data;
27338          } // We tried really hard, but the data doesn't exist.
27339
27340
27341          return;
27342        } // Set the data...
27343
27344
27345        this.each(function () {
27346          // We always store the camelCased key
27347          dataUser.set(this, key, value);
27348        });
27349      }, null, value, arguments.length > 1, null, true);
27350    },
27351    removeData: function removeData(key) {
27352      return this.each(function () {
27353        dataUser.remove(this, key);
27354      });
27355    }
27356  });
27357  jQuery.extend({
27358    queue: function queue(elem, type, data) {
27359      var queue;
27360
27361      if (elem) {
27362        type = (type || "fx") + "queue";
27363        queue = dataPriv.get(elem, type); // Speed up dequeue by getting out quickly if this is just a lookup
27364
27365        if (data) {
27366          if (!queue || Array.isArray(data)) {
27367            queue = dataPriv.access(elem, type, jQuery.makeArray(data));
27368          } else {
27369            queue.push(data);
27370          }
27371        }
27372
27373        return queue || [];
27374      }
27375    },
27376    dequeue: function dequeue(elem, type) {
27377      type = type || "fx";
27378
27379      var queue = jQuery.queue(elem, type),
27380          startLength = queue.length,
27381          fn = queue.shift(),
27382          hooks = jQuery._queueHooks(elem, type),
27383          next = function next() {
27384        jQuery.dequeue(elem, type);
27385      }; // If the fx queue is dequeued, always remove the progress sentinel
27386
27387
27388      if (fn === "inprogress") {
27389        fn = queue.shift();
27390        startLength--;
27391      }
27392
27393      if (fn) {
27394        // Add a progress sentinel to prevent the fx queue from being
27395        // automatically dequeued
27396        if (type === "fx") {
27397          queue.unshift("inprogress");
27398        } // Clear up the last queue stop function
27399
27400
27401        delete hooks.stop;
27402        fn.call(elem, next, hooks);
27403      }
27404
27405      if (!startLength && hooks) {
27406        hooks.empty.fire();
27407      }
27408    },
27409    // Not public - generate a queueHooks object, or return the current one
27410    _queueHooks: function _queueHooks(elem, type) {
27411      var key = type + "queueHooks";
27412      return dataPriv.get(elem, key) || dataPriv.access(elem, key, {
27413        empty: jQuery.Callbacks("once memory").add(function () {
27414          dataPriv.remove(elem, [type + "queue", key]);
27415        })
27416      });
27417    }
27418  });
27419  jQuery.fn.extend({
27420    queue: function queue(type, data) {
27421      var setter = 2;
27422
27423      if (typeof type !== "string") {
27424        data = type;
27425        type = "fx";
27426        setter--;
27427      }
27428
27429      if (arguments.length < setter) {
27430        return jQuery.queue(this[0], type);
27431      }
27432
27433      return data === undefined ? this : this.each(function () {
27434        var queue = jQuery.queue(this, type, data); // Ensure a hooks for this queue
27435
27436        jQuery._queueHooks(this, type);
27437
27438        if (type === "fx" && queue[0] !== "inprogress") {
27439          jQuery.dequeue(this, type);
27440        }
27441      });
27442    },
27443    dequeue: function dequeue(type) {
27444      return this.each(function () {
27445        jQuery.dequeue(this, type);
27446      });
27447    },
27448    clearQueue: function clearQueue(type) {
27449      return this.queue(type || "fx", []);
27450    },
27451    // Get a promise resolved when queues of a certain type
27452    // are emptied (fx is the type by default)
27453    promise: function promise(type, obj) {
27454      var tmp,
27455          count = 1,
27456          defer = jQuery.Deferred(),
27457          elements = this,
27458          i = this.length,
27459          resolve = function resolve() {
27460        if (! --count) {
27461          defer.resolveWith(elements, [elements]);
27462        }
27463      };
27464
27465      if (typeof type !== "string") {
27466        obj = type;
27467        type = undefined;
27468      }
27469
27470      type = type || "fx";
27471
27472      while (i--) {
27473        tmp = dataPriv.get(elements[i], type + "queueHooks");
27474
27475        if (tmp && tmp.empty) {
27476          count++;
27477          tmp.empty.add(resolve);
27478        }
27479      }
27480
27481      resolve();
27482      return defer.promise(obj);
27483    }
27484  });
27485  var pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source;
27486  var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i");
27487  var cssExpand = ["Top", "Right", "Bottom", "Left"];
27488
27489  var isHiddenWithinTree = function isHiddenWithinTree(elem, el) {
27490    // isHiddenWithinTree might be called from jQuery#filter function;
27491    // in that case, element will be second argument
27492    elem = el || elem; // Inline style trumps all
27493
27494    return elem.style.display === "none" || elem.style.display === "" && // Otherwise, check computed style
27495    // Support: Firefox <=43 - 45
27496    // Disconnected elements can have computed display: none, so first confirm that elem is
27497    // in the document.
27498    jQuery.contains(elem.ownerDocument, elem) && jQuery.css(elem, "display") === "none";
27499  };
27500
27501  var swap = function swap(elem, options, callback, args) {
27502    var ret,
27503        name,
27504        old = {}; // Remember the old values, and insert the new ones
27505
27506    for (name in options) {
27507      old[name] = elem.style[name];
27508      elem.style[name] = options[name];
27509    }
27510
27511    ret = callback.apply(elem, args || []); // Revert the old values
27512
27513    for (name in options) {
27514      elem.style[name] = old[name];
27515    }
27516
27517    return ret;
27518  };
27519
27520  function adjustCSS(elem, prop, valueParts, tween) {
27521    var adjusted,
27522        scale,
27523        maxIterations = 20,
27524        currentValue = tween ? function () {
27525      return tween.cur();
27526    } : function () {
27527      return jQuery.css(elem, prop, "");
27528    },
27529        initial = currentValue(),
27530        unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? "" : "px"),
27531        // Starting value computation is required for potential unit mismatches
27532    initialInUnit = (jQuery.cssNumber[prop] || unit !== "px" && +initial) && rcssNum.exec(jQuery.css(elem, prop));
27533
27534    if (initialInUnit && initialInUnit[3] !== unit) {
27535      // Support: Firefox <=54
27536      // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
27537      initial = initial / 2; // Trust units reported by jQuery.css
27538
27539      unit = unit || initialInUnit[3]; // Iteratively approximate from a nonzero starting point
27540
27541      initialInUnit = +initial || 1;
27542
27543      while (maxIterations--) {
27544        // Evaluate and update our best guess (doubling guesses that zero out).
27545        // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
27546        jQuery.style(elem, prop, initialInUnit + unit);
27547
27548        if ((1 - scale) * (1 - (scale = currentValue() / initial || 0.5)) <= 0) {
27549          maxIterations = 0;
27550        }
27551
27552        initialInUnit = initialInUnit / scale;
27553      }
27554
27555      initialInUnit = initialInUnit * 2;
27556      jQuery.style(elem, prop, initialInUnit + unit); // Make sure we update the tween properties later on
27557
27558      valueParts = valueParts || [];
27559    }
27560
27561    if (valueParts) {
27562      initialInUnit = +initialInUnit || +initial || 0; // Apply relative offset (+=/-=) if specified
27563
27564      adjusted = valueParts[1] ? initialInUnit + (valueParts[1] + 1) * valueParts[2] : +valueParts[2];
27565
27566      if (tween) {
27567        tween.unit = unit;
27568        tween.start = initialInUnit;
27569        tween.end = adjusted;
27570      }
27571    }
27572
27573    return adjusted;
27574  }
27575
27576  var defaultDisplayMap = {};
27577
27578  function getDefaultDisplay(elem) {
27579    var temp,
27580        doc = elem.ownerDocument,
27581        nodeName = elem.nodeName,
27582        display = defaultDisplayMap[nodeName];
27583
27584    if (display) {
27585      return display;
27586    }
27587
27588    temp = doc.body.appendChild(doc.createElement(nodeName));
27589    display = jQuery.css(temp, "display");
27590    temp.parentNode.removeChild(temp);
27591
27592    if (display === "none") {
27593      display = "block";
27594    }
27595
27596    defaultDisplayMap[nodeName] = display;
27597    return display;
27598  }
27599
27600  function showHide(elements, show) {
27601    var display,
27602        elem,
27603        values = [],
27604        index = 0,
27605        length = elements.length; // Determine new display value for elements that need to change
27606
27607    for (; index < length; index++) {
27608      elem = elements[index];
27609
27610      if (!elem.style) {
27611        continue;
27612      }
27613
27614      display = elem.style.display;
27615
27616      if (show) {
27617        // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
27618        // check is required in this first loop unless we have a nonempty display value (either
27619        // inline or about-to-be-restored)
27620        if (display === "none") {
27621          values[index] = dataPriv.get(elem, "display") || null;
27622
27623          if (!values[index]) {
27624            elem.style.display = "";
27625          }
27626        }
27627
27628        if (elem.style.display === "" && isHiddenWithinTree(elem)) {
27629          values[index] = getDefaultDisplay(elem);
27630        }
27631      } else {
27632        if (display !== "none") {
27633          values[index] = "none"; // Remember what we're overwriting
27634
27635          dataPriv.set(elem, "display", display);
27636        }
27637      }
27638    } // Set the display of the elements in a second loop to avoid constant reflow
27639
27640
27641    for (index = 0; index < length; index++) {
27642      if (values[index] != null) {
27643        elements[index].style.display = values[index];
27644      }
27645    }
27646
27647    return elements;
27648  }
27649
27650  jQuery.fn.extend({
27651    show: function show() {
27652      return showHide(this, true);
27653    },
27654    hide: function hide() {
27655      return showHide(this);
27656    },
27657    toggle: function toggle(state) {
27658      if (typeof state === "boolean") {
27659        return state ? this.show() : this.hide();
27660      }
27661
27662      return this.each(function () {
27663        if (isHiddenWithinTree(this)) {
27664          jQuery(this).show();
27665        } else {
27666          jQuery(this).hide();
27667        }
27668      });
27669    }
27670  });
27671  var rcheckableType = /^(?:checkbox|radio)$/i;
27672  var rtagName = /<([a-z][^\/\0>\x20\t\r\n\f]+)/i;
27673  var rscriptType = /^$|^module$|\/(?:java|ecma)script/i; // We have to close these tags to support XHTML (#13200)
27674
27675  var wrapMap = {
27676    // Support: IE <=9 only
27677    option: [1, "<select multiple='multiple'>", "</select>"],
27678    // XHTML parsers do not magically insert elements in the
27679    // same way that tag soup parsers do. So we cannot shorten
27680    // this by omitting <tbody> or other required elements.
27681    thead: [1, "<table>", "</table>"],
27682    col: [2, "<table><colgroup>", "</colgroup></table>"],
27683    tr: [2, "<table><tbody>", "</tbody></table>"],
27684    td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],
27685    _default: [0, "", ""]
27686  }; // Support: IE <=9 only
27687
27688  wrapMap.optgroup = wrapMap.option;
27689  wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
27690  wrapMap.th = wrapMap.td;
27691
27692  function getAll(context, tag) {
27693    // Support: IE <=9 - 11 only
27694    // Use typeof to avoid zero-argument method invocation on host objects (#15151)
27695    var ret;
27696
27697    if (typeof context.getElementsByTagName !== "undefined") {
27698      ret = context.getElementsByTagName(tag || "*");
27699    } else if (typeof context.querySelectorAll !== "undefined") {
27700      ret = context.querySelectorAll(tag || "*");
27701    } else {
27702      ret = [];
27703    }
27704
27705    if (tag === undefined || tag && nodeName(context, tag)) {
27706      return jQuery.merge([context], ret);
27707    }
27708
27709    return ret;
27710  } // Mark scripts as having already been evaluated
27711
27712
27713  function setGlobalEval(elems, refElements) {
27714    var i = 0,
27715        l = elems.length;
27716
27717    for (; i < l; i++) {
27718      dataPriv.set(elems[i], "globalEval", !refElements || dataPriv.get(refElements[i], "globalEval"));
27719    }
27720  }
27721
27722  var rhtml = /<|&#?\w+;/;
27723
27724  function buildFragment(elems, context, scripts, selection, ignored) {
27725    var elem,
27726        tmp,
27727        tag,
27728        wrap,
27729        contains,
27730        j,
27731        fragment = context.createDocumentFragment(),
27732        nodes = [],
27733        i = 0,
27734        l = elems.length;
27735
27736    for (; i < l; i++) {
27737      elem = elems[i];
27738
27739      if (elem || elem === 0) {
27740        // Add nodes directly
27741        if (toType(elem) === "object") {
27742          // Support: Android <=4.0 only, PhantomJS 1 only
27743          // push.apply(_, arraylike) throws on ancient WebKit
27744          jQuery.merge(nodes, elem.nodeType ? [elem] : elem); // Convert non-html into a text node
27745        } else if (!rhtml.test(elem)) {
27746          nodes.push(context.createTextNode(elem)); // Convert html into DOM nodes
27747        } else {
27748          tmp = tmp || fragment.appendChild(context.createElement("div")); // Deserialize a standard representation
27749
27750          tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase();
27751          wrap = wrapMap[tag] || wrapMap._default;
27752          tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2]; // Descend through wrappers to the right content
27753
27754          j = wrap[0];
27755
27756          while (j--) {
27757            tmp = tmp.lastChild;
27758          } // Support: Android <=4.0 only, PhantomJS 1 only
27759          // push.apply(_, arraylike) throws on ancient WebKit
27760
27761
27762          jQuery.merge(nodes, tmp.childNodes); // Remember the top-level container
27763
27764          tmp = fragment.firstChild; // Ensure the created nodes are orphaned (#12392)
27765
27766          tmp.textContent = "";
27767        }
27768      }
27769    } // Remove wrapper from fragment
27770
27771
27772    fragment.textContent = "";
27773    i = 0;
27774
27775    while (elem = nodes[i++]) {
27776      // Skip elements already in the context collection (trac-4087)
27777      if (selection && jQuery.inArray(elem, selection) > -1) {
27778        if (ignored) {
27779          ignored.push(elem);
27780        }
27781
27782        continue;
27783      }
27784
27785      contains = jQuery.contains(elem.ownerDocument, elem); // Append to fragment
27786
27787      tmp = getAll(fragment.appendChild(elem), "script"); // Preserve script evaluation history
27788
27789      if (contains) {
27790        setGlobalEval(tmp);
27791      } // Capture executables
27792
27793
27794      if (scripts) {
27795        j = 0;
27796
27797        while (elem = tmp[j++]) {
27798          if (rscriptType.test(elem.type || "")) {
27799            scripts.push(elem);
27800          }
27801        }
27802      }
27803    }
27804
27805    return fragment;
27806  }
27807
27808  (function () {
27809    var fragment = document.createDocumentFragment(),
27810        div = fragment.appendChild(document.createElement("div")),
27811        input = document.createElement("input"); // Support: Android 4.0 - 4.3 only
27812    // Check state lost if the name is set (#11217)
27813    // Support: Windows Web Apps (WWA)
27814    // `name` and `type` must use .setAttribute for WWA (#14901)
27815
27816    input.setAttribute("type", "radio");
27817    input.setAttribute("checked", "checked");
27818    input.setAttribute("name", "t");
27819    div.appendChild(input); // Support: Android <=4.1 only
27820    // Older WebKit doesn't clone checked state correctly in fragments
27821
27822    support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked; // Support: IE <=11 only
27823    // Make sure textarea (and checkbox) defaultValue is properly cloned
27824
27825    div.innerHTML = "<textarea>x</textarea>";
27826    support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue;
27827  })();
27828
27829  var documentElement = document.documentElement;
27830  var rkeyEvent = /^key/,
27831      rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
27832      rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
27833
27834  function returnTrue() {
27835    return true;
27836  }
27837
27838  function returnFalse() {
27839    return false;
27840  } // Support: IE <=9 only
27841  // See #13393 for more info
27842
27843
27844  function safeActiveElement() {
27845    try {
27846      return document.activeElement;
27847    } catch (err) {}
27848  }
27849
27850  function _on(elem, types, selector, data, fn, one) {
27851    var origFn, type; // Types can be a map of types/handlers
27852
27853    if (_typeof(types) === "object") {
27854      // ( types-Object, selector, data )
27855      if (typeof selector !== "string") {
27856        // ( types-Object, data )
27857        data = data || selector;
27858        selector = undefined;
27859      }
27860
27861      for (type in types) {
27862        _on(elem, type, selector, data, types[type], one);
27863      }
27864
27865      return elem;
27866    }
27867
27868    if (data == null && fn == null) {
27869      // ( types, fn )
27870      fn = selector;
27871      data = selector = undefined;
27872    } else if (fn == null) {
27873      if (typeof selector === "string") {
27874        // ( types, selector, fn )
27875        fn = data;
27876        data = undefined;
27877      } else {
27878        // ( types, data, fn )
27879        fn = data;
27880        data = selector;
27881        selector = undefined;
27882      }
27883    }
27884
27885    if (fn === false) {
27886      fn = returnFalse;
27887    } else if (!fn) {
27888      return elem;
27889    }
27890
27891    if (one === 1) {
27892      origFn = fn;
27893
27894      fn = function fn(event) {
27895        // Can use an empty set, since event contains the info
27896        jQuery().off(event);
27897        return origFn.apply(this, arguments);
27898      }; // Use same guid so caller can remove using origFn
27899
27900
27901      fn.guid = origFn.guid || (origFn.guid = jQuery.guid++);
27902    }
27903
27904    return elem.each(function () {
27905      jQuery.event.add(this, types, fn, data, selector);
27906    });
27907  }
27908  /*
27909   * Helper functions for managing events -- not part of the public interface.
27910   * Props to Dean Edwards' addEvent library for many of the ideas.
27911   */
27912
27913
27914  jQuery.event = {
27915    global: {},
27916    add: function add(elem, types, handler, data, selector) {
27917      var handleObjIn,
27918          eventHandle,
27919          tmp,
27920          events,
27921          t,
27922          handleObj,
27923          special,
27924          handlers,
27925          type,
27926          namespaces,
27927          origType,
27928          elemData = dataPriv.get(elem); // Don't attach events to noData or text/comment nodes (but allow plain objects)
27929
27930      if (!elemData) {
27931        return;
27932      } // Caller can pass in an object of custom data in lieu of the handler
27933
27934
27935      if (handler.handler) {
27936        handleObjIn = handler;
27937        handler = handleObjIn.handler;
27938        selector = handleObjIn.selector;
27939      } // Ensure that invalid selectors throw exceptions at attach time
27940      // Evaluate against documentElement in case elem is a non-element node (e.g., document)
27941
27942
27943      if (selector) {
27944        jQuery.find.matchesSelector(documentElement, selector);
27945      } // Make sure that the handler has a unique ID, used to find/remove it later
27946
27947
27948      if (!handler.guid) {
27949        handler.guid = jQuery.guid++;
27950      } // Init the element's event structure and main handler, if this is the first
27951
27952
27953      if (!(events = elemData.events)) {
27954        events = elemData.events = {};
27955      }
27956
27957      if (!(eventHandle = elemData.handle)) {
27958        eventHandle = elemData.handle = function (e) {
27959          // Discard the second event of a jQuery.event.trigger() and
27960          // when an event is called after a page has unloaded
27961          return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply(elem, arguments) : undefined;
27962        };
27963      } // Handle multiple events separated by a space
27964
27965
27966      types = (types || "").match(rnothtmlwhite) || [""];
27967      t = types.length;
27968
27969      while (t--) {
27970        tmp = rtypenamespace.exec(types[t]) || [];
27971        type = origType = tmp[1];
27972        namespaces = (tmp[2] || "").split(".").sort(); // There *must* be a type, no attaching namespace-only handlers
27973
27974        if (!type) {
27975          continue;
27976        } // If event changes its type, use the special event handlers for the changed type
27977
27978
27979        special = jQuery.event.special[type] || {}; // If selector defined, determine special event api type, otherwise given type
27980
27981        type = (selector ? special.delegateType : special.bindType) || type; // Update special based on newly reset type
27982
27983        special = jQuery.event.special[type] || {}; // handleObj is passed to all event handlers
27984
27985        handleObj = jQuery.extend({
27986          type: type,
27987          origType: origType,
27988          data: data,
27989          handler: handler,
27990          guid: handler.guid,
27991          selector: selector,
27992          needsContext: selector && jQuery.expr.match.needsContext.test(selector),
27993          namespace: namespaces.join(".")
27994        }, handleObjIn); // Init the event handler queue if we're the first
27995
27996        if (!(handlers = events[type])) {
27997          handlers = events[type] = [];
27998          handlers.delegateCount = 0; // Only use addEventListener if the special events handler returns false
27999
28000          if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) {
28001            if (elem.addEventListener) {
28002              elem.addEventListener(type, eventHandle);
28003            }
28004          }
28005        }
28006
28007        if (special.add) {
28008          special.add.call(elem, handleObj);
28009
28010          if (!handleObj.handler.guid) {
28011            handleObj.handler.guid = handler.guid;
28012          }
28013        } // Add to the element's handler list, delegates in front
28014
28015
28016        if (selector) {
28017          handlers.splice(handlers.delegateCount++, 0, handleObj);
28018        } else {
28019          handlers.push(handleObj);
28020        } // Keep track of which events have ever been used, for event optimization
28021
28022
28023        jQuery.event.global[type] = true;
28024      }
28025    },
28026    // Detach an event or set of events from an element
28027    remove: function remove(elem, types, handler, selector, mappedTypes) {
28028      var j,
28029          origCount,
28030          tmp,
28031          events,
28032          t,
28033          handleObj,
28034          special,
28035          handlers,
28036          type,
28037          namespaces,
28038          origType,
28039          elemData = dataPriv.hasData(elem) && dataPriv.get(elem);
28040
28041      if (!elemData || !(events = elemData.events)) {
28042        return;
28043      } // Once for each type.namespace in types; type may be omitted
28044
28045
28046      types = (types || "").match(rnothtmlwhite) || [""];
28047      t = types.length;
28048
28049      while (t--) {
28050        tmp = rtypenamespace.exec(types[t]) || [];
28051        type = origType = tmp[1];
28052        namespaces = (tmp[2] || "").split(".").sort(); // Unbind all events (on this namespace, if provided) for the element
28053
28054        if (!type) {
28055          for (type in events) {
28056            jQuery.event.remove(elem, type + types[t], handler, selector, true);
28057          }
28058
28059          continue;
28060        }
28061
28062        special = jQuery.event.special[type] || {};
28063        type = (selector ? special.delegateType : special.bindType) || type;
28064        handlers = events[type] || [];
28065        tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)"); // Remove matching events
28066
28067        origCount = j = handlers.length;
28068
28069        while (j--) {
28070          handleObj = handlers[j];
28071
28072          if ((mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && (!tmp || tmp.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) {
28073            handlers.splice(j, 1);
28074
28075            if (handleObj.selector) {
28076              handlers.delegateCount--;
28077            }
28078
28079            if (special.remove) {
28080              special.remove.call(elem, handleObj);
28081            }
28082          }
28083        } // Remove generic event handler if we removed something and no more handlers exist
28084        // (avoids potential for endless recursion during removal of special event handlers)
28085
28086
28087        if (origCount && !handlers.length) {
28088          if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) {
28089            jQuery.removeEvent(elem, type, elemData.handle);
28090          }
28091
28092          delete events[type];
28093        }
28094      } // Remove data and the expando if it's no longer used
28095
28096
28097      if (jQuery.isEmptyObject(events)) {
28098        dataPriv.remove(elem, "handle events");
28099      }
28100    },
28101    dispatch: function dispatch(nativeEvent) {
28102      // Make a writable jQuery.Event from the native event object
28103      var event = jQuery.event.fix(nativeEvent);
28104      var i,
28105          j,
28106          ret,
28107          matched,
28108          handleObj,
28109          handlerQueue,
28110          args = new Array(arguments.length),
28111          handlers = (dataPriv.get(this, "events") || {})[event.type] || [],
28112          special = jQuery.event.special[event.type] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event
28113
28114      args[0] = event;
28115
28116      for (i = 1; i < arguments.length; i++) {
28117        args[i] = arguments[i];
28118      }
28119
28120      event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired
28121
28122      if (special.preDispatch && special.preDispatch.call(this, event) === false) {
28123        return;
28124      } // Determine handlers
28125
28126
28127      handlerQueue = jQuery.event.handlers.call(this, event, handlers); // Run delegates first; they may want to stop propagation beneath us
28128
28129      i = 0;
28130
28131      while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) {
28132        event.currentTarget = matched.elem;
28133        j = 0;
28134
28135        while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) {
28136          // Triggered event must either 1) have no namespace, or 2) have namespace(s)
28137          // a subset or equal to those in the bound event (both can have no namespace).
28138          if (!event.rnamespace || event.rnamespace.test(handleObj.namespace)) {
28139            event.handleObj = handleObj;
28140            event.data = handleObj.data;
28141            ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args);
28142
28143            if (ret !== undefined) {
28144              if ((event.result = ret) === false) {
28145                event.preventDefault();
28146                event.stopPropagation();
28147              }
28148            }
28149          }
28150        }
28151      } // Call the postDispatch hook for the mapped type
28152
28153
28154      if (special.postDispatch) {
28155        special.postDispatch.call(this, event);
28156      }
28157
28158      return event.result;
28159    },
28160    handlers: function handlers(event, _handlers) {
28161      var i,
28162          handleObj,
28163          sel,
28164          matchedHandlers,
28165          matchedSelectors,
28166          handlerQueue = [],
28167          delegateCount = _handlers.delegateCount,
28168          cur = event.target; // Find delegate handlers
28169
28170      if (delegateCount && // Support: IE <=9
28171      // Black-hole SVG <use> instance trees (trac-13180)
28172      cur.nodeType && // Support: Firefox <=42
28173      // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
28174      // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
28175      // Support: IE 11 only
28176      // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
28177      !(event.type === "click" && event.button >= 1)) {
28178        for (; cur !== this; cur = cur.parentNode || this) {
28179          // Don't check non-elements (#13208)
28180          // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
28181          if (cur.nodeType === 1 && !(event.type === "click" && cur.disabled === true)) {
28182            matchedHandlers = [];
28183            matchedSelectors = {};
28184
28185            for (i = 0; i < delegateCount; i++) {
28186              handleObj = _handlers[i]; // Don't conflict with Object.prototype properties (#13203)
28187
28188              sel = handleObj.selector + " ";
28189
28190              if (matchedSelectors[sel] === undefined) {
28191                matchedSelectors[sel] = handleObj.needsContext ? jQuery(sel, this).index(cur) > -1 : jQuery.find(sel, this, null, [cur]).length;
28192              }
28193
28194              if (matchedSelectors[sel]) {
28195                matchedHandlers.push(handleObj);
28196              }
28197            }
28198
28199            if (matchedHandlers.length) {
28200              handlerQueue.push({
28201                elem: cur,
28202                handlers: matchedHandlers
28203              });
28204            }
28205          }
28206        }
28207      } // Add the remaining (directly-bound) handlers
28208
28209
28210      cur = this;
28211
28212      if (delegateCount < _handlers.length) {
28213        handlerQueue.push({
28214          elem: cur,
28215          handlers: _handlers.slice(delegateCount)
28216        });
28217      }
28218
28219      return handlerQueue;
28220    },
28221    addProp: function addProp(name, hook) {
28222      Object.defineProperty(jQuery.Event.prototype, name, {
28223        enumerable: true,
28224        configurable: true,
28225        get: isFunction(hook) ? function () {
28226          if (this.originalEvent) {
28227            return hook(this.originalEvent);
28228          }
28229        } : function () {
28230          if (this.originalEvent) {
28231            return this.originalEvent[name];
28232          }
28233        },
28234        set: function set(value) {
28235          Object.defineProperty(this, name, {
28236            enumerable: true,
28237            configurable: true,
28238            writable: true,
28239            value: value
28240          });
28241        }
28242      });
28243    },
28244    fix: function fix(originalEvent) {
28245      return originalEvent[jQuery.expando] ? originalEvent : new jQuery.Event(originalEvent);
28246    },
28247    special: {
28248      load: {
28249        // Prevent triggered image.load events from bubbling to window.load
28250        noBubble: true
28251      },
28252      focus: {
28253        // Fire native event if possible so blur/focus sequence is correct
28254        trigger: function trigger() {
28255          if (this !== safeActiveElement() && this.focus) {
28256            this.focus();
28257            return false;
28258          }
28259        },
28260        delegateType: "focusin"
28261      },
28262      blur: {
28263        trigger: function trigger() {
28264          if (this === safeActiveElement() && this.blur) {
28265            this.blur();
28266            return false;
28267          }
28268        },
28269        delegateType: "focusout"
28270      },
28271      click: {
28272        // For checkbox, fire native event so checked state will be right
28273        trigger: function trigger() {
28274          if (this.type === "checkbox" && this.click && nodeName(this, "input")) {
28275            this.click();
28276            return false;
28277          }
28278        },
28279        // For cross-browser consistency, don't fire native .click() on links
28280        _default: function _default(event) {
28281          return nodeName(event.target, "a");
28282        }
28283      },
28284      beforeunload: {
28285        postDispatch: function postDispatch(event) {
28286          // Support: Firefox 20+
28287          // Firefox doesn't alert if the returnValue field is not set.
28288          if (event.result !== undefined && event.originalEvent) {
28289            event.originalEvent.returnValue = event.result;
28290          }
28291        }
28292      }
28293    }
28294  };
28295
28296  jQuery.removeEvent = function (elem, type, handle) {
28297    // This "if" is needed for plain objects
28298    if (elem.removeEventListener) {
28299      elem.removeEventListener(type, handle);
28300    }
28301  };
28302
28303  jQuery.Event = function (src, props) {
28304    // Allow instantiation without the 'new' keyword
28305    if (!(this instanceof jQuery.Event)) {
28306      return new jQuery.Event(src, props);
28307    } // Event object
28308
28309
28310    if (src && src.type) {
28311      this.originalEvent = src;
28312      this.type = src.type; // Events bubbling up the document may have been marked as prevented
28313      // by a handler lower down the tree; reflect the correct value.
28314
28315      this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && // Support: Android <=2.3 only
28316      src.returnValue === false ? returnTrue : returnFalse; // Create target properties
28317      // Support: Safari <=6 - 7 only
28318      // Target should not be a text node (#504, #13143)
28319
28320      this.target = src.target && src.target.nodeType === 3 ? src.target.parentNode : src.target;
28321      this.currentTarget = src.currentTarget;
28322      this.relatedTarget = src.relatedTarget; // Event type
28323    } else {
28324      this.type = src;
28325    } // Put explicitly provided properties onto the event object
28326
28327
28328    if (props) {
28329      jQuery.extend(this, props);
28330    } // Create a timestamp if incoming event doesn't have one
28331
28332
28333    this.timeStamp = src && src.timeStamp || Date.now(); // Mark it as fixed
28334
28335    this[jQuery.expando] = true;
28336  }; // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
28337  // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
28338
28339
28340  jQuery.Event.prototype = {
28341    constructor: jQuery.Event,
28342    isDefaultPrevented: returnFalse,
28343    isPropagationStopped: returnFalse,
28344    isImmediatePropagationStopped: returnFalse,
28345    isSimulated: false,
28346    preventDefault: function preventDefault() {
28347      var e = this.originalEvent;
28348      this.isDefaultPrevented = returnTrue;
28349
28350      if (e && !this.isSimulated) {
28351        e.preventDefault();
28352      }
28353    },
28354    stopPropagation: function stopPropagation() {
28355      var e = this.originalEvent;
28356      this.isPropagationStopped = returnTrue;
28357
28358      if (e && !this.isSimulated) {
28359        e.stopPropagation();
28360      }
28361    },
28362    stopImmediatePropagation: function stopImmediatePropagation() {
28363      var e = this.originalEvent;
28364      this.isImmediatePropagationStopped = returnTrue;
28365
28366      if (e && !this.isSimulated) {
28367        e.stopImmediatePropagation();
28368      }
28369
28370      this.stopPropagation();
28371    }
28372  }; // Includes all common event props including KeyEvent and MouseEvent specific props
28373
28374  jQuery.each({
28375    altKey: true,
28376    bubbles: true,
28377    cancelable: true,
28378    changedTouches: true,
28379    ctrlKey: true,
28380    detail: true,
28381    eventPhase: true,
28382    metaKey: true,
28383    pageX: true,
28384    pageY: true,
28385    shiftKey: true,
28386    view: true,
28387    "char": true,
28388    charCode: true,
28389    key: true,
28390    keyCode: true,
28391    button: true,
28392    buttons: true,
28393    clientX: true,
28394    clientY: true,
28395    offsetX: true,
28396    offsetY: true,
28397    pointerId: true,
28398    pointerType: true,
28399    screenX: true,
28400    screenY: true,
28401    targetTouches: true,
28402    toElement: true,
28403    touches: true,
28404    which: function which(event) {
28405      var button = event.button; // Add which for key events
28406
28407      if (event.which == null && rkeyEvent.test(event.type)) {
28408        return event.charCode != null ? event.charCode : event.keyCode;
28409      } // Add which for click: 1 === left; 2 === middle; 3 === right
28410
28411
28412      if (!event.which && button !== undefined && rmouseEvent.test(event.type)) {
28413        if (button & 1) {
28414          return 1;
28415        }
28416
28417        if (button & 2) {
28418          return 3;
28419        }
28420
28421        if (button & 4) {
28422          return 2;
28423        }
28424
28425        return 0;
28426      }
28427
28428      return event.which;
28429    }
28430  }, jQuery.event.addProp); // Create mouseenter/leave events using mouseover/out and event-time checks
28431  // so that event delegation works in jQuery.
28432  // Do the same for pointerenter/pointerleave and pointerover/pointerout
28433  //
28434  // Support: Safari 7 only
28435  // Safari sends mouseenter too often; see:
28436  // https://bugs.chromium.org/p/chromium/issues/detail?id=470258
28437  // for the description of the bug (it existed in older Chrome versions as well).
28438
28439  jQuery.each({
28440    mouseenter: "mouseover",
28441    mouseleave: "mouseout",
28442    pointerenter: "pointerover",
28443    pointerleave: "pointerout"
28444  }, function (orig, fix) {
28445    jQuery.event.special[orig] = {
28446      delegateType: fix,
28447      bindType: fix,
28448      handle: function handle(event) {
28449        var ret,
28450            target = this,
28451            related = event.relatedTarget,
28452            handleObj = event.handleObj; // For mouseenter/leave call the handler if related is outside the target.
28453        // NB: No relatedTarget if the mouse left/entered the browser window
28454
28455        if (!related || related !== target && !jQuery.contains(target, related)) {
28456          event.type = handleObj.origType;
28457          ret = handleObj.handler.apply(this, arguments);
28458          event.type = fix;
28459        }
28460
28461        return ret;
28462      }
28463    };
28464  });
28465  jQuery.fn.extend({
28466    on: function on(types, selector, data, fn) {
28467      return _on(this, types, selector, data, fn);
28468    },
28469    one: function one(types, selector, data, fn) {
28470      return _on(this, types, selector, data, fn, 1);
28471    },
28472    off: function off(types, selector, fn) {
28473      var handleObj, type;
28474
28475      if (types && types.preventDefault && types.handleObj) {
28476        // ( event )  dispatched jQuery.Event
28477        handleObj = types.handleObj;
28478        jQuery(types.delegateTarget).off(handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler);
28479        return this;
28480      }
28481
28482      if (_typeof(types) === "object") {
28483        // ( types-object [, selector] )
28484        for (type in types) {
28485          this.off(type, selector, types[type]);
28486        }
28487
28488        return this;
28489      }
28490
28491      if (selector === false || typeof selector === "function") {
28492        // ( types [, fn] )
28493        fn = selector;
28494        selector = undefined;
28495      }
28496
28497      if (fn === false) {
28498        fn = returnFalse;
28499      }
28500
28501      return this.each(function () {
28502        jQuery.event.remove(this, types, fn, selector);
28503      });
28504    }
28505  });
28506  var
28507  /* eslint-disable max-len */
28508  // See https://github.com/eslint/eslint/issues/3229
28509  rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
28510
28511  /* eslint-enable */
28512  // Support: IE <=10 - 11, Edge 12 - 13 only
28513  // In IE/Edge using regex groups here causes severe slowdowns.
28514  // See https://connect.microsoft.com/IE/feedback/details/1736512/
28515  rnoInnerhtml = /<script|<style|<link/i,
28516      // checked="checked" or checked
28517  rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
28518      rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g; // Prefer a tbody over its parent table for containing new rows
28519
28520  function manipulationTarget(elem, content) {
28521    if (nodeName(elem, "table") && nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr")) {
28522      return jQuery(elem).children("tbody")[0] || elem;
28523    }
28524
28525    return elem;
28526  } // Replace/restore the type attribute of script elements for safe DOM manipulation
28527
28528
28529  function disableScript(elem) {
28530    elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
28531    return elem;
28532  }
28533
28534  function restoreScript(elem) {
28535    if ((elem.type || "").slice(0, 5) === "true/") {
28536      elem.type = elem.type.slice(5);
28537    } else {
28538      elem.removeAttribute("type");
28539    }
28540
28541    return elem;
28542  }
28543
28544  function cloneCopyEvent(src, dest) {
28545    var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
28546
28547    if (dest.nodeType !== 1) {
28548      return;
28549    } // 1. Copy private data: events, handlers, etc.
28550
28551
28552    if (dataPriv.hasData(src)) {
28553      pdataOld = dataPriv.access(src);
28554      pdataCur = dataPriv.set(dest, pdataOld);
28555      events = pdataOld.events;
28556
28557      if (events) {
28558        delete pdataCur.handle;
28559        pdataCur.events = {};
28560
28561        for (type in events) {
28562          for (i = 0, l = events[type].length; i < l; i++) {
28563            jQuery.event.add(dest, type, events[type][i]);
28564          }
28565        }
28566      }
28567    } // 2. Copy user data
28568
28569
28570    if (dataUser.hasData(src)) {
28571      udataOld = dataUser.access(src);
28572      udataCur = jQuery.extend({}, udataOld);
28573      dataUser.set(dest, udataCur);
28574    }
28575  } // Fix IE bugs, see support tests
28576
28577
28578  function fixInput(src, dest) {
28579    var nodeName = dest.nodeName.toLowerCase(); // Fails to persist the checked state of a cloned checkbox or radio button.
28580
28581    if (nodeName === "input" && rcheckableType.test(src.type)) {
28582      dest.checked = src.checked; // Fails to return the selected option to the default selected state when cloning options
28583    } else if (nodeName === "input" || nodeName === "textarea") {
28584      dest.defaultValue = src.defaultValue;
28585    }
28586  }
28587
28588  function domManip(collection, args, callback, ignored) {
28589    // Flatten any nested arrays
28590    args = concat.apply([], args);
28591    var fragment,
28592        first,
28593        scripts,
28594        hasScripts,
28595        node,
28596        doc,
28597        i = 0,
28598        l = collection.length,
28599        iNoClone = l - 1,
28600        value = args[0],
28601        valueIsFunction = isFunction(value); // We can't cloneNode fragments that contain checked, in WebKit
28602
28603    if (valueIsFunction || l > 1 && typeof value === "string" && !support.checkClone && rchecked.test(value)) {
28604      return collection.each(function (index) {
28605        var self = collection.eq(index);
28606
28607        if (valueIsFunction) {
28608          args[0] = value.call(this, index, self.html());
28609        }
28610
28611        domManip(self, args, callback, ignored);
28612      });
28613    }
28614
28615    if (l) {
28616      fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored);
28617      first = fragment.firstChild;
28618
28619      if (fragment.childNodes.length === 1) {
28620        fragment = first;
28621      } // Require either new content or an interest in ignored elements to invoke the callback
28622
28623
28624      if (first || ignored) {
28625        scripts = jQuery.map(getAll(fragment, "script"), disableScript);
28626        hasScripts = scripts.length; // Use the original fragment for the last item
28627        // instead of the first because it can end up
28628        // being emptied incorrectly in certain situations (#8070).
28629
28630        for (; i < l; i++) {
28631          node = fragment;
28632
28633          if (i !== iNoClone) {
28634            node = jQuery.clone(node, true, true); // Keep references to cloned scripts for later restoration
28635
28636            if (hasScripts) {
28637              // Support: Android <=4.0 only, PhantomJS 1 only
28638              // push.apply(_, arraylike) throws on ancient WebKit
28639              jQuery.merge(scripts, getAll(node, "script"));
28640            }
28641          }
28642
28643          callback.call(collection[i], node, i);
28644        }
28645
28646        if (hasScripts) {
28647          doc = scripts[scripts.length - 1].ownerDocument; // Reenable scripts
28648
28649          jQuery.map(scripts, restoreScript); // Evaluate executable scripts on first document insertion
28650
28651          for (i = 0; i < hasScripts; i++) {
28652            node = scripts[i];
28653
28654            if (rscriptType.test(node.type || "") && !dataPriv.access(node, "globalEval") && jQuery.contains(doc, node)) {
28655              if (node.src && (node.type || "").toLowerCase() !== "module") {
28656                // Optional AJAX dependency, but won't run scripts if not present
28657                if (jQuery._evalUrl) {
28658                  jQuery._evalUrl(node.src);
28659                }
28660              } else {
28661                DOMEval(node.textContent.replace(rcleanScript, ""), doc, node);
28662              }
28663            }
28664          }
28665        }
28666      }
28667    }
28668
28669    return collection;
28670  }
28671
28672  function _remove(elem, selector, keepData) {
28673    var node,
28674        nodes = selector ? jQuery.filter(selector, elem) : elem,
28675        i = 0;
28676
28677    for (; (node = nodes[i]) != null; i++) {
28678      if (!keepData && node.nodeType === 1) {
28679        jQuery.cleanData(getAll(node));
28680      }
28681
28682      if (node.parentNode) {
28683        if (keepData && jQuery.contains(node.ownerDocument, node)) {
28684          setGlobalEval(getAll(node, "script"));
28685        }
28686
28687        node.parentNode.removeChild(node);
28688      }
28689    }
28690
28691    return elem;
28692  }
28693
28694  jQuery.extend({
28695    htmlPrefilter: function htmlPrefilter(html) {
28696      return html.replace(rxhtmlTag, "<$1></$2>");
28697    },
28698    clone: function clone(elem, dataAndEvents, deepDataAndEvents) {
28699      var i,
28700          l,
28701          srcElements,
28702          destElements,
28703          clone = elem.cloneNode(true),
28704          inPage = jQuery.contains(elem.ownerDocument, elem); // Fix IE cloning issues
28705
28706      if (!support.noCloneChecked && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) {
28707        // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
28708        destElements = getAll(clone);
28709        srcElements = getAll(elem);
28710
28711        for (i = 0, l = srcElements.length; i < l; i++) {
28712          fixInput(srcElements[i], destElements[i]);
28713        }
28714      } // Copy the events from the original to the clone
28715
28716
28717      if (dataAndEvents) {
28718        if (deepDataAndEvents) {
28719          srcElements = srcElements || getAll(elem);
28720          destElements = destElements || getAll(clone);
28721
28722          for (i = 0, l = srcElements.length; i < l; i++) {
28723            cloneCopyEvent(srcElements[i], destElements[i]);
28724          }
28725        } else {
28726          cloneCopyEvent(elem, clone);
28727        }
28728      } // Preserve script evaluation history
28729
28730
28731      destElements = getAll(clone, "script");
28732
28733      if (destElements.length > 0) {
28734        setGlobalEval(destElements, !inPage && getAll(elem, "script"));
28735      } // Return the cloned set
28736
28737
28738      return clone;
28739    },
28740    cleanData: function cleanData(elems) {
28741      var data,
28742          elem,
28743          type,
28744          special = jQuery.event.special,
28745          i = 0;
28746
28747      for (; (elem = elems[i]) !== undefined; i++) {
28748        if (acceptData(elem)) {
28749          if (data = elem[dataPriv.expando]) {
28750            if (data.events) {
28751              for (type in data.events) {
28752                if (special[type]) {
28753                  jQuery.event.remove(elem, type); // This is a shortcut to avoid jQuery.event.remove's overhead
28754                } else {
28755                  jQuery.removeEvent(elem, type, data.handle);
28756                }
28757              }
28758            } // Support: Chrome <=35 - 45+
28759            // Assign undefined instead of using delete, see Data#remove
28760
28761
28762            elem[dataPriv.expando] = undefined;
28763          }
28764
28765          if (elem[dataUser.expando]) {
28766            // Support: Chrome <=35 - 45+
28767            // Assign undefined instead of using delete, see Data#remove
28768            elem[dataUser.expando] = undefined;
28769          }
28770        }
28771      }
28772    }
28773  });
28774  jQuery.fn.extend({
28775    detach: function detach(selector) {
28776      return _remove(this, selector, true);
28777    },
28778    remove: function remove(selector) {
28779      return _remove(this, selector);
28780    },
28781    text: function text(value) {
28782      return access(this, function (value) {
28783        return value === undefined ? jQuery.text(this) : this.empty().each(function () {
28784          if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
28785            this.textContent = value;
28786          }
28787        });
28788      }, null, value, arguments.length);
28789    },
28790    append: function append() {
28791      return domManip(this, arguments, function (elem) {
28792        if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
28793          var target = manipulationTarget(this, elem);
28794          target.appendChild(elem);
28795        }
28796      });
28797    },
28798    prepend: function prepend() {
28799      return domManip(this, arguments, function (elem) {
28800        if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
28801          var target = manipulationTarget(this, elem);
28802          target.insertBefore(elem, target.firstChild);
28803        }
28804      });
28805    },
28806    before: function before() {
28807      return domManip(this, arguments, function (elem) {
28808        if (this.parentNode) {
28809          this.parentNode.insertBefore(elem, this);
28810        }
28811      });
28812    },
28813    after: function after() {
28814      return domManip(this, arguments, function (elem) {
28815        if (this.parentNode) {
28816          this.parentNode.insertBefore(elem, this.nextSibling);
28817        }
28818      });
28819    },
28820    empty: function empty() {
28821      var elem,
28822          i = 0;
28823
28824      for (; (elem = this[i]) != null; i++) {
28825        if (elem.nodeType === 1) {
28826          // Prevent memory leaks
28827          jQuery.cleanData(getAll(elem, false)); // Remove any remaining nodes
28828
28829          elem.textContent = "";
28830        }
28831      }
28832
28833      return this;
28834    },
28835    clone: function clone(dataAndEvents, deepDataAndEvents) {
28836      dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
28837      deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
28838      return this.map(function () {
28839        return jQuery.clone(this, dataAndEvents, deepDataAndEvents);
28840      });
28841    },
28842    html: function html(value) {
28843      return access(this, function (value) {
28844        var elem = this[0] || {},
28845            i = 0,
28846            l = this.length;
28847
28848        if (value === undefined && elem.nodeType === 1) {
28849          return elem.innerHTML;
28850        } // See if we can take a shortcut and just use innerHTML
28851
28852
28853        if (typeof value === "string" && !rnoInnerhtml.test(value) && !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) {
28854          value = jQuery.htmlPrefilter(value);
28855
28856          try {
28857            for (; i < l; i++) {
28858              elem = this[i] || {}; // Remove element nodes and prevent memory leaks
28859
28860              if (elem.nodeType === 1) {
28861                jQuery.cleanData(getAll(elem, false));
28862                elem.innerHTML = value;
28863              }
28864            }
28865
28866            elem = 0; // If using innerHTML throws an exception, use the fallback method
28867          } catch (e) {}
28868        }
28869
28870        if (elem) {
28871          this.empty().append(value);
28872        }
28873      }, null, value, arguments.length);
28874    },
28875    replaceWith: function replaceWith() {
28876      var ignored = []; // Make the changes, replacing each non-ignored context element with the new content
28877
28878      return domManip(this, arguments, function (elem) {
28879        var parent = this.parentNode;
28880
28881        if (jQuery.inArray(this, ignored) < 0) {
28882          jQuery.cleanData(getAll(this));
28883
28884          if (parent) {
28885            parent.replaceChild(elem, this);
28886          }
28887        } // Force callback invocation
28888
28889      }, ignored);
28890    }
28891  });
28892  jQuery.each({
28893    appendTo: "append",
28894    prependTo: "prepend",
28895    insertBefore: "before",
28896    insertAfter: "after",
28897    replaceAll: "replaceWith"
28898  }, function (name, original) {
28899    jQuery.fn[name] = function (selector) {
28900      var elems,
28901          ret = [],
28902          insert = jQuery(selector),
28903          last = insert.length - 1,
28904          i = 0;
28905
28906      for (; i <= last; i++) {
28907        elems = i === last ? this : this.clone(true);
28908        jQuery(insert[i])[original](elems); // Support: Android <=4.0 only, PhantomJS 1 only
28909        // .get() because push.apply(_, arraylike) throws on ancient WebKit
28910
28911        push.apply(ret, elems.get());
28912      }
28913
28914      return this.pushStack(ret);
28915    };
28916  });
28917  var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i");
28918
28919  var getStyles = function getStyles(elem) {
28920    // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
28921    // IE throws on elements created in popups
28922    // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
28923    var view = elem.ownerDocument.defaultView;
28924
28925    if (!view || !view.opener) {
28926      view = window;
28927    }
28928
28929    return view.getComputedStyle(elem);
28930  };
28931
28932  var rboxStyle = new RegExp(cssExpand.join("|"), "i");
28933
28934  (function () {
28935    // Executing both pixelPosition & boxSizingReliable tests require only one layout
28936    // so they're executed at the same time to save the second computation.
28937    function computeStyleTests() {
28938      // This is a singleton, we need to execute it only once
28939      if (!div) {
28940        return;
28941      }
28942
28943      container.style.cssText = "position:absolute;left:-11111px;width:60px;" + "margin-top:1px;padding:0;border:0";
28944      div.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + "margin:auto;border:1px;padding:1px;" + "width:60%;top:1%";
28945      documentElement.appendChild(container).appendChild(div);
28946      var divStyle = window.getComputedStyle(div);
28947      pixelPositionVal = divStyle.top !== "1%"; // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
28948
28949      reliableMarginLeftVal = roundPixelMeasures(divStyle.marginLeft) === 12; // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
28950      // Some styles come back with percentage values, even though they shouldn't
28951
28952      div.style.right = "60%";
28953      pixelBoxStylesVal = roundPixelMeasures(divStyle.right) === 36; // Support: IE 9 - 11 only
28954      // Detect misreporting of content dimensions for box-sizing:border-box elements
28955
28956      boxSizingReliableVal = roundPixelMeasures(divStyle.width) === 36; // Support: IE 9 only
28957      // Detect overflow:scroll screwiness (gh-3699)
28958
28959      div.style.position = "absolute";
28960      scrollboxSizeVal = div.offsetWidth === 36 || "absolute";
28961      documentElement.removeChild(container); // Nullify the div so it wouldn't be stored in the memory and
28962      // it will also be a sign that checks already performed
28963
28964      div = null;
28965    }
28966
28967    function roundPixelMeasures(measure) {
28968      return Math.round(parseFloat(measure));
28969    }
28970
28971    var pixelPositionVal,
28972        boxSizingReliableVal,
28973        scrollboxSizeVal,
28974        pixelBoxStylesVal,
28975        reliableMarginLeftVal,
28976        container = document.createElement("div"),
28977        div = document.createElement("div"); // Finish early in limited (non-browser) environments
28978
28979    if (!div.style) {
28980      return;
28981    } // Support: IE <=9 - 11 only
28982    // Style of cloned element affects source element cloned (#8908)
28983
28984
28985    div.style.backgroundClip = "content-box";
28986    div.cloneNode(true).style.backgroundClip = "";
28987    support.clearCloneStyle = div.style.backgroundClip === "content-box";
28988    jQuery.extend(support, {
28989      boxSizingReliable: function boxSizingReliable() {
28990        computeStyleTests();
28991        return boxSizingReliableVal;
28992      },
28993      pixelBoxStyles: function pixelBoxStyles() {
28994        computeStyleTests();
28995        return pixelBoxStylesVal;
28996      },
28997      pixelPosition: function pixelPosition() {
28998        computeStyleTests();
28999        return pixelPositionVal;
29000      },
29001      reliableMarginLeft: function reliableMarginLeft() {
29002        computeStyleTests();
29003        return reliableMarginLeftVal;
29004      },
29005      scrollboxSize: function scrollboxSize() {
29006        computeStyleTests();
29007        return scrollboxSizeVal;
29008      }
29009    });
29010  })();
29011
29012  function curCSS(elem, name, computed) {
29013    var width,
29014        minWidth,
29015        maxWidth,
29016        ret,
29017        // Support: Firefox 51+
29018    // Retrieving style before computed somehow
29019    // fixes an issue with getting wrong values
29020    // on detached elements
29021    style = elem.style;
29022    computed = computed || getStyles(elem); // getPropertyValue is needed for:
29023    //   .css('filter') (IE 9 only, #12537)
29024    //   .css('--customProperty) (#3144)
29025
29026    if (computed) {
29027      ret = computed.getPropertyValue(name) || computed[name];
29028
29029      if (ret === "" && !jQuery.contains(elem.ownerDocument, elem)) {
29030        ret = jQuery.style(elem, name);
29031      } // A tribute to the "awesome hack by Dean Edwards"
29032      // Android Browser returns percentage for some values,
29033      // but width seems to be reliably pixels.
29034      // This is against the CSSOM draft spec:
29035      // https://drafts.csswg.org/cssom/#resolved-values
29036
29037
29038      if (!support.pixelBoxStyles() && rnumnonpx.test(ret) && rboxStyle.test(name)) {
29039        // Remember the original values
29040        width = style.width;
29041        minWidth = style.minWidth;
29042        maxWidth = style.maxWidth; // Put in the new values to get a computed value out
29043
29044        style.minWidth = style.maxWidth = style.width = ret;
29045        ret = computed.width; // Revert the changed values
29046
29047        style.width = width;
29048        style.minWidth = minWidth;
29049        style.maxWidth = maxWidth;
29050      }
29051    }
29052
29053    return ret !== undefined ? // Support: IE <=9 - 11 only
29054    // IE returns zIndex value as an integer.
29055    ret + "" : ret;
29056  }
29057
29058  function addGetHookIf(conditionFn, hookFn) {
29059    // Define the hook, we'll check on the first run if it's really needed.
29060    return {
29061      get: function get() {
29062        if (conditionFn()) {
29063          // Hook not needed (or it's not possible to use it due
29064          // to missing dependency), remove it.
29065          delete this.get;
29066          return;
29067        } // Hook needed; redefine it so that the support test is not executed again.
29068
29069
29070        return (this.get = hookFn).apply(this, arguments);
29071      }
29072    };
29073  }
29074
29075  var // Swappable if display is none or starts with table
29076  // except "table", "table-cell", or "table-caption"
29077  // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
29078  rdisplayswap = /^(none|table(?!-c[ea]).+)/,
29079      rcustomProp = /^--/,
29080      cssShow = {
29081    position: "absolute",
29082    visibility: "hidden",
29083    display: "block"
29084  },
29085      cssNormalTransform = {
29086    letterSpacing: "0",
29087    fontWeight: "400"
29088  },
29089      cssPrefixes = ["Webkit", "Moz", "ms"],
29090      emptyStyle = document.createElement("div").style; // Return a css property mapped to a potentially vendor prefixed property
29091
29092  function vendorPropName(name) {
29093    // Shortcut for names that are not vendor prefixed
29094    if (name in emptyStyle) {
29095      return name;
29096    } // Check for vendor prefixed names
29097
29098
29099    var capName = name[0].toUpperCase() + name.slice(1),
29100        i = cssPrefixes.length;
29101
29102    while (i--) {
29103      name = cssPrefixes[i] + capName;
29104
29105      if (name in emptyStyle) {
29106        return name;
29107      }
29108    }
29109  } // Return a property mapped along what jQuery.cssProps suggests or to
29110  // a vendor prefixed property.
29111
29112
29113  function finalPropName(name) {
29114    var ret = jQuery.cssProps[name];
29115
29116    if (!ret) {
29117      ret = jQuery.cssProps[name] = vendorPropName(name) || name;
29118    }
29119
29120    return ret;
29121  }
29122
29123  function setPositiveNumber(elem, value, subtract) {
29124    // Any relative (+/-) values have already been
29125    // normalized at this point
29126    var matches = rcssNum.exec(value);
29127    return matches ? // Guard against undefined "subtract", e.g., when used as in cssHooks
29128    Math.max(0, matches[2] - (subtract || 0)) + (matches[3] || "px") : value;
29129  }
29130
29131  function boxModelAdjustment(elem, dimension, box, isBorderBox, styles, computedVal) {
29132    var i = dimension === "width" ? 1 : 0,
29133        extra = 0,
29134        delta = 0; // Adjustment may not be necessary
29135
29136    if (box === (isBorderBox ? "border" : "content")) {
29137      return 0;
29138    }
29139
29140    for (; i < 4; i += 2) {
29141      // Both box models exclude margin
29142      if (box === "margin") {
29143        delta += jQuery.css(elem, box + cssExpand[i], true, styles);
29144      } // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
29145
29146
29147      if (!isBorderBox) {
29148        // Add padding
29149        delta += jQuery.css(elem, "padding" + cssExpand[i], true, styles); // For "border" or "margin", add border
29150
29151        if (box !== "padding") {
29152          delta += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles); // But still keep track of it otherwise
29153        } else {
29154          extra += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
29155        } // If we get here with a border-box (content + padding + border), we're seeking "content" or
29156        // "padding" or "margin"
29157
29158      } else {
29159        // For "content", subtract padding
29160        if (box === "content") {
29161          delta -= jQuery.css(elem, "padding" + cssExpand[i], true, styles);
29162        } // For "content" or "padding", subtract border
29163
29164
29165        if (box !== "margin") {
29166          delta -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
29167        }
29168      }
29169    } // Account for positive content-box scroll gutter when requested by providing computedVal
29170
29171
29172    if (!isBorderBox && computedVal >= 0) {
29173      // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
29174      // Assuming integer scroll gutter, subtract the rest and round down
29175      delta += Math.max(0, Math.ceil(elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - computedVal - delta - extra - 0.5));
29176    }
29177
29178    return delta;
29179  }
29180
29181  function getWidthOrHeight(elem, dimension, extra) {
29182    // Start with computed style
29183    var styles = getStyles(elem),
29184        val = curCSS(elem, dimension, styles),
29185        isBorderBox = jQuery.css(elem, "boxSizing", false, styles) === "border-box",
29186        valueIsBorderBox = isBorderBox; // Support: Firefox <=54
29187    // Return a confounding non-pixel value or feign ignorance, as appropriate.
29188
29189    if (rnumnonpx.test(val)) {
29190      if (!extra) {
29191        return val;
29192      }
29193
29194      val = "auto";
29195    } // Check for style in case a browser which returns unreliable values
29196    // for getComputedStyle silently falls back to the reliable elem.style
29197
29198
29199    valueIsBorderBox = valueIsBorderBox && (support.boxSizingReliable() || val === elem.style[dimension]); // Fall back to offsetWidth/offsetHeight when value is "auto"
29200    // This happens for inline elements with no explicit setting (gh-3571)
29201    // Support: Android <=4.1 - 4.3 only
29202    // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
29203
29204    if (val === "auto" || !parseFloat(val) && jQuery.css(elem, "display", false, styles) === "inline") {
29205      val = elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)]; // offsetWidth/offsetHeight provide border-box values
29206
29207      valueIsBorderBox = true;
29208    } // Normalize "" and auto
29209
29210
29211    val = parseFloat(val) || 0; // Adjust for the element's box model
29212
29213    return val + boxModelAdjustment(elem, dimension, extra || (isBorderBox ? "border" : "content"), valueIsBorderBox, styles, // Provide the current computed size to request scroll gutter calculation (gh-3589)
29214    val) + "px";
29215  }
29216
29217  jQuery.extend({
29218    // Add in style property hooks for overriding the default
29219    // behavior of getting and setting a style property
29220    cssHooks: {
29221      opacity: {
29222        get: function get(elem, computed) {
29223          if (computed) {
29224            // We should always get a number back from opacity
29225            var ret = curCSS(elem, "opacity");
29226            return ret === "" ? "1" : ret;
29227          }
29228        }
29229      }
29230    },
29231    // Don't automatically add "px" to these possibly-unitless properties
29232    cssNumber: {
29233      "animationIterationCount": true,
29234      "columnCount": true,
29235      "fillOpacity": true,
29236      "flexGrow": true,
29237      "flexShrink": true,
29238      "fontWeight": true,
29239      "lineHeight": true,
29240      "opacity": true,
29241      "order": true,
29242      "orphans": true,
29243      "widows": true,
29244      "zIndex": true,
29245      "zoom": true
29246    },
29247    // Add in properties whose names you wish to fix before
29248    // setting or getting the value
29249    cssProps: {},
29250    // Get and set the style property on a DOM Node
29251    style: function style(elem, name, value, extra) {
29252      // Don't set styles on text and comment nodes
29253      if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) {
29254        return;
29255      } // Make sure that we're working with the right name
29256
29257
29258      var ret,
29259          type,
29260          hooks,
29261          origName = camelCase(name),
29262          isCustomProp = rcustomProp.test(name),
29263          style = elem.style; // Make sure that we're working with the right name. We don't
29264      // want to query the value if it is a CSS custom property
29265      // since they are user-defined.
29266
29267      if (!isCustomProp) {
29268        name = finalPropName(origName);
29269      } // Gets hook for the prefixed version, then unprefixed version
29270
29271
29272      hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; // Check if we're setting a value
29273
29274      if (value !== undefined) {
29275        type = _typeof(value); // Convert "+=" or "-=" to relative numbers (#7345)
29276
29277        if (type === "string" && (ret = rcssNum.exec(value)) && ret[1]) {
29278          value = adjustCSS(elem, name, ret); // Fixes bug #9237
29279
29280          type = "number";
29281        } // Make sure that null and NaN values aren't set (#7116)
29282
29283
29284        if (value == null || value !== value) {
29285          return;
29286        } // If a number was passed in, add the unit (except for certain CSS properties)
29287
29288
29289        if (type === "number") {
29290          value += ret && ret[3] || (jQuery.cssNumber[origName] ? "" : "px");
29291        } // background-* props affect original clone's values
29292
29293
29294        if (!support.clearCloneStyle && value === "" && name.indexOf("background") === 0) {
29295          style[name] = "inherit";
29296        } // If a hook was provided, use that value, otherwise just set the specified value
29297
29298
29299        if (!hooks || !("set" in hooks) || (value = hooks.set(elem, value, extra)) !== undefined) {
29300          if (isCustomProp) {
29301            style.setProperty(name, value);
29302          } else {
29303            style[name] = value;
29304          }
29305        }
29306      } else {
29307        // If a hook was provided get the non-computed value from there
29308        if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== undefined) {
29309          return ret;
29310        } // Otherwise just get the value from the style object
29311
29312
29313        return style[name];
29314      }
29315    },
29316    css: function css(elem, name, extra, styles) {
29317      var val,
29318          num,
29319          hooks,
29320          origName = camelCase(name),
29321          isCustomProp = rcustomProp.test(name); // Make sure that we're working with the right name. We don't
29322      // want to modify the value if it is a CSS custom property
29323      // since they are user-defined.
29324
29325      if (!isCustomProp) {
29326        name = finalPropName(origName);
29327      } // Try prefixed name followed by the unprefixed name
29328
29329
29330      hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; // If a hook was provided get the computed value from there
29331
29332      if (hooks && "get" in hooks) {
29333        val = hooks.get(elem, true, extra);
29334      } // Otherwise, if a way to get the computed value exists, use that
29335
29336
29337      if (val === undefined) {
29338        val = curCSS(elem, name, styles);
29339      } // Convert "normal" to computed value
29340
29341
29342      if (val === "normal" && name in cssNormalTransform) {
29343        val = cssNormalTransform[name];
29344      } // Make numeric if forced or a qualifier was provided and val looks numeric
29345
29346
29347      if (extra === "" || extra) {
29348        num = parseFloat(val);
29349        return extra === true || isFinite(num) ? num || 0 : val;
29350      }
29351
29352      return val;
29353    }
29354  });
29355  jQuery.each(["height", "width"], function (i, dimension) {
29356    jQuery.cssHooks[dimension] = {
29357      get: function get(elem, computed, extra) {
29358        if (computed) {
29359          // Certain elements can have dimension info if we invisibly show them
29360          // but it must have a current display style that would benefit
29361          return rdisplayswap.test(jQuery.css(elem, "display")) && ( // Support: Safari 8+
29362          // Table columns in Safari have non-zero offsetWidth & zero
29363          // getBoundingClientRect().width unless display is changed.
29364          // Support: IE <=11 only
29365          // Running getBoundingClientRect on a disconnected node
29366          // in IE throws an error.
29367          !elem.getClientRects().length || !elem.getBoundingClientRect().width) ? swap(elem, cssShow, function () {
29368            return getWidthOrHeight(elem, dimension, extra);
29369          }) : getWidthOrHeight(elem, dimension, extra);
29370        }
29371      },
29372      set: function set(elem, value, extra) {
29373        var matches,
29374            styles = getStyles(elem),
29375            isBorderBox = jQuery.css(elem, "boxSizing", false, styles) === "border-box",
29376            subtract = extra && boxModelAdjustment(elem, dimension, extra, isBorderBox, styles); // Account for unreliable border-box dimensions by comparing offset* to computed and
29377        // faking a content-box to get border and padding (gh-3699)
29378
29379        if (isBorderBox && support.scrollboxSize() === styles.position) {
29380          subtract -= Math.ceil(elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - parseFloat(styles[dimension]) - boxModelAdjustment(elem, dimension, "border", false, styles) - 0.5);
29381        } // Convert to pixels if value adjustment is needed
29382
29383
29384        if (subtract && (matches = rcssNum.exec(value)) && (matches[3] || "px") !== "px") {
29385          elem.style[dimension] = value;
29386          value = jQuery.css(elem, dimension);
29387        }
29388
29389        return setPositiveNumber(elem, value, subtract);
29390      }
29391    };
29392  });
29393  jQuery.cssHooks.marginLeft = addGetHookIf(support.reliableMarginLeft, function (elem, computed) {
29394    if (computed) {
29395      return (parseFloat(curCSS(elem, "marginLeft")) || elem.getBoundingClientRect().left - swap(elem, {
29396        marginLeft: 0
29397      }, function () {
29398        return elem.getBoundingClientRect().left;
29399      })) + "px";
29400    }
29401  }); // These hooks are used by animate to expand properties
29402
29403  jQuery.each({
29404    margin: "",
29405    padding: "",
29406    border: "Width"
29407  }, function (prefix, suffix) {
29408    jQuery.cssHooks[prefix + suffix] = {
29409      expand: function expand(value) {
29410        var i = 0,
29411            expanded = {},
29412            // Assumes a single number if not a string
29413        parts = typeof value === "string" ? value.split(" ") : [value];
29414
29415        for (; i < 4; i++) {
29416          expanded[prefix + cssExpand[i] + suffix] = parts[i] || parts[i - 2] || parts[0];
29417        }
29418
29419        return expanded;
29420      }
29421    };
29422
29423    if (prefix !== "margin") {
29424      jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;
29425    }
29426  });
29427  jQuery.fn.extend({
29428    css: function css(name, value) {
29429      return access(this, function (elem, name, value) {
29430        var styles,
29431            len,
29432            map = {},
29433            i = 0;
29434
29435        if (Array.isArray(name)) {
29436          styles = getStyles(elem);
29437          len = name.length;
29438
29439          for (; i < len; i++) {
29440            map[name[i]] = jQuery.css(elem, name[i], false, styles);
29441          }
29442
29443          return map;
29444        }
29445
29446        return value !== undefined ? jQuery.style(elem, name, value) : jQuery.css(elem, name);
29447      }, name, value, arguments.length > 1);
29448    }
29449  });
29450
29451  function Tween(elem, options, prop, end, easing) {
29452    return new Tween.prototype.init(elem, options, prop, end, easing);
29453  }
29454
29455  jQuery.Tween = Tween;
29456  Tween.prototype = {
29457    constructor: Tween,
29458    init: function init(elem, options, prop, end, easing, unit) {
29459      this.elem = elem;
29460      this.prop = prop;
29461      this.easing = easing || jQuery.easing._default;
29462      this.options = options;
29463      this.start = this.now = this.cur();
29464      this.end = end;
29465      this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px");
29466    },
29467    cur: function cur() {
29468      var hooks = Tween.propHooks[this.prop];
29469      return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this);
29470    },
29471    run: function run(percent) {
29472      var eased,
29473          hooks = Tween.propHooks[this.prop];
29474
29475      if (this.options.duration) {
29476        this.pos = eased = jQuery.easing[this.easing](percent, this.options.duration * percent, 0, 1, this.options.duration);
29477      } else {
29478        this.pos = eased = percent;
29479      }
29480
29481      this.now = (this.end - this.start) * eased + this.start;
29482
29483      if (this.options.step) {
29484        this.options.step.call(this.elem, this.now, this);
29485      }
29486
29487      if (hooks && hooks.set) {
29488        hooks.set(this);
29489      } else {
29490        Tween.propHooks._default.set(this);
29491      }
29492
29493      return this;
29494    }
29495  };
29496  Tween.prototype.init.prototype = Tween.prototype;
29497  Tween.propHooks = {
29498    _default: {
29499      get: function get(tween) {
29500        var result; // Use a property on the element directly when it is not a DOM element,
29501        // or when there is no matching style property that exists.
29502
29503        if (tween.elem.nodeType !== 1 || tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) {
29504          return tween.elem[tween.prop];
29505        } // Passing an empty string as a 3rd parameter to .css will automatically
29506        // attempt a parseFloat and fallback to a string if the parse fails.
29507        // Simple values such as "10px" are parsed to Float;
29508        // complex values such as "rotate(1rad)" are returned as-is.
29509
29510
29511        result = jQuery.css(tween.elem, tween.prop, ""); // Empty strings, null, undefined and "auto" are converted to 0.
29512
29513        return !result || result === "auto" ? 0 : result;
29514      },
29515      set: function set(tween) {
29516        // Use step hook for back compat.
29517        // Use cssHook if its there.
29518        // Use .style if available and use plain properties where available.
29519        if (jQuery.fx.step[tween.prop]) {
29520          jQuery.fx.step[tween.prop](tween);
29521        } else if (tween.elem.nodeType === 1 && (tween.elem.style[jQuery.cssProps[tween.prop]] != null || jQuery.cssHooks[tween.prop])) {
29522          jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);
29523        } else {
29524          tween.elem[tween.prop] = tween.now;
29525        }
29526      }
29527    }
29528  }; // Support: IE <=9 only
29529  // Panic based approach to setting things on disconnected nodes
29530
29531  Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
29532    set: function set(tween) {
29533      if (tween.elem.nodeType && tween.elem.parentNode) {
29534        tween.elem[tween.prop] = tween.now;
29535      }
29536    }
29537  };
29538  jQuery.easing = {
29539    linear: function linear(p) {
29540      return p;
29541    },
29542    swing: function swing(p) {
29543      return 0.5 - Math.cos(p * Math.PI) / 2;
29544    },
29545    _default: "swing"
29546  };
29547  jQuery.fx = Tween.prototype.init; // Back compat <1.8 extension point
29548
29549  jQuery.fx.step = {};
29550  var fxNow,
29551      inProgress,
29552      rfxtypes = /^(?:toggle|show|hide)$/,
29553      rrun = /queueHooks$/;
29554
29555  function schedule() {
29556    if (inProgress) {
29557      if (document.hidden === false && window.requestAnimationFrame) {
29558        window.requestAnimationFrame(schedule);
29559      } else {
29560        window.setTimeout(schedule, jQuery.fx.interval);
29561      }
29562
29563      jQuery.fx.tick();
29564    }
29565  } // Animations created synchronously will run synchronously
29566
29567
29568  function createFxNow() {
29569    window.setTimeout(function () {
29570      fxNow = undefined;
29571    });
29572    return fxNow = Date.now();
29573  } // Generate parameters to create a standard animation
29574
29575
29576  function genFx(type, includeWidth) {
29577    var which,
29578        i = 0,
29579        attrs = {
29580      height: type
29581    }; // If we include width, step value is 1 to do all cssExpand values,
29582    // otherwise step value is 2 to skip over Left and Right
29583
29584    includeWidth = includeWidth ? 1 : 0;
29585
29586    for (; i < 4; i += 2 - includeWidth) {
29587      which = cssExpand[i];
29588      attrs["margin" + which] = attrs["padding" + which] = type;
29589    }
29590
29591    if (includeWidth) {
29592      attrs.opacity = attrs.width = type;
29593    }
29594
29595    return attrs;
29596  }
29597
29598  function createTween(value, prop, animation) {
29599    var tween,
29600        collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners["*"]),
29601        index = 0,
29602        length = collection.length;
29603
29604    for (; index < length; index++) {
29605      if (tween = collection[index].call(animation, prop, value)) {
29606        // We're done with this property
29607        return tween;
29608      }
29609    }
29610  }
29611
29612  function defaultPrefilter(elem, props, opts) {
29613    var prop,
29614        value,
29615        toggle,
29616        hooks,
29617        oldfire,
29618        propTween,
29619        restoreDisplay,
29620        display,
29621        isBox = "width" in props || "height" in props,
29622        anim = this,
29623        orig = {},
29624        style = elem.style,
29625        hidden = elem.nodeType && isHiddenWithinTree(elem),
29626        dataShow = dataPriv.get(elem, "fxshow"); // Queue-skipping animations hijack the fx hooks
29627
29628    if (!opts.queue) {
29629      hooks = jQuery._queueHooks(elem, "fx");
29630
29631      if (hooks.unqueued == null) {
29632        hooks.unqueued = 0;
29633        oldfire = hooks.empty.fire;
29634
29635        hooks.empty.fire = function () {
29636          if (!hooks.unqueued) {
29637            oldfire();
29638          }
29639        };
29640      }
29641
29642      hooks.unqueued++;
29643      anim.always(function () {
29644        // Ensure the complete handler is called before this completes
29645        anim.always(function () {
29646          hooks.unqueued--;
29647
29648          if (!jQuery.queue(elem, "fx").length) {
29649            hooks.empty.fire();
29650          }
29651        });
29652      });
29653    } // Detect show/hide animations
29654
29655
29656    for (prop in props) {
29657      value = props[prop];
29658
29659      if (rfxtypes.test(value)) {
29660        delete props[prop];
29661        toggle = toggle || value === "toggle";
29662
29663        if (value === (hidden ? "hide" : "show")) {
29664          // Pretend to be hidden if this is a "show" and
29665          // there is still data from a stopped show/hide
29666          if (value === "show" && dataShow && dataShow[prop] !== undefined) {
29667            hidden = true; // Ignore all other no-op show/hide data
29668          } else {
29669            continue;
29670          }
29671        }
29672
29673        orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop);
29674      }
29675    } // Bail out if this is a no-op like .hide().hide()
29676
29677
29678    propTween = !jQuery.isEmptyObject(props);
29679
29680    if (!propTween && jQuery.isEmptyObject(orig)) {
29681      return;
29682    } // Restrict "overflow" and "display" styles during box animations
29683
29684
29685    if (isBox && elem.nodeType === 1) {
29686      // Support: IE <=9 - 11, Edge 12 - 15
29687      // Record all 3 overflow attributes because IE does not infer the shorthand
29688      // from identically-valued overflowX and overflowY and Edge just mirrors
29689      // the overflowX value there.
29690      opts.overflow = [style.overflow, style.overflowX, style.overflowY]; // Identify a display type, preferring old show/hide data over the CSS cascade
29691
29692      restoreDisplay = dataShow && dataShow.display;
29693
29694      if (restoreDisplay == null) {
29695        restoreDisplay = dataPriv.get(elem, "display");
29696      }
29697
29698      display = jQuery.css(elem, "display");
29699
29700      if (display === "none") {
29701        if (restoreDisplay) {
29702          display = restoreDisplay;
29703        } else {
29704          // Get nonempty value(s) by temporarily forcing visibility
29705          showHide([elem], true);
29706          restoreDisplay = elem.style.display || restoreDisplay;
29707          display = jQuery.css(elem, "display");
29708          showHide([elem]);
29709        }
29710      } // Animate inline elements as inline-block
29711
29712
29713      if (display === "inline" || display === "inline-block" && restoreDisplay != null) {
29714        if (jQuery.css(elem, "float") === "none") {
29715          // Restore the original display value at the end of pure show/hide animations
29716          if (!propTween) {
29717            anim.done(function () {
29718              style.display = restoreDisplay;
29719            });
29720
29721            if (restoreDisplay == null) {
29722              display = style.display;
29723              restoreDisplay = display === "none" ? "" : display;
29724            }
29725          }
29726
29727          style.display = "inline-block";
29728        }
29729      }
29730    }
29731
29732    if (opts.overflow) {
29733      style.overflow = "hidden";
29734      anim.always(function () {
29735        style.overflow = opts.overflow[0];
29736        style.overflowX = opts.overflow[1];
29737        style.overflowY = opts.overflow[2];
29738      });
29739    } // Implement show/hide animations
29740
29741
29742    propTween = false;
29743
29744    for (prop in orig) {
29745      // General show/hide setup for this element animation
29746      if (!propTween) {
29747        if (dataShow) {
29748          if ("hidden" in dataShow) {
29749            hidden = dataShow.hidden;
29750          }
29751        } else {
29752          dataShow = dataPriv.access(elem, "fxshow", {
29753            display: restoreDisplay
29754          });
29755        } // Store hidden/visible for toggle so `.stop().toggle()` "reverses"
29756
29757
29758        if (toggle) {
29759          dataShow.hidden = !hidden;
29760        } // Show elements before animating them
29761
29762
29763        if (hidden) {
29764          showHide([elem], true);
29765        }
29766        /* eslint-disable no-loop-func */
29767
29768
29769        anim.done(function () {
29770          /* eslint-enable no-loop-func */
29771          // The final step of a "hide" animation is actually hiding the element
29772          if (!hidden) {
29773            showHide([elem]);
29774          }
29775
29776          dataPriv.remove(elem, "fxshow");
29777
29778          for (prop in orig) {
29779            jQuery.style(elem, prop, orig[prop]);
29780          }
29781        });
29782      } // Per-property setup
29783
29784
29785      propTween = createTween(hidden ? dataShow[prop] : 0, prop, anim);
29786
29787      if (!(prop in dataShow)) {
29788        dataShow[prop] = propTween.start;
29789
29790        if (hidden) {
29791          propTween.end = propTween.start;
29792          propTween.start = 0;
29793        }
29794      }
29795    }
29796  }
29797
29798  function propFilter(props, specialEasing) {
29799    var index, name, easing, value, hooks; // camelCase, specialEasing and expand cssHook pass
29800
29801    for (index in props) {
29802      name = camelCase(index);
29803      easing = specialEasing[name];
29804      value = props[index];
29805
29806      if (Array.isArray(value)) {
29807        easing = value[1];
29808        value = props[index] = value[0];
29809      }
29810
29811      if (index !== name) {
29812        props[name] = value;
29813        delete props[index];
29814      }
29815
29816      hooks = jQuery.cssHooks[name];
29817
29818      if (hooks && "expand" in hooks) {
29819        value = hooks.expand(value);
29820        delete props[name]; // Not quite $.extend, this won't overwrite existing keys.
29821        // Reusing 'index' because we have the correct "name"
29822
29823        for (index in value) {
29824          if (!(index in props)) {
29825            props[index] = value[index];
29826            specialEasing[index] = easing;
29827          }
29828        }
29829      } else {
29830        specialEasing[name] = easing;
29831      }
29832    }
29833  }
29834
29835  function Animation(elem, properties, options) {
29836    var result,
29837        stopped,
29838        index = 0,
29839        length = Animation.prefilters.length,
29840        deferred = jQuery.Deferred().always(function () {
29841      // Don't match elem in the :animated selector
29842      delete tick.elem;
29843    }),
29844        tick = function tick() {
29845      if (stopped) {
29846        return false;
29847      }
29848
29849      var currentTime = fxNow || createFxNow(),
29850          remaining = Math.max(0, animation.startTime + animation.duration - currentTime),
29851          // Support: Android 2.3 only
29852      // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
29853      temp = remaining / animation.duration || 0,
29854          percent = 1 - temp,
29855          index = 0,
29856          length = animation.tweens.length;
29857
29858      for (; index < length; index++) {
29859        animation.tweens[index].run(percent);
29860      }
29861
29862      deferred.notifyWith(elem, [animation, percent, remaining]); // If there's more to do, yield
29863
29864      if (percent < 1 && length) {
29865        return remaining;
29866      } // If this was an empty animation, synthesize a final progress notification
29867
29868
29869      if (!length) {
29870        deferred.notifyWith(elem, [animation, 1, 0]);
29871      } // Resolve the animation and report its conclusion
29872
29873
29874      deferred.resolveWith(elem, [animation]);
29875      return false;
29876    },
29877        animation = deferred.promise({
29878      elem: elem,
29879      props: jQuery.extend({}, properties),
29880      opts: jQuery.extend(true, {
29881        specialEasing: {},
29882        easing: jQuery.easing._default
29883      }, options),
29884      originalProperties: properties,
29885      originalOptions: options,
29886      startTime: fxNow || createFxNow(),
29887      duration: options.duration,
29888      tweens: [],
29889      createTween: function createTween(prop, end) {
29890        var tween = jQuery.Tween(elem, animation.opts, prop, end, animation.opts.specialEasing[prop] || animation.opts.easing);
29891        animation.tweens.push(tween);
29892        return tween;
29893      },
29894      stop: function stop(gotoEnd) {
29895        var index = 0,
29896            // If we are going to the end, we want to run all the tweens
29897        // otherwise we skip this part
29898        length = gotoEnd ? animation.tweens.length : 0;
29899
29900        if (stopped) {
29901          return this;
29902        }
29903
29904        stopped = true;
29905
29906        for (; index < length; index++) {
29907          animation.tweens[index].run(1);
29908        } // Resolve when we played the last frame; otherwise, reject
29909
29910
29911        if (gotoEnd) {
29912          deferred.notifyWith(elem, [animation, 1, 0]);
29913          deferred.resolveWith(elem, [animation, gotoEnd]);
29914        } else {
29915          deferred.rejectWith(elem, [animation, gotoEnd]);
29916        }
29917
29918        return this;
29919      }
29920    }),
29921        props = animation.props;
29922
29923    propFilter(props, animation.opts.specialEasing);
29924
29925    for (; index < length; index++) {
29926      result = Animation.prefilters[index].call(animation, elem, props, animation.opts);
29927
29928      if (result) {
29929        if (isFunction(result.stop)) {
29930          jQuery._queueHooks(animation.elem, animation.opts.queue).stop = result.stop.bind(result);
29931        }
29932
29933        return result;
29934      }
29935    }
29936
29937    jQuery.map(props, createTween, animation);
29938
29939    if (isFunction(animation.opts.start)) {
29940      animation.opts.start.call(elem, animation);
29941    } // Attach callbacks from options
29942
29943
29944    animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always);
29945    jQuery.fx.timer(jQuery.extend(tick, {
29946      elem: elem,
29947      anim: animation,
29948      queue: animation.opts.queue
29949    }));
29950    return animation;
29951  }
29952
29953  jQuery.Animation = jQuery.extend(Animation, {
29954    tweeners: {
29955      "*": [function (prop, value) {
29956        var tween = this.createTween(prop, value);
29957        adjustCSS(tween.elem, prop, rcssNum.exec(value), tween);
29958        return tween;
29959      }]
29960    },
29961    tweener: function tweener(props, callback) {
29962      if (isFunction(props)) {
29963        callback = props;
29964        props = ["*"];
29965      } else {
29966        props = props.match(rnothtmlwhite);
29967      }
29968
29969      var prop,
29970          index = 0,
29971          length = props.length;
29972
29973      for (; index < length; index++) {
29974        prop = props[index];
29975        Animation.tweeners[prop] = Animation.tweeners[prop] || [];
29976        Animation.tweeners[prop].unshift(callback);
29977      }
29978    },
29979    prefilters: [defaultPrefilter],
29980    prefilter: function prefilter(callback, prepend) {
29981      if (prepend) {
29982        Animation.prefilters.unshift(callback);
29983      } else {
29984        Animation.prefilters.push(callback);
29985      }
29986    }
29987  });
29988
29989  jQuery.speed = function (speed, easing, fn) {
29990    var opt = speed && _typeof(speed) === "object" ? jQuery.extend({}, speed) : {
29991      complete: fn || !fn && easing || isFunction(speed) && speed,
29992      duration: speed,
29993      easing: fn && easing || easing && !isFunction(easing) && easing
29994    }; // Go to the end state if fx are off
29995
29996    if (jQuery.fx.off) {
29997      opt.duration = 0;
29998    } else {
29999      if (typeof opt.duration !== "number") {
30000        if (opt.duration in jQuery.fx.speeds) {
30001          opt.duration = jQuery.fx.speeds[opt.duration];
30002        } else {
30003          opt.duration = jQuery.fx.speeds._default;
30004        }
30005      }
30006    } // Normalize opt.queue - true/undefined/null -> "fx"
30007
30008
30009    if (opt.queue == null || opt.queue === true) {
30010      opt.queue = "fx";
30011    } // Queueing
30012
30013
30014    opt.old = opt.complete;
30015
30016    opt.complete = function () {
30017      if (isFunction(opt.old)) {
30018        opt.old.call(this);
30019      }
30020
30021      if (opt.queue) {
30022        jQuery.dequeue(this, opt.queue);
30023      }
30024    };
30025
30026    return opt;
30027  };
30028
30029  jQuery.fn.extend({
30030    fadeTo: function fadeTo(speed, to, easing, callback) {
30031      // Show any hidden elements after setting opacity to 0
30032      return this.filter(isHiddenWithinTree).css("opacity", 0).show() // Animate to the value specified
30033      .end().animate({
30034        opacity: to
30035      }, speed, easing, callback);
30036    },
30037    animate: function animate(prop, speed, easing, callback) {
30038      var empty = jQuery.isEmptyObject(prop),
30039          optall = jQuery.speed(speed, easing, callback),
30040          doAnimation = function doAnimation() {
30041        // Operate on a copy of prop so per-property easing won't be lost
30042        var anim = Animation(this, jQuery.extend({}, prop), optall); // Empty animations, or finishing resolves immediately
30043
30044        if (empty || dataPriv.get(this, "finish")) {
30045          anim.stop(true);
30046        }
30047      };
30048
30049      doAnimation.finish = doAnimation;
30050      return empty || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation);
30051    },
30052    stop: function stop(type, clearQueue, gotoEnd) {
30053      var stopQueue = function stopQueue(hooks) {
30054        var stop = hooks.stop;
30055        delete hooks.stop;
30056        stop(gotoEnd);
30057      };
30058
30059      if (typeof type !== "string") {
30060        gotoEnd = clearQueue;
30061        clearQueue = type;
30062        type = undefined;
30063      }
30064
30065      if (clearQueue && type !== false) {
30066        this.queue(type || "fx", []);
30067      }
30068
30069      return this.each(function () {
30070        var dequeue = true,
30071            index = type != null && type + "queueHooks",
30072            timers = jQuery.timers,
30073            data = dataPriv.get(this);
30074
30075        if (index) {
30076          if (data[index] && data[index].stop) {
30077            stopQueue(data[index]);
30078          }
30079        } else {
30080          for (index in data) {
30081            if (data[index] && data[index].stop && rrun.test(index)) {
30082              stopQueue(data[index]);
30083            }
30084          }
30085        }
30086
30087        for (index = timers.length; index--;) {
30088          if (timers[index].elem === this && (type == null || timers[index].queue === type)) {
30089            timers[index].anim.stop(gotoEnd);
30090            dequeue = false;
30091            timers.splice(index, 1);
30092          }
30093        } // Start the next in the queue if the last step wasn't forced.
30094        // Timers currently will call their complete callbacks, which
30095        // will dequeue but only if they were gotoEnd.
30096
30097
30098        if (dequeue || !gotoEnd) {
30099          jQuery.dequeue(this, type);
30100        }
30101      });
30102    },
30103    finish: function finish(type) {
30104      if (type !== false) {
30105        type = type || "fx";
30106      }
30107
30108      return this.each(function () {
30109        var index,
30110            data = dataPriv.get(this),
30111            queue = data[type + "queue"],
30112            hooks = data[type + "queueHooks"],
30113            timers = jQuery.timers,
30114            length = queue ? queue.length : 0; // Enable finishing flag on private data
30115
30116        data.finish = true; // Empty the queue first
30117
30118        jQuery.queue(this, type, []);
30119
30120        if (hooks && hooks.stop) {
30121          hooks.stop.call(this, true);
30122        } // Look for any active animations, and finish them
30123
30124
30125        for (index = timers.length; index--;) {
30126          if (timers[index].elem === this && timers[index].queue === type) {
30127            timers[index].anim.stop(true);
30128            timers.splice(index, 1);
30129          }
30130        } // Look for any animations in the old queue and finish them
30131
30132
30133        for (index = 0; index < length; index++) {
30134          if (queue[index] && queue[index].finish) {
30135            queue[index].finish.call(this);
30136          }
30137        } // Turn off finishing flag
30138
30139
30140        delete data.finish;
30141      });
30142    }
30143  });
30144  jQuery.each(["toggle", "show", "hide"], function (i, name) {
30145    var cssFn = jQuery.fn[name];
30146
30147    jQuery.fn[name] = function (speed, easing, callback) {
30148      return speed == null || typeof speed === "boolean" ? cssFn.apply(this, arguments) : this.animate(genFx(name, true), speed, easing, callback);
30149    };
30150  }); // Generate shortcuts for custom animations
30151
30152  jQuery.each({
30153    slideDown: genFx("show"),
30154    slideUp: genFx("hide"),
30155    slideToggle: genFx("toggle"),
30156    fadeIn: {
30157      opacity: "show"
30158    },
30159    fadeOut: {
30160      opacity: "hide"
30161    },
30162    fadeToggle: {
30163      opacity: "toggle"
30164    }
30165  }, function (name, props) {
30166    jQuery.fn[name] = function (speed, easing, callback) {
30167      return this.animate(props, speed, easing, callback);
30168    };
30169  });
30170  jQuery.timers = [];
30171
30172  jQuery.fx.tick = function () {
30173    var timer,
30174        i = 0,
30175        timers = jQuery.timers;
30176    fxNow = Date.now();
30177
30178    for (; i < timers.length; i++) {
30179      timer = timers[i]; // Run the timer and safely remove it when done (allowing for external removal)
30180
30181      if (!timer() && timers[i] === timer) {
30182        timers.splice(i--, 1);
30183      }
30184    }
30185
30186    if (!timers.length) {
30187      jQuery.fx.stop();
30188    }
30189
30190    fxNow = undefined;
30191  };
30192
30193  jQuery.fx.timer = function (timer) {
30194    jQuery.timers.push(timer);
30195    jQuery.fx.start();
30196  };
30197
30198  jQuery.fx.interval = 13;
30199
30200  jQuery.fx.start = function () {
30201    if (inProgress) {
30202      return;
30203    }
30204
30205    inProgress = true;
30206    schedule();
30207  };
30208
30209  jQuery.fx.stop = function () {
30210    inProgress = null;
30211  };
30212
30213  jQuery.fx.speeds = {
30214    slow: 600,
30215    fast: 200,
30216    // Default speed
30217    _default: 400
30218  }; // Based off of the plugin by Clint Helfers, with permission.
30219  // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
30220
30221  jQuery.fn.delay = function (time, type) {
30222    time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
30223    type = type || "fx";
30224    return this.queue(type, function (next, hooks) {
30225      var timeout = window.setTimeout(next, time);
30226
30227      hooks.stop = function () {
30228        window.clearTimeout(timeout);
30229      };
30230    });
30231  };
30232
30233  (function () {
30234    var input = document.createElement("input"),
30235        select = document.createElement("select"),
30236        opt = select.appendChild(document.createElement("option"));
30237    input.type = "checkbox"; // Support: Android <=4.3 only
30238    // Default value for a checkbox should be "on"
30239
30240    support.checkOn = input.value !== ""; // Support: IE <=11 only
30241    // Must access selectedIndex to make default options select
30242
30243    support.optSelected = opt.selected; // Support: IE <=11 only
30244    // An input loses its value after becoming a radio
30245
30246    input = document.createElement("input");
30247    input.value = "t";
30248    input.type = "radio";
30249    support.radioValue = input.value === "t";
30250  })();
30251
30252  var boolHook,
30253      attrHandle = jQuery.expr.attrHandle;
30254  jQuery.fn.extend({
30255    attr: function attr(name, value) {
30256      return access(this, jQuery.attr, name, value, arguments.length > 1);
30257    },
30258    removeAttr: function removeAttr(name) {
30259      return this.each(function () {
30260        jQuery.removeAttr(this, name);
30261      });
30262    }
30263  });
30264  jQuery.extend({
30265    attr: function attr(elem, name, value) {
30266      var ret,
30267          hooks,
30268          nType = elem.nodeType; // Don't get/set attributes on text, comment and attribute nodes
30269
30270      if (nType === 3 || nType === 8 || nType === 2) {
30271        return;
30272      } // Fallback to prop when attributes are not supported
30273
30274
30275      if (typeof elem.getAttribute === "undefined") {
30276        return jQuery.prop(elem, name, value);
30277      } // Attribute hooks are determined by the lowercase version
30278      // Grab necessary hook if one is defined
30279
30280
30281      if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
30282        hooks = jQuery.attrHooks[name.toLowerCase()] || (jQuery.expr.match.bool.test(name) ? boolHook : undefined);
30283      }
30284
30285      if (value !== undefined) {
30286        if (value === null) {
30287          jQuery.removeAttr(elem, name);
30288          return;
30289        }
30290
30291        if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {
30292          return ret;
30293        }
30294
30295        elem.setAttribute(name, value + "");
30296        return value;
30297      }
30298
30299      if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
30300        return ret;
30301      }
30302
30303      ret = jQuery.find.attr(elem, name); // Non-existent attributes return null, we normalize to undefined
30304
30305      return ret == null ? undefined : ret;
30306    },
30307    attrHooks: {
30308      type: {
30309        set: function set(elem, value) {
30310          if (!support.radioValue && value === "radio" && nodeName(elem, "input")) {
30311            var val = elem.value;
30312            elem.setAttribute("type", value);
30313
30314            if (val) {
30315              elem.value = val;
30316            }
30317
30318            return value;
30319          }
30320        }
30321      }
30322    },
30323    removeAttr: function removeAttr(elem, value) {
30324      var name,
30325          i = 0,
30326          // Attribute names can contain non-HTML whitespace characters
30327      // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
30328      attrNames = value && value.match(rnothtmlwhite);
30329
30330      if (attrNames && elem.nodeType === 1) {
30331        while (name = attrNames[i++]) {
30332          elem.removeAttribute(name);
30333        }
30334      }
30335    }
30336  }); // Hooks for boolean attributes
30337
30338  boolHook = {
30339    set: function set(elem, value, name) {
30340      if (value === false) {
30341        // Remove boolean attributes when set to false
30342        jQuery.removeAttr(elem, name);
30343      } else {
30344        elem.setAttribute(name, name);
30345      }
30346
30347      return name;
30348    }
30349  };
30350  jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function (i, name) {
30351    var getter = attrHandle[name] || jQuery.find.attr;
30352
30353    attrHandle[name] = function (elem, name, isXML) {
30354      var ret,
30355          handle,
30356          lowercaseName = name.toLowerCase();
30357
30358      if (!isXML) {
30359        // Avoid an infinite loop by temporarily removing this function from the getter
30360        handle = attrHandle[lowercaseName];
30361        attrHandle[lowercaseName] = ret;
30362        ret = getter(elem, name, isXML) != null ? lowercaseName : null;
30363        attrHandle[lowercaseName] = handle;
30364      }
30365
30366      return ret;
30367    };
30368  });
30369  var rfocusable = /^(?:input|select|textarea|button)$/i,
30370      rclickable = /^(?:a|area)$/i;
30371  jQuery.fn.extend({
30372    prop: function prop(name, value) {
30373      return access(this, jQuery.prop, name, value, arguments.length > 1);
30374    },
30375    removeProp: function removeProp(name) {
30376      return this.each(function () {
30377        delete this[jQuery.propFix[name] || name];
30378      });
30379    }
30380  });
30381  jQuery.extend({
30382    prop: function prop(elem, name, value) {
30383      var ret,
30384          hooks,
30385          nType = elem.nodeType; // Don't get/set properties on text, comment and attribute nodes
30386
30387      if (nType === 3 || nType === 8 || nType === 2) {
30388        return;
30389      }
30390
30391      if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
30392        // Fix name and attach hooks
30393        name = jQuery.propFix[name] || name;
30394        hooks = jQuery.propHooks[name];
30395      }
30396
30397      if (value !== undefined) {
30398        if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {
30399          return ret;
30400        }
30401
30402        return elem[name] = value;
30403      }
30404
30405      if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
30406        return ret;
30407      }
30408
30409      return elem[name];
30410    },
30411    propHooks: {
30412      tabIndex: {
30413        get: function get(elem) {
30414          // Support: IE <=9 - 11 only
30415          // elem.tabIndex doesn't always return the
30416          // correct value when it hasn't been explicitly set
30417          // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
30418          // Use proper attribute retrieval(#12072)
30419          var tabindex = jQuery.find.attr(elem, "tabindex");
30420
30421          if (tabindex) {
30422            return parseInt(tabindex, 10);
30423          }
30424
30425          if (rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href) {
30426            return 0;
30427          }
30428
30429          return -1;
30430        }
30431      }
30432    },
30433    propFix: {
30434      "for": "htmlFor",
30435      "class": "className"
30436    }
30437  }); // Support: IE <=11 only
30438  // Accessing the selectedIndex property
30439  // forces the browser to respect setting selected
30440  // on the option
30441  // The getter ensures a default option is selected
30442  // when in an optgroup
30443  // eslint rule "no-unused-expressions" is disabled for this code
30444  // since it considers such accessions noop
30445
30446  if (!support.optSelected) {
30447    jQuery.propHooks.selected = {
30448      get: function get(elem) {
30449        /* eslint no-unused-expressions: "off" */
30450        var parent = elem.parentNode;
30451
30452        if (parent && parent.parentNode) {
30453          parent.parentNode.selectedIndex;
30454        }
30455
30456        return null;
30457      },
30458      set: function set(elem) {
30459        /* eslint no-unused-expressions: "off" */
30460        var parent = elem.parentNode;
30461
30462        if (parent) {
30463          parent.selectedIndex;
30464
30465          if (parent.parentNode) {
30466            parent.parentNode.selectedIndex;
30467          }
30468        }
30469      }
30470    };
30471  }
30472
30473  jQuery.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function () {
30474    jQuery.propFix[this.toLowerCase()] = this;
30475  }); // Strip and collapse whitespace according to HTML spec
30476  // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
30477
30478  function stripAndCollapse(value) {
30479    var tokens = value.match(rnothtmlwhite) || [];
30480    return tokens.join(" ");
30481  }
30482
30483  function getClass(elem) {
30484    return elem.getAttribute && elem.getAttribute("class") || "";
30485  }
30486
30487  function classesToArray(value) {
30488    if (Array.isArray(value)) {
30489      return value;
30490    }
30491
30492    if (typeof value === "string") {
30493      return value.match(rnothtmlwhite) || [];
30494    }
30495
30496    return [];
30497  }
30498
30499  jQuery.fn.extend({
30500    addClass: function addClass(value) {
30501      var classes,
30502          elem,
30503          cur,
30504          curValue,
30505          clazz,
30506          j,
30507          finalValue,
30508          i = 0;
30509
30510      if (isFunction(value)) {
30511        return this.each(function (j) {
30512          jQuery(this).addClass(value.call(this, j, getClass(this)));
30513        });
30514      }
30515
30516      classes = classesToArray(value);
30517
30518      if (classes.length) {
30519        while (elem = this[i++]) {
30520          curValue = getClass(elem);
30521          cur = elem.nodeType === 1 && " " + stripAndCollapse(curValue) + " ";
30522
30523          if (cur) {
30524            j = 0;
30525
30526            while (clazz = classes[j++]) {
30527              if (cur.indexOf(" " + clazz + " ") < 0) {
30528                cur += clazz + " ";
30529              }
30530            } // Only assign if different to avoid unneeded rendering.
30531
30532
30533            finalValue = stripAndCollapse(cur);
30534
30535            if (curValue !== finalValue) {
30536              elem.setAttribute("class", finalValue);
30537            }
30538          }
30539        }
30540      }
30541
30542      return this;
30543    },
30544    removeClass: function removeClass(value) {
30545      var classes,
30546          elem,
30547          cur,
30548          curValue,
30549          clazz,
30550          j,
30551          finalValue,
30552          i = 0;
30553
30554      if (isFunction(value)) {
30555        return this.each(function (j) {
30556          jQuery(this).removeClass(value.call(this, j, getClass(this)));
30557        });
30558      }
30559
30560      if (!arguments.length) {
30561        return this.attr("class", "");
30562      }
30563
30564      classes = classesToArray(value);
30565
30566      if (classes.length) {
30567        while (elem = this[i++]) {
30568          curValue = getClass(elem); // This expression is here for better compressibility (see addClass)
30569
30570          cur = elem.nodeType === 1 && " " + stripAndCollapse(curValue) + " ";
30571
30572          if (cur) {
30573            j = 0;
30574
30575            while (clazz = classes[j++]) {
30576              // Remove *all* instances
30577              while (cur.indexOf(" " + clazz + " ") > -1) {
30578                cur = cur.replace(" " + clazz + " ", " ");
30579              }
30580            } // Only assign if different to avoid unneeded rendering.
30581
30582
30583            finalValue = stripAndCollapse(cur);
30584
30585            if (curValue !== finalValue) {
30586              elem.setAttribute("class", finalValue);
30587            }
30588          }
30589        }
30590      }
30591
30592      return this;
30593    },
30594    toggleClass: function toggleClass(value, stateVal) {
30595      var type = _typeof(value),
30596          isValidValue = type === "string" || Array.isArray(value);
30597
30598      if (typeof stateVal === "boolean" && isValidValue) {
30599        return stateVal ? this.addClass(value) : this.removeClass(value);
30600      }
30601
30602      if (isFunction(value)) {
30603        return this.each(function (i) {
30604          jQuery(this).toggleClass(value.call(this, i, getClass(this), stateVal), stateVal);
30605        });
30606      }
30607
30608      return this.each(function () {
30609        var className, i, self, classNames;
30610
30611        if (isValidValue) {
30612          // Toggle individual class names
30613          i = 0;
30614          self = jQuery(this);
30615          classNames = classesToArray(value);
30616
30617          while (className = classNames[i++]) {
30618            // Check each className given, space separated list
30619            if (self.hasClass(className)) {
30620              self.removeClass(className);
30621            } else {
30622              self.addClass(className);
30623            }
30624          } // Toggle whole class name
30625
30626        } else if (value === undefined || type === "boolean") {
30627          className = getClass(this);
30628
30629          if (className) {
30630            // Store className if set
30631            dataPriv.set(this, "__className__", className);
30632          } // If the element has a class name or if we're passed `false`,
30633          // then remove the whole classname (if there was one, the above saved it).
30634          // Otherwise bring back whatever was previously saved (if anything),
30635          // falling back to the empty string if nothing was stored.
30636
30637
30638          if (this.setAttribute) {
30639            this.setAttribute("class", className || value === false ? "" : dataPriv.get(this, "__className__") || "");
30640          }
30641        }
30642      });
30643    },
30644    hasClass: function hasClass(selector) {
30645      var className,
30646          elem,
30647          i = 0;
30648      className = " " + selector + " ";
30649
30650      while (elem = this[i++]) {
30651        if (elem.nodeType === 1 && (" " + stripAndCollapse(getClass(elem)) + " ").indexOf(className) > -1) {
30652          return true;
30653        }
30654      }
30655
30656      return false;
30657    }
30658  });
30659  var rreturn = /\r/g;
30660  jQuery.fn.extend({
30661    val: function val(value) {
30662      var hooks,
30663          ret,
30664          valueIsFunction,
30665          elem = this[0];
30666
30667      if (!arguments.length) {
30668        if (elem) {
30669          hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()];
30670
30671          if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== undefined) {
30672            return ret;
30673          }
30674
30675          ret = elem.value; // Handle most common string cases
30676
30677          if (typeof ret === "string") {
30678            return ret.replace(rreturn, "");
30679          } // Handle cases where value is null/undef or number
30680
30681
30682          return ret == null ? "" : ret;
30683        }
30684
30685        return;
30686      }
30687
30688      valueIsFunction = isFunction(value);
30689      return this.each(function (i) {
30690        var val;
30691
30692        if (this.nodeType !== 1) {
30693          return;
30694        }
30695
30696        if (valueIsFunction) {
30697          val = value.call(this, i, jQuery(this).val());
30698        } else {
30699          val = value;
30700        } // Treat null/undefined as ""; convert numbers to string
30701
30702
30703        if (val == null) {
30704          val = "";
30705        } else if (typeof val === "number") {
30706          val += "";
30707        } else if (Array.isArray(val)) {
30708          val = jQuery.map(val, function (value) {
30709            return value == null ? "" : value + "";
30710          });
30711        }
30712
30713        hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()]; // If set returns undefined, fall back to normal setting
30714
30715        if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) {
30716          this.value = val;
30717        }
30718      });
30719    }
30720  });
30721  jQuery.extend({
30722    valHooks: {
30723      option: {
30724        get: function get(elem) {
30725          var val = jQuery.find.attr(elem, "value");
30726          return val != null ? val : // Support: IE <=10 - 11 only
30727          // option.text throws exceptions (#14686, #14858)
30728          // Strip and collapse whitespace
30729          // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
30730          stripAndCollapse(jQuery.text(elem));
30731        }
30732      },
30733      select: {
30734        get: function get(elem) {
30735          var value,
30736              option,
30737              i,
30738              options = elem.options,
30739              index = elem.selectedIndex,
30740              one = elem.type === "select-one",
30741              values = one ? null : [],
30742              max = one ? index + 1 : options.length;
30743
30744          if (index < 0) {
30745            i = max;
30746          } else {
30747            i = one ? index : 0;
30748          } // Loop through all the selected options
30749
30750
30751          for (; i < max; i++) {
30752            option = options[i]; // Support: IE <=9 only
30753            // IE8-9 doesn't update selected after form reset (#2551)
30754
30755            if ((option.selected || i === index) && // Don't return options that are disabled or in a disabled optgroup
30756            !option.disabled && (!option.parentNode.disabled || !nodeName(option.parentNode, "optgroup"))) {
30757              // Get the specific value for the option
30758              value = jQuery(option).val(); // We don't need an array for one selects
30759
30760              if (one) {
30761                return value;
30762              } // Multi-Selects return an array
30763
30764
30765              values.push(value);
30766            }
30767          }
30768
30769          return values;
30770        },
30771        set: function set(elem, value) {
30772          var optionSet,
30773              option,
30774              options = elem.options,
30775              values = jQuery.makeArray(value),
30776              i = options.length;
30777
30778          while (i--) {
30779            option = options[i];
30780            /* eslint-disable no-cond-assign */
30781
30782            if (option.selected = jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1) {
30783              optionSet = true;
30784            }
30785            /* eslint-enable no-cond-assign */
30786
30787          } // Force browsers to behave consistently when non-matching value is set
30788
30789
30790          if (!optionSet) {
30791            elem.selectedIndex = -1;
30792          }
30793
30794          return values;
30795        }
30796      }
30797    }
30798  }); // Radios and checkboxes getter/setter
30799
30800  jQuery.each(["radio", "checkbox"], function () {
30801    jQuery.valHooks[this] = {
30802      set: function set(elem, value) {
30803        if (Array.isArray(value)) {
30804          return elem.checked = jQuery.inArray(jQuery(elem).val(), value) > -1;
30805        }
30806      }
30807    };
30808
30809    if (!support.checkOn) {
30810      jQuery.valHooks[this].get = function (elem) {
30811        return elem.getAttribute("value") === null ? "on" : elem.value;
30812      };
30813    }
30814  }); // Return jQuery for attributes-only inclusion
30815
30816  support.focusin = "onfocusin" in window;
30817
30818  var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
30819      stopPropagationCallback = function stopPropagationCallback(e) {
30820    e.stopPropagation();
30821  };
30822
30823  jQuery.extend(jQuery.event, {
30824    trigger: function trigger(event, data, elem, onlyHandlers) {
30825      var i,
30826          cur,
30827          tmp,
30828          bubbleType,
30829          ontype,
30830          handle,
30831          special,
30832          lastElement,
30833          eventPath = [elem || document],
30834          type = hasOwn.call(event, "type") ? event.type : event,
30835          namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : [];
30836      cur = lastElement = tmp = elem = elem || document; // Don't do events on text and comment nodes
30837
30838      if (elem.nodeType === 3 || elem.nodeType === 8) {
30839        return;
30840      } // focus/blur morphs to focusin/out; ensure we're not firing them right now
30841
30842
30843      if (rfocusMorph.test(type + jQuery.event.triggered)) {
30844        return;
30845      }
30846
30847      if (type.indexOf(".") > -1) {
30848        // Namespaced trigger; create a regexp to match event type in handle()
30849        namespaces = type.split(".");
30850        type = namespaces.shift();
30851        namespaces.sort();
30852      }
30853
30854      ontype = type.indexOf(":") < 0 && "on" + type; // Caller can pass in a jQuery.Event object, Object, or just an event type string
30855
30856      event = event[jQuery.expando] ? event : new jQuery.Event(type, _typeof(event) === "object" && event); // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
30857
30858      event.isTrigger = onlyHandlers ? 2 : 3;
30859      event.namespace = namespaces.join(".");
30860      event.rnamespace = event.namespace ? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null; // Clean up the event in case it is being reused
30861
30862      event.result = undefined;
30863
30864      if (!event.target) {
30865        event.target = elem;
30866      } // Clone any incoming data and prepend the event, creating the handler arg list
30867
30868
30869      data = data == null ? [event] : jQuery.makeArray(data, [event]); // Allow special events to draw outside the lines
30870
30871      special = jQuery.event.special[type] || {};
30872
30873      if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) {
30874        return;
30875      } // Determine event propagation path in advance, per W3C events spec (#9951)
30876      // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
30877
30878
30879      if (!onlyHandlers && !special.noBubble && !isWindow(elem)) {
30880        bubbleType = special.delegateType || type;
30881
30882        if (!rfocusMorph.test(bubbleType + type)) {
30883          cur = cur.parentNode;
30884        }
30885
30886        for (; cur; cur = cur.parentNode) {
30887          eventPath.push(cur);
30888          tmp = cur;
30889        } // Only add window if we got to document (e.g., not plain obj or detached DOM)
30890
30891
30892        if (tmp === (elem.ownerDocument || document)) {
30893          eventPath.push(tmp.defaultView || tmp.parentWindow || window);
30894        }
30895      } // Fire handlers on the event path
30896
30897
30898      i = 0;
30899
30900      while ((cur = eventPath[i++]) && !event.isPropagationStopped()) {
30901        lastElement = cur;
30902        event.type = i > 1 ? bubbleType : special.bindType || type; // jQuery handler
30903
30904        handle = (dataPriv.get(cur, "events") || {})[event.type] && dataPriv.get(cur, "handle");
30905
30906        if (handle) {
30907          handle.apply(cur, data);
30908        } // Native handler
30909
30910
30911        handle = ontype && cur[ontype];
30912
30913        if (handle && handle.apply && acceptData(cur)) {
30914          event.result = handle.apply(cur, data);
30915
30916          if (event.result === false) {
30917            event.preventDefault();
30918          }
30919        }
30920      }
30921
30922      event.type = type; // If nobody prevented the default action, do it now
30923
30924      if (!onlyHandlers && !event.isDefaultPrevented()) {
30925        if ((!special._default || special._default.apply(eventPath.pop(), data) === false) && acceptData(elem)) {
30926          // Call a native DOM method on the target with the same name as the event.
30927          // Don't do default actions on window, that's where global variables be (#6170)
30928          if (ontype && isFunction(elem[type]) && !isWindow(elem)) {
30929            // Don't re-trigger an onFOO event when we call its FOO() method
30930            tmp = elem[ontype];
30931
30932            if (tmp) {
30933              elem[ontype] = null;
30934            } // Prevent re-triggering of the same event, since we already bubbled it above
30935
30936
30937            jQuery.event.triggered = type;
30938
30939            if (event.isPropagationStopped()) {
30940              lastElement.addEventListener(type, stopPropagationCallback);
30941            }
30942
30943            elem[type]();
30944
30945            if (event.isPropagationStopped()) {
30946              lastElement.removeEventListener(type, stopPropagationCallback);
30947            }
30948
30949            jQuery.event.triggered = undefined;
30950
30951            if (tmp) {
30952              elem[ontype] = tmp;
30953            }
30954          }
30955        }
30956      }
30957
30958      return event.result;
30959    },
30960    // Piggyback on a donor event to simulate a different one
30961    // Used only for `focus(in | out)` events
30962    simulate: function simulate(type, elem, event) {
30963      var e = jQuery.extend(new jQuery.Event(), event, {
30964        type: type,
30965        isSimulated: true
30966      });
30967      jQuery.event.trigger(e, null, elem);
30968    }
30969  });
30970  jQuery.fn.extend({
30971    trigger: function trigger(type, data) {
30972      return this.each(function () {
30973        jQuery.event.trigger(type, data, this);
30974      });
30975    },
30976    triggerHandler: function triggerHandler(type, data) {
30977      var elem = this[0];
30978
30979      if (elem) {
30980        return jQuery.event.trigger(type, data, elem, true);
30981      }
30982    }
30983  }); // Support: Firefox <=44
30984  // Firefox doesn't have focus(in | out) events
30985  // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
30986  //
30987  // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
30988  // focus(in | out) events fire after focus & blur events,
30989  // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
30990  // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
30991
30992  if (!support.focusin) {
30993    jQuery.each({
30994      focus: "focusin",
30995      blur: "focusout"
30996    }, function (orig, fix) {
30997      // Attach a single capturing handler on the document while someone wants focusin/focusout
30998      var handler = function handler(event) {
30999        jQuery.event.simulate(fix, event.target, jQuery.event.fix(event));
31000      };
31001
31002      jQuery.event.special[fix] = {
31003        setup: function setup() {
31004          var doc = this.ownerDocument || this,
31005              attaches = dataPriv.access(doc, fix);
31006
31007          if (!attaches) {
31008            doc.addEventListener(orig, handler, true);
31009          }
31010
31011          dataPriv.access(doc, fix, (attaches || 0) + 1);
31012        },
31013        teardown: function teardown() {
31014          var doc = this.ownerDocument || this,
31015              attaches = dataPriv.access(doc, fix) - 1;
31016
31017          if (!attaches) {
31018            doc.removeEventListener(orig, handler, true);
31019            dataPriv.remove(doc, fix);
31020          } else {
31021            dataPriv.access(doc, fix, attaches);
31022          }
31023        }
31024      };
31025    });
31026  }
31027
31028  var location = window.location;
31029  var nonce = Date.now();
31030  var rquery = /\?/; // Cross-browser xml parsing
31031
31032  jQuery.parseXML = function (data) {
31033    var xml;
31034
31035    if (!data || typeof data !== "string") {
31036      return null;
31037    } // Support: IE 9 - 11 only
31038    // IE throws on parseFromString with invalid input.
31039
31040
31041    try {
31042      xml = new window.DOMParser().parseFromString(data, "text/xml");
31043    } catch (e) {
31044      xml = undefined;
31045    }
31046
31047    if (!xml || xml.getElementsByTagName("parsererror").length) {
31048      jQuery.error("Invalid XML: " + data);
31049    }
31050
31051    return xml;
31052  };
31053
31054  var rbracket = /\[\]$/,
31055      rCRLF = /\r?\n/g,
31056      rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
31057      rsubmittable = /^(?:input|select|textarea|keygen)/i;
31058
31059  function buildParams(prefix, obj, traditional, add) {
31060    var name;
31061
31062    if (Array.isArray(obj)) {
31063      // Serialize array item.
31064      jQuery.each(obj, function (i, v) {
31065        if (traditional || rbracket.test(prefix)) {
31066          // Treat each array item as a scalar.
31067          add(prefix, v);
31068        } else {
31069          // Item is non-scalar (array or object), encode its numeric index.
31070          buildParams(prefix + "[" + (_typeof(v) === "object" && v != null ? i : "") + "]", v, traditional, add);
31071        }
31072      });
31073    } else if (!traditional && toType(obj) === "object") {
31074      // Serialize object item.
31075      for (name in obj) {
31076        buildParams(prefix + "[" + name + "]", obj[name], traditional, add);
31077      }
31078    } else {
31079      // Serialize scalar item.
31080      add(prefix, obj);
31081    }
31082  } // Serialize an array of form elements or a set of
31083  // key/values into a query string
31084
31085
31086  jQuery.param = function (a, traditional) {
31087    var prefix,
31088        s = [],
31089        add = function add(key, valueOrFunction) {
31090      // If value is a function, invoke it and use its return value
31091      var value = isFunction(valueOrFunction) ? valueOrFunction() : valueOrFunction;
31092      s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value == null ? "" : value);
31093    }; // If an array was passed in, assume that it is an array of form elements.
31094
31095
31096    if (Array.isArray(a) || a.jquery && !jQuery.isPlainObject(a)) {
31097      // Serialize the form elements
31098      jQuery.each(a, function () {
31099        add(this.name, this.value);
31100      });
31101    } else {
31102      // If traditional, encode the "old" way (the way 1.3.2 or older
31103      // did it), otherwise encode params recursively.
31104      for (prefix in a) {
31105        buildParams(prefix, a[prefix], traditional, add);
31106      }
31107    } // Return the resulting serialization
31108
31109
31110    return s.join("&");
31111  };
31112
31113  jQuery.fn.extend({
31114    serialize: function serialize() {
31115      return jQuery.param(this.serializeArray());
31116    },
31117    serializeArray: function serializeArray() {
31118      return this.map(function () {
31119        // Can add propHook for "elements" to filter or add form elements
31120        var elements = jQuery.prop(this, "elements");
31121        return elements ? jQuery.makeArray(elements) : this;
31122      }).filter(function () {
31123        var type = this.type; // Use .is( ":disabled" ) so that fieldset[disabled] works
31124
31125        return this.name && !jQuery(this).is(":disabled") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && (this.checked || !rcheckableType.test(type));
31126      }).map(function (i, elem) {
31127        var val = jQuery(this).val();
31128
31129        if (val == null) {
31130          return null;
31131        }
31132
31133        if (Array.isArray(val)) {
31134          return jQuery.map(val, function (val) {
31135            return {
31136              name: elem.name,
31137              value: val.replace(rCRLF, "\r\n")
31138            };
31139          });
31140        }
31141
31142        return {
31143          name: elem.name,
31144          value: val.replace(rCRLF, "\r\n")
31145        };
31146      }).get();
31147    }
31148  });
31149  var r20 = /%20/g,
31150      rhash = /#.*$/,
31151      rantiCache = /([?&])_=[^&]*/,
31152      rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
31153      // #7653, #8125, #8152: local protocol detection
31154  rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
31155      rnoContent = /^(?:GET|HEAD)$/,
31156      rprotocol = /^\/\//,
31157
31158  /* Prefilters
31159   * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
31160   * 2) These are called:
31161   *    - BEFORE asking for a transport
31162   *    - AFTER param serialization (s.data is a string if s.processData is true)
31163   * 3) key is the dataType
31164   * 4) the catchall symbol "*" can be used
31165   * 5) execution will start with transport dataType and THEN continue down to "*" if needed
31166   */
31167  prefilters = {},
31168
31169  /* Transports bindings
31170   * 1) key is the dataType
31171   * 2) the catchall symbol "*" can be used
31172   * 3) selection will start with transport dataType and THEN go to "*" if needed
31173   */
31174  transports = {},
31175      // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
31176  allTypes = "*/".concat("*"),
31177      // Anchor tag for parsing the document origin
31178  originAnchor = document.createElement("a");
31179  originAnchor.href = location.href; // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
31180
31181  function addToPrefiltersOrTransports(structure) {
31182    // dataTypeExpression is optional and defaults to "*"
31183    return function (dataTypeExpression, func) {
31184      if (typeof dataTypeExpression !== "string") {
31185        func = dataTypeExpression;
31186        dataTypeExpression = "*";
31187      }
31188
31189      var dataType,
31190          i = 0,
31191          dataTypes = dataTypeExpression.toLowerCase().match(rnothtmlwhite) || [];
31192
31193      if (isFunction(func)) {
31194        // For each dataType in the dataTypeExpression
31195        while (dataType = dataTypes[i++]) {
31196          // Prepend if requested
31197          if (dataType[0] === "+") {
31198            dataType = dataType.slice(1) || "*";
31199            (structure[dataType] = structure[dataType] || []).unshift(func); // Otherwise append
31200          } else {
31201            (structure[dataType] = structure[dataType] || []).push(func);
31202          }
31203        }
31204      }
31205    };
31206  } // Base inspection function for prefilters and transports
31207
31208
31209  function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) {
31210    var inspected = {},
31211        seekingTransport = structure === transports;
31212
31213    function inspect(dataType) {
31214      var selected;
31215      inspected[dataType] = true;
31216      jQuery.each(structure[dataType] || [], function (_, prefilterOrFactory) {
31217        var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR);
31218
31219        if (typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[dataTypeOrTransport]) {
31220          options.dataTypes.unshift(dataTypeOrTransport);
31221          inspect(dataTypeOrTransport);
31222          return false;
31223        } else if (seekingTransport) {
31224          return !(selected = dataTypeOrTransport);
31225        }
31226      });
31227      return selected;
31228    }
31229
31230    return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*");
31231  } // A special extend for ajax options
31232  // that takes "flat" options (not to be deep extended)
31233  // Fixes #9887
31234
31235
31236  function ajaxExtend(target, src) {
31237    var key,
31238        deep,
31239        flatOptions = jQuery.ajaxSettings.flatOptions || {};
31240
31241    for (key in src) {
31242      if (src[key] !== undefined) {
31243        (flatOptions[key] ? target : deep || (deep = {}))[key] = src[key];
31244      }
31245    }
31246
31247    if (deep) {
31248      jQuery.extend(true, target, deep);
31249    }
31250
31251    return target;
31252  }
31253  /* Handles responses to an ajax request:
31254   * - finds the right dataType (mediates between content-type and expected dataType)
31255   * - returns the corresponding response
31256   */
31257
31258
31259  function ajaxHandleResponses(s, jqXHR, responses) {
31260    var ct,
31261        type,
31262        finalDataType,
31263        firstDataType,
31264        contents = s.contents,
31265        dataTypes = s.dataTypes; // Remove auto dataType and get content-type in the process
31266
31267    while (dataTypes[0] === "*") {
31268      dataTypes.shift();
31269
31270      if (ct === undefined) {
31271        ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
31272      }
31273    } // Check if we're dealing with a known content-type
31274
31275
31276    if (ct) {
31277      for (type in contents) {
31278        if (contents[type] && contents[type].test(ct)) {
31279          dataTypes.unshift(type);
31280          break;
31281        }
31282      }
31283    } // Check to see if we have a response for the expected dataType
31284
31285
31286    if (dataTypes[0] in responses) {
31287      finalDataType = dataTypes[0];
31288    } else {
31289      // Try convertible dataTypes
31290      for (type in responses) {
31291        if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) {
31292          finalDataType = type;
31293          break;
31294        }
31295
31296        if (!firstDataType) {
31297          firstDataType = type;
31298        }
31299      } // Or just use first one
31300
31301
31302      finalDataType = finalDataType || firstDataType;
31303    } // If we found a dataType
31304    // We add the dataType to the list if needed
31305    // and return the corresponding response
31306
31307
31308    if (finalDataType) {
31309      if (finalDataType !== dataTypes[0]) {
31310        dataTypes.unshift(finalDataType);
31311      }
31312
31313      return responses[finalDataType];
31314    }
31315  }
31316  /* Chain conversions given the request and the original response
31317   * Also sets the responseXXX fields on the jqXHR instance
31318   */
31319
31320
31321  function ajaxConvert(s, response, jqXHR, isSuccess) {
31322    var conv2,
31323        current,
31324        conv,
31325        tmp,
31326        prev,
31327        converters = {},
31328        // Work with a copy of dataTypes in case we need to modify it for conversion
31329    dataTypes = s.dataTypes.slice(); // Create converters map with lowercased keys
31330
31331    if (dataTypes[1]) {
31332      for (conv in s.converters) {
31333        converters[conv.toLowerCase()] = s.converters[conv];
31334      }
31335    }
31336
31337    current = dataTypes.shift(); // Convert to each sequential dataType
31338
31339    while (current) {
31340      if (s.responseFields[current]) {
31341        jqXHR[s.responseFields[current]] = response;
31342      } // Apply the dataFilter if provided
31343
31344
31345      if (!prev && isSuccess && s.dataFilter) {
31346        response = s.dataFilter(response, s.dataType);
31347      }
31348
31349      prev = current;
31350      current = dataTypes.shift();
31351
31352      if (current) {
31353        // There's only work to do if current dataType is non-auto
31354        if (current === "*") {
31355          current = prev; // Convert response if prev dataType is non-auto and differs from current
31356        } else if (prev !== "*" && prev !== current) {
31357          // Seek a direct converter
31358          conv = converters[prev + " " + current] || converters["* " + current]; // If none found, seek a pair
31359
31360          if (!conv) {
31361            for (conv2 in converters) {
31362              // If conv2 outputs current
31363              tmp = conv2.split(" ");
31364
31365              if (tmp[1] === current) {
31366                // If prev can be converted to accepted input
31367                conv = converters[prev + " " + tmp[0]] || converters["* " + tmp[0]];
31368
31369                if (conv) {
31370                  // Condense equivalence converters
31371                  if (conv === true) {
31372                    conv = converters[conv2]; // Otherwise, insert the intermediate dataType
31373                  } else if (converters[conv2] !== true) {
31374                    current = tmp[0];
31375                    dataTypes.unshift(tmp[1]);
31376                  }
31377
31378                  break;
31379                }
31380              }
31381            }
31382          } // Apply converter (if not an equivalence)
31383
31384
31385          if (conv !== true) {
31386            // Unless errors are allowed to bubble, catch and return them
31387            if (conv && s.throws) {
31388              response = conv(response);
31389            } else {
31390              try {
31391                response = conv(response);
31392              } catch (e) {
31393                return {
31394                  state: "parsererror",
31395                  error: conv ? e : "No conversion from " + prev + " to " + current
31396                };
31397              }
31398            }
31399          }
31400        }
31401      }
31402    }
31403
31404    return {
31405      state: "success",
31406      data: response
31407    };
31408  }
31409
31410  jQuery.extend({
31411    // Counter for holding the number of active queries
31412    active: 0,
31413    // Last-Modified header cache for next request
31414    lastModified: {},
31415    etag: {},
31416    ajaxSettings: {
31417      url: location.href,
31418      type: "GET",
31419      isLocal: rlocalProtocol.test(location.protocol),
31420      global: true,
31421      processData: true,
31422      async: true,
31423      contentType: "application/x-www-form-urlencoded; charset=UTF-8",
31424
31425      /*
31426      timeout: 0,
31427      data: null,
31428      dataType: null,
31429      username: null,
31430      password: null,
31431      cache: null,
31432      throws: false,
31433      traditional: false,
31434      headers: {},
31435      */
31436      accepts: {
31437        "*": allTypes,
31438        text: "text/plain",
31439        html: "text/html",
31440        xml: "application/xml, text/xml",
31441        json: "application/json, text/javascript"
31442      },
31443      contents: {
31444        xml: /\bxml\b/,
31445        html: /\bhtml/,
31446        json: /\bjson\b/
31447      },
31448      responseFields: {
31449        xml: "responseXML",
31450        text: "responseText",
31451        json: "responseJSON"
31452      },
31453      // Data converters
31454      // Keys separate source (or catchall "*") and destination types with a single space
31455      converters: {
31456        // Convert anything to text
31457        "* text": String,
31458        // Text to html (true = no transformation)
31459        "text html": true,
31460        // Evaluate text as a json expression
31461        "text json": JSON.parse,
31462        // Parse text as xml
31463        "text xml": jQuery.parseXML
31464      },
31465      // For options that shouldn't be deep extended:
31466      // you can add your own custom options here if
31467      // and when you create one that shouldn't be
31468      // deep extended (see ajaxExtend)
31469      flatOptions: {
31470        url: true,
31471        context: true
31472      }
31473    },
31474    // Creates a full fledged settings object into target
31475    // with both ajaxSettings and settings fields.
31476    // If target is omitted, writes into ajaxSettings.
31477    ajaxSetup: function ajaxSetup(target, settings) {
31478      return settings ? // Building a settings object
31479      ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) : // Extending ajaxSettings
31480      ajaxExtend(jQuery.ajaxSettings, target);
31481    },
31482    ajaxPrefilter: addToPrefiltersOrTransports(prefilters),
31483    ajaxTransport: addToPrefiltersOrTransports(transports),
31484    // Main method
31485    ajax: function ajax(url, options) {
31486      // If url is an object, simulate pre-1.5 signature
31487      if (_typeof(url) === "object") {
31488        options = url;
31489        url = undefined;
31490      } // Force options to be an object
31491
31492
31493      options = options || {};
31494
31495      var transport,
31496          // URL without anti-cache param
31497      cacheURL,
31498          // Response headers
31499      responseHeadersString,
31500          responseHeaders,
31501          // timeout handle
31502      timeoutTimer,
31503          // Url cleanup var
31504      urlAnchor,
31505          // Request state (becomes false upon send and true upon completion)
31506      completed,
31507          // To know if global events are to be dispatched
31508      fireGlobals,
31509          // Loop variable
31510      i,
31511          // uncached part of the url
31512      uncached,
31513          // Create the final options object
31514      s = jQuery.ajaxSetup({}, options),
31515          // Callbacks context
31516      callbackContext = s.context || s,
31517          // Context for global events is callbackContext if it is a DOM node or jQuery collection
31518      globalEventContext = s.context && (callbackContext.nodeType || callbackContext.jquery) ? jQuery(callbackContext) : jQuery.event,
31519          // Deferreds
31520      deferred = jQuery.Deferred(),
31521          completeDeferred = jQuery.Callbacks("once memory"),
31522          // Status-dependent callbacks
31523      _statusCode = s.statusCode || {},
31524          // Headers (they are sent all at once)
31525      requestHeaders = {},
31526          requestHeadersNames = {},
31527          // Default abort message
31528      strAbort = "canceled",
31529          // Fake xhr
31530      jqXHR = {
31531        readyState: 0,
31532        // Builds headers hashtable if needed
31533        getResponseHeader: function getResponseHeader(key) {
31534          var match;
31535
31536          if (completed) {
31537            if (!responseHeaders) {
31538              responseHeaders = {};
31539
31540              while (match = rheaders.exec(responseHeadersString)) {
31541                responseHeaders[match[1].toLowerCase()] = match[2];
31542              }
31543            }
31544
31545            match = responseHeaders[key.toLowerCase()];
31546          }
31547
31548          return match == null ? null : match;
31549        },
31550        // Raw string
31551        getAllResponseHeaders: function getAllResponseHeaders() {
31552          return completed ? responseHeadersString : null;
31553        },
31554        // Caches the header
31555        setRequestHeader: function setRequestHeader(name, value) {
31556          if (completed == null) {
31557            name = requestHeadersNames[name.toLowerCase()] = requestHeadersNames[name.toLowerCase()] || name;
31558            requestHeaders[name] = value;
31559          }
31560
31561          return this;
31562        },
31563        // Overrides response content-type header
31564        overrideMimeType: function overrideMimeType(type) {
31565          if (completed == null) {
31566            s.mimeType = type;
31567          }
31568
31569          return this;
31570        },
31571        // Status-dependent callbacks
31572        statusCode: function statusCode(map) {
31573          var code;
31574
31575          if (map) {
31576            if (completed) {
31577              // Execute the appropriate callbacks
31578              jqXHR.always(map[jqXHR.status]);
31579            } else {
31580              // Lazy-add the new callbacks in a way that preserves old ones
31581              for (code in map) {
31582                _statusCode[code] = [_statusCode[code], map[code]];
31583              }
31584            }
31585          }
31586
31587          return this;
31588        },
31589        // Cancel the request
31590        abort: function abort(statusText) {
31591          var finalText = statusText || strAbort;
31592
31593          if (transport) {
31594            transport.abort(finalText);
31595          }
31596
31597          done(0, finalText);
31598          return this;
31599        }
31600      }; // Attach deferreds
31601
31602
31603      deferred.promise(jqXHR); // Add protocol if not provided (prefilters might expect it)
31604      // Handle falsy url in the settings object (#10093: consistency with old signature)
31605      // We also use the url parameter if available
31606
31607      s.url = ((url || s.url || location.href) + "").replace(rprotocol, location.protocol + "//"); // Alias method option to type as per ticket #12004
31608
31609      s.type = options.method || options.type || s.method || s.type; // Extract dataTypes list
31610
31611      s.dataTypes = (s.dataType || "*").toLowerCase().match(rnothtmlwhite) || [""]; // A cross-domain request is in order when the origin doesn't match the current origin.
31612
31613      if (s.crossDomain == null) {
31614        urlAnchor = document.createElement("a"); // Support: IE <=8 - 11, Edge 12 - 15
31615        // IE throws exception on accessing the href property if url is malformed,
31616        // e.g. http://example.com:80x/
31617
31618        try {
31619          urlAnchor.href = s.url; // Support: IE <=8 - 11 only
31620          // Anchor's host property isn't correctly set when s.url is relative
31621
31622          urlAnchor.href = urlAnchor.href;
31623          s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== urlAnchor.protocol + "//" + urlAnchor.host;
31624        } catch (e) {
31625          // If there is an error parsing the URL, assume it is crossDomain,
31626          // it can be rejected by the transport if it is invalid
31627          s.crossDomain = true;
31628        }
31629      } // Convert data if not already a string
31630
31631
31632      if (s.data && s.processData && typeof s.data !== "string") {
31633        s.data = jQuery.param(s.data, s.traditional);
31634      } // Apply prefilters
31635
31636
31637      inspectPrefiltersOrTransports(prefilters, s, options, jqXHR); // If request was aborted inside a prefilter, stop there
31638
31639      if (completed) {
31640        return jqXHR;
31641      } // We can fire global events as of now if asked to
31642      // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
31643
31644
31645      fireGlobals = jQuery.event && s.global; // Watch for a new set of requests
31646
31647      if (fireGlobals && jQuery.active++ === 0) {
31648        jQuery.event.trigger("ajaxStart");
31649      } // Uppercase the type
31650
31651
31652      s.type = s.type.toUpperCase(); // Determine if request has content
31653
31654      s.hasContent = !rnoContent.test(s.type); // Save the URL in case we're toying with the If-Modified-Since
31655      // and/or If-None-Match header later on
31656      // Remove hash to simplify url manipulation
31657
31658      cacheURL = s.url.replace(rhash, ""); // More options handling for requests with no content
31659
31660      if (!s.hasContent) {
31661        // Remember the hash so we can put it back
31662        uncached = s.url.slice(cacheURL.length); // If data is available and should be processed, append data to url
31663
31664        if (s.data && (s.processData || typeof s.data === "string")) {
31665          cacheURL += (rquery.test(cacheURL) ? "&" : "?") + s.data; // #9682: remove data so that it's not used in an eventual retry
31666
31667          delete s.data;
31668        } // Add or update anti-cache param if needed
31669
31670
31671        if (s.cache === false) {
31672          cacheURL = cacheURL.replace(rantiCache, "$1");
31673          uncached = (rquery.test(cacheURL) ? "&" : "?") + "_=" + nonce++ + uncached;
31674        } // Put hash and anti-cache on the URL that will be requested (gh-1732)
31675
31676
31677        s.url = cacheURL + uncached; // Change '%20' to '+' if this is encoded form body content (gh-2658)
31678      } else if (s.data && s.processData && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0) {
31679        s.data = s.data.replace(r20, "+");
31680      } // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
31681
31682
31683      if (s.ifModified) {
31684        if (jQuery.lastModified[cacheURL]) {
31685          jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]);
31686        }
31687
31688        if (jQuery.etag[cacheURL]) {
31689          jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]);
31690        }
31691      } // Set the correct header, if data is being sent
31692
31693
31694      if (s.data && s.hasContent && s.contentType !== false || options.contentType) {
31695        jqXHR.setRequestHeader("Content-Type", s.contentType);
31696      } // Set the Accepts header for the server, depending on the dataType
31697
31698
31699      jqXHR.setRequestHeader("Accept", s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") : s.accepts["*"]); // Check for headers option
31700
31701      for (i in s.headers) {
31702        jqXHR.setRequestHeader(i, s.headers[i]);
31703      } // Allow custom headers/mimetypes and early abort
31704
31705
31706      if (s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === false || completed)) {
31707        // Abort if not done already and return
31708        return jqXHR.abort();
31709      } // Aborting is no longer a cancellation
31710
31711
31712      strAbort = "abort"; // Install callbacks on deferreds
31713
31714      completeDeferred.add(s.complete);
31715      jqXHR.done(s.success);
31716      jqXHR.fail(s.error); // Get transport
31717
31718      transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR); // If no transport, we auto-abort
31719
31720      if (!transport) {
31721        done(-1, "No Transport");
31722      } else {
31723        jqXHR.readyState = 1; // Send global event
31724
31725        if (fireGlobals) {
31726          globalEventContext.trigger("ajaxSend", [jqXHR, s]);
31727        } // If request was aborted inside ajaxSend, stop there
31728
31729
31730        if (completed) {
31731          return jqXHR;
31732        } // Timeout
31733
31734
31735        if (s.async && s.timeout > 0) {
31736          timeoutTimer = window.setTimeout(function () {
31737            jqXHR.abort("timeout");
31738          }, s.timeout);
31739        }
31740
31741        try {
31742          completed = false;
31743          transport.send(requestHeaders, done);
31744        } catch (e) {
31745          // Rethrow post-completion exceptions
31746          if (completed) {
31747            throw e;
31748          } // Propagate others as results
31749
31750
31751          done(-1, e);
31752        }
31753      } // Callback for when everything is done
31754
31755
31756      function done(status, nativeStatusText, responses, headers) {
31757        var isSuccess,
31758            success,
31759            error,
31760            response,
31761            modified,
31762            statusText = nativeStatusText; // Ignore repeat invocations
31763
31764        if (completed) {
31765          return;
31766        }
31767
31768        completed = true; // Clear timeout if it exists
31769
31770        if (timeoutTimer) {
31771          window.clearTimeout(timeoutTimer);
31772        } // Dereference transport for early garbage collection
31773        // (no matter how long the jqXHR object will be used)
31774
31775
31776        transport = undefined; // Cache response headers
31777
31778        responseHeadersString = headers || ""; // Set readyState
31779
31780        jqXHR.readyState = status > 0 ? 4 : 0; // Determine if successful
31781
31782        isSuccess = status >= 200 && status < 300 || status === 304; // Get response data
31783
31784        if (responses) {
31785          response = ajaxHandleResponses(s, jqXHR, responses);
31786        } // Convert no matter what (that way responseXXX fields are always set)
31787
31788
31789        response = ajaxConvert(s, response, jqXHR, isSuccess); // If successful, handle type chaining
31790
31791        if (isSuccess) {
31792          // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
31793          if (s.ifModified) {
31794            modified = jqXHR.getResponseHeader("Last-Modified");
31795
31796            if (modified) {
31797              jQuery.lastModified[cacheURL] = modified;
31798            }
31799
31800            modified = jqXHR.getResponseHeader("etag");
31801
31802            if (modified) {
31803              jQuery.etag[cacheURL] = modified;
31804            }
31805          } // if no content
31806
31807
31808          if (status === 204 || s.type === "HEAD") {
31809            statusText = "nocontent"; // if not modified
31810          } else if (status === 304) {
31811            statusText = "notmodified"; // If we have data, let's convert it
31812          } else {
31813            statusText = response.state;
31814            success = response.data;
31815            error = response.error;
31816            isSuccess = !error;
31817          }
31818        } else {
31819          // Extract error from statusText and normalize for non-aborts
31820          error = statusText;
31821
31822          if (status || !statusText) {
31823            statusText = "error";
31824
31825            if (status < 0) {
31826              status = 0;
31827            }
31828          }
31829        } // Set data for the fake xhr object
31830
31831
31832        jqXHR.status = status;
31833        jqXHR.statusText = (nativeStatusText || statusText) + ""; // Success/Error
31834
31835        if (isSuccess) {
31836          deferred.resolveWith(callbackContext, [success, statusText, jqXHR]);
31837        } else {
31838          deferred.rejectWith(callbackContext, [jqXHR, statusText, error]);
31839        } // Status-dependent callbacks
31840
31841
31842        jqXHR.statusCode(_statusCode);
31843        _statusCode = undefined;
31844
31845        if (fireGlobals) {
31846          globalEventContext.trigger(isSuccess ? "ajaxSuccess" : "ajaxError", [jqXHR, s, isSuccess ? success : error]);
31847        } // Complete
31848
31849
31850        completeDeferred.fireWith(callbackContext, [jqXHR, statusText]);
31851
31852        if (fireGlobals) {
31853          globalEventContext.trigger("ajaxComplete", [jqXHR, s]); // Handle the global AJAX counter
31854
31855          if (! --jQuery.active) {
31856            jQuery.event.trigger("ajaxStop");
31857          }
31858        }
31859      }
31860
31861      return jqXHR;
31862    },
31863    getJSON: function getJSON(url, data, callback) {
31864      return jQuery.get(url, data, callback, "json");
31865    },
31866    getScript: function getScript(url, callback) {
31867      return jQuery.get(url, undefined, callback, "script");
31868    }
31869  });
31870  jQuery.each(["get", "post"], function (i, method) {
31871    jQuery[method] = function (url, data, callback, type) {
31872      // Shift arguments if data argument was omitted
31873      if (isFunction(data)) {
31874        type = type || callback;
31875        callback = data;
31876        data = undefined;
31877      } // The url can be an options object (which then must have .url)
31878
31879
31880      return jQuery.ajax(jQuery.extend({
31881        url: url,
31882        type: method,
31883        dataType: type,
31884        data: data,
31885        success: callback
31886      }, jQuery.isPlainObject(url) && url));
31887    };
31888  });
31889
31890  jQuery._evalUrl = function (url) {
31891    return jQuery.ajax({
31892      url: url,
31893      // Make this explicit, since user can override this through ajaxSetup (#11264)
31894      type: "GET",
31895      dataType: "script",
31896      cache: true,
31897      async: false,
31898      global: false,
31899      "throws": true
31900    });
31901  };
31902
31903  jQuery.fn.extend({
31904    wrapAll: function wrapAll(html) {
31905      var wrap;
31906
31907      if (this[0]) {
31908        if (isFunction(html)) {
31909          html = html.call(this[0]);
31910        } // The elements to wrap the target around
31911
31912
31913        wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true);
31914
31915        if (this[0].parentNode) {
31916          wrap.insertBefore(this[0]);
31917        }
31918
31919        wrap.map(function () {
31920          var elem = this;
31921
31922          while (elem.firstElementChild) {
31923            elem = elem.firstElementChild;
31924          }
31925
31926          return elem;
31927        }).append(this);
31928      }
31929
31930      return this;
31931    },
31932    wrapInner: function wrapInner(html) {
31933      if (isFunction(html)) {
31934        return this.each(function (i) {
31935          jQuery(this).wrapInner(html.call(this, i));
31936        });
31937      }
31938
31939      return this.each(function () {
31940        var self = jQuery(this),
31941            contents = self.contents();
31942
31943        if (contents.length) {
31944          contents.wrapAll(html);
31945        } else {
31946          self.append(html);
31947        }
31948      });
31949    },
31950    wrap: function wrap(html) {
31951      var htmlIsFunction = isFunction(html);
31952      return this.each(function (i) {
31953        jQuery(this).wrapAll(htmlIsFunction ? html.call(this, i) : html);
31954      });
31955    },
31956    unwrap: function unwrap(selector) {
31957      this.parent(selector).not("body").each(function () {
31958        jQuery(this).replaceWith(this.childNodes);
31959      });
31960      return this;
31961    }
31962  });
31963
31964  jQuery.expr.pseudos.hidden = function (elem) {
31965    return !jQuery.expr.pseudos.visible(elem);
31966  };
31967
31968  jQuery.expr.pseudos.visible = function (elem) {
31969    return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);
31970  };
31971
31972  jQuery.ajaxSettings.xhr = function () {
31973    try {
31974      return new window.XMLHttpRequest();
31975    } catch (e) {}
31976  };
31977
31978  var xhrSuccessStatus = {
31979    // File protocol always yields status code 0, assume 200
31980    0: 200,
31981    // Support: IE <=9 only
31982    // #1450: sometimes IE returns 1223 when it should be 204
31983    1223: 204
31984  },
31985      xhrSupported = jQuery.ajaxSettings.xhr();
31986  support.cors = !!xhrSupported && "withCredentials" in xhrSupported;
31987  support.ajax = xhrSupported = !!xhrSupported;
31988  jQuery.ajaxTransport(function (options) {
31989    var _callback, errorCallback; // Cross domain only allowed if supported through XMLHttpRequest
31990
31991
31992    if (support.cors || xhrSupported && !options.crossDomain) {
31993      return {
31994        send: function send(headers, complete) {
31995          var i,
31996              xhr = options.xhr();
31997          xhr.open(options.type, options.url, options.async, options.username, options.password); // Apply custom fields if provided
31998
31999          if (options.xhrFields) {
32000            for (i in options.xhrFields) {
32001              xhr[i] = options.xhrFields[i];
32002            }
32003          } // Override mime type if needed
32004
32005
32006          if (options.mimeType && xhr.overrideMimeType) {
32007            xhr.overrideMimeType(options.mimeType);
32008          } // X-Requested-With header
32009          // For cross-domain requests, seeing as conditions for a preflight are
32010          // akin to a jigsaw puzzle, we simply never set it to be sure.
32011          // (it can always be set on a per-request basis or even using ajaxSetup)
32012          // For same-domain requests, won't change header if already provided.
32013
32014
32015          if (!options.crossDomain && !headers["X-Requested-With"]) {
32016            headers["X-Requested-With"] = "XMLHttpRequest";
32017          } // Set headers
32018
32019
32020          for (i in headers) {
32021            xhr.setRequestHeader(i, headers[i]);
32022          } // Callback
32023
32024
32025          _callback = function callback(type) {
32026            return function () {
32027              if (_callback) {
32028                _callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = xhr.onreadystatechange = null;
32029
32030                if (type === "abort") {
32031                  xhr.abort();
32032                } else if (type === "error") {
32033                  // Support: IE <=9 only
32034                  // On a manual native abort, IE9 throws
32035                  // errors on any property access that is not readyState
32036                  if (typeof xhr.status !== "number") {
32037                    complete(0, "error");
32038                  } else {
32039                    complete( // File: protocol always yields status 0; see #8605, #14207
32040                    xhr.status, xhr.statusText);
32041                  }
32042                } else {
32043                  complete(xhrSuccessStatus[xhr.status] || xhr.status, xhr.statusText, // Support: IE <=9 only
32044                  // IE9 has no XHR2 but throws on binary (trac-11426)
32045                  // For XHR2 non-text, let the caller handle it (gh-2498)
32046                  (xhr.responseType || "text") !== "text" || typeof xhr.responseText !== "string" ? {
32047                    binary: xhr.response
32048                  } : {
32049                    text: xhr.responseText
32050                  }, xhr.getAllResponseHeaders());
32051                }
32052              }
32053            };
32054          }; // Listen to events
32055
32056
32057          xhr.onload = _callback();
32058          errorCallback = xhr.onerror = xhr.ontimeout = _callback("error"); // Support: IE 9 only
32059          // Use onreadystatechange to replace onabort
32060          // to handle uncaught aborts
32061
32062          if (xhr.onabort !== undefined) {
32063            xhr.onabort = errorCallback;
32064          } else {
32065            xhr.onreadystatechange = function () {
32066              // Check readyState before timeout as it changes
32067              if (xhr.readyState === 4) {
32068                // Allow onerror to be called first,
32069                // but that will not handle a native abort
32070                // Also, save errorCallback to a variable
32071                // as xhr.onerror cannot be accessed
32072                window.setTimeout(function () {
32073                  if (_callback) {
32074                    errorCallback();
32075                  }
32076                });
32077              }
32078            };
32079          } // Create the abort callback
32080
32081
32082          _callback = _callback("abort");
32083
32084          try {
32085            // Do send the request (this may raise an exception)
32086            xhr.send(options.hasContent && options.data || null);
32087          } catch (e) {
32088            // #14683: Only rethrow if this hasn't been notified as an error yet
32089            if (_callback) {
32090              throw e;
32091            }
32092          }
32093        },
32094        abort: function abort() {
32095          if (_callback) {
32096            _callback();
32097          }
32098        }
32099      };
32100    }
32101  }); // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
32102
32103  jQuery.ajaxPrefilter(function (s) {
32104    if (s.crossDomain) {
32105      s.contents.script = false;
32106    }
32107  }); // Install script dataType
32108
32109  jQuery.ajaxSetup({
32110    accepts: {
32111      script: "text/javascript, application/javascript, " + "application/ecmascript, application/x-ecmascript"
32112    },
32113    contents: {
32114      script: /\b(?:java|ecma)script\b/
32115    },
32116    converters: {
32117      "text script": function textScript(text) {
32118        jQuery.globalEval(text);
32119        return text;
32120      }
32121    }
32122  }); // Handle cache's special case and crossDomain
32123
32124  jQuery.ajaxPrefilter("script", function (s) {
32125    if (s.cache === undefined) {
32126      s.cache = false;
32127    }
32128
32129    if (s.crossDomain) {
32130      s.type = "GET";
32131    }
32132  }); // Bind script tag hack transport
32133
32134  jQuery.ajaxTransport("script", function (s) {
32135    // This transport only deals with cross domain requests
32136    if (s.crossDomain) {
32137      var script, _callback2;
32138
32139      return {
32140        send: function send(_, complete) {
32141          script = jQuery("<script>").prop({
32142            charset: s.scriptCharset,
32143            src: s.url
32144          }).on("load error", _callback2 = function callback(evt) {
32145            script.remove();
32146            _callback2 = null;
32147
32148            if (evt) {
32149              complete(evt.type === "error" ? 404 : 200, evt.type);
32150            }
32151          }); // Use native DOM manipulation to avoid our domManip AJAX trickery
32152
32153          document.head.appendChild(script[0]);
32154        },
32155        abort: function abort() {
32156          if (_callback2) {
32157            _callback2();
32158          }
32159        }
32160      };
32161    }
32162  });
32163  var oldCallbacks = [],
32164      rjsonp = /(=)\?(?=&|$)|\?\?/; // Default jsonp settings
32165
32166  jQuery.ajaxSetup({
32167    jsonp: "callback",
32168    jsonpCallback: function jsonpCallback() {
32169      var callback = oldCallbacks.pop() || jQuery.expando + "_" + nonce++;
32170      this[callback] = true;
32171      return callback;
32172    }
32173  }); // Detect, normalize options and install callbacks for jsonp requests
32174
32175  jQuery.ajaxPrefilter("json jsonp", function (s, originalSettings, jqXHR) {
32176    var callbackName,
32177        overwritten,
32178        responseContainer,
32179        jsonProp = s.jsonp !== false && (rjsonp.test(s.url) ? "url" : typeof s.data === "string" && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0 && rjsonp.test(s.data) && "data"); // Handle iff the expected data type is "jsonp" or we have a parameter to set
32180
32181    if (jsonProp || s.dataTypes[0] === "jsonp") {
32182      // Get callback name, remembering preexisting value associated with it
32183      callbackName = s.jsonpCallback = isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback; // Insert callback into url or form data
32184
32185      if (jsonProp) {
32186        s[jsonProp] = s[jsonProp].replace(rjsonp, "$1" + callbackName);
32187      } else if (s.jsonp !== false) {
32188        s.url += (rquery.test(s.url) ? "&" : "?") + s.jsonp + "=" + callbackName;
32189      } // Use data converter to retrieve json after script execution
32190
32191
32192      s.converters["script json"] = function () {
32193        if (!responseContainer) {
32194          jQuery.error(callbackName + " was not called");
32195        }
32196
32197        return responseContainer[0];
32198      }; // Force json dataType
32199
32200
32201      s.dataTypes[0] = "json"; // Install callback
32202
32203      overwritten = window[callbackName];
32204
32205      window[callbackName] = function () {
32206        responseContainer = arguments;
32207      }; // Clean-up function (fires after converters)
32208
32209
32210      jqXHR.always(function () {
32211        // If previous value didn't exist - remove it
32212        if (overwritten === undefined) {
32213          jQuery(window).removeProp(callbackName); // Otherwise restore preexisting value
32214        } else {
32215          window[callbackName] = overwritten;
32216        } // Save back as free
32217
32218
32219        if (s[callbackName]) {
32220          // Make sure that re-using the options doesn't screw things around
32221          s.jsonpCallback = originalSettings.jsonpCallback; // Save the callback name for future use
32222
32223          oldCallbacks.push(callbackName);
32224        } // Call if it was a function and we have a response
32225
32226
32227        if (responseContainer && isFunction(overwritten)) {
32228          overwritten(responseContainer[0]);
32229        }
32230
32231        responseContainer = overwritten = undefined;
32232      }); // Delegate to script
32233
32234      return "script";
32235    }
32236  }); // Support: Safari 8 only
32237  // In Safari 8 documents created via document.implementation.createHTMLDocument
32238  // collapse sibling forms: the second one becomes a child of the first one.
32239  // Because of that, this security measure has to be disabled in Safari 8.
32240  // https://bugs.webkit.org/show_bug.cgi?id=137337
32241
32242  support.createHTMLDocument = function () {
32243    var body = document.implementation.createHTMLDocument("").body;
32244    body.innerHTML = "<form></form><form></form>";
32245    return body.childNodes.length === 2;
32246  }(); // Argument "data" should be string of html
32247  // context (optional): If specified, the fragment will be created in this context,
32248  // defaults to document
32249  // keepScripts (optional): If true, will include scripts passed in the html string
32250
32251
32252  jQuery.parseHTML = function (data, context, keepScripts) {
32253    if (typeof data !== "string") {
32254      return [];
32255    }
32256
32257    if (typeof context === "boolean") {
32258      keepScripts = context;
32259      context = false;
32260    }
32261
32262    var base, parsed, scripts;
32263
32264    if (!context) {
32265      // Stop scripts or inline event handlers from being executed immediately
32266      // by using document.implementation
32267      if (support.createHTMLDocument) {
32268        context = document.implementation.createHTMLDocument(""); // Set the base href for the created document
32269        // so any parsed elements with URLs
32270        // are based on the document's URL (gh-2965)
32271
32272        base = context.createElement("base");
32273        base.href = document.location.href;
32274        context.head.appendChild(base);
32275      } else {
32276        context = document;
32277      }
32278    }
32279
32280    parsed = rsingleTag.exec(data);
32281    scripts = !keepScripts && []; // Single tag
32282
32283    if (parsed) {
32284      return [context.createElement(parsed[1])];
32285    }
32286
32287    parsed = buildFragment([data], context, scripts);
32288
32289    if (scripts && scripts.length) {
32290      jQuery(scripts).remove();
32291    }
32292
32293    return jQuery.merge([], parsed.childNodes);
32294  };
32295  /**
32296   * Load a url into a page
32297   */
32298
32299
32300  jQuery.fn.load = function (url, params, callback) {
32301    var selector,
32302        type,
32303        response,
32304        self = this,
32305        off = url.indexOf(" ");
32306
32307    if (off > -1) {
32308      selector = stripAndCollapse(url.slice(off));
32309      url = url.slice(0, off);
32310    } // If it's a function
32311
32312
32313    if (isFunction(params)) {
32314      // We assume that it's the callback
32315      callback = params;
32316      params = undefined; // Otherwise, build a param string
32317    } else if (params && _typeof(params) === "object") {
32318      type = "POST";
32319    } // If we have elements to modify, make the request
32320
32321
32322    if (self.length > 0) {
32323      jQuery.ajax({
32324        url: url,
32325        // If "type" variable is undefined, then "GET" method will be used.
32326        // Make value of this field explicit since
32327        // user can override it through ajaxSetup method
32328        type: type || "GET",
32329        dataType: "html",
32330        data: params
32331      }).done(function (responseText) {
32332        // Save response for use in complete callback
32333        response = arguments;
32334        self.html(selector ? // If a selector was specified, locate the right elements in a dummy div
32335        // Exclude scripts to avoid IE 'Permission Denied' errors
32336        jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) : // Otherwise use the full result
32337        responseText); // If the request succeeds, this function gets "data", "status", "jqXHR"
32338        // but they are ignored because response was set above.
32339        // If it fails, this function gets "jqXHR", "status", "error"
32340      }).always(callback && function (jqXHR, status) {
32341        self.each(function () {
32342          callback.apply(this, response || [jqXHR.responseText, status, jqXHR]);
32343        });
32344      });
32345    }
32346
32347    return this;
32348  }; // Attach a bunch of functions for handling common AJAX events
32349
32350
32351  jQuery.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function (i, type) {
32352    jQuery.fn[type] = function (fn) {
32353      return this.on(type, fn);
32354    };
32355  });
32356
32357  jQuery.expr.pseudos.animated = function (elem) {
32358    return jQuery.grep(jQuery.timers, function (fn) {
32359      return elem === fn.elem;
32360    }).length;
32361  };
32362
32363  jQuery.offset = {
32364    setOffset: function setOffset(elem, options, i) {
32365      var curPosition,
32366          curLeft,
32367          curCSSTop,
32368          curTop,
32369          curOffset,
32370          curCSSLeft,
32371          calculatePosition,
32372          position = jQuery.css(elem, "position"),
32373          curElem = jQuery(elem),
32374          props = {}; // Set position first, in-case top/left are set even on static elem
32375
32376      if (position === "static") {
32377        elem.style.position = "relative";
32378      }
32379
32380      curOffset = curElem.offset();
32381      curCSSTop = jQuery.css(elem, "top");
32382      curCSSLeft = jQuery.css(elem, "left");
32383      calculatePosition = (position === "absolute" || position === "fixed") && (curCSSTop + curCSSLeft).indexOf("auto") > -1; // Need to be able to calculate position if either
32384      // top or left is auto and position is either absolute or fixed
32385
32386      if (calculatePosition) {
32387        curPosition = curElem.position();
32388        curTop = curPosition.top;
32389        curLeft = curPosition.left;
32390      } else {
32391        curTop = parseFloat(curCSSTop) || 0;
32392        curLeft = parseFloat(curCSSLeft) || 0;
32393      }
32394
32395      if (isFunction(options)) {
32396        // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
32397        options = options.call(elem, i, jQuery.extend({}, curOffset));
32398      }
32399
32400      if (options.top != null) {
32401        props.top = options.top - curOffset.top + curTop;
32402      }
32403
32404      if (options.left != null) {
32405        props.left = options.left - curOffset.left + curLeft;
32406      }
32407
32408      if ("using" in options) {
32409        options.using.call(elem, props);
32410      } else {
32411        curElem.css(props);
32412      }
32413    }
32414  };
32415  jQuery.fn.extend({
32416    // offset() relates an element's border box to the document origin
32417    offset: function offset(options) {
32418      // Preserve chaining for setter
32419      if (arguments.length) {
32420        return options === undefined ? this : this.each(function (i) {
32421          jQuery.offset.setOffset(this, options, i);
32422        });
32423      }
32424
32425      var rect,
32426          win,
32427          elem = this[0];
32428
32429      if (!elem) {
32430        return;
32431      } // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
32432      // Support: IE <=11 only
32433      // Running getBoundingClientRect on a
32434      // disconnected node in IE throws an error
32435
32436
32437      if (!elem.getClientRects().length) {
32438        return {
32439          top: 0,
32440          left: 0
32441        };
32442      } // Get document-relative position by adding viewport scroll to viewport-relative gBCR
32443
32444
32445      rect = elem.getBoundingClientRect();
32446      win = elem.ownerDocument.defaultView;
32447      return {
32448        top: rect.top + win.pageYOffset,
32449        left: rect.left + win.pageXOffset
32450      };
32451    },
32452    // position() relates an element's margin box to its offset parent's padding box
32453    // This corresponds to the behavior of CSS absolute positioning
32454    position: function position() {
32455      if (!this[0]) {
32456        return;
32457      }
32458
32459      var offsetParent,
32460          offset,
32461          doc,
32462          elem = this[0],
32463          parentOffset = {
32464        top: 0,
32465        left: 0
32466      }; // position:fixed elements are offset from the viewport, which itself always has zero offset
32467
32468      if (jQuery.css(elem, "position") === "fixed") {
32469        // Assume position:fixed implies availability of getBoundingClientRect
32470        offset = elem.getBoundingClientRect();
32471      } else {
32472        offset = this.offset(); // Account for the *real* offset parent, which can be the document or its root element
32473        // when a statically positioned element is identified
32474
32475        doc = elem.ownerDocument;
32476        offsetParent = elem.offsetParent || doc.documentElement;
32477
32478        while (offsetParent && (offsetParent === doc.body || offsetParent === doc.documentElement) && jQuery.css(offsetParent, "position") === "static") {
32479          offsetParent = offsetParent.parentNode;
32480        }
32481
32482        if (offsetParent && offsetParent !== elem && offsetParent.nodeType === 1) {
32483          // Incorporate borders into its offset, since they are outside its content origin
32484          parentOffset = jQuery(offsetParent).offset();
32485          parentOffset.top += jQuery.css(offsetParent, "borderTopWidth", true);
32486          parentOffset.left += jQuery.css(offsetParent, "borderLeftWidth", true);
32487        }
32488      } // Subtract parent offsets and element margins
32489
32490
32491      return {
32492        top: offset.top - parentOffset.top - jQuery.css(elem, "marginTop", true),
32493        left: offset.left - parentOffset.left - jQuery.css(elem, "marginLeft", true)
32494      };
32495    },
32496    // This method will return documentElement in the following cases:
32497    // 1) For the element inside the iframe without offsetParent, this method will return
32498    //    documentElement of the parent window
32499    // 2) For the hidden or detached element
32500    // 3) For body or html element, i.e. in case of the html node - it will return itself
32501    //
32502    // but those exceptions were never presented as a real life use-cases
32503    // and might be considered as more preferable results.
32504    //
32505    // This logic, however, is not guaranteed and can change at any point in the future
32506    offsetParent: function offsetParent() {
32507      return this.map(function () {
32508        var offsetParent = this.offsetParent;
32509
32510        while (offsetParent && jQuery.css(offsetParent, "position") === "static") {
32511          offsetParent = offsetParent.offsetParent;
32512        }
32513
32514        return offsetParent || documentElement;
32515      });
32516    }
32517  }); // Create scrollLeft and scrollTop methods
32518
32519  jQuery.each({
32520    scrollLeft: "pageXOffset",
32521    scrollTop: "pageYOffset"
32522  }, function (method, prop) {
32523    var top = "pageYOffset" === prop;
32524
32525    jQuery.fn[method] = function (val) {
32526      return access(this, function (elem, method, val) {
32527        // Coalesce documents and windows
32528        var win;
32529
32530        if (isWindow(elem)) {
32531          win = elem;
32532        } else if (elem.nodeType === 9) {
32533          win = elem.defaultView;
32534        }
32535
32536        if (val === undefined) {
32537          return win ? win[prop] : elem[method];
32538        }
32539
32540        if (win) {
32541          win.scrollTo(!top ? val : win.pageXOffset, top ? val : win.pageYOffset);
32542        } else {
32543          elem[method] = val;
32544        }
32545      }, method, val, arguments.length);
32546    };
32547  }); // Support: Safari <=7 - 9.1, Chrome <=37 - 49
32548  // Add the top/left cssHooks using jQuery.fn.position
32549  // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
32550  // Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
32551  // getComputedStyle returns percent when specified for top/left/bottom/right;
32552  // rather than make the css module depend on the offset module, just check for it here
32553
32554  jQuery.each(["top", "left"], function (i, prop) {
32555    jQuery.cssHooks[prop] = addGetHookIf(support.pixelPosition, function (elem, computed) {
32556      if (computed) {
32557        computed = curCSS(elem, prop); // If curCSS returns percentage, fallback to offset
32558
32559        return rnumnonpx.test(computed) ? jQuery(elem).position()[prop] + "px" : computed;
32560      }
32561    });
32562  }); // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
32563
32564  jQuery.each({
32565    Height: "height",
32566    Width: "width"
32567  }, function (name, type) {
32568    jQuery.each({
32569      padding: "inner" + name,
32570      content: type,
32571      "": "outer" + name
32572    }, function (defaultExtra, funcName) {
32573      // Margin is only for outerHeight, outerWidth
32574      jQuery.fn[funcName] = function (margin, value) {
32575        var chainable = arguments.length && (defaultExtra || typeof margin !== "boolean"),
32576            extra = defaultExtra || (margin === true || value === true ? "margin" : "border");
32577        return access(this, function (elem, type, value) {
32578          var doc;
32579
32580          if (isWindow(elem)) {
32581            // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
32582            return funcName.indexOf("outer") === 0 ? elem["inner" + name] : elem.document.documentElement["client" + name];
32583          } // Get document width or height
32584
32585
32586          if (elem.nodeType === 9) {
32587            doc = elem.documentElement; // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
32588            // whichever is greatest
32589
32590            return Math.max(elem.body["scroll" + name], doc["scroll" + name], elem.body["offset" + name], doc["offset" + name], doc["client" + name]);
32591          }
32592
32593          return value === undefined ? // Get width or height on the element, requesting but not forcing parseFloat
32594          jQuery.css(elem, type, extra) : // Set width or height on the element
32595          jQuery.style(elem, type, value, extra);
32596        }, type, chainable ? margin : undefined, chainable);
32597      };
32598    });
32599  });
32600  jQuery.each(("blur focus focusin focusout resize scroll click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup contextmenu").split(" "), function (i, name) {
32601    // Handle event binding
32602    jQuery.fn[name] = function (data, fn) {
32603      return arguments.length > 0 ? this.on(name, null, data, fn) : this.trigger(name);
32604    };
32605  });
32606  jQuery.fn.extend({
32607    hover: function hover(fnOver, fnOut) {
32608      return this.mouseenter(fnOver).mouseleave(fnOut || fnOver);
32609    }
32610  });
32611  jQuery.fn.extend({
32612    bind: function bind(types, data, fn) {
32613      return this.on(types, null, data, fn);
32614    },
32615    unbind: function unbind(types, fn) {
32616      return this.off(types, null, fn);
32617    },
32618    delegate: function delegate(selector, types, data, fn) {
32619      return this.on(types, selector, data, fn);
32620    },
32621    undelegate: function undelegate(selector, types, fn) {
32622      // ( namespace ) or ( selector, types [, fn] )
32623      return arguments.length === 1 ? this.off(selector, "**") : this.off(types, selector || "**", fn);
32624    }
32625  }); // Bind a function to a context, optionally partially applying any
32626  // arguments.
32627  // jQuery.proxy is deprecated to promote standards (specifically Function#bind)
32628  // However, it is not slated for removal any time soon
32629
32630  jQuery.proxy = function (fn, context) {
32631    var tmp, args, proxy;
32632
32633    if (typeof context === "string") {
32634      tmp = fn[context];
32635      context = fn;
32636      fn = tmp;
32637    } // Quick check to determine if target is callable, in the spec
32638    // this throws a TypeError, but we will just return undefined.
32639
32640
32641    if (!isFunction(fn)) {
32642      return undefined;
32643    } // Simulated bind
32644
32645
32646    args = _slice.call(arguments, 2);
32647
32648    proxy = function proxy() {
32649      return fn.apply(context || this, args.concat(_slice.call(arguments)));
32650    }; // Set the guid of unique handler to the same of original handler, so it can be removed
32651
32652
32653    proxy.guid = fn.guid = fn.guid || jQuery.guid++;
32654    return proxy;
32655  };
32656
32657  jQuery.holdReady = function (hold) {
32658    if (hold) {
32659      jQuery.readyWait++;
32660    } else {
32661      jQuery.ready(true);
32662    }
32663  };
32664
32665  jQuery.isArray = Array.isArray;
32666  jQuery.parseJSON = JSON.parse;
32667  jQuery.nodeName = nodeName;
32668  jQuery.isFunction = isFunction;
32669  jQuery.isWindow = isWindow;
32670  jQuery.camelCase = camelCase;
32671  jQuery.type = toType;
32672  jQuery.now = Date.now;
32673
32674  jQuery.isNumeric = function (obj) {
32675    // As of jQuery 3.0, isNumeric is limited to
32676    // strings and numbers (primitives or objects)
32677    // that can be coerced to finite numbers (gh-2662)
32678    var type = jQuery.type(obj);
32679    return (type === "number" || type === "string") && // parseFloat NaNs numeric-cast false positives ("")
32680    // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
32681    // subtraction forces infinities to NaN
32682    !isNaN(obj - parseFloat(obj));
32683  }; // Register as a named AMD module, since jQuery can be concatenated with other
32684  // files that may use define, but not via a proper concatenation script that
32685  // understands anonymous AMD modules. A named AMD is safest and most robust
32686  // way to register. Lowercase jquery is used because AMD module names are
32687  // derived from file names, and jQuery is normally delivered in a lowercase
32688  // file name. Do this after creating the global so that if an AMD module wants
32689  // to call noConflict to hide this version of jQuery, it will work.
32690  // Note that for maximum portability, libraries that are not jQuery should
32691  // declare themselves as anonymous modules, and avoid setting a global if an
32692  // AMD loader is present. jQuery is a special case. For more information, see
32693  // https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
32694
32695
32696  if (true) {
32697    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {
32698      return jQuery;
32699    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
32700				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
32701  }
32702
32703  var // Map over jQuery in case of overwrite
32704  _jQuery = window.jQuery,
32705      // Map over the $ in case of overwrite
32706  _$ = window.$;
32707
32708  jQuery.noConflict = function (deep) {
32709    if (window.$ === jQuery) {
32710      window.$ = _$;
32711    }
32712
32713    if (deep && window.jQuery === jQuery) {
32714      window.jQuery = _jQuery;
32715    }
32716
32717    return jQuery;
32718  }; // Expose jQuery and $ identifiers, even in AMD
32719  // (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
32720  // and CommonJS for browser emulators (#13566)
32721
32722
32723  if (!noGlobal) {
32724    window.jQuery = window.$ = jQuery;
32725  }
32726
32727  return jQuery;
32728});
32729/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/module.js */ "../node_modules/webpack/buildin/module.js")(module)))
32730
32731/***/ }),
32732
vendor: 6,652 bytes, lines 32733-32967
32733/***/ "../node_modules/path-browserify/index.js":
32734/*!************************************************!*\
32735  !*** ../node_modules/path-browserify/index.js ***!
32736  \************************************************/
32737/*! no static exports found */
32738/***/ (function(module, exports, __webpack_require__) {
32739
32740/* WEBPACK VAR INJECTION */(function(process) {// Copyright Joyent, Inc. and other Node contributors.
32741//
32742// Permission is hereby granted, free of charge, to any person obtaining a
32743// copy of this software and associated documentation files (the
32744// "Software"), to deal in the Software without restriction, including
32745// without limitation the rights to use, copy, modify, merge, publish,
32746// distribute, sublicense, and/or sell copies of the Software, and to permit
32747// persons to whom the Software is furnished to do so, subject to the
32748// following conditions:
32749//
32750// The above copyright notice and this permission notice shall be included
32751// in all copies or substantial portions of the Software.
32752//
32753// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
32754// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
32755// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
32756// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
32757// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
32758// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
32759// USE OR OTHER DEALINGS IN THE SOFTWARE.
32760// resolves . and .. elements in a path array with directory names there
32761// must be no slashes, empty elements, or device names (c:\) in the array
32762// (so also no leading and trailing slashes - it does not distinguish
32763// relative and absolute paths)
32764function normalizeArray(parts, allowAboveRoot) {
32765  // if the path tries to go above the root, `up` ends up > 0
32766  var up = 0;
32767
32768  for (var i = parts.length - 1; i >= 0; i--) {
32769    var last = parts[i];
32770
32771    if (last === '.') {
32772      parts.splice(i, 1);
32773    } else if (last === '..') {
32774      parts.splice(i, 1);
32775      up++;
32776    } else if (up) {
32777      parts.splice(i, 1);
32778      up--;
32779    }
32780  } // if the path is allowed to go above the root, restore leading ..s
32781
32782
32783  if (allowAboveRoot) {
32784    for (; up--; up) {
32785      parts.unshift('..');
32786    }
32787  }
32788
32789  return parts;
32790} // Split a filename into [root, dir, basename, ext], unix version
32791// 'root' is just a slash, or nothing.
32792
32793
32794var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
32795
32796var splitPath = function splitPath(filename) {
32797  return splitPathRe.exec(filename).slice(1);
32798}; // path.resolve([from ...], to)
32799// posix version
32800
32801
32802exports.resolve = function () {
32803  var resolvedPath = '',
32804      resolvedAbsolute = false;
32805
32806  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
32807    var path = i >= 0 ? arguments[i] : process.cwd(); // Skip empty and invalid entries
32808
32809    if (typeof path !== 'string') {
32810      throw new TypeError('Arguments to path.resolve must be strings');
32811    } else if (!path) {
32812      continue;
32813    }
32814
32815    resolvedPath = path + '/' + resolvedPath;
32816    resolvedAbsolute = path.charAt(0) === '/';
32817  } // At this point the path should be resolved to a full absolute path, but
32818  // handle relative paths to be safe (might happen when process.cwd() fails)
32819  // Normalize the path
32820
32821
32822  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function (p) {
32823    return !!p;
32824  }), !resolvedAbsolute).join('/');
32825  return (resolvedAbsolute ? '/' : '') + resolvedPath || '.';
32826}; // path.normalize(path)
32827// posix version
32828
32829
32830exports.normalize = function (path) {
32831  var isAbsolute = exports.isAbsolute(path),
32832      trailingSlash = substr(path, -1) === '/'; // Normalize the path
32833
32834  path = normalizeArray(filter(path.split('/'), function (p) {
32835    return !!p;
32836  }), !isAbsolute).join('/');
32837
32838  if (!path && !isAbsolute) {
32839    path = '.';
32840  }
32841
32842  if (path && trailingSlash) {
32843    path += '/';
32844  }
32845
32846  return (isAbsolute ? '/' : '') + path;
32847}; // posix version
32848
32849
32850exports.isAbsolute = function (path) {
32851  return path.charAt(0) === '/';
32852}; // posix version
32853
32854
32855exports.join = function () {
32856  var paths = Array.prototype.slice.call(arguments, 0);
32857  return exports.normalize(filter(paths, function (p, index) {
32858    if (typeof p !== 'string') {
32859      throw new TypeError('Arguments to path.join must be strings');
32860    }
32861
32862    return p;
32863  }).join('/'));
32864}; // path.relative(from, to)
32865// posix version
32866
32867
32868exports.relative = function (from, to) {
32869  from = exports.resolve(from).substr(1);
32870  to = exports.resolve(to).substr(1);
32871
32872  function trim(arr) {
32873    var start = 0;
32874
32875    for (; start < arr.length; start++) {
32876      if (arr[start] !== '') break;
32877    }
32878
32879    var end = arr.length - 1;
32880
32881    for (; end >= 0; end--) {
32882      if (arr[end] !== '') break;
32883    }
32884
32885    if (start > end) return [];
32886    return arr.slice(start, end - start + 1);
32887  }
32888
32889  var fromParts = trim(from.split('/'));
32890  var toParts = trim(to.split('/'));
32891  var length = Math.min(fromParts.length, toParts.length);
32892  var samePartsLength = length;
32893
32894  for (var i = 0; i < length; i++) {
32895    if (fromParts[i] !== toParts[i]) {
32896      samePartsLength = i;
32897      break;
32898    }
32899  }
32900
32901  var outputParts = [];
32902
32903  for (var i = samePartsLength; i < fromParts.length; i++) {
32904    outputParts.push('..');
32905  }
32906
32907  outputParts = outputParts.concat(toParts.slice(samePartsLength));
32908  return outputParts.join('/');
32909};
32910
32911exports.sep = '/';
32912exports.delimiter = ':';
32913
32914exports.dirname = function (path) {
32915  var result = splitPath(path),
32916      root = result[0],
32917      dir = result[1];
32918
32919  if (!root && !dir) {
32920    // No dirname whatsoever
32921    return '.';
32922  }
32923
32924  if (dir) {
32925    // It has a dirname, strip trailing slash
32926    dir = dir.substr(0, dir.length - 1);
32927  }
32928
32929  return root + dir;
32930};
32931
32932exports.basename = function (path, ext) {
32933  var f = splitPath(path)[2]; // TODO: make this comparison case-insensitive on windows?
32934
32935  if (ext && f.substr(-1 * ext.length) === ext) {
32936    f = f.substr(0, f.length - ext.length);
32937  }
32938
32939  return f;
32940};
32941
32942exports.extname = function (path) {
32943  return splitPath(path)[3];
32944};
32945
32946function filter(xs, f) {
32947  if (xs.filter) return xs.filter(f);
32948  var res = [];
32949
32950  for (var i = 0; i < xs.length; i++) {
32951    if (f(xs[i], i, xs)) res.push(xs[i]);
32952  }
32953
32954  return res;
32955} // String.prototype.substr - negative index don't work in IE8
32956
32957
32958var substr = 'ab'.substr(-1) === 'b' ? function (str, start, len) {
32959  return str.substr(start, len);
32960} : function (str, start, len) {
32961  if (start < 0) start = str.length + start;
32962  return str.substr(start, len);
32963};
32964/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../process/browser.js */ "../node_modules/process/browser.js")))
32965
32966/***/ }),
32967
vendor: 5,348 bytes, lines 32968-33185
32968/***/ "../node_modules/process/browser.js":
32969/*!******************************************!*\
32970  !*** ../node_modules/process/browser.js ***!
32971  \******************************************/
32972/*! no static exports found */
32973/***/ (function(module, exports) {
32974
32975// shim for using process in browser
32976var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it
32977// don't break things.  But we need to wrap it in a try catch in case it is
32978// wrapped in strict mode code which doesn't define any globals.  It's inside a
32979// function because try/catches deoptimize in certain engines.
32980
32981var cachedSetTimeout;
32982var cachedClearTimeout;
32983
32984function defaultSetTimout() {
32985  throw new Error('setTimeout has not been defined');
32986}
32987
32988function defaultClearTimeout() {
32989  throw new Error('clearTimeout has not been defined');
32990}
32991
32992(function () {
32993  try {
32994    if (typeof setTimeout === 'function') {
32995      cachedSetTimeout = setTimeout;
32996    } else {
32997      cachedSetTimeout = defaultSetTimout;
32998    }
32999  } catch (e) {
33000    cachedSetTimeout = defaultSetTimout;
33001  }
33002
33003  try {
33004    if (typeof clearTimeout === 'function') {
33005      cachedClearTimeout = clearTimeout;
33006    } else {
33007      cachedClearTimeout = defaultClearTimeout;
33008    }
33009  } catch (e) {
33010    cachedClearTimeout = defaultClearTimeout;
33011  }
33012})();
33013
33014function runTimeout(fun) {
33015  if (cachedSetTimeout === setTimeout) {
33016    //normal enviroments in sane situations
33017    return setTimeout(fun, 0);
33018  } // if setTimeout wasn't available but was latter defined
33019
33020
33021  if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
33022    cachedSetTimeout = setTimeout;
33023    return setTimeout(fun, 0);
33024  }
33025
33026  try {
33027    // when when somebody has screwed with setTimeout but no I.E. maddness
33028    return cachedSetTimeout(fun, 0);
33029  } catch (e) {
33030    try {
33031      // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
33032      return cachedSetTimeout.call(null, fun, 0);
33033    } catch (e) {
33034      // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
33035      return cachedSetTimeout.call(this, fun, 0);
33036    }
33037  }
33038}
33039
33040function runClearTimeout(marker) {
33041  if (cachedClearTimeout === clearTimeout) {
33042    //normal enviroments in sane situations
33043    return clearTimeout(marker);
33044  } // if clearTimeout wasn't available but was latter defined
33045
33046
33047  if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
33048    cachedClearTimeout = clearTimeout;
33049    return clearTimeout(marker);
33050  }
33051
33052  try {
33053    // when when somebody has screwed with setTimeout but no I.E. maddness
33054    return cachedClearTimeout(marker);
33055  } catch (e) {
33056    try {
33057      // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
33058      return cachedClearTimeout.call(null, marker);
33059    } catch (e) {
33060      // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
33061      // Some versions of I.E. have different rules for clearTimeout vs setTimeout
33062      return cachedClearTimeout.call(this, marker);
33063    }
33064  }
33065}
33066
33067var queue = [];
33068var draining = false;
33069var currentQueue;
33070var queueIndex = -1;
33071
33072function cleanUpNextTick() {
33073  if (!draining || !currentQueue) {
33074    return;
33075  }
33076
33077  draining = false;
33078
33079  if (currentQueue.length) {
33080    queue = currentQueue.concat(queue);
33081  } else {
33082    queueIndex = -1;
33083  }
33084
33085  if (queue.length) {
33086    drainQueue();
33087  }
33088}
33089
33090function drainQueue() {
33091  if (draining) {
33092    return;
33093  }
33094
33095  var timeout = runTimeout(cleanUpNextTick);
33096  draining = true;
33097  var len = queue.length;
33098
33099  while (len) {
33100    currentQueue = queue;
33101    queue = [];
33102
33103    while (++queueIndex < len) {
33104      if (currentQueue) {
33105        currentQueue[queueIndex].run();
33106      }
33107    }
33108
33109    queueIndex = -1;
33110    len = queue.length;
33111  }
33112
33113  currentQueue = null;
33114  draining = false;
33115  runClearTimeout(timeout);
33116}
33117
33118process.nextTick = function (fun) {
33119  var args = new Array(arguments.length - 1);
33120
33121  if (arguments.length > 1) {
33122    for (var i = 1; i < arguments.length; i++) {
33123      args[i - 1] = arguments[i];
33124    }
33125  }
33126
33127  queue.push(new Item(fun, args));
33128
33129  if (queue.length === 1 && !draining) {
33130    runTimeout(drainQueue);
33131  }
33132}; // v8 likes predictible objects
33133
33134
33135function Item(fun, array) {
33136  this.fun = fun;
33137  this.array = array;
33138}
33139
33140Item.prototype.run = function () {
33141  this.fun.apply(null, this.array);
33142};
33143
33144process.title = 'browser';
33145process.browser = true;
33146process.env = {};
33147process.argv = [];
33148process.version = ''; // empty string to avoid regexp issues
33149
33150process.versions = {};
33151
33152function noop() {}
33153
33154process.on = noop;
33155process.addListener = noop;
33156process.once = noop;
33157process.off = noop;
33158process.removeListener = noop;
33159process.removeAllListeners = noop;
33160process.emit = noop;
33161process.prependListener = noop;
33162process.prependOnceListener = noop;
33163
33164process.listeners = function (name) {
33165  return [];
33166};
33167
33168process.binding = function (name) {
33169  throw new Error('process.binding is not supported');
33170};
33171
33172process.cwd = function () {
33173  return '/';
33174};
33175
33176process.chdir = function (dir) {
33177  throw new Error('process.chdir is not supported');
33178};
33179
33180process.umask = function () {
33181  return 0;
33182};
33183
33184/***/ }),
33185
vendor: 25,406 bytes, lines 33186-33914
33186/***/ "../node_modules/regenerator-runtime/runtime.js":
33187/*!******************************************************!*\
33188  !*** ../node_modules/regenerator-runtime/runtime.js ***!
33189  \******************************************************/
33190/*! no static exports found */
33191/***/ (function(module, exports, __webpack_require__) {
33192
33193/* WEBPACK VAR INJECTION */(function(global, module) {function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
33194
33195/**
33196 * Copyright (c) 2014, Facebook, Inc.
33197 * All rights reserved.
33198 *
33199 * This source code is licensed under the BSD-style license found in the
33200 * https://raw.github.com/facebook/regenerator/master/LICENSE file. An
33201 * additional grant of patent rights can be found in the PATENTS file in
33202 * the same directory.
33203 */
33204!function (global) {
33205  "use strict";
33206
33207  var Op = Object.prototype;
33208  var hasOwn = Op.hasOwnProperty;
33209  var undefined; // More compressible than void 0.
33210
33211  var $Symbol = typeof Symbol === "function" ? Symbol : {};
33212  var iteratorSymbol = $Symbol.iterator || "@@iterator";
33213  var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
33214  var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
33215  var inModule = ( false ? undefined : _typeof(module)) === "object";
33216  var runtime = global.regeneratorRuntime;
33217
33218  if (runtime) {
33219    if (inModule) {
33220      // If regeneratorRuntime is defined globally and we're in a module,
33221      // make the exports object identical to regeneratorRuntime.
33222      module.exports = runtime;
33223    } // Don't bother evaluating the rest of this file if the runtime was
33224    // already defined globally.
33225
33226
33227    return;
33228  } // Define the runtime globally (as expected by generated code) as either
33229  // module.exports (if we're in a module) or a new, empty object.
33230
33231
33232  runtime = global.regeneratorRuntime = inModule ? module.exports : {};
33233
33234  function wrap(innerFn, outerFn, self, tryLocsList) {
33235    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
33236    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
33237    var generator = Object.create(protoGenerator.prototype);
33238    var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next,
33239    // .throw, and .return methods.
33240
33241    generator._invoke = makeInvokeMethod(innerFn, self, context);
33242    return generator;
33243  }
33244
33245  runtime.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion
33246  // record like context.tryEntries[i].completion. This interface could
33247  // have been (and was previously) designed to take a closure to be
33248  // invoked without arguments, but in all the cases we care about we
33249  // already have an existing method we want to call, so there's no need
33250  // to create a new function object. We can even get away with assuming
33251  // the method takes exactly one argument, since that happens to be true
33252  // in every case, so we don't have to touch the arguments object. The
33253  // only additional allocation required is the completion record, which
33254  // has a stable shape and so hopefully should be cheap to allocate.
33255
33256  function tryCatch(fn, obj, arg) {
33257    try {
33258      return {
33259        type: "normal",
33260        arg: fn.call(obj, arg)
33261      };
33262    } catch (err) {
33263      return {
33264        type: "throw",
33265        arg: err
33266      };
33267    }
33268  }
33269
33270  var GenStateSuspendedStart = "suspendedStart";
33271  var GenStateSuspendedYield = "suspendedYield";
33272  var GenStateExecuting = "executing";
33273  var GenStateCompleted = "completed"; // Returning this object from the innerFn has the same effect as
33274  // breaking out of the dispatch switch statement.
33275
33276  var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and
33277  // .constructor.prototype properties for functions that return Generator
33278  // objects. For full spec compliance, you may wish to configure your
33279  // minifier not to mangle the names of these two functions.
33280
33281  function Generator() {}
33282
33283  function GeneratorFunction() {}
33284
33285  function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that
33286  // don't natively support it.
33287
33288
33289  var IteratorPrototype = {};
33290
33291  IteratorPrototype[iteratorSymbol] = function () {
33292    return this;
33293  };
33294
33295  var getProto = Object.getPrototypeOf;
33296  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
33297
33298  if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
33299    // This environment has a native %IteratorPrototype%; use it instead
33300    // of the polyfill.
33301    IteratorPrototype = NativeIteratorPrototype;
33302  }
33303
33304  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
33305  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
33306  GeneratorFunctionPrototype.constructor = GeneratorFunction;
33307  GeneratorFunctionPrototype[toStringTagSymbol] = GeneratorFunction.displayName = "GeneratorFunction"; // Helper for defining the .next, .throw, and .return methods of the
33308  // Iterator interface in terms of a single ._invoke method.
33309
33310  function defineIteratorMethods(prototype) {
33311    ["next", "throw", "return"].forEach(function (method) {
33312      prototype[method] = function (arg) {
33313        return this._invoke(method, arg);
33314      };
33315    });
33316  }
33317
33318  runtime.isGeneratorFunction = function (genFun) {
33319    var ctor = typeof genFun === "function" && genFun.constructor;
33320    return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can
33321    // do is to check its .name property.
33322    (ctor.displayName || ctor.name) === "GeneratorFunction" : false;
33323  };
33324
33325  runtime.mark = function (genFun) {
33326    if (Object.setPrototypeOf) {
33327      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
33328    } else {
33329      genFun.__proto__ = GeneratorFunctionPrototype;
33330
33331      if (!(toStringTagSymbol in genFun)) {
33332        genFun[toStringTagSymbol] = "GeneratorFunction";
33333      }
33334    }
33335
33336    genFun.prototype = Object.create(Gp);
33337    return genFun;
33338  }; // Within the body of any async function, `await x` is transformed to
33339  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
33340  // `hasOwn.call(value, "__await")` to determine if the yielded value is
33341  // meant to be awaited.
33342
33343
33344  runtime.awrap = function (arg) {
33345    return {
33346      __await: arg
33347    };
33348  };
33349
33350  function AsyncIterator(generator) {
33351    function invoke(method, arg, resolve, reject) {
33352      var record = tryCatch(generator[method], generator, arg);
33353
33354      if (record.type === "throw") {
33355        reject(record.arg);
33356      } else {
33357        var result = record.arg;
33358        var value = result.value;
33359
33360        if (value && _typeof(value) === "object" && hasOwn.call(value, "__await")) {
33361          return Promise.resolve(value.__await).then(function (value) {
33362            invoke("next", value, resolve, reject);
33363          }, function (err) {
33364            invoke("throw", err, resolve, reject);
33365          });
33366        }
33367
33368        return Promise.resolve(value).then(function (unwrapped) {
33369          // When a yielded Promise is resolved, its final value becomes
33370          // the .value of the Promise<{value,done}> result for the
33371          // current iteration. If the Promise is rejected, however, the
33372          // result for this iteration will be rejected with the same
33373          // reason. Note that rejections of yielded Promises are not
33374          // thrown back into the generator function, as is the case
33375          // when an awaited Promise is rejected. This difference in
33376          // behavior between yield and await is important, because it
33377          // allows the consumer to decide what to do with the yielded
33378          // rejection (swallow it and continue, manually .throw it back
33379          // into the generator, abandon iteration, whatever). With
33380          // await, by contrast, there is no opportunity to examine the
33381          // rejection reason outside the generator function, so the
33382          // only option is to throw it from the await expression, and
33383          // let the generator function handle the exception.
33384          result.value = unwrapped;
33385          resolve(result);
33386        }, reject);
33387      }
33388    }
33389
33390    if (_typeof(global.process) === "object" && global.process.domain) {
33391      invoke = global.process.domain.bind(invoke);
33392    }
33393
33394    var previousPromise;
33395
33396    function enqueue(method, arg) {
33397      function callInvokeWithMethodAndArg() {
33398        return new Promise(function (resolve, reject) {
33399          invoke(method, arg, resolve, reject);
33400        });
33401      }
33402
33403      return previousPromise = // If enqueue has been called before, then we want to wait until
33404      // all previous Promises have been resolved before calling invoke,
33405      // so that results are always delivered in the correct order. If
33406      // enqueue has not been called before, then it is important to
33407      // call invoke immediately, without waiting on a callback to fire,
33408      // so that the async generator function has the opportunity to do
33409      // any necessary setup in a predictable way. This predictability
33410      // is why the Promise constructor synchronously invokes its
33411      // executor callback, and why async functions synchronously
33412      // execute code before the first await. Since we implement simple
33413      // async functions in terms of async generators, it is especially
33414      // important to get this right, even though it requires care.
33415      previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later
33416      // invocations of the iterator.
33417      callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
33418    } // Define the unified helper method that is used to implement .next,
33419    // .throw, and .return (see defineIteratorMethods).
33420
33421
33422    this._invoke = enqueue;
33423  }
33424
33425  defineIteratorMethods(AsyncIterator.prototype);
33426
33427  AsyncIterator.prototype[asyncIteratorSymbol] = function () {
33428    return this;
33429  };
33430
33431  runtime.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of
33432  // AsyncIterator objects; they just return a Promise for the value of
33433  // the final result produced by the iterator.
33434
33435  runtime.async = function (innerFn, outerFn, self, tryLocsList) {
33436    var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList));
33437    return runtime.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator.
33438    : iter.next().then(function (result) {
33439      return result.done ? result.value : iter.next();
33440    });
33441  };
33442
33443  function makeInvokeMethod(innerFn, self, context) {
33444    var state = GenStateSuspendedStart;
33445    return function invoke(method, arg) {
33446      if (state === GenStateExecuting) {
33447        throw new Error("Generator is already running");
33448      }
33449
33450      if (state === GenStateCompleted) {
33451        if (method === "throw") {
33452          throw arg;
33453        } // Be forgiving, per 25.3.3.3.3 of the spec:
33454        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
33455
33456
33457        return doneResult();
33458      }
33459
33460      context.method = method;
33461      context.arg = arg;
33462
33463      while (true) {
33464        var delegate = context.delegate;
33465
33466        if (delegate) {
33467          var delegateResult = maybeInvokeDelegate(delegate, context);
33468
33469          if (delegateResult) {
33470            if (delegateResult === ContinueSentinel) continue;
33471            return delegateResult;
33472          }
33473        }
33474
33475        if (context.method === "next") {
33476          // Setting context._sent for legacy support of Babel's
33477          // function.sent implementation.
33478          context.sent = context._sent = context.arg;
33479        } else if (context.method === "throw") {
33480          if (state === GenStateSuspendedStart) {
33481            state = GenStateCompleted;
33482            throw context.arg;
33483          }
33484
33485          context.dispatchException(context.arg);
33486        } else if (context.method === "return") {
33487          context.abrupt("return", context.arg);
33488        }
33489
33490        state = GenStateExecuting;
33491        var record = tryCatch(innerFn, self, context);
33492
33493        if (record.type === "normal") {
33494          // If an exception is thrown from innerFn, we leave state ===
33495          // GenStateExecuting and loop back for another invocation.
33496          state = context.done ? GenStateCompleted : GenStateSuspendedYield;
33497
33498          if (record.arg === ContinueSentinel) {
33499            continue;
33500          }
33501
33502          return {
33503            value: record.arg,
33504            done: context.done
33505          };
33506        } else if (record.type === "throw") {
33507          state = GenStateCompleted; // Dispatch the exception by looping back around to the
33508          // context.dispatchException(context.arg) call above.
33509
33510          context.method = "throw";
33511          context.arg = record.arg;
33512        }
33513      }
33514    };
33515  } // Call delegate.iterator[context.method](context.arg) and handle the
33516  // result, either by returning a { value, done } result from the
33517  // delegate iterator, or by modifying context.method and context.arg,
33518  // setting context.delegate to null, and returning the ContinueSentinel.
33519
33520
33521  function maybeInvokeDelegate(delegate, context) {
33522    var method = delegate.iterator[context.method];
33523
33524    if (method === undefined) {
33525      // A .throw or .return when the delegate iterator has no .throw
33526      // method always terminates the yield* loop.
33527      context.delegate = null;
33528
33529      if (context.method === "throw") {
33530        if (delegate.iterator.return) {
33531          // If the delegate iterator has a return method, give it a
33532          // chance to clean up.
33533          context.method = "return";
33534          context.arg = undefined;
33535          maybeInvokeDelegate(delegate, context);
33536
33537          if (context.method === "throw") {
33538            // If maybeInvokeDelegate(context) changed context.method from
33539            // "return" to "throw", let that override the TypeError below.
33540            return ContinueSentinel;
33541          }
33542        }
33543
33544        context.method = "throw";
33545        context.arg = new TypeError("The iterator does not provide a 'throw' method");
33546      }
33547
33548      return ContinueSentinel;
33549    }
33550
33551    var record = tryCatch(method, delegate.iterator, context.arg);
33552
33553    if (record.type === "throw") {
33554      context.method = "throw";
33555      context.arg = record.arg;
33556      context.delegate = null;
33557      return ContinueSentinel;
33558    }
33559
33560    var info = record.arg;
33561
33562    if (!info) {
33563      context.method = "throw";
33564      context.arg = new TypeError("iterator result is not an object");
33565      context.delegate = null;
33566      return ContinueSentinel;
33567    }
33568
33569    if (info.done) {
33570      // Assign the result of the finished delegate to the temporary
33571      // variable specified by delegate.resultName (see delegateYield).
33572      context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield).
33573
33574      context.next = delegate.nextLoc; // If context.method was "throw" but the delegate handled the
33575      // exception, let the outer generator proceed normally. If
33576      // context.method was "next", forget context.arg since it has been
33577      // "consumed" by the delegate iterator. If context.method was
33578      // "return", allow the original .return call to continue in the
33579      // outer generator.
33580
33581      if (context.method !== "return") {
33582        context.method = "next";
33583        context.arg = undefined;
33584      }
33585    } else {
33586      // Re-yield the result returned by the delegate method.
33587      return info;
33588    } // The delegate iterator is finished, so forget it and continue with
33589    // the outer generator.
33590
33591
33592    context.delegate = null;
33593    return ContinueSentinel;
33594  } // Define Generator.prototype.{next,throw,return} in terms of the
33595  // unified ._invoke helper method.
33596
33597
33598  defineIteratorMethods(Gp);
33599  Gp[toStringTagSymbol] = "Generator"; // A Generator should always return itself as the iterator object when the
33600  // @@iterator function is called on it. Some browsers' implementations of the
33601  // iterator prototype chain incorrectly implement this, causing the Generator
33602  // object to not be returned from this call. This ensures that doesn't happen.
33603  // See https://github.com/facebook/regenerator/issues/274 for more details.
33604
33605  Gp[iteratorSymbol] = function () {
33606    return this;
33607  };
33608
33609  Gp.toString = function () {
33610    return "[object Generator]";
33611  };
33612
33613  function pushTryEntry(locs) {
33614    var entry = {
33615      tryLoc: locs[0]
33616    };
33617
33618    if (1 in locs) {
33619      entry.catchLoc = locs[1];
33620    }
33621
33622    if (2 in locs) {
33623      entry.finallyLoc = locs[2];
33624      entry.afterLoc = locs[3];
33625    }
33626
33627    this.tryEntries.push(entry);
33628  }
33629
33630  function resetTryEntry(entry) {
33631    var record = entry.completion || {};
33632    record.type = "normal";
33633    delete record.arg;
33634    entry.completion = record;
33635  }
33636
33637  function Context(tryLocsList) {
33638    // The root entry object (effectively a try statement without a catch
33639    // or a finally block) gives us a place to store values thrown from
33640    // locations where there is no enclosing try statement.
33641    this.tryEntries = [{
33642      tryLoc: "root"
33643    }];
33644    tryLocsList.forEach(pushTryEntry, this);
33645    this.reset(true);
33646  }
33647
33648  runtime.keys = function (object) {
33649    var keys = [];
33650
33651    for (var key in object) {
33652      keys.push(key);
33653    }
33654
33655    keys.reverse(); // Rather than returning an object with a next method, we keep
33656    // things simple and return the next function itself.
33657
33658    return function next() {
33659      while (keys.length) {
33660        var key = keys.pop();
33661
33662        if (key in object) {
33663          next.value = key;
33664          next.done = false;
33665          return next;
33666        }
33667      } // To avoid creating an additional object, we just hang the .value
33668      // and .done properties off the next function object itself. This
33669      // also ensures that the minifier will not anonymize the function.
33670
33671
33672      next.done = true;
33673      return next;
33674    };
33675  };
33676
33677  function values(iterable) {
33678    if (iterable) {
33679      var iteratorMethod = iterable[iteratorSymbol];
33680
33681      if (iteratorMethod) {
33682        return iteratorMethod.call(iterable);
33683      }
33684
33685      if (typeof iterable.next === "function") {
33686        return iterable;
33687      }
33688
33689      if (!isNaN(iterable.length)) {
33690        var i = -1,
33691            next = function next() {
33692          while (++i < iterable.length) {
33693            if (hasOwn.call(iterable, i)) {
33694              next.value = iterable[i];
33695              next.done = false;
33696              return next;
33697            }
33698          }
33699
33700          next.value = undefined;
33701          next.done = true;
33702          return next;
33703        };
33704
33705        return next.next = next;
33706      }
33707    } // Return an iterator with no values.
33708
33709
33710    return {
33711      next: doneResult
33712    };
33713  }
33714
33715  runtime.values = values;
33716
33717  function doneResult() {
33718    return {
33719      value: undefined,
33720      done: true
33721    };
33722  }
33723
33724  Context.prototype = {
33725    constructor: Context,
33726    reset: function reset(skipTempReset) {
33727      this.prev = 0;
33728      this.next = 0; // Resetting context._sent for legacy support of Babel's
33729      // function.sent implementation.
33730
33731      this.sent = this._sent = undefined;
33732      this.done = false;
33733      this.delegate = null;
33734      this.method = "next";
33735      this.arg = undefined;
33736      this.tryEntries.forEach(resetTryEntry);
33737
33738      if (!skipTempReset) {
33739        for (var name in this) {
33740          // Not sure about the optimal order of these conditions:
33741          if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {
33742            this[name] = undefined;
33743          }
33744        }
33745      }
33746    },
33747    stop: function stop() {
33748      this.done = true;
33749      var rootEntry = this.tryEntries[0];
33750      var rootRecord = rootEntry.completion;
33751
33752      if (rootRecord.type === "throw") {
33753        throw rootRecord.arg;
33754      }
33755
33756      return this.rval;
33757    },
33758    dispatchException: function dispatchException(exception) {
33759      if (this.done) {
33760        throw exception;
33761      }
33762
33763      var context = this;
33764
33765      function handle(loc, caught) {
33766        record.type = "throw";
33767        record.arg = exception;
33768        context.next = loc;
33769
33770        if (caught) {
33771          // If the dispatched exception was caught by a catch block,
33772          // then let that catch block handle the exception normally.
33773          context.method = "next";
33774          context.arg = undefined;
33775        }
33776
33777        return !!caught;
33778      }
33779
33780      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
33781        var entry = this.tryEntries[i];
33782        var record = entry.completion;
33783
33784        if (entry.tryLoc === "root") {
33785          // Exception thrown outside of any try block that could handle
33786          // it, so set the completion value of the entire function to
33787          // throw the exception.
33788          return handle("end");
33789        }
33790
33791        if (entry.tryLoc <= this.prev) {
33792          var hasCatch = hasOwn.call(entry, "catchLoc");
33793          var hasFinally = hasOwn.call(entry, "finallyLoc");
33794
33795          if (hasCatch && hasFinally) {
33796            if (this.prev < entry.catchLoc) {
33797              return handle(entry.catchLoc, true);
33798            } else if (this.prev < entry.finallyLoc) {
33799              return handle(entry.finallyLoc);
33800            }
33801          } else if (hasCatch) {
33802            if (this.prev < entry.catchLoc) {
33803              return handle(entry.catchLoc, true);
33804            }
33805          } else if (hasFinally) {
33806            if (this.prev < entry.finallyLoc) {
33807              return handle(entry.finallyLoc);
33808            }
33809          } else {
33810            throw new Error("try statement without catch or finally");
33811          }
33812        }
33813      }
33814    },
33815    abrupt: function abrupt(type, arg) {
33816      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
33817        var entry = this.tryEntries[i];
33818
33819        if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
33820          var finallyEntry = entry;
33821          break;
33822        }
33823      }
33824
33825      if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {
33826        // Ignore the finally entry if control is not jumping to a
33827        // location outside the try/catch block.
33828        finallyEntry = null;
33829      }
33830
33831      var record = finallyEntry ? finallyEntry.completion : {};
33832      record.type = type;
33833      record.arg = arg;
33834
33835      if (finallyEntry) {
33836        this.method = "next";
33837        this.next = finallyEntry.finallyLoc;
33838        return ContinueSentinel;
33839      }
33840
33841      return this.complete(record);
33842    },
33843    complete: function complete(record, afterLoc) {
33844      if (record.type === "throw") {
33845        throw record.arg;
33846      }
33847
33848      if (record.type === "break" || record.type === "continue") {
33849        this.next = record.arg;
33850      } else if (record.type === "return") {
33851        this.rval = this.arg = record.arg;
33852        this.method = "return";
33853        this.next = "end";
33854      } else if (record.type === "normal" && afterLoc) {
33855        this.next = afterLoc;
33856      }
33857
33858      return ContinueSentinel;
33859    },
33860    finish: function finish(finallyLoc) {
33861      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
33862        var entry = this.tryEntries[i];
33863
33864        if (entry.finallyLoc === finallyLoc) {
33865          this.complete(entry.completion, entry.afterLoc);
33866          resetTryEntry(entry);
33867          return ContinueSentinel;
33868        }
33869      }
33870    },
33871    "catch": function _catch(tryLoc) {
33872      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
33873        var entry = this.tryEntries[i];
33874
33875        if (entry.tryLoc === tryLoc) {
33876          var record = entry.completion;
33877
33878          if (record.type === "throw") {
33879            var thrown = record.arg;
33880            resetTryEntry(entry);
33881          }
33882
33883          return thrown;
33884        }
33885      } // The context.catch method must only be called with a location
33886      // argument that corresponds to a known catch block.
33887
33888
33889      throw new Error("illegal catch attempt");
33890    },
33891    delegateYield: function delegateYield(iterable, resultName, nextLoc) {
33892      this.delegate = {
33893        iterator: values(iterable),
33894        resultName: resultName,
33895        nextLoc: nextLoc
33896      };
33897
33898      if (this.method === "next") {
33899        // Deliberately forget the last sent value so that we don't
33900        // accidentally pass it on to the delegate.
33901        this.arg = undefined;
33902      }
33903
33904      return ContinueSentinel;
33905    }
33906  };
33907}( // Among the various tricks for obtaining a reference to the global
33908// object, this seems to be the most reliable technique that does not
33909// use indirect eval (which violates Content Security Policy).
33910(typeof global === "undefined" ? "undefined" : _typeof(global)) === "object" ? global : (typeof window === "undefined" ? "undefined" : _typeof(window)) === "object" ? window : (typeof self === "undefined" ? "undefined" : _typeof(self)) === "object" ? self : this);
33911/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "../node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../webpack/buildin/module.js */ "../node_modules/webpack/buildin/module.js")(module)))
33912
33913/***/ }),
33914
vendor: 261,030 bytes, lines 33915-41448
33915/***/ "../node_modules/twig/twig.js":
33916/*!************************************!*\
33917  !*** ../node_modules/twig/twig.js ***!
33918  \************************************/
33919/*! no static exports found */
33920/***/ (function(module, exports, __webpack_require__) {
33921
33922/* WEBPACK VAR INJECTION */(function(__dirname, module) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof2(obj); }
33923
33924(function webpackUniversalModuleDefinition(root, factory) {
33925  if (( false ? undefined : _typeof2(exports)) === 'object' && ( false ? undefined : _typeof2(module)) === 'object') module.exports = factory(function webpackLoadOptionalExternalModule() {
33926    try {
33927      return __webpack_require__(/*! fs */ 2);
33928    } catch (e) {}
33929  }(), __webpack_require__(/*! path */ "../node_modules/path-browserify/index.js"));else if (true) !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! fs */ 2), __webpack_require__(/*! path */ "../node_modules/path-browserify/index.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
33930				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
33931				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
33932				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));else {}
33933})(this, function (__WEBPACK_EXTERNAL_MODULE_19__, __WEBPACK_EXTERNAL_MODULE_20__) {
33934  return (
33935    /******/
33936    function (modules) {
33937      // webpackBootstrap
33938
33939      /******/
33940      // The module cache
33941
33942      /******/
33943      var installedModules = {};
33944      /******/
33945      // The require function
33946
33947      /******/
33948
33949      function __webpack_require__(moduleId) {
33950        /******/
33951        // Check if module is in cache
33952
33953        /******/
33954        if (installedModules[moduleId])
33955          /******/
33956          return installedModules[moduleId].exports;
33957        /******/
33958        // Create a new module (and put it into the cache)
33959
33960        /******/
33961
33962        var module = installedModules[moduleId] = {
33963          /******/
33964          exports: {},
33965
33966          /******/
33967          id: moduleId,
33968
33969          /******/
33970          loaded: false
33971          /******/
33972
33973        };
33974        /******/
33975        // Execute the module function
33976
33977        /******/
33978
33979        modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
33980        /******/
33981        // Flag the module as loaded
33982
33983        /******/
33984
33985        module.loaded = true;
33986        /******/
33987        // Return the exports of the module
33988
33989        /******/
33990
33991        return module.exports;
33992        /******/
33993      }
33994      /******/
33995      // expose the modules object (__webpack_modules__)
33996
33997      /******/
33998
33999
34000      __webpack_require__.m = modules;
34001      /******/
34002      // expose the module cache
34003
34004      /******/
34005
34006      __webpack_require__.c = installedModules;
34007      /******/
34008      // __webpack_public_path__
34009
34010      /******/
34011
34012      __webpack_require__.p = "";
34013      /******/
34014      // Load entry module and return exports
34015
34016      /******/
34017
34018      return __webpack_require__(0);
34019      /******/
34020    }(
34021    /************************************************************************/
34022
34023    /******/
34024    [
34025    /* 0 */
34026
34027    /***/
34028    function (module, exports, __webpack_require__) {
34029      /**
34030       * Twig.js
34031       *
34032       * @copyright 2011-2016 John Roepke and the Twig.js Contributors
34033       * @license   Available under the BSD 2-Clause License
34034       * @link      https://github.com/twigjs/twig.js
34035       */
34036      var Twig = {
34037        VERSION: '0.10.2'
34038      };
34039
34040      __webpack_require__(1)(Twig);
34041
34042      __webpack_require__(2)(Twig);
34043
34044      __webpack_require__(3)(Twig);
34045
34046      __webpack_require__(5)(Twig);
34047
34048      __webpack_require__(6)(Twig);
34049
34050      __webpack_require__(7)(Twig);
34051
34052      __webpack_require__(17)(Twig);
34053
34054      __webpack_require__(18)(Twig);
34055
34056      __webpack_require__(21)(Twig);
34057
34058      __webpack_require__(22)(Twig);
34059
34060      __webpack_require__(23)(Twig);
34061
34062      __webpack_require__(24)(Twig);
34063
34064      __webpack_require__(25)(Twig);
34065
34066      __webpack_require__(26)(Twig);
34067
34068      __webpack_require__(27)(Twig);
34069
34070      module.exports = Twig.exports;
34071      /***/
34072    },
34073    /* 1 */
34074
34075    /***/
34076    function (module, exports) {
34077      // ## twig.core.js
34078      //
34079      // This file handles template level tokenizing, compiling and parsing.
34080      module.exports = function (Twig) {
34081        "use strict";
34082
34083        Twig.trace = false;
34084        Twig.debug = false; // Default caching to true for the improved performance it offers
34085
34086        Twig.cache = true;
34087
34088        Twig.noop = function () {};
34089
34090        Twig.placeholders = {
34091          parent: "{{|PARENT|}}"
34092        };
34093        /**
34094         * Fallback for Array.indexOf for IE8 et al
34095         */
34096
34097        Twig.indexOf = function (arr, searchElement
34098        /*, fromIndex */
34099        ) {
34100          if (Array.prototype.hasOwnProperty("indexOf")) {
34101            return arr.indexOf(searchElement);
34102          }
34103
34104          if (arr === void 0 || arr === null) {
34105            throw new TypeError();
34106          }
34107
34108          var t = Object(arr);
34109          var len = t.length >>> 0;
34110
34111          if (len === 0) {
34112            return -1;
34113          }
34114
34115          var n = 0;
34116
34117          if (arguments.length > 0) {
34118            n = Number(arguments[1]);
34119
34120            if (n !== n) {
34121              // shortcut for verifying if it's NaN
34122              n = 0;
34123            } else if (n !== 0 && n !== Infinity && n !== -Infinity) {
34124              n = (n > 0 || -1) * Math.floor(Math.abs(n));
34125            }
34126          }
34127
34128          if (n >= len) {
34129            // console.log("indexOf not found1 ", JSON.stringify(searchElement), JSON.stringify(arr));
34130            return -1;
34131          }
34132
34133          var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
34134
34135          for (; k < len; k++) {
34136            if (k in t && t[k] === searchElement) {
34137              return k;
34138            }
34139          }
34140
34141          if (arr == searchElement) {
34142            return 0;
34143          } // console.log("indexOf not found2 ", JSON.stringify(searchElement), JSON.stringify(arr));
34144
34145
34146          return -1;
34147        };
34148
34149        Twig.forEach = function (arr, callback, thisArg) {
34150          if (Array.prototype.forEach) {
34151            return arr.forEach(callback, thisArg);
34152          }
34153
34154          var T, k;
34155
34156          if (arr == null) {
34157            throw new TypeError(" this is null or not defined");
34158          } // 1. Let O be the result of calling ToObject passing the |this| value as the argument.
34159
34160
34161          var O = Object(arr); // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length".
34162          // 3. Let len be ToUint32(lenValue).
34163
34164          var len = O.length >>> 0; // Hack to convert O.length to a UInt32
34165          // 4. If IsCallable(callback) is false, throw a TypeError exception.
34166          // See: http://es5.github.com/#x9.11
34167
34168          if ({}.toString.call(callback) != "[object Function]") {
34169            throw new TypeError(callback + " is not a function");
34170          } // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
34171
34172
34173          if (thisArg) {
34174            T = thisArg;
34175          } // 6. Let k be 0
34176
34177
34178          k = 0; // 7. Repeat, while k < len
34179
34180          while (k < len) {
34181            var kValue; // a. Let Pk be ToString(k).
34182            //   This is implicit for LHS operands of the in operator
34183            // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.
34184            //   This step can be combined with c
34185            // c. If kPresent is true, then
34186
34187            if (k in O) {
34188              // i. Let kValue be the result of calling the Get internal method of O with argument Pk.
34189              kValue = O[k]; // ii. Call the Call internal method of callback with T as the this value and
34190              // argument list containing kValue, k, and O.
34191
34192              callback.call(T, kValue, k, O);
34193            } // d. Increase k by 1.
34194
34195
34196            k++;
34197          } // 8. return undefined
34198
34199        };
34200
34201        Twig.merge = function (target, source, onlyChanged) {
34202          Twig.forEach(Object.keys(source), function (key) {
34203            if (onlyChanged && !(key in target)) {
34204              return;
34205            }
34206
34207            target[key] = source[key];
34208          });
34209          return target;
34210        };
34211        /**
34212         * Exception thrown by twig.js.
34213         */
34214
34215
34216        Twig.Error = function (message, file) {
34217          this.message = message;
34218          this.name = "TwigException";
34219          this.type = "TwigException";
34220          this.file = file;
34221        };
34222        /**
34223         * Get the string representation of a Twig error.
34224         */
34225
34226
34227        Twig.Error.prototype.toString = function () {
34228          var output = this.name + ": " + this.message;
34229          return output;
34230        };
34231        /**
34232         * Wrapper for logging to the console.
34233         */
34234
34235
34236        Twig.log = {
34237          trace: function trace() {
34238            if (Twig.trace && console) {
34239              console.log(Array.prototype.slice.call(arguments));
34240            }
34241          },
34242          debug: function debug() {
34243            if (Twig.debug && console) {
34244              console.log(Array.prototype.slice.call(arguments));
34245            }
34246          }
34247        };
34248
34249        if (typeof console !== "undefined") {
34250          if (typeof console.error !== "undefined") {
34251            Twig.log.error = function () {
34252              console.error.apply(console, arguments);
34253            };
34254          } else if (typeof console.log !== "undefined") {
34255            Twig.log.error = function () {
34256              console.log.apply(console, arguments);
34257            };
34258          }
34259        } else {
34260          Twig.log.error = function () {};
34261        }
34262        /**
34263         * Wrapper for child context objects in Twig.
34264         *
34265         * @param {Object} context Values to initialize the context with.
34266         */
34267
34268
34269        Twig.ChildContext = function (context) {
34270          var ChildContext = function ChildContext() {};
34271
34272          ChildContext.prototype = context;
34273          return new ChildContext();
34274        };
34275        /**
34276         * Container for methods related to handling high level template tokens
34277         *      (for example: {{ expression }}, {% logic %}, {# comment #}, raw data)
34278         */
34279
34280
34281        Twig.token = {};
34282        /**
34283         * Token types.
34284         */
34285
34286        Twig.token.type = {
34287          output: 'output',
34288          logic: 'logic',
34289          comment: 'comment',
34290          raw: 'raw',
34291          output_whitespace_pre: 'output_whitespace_pre',
34292          output_whitespace_post: 'output_whitespace_post',
34293          output_whitespace_both: 'output_whitespace_both',
34294          logic_whitespace_pre: 'logic_whitespace_pre',
34295          logic_whitespace_post: 'logic_whitespace_post',
34296          logic_whitespace_both: 'logic_whitespace_both'
34297        };
34298        /**
34299         * Token syntax definitions.
34300         */
34301
34302        Twig.token.definitions = [{
34303          type: Twig.token.type.raw,
34304          open: '{% raw %}',
34305          close: '{% endraw %}'
34306        }, {
34307          type: Twig.token.type.raw,
34308          open: '{% verbatim %}',
34309          close: '{% endverbatim %}'
34310        }, // *Whitespace type tokens*
34311        //
34312        // These typically take the form `{{- expression -}}` or `{{- expression }}` or `{{ expression -}}`.
34313        {
34314          type: Twig.token.type.output_whitespace_pre,
34315          open: '{{-',
34316          close: '}}'
34317        }, {
34318          type: Twig.token.type.output_whitespace_post,
34319          open: '{{',
34320          close: '-}}'
34321        }, {
34322          type: Twig.token.type.output_whitespace_both,
34323          open: '{{-',
34324          close: '-}}'
34325        }, {
34326          type: Twig.token.type.logic_whitespace_pre,
34327          open: '{%-',
34328          close: '%}'
34329        }, {
34330          type: Twig.token.type.logic_whitespace_post,
34331          open: '{%',
34332          close: '-%}'
34333        }, {
34334          type: Twig.token.type.logic_whitespace_both,
34335          open: '{%-',
34336          close: '-%}'
34337        }, // *Output type tokens*
34338        //
34339        // These typically take the form `{{ expression }}`.
34340        {
34341          type: Twig.token.type.output,
34342          open: '{{',
34343          close: '}}'
34344        }, // *Logic type tokens*
34345        //
34346        // These typically take a form like `{% if expression %}` or `{% endif %}`
34347        {
34348          type: Twig.token.type.logic,
34349          open: '{%',
34350          close: '%}'
34351        }, // *Comment type tokens*
34352        //
34353        // These take the form `{# anything #}`
34354        {
34355          type: Twig.token.type.comment,
34356          open: '{#',
34357          close: '#}'
34358        }];
34359        /**
34360         * What characters start "strings" in token definitions. We need this to ignore token close
34361         * strings inside an expression.
34362         */
34363
34364        Twig.token.strings = ['"', "'"];
34365
34366        Twig.token.findStart = function (template) {
34367          var output = {
34368            position: null,
34369            close_position: null,
34370            def: null
34371          },
34372              i,
34373              token_template,
34374              first_key_position,
34375              close_key_position;
34376
34377          for (i = 0; i < Twig.token.definitions.length; i++) {
34378            token_template = Twig.token.definitions[i];
34379            first_key_position = template.indexOf(token_template.open);
34380            close_key_position = template.indexOf(token_template.close);
34381            Twig.log.trace("Twig.token.findStart: ", "Searching for ", token_template.open, " found at ", first_key_position); //Special handling for mismatched tokens
34382
34383            if (first_key_position >= 0) {
34384              //This token matches the template
34385              if (token_template.open.length !== token_template.close.length) {
34386                //This token has mismatched closing and opening tags
34387                if (close_key_position < 0) {
34388                  //This token's closing tag does not match the template
34389                  continue;
34390                }
34391              }
34392            } // Does this token occur before any other types?
34393
34394
34395            if (first_key_position >= 0 && (output.position === null || first_key_position < output.position)) {
34396              output.position = first_key_position;
34397              output.def = token_template;
34398              output.close_position = close_key_position;
34399            } else if (first_key_position >= 0 && output.position !== null && first_key_position === output.position) {
34400              /*This token exactly matches another token,
34401              greedily match to check if this token has a greater specificity*/
34402              if (token_template.open.length > output.def.open.length) {
34403                //This token's opening tag is more specific than the previous match
34404                output.position = first_key_position;
34405                output.def = token_template;
34406                output.close_position = close_key_position;
34407              } else if (token_template.open.length === output.def.open.length) {
34408                if (token_template.close.length > output.def.close.length) {
34409                  //This token's opening tag is as specific as the previous match,
34410                  //but the closing tag has greater specificity
34411                  if (close_key_position >= 0 && close_key_position < output.close_position) {
34412                    //This token's closing tag exists in the template,
34413                    //and it occurs sooner than the previous match
34414                    output.position = first_key_position;
34415                    output.def = token_template;
34416                    output.close_position = close_key_position;
34417                  }
34418                } else if (close_key_position >= 0 && close_key_position < output.close_position) {
34419                  //This token's closing tag is not more specific than the previous match,
34420                  //but it occurs sooner than the previous match
34421                  output.position = first_key_position;
34422                  output.def = token_template;
34423                  output.close_position = close_key_position;
34424                }
34425              }
34426            }
34427          }
34428
34429          delete output['close_position'];
34430          return output;
34431        };
34432
34433        Twig.token.findEnd = function (template, token_def, start) {
34434          var end = null,
34435              found = false,
34436              offset = 0,
34437              // String position variables
34438          str_pos = null,
34439              str_found = null,
34440              pos = null,
34441              end_offset = null,
34442              this_str_pos = null,
34443              end_str_pos = null,
34444              // For loop variables
34445          i,
34446              l;
34447
34448          while (!found) {
34449            str_pos = null;
34450            str_found = null;
34451            pos = template.indexOf(token_def.close, offset);
34452
34453            if (pos >= 0) {
34454              end = pos;
34455              found = true;
34456            } else {
34457              // throw an exception
34458              throw new Twig.Error("Unable to find closing bracket '" + token_def.close + "'" + " opened near template position " + start);
34459            } // Ignore quotes within comments; just look for the next comment close sequence,
34460            // regardless of what comes before it. https://github.com/justjohn/twig.js/issues/95
34461
34462
34463            if (token_def.type === Twig.token.type.comment) {
34464              break;
34465            } // Ignore quotes within raw tag
34466            // Fixes #283
34467
34468
34469            if (token_def.type === Twig.token.type.raw) {
34470              break;
34471            }
34472
34473            l = Twig.token.strings.length;
34474
34475            for (i = 0; i < l; i += 1) {
34476              this_str_pos = template.indexOf(Twig.token.strings[i], offset);
34477
34478              if (this_str_pos > 0 && this_str_pos < pos && (str_pos === null || this_str_pos < str_pos)) {
34479                str_pos = this_str_pos;
34480                str_found = Twig.token.strings[i];
34481              }
34482            } // We found a string before the end of the token, now find the string's end and set the search offset to it
34483
34484
34485            if (str_pos !== null) {
34486              end_offset = str_pos + 1;
34487              end = null;
34488              found = false;
34489
34490              while (true) {
34491                end_str_pos = template.indexOf(str_found, end_offset);
34492
34493                if (end_str_pos < 0) {
34494                  throw "Unclosed string in template";
34495                } // Ignore escaped quotes
34496
34497
34498                if (template.substr(end_str_pos - 1, 1) !== "\\") {
34499                  offset = end_str_pos + 1;
34500                  break;
34501                } else {
34502                  end_offset = end_str_pos + 1;
34503                }
34504              }
34505            }
34506          }
34507
34508          return end;
34509        };
34510        /**
34511         * Convert a template into high-level tokens.
34512         */
34513
34514
34515        Twig.tokenize = function (template) {
34516          var tokens = [],
34517              // An offset for reporting errors locations in the template.
34518          error_offset = 0,
34519              // The start and type of the first token found in the template.
34520          found_token = null,
34521              // The end position of the matched token.
34522          end = null;
34523
34524          while (template.length > 0) {
34525            // Find the first occurance of any token type in the template
34526            found_token = Twig.token.findStart(template);
34527            Twig.log.trace("Twig.tokenize: ", "Found token: ", found_token);
34528
34529            if (found_token.position !== null) {
34530              // Add a raw type token for anything before the start of the token
34531              if (found_token.position > 0) {
34532                tokens.push({
34533                  type: Twig.token.type.raw,
34534                  value: template.substring(0, found_token.position)
34535                });
34536              }
34537
34538              template = template.substr(found_token.position + found_token.def.open.length);
34539              error_offset += found_token.position + found_token.def.open.length; // Find the end of the token
34540
34541              end = Twig.token.findEnd(template, found_token.def, error_offset);
34542              Twig.log.trace("Twig.tokenize: ", "Token ends at ", end);
34543              tokens.push({
34544                type: found_token.def.type,
34545                value: template.substring(0, end).trim()
34546              });
34547
34548              if (template.substr(end + found_token.def.close.length, 1) === "\n") {
34549                switch (found_token.def.type) {
34550                  case "logic_whitespace_pre":
34551                  case "logic_whitespace_post":
34552                  case "logic_whitespace_both":
34553                  case "logic":
34554                    // Newlines directly after logic tokens are ignored
34555                    end += 1;
34556                    break;
34557                }
34558              }
34559
34560              template = template.substr(end + found_token.def.close.length); // Increment the position in the template
34561
34562              error_offset += end + found_token.def.close.length;
34563            } else {
34564              // No more tokens -> add the rest of the template as a raw-type token
34565              tokens.push({
34566                type: Twig.token.type.raw,
34567                value: template
34568              });
34569              template = '';
34570            }
34571          }
34572
34573          return tokens;
34574        };
34575
34576        Twig.compile = function (tokens) {
34577          try {
34578            // Output and intermediate stacks
34579            var output = [],
34580                stack = [],
34581                // The tokens between open and close tags
34582            intermediate_output = [],
34583                token = null,
34584                logic_token = null,
34585                unclosed_token = null,
34586                // Temporary previous token.
34587            prev_token = null,
34588                // Temporary previous output.
34589            prev_output = null,
34590                // Temporary previous intermediate output.
34591            prev_intermediate_output = null,
34592                // The previous token's template
34593            prev_template = null,
34594                // Token lookahead
34595            next_token = null,
34596                // The output token
34597            tok_output = null,
34598                // Logic Token values
34599            type = null,
34600                open = null,
34601                next = null;
34602
34603            var compile_output = function compile_output(token) {
34604              Twig.expression.compile.apply(this, [token]);
34605
34606              if (stack.length > 0) {
34607                intermediate_output.push(token);
34608              } else {
34609                output.push(token);
34610              }
34611            };
34612
34613            var compile_logic = function compile_logic(token) {
34614              // Compile the logic token
34615              logic_token = Twig.logic.compile.apply(this, [token]);
34616              type = logic_token.type;
34617              open = Twig.logic.handler[type].open;
34618              next = Twig.logic.handler[type].next;
34619              Twig.log.trace("Twig.compile: ", "Compiled logic token to ", logic_token, " next is: ", next, " open is : ", open); // Not a standalone token, check logic stack to see if this is expected
34620
34621              if (open !== undefined && !open) {
34622                prev_token = stack.pop();
34623                prev_template = Twig.logic.handler[prev_token.type];
34624
34625                if (Twig.indexOf(prev_template.next, type) < 0) {
34626                  throw new Error(type + " not expected after a " + prev_token.type);
34627                }
34628
34629                prev_token.output = prev_token.output || [];
34630                prev_token.output = prev_token.output.concat(intermediate_output);
34631                intermediate_output = [];
34632                tok_output = {
34633                  type: Twig.token.type.logic,
34634                  token: prev_token
34635                };
34636
34637                if (stack.length > 0) {
34638                  intermediate_output.push(tok_output);
34639                } else {
34640                  output.push(tok_output);
34641                }
34642              } // This token requires additional tokens to complete the logic structure.
34643
34644
34645              if (next !== undefined && next.length > 0) {
34646                Twig.log.trace("Twig.compile: ", "Pushing ", logic_token, " to logic stack.");
34647
34648                if (stack.length > 0) {
34649                  // Put any currently held output into the output list of the logic operator
34650                  // currently at the head of the stack before we push a new one on.
34651                  prev_token = stack.pop();
34652                  prev_token.output = prev_token.output || [];
34653                  prev_token.output = prev_token.output.concat(intermediate_output);
34654                  stack.push(prev_token);
34655                  intermediate_output = [];
34656                } // Push the new logic token onto the logic stack
34657
34658
34659                stack.push(logic_token);
34660              } else if (open !== undefined && open) {
34661                tok_output = {
34662                  type: Twig.token.type.logic,
34663                  token: logic_token
34664                }; // Standalone token (like {% set ... %}
34665
34666                if (stack.length > 0) {
34667                  intermediate_output.push(tok_output);
34668                } else {
34669                  output.push(tok_output);
34670                }
34671              }
34672            };
34673
34674            while (tokens.length > 0) {
34675              token = tokens.shift();
34676              prev_output = output[output.length - 1];
34677              prev_intermediate_output = intermediate_output[intermediate_output.length - 1];
34678              next_token = tokens[0];
34679              Twig.log.trace("Compiling token ", token);
34680
34681              switch (token.type) {
34682                case Twig.token.type.raw:
34683                  if (stack.length > 0) {
34684                    intermediate_output.push(token);
34685                  } else {
34686                    output.push(token);
34687                  }
34688
34689                  break;
34690
34691                case Twig.token.type.logic:
34692                  compile_logic.call(this, token);
34693                  break;
34694                // Do nothing, comments should be ignored
34695
34696                case Twig.token.type.comment:
34697                  break;
34698
34699                case Twig.token.type.output:
34700                  compile_output.call(this, token);
34701                  break;
34702                //Kill whitespace ahead and behind this token
34703
34704                case Twig.token.type.logic_whitespace_pre:
34705                case Twig.token.type.logic_whitespace_post:
34706                case Twig.token.type.logic_whitespace_both:
34707                case Twig.token.type.output_whitespace_pre:
34708                case Twig.token.type.output_whitespace_post:
34709                case Twig.token.type.output_whitespace_both:
34710                  if (token.type !== Twig.token.type.output_whitespace_post && token.type !== Twig.token.type.logic_whitespace_post) {
34711                    if (prev_output) {
34712                      //If the previous output is raw, pop it off
34713                      if (prev_output.type === Twig.token.type.raw) {
34714                        output.pop(); //If the previous output is not just whitespace, trim it
34715
34716                        if (prev_output.value.match(/^\s*$/) === null) {
34717                          prev_output.value = prev_output.value.trim(); //Repush the previous output
34718
34719                          output.push(prev_output);
34720                        }
34721                      }
34722                    }
34723
34724                    if (prev_intermediate_output) {
34725                      //If the previous intermediate output is raw, pop it off
34726                      if (prev_intermediate_output.type === Twig.token.type.raw) {
34727                        intermediate_output.pop(); //If the previous output is not just whitespace, trim it
34728
34729                        if (prev_intermediate_output.value.match(/^\s*$/) === null) {
34730                          prev_intermediate_output.value = prev_intermediate_output.value.trim(); //Repush the previous intermediate output
34731
34732                          intermediate_output.push(prev_intermediate_output);
34733                        }
34734                      }
34735                    }
34736                  } //Compile this token
34737
34738
34739                  switch (token.type) {
34740                    case Twig.token.type.output_whitespace_pre:
34741                    case Twig.token.type.output_whitespace_post:
34742                    case Twig.token.type.output_whitespace_both:
34743                      compile_output.call(this, token);
34744                      break;
34745
34746                    case Twig.token.type.logic_whitespace_pre:
34747                    case Twig.token.type.logic_whitespace_post:
34748                    case Twig.token.type.logic_whitespace_both:
34749                      compile_logic.call(this, token);
34750                      break;
34751                  }
34752
34753                  if (token.type !== Twig.token.type.output_whitespace_pre && token.type !== Twig.token.type.logic_whitespace_pre) {
34754                    if (next_token) {
34755                      //If the next token is raw, shift it out
34756                      if (next_token.type === Twig.token.type.raw) {
34757                        tokens.shift(); //If the next token is not just whitespace, trim it
34758
34759                        if (next_token.value.match(/^\s*$/) === null) {
34760                          next_token.value = next_token.value.trim(); //Unshift the next token
34761
34762                          tokens.unshift(next_token);
34763                        }
34764                      }
34765                    }
34766                  }
34767
34768                  break;
34769              }
34770
34771              Twig.log.trace("Twig.compile: ", " Output: ", output, " Logic Stack: ", stack, " Pending Output: ", intermediate_output);
34772            } // Verify that there are no logic tokens left in the stack.
34773
34774
34775            if (stack.length > 0) {
34776              unclosed_token = stack.pop();
34777              throw new Error("Unable to find an end tag for " + unclosed_token.type + ", expecting one of " + unclosed_token.next);
34778            }
34779
34780            return output;
34781          } catch (ex) {
34782            if (this.options.rethrow) {
34783              if (ex.type == 'TwigException' && !ex.file) {
34784                ex.file = this.id;
34785              }
34786
34787              throw ex;
34788            } else {
34789              Twig.log.error("Error compiling twig template " + this.id + ": ");
34790
34791              if (ex.stack) {
34792                Twig.log.error(ex.stack);
34793              } else {
34794                Twig.log.error(ex.toString());
34795              }
34796            }
34797          }
34798        };
34799        /**
34800         * Parse a compiled template.
34801         *
34802         * @param {Array} tokens The compiled tokens.
34803         * @param {Object} context The render context.
34804         *
34805         * @return {string} The parsed template.
34806         */
34807
34808
34809        Twig.parse = function (tokens, context, allow_async) {
34810          var that = this,
34811              output = [],
34812              // Store any error that might be thrown by the promise chain.
34813          err = null,
34814              // This will be set to is_async if template renders synchronously
34815          is_async = true,
34816              promise = null,
34817              // Track logic chains
34818          chain = true;
34819
34820          function handleException(ex) {
34821            if (that.options.rethrow) {
34822              if (typeof ex === 'string') {
34823                ex = new Twig.Error(ex);
34824              }
34825
34826              if (ex.type == 'TwigException' && !ex.file) {
34827                ex.file = that.id;
34828              }
34829
34830              throw ex;
34831            } else {
34832              Twig.log.error("Error parsing twig template " + that.id + ": ");
34833
34834              if (ex.stack) {
34835                Twig.log.error(ex.stack);
34836              } else {
34837                Twig.log.error(ex.toString());
34838              }
34839
34840              if (Twig.debug) {
34841                return ex.toString();
34842              }
34843            }
34844          }
34845
34846          promise = Twig.async.forEach(tokens, function parseToken(token) {
34847            Twig.log.debug("Twig.parse: ", "Parsing token: ", token);
34848
34849            switch (token.type) {
34850              case Twig.token.type.raw:
34851                output.push(Twig.filters.raw(token.value));
34852                break;
34853
34854              case Twig.token.type.logic:
34855                var logic_token = token.token;
34856                return Twig.logic.parseAsync.apply(that, [logic_token, context, chain]).then(function (logic) {
34857                  if (logic.chain !== undefined) {
34858                    chain = logic.chain;
34859                  }
34860
34861                  if (logic.context !== undefined) {
34862                    context = logic.context;
34863                  }
34864
34865                  if (logic.output !== undefined) {
34866                    output.push(logic.output);
34867                  }
34868                });
34869                break;
34870
34871              case Twig.token.type.comment:
34872                // Do nothing, comments should be ignored
34873                break;
34874              //Fall through whitespace to output
34875
34876              case Twig.token.type.output_whitespace_pre:
34877              case Twig.token.type.output_whitespace_post:
34878              case Twig.token.type.output_whitespace_both:
34879              case Twig.token.type.output:
34880                Twig.log.debug("Twig.parse: ", "Output token: ", token.stack); // Parse the given expression in the given context
34881
34882                return Twig.expression.parseAsync.apply(that, [token.stack, context]).then(function (o) {
34883                  output.push(o);
34884                });
34885            }
34886          }).then(function () {
34887            output = Twig.output.apply(that, [output]);
34888            is_async = false;
34889            return output;
34890          }).catch(function (e) {
34891            if (allow_async) handleException(e);
34892            err = e;
34893          }); // If `allow_async` we will always return a promise since we do not
34894          // know in advance if we are going to run asynchronously or not.
34895
34896          if (allow_async) return promise; // Handle errors here if we fail synchronously.
34897
34898          if (err !== null) return handleException(err); // If `allow_async` is not true we should not allow the user
34899          // to use asynchronous functions or filters.
34900
34901          if (is_async) throw new Twig.Error('You are using Twig.js in sync mode in combination with async extensions.');
34902          return output;
34903        };
34904        /**
34905         * Tokenize and compile a string template.
34906         *
34907         * @param {string} data The template.
34908         *
34909         * @return {Array} The compiled tokens.
34910         */
34911
34912
34913        Twig.prepare = function (data) {
34914          var tokens, raw_tokens; // Tokenize
34915
34916          Twig.log.debug("Twig.prepare: ", "Tokenizing ", data);
34917          raw_tokens = Twig.tokenize.apply(this, [data]); // Compile
34918
34919          Twig.log.debug("Twig.prepare: ", "Compiling ", raw_tokens);
34920          tokens = Twig.compile.apply(this, [raw_tokens]);
34921          Twig.log.debug("Twig.prepare: ", "Compiled ", tokens);
34922          return tokens;
34923        };
34924        /**
34925         * Join the output token's stack and escape it if needed
34926         *
34927         * @param {Array} Output token's stack
34928         *
34929         * @return {string|String} Autoescaped output
34930         */
34931
34932
34933        Twig.output = function (output) {
34934          if (!this.options.autoescape) {
34935            return output.join("");
34936          }
34937
34938          var strategy = 'html';
34939          if (typeof this.options.autoescape == 'string') strategy = this.options.autoescape; // [].map would be better but it's not supported by IE8-
34940
34941          var escaped_output = [];
34942          Twig.forEach(output, function (str) {
34943            if (str && str.twig_markup !== true && str.twig_markup != strategy) {
34944              str = Twig.filters.escape(str, [strategy]);
34945            }
34946
34947            escaped_output.push(str);
34948          });
34949          return Twig.Markup(escaped_output.join(""));
34950        }; // Namespace for template storage and retrieval
34951
34952
34953        Twig.Templates = {
34954          /**
34955           * Registered template loaders - use Twig.Templates.registerLoader to add supported loaders
34956           * @type {Object}
34957           */
34958          loaders: {},
34959
34960          /**
34961           * Registered template parsers - use Twig.Templates.registerParser to add supported parsers
34962           * @type {Object}
34963           */
34964          parsers: {},
34965
34966          /**
34967           * Cached / loaded templates
34968           * @type {Object}
34969           */
34970          registry: {}
34971        };
34972        /**
34973         * Is this id valid for a twig template?
34974         *
34975         * @param {string} id The ID to check.
34976         *
34977         * @throws {Twig.Error} If the ID is invalid or used.
34978         * @return {boolean} True if the ID is valid.
34979         */
34980
34981        Twig.validateId = function (id) {
34982          if (id === "prototype") {
34983            throw new Twig.Error(id + " is not a valid twig identifier");
34984          } else if (Twig.cache && Twig.Templates.registry.hasOwnProperty(id)) {
34985            throw new Twig.Error("There is already a template with the ID " + id);
34986          }
34987
34988          return true;
34989        };
34990        /**
34991         * Register a template loader
34992         *
34993         * @example
34994         * Twig.extend(function(Twig) {
34995         *    Twig.Templates.registerLoader('custom_loader', function(location, params, callback, error_callback) {
34996         *        // ... load the template ...
34997         *        params.data = loadedTemplateData;
34998         *        // create and return the template
34999         *        var template = new Twig.Template(params);
35000         *        if (typeof callback === 'function') {
35001         *            callback(template);
35002         *        }
35003         *        return template;
35004         *    });
35005         * });
35006         *
35007         * @param {String} method_name The method this loader is intended for (ajax, fs)
35008         * @param {Function} func The function to execute when loading the template
35009         * @param {Object|undefined} scope Optional scope parameter to bind func to
35010         *
35011         * @throws Twig.Error
35012         *
35013         * @return {void}
35014         */
35015
35016
35017        Twig.Templates.registerLoader = function (method_name, func, scope) {
35018          if (typeof func !== 'function') {
35019            throw new Twig.Error('Unable to add loader for ' + method_name + ': Invalid function reference given.');
35020          }
35021
35022          if (scope) {
35023            func = func.bind(scope);
35024          }
35025
35026          this.loaders[method_name] = func;
35027        };
35028        /**
35029         * Remove a registered loader
35030         *
35031         * @param {String} method_name The method name for the loader you wish to remove
35032         *
35033         * @return {void}
35034         */
35035
35036
35037        Twig.Templates.unRegisterLoader = function (method_name) {
35038          if (this.isRegisteredLoader(method_name)) {
35039            delete this.loaders[method_name];
35040          }
35041        };
35042        /**
35043         * See if a loader is registered by its method name
35044         *
35045         * @param {String} method_name The name of the loader you are looking for
35046         *
35047         * @return {boolean}
35048         */
35049
35050
35051        Twig.Templates.isRegisteredLoader = function (method_name) {
35052          return this.loaders.hasOwnProperty(method_name);
35053        };
35054        /**
35055         * Register a template parser
35056         *
35057         * @example
35058         * Twig.extend(function(Twig) {
35059         *    Twig.Templates.registerParser('custom_parser', function(params) {
35060         *        // this template source can be accessed in params.data
35061         *        var template = params.data
35062         *
35063         *        // ... custom process that modifies the template
35064         *
35065         *        // return the parsed template
35066         *        return template;
35067         *    });
35068         * });
35069         *
35070         * @param {String} method_name The method this parser is intended for (twig, source)
35071         * @param {Function} func The function to execute when parsing the template
35072         * @param {Object|undefined} scope Optional scope parameter to bind func to
35073         *
35074         * @throws Twig.Error
35075         *
35076         * @return {void}
35077         */
35078
35079
35080        Twig.Templates.registerParser = function (method_name, func, scope) {
35081          if (typeof func !== 'function') {
35082            throw new Twig.Error('Unable to add parser for ' + method_name + ': Invalid function regerence given.');
35083          }
35084
35085          if (scope) {
35086            func = func.bind(scope);
35087          }
35088
35089          this.parsers[method_name] = func;
35090        };
35091        /**
35092         * Remove a registered parser
35093         *
35094         * @param {String} method_name The method name for the parser you wish to remove
35095         *
35096         * @return {void}
35097         */
35098
35099
35100        Twig.Templates.unRegisterParser = function (method_name) {
35101          if (this.isRegisteredParser(method_name)) {
35102            delete this.parsers[method_name];
35103          }
35104        };
35105        /**
35106         * See if a parser is registered by its method name
35107         *
35108         * @param {String} method_name The name of the parser you are looking for
35109         *
35110         * @return {boolean}
35111         */
35112
35113
35114        Twig.Templates.isRegisteredParser = function (method_name) {
35115          return this.parsers.hasOwnProperty(method_name);
35116        };
35117        /**
35118         * Save a template object to the store.
35119         *
35120         * @param {Twig.Template} template   The twig.js template to store.
35121         */
35122
35123
35124        Twig.Templates.save = function (template) {
35125          if (template.id === undefined) {
35126            throw new Twig.Error("Unable to save template with no id");
35127          }
35128
35129          Twig.Templates.registry[template.id] = template;
35130        };
35131        /**
35132         * Load a previously saved template from the store.
35133         *
35134         * @param {string} id   The ID of the template to load.
35135         *
35136         * @return {Twig.Template} A twig.js template stored with the provided ID.
35137         */
35138
35139
35140        Twig.Templates.load = function (id) {
35141          if (!Twig.Templates.registry.hasOwnProperty(id)) {
35142            return null;
35143          }
35144
35145          return Twig.Templates.registry[id];
35146        };
35147        /**
35148         * Load a template from a remote location using AJAX and saves in with the given ID.
35149         *
35150         * Available parameters:
35151         *
35152         *      async:       Should the HTTP request be performed asynchronously.
35153         *                      Defaults to true.
35154         *      method:      What method should be used to load the template
35155         *                      (fs or ajax)
35156         *      parser:      What method should be used to parse the template
35157         *                      (twig or source)
35158         *      precompiled: Has the template already been compiled.
35159         *
35160         * @param {string} location  The remote URL to load as a template.
35161         * @param {Object} params The template parameters.
35162         * @param {function} callback  A callback triggered when the template finishes loading.
35163         * @param {function} error_callback  A callback triggered if an error occurs loading the template.
35164         *
35165         *
35166         */
35167
35168
35169        Twig.Templates.loadRemote = function (location, params, callback, error_callback) {
35170          var loader; // Default to async
35171
35172          if (params.async === undefined) {
35173            params.async = true;
35174          } // Default to the URL so the template is cached.
35175
35176
35177          if (params.id === undefined) {
35178            params.id = location;
35179          } // Check for existing template
35180
35181
35182          if (Twig.cache && Twig.Templates.registry.hasOwnProperty(params.id)) {
35183            // A template is already saved with the given id.
35184            if (typeof callback === 'function') {
35185              callback(Twig.Templates.registry[params.id]);
35186            } // TODO: if async, return deferred promise
35187
35188
35189            return Twig.Templates.registry[params.id];
35190          } //if the parser name hasn't been set, default it to twig
35191
35192
35193          params.parser = params.parser || 'twig'; // Assume 'fs' if the loader is not defined
35194
35195          loader = this.loaders[params.method] || this.loaders.fs;
35196          return loader.apply(this, arguments);
35197        }; // Determine object type
35198
35199
35200        function is(type, obj) {
35201          var clas = Object.prototype.toString.call(obj).slice(8, -1);
35202          return obj !== undefined && obj !== null && clas === type;
35203        }
35204        /**
35205         * Create a new twig.js template.
35206         *
35207         * Parameters: {
35208         *      data:   The template, either pre-compiled tokens or a string template
35209         *      id:     The name of this template
35210         *      blocks: Any pre-existing block from a child template
35211         * }
35212         *
35213         * @param {Object} params The template parameters.
35214         */
35215
35216
35217        Twig.Template = function (params) {
35218          var data = params.data,
35219              id = params.id,
35220              blocks = params.blocks,
35221              macros = params.macros || {},
35222              base = params.base,
35223              path = params.path,
35224              url = params.url,
35225              name = params.name,
35226              method = params.method,
35227              // parser options
35228          options = params.options; // # What is stored in a Twig.Template
35229          //
35230          // The Twig Template hold several chucks of data.
35231          //
35232          //     {
35233          //          id:     The token ID (if any)
35234          //          tokens: The list of tokens that makes up this template.
35235          //          blocks: The list of block this template contains.
35236          //          base:   The base template (if any)
35237          //            options:  {
35238          //                Compiler/parser options
35239          //
35240          //                strict_variables: true/false
35241          //                    Should missing variable/keys emit an error message. If false, they default to null.
35242          //            }
35243          //     }
35244          //
35245
35246          this.id = id;
35247          this.method = method;
35248          this.base = base;
35249          this.path = path;
35250          this.url = url;
35251          this.name = name;
35252          this.macros = macros;
35253          this.options = options;
35254          this.reset(blocks);
35255
35256          if (is('String', data)) {
35257            this.tokens = Twig.prepare.apply(this, [data]);
35258          } else {
35259            this.tokens = data;
35260          }
35261
35262          if (id !== undefined) {
35263            Twig.Templates.save(this);
35264          }
35265        };
35266
35267        Twig.Template.prototype.reset = function (blocks) {
35268          Twig.log.debug("Twig.Template.reset", "Reseting template " + this.id);
35269          this.blocks = {};
35270          this.importedBlocks = [];
35271          this.originalBlockTokens = {};
35272          this.child = {
35273            blocks: blocks || {}
35274          };
35275          this.extend = null;
35276        };
35277
35278        Twig.Template.prototype.render = function (context, params, allow_async) {
35279          params = params || {};
35280          var that = this,
35281              // Store any error that might be thrown by the promise chain.
35282          err = null,
35283              // This will be set to is_async if template renders synchronously
35284          is_async = true,
35285              promise = null,
35286              result,
35287              url;
35288          this.context = context || {}; // Clear any previous state
35289
35290          this.reset();
35291
35292          if (params.blocks) {
35293            this.blocks = params.blocks;
35294          }
35295
35296          if (params.macros) {
35297            this.macros = params.macros;
35298          }
35299
35300          var cb = function cb(output) {
35301            // Does this template extend another
35302            if (that.extend) {
35303              var ext_template; // check if the template is provided inline
35304
35305              if (that.options.allowInlineIncludes) {
35306                ext_template = Twig.Templates.load(that.extend);
35307
35308                if (ext_template) {
35309                  ext_template.options = that.options;
35310                }
35311              } // check for the template file via include
35312
35313
35314              if (!ext_template) {
35315                url = Twig.path.parsePath(that, that.extend);
35316                ext_template = Twig.Templates.loadRemote(url, {
35317                  method: that.getLoaderMethod(),
35318                  base: that.base,
35319                  async: false,
35320                  id: url,
35321                  options: that.options
35322                });
35323              }
35324
35325              that.parent = ext_template;
35326              return that.parent.renderAsync(that.context, {
35327                blocks: that.blocks
35328              });
35329            }
35330
35331            if (params.output == 'blocks') {
35332              return that.blocks;
35333            } else if (params.output == 'macros') {
35334              return that.macros;
35335            } else {
35336              return output;
35337            }
35338          };
35339
35340          promise = Twig.parseAsync.apply(this, [this.tokens, this.context]).then(cb).then(function (v) {
35341            is_async = false;
35342            result = v;
35343            return v;
35344          }).catch(function (e) {
35345            if (allow_async) throw e;
35346            err = e;
35347          }); // If `allow_async` we will always return a promise since we do not
35348          // know in advance if we are going to run asynchronously or not.
35349
35350          if (allow_async) return promise; // Handle errors here if we fail synchronously.
35351
35352          if (err !== null) throw err; // If `allow_async` is not true we should not allow the user
35353          // to use asynchronous functions or filters.
35354
35355          if (is_async) throw new Twig.Error('You are using Twig.js in sync mode in combination with async extensions.');
35356          return result;
35357        };
35358
35359        Twig.Template.prototype.importFile = function (file) {
35360          var url, sub_template;
35361
35362          if (!this.url && this.options.allowInlineIncludes) {
35363            file = this.path ? Twig.path.parsePath(this, file) : file;
35364            sub_template = Twig.Templates.load(file);
35365
35366            if (!sub_template) {
35367              sub_template = Twig.Templates.loadRemote(url, {
35368                id: file,
35369                method: this.getLoaderMethod(),
35370                async: false,
35371                path: file,
35372                options: this.options
35373              });
35374
35375              if (!sub_template) {
35376                throw new Twig.Error("Unable to find the template " + file);
35377              }
35378            }
35379
35380            sub_template.options = this.options;
35381            return sub_template;
35382          }
35383
35384          url = Twig.path.parsePath(this, file); // Load blocks from an external file
35385
35386          sub_template = Twig.Templates.loadRemote(url, {
35387            method: this.getLoaderMethod(),
35388            base: this.base,
35389            async: false,
35390            options: this.options,
35391            id: url
35392          });
35393          return sub_template;
35394        };
35395
35396        Twig.Template.prototype.importBlocks = function (file, override) {
35397          var sub_template = this.importFile(file),
35398              context = this.context,
35399              that = this,
35400              key;
35401          override = override || false;
35402          sub_template.render(context); // Mixin blocks
35403
35404          Twig.forEach(Object.keys(sub_template.blocks), function (key) {
35405            if (override || that.blocks[key] === undefined) {
35406              that.blocks[key] = sub_template.blocks[key];
35407              that.importedBlocks.push(key);
35408            }
35409          });
35410        };
35411
35412        Twig.Template.prototype.importMacros = function (file) {
35413          var url = Twig.path.parsePath(this, file); // load remote template
35414
35415          var remoteTemplate = Twig.Templates.loadRemote(url, {
35416            method: this.getLoaderMethod(),
35417            async: false,
35418            id: url
35419          });
35420          return remoteTemplate;
35421        };
35422
35423        Twig.Template.prototype.getLoaderMethod = function () {
35424          if (this.path) {
35425            return 'fs';
35426          }
35427
35428          if (this.url) {
35429            return 'ajax';
35430          }
35431
35432          return this.method || 'fs';
35433        };
35434
35435        Twig.Template.prototype.compile = function (options) {
35436          // compile the template into raw JS
35437          return Twig.compiler.compile(this, options);
35438        };
35439        /**
35440         * Create safe output
35441         *
35442         * @param {string} Content safe to output
35443         *
35444         * @return {String} Content wrapped into a String
35445         */
35446
35447
35448        Twig.Markup = function (content, strategy) {
35449          if (typeof strategy == 'undefined') {
35450            strategy = true;
35451          }
35452
35453          if (typeof content === 'string' && content.length > 0) {
35454            content = new String(content);
35455            content.twig_markup = strategy;
35456          }
35457
35458          return content;
35459        };
35460
35461        return Twig;
35462      };
35463      /***/
35464
35465    },
35466    /* 2 */
35467
35468    /***/
35469    function (module, exports) {
35470      // ## twig.compiler.js
35471      //
35472      // This file handles compiling templates into JS
35473      module.exports = function (Twig) {
35474        /**
35475         * Namespace for compilation.
35476         */
35477        Twig.compiler = {
35478          module: {}
35479        }; // Compile a Twig Template to output.
35480
35481        Twig.compiler.compile = function (template, options) {
35482          // Get tokens
35483          var tokens = JSON.stringify(template.tokens),
35484              id = template.id,
35485              output;
35486
35487          if (options.module) {
35488            if (Twig.compiler.module[options.module] === undefined) {
35489              throw new Twig.Error("Unable to find module type " + options.module);
35490            }
35491
35492            output = Twig.compiler.module[options.module](id, tokens, options.twig);
35493          } else {
35494            output = Twig.compiler.wrap(id, tokens);
35495          }
35496
35497          return output;
35498        };
35499
35500        Twig.compiler.module = {
35501          amd: function amd(id, tokens, pathToTwig) {
35502            return 'define(["' + pathToTwig + '"], function (Twig) {\n\tvar twig, templates;\ntwig = Twig.twig;\ntemplates = ' + Twig.compiler.wrap(id, tokens) + '\n\treturn templates;\n});';
35503          },
35504          node: function node(id, tokens) {
35505            return 'var twig = require("twig").twig;\n' + 'exports.template = ' + Twig.compiler.wrap(id, tokens);
35506          },
35507          cjs2: function cjs2(id, tokens, pathToTwig) {
35508            return 'module.declare([{ twig: "' + pathToTwig + '" }], function (require, exports, module) {\n' + '\tvar twig = require("twig").twig;\n' + '\texports.template = ' + Twig.compiler.wrap(id, tokens) + '\n});';
35509          }
35510        };
35511
35512        Twig.compiler.wrap = function (id, tokens) {
35513          return 'twig({id:"' + id.replace('"', '\\"') + '", data:' + tokens + ', precompiled: true});\n';
35514        };
35515
35516        return Twig;
35517      };
35518      /***/
35519
35520    },
35521    /* 3 */
35522
35523    /***/
35524    function (module, exports, __webpack_require__) {
35525      // ## twig.expression.js
35526      //
35527      // This file handles tokenizing, compiling and parsing expressions.
35528      module.exports = function (Twig) {
35529        "use strict";
35530
35531        function parseParams(thisArg, params, context) {
35532          if (params) return Twig.expression.parseAsync.apply(thisArg, [params, context]);
35533          return Twig.Promise.resolve(false);
35534        }
35535        /**
35536         * Namespace for expression handling.
35537         */
35538
35539
35540        Twig.expression = {};
35541
35542        __webpack_require__(4)(Twig);
35543        /**
35544         * Reserved word that can't be used as variable names.
35545         */
35546
35547
35548        Twig.expression.reservedWords = ["true", "false", "null", "TRUE", "FALSE", "NULL", "_context", "and", "b-and", "or", "b-or", "b-xor", "in", "not in", "if"];
35549        /**
35550         * The type of tokens used in expressions.
35551         */
35552
35553        Twig.expression.type = {
35554          comma: 'Twig.expression.type.comma',
35555          operator: {
35556            unary: 'Twig.expression.type.operator.unary',
35557            binary: 'Twig.expression.type.operator.binary'
35558          },
35559          string: 'Twig.expression.type.string',
35560          bool: 'Twig.expression.type.bool',
35561          slice: 'Twig.expression.type.slice',
35562          array: {
35563            start: 'Twig.expression.type.array.start',
35564            end: 'Twig.expression.type.array.end'
35565          },
35566          object: {
35567            start: 'Twig.expression.type.object.start',
35568            end: 'Twig.expression.type.object.end'
35569          },
35570          parameter: {
35571            start: 'Twig.expression.type.parameter.start',
35572            end: 'Twig.expression.type.parameter.end'
35573          },
35574          subexpression: {
35575            start: 'Twig.expression.type.subexpression.start',
35576            end: 'Twig.expression.type.subexpression.end'
35577          },
35578          key: {
35579            period: 'Twig.expression.type.key.period',
35580            brackets: 'Twig.expression.type.key.brackets'
35581          },
35582          filter: 'Twig.expression.type.filter',
35583          _function: 'Twig.expression.type._function',
35584          variable: 'Twig.expression.type.variable',
35585          number: 'Twig.expression.type.number',
35586          _null: 'Twig.expression.type.null',
35587          context: 'Twig.expression.type.context',
35588          test: 'Twig.expression.type.test'
35589        };
35590        Twig.expression.set = {
35591          // What can follow an expression (in general)
35592          operations: [Twig.expression.type.filter, Twig.expression.type.operator.unary, Twig.expression.type.operator.binary, Twig.expression.type.array.end, Twig.expression.type.object.end, Twig.expression.type.parameter.end, Twig.expression.type.subexpression.end, Twig.expression.type.comma, Twig.expression.type.test],
35593          expressions: [Twig.expression.type._function, Twig.expression.type.bool, Twig.expression.type.string, Twig.expression.type.variable, Twig.expression.type.number, Twig.expression.type._null, Twig.expression.type.context, Twig.expression.type.parameter.start, Twig.expression.type.array.start, Twig.expression.type.object.start, Twig.expression.type.subexpression.start, Twig.expression.type.operator.unary]
35594        }; // Most expressions allow a '.' or '[' after them, so we provide a convenience set
35595
35596        Twig.expression.set.operations_extended = Twig.expression.set.operations.concat([Twig.expression.type.key.period, Twig.expression.type.key.brackets, Twig.expression.type.slice]); // Some commonly used compile and parse functions.
35597
35598        Twig.expression.fn = {
35599          compile: {
35600            push: function push(token, stack, output) {
35601              output.push(token);
35602            },
35603            push_both: function push_both(token, stack, output) {
35604              output.push(token);
35605              stack.push(token);
35606            }
35607          },
35608          parse: {
35609            push: function push(token, stack, context) {
35610              stack.push(token);
35611            },
35612            push_value: function push_value(token, stack, context) {
35613              stack.push(token.value);
35614            }
35615          }
35616        }; // The regular expressions and compile/parse logic used to match tokens in expressions.
35617        //
35618        // Properties:
35619        //
35620        //      type:  The type of expression this matches
35621        //
35622        //      regex: One or more regular expressions that matche the format of the token.
35623        //
35624        //      next:  Valid tokens that can occur next in the expression.
35625        //
35626        // Functions:
35627        //
35628        //      compile: A function that compiles the raw regular expression match into a token.
35629        //
35630        //      parse:   A function that parses the compiled token into output.
35631        //
35632
35633        Twig.expression.definitions = [{
35634          type: Twig.expression.type.test,
35635          regex: /^is\s+(not)?\s*([a-zA-Z_][a-zA-Z0-9_]*(\s?as)?)/,
35636          next: Twig.expression.set.operations.concat([Twig.expression.type.parameter.start]),
35637          compile: function compile(token, stack, output) {
35638            token.filter = token.match[2];
35639            token.modifier = token.match[1];
35640            delete token.match;
35641            delete token.value;
35642            output.push(token);
35643          },
35644          parse: function parse(token, stack, context) {
35645            var value = stack.pop();
35646            return parseParams(this, token.params, context).then(function (params) {
35647              var result = Twig.test(token.filter, value, params);
35648
35649              if (token.modifier == 'not') {
35650                stack.push(!result);
35651              } else {
35652                stack.push(result);
35653              }
35654            });
35655          }
35656        }, {
35657          type: Twig.expression.type.comma,
35658          // Match a comma
35659          regex: /^,/,
35660          next: Twig.expression.set.expressions.concat([Twig.expression.type.array.end, Twig.expression.type.object.end]),
35661          compile: function compile(token, stack, output) {
35662            var i = stack.length - 1,
35663                stack_token;
35664            delete token.match;
35665            delete token.value; // pop tokens off the stack until the start of the object
35666
35667            for (; i >= 0; i--) {
35668              stack_token = stack.pop();
35669
35670              if (stack_token.type === Twig.expression.type.object.start || stack_token.type === Twig.expression.type.parameter.start || stack_token.type === Twig.expression.type.array.start) {
35671                stack.push(stack_token);
35672                break;
35673              }
35674
35675              output.push(stack_token);
35676            }
35677
35678            output.push(token);
35679          }
35680        }, {
35681          /**
35682           * Match a number (integer or decimal)
35683           */
35684          type: Twig.expression.type.number,
35685          // match a number
35686          regex: /^\-?\d+(\.\d+)?/,
35687          next: Twig.expression.set.operations,
35688          compile: function compile(token, stack, output) {
35689            token.value = Number(token.value);
35690            output.push(token);
35691          },
35692          parse: Twig.expression.fn.parse.push_value
35693        }, {
35694          type: Twig.expression.type.operator.binary,
35695          // Match any of ?:, +, *, /, -, %, ~, <, <=, >, >=, !=, ==, **, ?, :, and, b-and, or, b-or, b-xor, in, not in
35696          // and, or, in, not in can be followed by a space or parenthesis
35697          regex: /(^\?\:|^(b\-and)|^(b\-or)|^(b\-xor)|^[\+\-~%\?]|^[\:](?!\d\])|^[!=]==?|^[!<>]=?|^\*\*?|^\/\/?|^(and)[\(|\s+]|^(or)[\(|\s+]|^(in)[\(|\s+]|^(not in)[\(|\s+]|^\.\.)/,
35698          next: Twig.expression.set.expressions,
35699          transform: function transform(match, tokens) {
35700            switch (match[0]) {
35701              case 'and(':
35702              case 'or(':
35703              case 'in(':
35704              case 'not in(':
35705                //Strip off the ( if it exists
35706                tokens[tokens.length - 1].value = match[2];
35707                return match[0];
35708                break;
35709
35710              default:
35711                return '';
35712            }
35713          },
35714          compile: function compile(token, stack, output) {
35715            delete token.match;
35716            token.value = token.value.trim();
35717            var value = token.value,
35718                operator = Twig.expression.operator.lookup(value, token);
35719            Twig.log.trace("Twig.expression.compile: ", "Operator: ", operator, " from ", value);
35720
35721            while (stack.length > 0 && (stack[stack.length - 1].type == Twig.expression.type.operator.unary || stack[stack.length - 1].type == Twig.expression.type.operator.binary) && (operator.associativity === Twig.expression.operator.leftToRight && operator.precidence >= stack[stack.length - 1].precidence || operator.associativity === Twig.expression.operator.rightToLeft && operator.precidence > stack[stack.length - 1].precidence)) {
35722              var temp = stack.pop();
35723              output.push(temp);
35724            }
35725
35726            if (value === ":") {
35727              // Check if this is a ternary or object key being set
35728              if (stack[stack.length - 1] && stack[stack.length - 1].value === "?") {// Continue as normal for a ternary
35729              } else {
35730                // This is not a ternary so we push the token to the output where it can be handled
35731                //   when the assocated object is closed.
35732                var key_token = output.pop();
35733
35734                if (key_token.type === Twig.expression.type.string || key_token.type === Twig.expression.type.variable) {
35735                  token.key = key_token.value;
35736                } else if (key_token.type === Twig.expression.type.number) {
35737                  // Convert integer keys into string keys
35738                  token.key = key_token.value.toString();
35739                } else if (key_token.expression && (key_token.type === Twig.expression.type.parameter.end || key_token.type == Twig.expression.type.subexpression.end)) {
35740                  token.params = key_token.params;
35741                } else {
35742                  throw new Twig.Error("Unexpected value before ':' of " + key_token.type + " = " + key_token.value);
35743                }
35744
35745                output.push(token);
35746                return;
35747              }
35748            } else {
35749              stack.push(operator);
35750            }
35751          },
35752          parse: function parse(token, stack, context) {
35753            if (token.key) {
35754              // handle ternary ':' operator
35755              stack.push(token);
35756            } else if (token.params) {
35757              // handle "{(expression):value}"
35758              return Twig.expression.parseAsync.apply(this, [token.params, context]).then(function (key) {
35759                token.key = key;
35760                stack.push(token); //If we're in a loop, we might need token.params later, especially in this form of "(expression):value"
35761
35762                if (!context.loop) {
35763                  delete token.params;
35764                }
35765              });
35766            } else {
35767              Twig.expression.operator.parse(token.value, stack);
35768            }
35769          }
35770        }, {
35771          type: Twig.expression.type.operator.unary,
35772          // Match any of not
35773          regex: /(^not\s+)/,
35774          next: Twig.expression.set.expressions,
35775          compile: function compile(token, stack, output) {
35776            delete token.match;
35777            token.value = token.value.trim();
35778            var value = token.value,
35779                operator = Twig.expression.operator.lookup(value, token);
35780            Twig.log.trace("Twig.expression.compile: ", "Operator: ", operator, " from ", value);
35781
35782            while (stack.length > 0 && (stack[stack.length - 1].type == Twig.expression.type.operator.unary || stack[stack.length - 1].type == Twig.expression.type.operator.binary) && (operator.associativity === Twig.expression.operator.leftToRight && operator.precidence >= stack[stack.length - 1].precidence || operator.associativity === Twig.expression.operator.rightToLeft && operator.precidence > stack[stack.length - 1].precidence)) {
35783              var temp = stack.pop();
35784              output.push(temp);
35785            }
35786
35787            stack.push(operator);
35788          },
35789          parse: function parse(token, stack, context) {
35790            Twig.expression.operator.parse(token.value, stack);
35791          }
35792        }, {
35793          /**
35794           * Match a string. This is anything between a pair of single or double quotes.
35795           */
35796          type: Twig.expression.type.string,
35797          // See: http://blog.stevenlevithan.com/archives/match-quoted-string
35798          regex: /^(["'])(?:(?=(\\?))\2[\s\S])*?\1/,
35799          next: Twig.expression.set.operations_extended,
35800          compile: function compile(token, stack, output) {
35801            var value = token.value;
35802            delete token.match; // Remove the quotes from the string
35803
35804            if (value.substring(0, 1) === '"') {
35805              value = value.replace('\\"', '"');
35806            } else {
35807              value = value.replace("\\'", "'");
35808            }
35809
35810            token.value = value.substring(1, value.length - 1).replace(/\\n/g, "\n").replace(/\\r/g, "\r");
35811            Twig.log.trace("Twig.expression.compile: ", "String value: ", token.value);
35812            output.push(token);
35813          },
35814          parse: Twig.expression.fn.parse.push_value
35815        }, {
35816          /**
35817           * Match a subexpression set start.
35818           */
35819          type: Twig.expression.type.subexpression.start,
35820          regex: /^\(/,
35821          next: Twig.expression.set.expressions.concat([Twig.expression.type.subexpression.end]),
35822          compile: function compile(token, stack, output) {
35823            token.value = '(';
35824            output.push(token);
35825            stack.push(token);
35826          },
35827          parse: Twig.expression.fn.parse.push
35828        }, {
35829          /**
35830           * Match a subexpression set end.
35831           */
35832          type: Twig.expression.type.subexpression.end,
35833          regex: /^\)/,
35834          next: Twig.expression.set.operations_extended,
35835          validate: function validate(match, tokens) {
35836            // Iterate back through previous tokens to ensure we follow a subexpression start
35837            var i = tokens.length - 1,
35838                found_subexpression_start = false,
35839                next_subexpression_start_invalid = false,
35840                unclosed_parameter_count = 0;
35841
35842            while (!found_subexpression_start && i >= 0) {
35843              var token = tokens[i];
35844              found_subexpression_start = token.type === Twig.expression.type.subexpression.start; // If we have previously found a subexpression end, then this subexpression start is the start of
35845              // that subexpression, not the subexpression we are searching for
35846
35847              if (found_subexpression_start && next_subexpression_start_invalid) {
35848                next_subexpression_start_invalid = false;
35849                found_subexpression_start = false;
35850              } // Count parameter tokens to ensure we dont return truthy for a parameter opener
35851
35852
35853              if (token.type === Twig.expression.type.parameter.start) {
35854                unclosed_parameter_count++;
35855              } else if (token.type === Twig.expression.type.parameter.end) {
35856                unclosed_parameter_count--;
35857              } else if (token.type === Twig.expression.type.subexpression.end) {
35858                next_subexpression_start_invalid = true;
35859              }
35860
35861              i--;
35862            } // If we found unclosed parameters, return false
35863            // If we didnt find subexpression start, return false
35864            // Otherwise return true
35865
35866
35867            return found_subexpression_start && unclosed_parameter_count === 0;
35868          },
35869          compile: function compile(token, stack, output) {
35870            // This is basically a copy of parameter end compilation
35871            var stack_token,
35872                end_token = token;
35873            stack_token = stack.pop();
35874
35875            while (stack.length > 0 && stack_token.type != Twig.expression.type.subexpression.start) {
35876              output.push(stack_token);
35877              stack_token = stack.pop();
35878            } // Move contents of parens into preceding filter
35879
35880
35881            var param_stack = [];
35882
35883            while (token.type !== Twig.expression.type.subexpression.start) {
35884              // Add token to arguments stack
35885              param_stack.unshift(token);
35886              token = output.pop();
35887            }
35888
35889            param_stack.unshift(token);
35890            var is_expression = false; //If the token at the top of the *stack* is a function token, pop it onto the output queue.
35891            // Get the token preceding the parameters
35892
35893            stack_token = stack[stack.length - 1];
35894
35895            if (stack_token === undefined || stack_token.type !== Twig.expression.type._function && stack_token.type !== Twig.expression.type.filter && stack_token.type !== Twig.expression.type.test && stack_token.type !== Twig.expression.type.key.brackets) {
35896              end_token.expression = true; // remove start and end token from stack
35897
35898              param_stack.pop();
35899              param_stack.shift();
35900              end_token.params = param_stack;
35901              output.push(end_token);
35902            } else {
35903              // This should never be hit
35904              end_token.expression = false;
35905              stack_token.params = param_stack;
35906            }
35907          },
35908          parse: function parse(token, stack, context) {
35909            var new_array = [],
35910                array_ended = false,
35911                value = null;
35912
35913            if (token.expression) {
35914              return Twig.expression.parseAsync.apply(this, [token.params, context]).then(function (value) {
35915                stack.push(value);
35916              });
35917            } else {
35918              throw new Twig.Error("Unexpected subexpression end when token is not marked as an expression");
35919            }
35920          }
35921        }, {
35922          /**
35923           * Match a parameter set start.
35924           */
35925          type: Twig.expression.type.parameter.start,
35926          regex: /^\(/,
35927          next: Twig.expression.set.expressions.concat([Twig.expression.type.parameter.end]),
35928          validate: function validate(match, tokens) {
35929            var last_token = tokens[tokens.length - 1]; // We can't use the regex to test if we follow a space because expression is trimmed
35930
35931            return last_token && Twig.indexOf(Twig.expression.reservedWords, last_token.value.trim()) < 0;
35932          },
35933          compile: Twig.expression.fn.compile.push_both,
35934          parse: Twig.expression.fn.parse.push
35935        }, {
35936          /**
35937           * Match a parameter set end.
35938           */
35939          type: Twig.expression.type.parameter.end,
35940          regex: /^\)/,
35941          next: Twig.expression.set.operations_extended,
35942          compile: function compile(token, stack, output) {
35943            var stack_token,
35944                end_token = token;
35945            stack_token = stack.pop();
35946
35947            while (stack.length > 0 && stack_token.type != Twig.expression.type.parameter.start) {
35948              output.push(stack_token);
35949              stack_token = stack.pop();
35950            } // Move contents of parens into preceding filter
35951
35952
35953            var param_stack = [];
35954
35955            while (token.type !== Twig.expression.type.parameter.start) {
35956              // Add token to arguments stack
35957              param_stack.unshift(token);
35958              token = output.pop();
35959            }
35960
35961            param_stack.unshift(token);
35962            var is_expression = false; // Get the token preceding the parameters
35963
35964            token = output[output.length - 1];
35965
35966            if (token === undefined || token.type !== Twig.expression.type._function && token.type !== Twig.expression.type.filter && token.type !== Twig.expression.type.test && token.type !== Twig.expression.type.key.brackets) {
35967              end_token.expression = true; // remove start and end token from stack
35968
35969              param_stack.pop();
35970              param_stack.shift();
35971              end_token.params = param_stack;
35972              output.push(end_token);
35973            } else {
35974              end_token.expression = false;
35975              token.params = param_stack;
35976            }
35977          },
35978          parse: function parse(token, stack, context) {
35979            var new_array = [],
35980                array_ended = false,
35981                value = null;
35982
35983            if (token.expression) {
35984              return Twig.expression.parseAsync.apply(this, [token.params, context]).then(function (value) {
35985                stack.push(value);
35986              });
35987            } else {
35988              while (stack.length > 0) {
35989                value = stack.pop(); // Push values into the array until the start of the array
35990
35991                if (value && value.type && value.type == Twig.expression.type.parameter.start) {
35992                  array_ended = true;
35993                  break;
35994                }
35995
35996                new_array.unshift(value);
35997              }
35998
35999              if (!array_ended) {
36000                throw new Twig.Error("Expected end of parameter set.");
36001              }
36002
36003              stack.push(new_array);
36004            }
36005          }
36006        }, {
36007          type: Twig.expression.type.slice,
36008          regex: /^\[(\d*\:\d*)\]/,
36009          next: Twig.expression.set.operations_extended,
36010          compile: function compile(token, stack, output) {
36011            var sliceRange = token.match[1].split(':'); //sliceStart can be undefined when we pass parameters to the slice filter later
36012
36013            var sliceStart = sliceRange[0] ? parseInt(sliceRange[0]) : undefined;
36014            var sliceEnd = sliceRange[1] ? parseInt(sliceRange[1]) : undefined;
36015            token.value = 'slice';
36016            token.params = [sliceStart, sliceEnd]; //sliceEnd can't be undefined as the slice filter doesn't check for this, but it does check the length
36017            //of the params array, so just shorten it.
36018
36019            if (!sliceEnd) {
36020              token.params = [sliceStart];
36021            }
36022
36023            output.push(token);
36024          },
36025          parse: function parse(token, stack, context) {
36026            var input = stack.pop(),
36027                params = token.params;
36028            stack.push(Twig.filter.apply(this, [token.value, input, params]));
36029          }
36030        }, {
36031          /**
36032           * Match an array start.
36033           */
36034          type: Twig.expression.type.array.start,
36035          regex: /^\[/,
36036          next: Twig.expression.set.expressions.concat([Twig.expression.type.array.end]),
36037          compile: Twig.expression.fn.compile.push_both,
36038          parse: Twig.expression.fn.parse.push
36039        }, {
36040          /**
36041           * Match an array end.
36042           */
36043          type: Twig.expression.type.array.end,
36044          regex: /^\]/,
36045          next: Twig.expression.set.operations_extended,
36046          compile: function compile(token, stack, output) {
36047            var i = stack.length - 1,
36048                stack_token; // pop tokens off the stack until the start of the object
36049
36050            for (; i >= 0; i--) {
36051              stack_token = stack.pop();
36052
36053              if (stack_token.type === Twig.expression.type.array.start) {
36054                break;
36055              }
36056
36057              output.push(stack_token);
36058            }
36059
36060            output.push(token);
36061          },
36062          parse: function parse(token, stack, context) {
36063            var new_array = [],
36064                array_ended = false,
36065                value = null;
36066
36067            while (stack.length > 0) {
36068              value = stack.pop(); // Push values into the array until the start of the array
36069
36070              if (value.type && value.type == Twig.expression.type.array.start) {
36071                array_ended = true;
36072                break;
36073              }
36074
36075              new_array.unshift(value);
36076            }
36077
36078            if (!array_ended) {
36079              throw new Twig.Error("Expected end of array.");
36080            }
36081
36082            stack.push(new_array);
36083          }
36084        }, // Token that represents the start of a hash map '}'
36085        //
36086        // Hash maps take the form:
36087        //    { "key": 'value', "another_key": item }
36088        //
36089        // Keys must be quoted (either single or double) and values can be any expression.
36090        {
36091          type: Twig.expression.type.object.start,
36092          regex: /^\{/,
36093          next: Twig.expression.set.expressions.concat([Twig.expression.type.object.end]),
36094          compile: Twig.expression.fn.compile.push_both,
36095          parse: Twig.expression.fn.parse.push
36096        }, // Token that represents the end of a Hash Map '}'
36097        //
36098        // This is where the logic for building the internal
36099        // representation of a hash map is defined.
36100        {
36101          type: Twig.expression.type.object.end,
36102          regex: /^\}/,
36103          next: Twig.expression.set.operations_extended,
36104          compile: function compile(token, stack, output) {
36105            var i = stack.length - 1,
36106                stack_token; // pop tokens off the stack until the start of the object
36107
36108            for (; i >= 0; i--) {
36109              stack_token = stack.pop();
36110
36111              if (stack_token && stack_token.type === Twig.expression.type.object.start) {
36112                break;
36113              }
36114
36115              output.push(stack_token);
36116            }
36117
36118            output.push(token);
36119          },
36120          parse: function parse(end_token, stack, context) {
36121            var new_object = {},
36122                object_ended = false,
36123                token = null,
36124                token_key = null,
36125                has_value = false,
36126                value = null;
36127
36128            while (stack.length > 0) {
36129              token = stack.pop(); // Push values into the array until the start of the object
36130
36131              if (token && token.type && token.type === Twig.expression.type.object.start) {
36132                object_ended = true;
36133                break;
36134              }
36135
36136              if (token && token.type && (token.type === Twig.expression.type.operator.binary || token.type === Twig.expression.type.operator.unary) && token.key) {
36137                if (!has_value) {
36138                  throw new Twig.Error("Missing value for key '" + token.key + "' in object definition.");
36139                }
36140
36141                new_object[token.key] = value; // Preserve the order that elements are added to the map
36142                // This is necessary since JavaScript objects don't
36143                // guarantee the order of keys
36144
36145                if (new_object._keys === undefined) new_object._keys = [];
36146
36147                new_object._keys.unshift(token.key); // reset value check
36148
36149
36150                value = null;
36151                has_value = false;
36152              } else {
36153                has_value = true;
36154                value = token;
36155              }
36156            }
36157
36158            if (!object_ended) {
36159              throw new Twig.Error("Unexpected end of object.");
36160            }
36161
36162            stack.push(new_object);
36163          }
36164        }, // Token representing a filter
36165        //
36166        // Filters can follow any expression and take the form:
36167        //    expression|filter(optional, args)
36168        //
36169        // Filter parsing is done in the Twig.filters namespace.
36170        {
36171          type: Twig.expression.type.filter,
36172          // match a | then a letter or _, then any number of letters, numbers, _ or -
36173          regex: /^\|\s?([a-zA-Z_][a-zA-Z0-9_\-]*)/,
36174          next: Twig.expression.set.operations_extended.concat([Twig.expression.type.parameter.start]),
36175          compile: function compile(token, stack, output) {
36176            token.value = token.match[1];
36177            output.push(token);
36178          },
36179          parse: function parse(token, stack, context) {
36180            var that = this,
36181                input = stack.pop();
36182            return parseParams(this, token.params, context).then(function (params) {
36183              return Twig.filter.apply(that, [token.value, input, params]);
36184            }).then(function (value) {
36185              stack.push(value);
36186            });
36187          }
36188        }, {
36189          type: Twig.expression.type._function,
36190          // match any letter or _, then any number of letters, numbers, _ or - followed by (
36191          regex: /^([a-zA-Z_][a-zA-Z0-9_]*)\s*\(/,
36192          next: Twig.expression.type.parameter.start,
36193          validate: function validate(match, tokens) {
36194            // Make sure this function is not a reserved word
36195            return match[1] && Twig.indexOf(Twig.expression.reservedWords, match[1]) < 0;
36196          },
36197          transform: function transform(match, tokens) {
36198            return '(';
36199          },
36200          compile: function compile(token, stack, output) {
36201            var fn = token.match[1];
36202            token.fn = fn; // cleanup token
36203
36204            delete token.match;
36205            delete token.value;
36206            output.push(token);
36207          },
36208          parse: function parse(token, stack, context) {
36209            var that = this,
36210                fn = token.fn,
36211                value;
36212            return parseParams(this, token.params, context).then(function (params) {
36213              if (Twig.functions[fn]) {
36214                // Get the function from the built-in functions
36215                value = Twig.functions[fn].apply(that, params);
36216              } else if (typeof context[fn] == 'function') {
36217                // Get the function from the user/context defined functions
36218                value = context[fn].apply(context, params);
36219              } else {
36220                throw new Twig.Error(fn + ' function does not exist and is not defined in the context');
36221              }
36222
36223              return value;
36224            }).then(function (result) {
36225              stack.push(result);
36226            });
36227          }
36228        }, // Token representing a variable.
36229        //
36230        // Variables can contain letters, numbers, underscores and
36231        // dashes, but must start with a letter or underscore.
36232        //
36233        // Variables are retrieved from the render context and take
36234        // the value of 'undefined' if the given variable doesn't
36235        // exist in the context.
36236        {
36237          type: Twig.expression.type.variable,
36238          // match any letter or _, then any number of letters, numbers, _ or -
36239          regex: /^[a-zA-Z_][a-zA-Z0-9_]*/,
36240          next: Twig.expression.set.operations_extended.concat([Twig.expression.type.parameter.start]),
36241          compile: Twig.expression.fn.compile.push,
36242          validate: function validate(match, tokens) {
36243            return Twig.indexOf(Twig.expression.reservedWords, match[0]) < 0;
36244          },
36245          parse: function parse(token, stack, context) {
36246            // Get the variable from the context
36247            return Twig.expression.resolveAsync.apply(this, [context[token.value], context]).then(function (value) {
36248              stack.push(value);
36249            });
36250          }
36251        }, {
36252          type: Twig.expression.type.key.period,
36253          regex: /^\.([a-zA-Z0-9_]+)/,
36254          next: Twig.expression.set.operations_extended.concat([Twig.expression.type.parameter.start]),
36255          compile: function compile(token, stack, output) {
36256            token.key = token.match[1];
36257            delete token.match;
36258            delete token.value;
36259            output.push(token);
36260          },
36261          parse: function parse(token, stack, context, next_token) {
36262            var that = this,
36263                key = token.key,
36264                object = stack.pop(),
36265                value;
36266            return parseParams(this, token.params, context).then(function (params) {
36267              if (object === null || object === undefined) {
36268                if (that.options.strict_variables) {
36269                  throw new Twig.Error("Can't access a key " + key + " on an null or undefined object.");
36270                } else {
36271                  value = undefined;
36272                }
36273              } else {
36274                var capitalize = function capitalize(value) {
36275                  return value.substr(0, 1).toUpperCase() + value.substr(1);
36276                }; // Get the variable from the context
36277
36278
36279                if (_typeof2(object) === 'object' && key in object) {
36280                  value = object[key];
36281                } else if (object["get" + capitalize(key)] !== undefined) {
36282                  value = object["get" + capitalize(key)];
36283                } else if (object["is" + capitalize(key)] !== undefined) {
36284                  value = object["is" + capitalize(key)];
36285                } else {
36286                  value = undefined;
36287                }
36288              } // When resolving an expression we need to pass next_token in case the expression is a function
36289
36290
36291              return Twig.expression.resolveAsync.apply(that, [value, context, params, next_token, object]);
36292            }).then(function (result) {
36293              stack.push(result);
36294            });
36295          }
36296        }, {
36297          type: Twig.expression.type.key.brackets,
36298          regex: /^\[([^\]\:]*)\]/,
36299          next: Twig.expression.set.operations_extended.concat([Twig.expression.type.parameter.start]),
36300          compile: function compile(token, stack, output) {
36301            var match = token.match[1];
36302            delete token.value;
36303            delete token.match; // The expression stack for the key
36304
36305            token.stack = Twig.expression.compile({
36306              value: match
36307            }).stack;
36308            output.push(token);
36309          },
36310          parse: function parse(token, stack, context, next_token) {
36311            // Evaluate key
36312            var that = this,
36313                params = null,
36314                object,
36315                value;
36316            return parseParams(this, token.params, context).then(function (parameters) {
36317              params = parameters;
36318              return Twig.expression.parseAsync.apply(that, [token.stack, context]);
36319            }).then(function (key) {
36320              object = stack.pop();
36321
36322              if (object === null || object === undefined) {
36323                if (that.options.strict_variables) {
36324                  throw new Twig.Error("Can't access a key " + key + " on an null or undefined object.");
36325                } else {
36326                  return null;
36327                }
36328              } // Get the variable from the context
36329
36330
36331              if (_typeof2(object) === 'object' && key in object) {
36332                value = object[key];
36333              } else {
36334                value = null;
36335              } // When resolving an expression we need to pass next_token in case the expression is a function
36336
36337
36338              return Twig.expression.resolveAsync.apply(that, [value, object, params, next_token]);
36339            }).then(function (result) {
36340              stack.push(result);
36341            });
36342          }
36343        }, {
36344          /**
36345           * Match a null value.
36346           */
36347          type: Twig.expression.type._null,
36348          // match a number
36349          regex: /^(null|NULL|none|NONE)/,
36350          next: Twig.expression.set.operations,
36351          compile: function compile(token, stack, output) {
36352            delete token.match;
36353            token.value = null;
36354            output.push(token);
36355          },
36356          parse: Twig.expression.fn.parse.push_value
36357        }, {
36358          /**
36359           * Match the context
36360           */
36361          type: Twig.expression.type.context,
36362          regex: /^_context/,
36363          next: Twig.expression.set.operations_extended.concat([Twig.expression.type.parameter.start]),
36364          compile: Twig.expression.fn.compile.push,
36365          parse: function parse(token, stack, context) {
36366            stack.push(context);
36367          }
36368        }, {
36369          /**
36370           * Match a boolean
36371           */
36372          type: Twig.expression.type.bool,
36373          regex: /^(true|TRUE|false|FALSE)/,
36374          next: Twig.expression.set.operations,
36375          compile: function compile(token, stack, output) {
36376            token.value = token.match[0].toLowerCase() === "true";
36377            delete token.match;
36378            output.push(token);
36379          },
36380          parse: Twig.expression.fn.parse.push_value
36381        }];
36382        /**
36383         * Resolve a context value.
36384         *
36385         * If the value is a function, it is executed with a context parameter.
36386         *
36387         * @param {string} key The context object key.
36388         * @param {Object} context The render context.
36389         */
36390
36391        Twig.expression.resolveAsync = function (value, context, params, next_token, object) {
36392          if (typeof value == 'function') {
36393            var promise = Twig.Promise.resolve(params);
36394            /*
36395            If value is a function, it will have been impossible during the compile stage to determine that a following
36396            set of parentheses were parameters for this function.
36397             Those parentheses will have therefore been marked as an expression, with their own parameters, which really
36398            belong to this function.
36399             Those parameters will also need parsing in case they are actually an expression to pass as parameters.
36400             */
36401
36402            if (next_token && next_token.type === Twig.expression.type.parameter.end) {
36403              //When parsing these parameters, we need to get them all back, not just the last item on the stack.
36404              var tokens_are_parameters = true;
36405              promise = promise.then(function () {
36406                return next_token.params && Twig.expression.parseAsync.apply(this, [next_token.params, context, tokens_are_parameters]);
36407              }).then(function (p) {
36408                //Clean up the parentheses tokens on the next loop
36409                next_token.cleanup = true;
36410                return p;
36411              });
36412            }
36413
36414            return promise.then(function (params) {
36415              return value.apply(object || context, params || []);
36416            });
36417          } else {
36418            return Twig.Promise.resolve(value);
36419          }
36420        };
36421
36422        Twig.expression.resolve = function (value, context, params, next_token, object) {
36423          var is_async = true,
36424              result;
36425          Twig.expression.resolveAsync.apply(this, [value, context, params, next_token, object]).then(function (r) {
36426            is_async = false;
36427            result = r;
36428          });
36429          if (is_async) throw new Twig.Error('You are using Twig.js in sync mode in combination with async extensions.');
36430          return result;
36431        };
36432        /**
36433         * Registry for logic handlers.
36434         */
36435
36436
36437        Twig.expression.handler = {};
36438        /**
36439         * Define a new expression type, available at Twig.logic.type.{type}
36440         *
36441         * @param {string} type The name of the new type.
36442         */
36443
36444        Twig.expression.extendType = function (type) {
36445          Twig.expression.type[type] = "Twig.expression.type." + type;
36446        };
36447        /**
36448         * Extend the expression parsing functionality with a new definition.
36449         *
36450         * Token definitions follow this format:
36451         *  {
36452         *      type:     One of Twig.expression.type.[type], either pre-defined or added using
36453         *                    Twig.expression.extendType
36454         *
36455         *      next:     Array of types from Twig.expression.type that can follow this token,
36456         *
36457         *      regex:    A regex or array of regex's that should match the token.
36458         *
36459         *      compile: function(token, stack, output) called when this token is being compiled.
36460         *                   Should return an object with stack and output set.
36461         *
36462         *      parse:   function(token, stack, context) called when this token is being parsed.
36463         *                   Should return an object with stack and context set.
36464         *  }
36465         *
36466         * @param {Object} definition A token definition.
36467         */
36468
36469
36470        Twig.expression.extend = function (definition) {
36471          if (!definition.type) {
36472            throw new Twig.Error("Unable to extend logic definition. No type provided for " + definition);
36473          }
36474
36475          Twig.expression.handler[definition.type] = definition;
36476        }; // Extend with built-in expressions
36477
36478
36479        while (Twig.expression.definitions.length > 0) {
36480          Twig.expression.extend(Twig.expression.definitions.shift());
36481        }
36482        /**
36483         * Break an expression into tokens defined in Twig.expression.definitions.
36484         *
36485         * @param {string} expression The string to tokenize.
36486         *
36487         * @return {Array} An array of tokens.
36488         */
36489
36490
36491        Twig.expression.tokenize = function (expression) {
36492          var tokens = [],
36493              // Keep an offset of the location in the expression for error messages.
36494          exp_offset = 0,
36495              // The valid next tokens of the previous token
36496          next = null,
36497              // Match information
36498          type,
36499              regex,
36500              regex_array,
36501              // The possible next token for the match
36502          token_next,
36503              // Has a match been found from the definitions
36504          match_found,
36505              invalid_matches = [],
36506              match_function;
36507
36508          match_function = function match_function() {
36509            var match = Array.prototype.slice.apply(arguments),
36510                string = match.pop(),
36511                offset = match.pop();
36512            Twig.log.trace("Twig.expression.tokenize", "Matched a ", type, " regular expression of ", match);
36513
36514            if (next && Twig.indexOf(next, type) < 0) {
36515              invalid_matches.push(type + " cannot follow a " + tokens[tokens.length - 1].type + " at template:" + exp_offset + " near '" + match[0].substring(0, 20) + "...'"); // Not a match, don't change the expression
36516
36517              return match[0];
36518            } // Validate the token if a validation function is provided
36519
36520
36521            if (Twig.expression.handler[type].validate && !Twig.expression.handler[type].validate(match, tokens)) {
36522              return match[0];
36523            }
36524
36525            invalid_matches = [];
36526            tokens.push({
36527              type: type,
36528              value: match[0],
36529              match: match
36530            });
36531            match_found = true;
36532            next = token_next;
36533            exp_offset += match[0].length; // Does the token need to return output back to the expression string
36534            // e.g. a function match of cycle( might return the '(' back to the expression
36535            // This allows look-ahead to differentiate between token types (e.g. functions and variable names)
36536
36537            if (Twig.expression.handler[type].transform) {
36538              return Twig.expression.handler[type].transform(match, tokens);
36539            }
36540
36541            return '';
36542          };
36543
36544          Twig.log.debug("Twig.expression.tokenize", "Tokenizing expression ", expression);
36545
36546          while (expression.length > 0) {
36547            expression = expression.trim();
36548
36549            for (type in Twig.expression.handler) {
36550              if (Twig.expression.handler.hasOwnProperty(type)) {
36551                token_next = Twig.expression.handler[type].next;
36552                regex = Twig.expression.handler[type].regex;
36553                Twig.log.trace("Checking type ", type, " on ", expression);
36554
36555                if (regex instanceof Array) {
36556                  regex_array = regex;
36557                } else {
36558                  regex_array = [regex];
36559                }
36560
36561                match_found = false;
36562
36563                while (regex_array.length > 0) {
36564                  regex = regex_array.pop();
36565                  expression = expression.replace(regex, match_function);
36566                } // An expression token has been matched. Break the for loop and start trying to
36567                //  match the next template (if expression isn't empty.)
36568
36569
36570                if (match_found) {
36571                  break;
36572                }
36573              }
36574            }
36575
36576            if (!match_found) {
36577              if (invalid_matches.length > 0) {
36578                throw new Twig.Error(invalid_matches.join(" OR "));
36579              } else {
36580                throw new Twig.Error("Unable to parse '" + expression + "' at template position" + exp_offset);
36581              }
36582            }
36583          }
36584
36585          Twig.log.trace("Twig.expression.tokenize", "Tokenized to ", tokens);
36586          return tokens;
36587        };
36588        /**
36589         * Compile an expression token.
36590         *
36591         * @param {Object} raw_token The uncompiled token.
36592         *
36593         * @return {Object} The compiled token.
36594         */
36595
36596
36597        Twig.expression.compile = function (raw_token) {
36598          var expression = raw_token.value,
36599              // Tokenize expression
36600          tokens = Twig.expression.tokenize(expression),
36601              token = null,
36602              output = [],
36603              stack = [],
36604              token_template = null;
36605          Twig.log.trace("Twig.expression.compile: ", "Compiling ", expression); // Push tokens into RPN stack using the Shunting-yard algorithm
36606          // See http://en.wikipedia.org/wiki/Shunting_yard_algorithm
36607
36608          while (tokens.length > 0) {
36609            token = tokens.shift();
36610            token_template = Twig.expression.handler[token.type];
36611            Twig.log.trace("Twig.expression.compile: ", "Compiling ", token); // Compile the template
36612
36613            token_template.compile && token_template.compile(token, stack, output);
36614            Twig.log.trace("Twig.expression.compile: ", "Stack is", stack);
36615            Twig.log.trace("Twig.expression.compile: ", "Output is", output);
36616          }
36617
36618          while (stack.length > 0) {
36619            output.push(stack.pop());
36620          }
36621
36622          Twig.log.trace("Twig.expression.compile: ", "Final output is", output);
36623          raw_token.stack = output;
36624          delete raw_token.value;
36625          return raw_token;
36626        };
36627        /**
36628         * Parse an RPN expression stack within a context.
36629         *
36630         * @param {Array} tokens An array of compiled expression tokens.
36631         * @param {Object} context The render context to parse the tokens with.
36632         *
36633         * @return {Object} The result of parsing all the tokens. The result
36634         *                  can be anything, String, Array, Object, etc... based on
36635         *                  the given expression.
36636         */
36637
36638
36639        Twig.expression.parse = function (tokens, context, tokens_are_parameters, allow_async) {
36640          var that = this; // If the token isn't an array, make it one.
36641
36642          if (!(tokens instanceof Array)) {
36643            tokens = [tokens];
36644          } // The output stack
36645
36646
36647          var stack = [],
36648              next_token,
36649              output = null,
36650              promise = null,
36651              is_async = true,
36652              token_template = null,
36653              loop_token_fixups = [];
36654          promise = Twig.async.forEach(tokens, function (token, index) {
36655            //If the token is marked for cleanup, we don't need to parse it
36656            if (token.cleanup) {
36657              return;
36658            }
36659
36660            var result = null; //Determine the token that follows this one so that we can pass it to the parser
36661
36662            if (tokens.length > index + 1) {
36663              next_token = tokens[index + 1];
36664            }
36665
36666            token_template = Twig.expression.handler[token.type];
36667            if (token_template.parse) result = token_template.parse.apply(that, [token, stack, context, next_token]); //Store any binary tokens for later if we are in a loop.
36668
36669            if (context.loop && token.type === Twig.expression.type.operator.binary) {
36670              loop_token_fixups.push(token);
36671            }
36672
36673            return result;
36674          }).then(function () {
36675            //Check every fixup and remove "key" as long as they still have "params". This covers the use case where
36676            //a ":" operator is used in a loop with a "(expression):" statement. We need to be able to evaluate the expression
36677            Twig.forEach(loop_token_fixups, function (loop_token_fixup) {
36678              if (loop_token_fixup.params && loop_token_fixup.key) {
36679                delete loop_token_fixup["key"];
36680              }
36681            }); //If parse has been called with a set of tokens that are parameters, we need to return the whole stack,
36682            //wrapped in an Array.
36683
36684            if (tokens_are_parameters) {
36685              var params = [];
36686
36687              while (stack.length > 0) {
36688                params.unshift(stack.pop());
36689              }
36690
36691              stack.push(params);
36692            }
36693
36694            if (allow_async) return Twig.Promise.resolve(stack.pop());
36695          }).then(function (v) {
36696            is_async = false;
36697            return v;
36698          });
36699          if (allow_async) return promise;
36700          if (is_async) throw new Twig.Error('You are using Twig.js in sync mode in combination with async extensions.'); // Pop the final value off the stack
36701
36702          return stack.pop();
36703        };
36704
36705        return Twig;
36706      };
36707      /***/
36708
36709    },
36710    /* 4 */
36711
36712    /***/
36713    function (module, exports) {
36714      // ## twig.expression.operator.js
36715      //
36716      // This file handles operator lookups and parsing.
36717      module.exports = function (Twig) {
36718        "use strict";
36719        /**
36720         * Operator associativity constants.
36721         */
36722
36723        Twig.expression.operator = {
36724          leftToRight: 'leftToRight',
36725          rightToLeft: 'rightToLeft'
36726        };
36727
36728        var containment = function containment(a, b) {
36729          if (b === undefined || b === null) {
36730            return null;
36731          } else if (b.indexOf !== undefined) {
36732            // String
36733            return a === b || a !== '' && b.indexOf(a) > -1;
36734          } else {
36735            var el;
36736
36737            for (el in b) {
36738              if (b.hasOwnProperty(el) && b[el] === a) {
36739                return true;
36740              }
36741            }
36742
36743            return false;
36744          }
36745        };
36746        /**
36747         * Get the precidence and associativity of an operator. These follow the order that C/C++ use.
36748         * See http://en.wikipedia.org/wiki/Operators_in_C_and_C++ for the table of values.
36749         */
36750
36751
36752        Twig.expression.operator.lookup = function (operator, token) {
36753          switch (operator) {
36754            case "..":
36755              token.precidence = 20;
36756              token.associativity = Twig.expression.operator.leftToRight;
36757              break;
36758
36759            case ',':
36760              token.precidence = 18;
36761              token.associativity = Twig.expression.operator.leftToRight;
36762              break;
36763            // Ternary
36764
36765            case '?:':
36766            case '?':
36767            case ':':
36768              token.precidence = 16;
36769              token.associativity = Twig.expression.operator.rightToLeft;
36770              break;
36771
36772            case 'or':
36773              token.precidence = 14;
36774              token.associativity = Twig.expression.operator.leftToRight;
36775              break;
36776
36777            case 'and':
36778              token.precidence = 13;
36779              token.associativity = Twig.expression.operator.leftToRight;
36780              break;
36781
36782            case 'b-or':
36783              token.precidence = 12;
36784              token.associativity = Twig.expression.operator.leftToRight;
36785              break;
36786
36787            case 'b-xor':
36788              token.precidence = 11;
36789              token.associativity = Twig.expression.operator.leftToRight;
36790              break;
36791
36792            case 'b-and':
36793              token.precidence = 10;
36794              token.associativity = Twig.expression.operator.leftToRight;
36795              break;
36796
36797            case '==':
36798            case '!=':
36799              token.precidence = 9;
36800              token.associativity = Twig.expression.operator.leftToRight;
36801              break;
36802
36803            case '<':
36804            case '<=':
36805            case '>':
36806            case '>=':
36807            case 'not in':
36808            case 'in':
36809              token.precidence = 8;
36810              token.associativity = Twig.expression.operator.leftToRight;
36811              break;
36812
36813            case '~': // String concatination
36814
36815            case '+':
36816            case '-':
36817              token.precidence = 6;
36818              token.associativity = Twig.expression.operator.leftToRight;
36819              break;
36820
36821            case '//':
36822            case '**':
36823            case '*':
36824            case '/':
36825            case '%':
36826              token.precidence = 5;
36827              token.associativity = Twig.expression.operator.leftToRight;
36828              break;
36829
36830            case 'not':
36831              token.precidence = 3;
36832              token.associativity = Twig.expression.operator.rightToLeft;
36833              break;
36834
36835            default:
36836              throw new Twig.Error("Failed to lookup operator: " + operator + " is an unknown operator.");
36837          }
36838
36839          token.operator = operator;
36840          return token;
36841        };
36842        /**
36843         * Handle operations on the RPN stack.
36844         *
36845         * Returns the updated stack.
36846         */
36847
36848
36849        Twig.expression.operator.parse = function (operator, stack) {
36850          Twig.log.trace("Twig.expression.operator.parse: ", "Handling ", operator);
36851          var a, b, c;
36852
36853          if (operator === '?') {
36854            c = stack.pop();
36855          }
36856
36857          b = stack.pop();
36858
36859          if (operator !== 'not') {
36860            a = stack.pop();
36861          }
36862
36863          if (operator !== 'in' && operator !== 'not in') {
36864            if (a && Array.isArray(a)) {
36865              a = a.length;
36866            }
36867
36868            if (b && Array.isArray(b)) {
36869              b = b.length;
36870            }
36871          }
36872
36873          switch (operator) {
36874            case ':':
36875              // Ignore
36876              break;
36877
36878            case '?:':
36879              if (Twig.lib.boolval(a)) {
36880                stack.push(a);
36881              } else {
36882                stack.push(b);
36883              }
36884
36885              break;
36886
36887            case '?':
36888              if (a === undefined) {
36889                //An extended ternary.
36890                a = b;
36891                b = c;
36892                c = undefined;
36893              }
36894
36895              if (Twig.lib.boolval(a)) {
36896                stack.push(b);
36897              } else {
36898                stack.push(c);
36899              }
36900
36901              break;
36902
36903            case '+':
36904              b = parseFloat(b);
36905              a = parseFloat(a);
36906              stack.push(a + b);
36907              break;
36908
36909            case '-':
36910              b = parseFloat(b);
36911              a = parseFloat(a);
36912              stack.push(a - b);
36913              break;
36914
36915            case '*':
36916              b = parseFloat(b);
36917              a = parseFloat(a);
36918              stack.push(a * b);
36919              break;
36920
36921            case '/':
36922              b = parseFloat(b);
36923              a = parseFloat(a);
36924              stack.push(a / b);
36925              break;
36926
36927            case '//':
36928              b = parseFloat(b);
36929              a = parseFloat(a);
36930              stack.push(Math.floor(a / b));
36931              break;
36932
36933            case '%':
36934              b = parseFloat(b);
36935              a = parseFloat(a);
36936              stack.push(a % b);
36937              break;
36938
36939            case '~':
36940              stack.push((a != null ? a.toString() : "") + (b != null ? b.toString() : ""));
36941              break;
36942
36943            case 'not':
36944            case '!':
36945              stack.push(!Twig.lib.boolval(b));
36946              break;
36947
36948            case '<':
36949              stack.push(a < b);
36950              break;
36951
36952            case '<=':
36953              stack.push(a <= b);
36954              break;
36955
36956            case '>':
36957              stack.push(a > b);
36958              break;
36959
36960            case '>=':
36961              stack.push(a >= b);
36962              break;
36963
36964            case '===':
36965              stack.push(a === b);
36966              break;
36967
36968            case '==':
36969              stack.push(a == b);
36970              break;
36971
36972            case '!==':
36973              stack.push(a !== b);
36974              break;
36975
36976            case '!=':
36977              stack.push(a != b);
36978              break;
36979
36980            case 'or':
36981              stack.push(a || b);
36982              break;
36983
36984            case 'b-or':
36985              stack.push(a | b);
36986              break;
36987
36988            case 'b-xor':
36989              stack.push(a ^ b);
36990              break;
36991
36992            case 'and':
36993              stack.push(a && b);
36994              break;
36995
36996            case 'b-and':
36997              stack.push(a & b);
36998              break;
36999
37000            case '**':
37001              stack.push(Math.pow(a, b));
37002              break;
37003
37004            case 'not in':
37005              stack.push(!containment(a, b));
37006              break;
37007
37008            case 'in':
37009              stack.push(containment(a, b));
37010              break;
37011
37012            case '..':
37013              stack.push(Twig.functions.range(a, b));
37014              break;
37015
37016            default:
37017              debugger;
37018              throw new Twig.Error("Failed to parse operator: " + operator + " is an unknown operator.");
37019          }
37020        };
37021
37022        return Twig;
37023      };
37024      /***/
37025
37026    },
37027    /* 5 */
37028
37029    /***/
37030    function (module, exports) {
37031      // ## twig.filters.js
37032      //
37033      // This file handles parsing filters.
37034      module.exports = function (Twig) {
37035        // Determine object type
37036        function is(type, obj) {
37037          var clas = Object.prototype.toString.call(obj).slice(8, -1);
37038          return obj !== undefined && obj !== null && clas === type;
37039        }
37040
37041        Twig.filters = {
37042          // String Filters
37043          upper: function upper(value) {
37044            if (typeof value !== "string") {
37045              return value;
37046            }
37047
37048            return value.toUpperCase();
37049          },
37050          lower: function lower(value) {
37051            if (typeof value !== "string") {
37052              return value;
37053            }
37054
37055            return value.toLowerCase();
37056          },
37057          capitalize: function capitalize(value) {
37058            if (typeof value !== "string") {
37059              return value;
37060            }
37061
37062            return value.substr(0, 1).toUpperCase() + value.toLowerCase().substr(1);
37063          },
37064          title: function title(value) {
37065            if (typeof value !== "string") {
37066              return value;
37067            }
37068
37069            return value.toLowerCase().replace(/(^|\s)([a-z])/g, function (m, p1, p2) {
37070              return p1 + p2.toUpperCase();
37071            });
37072          },
37073          length: function length(value) {
37074            if (Twig.lib.is("Array", value) || typeof value === "string") {
37075              return value.length;
37076            } else if (Twig.lib.is("Object", value)) {
37077              if (value._keys === undefined) {
37078                return Object.keys(value).length;
37079              } else {
37080                return value._keys.length;
37081              }
37082            } else {
37083              return 0;
37084            }
37085          },
37086          // Array/Object Filters
37087          reverse: function reverse(value) {
37088            if (is("Array", value)) {
37089              return value.reverse();
37090            } else if (is("String", value)) {
37091              return value.split("").reverse().join("");
37092            } else if (is("Object", value)) {
37093              var keys = value._keys || Object.keys(value).reverse();
37094              value._keys = keys;
37095              return value;
37096            }
37097          },
37098          sort: function sort(value) {
37099            if (is("Array", value)) {
37100              return value.sort();
37101            } else if (is('Object', value)) {
37102              // Sorting objects isn't obvious since the order of
37103              // returned keys isn't guaranteed in JavaScript.
37104              // Because of this we use a "hidden" key called _keys to
37105              // store the keys in the order we want to return them.
37106              delete value._keys;
37107              var keys = Object.keys(value),
37108                  sorted_keys = keys.sort(function (a, b) {
37109                var a1, a2; // if a and b are comparable, we're fine :-)
37110
37111                if (value[a] > value[b] == !(value[a] <= value[b])) {
37112                  return value[a] > value[b] ? 1 : value[a] < value[b] ? -1 : 0;
37113                } // if a and b can be parsed as numbers, we can compare
37114                // their numeric value
37115                else if (!isNaN(a1 = parseFloat(value[a])) && !isNaN(b1 = parseFloat(value[b]))) {
37116                    return a1 > b1 ? 1 : a1 < b1 ? -1 : 0;
37117                  } // if one of the values is a string, we convert the
37118                  // other value to string as well
37119                  else if (typeof value[a] == 'string') {
37120                      return value[a] > value[b].toString() ? 1 : value[a] < value[b].toString() ? -1 : 0;
37121                    } else if (typeof value[b] == 'string') {
37122                      return value[a].toString() > value[b] ? 1 : value[a].toString() < value[b] ? -1 : 0;
37123                    } // everything failed - return 'null' as sign, that
37124                    // the values are not comparable
37125                    else {
37126                        return null;
37127                      }
37128              });
37129              value._keys = sorted_keys;
37130              return value;
37131            }
37132          },
37133          keys: function keys(value) {
37134            if (value === undefined || value === null) {
37135              return;
37136            }
37137
37138            var keyset = value._keys || Object.keys(value),
37139                output = [];
37140            Twig.forEach(keyset, function (key) {
37141              if (key === "_keys") return; // Ignore the _keys property
37142
37143              if (value.hasOwnProperty(key)) {
37144                output.push(key);
37145              }
37146            });
37147            return output;
37148          },
37149          url_encode: function url_encode(value) {
37150            if (value === undefined || value === null) {
37151              return;
37152            }
37153
37154            var result = encodeURIComponent(value);
37155            result = result.replace("'", "%27");
37156            return result;
37157          },
37158          join: function join(value, params) {
37159            if (value === undefined || value === null) {
37160              return;
37161            }
37162
37163            var join_str = "",
37164                output = [],
37165                keyset = null;
37166
37167            if (params && params[0]) {
37168              join_str = params[0];
37169            }
37170
37171            if (is("Array", value)) {
37172              output = value;
37173            } else {
37174              keyset = value._keys || Object.keys(value);
37175              Twig.forEach(keyset, function (key) {
37176                if (key === "_keys") return; // Ignore the _keys property
37177
37178                if (value.hasOwnProperty(key)) {
37179                  output.push(value[key]);
37180                }
37181              });
37182            }
37183
37184            return output.join(join_str);
37185          },
37186          "default": function _default(value, params) {
37187            if (params !== undefined && params.length > 1) {
37188              throw new Twig.Error("default filter expects one argument");
37189            }
37190
37191            if (value === undefined || value === null || value === '') {
37192              if (params === undefined) {
37193                return '';
37194              }
37195
37196              return params[0];
37197            } else {
37198              return value;
37199            }
37200          },
37201          json_encode: function json_encode(value) {
37202            if (value === undefined || value === null) {
37203              return "null";
37204            } else if (_typeof2(value) == 'object' && is("Array", value)) {
37205              output = [];
37206              Twig.forEach(value, function (v) {
37207                output.push(Twig.filters.json_encode(v));
37208              });
37209              return "[" + output.join(",") + "]";
37210            } else if (_typeof2(value) == 'object') {
37211              var keyset = value._keys || Object.keys(value),
37212                  output = [];
37213              Twig.forEach(keyset, function (key) {
37214                output.push(JSON.stringify(key) + ":" + Twig.filters.json_encode(value[key]));
37215              });
37216              return "{" + output.join(",") + "}";
37217            } else {
37218              return JSON.stringify(value);
37219            }
37220          },
37221          merge: function merge(value, params) {
37222            var obj = [],
37223                arr_index = 0,
37224                keyset = []; // Check to see if all the objects being merged are arrays
37225
37226            if (!is("Array", value)) {
37227              // Create obj as an Object
37228              obj = {};
37229            } else {
37230              Twig.forEach(params, function (param) {
37231                if (!is("Array", param)) {
37232                  obj = {};
37233                }
37234              });
37235            }
37236
37237            if (!is("Array", obj)) {
37238              obj._keys = [];
37239            }
37240
37241            if (is("Array", value)) {
37242              Twig.forEach(value, function (val) {
37243                if (obj._keys) obj._keys.push(arr_index);
37244                obj[arr_index] = val;
37245                arr_index++;
37246              });
37247            } else {
37248              keyset = value._keys || Object.keys(value);
37249              Twig.forEach(keyset, function (key) {
37250                obj[key] = value[key];
37251
37252                obj._keys.push(key); // Handle edge case where a number index in an object is greater than
37253                //   the array counter. In such a case, the array counter is increased
37254                //   one past the index.
37255                //
37256                // Example {{ ["a", "b"]|merge({"4":"value"}, ["c", "d"])
37257                // Without this, d would have an index of "4" and overwrite the value
37258                //   of "value"
37259
37260
37261                var int_key = parseInt(key, 10);
37262
37263                if (!isNaN(int_key) && int_key >= arr_index) {
37264                  arr_index = int_key + 1;
37265                }
37266              });
37267            } // mixin the merge arrays
37268
37269
37270            Twig.forEach(params, function (param) {
37271              if (is("Array", param)) {
37272                Twig.forEach(param, function (val) {
37273                  if (obj._keys) obj._keys.push(arr_index);
37274                  obj[arr_index] = val;
37275                  arr_index++;
37276                });
37277              } else {
37278                keyset = param._keys || Object.keys(param);
37279                Twig.forEach(keyset, function (key) {
37280                  if (!obj[key]) obj._keys.push(key);
37281                  obj[key] = param[key];
37282                  var int_key = parseInt(key, 10);
37283
37284                  if (!isNaN(int_key) && int_key >= arr_index) {
37285                    arr_index = int_key + 1;
37286                  }
37287                });
37288              }
37289            });
37290
37291            if (params.length === 0) {
37292              throw new Twig.Error("Filter merge expects at least one parameter");
37293            }
37294
37295            return obj;
37296          },
37297          date: function date(value, params) {
37298            var date = Twig.functions.date(value);
37299            var format = params && params.length ? params[0] : 'F j, Y H:i';
37300            return Twig.lib.date(format, date);
37301          },
37302          date_modify: function date_modify(value, params) {
37303            if (value === undefined || value === null) {
37304              return;
37305            }
37306
37307            if (params === undefined || params.length !== 1) {
37308              throw new Twig.Error("date_modify filter expects 1 argument");
37309            }
37310
37311            var modifyText = params[0],
37312                time;
37313
37314            if (Twig.lib.is("Date", value)) {
37315              time = Twig.lib.strtotime(modifyText, value.getTime() / 1000);
37316            }
37317
37318            if (Twig.lib.is("String", value)) {
37319              time = Twig.lib.strtotime(modifyText, Twig.lib.strtotime(value));
37320            }
37321
37322            if (Twig.lib.is("Number", value)) {
37323              time = Twig.lib.strtotime(modifyText, value);
37324            }
37325
37326            return new Date(time * 1000);
37327          },
37328          replace: function replace(value, params) {
37329            if (value === undefined || value === null) {
37330              return;
37331            }
37332
37333            var pairs = params[0],
37334                tag;
37335
37336            for (tag in pairs) {
37337              if (pairs.hasOwnProperty(tag) && tag !== "_keys") {
37338                value = Twig.lib.replaceAll(value, tag, pairs[tag]);
37339              }
37340            }
37341
37342            return value;
37343          },
37344          format: function format(value, params) {
37345            if (value === undefined || value === null) {
37346              return;
37347            }
37348
37349            return Twig.lib.vsprintf(value, params);
37350          },
37351          striptags: function striptags(value) {
37352            if (value === undefined || value === null) {
37353              return;
37354            }
37355
37356            return Twig.lib.strip_tags(value);
37357          },
37358          escape: function escape(value, params) {
37359            if (value === undefined || value === null) {
37360              return;
37361            }
37362
37363            var strategy = "html";
37364            if (params && params.length && params[0] !== true) strategy = params[0];
37365
37366            if (strategy == "html") {
37367              var raw_value = value.toString().replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
37368              return Twig.Markup(raw_value, 'html');
37369            } else if (strategy == "js") {
37370              var raw_value = value.toString();
37371              var result = "";
37372
37373              for (var i = 0; i < raw_value.length; i++) {
37374                if (raw_value[i].match(/^[a-zA-Z0-9,\._]$/)) result += raw_value[i];else {
37375                  var char_code = raw_value.charCodeAt(i);
37376                  if (char_code < 0x80) result += "\\x" + char_code.toString(16).toUpperCase();else result += Twig.lib.sprintf("\\u%04s", char_code.toString(16).toUpperCase());
37377                }
37378              }
37379
37380              return Twig.Markup(result, 'js');
37381            } else if (strategy == "css") {
37382              var raw_value = value.toString();
37383              var result = "";
37384
37385              for (var i = 0; i < raw_value.length; i++) {
37386                if (raw_value[i].match(/^[a-zA-Z0-9]$/)) result += raw_value[i];else {
37387                  var char_code = raw_value.charCodeAt(i);
37388                  result += "\\" + char_code.toString(16).toUpperCase() + " ";
37389                }
37390              }
37391
37392              return Twig.Markup(result, 'css');
37393            } else if (strategy == "url") {
37394              var result = Twig.filters.url_encode(value);
37395              return Twig.Markup(result, 'url');
37396            } else if (strategy == "html_attr") {
37397              var raw_value = value.toString();
37398              var result = "";
37399
37400              for (var i = 0; i < raw_value.length; i++) {
37401                if (raw_value[i].match(/^[a-zA-Z0-9,\.\-_]$/)) result += raw_value[i];else if (raw_value[i].match(/^[&<>"]$/)) result += raw_value[i].replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");else {
37402                  var char_code = raw_value.charCodeAt(i); // The following replaces characters undefined in HTML with
37403                  // the hex entity for the Unicode replacement character.
37404
37405                  if (char_code <= 0x1f && char_code != 0x09 && char_code != 0x0a && char_code != 0x0d) result += "&#xFFFD;";else if (char_code < 0x80) result += Twig.lib.sprintf("&#x%02s;", char_code.toString(16).toUpperCase());else result += Twig.lib.sprintf("&#x%04s;", char_code.toString(16).toUpperCase());
37406                }
37407              }
37408
37409              return Twig.Markup(result, 'html_attr');
37410            } else {
37411              throw new Twig.Error("escape strategy unsupported");
37412            }
37413          },
37414
37415          /* Alias of escape */
37416          "e": function e(value, params) {
37417            return Twig.filters.escape(value, params);
37418          },
37419          nl2br: function nl2br(value) {
37420            if (value === undefined || value === null) {
37421              return;
37422            }
37423
37424            var linebreak_tag = "BACKSLASH_n_replace",
37425                br = "<br />" + linebreak_tag;
37426            value = Twig.filters.escape(value).replace(/\r\n/g, br).replace(/\r/g, br).replace(/\n/g, br);
37427            value = Twig.lib.replaceAll(value, linebreak_tag, "\n");
37428            return Twig.Markup(value);
37429          },
37430
37431          /**
37432           * Adapted from: http://phpjs.org/functions/number_format:481
37433           */
37434          number_format: function number_format(value, params) {
37435            var number = value,
37436                decimals = params && params[0] ? params[0] : undefined,
37437                dec = params && params[1] !== undefined ? params[1] : ".",
37438                sep = params && params[2] !== undefined ? params[2] : ",";
37439            number = (number + '').replace(/[^0-9+\-Ee.]/g, '');
37440
37441            var n = !isFinite(+number) ? 0 : +number,
37442                prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
37443                s = '',
37444                toFixedFix = function toFixedFix(n, prec) {
37445              var k = Math.pow(10, prec);
37446              return '' + Math.round(n * k) / k;
37447            }; // Fix for IE parseFloat(0.55).toFixed(0) = 0;
37448
37449
37450            s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
37451
37452            if (s[0].length > 3) {
37453              s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
37454            }
37455
37456            if ((s[1] || '').length < prec) {
37457              s[1] = s[1] || '';
37458              s[1] += new Array(prec - s[1].length + 1).join('0');
37459            }
37460
37461            return s.join(dec);
37462          },
37463          trim: function trim(value, params) {
37464            if (value === undefined || value === null) {
37465              return;
37466            }
37467
37468            var str = Twig.filters.escape('' + value),
37469                whitespace;
37470
37471            if (params && params[0]) {
37472              whitespace = '' + params[0];
37473            } else {
37474              whitespace = " \n\r\t\f\x0B\xA0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u200B\u2028\u2029\u3000";
37475            }
37476
37477            for (var i = 0; i < str.length; i++) {
37478              if (whitespace.indexOf(str.charAt(i)) === -1) {
37479                str = str.substring(i);
37480                break;
37481              }
37482            }
37483
37484            for (i = str.length - 1; i >= 0; i--) {
37485              if (whitespace.indexOf(str.charAt(i)) === -1) {
37486                str = str.substring(0, i + 1);
37487                break;
37488              }
37489            }
37490
37491            return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
37492          },
37493          truncate: function truncate(value, params) {
37494            var length = 30,
37495                preserve = false,
37496                separator = '...';
37497            value = value + '';
37498
37499            if (params) {
37500              if (params[0]) {
37501                length = params[0];
37502              }
37503
37504              if (params[1]) {
37505                preserve = params[1];
37506              }
37507
37508              if (params[2]) {
37509                separator = params[2];
37510              }
37511            }
37512
37513            if (value.length > length) {
37514              if (preserve) {
37515                length = value.indexOf(' ', length);
37516
37517                if (length === -1) {
37518                  return value;
37519                }
37520              }
37521
37522              value = value.substr(0, length) + separator;
37523            }
37524
37525            return value;
37526          },
37527          slice: function slice(value, params) {
37528            if (value === undefined || value === null) {
37529              return;
37530            }
37531
37532            if (params === undefined || params.length < 1) {
37533              throw new Twig.Error("slice filter expects at least 1 argument");
37534            } // default to start of string
37535
37536
37537            var start = params[0] || 0; // default to length of string
37538
37539            var length = params.length > 1 ? params[1] : value.length; // handle negative start values
37540
37541            var startIndex = start >= 0 ? start : Math.max(value.length + start, 0);
37542
37543            if (Twig.lib.is("Array", value)) {
37544              var output = [];
37545
37546              for (var i = startIndex; i < startIndex + length && i < value.length; i++) {
37547                output.push(value[i]);
37548              }
37549
37550              return output;
37551            } else if (Twig.lib.is("String", value)) {
37552              return value.substr(startIndex, length);
37553            } else {
37554              throw new Twig.Error("slice filter expects value to be an array or string");
37555            }
37556          },
37557          abs: function abs(value) {
37558            if (value === undefined || value === null) {
37559              return;
37560            }
37561
37562            return Math.abs(value);
37563          },
37564          first: function first(value) {
37565            if (is("Array", value)) {
37566              return value[0];
37567            } else if (is("Object", value)) {
37568              if ('_keys' in value) {
37569                return value[value._keys[0]];
37570              }
37571            } else if (typeof value === "string") {
37572              return value.substr(0, 1);
37573            }
37574
37575            return;
37576          },
37577          split: function split(value, params) {
37578            if (value === undefined || value === null) {
37579              return;
37580            }
37581
37582            if (params === undefined || params.length < 1 || params.length > 2) {
37583              throw new Twig.Error("split filter expects 1 or 2 argument");
37584            }
37585
37586            if (Twig.lib.is("String", value)) {
37587              var delimiter = params[0],
37588                  limit = params[1],
37589                  split = value.split(delimiter);
37590
37591              if (limit === undefined) {
37592                return split;
37593              } else if (limit < 0) {
37594                return value.split(delimiter, split.length + limit);
37595              } else {
37596                var limitedSplit = [];
37597
37598                if (delimiter == '') {
37599                  // empty delimiter
37600                  // "aabbcc"|split('', 2)
37601                  //     -> ['aa', 'bb', 'cc']
37602                  while (split.length > 0) {
37603                    var temp = "";
37604
37605                    for (var i = 0; i < limit && split.length > 0; i++) {
37606                      temp += split.shift();
37607                    }
37608
37609                    limitedSplit.push(temp);
37610                  }
37611                } else {
37612                  // non-empty delimiter
37613                  // "one,two,three,four,five"|split(',', 3)
37614                  //     -> ['one', 'two', 'three,four,five']
37615                  for (var i = 0; i < limit - 1 && split.length > 0; i++) {
37616                    limitedSplit.push(split.shift());
37617                  }
37618
37619                  if (split.length > 0) {
37620                    limitedSplit.push(split.join(delimiter));
37621                  }
37622                }
37623
37624                return limitedSplit;
37625              }
37626            } else {
37627              throw new Twig.Error("split filter expects value to be a string");
37628            }
37629          },
37630          last: function last(value) {
37631            if (Twig.lib.is('Object', value)) {
37632              var keys;
37633
37634              if (value._keys === undefined) {
37635                keys = Object.keys(value);
37636              } else {
37637                keys = value._keys;
37638              }
37639
37640              return value[keys[keys.length - 1]];
37641            } // string|array
37642
37643
37644            return value[value.length - 1];
37645          },
37646          raw: function raw(value) {
37647            return Twig.Markup(value);
37648          },
37649          batch: function batch(items, params) {
37650            var size = params.shift(),
37651                fill = params.shift(),
37652                result,
37653                last,
37654                missing;
37655
37656            if (!Twig.lib.is("Array", items)) {
37657              throw new Twig.Error("batch filter expects items to be an array");
37658            }
37659
37660            if (!Twig.lib.is("Number", size)) {
37661              throw new Twig.Error("batch filter expects size to be a number");
37662            }
37663
37664            size = Math.ceil(size);
37665            result = Twig.lib.chunkArray(items, size);
37666
37667            if (fill && items.length % size != 0) {
37668              last = result.pop();
37669              missing = size - last.length;
37670
37671              while (missing--) {
37672                last.push(fill);
37673              }
37674
37675              result.push(last);
37676            }
37677
37678            return result;
37679          },
37680          round: function round(value, params) {
37681            params = params || [];
37682            var precision = params.length > 0 ? params[0] : 0,
37683                method = params.length > 1 ? params[1] : "common";
37684            value = parseFloat(value);
37685
37686            if (precision && !Twig.lib.is("Number", precision)) {
37687              throw new Twig.Error("round filter expects precision to be a number");
37688            }
37689
37690            if (method === "common") {
37691              return Twig.lib.round(value, precision);
37692            }
37693
37694            if (!Twig.lib.is("Function", Math[method])) {
37695              throw new Twig.Error("round filter expects method to be 'floor', 'ceil', or 'common'");
37696            }
37697
37698            return Math[method](value * Math.pow(10, precision)) / Math.pow(10, precision);
37699          }
37700        };
37701
37702        Twig.filter = function (filter, value, params) {
37703          if (!Twig.filters[filter]) {
37704            throw "Unable to find filter " + filter;
37705          }
37706
37707          return Twig.filters[filter].apply(this, [value, params]);
37708        };
37709
37710        Twig.filter.extend = function (filter, definition) {
37711          Twig.filters[filter] = definition;
37712        };
37713
37714        return Twig;
37715      };
37716      /***/
37717
37718    },
37719    /* 6 */
37720
37721    /***/
37722    function (module, exports) {
37723      // ## twig.functions.js
37724      //
37725      // This file handles parsing filters.
37726      module.exports = function (Twig) {
37727        /**
37728         * @constant
37729         * @type {string}
37730         */
37731        var TEMPLATE_NOT_FOUND_MESSAGE = 'Template "{name}" is not defined.'; // Determine object type
37732
37733        function is(type, obj) {
37734          var clas = Object.prototype.toString.call(obj).slice(8, -1);
37735          return obj !== undefined && obj !== null && clas === type;
37736        }
37737
37738        Twig.functions = {
37739          //  attribute, block, constant, date, dump, parent, random,.
37740          // Range function from http://phpjs.org/functions/range:499
37741          // Used under an MIT License
37742          range: function range(low, high, step) {
37743            // http://kevin.vanzonneveld.net
37744            // +   original by: Waldo Malqui Silva
37745            // *     example 1: range ( 0, 12 );
37746            // *     returns 1: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
37747            // *     example 2: range( 0, 100, 10 );
37748            // *     returns 2: [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
37749            // *     example 3: range( 'a', 'i' );
37750            // *     returns 3: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
37751            // *     example 4: range( 'c', 'a' );
37752            // *     returns 4: ['c', 'b', 'a']
37753            var matrix = [];
37754            var inival, endval, plus;
37755            var walker = step || 1;
37756            var chars = false;
37757
37758            if (!isNaN(low) && !isNaN(high)) {
37759              inival = parseInt(low, 10);
37760              endval = parseInt(high, 10);
37761            } else if (isNaN(low) && isNaN(high)) {
37762              chars = true;
37763              inival = low.charCodeAt(0);
37764              endval = high.charCodeAt(0);
37765            } else {
37766              inival = isNaN(low) ? 0 : low;
37767              endval = isNaN(high) ? 0 : high;
37768            }
37769
37770            plus = inival > endval ? false : true;
37771
37772            if (plus) {
37773              while (inival <= endval) {
37774                matrix.push(chars ? String.fromCharCode(inival) : inival);
37775                inival += walker;
37776              }
37777            } else {
37778              while (inival >= endval) {
37779                matrix.push(chars ? String.fromCharCode(inival) : inival);
37780                inival -= walker;
37781              }
37782            }
37783
37784            return matrix;
37785          },
37786          cycle: function cycle(arr, i) {
37787            var pos = i % arr.length;
37788            return arr[pos];
37789          },
37790          dump: function dump() {
37791            var EOL = '\n',
37792                indentChar = '  ',
37793                indentTimes = 0,
37794                out = '',
37795                args = Array.prototype.slice.call(arguments),
37796                indent = function indent(times) {
37797              var ind = '';
37798
37799              while (times > 0) {
37800                times--;
37801                ind += indentChar;
37802              }
37803
37804              return ind;
37805            },
37806                displayVar = function displayVar(variable) {
37807              out += indent(indentTimes);
37808
37809              if (_typeof2(variable) === 'object') {
37810                dumpVar(variable);
37811              } else if (typeof variable === 'function') {
37812                out += 'function()' + EOL;
37813              } else if (typeof variable === 'string') {
37814                out += 'string(' + variable.length + ') "' + variable + '"' + EOL;
37815              } else if (typeof variable === 'number') {
37816                out += 'number(' + variable + ')' + EOL;
37817              } else if (typeof variable === 'boolean') {
37818                out += 'bool(' + variable + ')' + EOL;
37819              }
37820            },
37821                dumpVar = function dumpVar(variable) {
37822              var i;
37823
37824              if (variable === null) {
37825                out += 'NULL' + EOL;
37826              } else if (variable === undefined) {
37827                out += 'undefined' + EOL;
37828              } else if (_typeof2(variable) === 'object') {
37829                out += indent(indentTimes) + _typeof2(variable);
37830                indentTimes++;
37831
37832                out += '(' + function (obj) {
37833                  var size = 0,
37834                      key;
37835
37836                  for (key in obj) {
37837                    if (obj.hasOwnProperty(key)) {
37838                      size++;
37839                    }
37840                  }
37841
37842                  return size;
37843                }(variable) + ') {' + EOL;
37844
37845                for (i in variable) {
37846                  out += indent(indentTimes) + '[' + i + ']=> ' + EOL;
37847                  displayVar(variable[i]);
37848                }
37849
37850                indentTimes--;
37851                out += indent(indentTimes) + '}' + EOL;
37852              } else {
37853                displayVar(variable);
37854              }
37855            }; // handle no argument case by dumping the entire render context
37856
37857
37858            if (args.length == 0) args.push(this.context);
37859            Twig.forEach(args, function (variable) {
37860              dumpVar(variable);
37861            });
37862            return out;
37863          },
37864          date: function date(_date2, time) {
37865            var dateObj;
37866
37867            if (_date2 === undefined || _date2 === null || _date2 === "") {
37868              dateObj = new Date();
37869            } else if (Twig.lib.is("Date", _date2)) {
37870              dateObj = _date2;
37871            } else if (Twig.lib.is("String", _date2)) {
37872              if (_date2.match(/^[0-9]+$/)) {
37873                dateObj = new Date(_date2 * 1000);
37874              } else {
37875                dateObj = new Date(Twig.lib.strtotime(_date2) * 1000);
37876              }
37877            } else if (Twig.lib.is("Number", _date2)) {
37878              // timestamp
37879              dateObj = new Date(_date2 * 1000);
37880            } else {
37881              throw new Twig.Error("Unable to parse date " + _date2);
37882            }
37883
37884            return dateObj;
37885          },
37886          block: function block(_block) {
37887            if (this.originalBlockTokens[_block]) {
37888              return Twig.logic.parse.apply(this, [this.originalBlockTokens[_block], this.context]).output;
37889            } else {
37890              return this.blocks[_block];
37891            }
37892          },
37893          parent: function parent() {
37894            // Add a placeholder
37895            return Twig.placeholders.parent;
37896          },
37897          attribute: function attribute(object, method, params) {
37898            if (Twig.lib.is('Object', object)) {
37899              if (object.hasOwnProperty(method)) {
37900                if (typeof object[method] === "function") {
37901                  return object[method].apply(undefined, params);
37902                } else {
37903                  return object[method];
37904                }
37905              }
37906            } // Array will return element 0-index
37907
37908
37909            return object[method] || undefined;
37910          },
37911          max: function max(values) {
37912            if (Twig.lib.is("Object", values)) {
37913              delete values["_keys"];
37914              return Twig.lib.max(values);
37915            }
37916
37917            return Twig.lib.max.apply(null, arguments);
37918          },
37919          min: function min(values) {
37920            if (Twig.lib.is("Object", values)) {
37921              delete values["_keys"];
37922              return Twig.lib.min(values);
37923            }
37924
37925            return Twig.lib.min.apply(null, arguments);
37926          },
37927          template_from_string: function template_from_string(template) {
37928            if (template === undefined) {
37929              template = '';
37930            }
37931
37932            return Twig.Templates.parsers.twig({
37933              options: this.options,
37934              data: template
37935            });
37936          },
37937          random: function random(value) {
37938            var LIMIT_INT31 = 0x80000000;
37939
37940            function getRandomNumber(n) {
37941              var random = Math.floor(Math.random() * LIMIT_INT31);
37942              var limits = [0, n];
37943              var min = Math.min.apply(null, limits),
37944                  max = Math.max.apply(null, limits);
37945              return min + Math.floor((max - min + 1) * random / LIMIT_INT31);
37946            }
37947
37948            if (Twig.lib.is("Number", value)) {
37949              return getRandomNumber(value);
37950            }
37951
37952            if (Twig.lib.is("String", value)) {
37953              return value.charAt(getRandomNumber(value.length - 1));
37954            }
37955
37956            if (Twig.lib.is("Array", value)) {
37957              return value[getRandomNumber(value.length - 1)];
37958            }
37959
37960            if (Twig.lib.is("Object", value)) {
37961              var keys = Object.keys(value);
37962              return value[keys[getRandomNumber(keys.length - 1)]];
37963            }
37964
37965            return getRandomNumber(LIMIT_INT31 - 1);
37966          },
37967
37968          /**
37969           * Returns the content of a template without rendering it
37970           * @param {string} name
37971           * @param {boolean} [ignore_missing=false]
37972           * @returns {string}
37973           */
37974          source: function source(name, ignore_missing) {
37975            var templateSource;
37976            var templateFound = false;
37977            var isNodeEnvironment = typeof module !== 'undefined' && typeof module.exports !== 'undefined' && typeof window === 'undefined';
37978            var loader;
37979            var path; //if we are running in a node.js environment, set the loader to 'fs' and ensure the
37980            // path is relative to the CWD of the running script
37981            //else, set the loader to 'ajax' and set the path to the value of name
37982
37983            if (isNodeEnvironment) {
37984              loader = 'fs';
37985              path = __dirname + '/' + name;
37986            } else {
37987              loader = 'ajax';
37988              path = name;
37989            } //build the params object
37990
37991
37992            var params = {
37993              id: name,
37994              path: path,
37995              method: loader,
37996              parser: 'source',
37997              async: false,
37998              fetchTemplateSource: true
37999            }; //default ignore_missing to false
38000
38001            if (typeof ignore_missing === 'undefined') {
38002              ignore_missing = false;
38003            } //try to load the remote template
38004            //
38005            //on exception, log it
38006
38007
38008            try {
38009              templateSource = Twig.Templates.loadRemote(name, params); //if the template is undefined or null, set the template to an empty string and do NOT flip the
38010              // boolean indicating we found the template
38011              //
38012              //else, all is good! flip the boolean indicating we found the template
38013
38014              if (typeof templateSource === 'undefined' || templateSource === null) {
38015                templateSource = '';
38016              } else {
38017                templateFound = true;
38018              }
38019            } catch (e) {
38020              Twig.log.debug('Twig.functions.source: ', 'Problem loading template  ', e);
38021            } //if the template was NOT found AND we are not ignoring missing templates, return the same message
38022            // that is returned by the PHP implementation of the twig source() function
38023            //
38024            //else, return the template source
38025
38026
38027            if (!templateFound && !ignore_missing) {
38028              return TEMPLATE_NOT_FOUND_MESSAGE.replace('{name}', name);
38029            } else {
38030              return templateSource;
38031            }
38032          }
38033        };
38034
38035        Twig._function = function (_function, value, params) {
38036          if (!Twig.functions[_function]) {
38037            throw "Unable to find function " + _function;
38038          }
38039
38040          return Twig.functions[_function](value, params);
38041        };
38042
38043        Twig._function.extend = function (_function, definition) {
38044          Twig.functions[_function] = definition;
38045        };
38046
38047        return Twig;
38048      };
38049      /***/
38050
38051    },
38052    /* 7 */
38053
38054    /***/
38055    function (module, exports, __webpack_require__) {
38056      // ## twig.lib.js
38057      //
38058      // This file contains 3rd party libraries used within twig.
38059      //
38060      // Copies of the licenses for the code included here can be found in the
38061      // LICENSES.md file.
38062      //
38063      module.exports = function (Twig) {
38064        // Namespace for libraries
38065        Twig.lib = {};
38066        Twig.lib.sprintf = __webpack_require__(8);
38067        Twig.lib.vsprintf = __webpack_require__(9);
38068        Twig.lib.round = __webpack_require__(10);
38069        Twig.lib.max = __webpack_require__(11);
38070        Twig.lib.min = __webpack_require__(12);
38071        Twig.lib.strip_tags = __webpack_require__(13);
38072        Twig.lib.strtotime = __webpack_require__(14);
38073        Twig.lib.date = __webpack_require__(15);
38074        Twig.lib.boolval = __webpack_require__(16);
38075
38076        Twig.lib.is = function (type, obj) {
38077          var clas = Object.prototype.toString.call(obj).slice(8, -1);
38078          return obj !== undefined && obj !== null && clas === type;
38079        }; // shallow-copy an object
38080
38081
38082        Twig.lib.copy = function (src) {
38083          var target = {},
38084              key;
38085
38086          for (key in src) {
38087            target[key] = src[key];
38088          }
38089
38090          return target;
38091        };
38092
38093        Twig.lib.extend = function (src, add) {
38094          var keys = Object.keys(add),
38095              i;
38096          i = keys.length;
38097
38098          while (i--) {
38099            src[keys[i]] = add[keys[i]];
38100          }
38101
38102          return src;
38103        };
38104
38105        Twig.lib.replaceAll = function (string, search, replace) {
38106          return string.split(search).join(replace);
38107        }; // chunk an array (arr) into arrays of (size) items, returns an array of arrays, or an empty array on invalid input
38108
38109
38110        Twig.lib.chunkArray = function (arr, size) {
38111          var returnVal = [],
38112              x = 0,
38113              len = arr.length;
38114
38115          if (size < 1 || !Twig.lib.is("Array", arr)) {
38116            return [];
38117          }
38118
38119          while (x < len) {
38120            returnVal.push(arr.slice(x, x += size));
38121          }
38122
38123          return returnVal;
38124        };
38125
38126        return Twig;
38127      };
38128      /***/
38129
38130    },
38131    /* 8 */
38132
38133    /***/
38134    function (module, exports) {
38135      'use strict';
38136
38137      module.exports = function sprintf() {
38138        //  discuss at: http://locutus.io/php/sprintf/
38139        // original by: Ash Searle (http://hexmen.com/blog/)
38140        // improved by: Michael White (http://getsprink.com)
38141        // improved by: Jack
38142        // improved by: Kevin van Zonneveld (http://kvz.io)
38143        // improved by: Kevin van Zonneveld (http://kvz.io)
38144        // improved by: Kevin van Zonneveld (http://kvz.io)
38145        // improved by: Dj
38146        // improved by: Allidylls
38147        //    input by: Paulo Freitas
38148        //    input by: Brett Zamir (http://brett-zamir.me)
38149        //   example 1: sprintf("%01.2f", 123.1)
38150        //   returns 1: '123.10'
38151        //   example 2: sprintf("[%10s]", 'monkey')
38152        //   returns 2: '[    monkey]'
38153        //   example 3: sprintf("[%'#10s]", 'monkey')
38154        //   returns 3: '[####monkey]'
38155        //   example 4: sprintf("%d", 123456789012345)
38156        //   returns 4: '123456789012345'
38157        //   example 5: sprintf('%-03s', 'E')
38158        //   returns 5: 'E00'
38159        var regex = /%%|%(\d+\$)?([-+'#0 ]*)(\*\d+\$|\*|\d+)?(?:\.(\*\d+\$|\*|\d+))?([scboxXuideEfFgG])/g;
38160        var a = arguments;
38161        var i = 0;
38162        var format = a[i++];
38163
38164        var _pad = function _pad(str, len, chr, leftJustify) {
38165          if (!chr) {
38166            chr = ' ';
38167          }
38168
38169          var padding = str.length >= len ? '' : new Array(1 + len - str.length >>> 0).join(chr);
38170          return leftJustify ? str + padding : padding + str;
38171        };
38172
38173        var justify = function justify(value, prefix, leftJustify, minWidth, zeroPad, customPadChar) {
38174          var diff = minWidth - value.length;
38175
38176          if (diff > 0) {
38177            if (leftJustify || !zeroPad) {
38178              value = _pad(value, minWidth, customPadChar, leftJustify);
38179            } else {
38180              value = [value.slice(0, prefix.length), _pad('', diff, '0', true), value.slice(prefix.length)].join('');
38181            }
38182          }
38183
38184          return value;
38185        };
38186
38187        var _formatBaseX = function _formatBaseX(value, base, prefix, leftJustify, minWidth, precision, zeroPad) {
38188          // Note: casts negative numbers to positive ones
38189          var number = value >>> 0;
38190          prefix = prefix && number && {
38191            '2': '0b',
38192            '8': '0',
38193            '16': '0x'
38194          }[base] || '';
38195          value = prefix + _pad(number.toString(base), precision || 0, '0', false);
38196          return justify(value, prefix, leftJustify, minWidth, zeroPad);
38197        }; // _formatString()
38198
38199
38200        var _formatString = function _formatString(value, leftJustify, minWidth, precision, zeroPad, customPadChar) {
38201          if (precision !== null && precision !== undefined) {
38202            value = value.slice(0, precision);
38203          }
38204
38205          return justify(value, '', leftJustify, minWidth, zeroPad, customPadChar);
38206        }; // doFormat()
38207
38208
38209        var doFormat = function doFormat(substring, valueIndex, flags, minWidth, precision, type) {
38210          var number, prefix, method, textTransform, value;
38211
38212          if (substring === '%%') {
38213            return '%';
38214          } // parse flags
38215
38216
38217          var leftJustify = false;
38218          var positivePrefix = '';
38219          var zeroPad = false;
38220          var prefixBaseX = false;
38221          var customPadChar = ' ';
38222          var flagsl = flags.length;
38223          var j;
38224
38225          for (j = 0; j < flagsl; j++) {
38226            switch (flags.charAt(j)) {
38227              case ' ':
38228                positivePrefix = ' ';
38229                break;
38230
38231              case '+':
38232                positivePrefix = '+';
38233                break;
38234
38235              case '-':
38236                leftJustify = true;
38237                break;
38238
38239              case "'":
38240                customPadChar = flags.charAt(j + 1);
38241                break;
38242
38243              case '0':
38244                zeroPad = true;
38245                customPadChar = '0';
38246                break;
38247
38248              case '#':
38249                prefixBaseX = true;
38250                break;
38251            }
38252          } // parameters may be null, undefined, empty-string or real valued
38253          // we want to ignore null, undefined and empty-string values
38254
38255
38256          if (!minWidth) {
38257            minWidth = 0;
38258          } else if (minWidth === '*') {
38259            minWidth = +a[i++];
38260          } else if (minWidth.charAt(0) === '*') {
38261            minWidth = +a[minWidth.slice(1, -1)];
38262          } else {
38263            minWidth = +minWidth;
38264          } // Note: undocumented perl feature:
38265
38266
38267          if (minWidth < 0) {
38268            minWidth = -minWidth;
38269            leftJustify = true;
38270          }
38271
38272          if (!isFinite(minWidth)) {
38273            throw new Error('sprintf: (minimum-)width must be finite');
38274          }
38275
38276          if (!precision) {
38277            precision = 'fFeE'.indexOf(type) > -1 ? 6 : type === 'd' ? 0 : undefined;
38278          } else if (precision === '*') {
38279            precision = +a[i++];
38280          } else if (precision.charAt(0) === '*') {
38281            precision = +a[precision.slice(1, -1)];
38282          } else {
38283            precision = +precision;
38284          } // grab value using valueIndex if required?
38285
38286
38287          value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++];
38288
38289          switch (type) {
38290            case 's':
38291              return _formatString(value + '', leftJustify, minWidth, precision, zeroPad, customPadChar);
38292
38293            case 'c':
38294              return _formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad);
38295
38296            case 'b':
38297              return _formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
38298
38299            case 'o':
38300              return _formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
38301
38302            case 'x':
38303              return _formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
38304
38305            case 'X':
38306              return _formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad).toUpperCase();
38307
38308            case 'u':
38309              return _formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
38310
38311            case 'i':
38312            case 'd':
38313              number = +value || 0; // Plain Math.round doesn't just truncate
38314
38315              number = Math.round(number - number % 1);
38316              prefix = number < 0 ? '-' : positivePrefix;
38317              value = prefix + _pad(String(Math.abs(number)), precision, '0', false);
38318              return justify(value, prefix, leftJustify, minWidth, zeroPad);
38319
38320            case 'e':
38321            case 'E':
38322            case 'f': // @todo: Should handle locales (as per setlocale)
38323
38324            case 'F':
38325            case 'g':
38326            case 'G':
38327              number = +value;
38328              prefix = number < 0 ? '-' : positivePrefix;
38329              method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())];
38330              textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2];
38331              value = prefix + Math.abs(number)[method](precision);
38332              return justify(value, prefix, leftJustify, minWidth, zeroPad)[textTransform]();
38333
38334            default:
38335              return substring;
38336          }
38337        };
38338
38339        return format.replace(regex, doFormat);
38340      };
38341      /***/
38342
38343    },
38344    /* 9 */
38345
38346    /***/
38347    function (module, exports, __webpack_require__) {
38348      'use strict';
38349
38350      module.exports = function vsprintf(format, args) {
38351        //  discuss at: http://locutus.io/php/vsprintf/
38352        // original by: ejsanders
38353        //   example 1: vsprintf('%04d-%02d-%02d', [1988, 8, 1])
38354        //   returns 1: '1988-08-01'
38355        var sprintf = __webpack_require__(8);
38356
38357        return sprintf.apply(this, [format].concat(args));
38358      };
38359      /***/
38360
38361    },
38362    /* 10 */
38363
38364    /***/
38365    function (module, exports) {
38366      'use strict';
38367
38368      module.exports = function round(value, precision, mode) {
38369        //  discuss at: http://locutus.io/php/round/
38370        // original by: Philip Peterson
38371        //  revised by: Onno Marsman (https://twitter.com/onnomarsman)
38372        //  revised by: T.Wild
38373        //  revised by: Rafał Kukawski (http://blog.kukawski.pl)
38374        //    input by: Greenseed
38375        //    input by: meo
38376        //    input by: William
38377        //    input by: Josep Sanz (http://www.ws3.es/)
38378        // bugfixed by: Brett Zamir (http://brett-zamir.me)
38379        //      note 1: Great work. Ideas for improvement:
38380        //      note 1: - code more compliant with developer guidelines
38381        //      note 1: - for implementing PHP constant arguments look at
38382        //      note 1: the pathinfo() function, it offers the greatest
38383        //      note 1: flexibility & compatibility possible
38384        //   example 1: round(1241757, -3)
38385        //   returns 1: 1242000
38386        //   example 2: round(3.6)
38387        //   returns 2: 4
38388        //   example 3: round(2.835, 2)
38389        //   returns 3: 2.84
38390        //   example 4: round(1.1749999999999, 2)
38391        //   returns 4: 1.17
38392        //   example 5: round(58551.799999999996, 2)
38393        //   returns 5: 58551.8
38394        var m, f, isHalf, sgn; // helper variables
38395        // making sure precision is integer
38396
38397        precision |= 0;
38398        m = Math.pow(10, precision);
38399        value *= m; // sign of the number
38400
38401        sgn = value > 0 | -(value < 0);
38402        isHalf = value % 1 === 0.5 * sgn;
38403        f = Math.floor(value);
38404
38405        if (isHalf) {
38406          switch (mode) {
38407            case 'PHP_ROUND_HALF_DOWN':
38408              // rounds .5 toward zero
38409              value = f + (sgn < 0);
38410              break;
38411
38412            case 'PHP_ROUND_HALF_EVEN':
38413              // rouds .5 towards the next even integer
38414              value = f + f % 2 * sgn;
38415              break;
38416
38417            case 'PHP_ROUND_HALF_ODD':
38418              // rounds .5 towards the next odd integer
38419              value = f + !(f % 2);
38420              break;
38421
38422            default:
38423              // rounds .5 away from zero
38424              value = f + (sgn > 0);
38425          }
38426        }
38427
38428        return (isHalf ? value : Math.round(value)) / m;
38429      };
38430      /***/
38431
38432    },
38433    /* 11 */
38434
38435    /***/
38436    function (module, exports) {
38437      'use strict';
38438
38439      var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
38440        return _typeof2(obj);
38441      } : function (obj) {
38442        return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : _typeof2(obj);
38443      };
38444
38445      module.exports = function max() {
38446        //  discuss at: http://locutus.io/php/max/
38447        // original by: Onno Marsman (https://twitter.com/onnomarsman)
38448        //  revised by: Onno Marsman (https://twitter.com/onnomarsman)
38449        // improved by: Jack
38450        //      note 1: Long code cause we're aiming for maximum PHP compatibility
38451        //   example 1: max(1, 3, 5, 6, 7)
38452        //   returns 1: 7
38453        //   example 2: max([2, 4, 5])
38454        //   returns 2: 5
38455        //   example 3: max(0, 'hello')
38456        //   returns 3: 0
38457        //   example 4: max('hello', 0)
38458        //   returns 4: 'hello'
38459        //   example 5: max(-1, 'hello')
38460        //   returns 5: 'hello'
38461        //   example 6: max([2, 4, 8], [2, 5, 7])
38462        //   returns 6: [2, 5, 7]
38463        var ar;
38464        var retVal;
38465        var i = 0;
38466        var n = 0;
38467        var argv = arguments;
38468        var argc = argv.length;
38469
38470        var _obj2Array = function _obj2Array(obj) {
38471          if (Object.prototype.toString.call(obj) === '[object Array]') {
38472            return obj;
38473          } else {
38474            var ar = [];
38475
38476            for (var i in obj) {
38477              if (obj.hasOwnProperty(i)) {
38478                ar.push(obj[i]);
38479              }
38480            }
38481
38482            return ar;
38483          }
38484        };
38485
38486        var _compare = function _compare(current, next) {
38487          var i = 0;
38488          var n = 0;
38489          var tmp = 0;
38490          var nl = 0;
38491          var cl = 0;
38492
38493          if (current === next) {
38494            return 0;
38495          } else if ((typeof current === 'undefined' ? 'undefined' : _typeof(current)) === 'object') {
38496            if ((typeof next === 'undefined' ? 'undefined' : _typeof(next)) === 'object') {
38497              current = _obj2Array(current);
38498              next = _obj2Array(next);
38499              cl = current.length;
38500              nl = next.length;
38501
38502              if (nl > cl) {
38503                return 1;
38504              } else if (nl < cl) {
38505                return -1;
38506              }
38507
38508              for (i = 0, n = cl; i < n; ++i) {
38509                tmp = _compare(current[i], next[i]);
38510
38511                if (tmp === 1) {
38512                  return 1;
38513                } else if (tmp === -1) {
38514                  return -1;
38515                }
38516              }
38517
38518              return 0;
38519            }
38520
38521            return -1;
38522          } else if ((typeof next === 'undefined' ? 'undefined' : _typeof(next)) === 'object') {
38523            return 1;
38524          } else if (isNaN(next) && !isNaN(current)) {
38525            if (current === 0) {
38526              return 0;
38527            }
38528
38529            return current < 0 ? 1 : -1;
38530          } else if (isNaN(current) && !isNaN(next)) {
38531            if (next === 0) {
38532              return 0;
38533            }
38534
38535            return next > 0 ? 1 : -1;
38536          }
38537
38538          if (next === current) {
38539            return 0;
38540          }
38541
38542          return next > current ? 1 : -1;
38543        };
38544
38545        if (argc === 0) {
38546          throw new Error('At least one value should be passed to max()');
38547        } else if (argc === 1) {
38548          if (_typeof(argv[0]) === 'object') {
38549            ar = _obj2Array(argv[0]);
38550          } else {
38551            throw new Error('Wrong parameter count for max()');
38552          }
38553
38554          if (ar.length === 0) {
38555            throw new Error('Array must contain at least one element for max()');
38556          }
38557        } else {
38558          ar = argv;
38559        }
38560
38561        retVal = ar[0];
38562
38563        for (i = 1, n = ar.length; i < n; ++i) {
38564          if (_compare(retVal, ar[i]) === 1) {
38565            retVal = ar[i];
38566          }
38567        }
38568
38569        return retVal;
38570      };
38571      /***/
38572
38573    },
38574    /* 12 */
38575
38576    /***/
38577    function (module, exports) {
38578      'use strict';
38579
38580      var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
38581        return _typeof2(obj);
38582      } : function (obj) {
38583        return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : _typeof2(obj);
38584      };
38585
38586      module.exports = function min() {
38587        //  discuss at: http://locutus.io/php/min/
38588        // original by: Onno Marsman (https://twitter.com/onnomarsman)
38589        //  revised by: Onno Marsman (https://twitter.com/onnomarsman)
38590        // improved by: Jack
38591        //      note 1: Long code cause we're aiming for maximum PHP compatibility
38592        //   example 1: min(1, 3, 5, 6, 7)
38593        //   returns 1: 1
38594        //   example 2: min([2, 4, 5])
38595        //   returns 2: 2
38596        //   example 3: min(0, 'hello')
38597        //   returns 3: 0
38598        //   example 4: min('hello', 0)
38599        //   returns 4: 'hello'
38600        //   example 5: min(-1, 'hello')
38601        //   returns 5: -1
38602        //   example 6: min([2, 4, 8], [2, 5, 7])
38603        //   returns 6: [2, 4, 8]
38604        var ar;
38605        var retVal;
38606        var i = 0;
38607        var n = 0;
38608        var argv = arguments;
38609        var argc = argv.length;
38610
38611        var _obj2Array = function _obj2Array(obj) {
38612          if (Object.prototype.toString.call(obj) === '[object Array]') {
38613            return obj;
38614          }
38615
38616          var ar = [];
38617
38618          for (var i in obj) {
38619            if (obj.hasOwnProperty(i)) {
38620              ar.push(obj[i]);
38621            }
38622          }
38623
38624          return ar;
38625        };
38626
38627        var _compare = function _compare(current, next) {
38628          var i = 0;
38629          var n = 0;
38630          var tmp = 0;
38631          var nl = 0;
38632          var cl = 0;
38633
38634          if (current === next) {
38635            return 0;
38636          } else if ((typeof current === 'undefined' ? 'undefined' : _typeof(current)) === 'object') {
38637            if ((typeof next === 'undefined' ? 'undefined' : _typeof(next)) === 'object') {
38638              current = _obj2Array(current);
38639              next = _obj2Array(next);
38640              cl = current.length;
38641              nl = next.length;
38642
38643              if (nl > cl) {
38644                return 1;
38645              } else if (nl < cl) {
38646                return -1;
38647              }
38648
38649              for (i = 0, n = cl; i < n; ++i) {
38650                tmp = _compare(current[i], next[i]);
38651
38652                if (tmp === 1) {
38653                  return 1;
38654                } else if (tmp === -1) {
38655                  return -1;
38656                }
38657              }
38658
38659              return 0;
38660            }
38661
38662            return -1;
38663          } else if ((typeof next === 'undefined' ? 'undefined' : _typeof(next)) === 'object') {
38664            return 1;
38665          } else if (isNaN(next) && !isNaN(current)) {
38666            if (current === 0) {
38667              return 0;
38668            }
38669
38670            return current < 0 ? 1 : -1;
38671          } else if (isNaN(current) && !isNaN(next)) {
38672            if (next === 0) {
38673              return 0;
38674            }
38675
38676            return next > 0 ? 1 : -1;
38677          }
38678
38679          if (next === current) {
38680            return 0;
38681          }
38682
38683          return next > current ? 1 : -1;
38684        };
38685
38686        if (argc === 0) {
38687          throw new Error('At least one value should be passed to min()');
38688        } else if (argc === 1) {
38689          if (_typeof(argv[0]) === 'object') {
38690            ar = _obj2Array(argv[0]);
38691          } else {
38692            throw new Error('Wrong parameter count for min()');
38693          }
38694
38695          if (ar.length === 0) {
38696            throw new Error('Array must contain at least one element for min()');
38697          }
38698        } else {
38699          ar = argv;
38700        }
38701
38702        retVal = ar[0];
38703
38704        for (i = 1, n = ar.length; i < n; ++i) {
38705          if (_compare(retVal, ar[i]) === -1) {
38706            retVal = ar[i];
38707          }
38708        }
38709
38710        return retVal;
38711      };
38712      /***/
38713
38714    },
38715    /* 13 */
38716
38717    /***/
38718    function (module, exports) {
38719      'use strict';
38720
38721      module.exports = function strip_tags(input, allowed) {
38722        // eslint-disable-line camelcase
38723        //  discuss at: http://locutus.io/php/strip_tags/
38724        // original by: Kevin van Zonneveld (http://kvz.io)
38725        // improved by: Luke Godfrey
38726        // improved by: Kevin van Zonneveld (http://kvz.io)
38727        //    input by: Pul
38728        //    input by: Alex
38729        //    input by: Marc Palau
38730        //    input by: Brett Zamir (http://brett-zamir.me)
38731        //    input by: Bobby Drake
38732        //    input by: Evertjan Garretsen
38733        // bugfixed by: Kevin van Zonneveld (http://kvz.io)
38734        // bugfixed by: Onno Marsman (https://twitter.com/onnomarsman)
38735        // bugfixed by: Kevin van Zonneveld (http://kvz.io)
38736        // bugfixed by: Kevin van Zonneveld (http://kvz.io)
38737        // bugfixed by: Eric Nagel
38738        // bugfixed by: Kevin van Zonneveld (http://kvz.io)
38739        // bugfixed by: Tomasz Wesolowski
38740        //  revised by: Rafał Kukawski (http://blog.kukawski.pl)
38741        //   example 1: strip_tags('<p>Kevin</p> <br /><b>van</b> <i>Zonneveld</i>', '<i><b>')
38742        //   returns 1: 'Kevin <b>van</b> <i>Zonneveld</i>'
38743        //   example 2: strip_tags('<p>Kevin <img src="someimage.png" onmouseover="someFunction()">van <i>Zonneveld</i></p>', '<p>')
38744        //   returns 2: '<p>Kevin van Zonneveld</p>'
38745        //   example 3: strip_tags("<a href='http://kvz.io'>Kevin van Zonneveld</a>", "<a>")
38746        //   returns 3: "<a href='http://kvz.io'>Kevin van Zonneveld</a>"
38747        //   example 4: strip_tags('1 < 5 5 > 1')
38748        //   returns 4: '1 < 5 5 > 1'
38749        //   example 5: strip_tags('1 <br/> 1')
38750        //   returns 5: '1  1'
38751        //   example 6: strip_tags('1 <br/> 1', '<br>')
38752        //   returns 6: '1 <br/> 1'
38753        //   example 7: strip_tags('1 <br/> 1', '<br><br/>')
38754        //   returns 7: '1 <br/> 1'
38755        // making sure the allowed arg is a string containing only tags in lowercase (<a><b><c>)
38756        allowed = (((allowed || '') + '').toLowerCase().match(/<[a-z][a-z0-9]*>/g) || []).join('');
38757        var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi;
38758        var commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi;
38759        return input.replace(commentsAndPhpTags, '').replace(tags, function ($0, $1) {
38760          return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : '';
38761        });
38762      };
38763      /***/
38764
38765    },
38766    /* 14 */
38767
38768    /***/
38769    function (module, exports) {
38770      'use strict';
38771
38772      module.exports = function strtotime(text, now) {
38773        //  discuss at: http://locutus.io/php/strtotime/
38774        // original by: Caio Ariede (http://caioariede.com)
38775        // improved by: Kevin van Zonneveld (http://kvz.io)
38776        // improved by: Caio Ariede (http://caioariede.com)
38777        // improved by: A. Matías Quezada (http://amatiasq.com)
38778        // improved by: preuter
38779        // improved by: Brett Zamir (http://brett-zamir.me)
38780        // improved by: Mirko Faber
38781        //    input by: David
38782        // bugfixed by: Wagner B. Soares
38783        // bugfixed by: Artur Tchernychev
38784        // bugfixed by: Stephan Bösch-Plepelits (http://github.com/plepe)
38785        //      note 1: Examples all have a fixed timestamp to prevent
38786        //      note 1: tests to fail because of variable time(zones)
38787        //   example 1: strtotime('+1 day', 1129633200)
38788        //   returns 1: 1129719600
38789        //   example 2: strtotime('+1 week 2 days 4 hours 2 seconds', 1129633200)
38790        //   returns 2: 1130425202
38791        //   example 3: strtotime('last month', 1129633200)
38792        //   returns 3: 1127041200
38793        //   example 4: strtotime('2009-05-04 08:30:00 GMT')
38794        //   returns 4: 1241425800
38795        //   example 5: strtotime('2009-05-04 08:30:00+00')
38796        //   returns 5: 1241425800
38797        //   example 6: strtotime('2009-05-04 08:30:00+02:00')
38798        //   returns 6: 1241418600
38799        //   example 7: strtotime('2009-05-04T08:30:00Z')
38800        //   returns 7: 1241425800
38801        var parsed;
38802        var match;
38803        var today;
38804        var year;
38805        var date;
38806        var days;
38807        var ranges;
38808        var len;
38809        var times;
38810        var regex;
38811        var i;
38812        var fail = false;
38813
38814        if (!text) {
38815          return fail;
38816        } // Unecessary spaces
38817
38818
38819        text = text.replace(/^\s+|\s+$/g, '').replace(/\s{2,}/g, ' ').replace(/[\t\r\n]/g, '').toLowerCase(); // in contrast to php, js Date.parse function interprets:
38820        // dates given as yyyy-mm-dd as in timezone: UTC,
38821        // dates with "." or "-" as MDY instead of DMY
38822        // dates with two-digit years differently
38823        // etc...etc...
38824        // ...therefore we manually parse lots of common date formats
38825
38826        var pattern = new RegExp(['^(\\d{1,4})', '([\\-\\.\\/:])', '(\\d{1,2})', '([\\-\\.\\/:])', '(\\d{1,4})', '(?:\\s(\\d{1,2}):(\\d{2})?:?(\\d{2})?)?', '(?:\\s([A-Z]+)?)?$'].join(''));
38827        match = text.match(pattern);
38828
38829        if (match && match[2] === match[4]) {
38830          if (match[1] > 1901) {
38831            switch (match[2]) {
38832              case '-':
38833                // YYYY-M-D
38834                if (match[3] > 12 || match[5] > 31) {
38835                  return fail;
38836                }
38837
38838                return new Date(match[1], parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000;
38839
38840              case '.':
38841                // YYYY.M.D is not parsed by strtotime()
38842                return fail;
38843
38844              case '/':
38845                // YYYY/M/D
38846                if (match[3] > 12 || match[5] > 31) {
38847                  return fail;
38848                }
38849
38850                return new Date(match[1], parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000;
38851            }
38852          } else if (match[5] > 1901) {
38853            switch (match[2]) {
38854              case '-':
38855                // D-M-YYYY
38856                if (match[3] > 12 || match[1] > 31) {
38857                  return fail;
38858                }
38859
38860                return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000;
38861
38862              case '.':
38863                // D.M.YYYY
38864                if (match[3] > 12 || match[1] > 31) {
38865                  return fail;
38866                }
38867
38868                return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000;
38869
38870              case '/':
38871                // M/D/YYYY
38872                if (match[1] > 12 || match[3] > 31) {
38873                  return fail;
38874                }
38875
38876                return new Date(match[5], parseInt(match[1], 10) - 1, match[3], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000;
38877            }
38878          } else {
38879            switch (match[2]) {
38880              case '-':
38881                // YY-M-D
38882                if (match[3] > 12 || match[5] > 31 || match[1] < 70 && match[1] > 38) {
38883                  return fail;
38884                }
38885
38886                year = match[1] >= 0 && match[1] <= 38 ? +match[1] + 2000 : match[1];
38887                return new Date(year, parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000;
38888
38889              case '.':
38890                // D.M.YY or H.MM.SS
38891                if (match[5] >= 70) {
38892                  // D.M.YY
38893                  if (match[3] > 12 || match[1] > 31) {
38894                    return fail;
38895                  }
38896
38897                  return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000;
38898                }
38899
38900                if (match[5] < 60 && !match[6]) {
38901                  // H.MM.SS
38902                  if (match[1] > 23 || match[3] > 59) {
38903                    return fail;
38904                  }
38905
38906                  today = new Date();
38907                  return new Date(today.getFullYear(), today.getMonth(), today.getDate(), match[1] || 0, match[3] || 0, match[5] || 0, match[9] || 0) / 1000;
38908                } // invalid format, cannot be parsed
38909
38910
38911                return fail;
38912
38913              case '/':
38914                // M/D/YY
38915                if (match[1] > 12 || match[3] > 31 || match[5] < 70 && match[5] > 38) {
38916                  return fail;
38917                }
38918
38919                year = match[5] >= 0 && match[5] <= 38 ? +match[5] + 2000 : match[5];
38920                return new Date(year, parseInt(match[1], 10) - 1, match[3], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000;
38921
38922              case ':':
38923                // HH:MM:SS
38924                if (match[1] > 23 || match[3] > 59 || match[5] > 59) {
38925                  return fail;
38926                }
38927
38928                today = new Date();
38929                return new Date(today.getFullYear(), today.getMonth(), today.getDate(), match[1] || 0, match[3] || 0, match[5] || 0) / 1000;
38930            }
38931          }
38932        } // other formats and "now" should be parsed by Date.parse()
38933
38934
38935        if (text === 'now') {
38936          return now === null || isNaN(now) ? new Date().getTime() / 1000 | 0 : now | 0;
38937        }
38938
38939        if (!isNaN(parsed = Date.parse(text))) {
38940          return parsed / 1000 | 0;
38941        } // Browsers !== Chrome have problems parsing ISO 8601 date strings, as they do
38942        // not accept lower case characters, space, or shortened time zones.
38943        // Therefore, fix these problems and try again.
38944        // Examples:
38945        //   2015-04-15 20:33:59+02
38946        //   2015-04-15 20:33:59z
38947        //   2015-04-15t20:33:59+02:00
38948
38949
38950        pattern = new RegExp(['^([0-9]{4}-[0-9]{2}-[0-9]{2})', '[ t]', '([0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]+)?)', '([\\+-][0-9]{2}(:[0-9]{2})?|z)'].join(''));
38951        match = text.match(pattern);
38952
38953        if (match) {
38954          // @todo: time zone information
38955          if (match[4] === 'z') {
38956            match[4] = 'Z';
38957          } else if (match[4].match(/^([+-][0-9]{2})$/)) {
38958            match[4] = match[4] + ':00';
38959          }
38960
38961          if (!isNaN(parsed = Date.parse(match[1] + 'T' + match[2] + match[4]))) {
38962            return parsed / 1000 | 0;
38963          }
38964        }
38965
38966        date = now ? new Date(now * 1000) : new Date();
38967        days = {
38968          'sun': 0,
38969          'mon': 1,
38970          'tue': 2,
38971          'wed': 3,
38972          'thu': 4,
38973          'fri': 5,
38974          'sat': 6
38975        };
38976        ranges = {
38977          'yea': 'FullYear',
38978          'mon': 'Month',
38979          'day': 'Date',
38980          'hou': 'Hours',
38981          'min': 'Minutes',
38982          'sec': 'Seconds'
38983        };
38984
38985        function lastNext(type, range, modifier) {
38986          var diff;
38987          var day = days[range];
38988
38989          if (typeof day !== 'undefined') {
38990            diff = day - date.getDay();
38991
38992            if (diff === 0) {
38993              diff = 7 * modifier;
38994            } else if (diff > 0 && type === 'last') {
38995              diff -= 7;
38996            } else if (diff < 0 && type === 'next') {
38997              diff += 7;
38998            }
38999
39000            date.setDate(date.getDate() + diff);
39001          }
39002        }
39003
39004        function process(val) {
39005          // @todo: Reconcile this with regex using \s, taking into account
39006          // browser issues with split and regexes
39007          var splt = val.split(' ');
39008          var type = splt[0];
39009          var range = splt[1].substring(0, 3);
39010          var typeIsNumber = /\d+/.test(type);
39011          var ago = splt[2] === 'ago';
39012          var num = (type === 'last' ? -1 : 1) * (ago ? -1 : 1);
39013
39014          if (typeIsNumber) {
39015            num *= parseInt(type, 10);
39016          }
39017
39018          if (ranges.hasOwnProperty(range) && !splt[1].match(/^mon(day|\.)?$/i)) {
39019            return date['set' + ranges[range]](date['get' + ranges[range]]() + num);
39020          }
39021
39022          if (range === 'wee') {
39023            return date.setDate(date.getDate() + num * 7);
39024          }
39025
39026          if (type === 'next' || type === 'last') {
39027            lastNext(type, range, num);
39028          } else if (!typeIsNumber) {
39029            return false;
39030          }
39031
39032          return true;
39033        }
39034
39035        times = '(years?|months?|weeks?|days?|hours?|minutes?|min|seconds?|sec' + '|sunday|sun\\.?|monday|mon\\.?|tuesday|tue\\.?|wednesday|wed\\.?' + '|thursday|thu\\.?|friday|fri\\.?|saturday|sat\\.?)';
39036        regex = '([+-]?\\d+\\s' + times + '|' + '(last|next)\\s' + times + ')(\\sago)?';
39037        match = text.match(new RegExp(regex, 'gi'));
39038
39039        if (!match) {
39040          return fail;
39041        }
39042
39043        for (i = 0, len = match.length; i < len; i++) {
39044          if (!process(match[i])) {
39045            return fail;
39046          }
39047        }
39048
39049        return date.getTime() / 1000;
39050      };
39051      /***/
39052
39053    },
39054    /* 15 */
39055
39056    /***/
39057    function (module, exports) {
39058      'use strict';
39059
39060      module.exports = function date(format, timestamp) {
39061        //  discuss at: http://locutus.io/php/date/
39062        // original by: Carlos R. L. Rodrigues (http://www.jsfromhell.com)
39063        // original by: gettimeofday
39064        //    parts by: Peter-Paul Koch (http://www.quirksmode.org/js/beat.html)
39065        // improved by: Kevin van Zonneveld (http://kvz.io)
39066        // improved by: MeEtc (http://yass.meetcweb.com)
39067        // improved by: Brad Touesnard
39068        // improved by: Tim Wiel
39069        // improved by: Bryan Elliott
39070        // improved by: David Randall
39071        // improved by: Theriault (https://github.com/Theriault)
39072        // improved by: Theriault (https://github.com/Theriault)
39073        // improved by: Brett Zamir (http://brett-zamir.me)
39074        // improved by: Theriault (https://github.com/Theriault)
39075        // improved by: Thomas Beaucourt (http://www.webapp.fr)
39076        // improved by: JT
39077        // improved by: Theriault (https://github.com/Theriault)
39078        // improved by: Rafał Kukawski (http://blog.kukawski.pl)
39079        // improved by: Theriault (https://github.com/Theriault)
39080        //    input by: Brett Zamir (http://brett-zamir.me)
39081        //    input by: majak
39082        //    input by: Alex
39083        //    input by: Martin
39084        //    input by: Alex Wilson
39085        //    input by: Haravikk
39086        // bugfixed by: Kevin van Zonneveld (http://kvz.io)
39087        // bugfixed by: majak
39088        // bugfixed by: Kevin van Zonneveld (http://kvz.io)
39089        // bugfixed by: Brett Zamir (http://brett-zamir.me)
39090        // bugfixed by: omid (http://locutus.io/php/380:380#comment_137122)
39091        // bugfixed by: Chris (http://www.devotis.nl/)
39092        //      note 1: Uses global: locutus to store the default timezone
39093        //      note 1: Although the function potentially allows timezone info
39094        //      note 1: (see notes), it currently does not set
39095        //      note 1: per a timezone specified by date_default_timezone_set(). Implementers might use
39096        //      note 1: $locutus.currentTimezoneOffset and
39097        //      note 1: $locutus.currentTimezoneDST set by that function
39098        //      note 1: in order to adjust the dates in this function
39099        //      note 1: (or our other date functions!) accordingly
39100        //   example 1: date('H:m:s \\m \\i\\s \\m\\o\\n\\t\\h', 1062402400)
39101        //   returns 1: '07:09:40 m is month'
39102        //   example 2: date('F j, Y, g:i a', 1062462400)
39103        //   returns 2: 'September 2, 2003, 12:26 am'
39104        //   example 3: date('Y W o', 1062462400)
39105        //   returns 3: '2003 36 2003'
39106        //   example 4: var $x = date('Y m d', (new Date()).getTime() / 1000)
39107        //   example 4: $x = $x + ''
39108        //   example 4: var $result = $x.length // 2009 01 09
39109        //   returns 4: 10
39110        //   example 5: date('W', 1104534000)
39111        //   returns 5: '52'
39112        //   example 6: date('B t', 1104534000)
39113        //   returns 6: '999 31'
39114        //   example 7: date('W U', 1293750000.82); // 2010-12-31
39115        //   returns 7: '52 1293750000'
39116        //   example 8: date('W', 1293836400); // 2011-01-01
39117        //   returns 8: '52'
39118        //   example 9: date('W Y-m-d', 1293974054); // 2011-01-02
39119        //   returns 9: '52 2011-01-02'
39120        //        test: skip-1 skip-2 skip-5
39121        var jsdate, f; // Keep this here (works, but for code commented-out below for file size reasons)
39122        // var tal= [];
39123
39124        var txtWords = ['Sun', 'Mon', 'Tues', 'Wednes', 'Thurs', 'Fri', 'Satur', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; // trailing backslash -> (dropped)
39125        // a backslash followed by any character (including backslash) -> the character
39126        // empty string -> empty string
39127
39128        var formatChr = /\\?(.?)/gi;
39129
39130        var formatChrCb = function formatChrCb(t, s) {
39131          return f[t] ? f[t]() : s;
39132        };
39133
39134        var _pad = function _pad(n, c) {
39135          n = String(n);
39136
39137          while (n.length < c) {
39138            n = '0' + n;
39139          }
39140
39141          return n;
39142        };
39143
39144        f = {
39145          // Day
39146          d: function d() {
39147            // Day of month w/leading 0; 01..31
39148            return _pad(f.j(), 2);
39149          },
39150          D: function D() {
39151            // Shorthand day name; Mon...Sun
39152            return f.l().slice(0, 3);
39153          },
39154          j: function j() {
39155            // Day of month; 1..31
39156            return jsdate.getDate();
39157          },
39158          l: function l() {
39159            // Full day name; Monday...Sunday
39160            return txtWords[f.w()] + 'day';
39161          },
39162          N: function N() {
39163            // ISO-8601 day of week; 1[Mon]..7[Sun]
39164            return f.w() || 7;
39165          },
39166          S: function S() {
39167            // Ordinal suffix for day of month; st, nd, rd, th
39168            var j = f.j();
39169            var i = j % 10;
39170
39171            if (i <= 3 && parseInt(j % 100 / 10, 10) === 1) {
39172              i = 0;
39173            }
39174
39175            return ['st', 'nd', 'rd'][i - 1] || 'th';
39176          },
39177          w: function w() {
39178            // Day of week; 0[Sun]..6[Sat]
39179            return jsdate.getDay();
39180          },
39181          z: function z() {
39182            // Day of year; 0..365
39183            var a = new Date(f.Y(), f.n() - 1, f.j());
39184            var b = new Date(f.Y(), 0, 1);
39185            return Math.round((a - b) / 864e5);
39186          },
39187          // Week
39188          W: function W() {
39189            // ISO-8601 week number
39190            var a = new Date(f.Y(), f.n() - 1, f.j() - f.N() + 3);
39191            var b = new Date(a.getFullYear(), 0, 4);
39192            return _pad(1 + Math.round((a - b) / 864e5 / 7), 2);
39193          },
39194          // Month
39195          F: function F() {
39196            // Full month name; January...December
39197            return txtWords[6 + f.n()];
39198          },
39199          m: function m() {
39200            // Month w/leading 0; 01...12
39201            return _pad(f.n(), 2);
39202          },
39203          M: function M() {
39204            // Shorthand month name; Jan...Dec
39205            return f.F().slice(0, 3);
39206          },
39207          n: function n() {
39208            // Month; 1...12
39209            return jsdate.getMonth() + 1;
39210          },
39211          t: function t() {
39212            // Days in month; 28...31
39213            return new Date(f.Y(), f.n(), 0).getDate();
39214          },
39215          // Year
39216          L: function L() {
39217            // Is leap year?; 0 or 1
39218            var j = f.Y();
39219            return j % 4 === 0 & j % 100 !== 0 | j % 400 === 0;
39220          },
39221          o: function o() {
39222            // ISO-8601 year
39223            var n = f.n();
39224            var W = f.W();
39225            var Y = f.Y();
39226            return Y + (n === 12 && W < 9 ? 1 : n === 1 && W > 9 ? -1 : 0);
39227          },
39228          Y: function Y() {
39229            // Full year; e.g. 1980...2010
39230            return jsdate.getFullYear();
39231          },
39232          y: function y() {
39233            // Last two digits of year; 00...99
39234            return f.Y().toString().slice(-2);
39235          },
39236          // Time
39237          a: function a() {
39238            // am or pm
39239            return jsdate.getHours() > 11 ? 'pm' : 'am';
39240          },
39241          A: function A() {
39242            // AM or PM
39243            return f.a().toUpperCase();
39244          },
39245          B: function B() {
39246            // Swatch Internet time; 000..999
39247            var H = jsdate.getUTCHours() * 36e2; // Hours
39248
39249            var i = jsdate.getUTCMinutes() * 60; // Minutes
39250            // Seconds
39251
39252            var s = jsdate.getUTCSeconds();
39253            return _pad(Math.floor((H + i + s + 36e2) / 86.4) % 1e3, 3);
39254          },
39255          g: function g() {
39256            // 12-Hours; 1..12
39257            return f.G() % 12 || 12;
39258          },
39259          G: function G() {
39260            // 24-Hours; 0..23
39261            return jsdate.getHours();
39262          },
39263          h: function h() {
39264            // 12-Hours w/leading 0; 01..12
39265            return _pad(f.g(), 2);
39266          },
39267          H: function H() {
39268            // 24-Hours w/leading 0; 00..23
39269            return _pad(f.G(), 2);
39270          },
39271          i: function i() {
39272            // Minutes w/leading 0; 00..59
39273            return _pad(jsdate.getMinutes(), 2);
39274          },
39275          s: function s() {
39276            // Seconds w/leading 0; 00..59
39277            return _pad(jsdate.getSeconds(), 2);
39278          },
39279          u: function u() {
39280            // Microseconds; 000000-999000
39281            return _pad(jsdate.getMilliseconds() * 1000, 6);
39282          },
39283          // Timezone
39284          e: function e() {
39285            // Timezone identifier; e.g. Atlantic/Azores, ...
39286            // The following works, but requires inclusion of the very large
39287            // timezone_abbreviations_list() function.
39288
39289            /*              return that.date_default_timezone_get();
39290             */
39291            var msg = 'Not supported (see source code of date() for timezone on how to add support)';
39292            throw new Error(msg);
39293          },
39294          I: function I() {
39295            // DST observed?; 0 or 1
39296            // Compares Jan 1 minus Jan 1 UTC to Jul 1 minus Jul 1 UTC.
39297            // If they are not equal, then DST is observed.
39298            var a = new Date(f.Y(), 0); // Jan 1
39299
39300            var c = Date.UTC(f.Y(), 0); // Jan 1 UTC
39301
39302            var b = new Date(f.Y(), 6); // Jul 1
39303            // Jul 1 UTC
39304
39305            var d = Date.UTC(f.Y(), 6);
39306            return a - c !== b - d ? 1 : 0;
39307          },
39308          O: function O() {
39309            // Difference to GMT in hour format; e.g. +0200
39310            var tzo = jsdate.getTimezoneOffset();
39311            var a = Math.abs(tzo);
39312            return (tzo > 0 ? '-' : '+') + _pad(Math.floor(a / 60) * 100 + a % 60, 4);
39313          },
39314          P: function P() {
39315            // Difference to GMT w/colon; e.g. +02:00
39316            var O = f.O();
39317            return O.substr(0, 3) + ':' + O.substr(3, 2);
39318          },
39319          T: function T() {
39320            // The following works, but requires inclusion of the very
39321            // large timezone_abbreviations_list() function.
39322
39323            /*              var abbr, i, os, _default;
39324            if (!tal.length) {
39325              tal = that.timezone_abbreviations_list();
39326            }
39327            if ($locutus && $locutus.default_timezone) {
39328              _default = $locutus.default_timezone;
39329              for (abbr in tal) {
39330                for (i = 0; i < tal[abbr].length; i++) {
39331                  if (tal[abbr][i].timezone_id === _default) {
39332                    return abbr.toUpperCase();
39333                  }
39334                }
39335              }
39336            }
39337            for (abbr in tal) {
39338              for (i = 0; i < tal[abbr].length; i++) {
39339                os = -jsdate.getTimezoneOffset() * 60;
39340                if (tal[abbr][i].offset === os) {
39341                  return abbr.toUpperCase();
39342                }
39343              }
39344            }
39345            */
39346            return 'UTC';
39347          },
39348          Z: function Z() {
39349            // Timezone offset in seconds (-43200...50400)
39350            return -jsdate.getTimezoneOffset() * 60;
39351          },
39352          // Full Date/Time
39353          c: function c() {
39354            // ISO-8601 date.
39355            return 'Y-m-d\\TH:i:sP'.replace(formatChr, formatChrCb);
39356          },
39357          r: function r() {
39358            // RFC 2822
39359            return 'D, d M Y H:i:s O'.replace(formatChr, formatChrCb);
39360          },
39361          U: function U() {
39362            // Seconds since UNIX epoch
39363            return jsdate / 1000 | 0;
39364          }
39365        };
39366
39367        var _date = function _date(format, timestamp) {
39368          jsdate = timestamp === undefined ? new Date() // Not provided
39369          : timestamp instanceof Date ? new Date(timestamp) // JS Date()
39370          : new Date(timestamp * 1000) // UNIX timestamp (auto-convert to int)
39371          ;
39372          return format.replace(formatChr, formatChrCb);
39373        };
39374
39375        return _date(format, timestamp);
39376      };
39377      /***/
39378
39379    },
39380    /* 16 */
39381
39382    /***/
39383    function (module, exports) {
39384      'use strict';
39385
39386      module.exports = function boolval(mixedVar) {
39387        // original by: Will Rowe
39388        //   example 1: boolval(true)
39389        //   returns 1: true
39390        //   example 2: boolval(false)
39391        //   returns 2: false
39392        //   example 3: boolval(0)
39393        //   returns 3: false
39394        //   example 4: boolval(0.0)
39395        //   returns 4: false
39396        //   example 5: boolval('')
39397        //   returns 5: false
39398        //   example 6: boolval('0')
39399        //   returns 6: false
39400        //   example 7: boolval([])
39401        //   returns 7: false
39402        //   example 8: boolval('')
39403        //   returns 8: false
39404        //   example 9: boolval(null)
39405        //   returns 9: false
39406        //   example 10: boolval(undefined)
39407        //   returns 10: false
39408        //   example 11: boolval('true')
39409        //   returns 11: true
39410        if (mixedVar === false) {
39411          return false;
39412        }
39413
39414        if (mixedVar === 0 || mixedVar === 0.0) {
39415          return false;
39416        }
39417
39418        if (mixedVar === '' || mixedVar === '0') {
39419          return false;
39420        }
39421
39422        if (Array.isArray(mixedVar) && mixedVar.length === 0) {
39423          return false;
39424        }
39425
39426        if (mixedVar === null || mixedVar === undefined) {
39427          return false;
39428        }
39429
39430        return true;
39431      };
39432      /***/
39433
39434    },
39435    /* 17 */
39436
39437    /***/
39438    function (module, exports) {
39439      module.exports = function (Twig) {
39440        'use strict';
39441
39442        Twig.Templates.registerLoader('ajax', function (location, params, callback, error_callback) {
39443          var template,
39444              xmlhttp,
39445              precompiled = params.precompiled,
39446              parser = this.parsers[params.parser] || this.parser.twig;
39447
39448          if (typeof XMLHttpRequest === "undefined") {
39449            throw new Twig.Error('Unsupported platform: Unable to do ajax requests ' + 'because there is no "XMLHTTPRequest" implementation');
39450          }
39451
39452          xmlhttp = new XMLHttpRequest();
39453
39454          xmlhttp.onreadystatechange = function () {
39455            var data = null;
39456
39457            if (xmlhttp.readyState === 4) {
39458              if (xmlhttp.status === 200 || window.cordova && xmlhttp.status == 0) {
39459                Twig.log.debug("Got template ", xmlhttp.responseText);
39460
39461                if (precompiled === true) {
39462                  data = JSON.parse(xmlhttp.responseText);
39463                } else {
39464                  data = xmlhttp.responseText;
39465                }
39466
39467                params.url = location;
39468                params.data = data;
39469                template = parser.call(this, params);
39470
39471                if (typeof callback === 'function') {
39472                  callback(template);
39473                }
39474              } else {
39475                if (typeof error_callback === 'function') {
39476                  error_callback(xmlhttp);
39477                }
39478              }
39479            }
39480          };
39481
39482          xmlhttp.open("GET", location, !!params.async);
39483          xmlhttp.send();
39484
39485          if (params.async) {
39486            // TODO: return deferred promise
39487            return true;
39488          } else {
39489            return template;
39490          }
39491        });
39492      };
39493      /***/
39494
39495    },
39496    /* 18 */
39497
39498    /***/
39499    function (module, exports, __webpack_require__) {
39500      module.exports = function (Twig) {
39501        'use strict';
39502
39503        var fs, path;
39504
39505        try {
39506          // require lib dependencies at runtime
39507          fs = __webpack_require__(19);
39508          path = __webpack_require__(20);
39509        } catch (e) {// NOTE: this is in a try/catch to avoid errors cross platform
39510        }
39511
39512        Twig.Templates.registerLoader('fs', function (location, params, callback, error_callback) {
39513          var template,
39514              data = null,
39515              precompiled = params.precompiled,
39516              parser = this.parsers[params.parser] || this.parser.twig;
39517
39518          if (!fs || !path) {
39519            throw new Twig.Error('Unsupported platform: Unable to load from file ' + 'because there is no "fs" or "path" implementation');
39520          }
39521
39522          var loadTemplateFn = function loadTemplateFn(err, data) {
39523            if (err) {
39524              if (typeof error_callback === 'function') {
39525                error_callback(err);
39526              }
39527
39528              return;
39529            }
39530
39531            if (precompiled === true) {
39532              data = JSON.parse(data);
39533            }
39534
39535            params.data = data;
39536            params.path = params.path || location; // template is in data
39537
39538            template = parser.call(this, params);
39539
39540            if (typeof callback === 'function') {
39541              callback(template);
39542            }
39543          };
39544
39545          params.path = params.path || location;
39546
39547          if (params.async) {
39548            fs.stat(params.path, function (err, stats) {
39549              if (err || !stats.isFile()) {
39550                if (typeof error_callback === 'function') {
39551                  error_callback(new Twig.Error('Unable to find template file ' + params.path));
39552                }
39553
39554                return;
39555              }
39556
39557              fs.readFile(params.path, 'utf8', loadTemplateFn);
39558            }); // TODO: return deferred promise
39559
39560            return true;
39561          } else {
39562            try {
39563              if (!fs.statSync(params.path).isFile()) {
39564                throw new Twig.Error('Unable to find template file ' + params.path);
39565              }
39566            } catch (err) {
39567              throw new Twig.Error('Unable to find template file ' + params.path);
39568            }
39569
39570            data = fs.readFileSync(params.path, 'utf8');
39571            loadTemplateFn(undefined, data);
39572            return template;
39573          }
39574        });
39575      };
39576      /***/
39577
39578    },
39579    /* 19 */
39580
39581    /***/
39582    function (module, exports) {
39583      module.exports = __webpack_require__(/*! fs */ 2);
39584      /***/
39585    },
39586    /* 20 */
39587
39588    /***/
39589    function (module, exports) {
39590      module.exports = __webpack_require__(/*! path */ "../node_modules/path-browserify/index.js");
39591      /***/
39592    },
39593    /* 21 */
39594
39595    /***/
39596    function (module, exports) {
39597      // ## twig.logic.js
39598      //
39599      // This file handles tokenizing, compiling and parsing logic tokens. {% ... %}
39600      module.exports = function (Twig) {
39601        "use strict";
39602        /**
39603         * Namespace for logic handling.
39604         */
39605
39606        Twig.logic = {};
39607        /**
39608         * Logic token types.
39609         */
39610
39611        Twig.logic.type = {
39612          if_: 'Twig.logic.type.if',
39613          endif: 'Twig.logic.type.endif',
39614          for_: 'Twig.logic.type.for',
39615          endfor: 'Twig.logic.type.endfor',
39616          else_: 'Twig.logic.type.else',
39617          elseif: 'Twig.logic.type.elseif',
39618          set: 'Twig.logic.type.set',
39619          setcapture: 'Twig.logic.type.setcapture',
39620          endset: 'Twig.logic.type.endset',
39621          filter: 'Twig.logic.type.filter',
39622          endfilter: 'Twig.logic.type.endfilter',
39623          shortblock: 'Twig.logic.type.shortblock',
39624          block: 'Twig.logic.type.block',
39625          endblock: 'Twig.logic.type.endblock',
39626          extends_: 'Twig.logic.type.extends',
39627          use: 'Twig.logic.type.use',
39628          include: 'Twig.logic.type.include',
39629          spaceless: 'Twig.logic.type.spaceless',
39630          endspaceless: 'Twig.logic.type.endspaceless',
39631          macro: 'Twig.logic.type.macro',
39632          endmacro: 'Twig.logic.type.endmacro',
39633          import_: 'Twig.logic.type.import',
39634          from: 'Twig.logic.type.from',
39635          embed: 'Twig.logic.type.embed',
39636          endembed: 'Twig.logic.type.endembed'
39637        }; // Regular expressions for handling logic tokens.
39638        //
39639        // Properties:
39640        //
39641        //      type:  The type of expression this matches
39642        //
39643        //      regex: A regular expression that matches the format of the token
39644        //
39645        //      next:  What logic tokens (if any) pop this token off the logic stack. If empty, the
39646        //             logic token is assumed to not require an end tag and isn't push onto the stack.
39647        //
39648        //      open:  Does this tag open a logic expression or is it standalone. For example,
39649        //             {% endif %} cannot exist without an opening {% if ... %} tag, so open = false.
39650        //
39651        //  Functions:
39652        //
39653        //      compile: A function that handles compiling the token into an output token ready for
39654        //               parsing with the parse function.
39655        //
39656        //      parse:   A function that parses the compiled token into output (HTML / whatever the
39657        //               template represents).
39658
39659        Twig.logic.definitions = [{
39660          /**
39661           * If type logic tokens.
39662           *
39663           *  Format: {% if expression %}
39664           */
39665          type: Twig.logic.type.if_,
39666          regex: /^if\s+([\s\S]+)$/,
39667          next: [Twig.logic.type.else_, Twig.logic.type.elseif, Twig.logic.type.endif],
39668          open: true,
39669          compile: function compile(token) {
39670            var expression = token.match[1]; // Compile the expression.
39671
39672            token.stack = Twig.expression.compile.apply(this, [{
39673              type: Twig.expression.type.expression,
39674              value: expression
39675            }]).stack;
39676            delete token.match;
39677            return token;
39678          },
39679          parse: function parse(token, context, chain) {
39680            var that = this;
39681            return Twig.expression.parseAsync.apply(this, [token.stack, context]).then(function (result) {
39682              chain = true;
39683
39684              if (Twig.lib.boolval(result)) {
39685                chain = false;
39686                return Twig.parseAsync.apply(that, [token.output, context]);
39687              }
39688
39689              return '';
39690            }).then(function (output) {
39691              return {
39692                chain: chain,
39693                output: output
39694              };
39695            });
39696          }
39697        }, {
39698          /**
39699           * Else if type logic tokens.
39700           *
39701           *  Format: {% elseif expression %}
39702           */
39703          type: Twig.logic.type.elseif,
39704          regex: /^elseif\s+([^\s].*)$/,
39705          next: [Twig.logic.type.else_, Twig.logic.type.elseif, Twig.logic.type.endif],
39706          open: false,
39707          compile: function compile(token) {
39708            var expression = token.match[1]; // Compile the expression.
39709
39710            token.stack = Twig.expression.compile.apply(this, [{
39711              type: Twig.expression.type.expression,
39712              value: expression
39713            }]).stack;
39714            delete token.match;
39715            return token;
39716          },
39717          parse: function parse(token, context, chain) {
39718            var that = this;
39719            return Twig.expression.parseAsync.apply(this, [token.stack, context]).then(function (result) {
39720              if (chain && Twig.lib.boolval(result)) {
39721                chain = false;
39722                return Twig.parseAsync.apply(that, [token.output, context]);
39723              }
39724
39725              return '';
39726            }).then(function (output) {
39727              return {
39728                chain: chain,
39729                output: output
39730              };
39731            });
39732          }
39733        }, {
39734          /**
39735           * Else if type logic tokens.
39736           *
39737           *  Format: {% elseif expression %}
39738           */
39739          type: Twig.logic.type.else_,
39740          regex: /^else$/,
39741          next: [Twig.logic.type.endif, Twig.logic.type.endfor],
39742          open: false,
39743          parse: function parse(token, context, chain) {
39744            var promise = Twig.Promise.resolve('');
39745
39746            if (chain) {
39747              promise = Twig.parseAsync.apply(this, [token.output, context]);
39748            }
39749
39750            return promise.then(function (output) {
39751              return {
39752                chain: chain,
39753                output: output
39754              };
39755            });
39756          }
39757        }, {
39758          /**
39759           * End if type logic tokens.
39760           *
39761           *  Format: {% endif %}
39762           */
39763          type: Twig.logic.type.endif,
39764          regex: /^endif$/,
39765          next: [],
39766          open: false
39767        }, {
39768          /**
39769           * For type logic tokens.
39770           *
39771           *  Format: {% for expression %}
39772           */
39773          type: Twig.logic.type.for_,
39774          regex: /^for\s+([a-zA-Z0-9_,\s]+)\s+in\s+([^\s].*?)(?:\s+if\s+([^\s].*))?$/,
39775          next: [Twig.logic.type.else_, Twig.logic.type.endfor],
39776          open: true,
39777          compile: function compile(token) {
39778            var key_value = token.match[1],
39779                expression = token.match[2],
39780                conditional = token.match[3],
39781                kv_split = null;
39782            token.key_var = null;
39783            token.value_var = null;
39784
39785            if (key_value.indexOf(",") >= 0) {
39786              kv_split = key_value.split(',');
39787
39788              if (kv_split.length === 2) {
39789                token.key_var = kv_split[0].trim();
39790                token.value_var = kv_split[1].trim();
39791              } else {
39792                throw new Twig.Error("Invalid expression in for loop: " + key_value);
39793              }
39794            } else {
39795              token.value_var = key_value;
39796            } // Valid expressions for a for loop
39797            //   for item     in expression
39798            //   for key,item in expression
39799            // Compile the expression.
39800
39801
39802            token.expression = Twig.expression.compile.apply(this, [{
39803              type: Twig.expression.type.expression,
39804              value: expression
39805            }]).stack; // Compile the conditional (if available)
39806
39807            if (conditional) {
39808              token.conditional = Twig.expression.compile.apply(this, [{
39809                type: Twig.expression.type.expression,
39810                value: conditional
39811              }]).stack;
39812            }
39813
39814            delete token.match;
39815            return token;
39816          },
39817          parse: function parse(token, context, continue_chain) {
39818            // Parse expression
39819            var output = [],
39820                len,
39821                index = 0,
39822                keyset,
39823                that = this,
39824                conditional = token.conditional,
39825                buildLoop = function buildLoop(index, len) {
39826              var isConditional = conditional !== undefined;
39827              return {
39828                index: index + 1,
39829                index0: index,
39830                revindex: isConditional ? undefined : len - index,
39831                revindex0: isConditional ? undefined : len - index - 1,
39832                first: index === 0,
39833                last: isConditional ? undefined : index === len - 1,
39834                length: isConditional ? undefined : len,
39835                parent: context
39836              };
39837            },
39838                // run once for each iteration of the loop
39839            loop = function loop(key, value) {
39840              var inner_context = Twig.ChildContext(context);
39841              inner_context[token.value_var] = value;
39842
39843              if (token.key_var) {
39844                inner_context[token.key_var] = key;
39845              } // Loop object
39846
39847
39848              inner_context.loop = buildLoop(index, len);
39849              var promise = conditional === undefined ? Twig.Promise.resolve(true) : Twig.expression.parseAsync.apply(that, [conditional, inner_context]);
39850              promise.then(function (condition) {
39851                if (!condition) return;
39852                return Twig.parseAsync.apply(that, [token.output, inner_context]).then(function (o) {
39853                  output.push(o);
39854                  index += 1;
39855                });
39856              }).then(function () {
39857                // Delete loop-related variables from the context
39858                delete inner_context['loop'];
39859                delete inner_context[token.value_var];
39860                delete inner_context[token.key_var]; // Merge in values that exist in context but have changed
39861                // in inner_context.
39862
39863                Twig.merge(context, inner_context, true);
39864              });
39865            };
39866
39867            return Twig.expression.parseAsync.apply(this, [token.expression, context]).then(function (result) {
39868              if (Twig.lib.is('Array', result)) {
39869                len = result.length;
39870                Twig.async.forEach(result, function (value) {
39871                  var key = index;
39872                  return loop(key, value);
39873                });
39874              } else if (Twig.lib.is('Object', result)) {
39875                if (result._keys !== undefined) {
39876                  keyset = result._keys;
39877                } else {
39878                  keyset = Object.keys(result);
39879                }
39880
39881                len = keyset.length;
39882                Twig.forEach(keyset, function (key) {
39883                  // Ignore the _keys property, it's internal to twig.js
39884                  if (key === "_keys") return;
39885                  loop(key, result[key]);
39886                });
39887              } // Only allow else statements if no output was generated
39888
39889
39890              continue_chain = output.length === 0;
39891              return {
39892                chain: continue_chain,
39893                output: Twig.output.apply(that, [output])
39894              };
39895            });
39896          }
39897        }, {
39898          /**
39899           * End if type logic tokens.
39900           *
39901           *  Format: {% endif %}
39902           */
39903          type: Twig.logic.type.endfor,
39904          regex: /^endfor$/,
39905          next: [],
39906          open: false
39907        }, {
39908          /**
39909           * Set type logic tokens.
39910           *
39911           *  Format: {% set key = expression %}
39912           */
39913          type: Twig.logic.type.set,
39914          regex: /^set\s+([a-zA-Z0-9_,\s]+)\s*=\s*([\s\S]+)$/,
39915          next: [],
39916          open: true,
39917          compile: function compile(token) {
39918            var key = token.match[1].trim(),
39919                expression = token.match[2],
39920                // Compile the expression.
39921            expression_stack = Twig.expression.compile.apply(this, [{
39922              type: Twig.expression.type.expression,
39923              value: expression
39924            }]).stack;
39925            token.key = key;
39926            token.expression = expression_stack;
39927            delete token.match;
39928            return token;
39929          },
39930          parse: function parse(token, context, continue_chain) {
39931            var key = token.key;
39932            return Twig.expression.parseAsync.apply(this, [token.expression, context]).then(function (value) {
39933              if (value === context) {
39934                /*  If storing the context in a variable, it needs to be a clone of the current state of context.
39935                    Otherwise we have a context with infinite recursion.
39936                    Fixes #341
39937                */
39938                value = Twig.lib.copy(value);
39939              }
39940
39941              context[key] = value;
39942              return {
39943                chain: continue_chain,
39944                context: context
39945              };
39946            });
39947          }
39948        }, {
39949          /**
39950           * Set capture type logic tokens.
39951           *
39952           *  Format: {% set key %}
39953           */
39954          type: Twig.logic.type.setcapture,
39955          regex: /^set\s+([a-zA-Z0-9_,\s]+)$/,
39956          next: [Twig.logic.type.endset],
39957          open: true,
39958          compile: function compile(token) {
39959            var key = token.match[1].trim();
39960            token.key = key;
39961            delete token.match;
39962            return token;
39963          },
39964          parse: function parse(token, context, continue_chain) {
39965            var that = this,
39966                key = token.key;
39967            return Twig.parseAsync.apply(this, [token.output, context]).then(function (value) {
39968              // set on both the global and local context
39969              that.context[key] = value;
39970              context[key] = value;
39971              return {
39972                chain: continue_chain,
39973                context: context
39974              };
39975            });
39976          }
39977        }, {
39978          /**
39979           * End set type block logic tokens.
39980           *
39981           *  Format: {% endset %}
39982           */
39983          type: Twig.logic.type.endset,
39984          regex: /^endset$/,
39985          next: [],
39986          open: false
39987        }, {
39988          /**
39989           * Filter logic tokens.
39990           *
39991           *  Format: {% filter upper %} or {% filter lower|escape %}
39992           */
39993          type: Twig.logic.type.filter,
39994          regex: /^filter\s+(.+)$/,
39995          next: [Twig.logic.type.endfilter],
39996          open: true,
39997          compile: function compile(token) {
39998            var expression = "|" + token.match[1].trim(); // Compile the expression.
39999
40000            token.stack = Twig.expression.compile.apply(this, [{
40001              type: Twig.expression.type.expression,
40002              value: expression
40003            }]).stack;
40004            delete token.match;
40005            return token;
40006          },
40007          parse: function parse(token, context, chain) {
40008            return Twig.parseAsync.apply(this, [token.output, context]).then(function (unfiltered) {
40009              var stack = [{
40010                type: Twig.expression.type.string,
40011                value: unfiltered
40012              }].concat(token.stack);
40013              return Twig.expression.parseAsync.apply(that, [stack, context]);
40014            }).then(function (output) {
40015              return {
40016                chain: chain,
40017                output: output
40018              };
40019            });
40020          }
40021        }, {
40022          /**
40023           * End filter logic tokens.
40024           *
40025           *  Format: {% endfilter %}
40026           */
40027          type: Twig.logic.type.endfilter,
40028          regex: /^endfilter$/,
40029          next: [],
40030          open: false
40031        }, {
40032          /**
40033           * Block logic tokens.
40034           *
40035           *  Format: {% block title %}
40036           */
40037          type: Twig.logic.type.block,
40038          regex: /^block\s+([a-zA-Z0-9_]+)$/,
40039          next: [Twig.logic.type.endblock],
40040          open: true,
40041          compile: function compile(token) {
40042            token.block = token.match[1].trim();
40043            delete token.match;
40044            return token;
40045          },
40046          parse: function parse(token, context, chain) {
40047            var that = this,
40048                block_output,
40049                output,
40050                promise = Twig.Promise.resolve(),
40051                isImported = Twig.indexOf(this.importedBlocks, token.block) > -1,
40052                hasParent = this.blocks[token.block] && Twig.indexOf(this.blocks[token.block], Twig.placeholders.parent) > -1; // Don't override previous blocks unless they're imported with "use"
40053            // Loops should be exempted as well.
40054
40055            if (this.blocks[token.block] === undefined || isImported || hasParent || context.loop || token.overwrite) {
40056              if (token.expression) {
40057                promise = Twig.expression.parseAsync.apply(this, [token.output, context]).then(function (value) {
40058                  return Twig.expression.parseAsync.apply(that, [{
40059                    type: Twig.expression.type.string,
40060                    value: value
40061                  }, context]);
40062                });
40063              } else {
40064                promise = Twig.parseAsync.apply(this, [token.output, context]).then(function (value) {
40065                  return Twig.expression.parseAsync.apply(that, [{
40066                    type: Twig.expression.type.string,
40067                    value: value
40068                  }, context]);
40069                });
40070              }
40071
40072              promise = promise.then(function (block_output) {
40073                if (isImported) {
40074                  // once the block is overridden, remove it from the list of imported blocks
40075                  that.importedBlocks.splice(that.importedBlocks.indexOf(token.block), 1);
40076                }
40077
40078                if (hasParent) {
40079                  that.blocks[token.block] = Twig.Markup(that.blocks[token.block].replace(Twig.placeholders.parent, block_output));
40080                } else {
40081                  that.blocks[token.block] = block_output;
40082                }
40083
40084                that.originalBlockTokens[token.block] = {
40085                  type: token.type,
40086                  block: token.block,
40087                  output: token.output,
40088                  overwrite: true
40089                };
40090              });
40091            }
40092
40093            return promise.then(function () {
40094              // Check if a child block has been set from a template extending this one.
40095              if (that.child.blocks[token.block]) {
40096                output = that.child.blocks[token.block];
40097              } else {
40098                output = that.blocks[token.block];
40099              }
40100
40101              return {
40102                chain: chain,
40103                output: output
40104              };
40105            });
40106          }
40107        }, {
40108          /**
40109           * Block shorthand logic tokens.
40110           *
40111           *  Format: {% block title expression %}
40112           */
40113          type: Twig.logic.type.shortblock,
40114          regex: /^block\s+([a-zA-Z0-9_]+)\s+(.+)$/,
40115          next: [],
40116          open: true,
40117          compile: function compile(token) {
40118            token.expression = token.match[2].trim();
40119            token.output = Twig.expression.compile({
40120              type: Twig.expression.type.expression,
40121              value: token.expression
40122            }).stack;
40123            token.block = token.match[1].trim();
40124            delete token.match;
40125            return token;
40126          },
40127          parse: function parse(token, context, chain) {
40128            return Twig.logic.handler[Twig.logic.type.block].parse.apply(this, arguments);
40129          }
40130        }, {
40131          /**
40132           * End block logic tokens.
40133           *
40134           *  Format: {% endblock %}
40135           */
40136          type: Twig.logic.type.endblock,
40137          regex: /^endblock(?:\s+([a-zA-Z0-9_]+))?$/,
40138          next: [],
40139          open: false
40140        }, {
40141          /**
40142           * Block logic tokens.
40143           *
40144           *  Format: {% extends "template.twig" %}
40145           */
40146          type: Twig.logic.type.extends_,
40147          regex: /^extends\s+(.+)$/,
40148          next: [],
40149          open: true,
40150          compile: function compile(token) {
40151            var expression = token.match[1].trim();
40152            delete token.match;
40153            token.stack = Twig.expression.compile.apply(this, [{
40154              type: Twig.expression.type.expression,
40155              value: expression
40156            }]).stack;
40157            return token;
40158          },
40159          parse: function parse(token, context, chain) {
40160            var template,
40161                that = this,
40162                innerContext = Twig.ChildContext(context); // Resolve filename
40163
40164            return Twig.expression.parseAsync.apply(this, [token.stack, context]).then(function (file) {
40165              // Set parent template
40166              that.extend = file;
40167
40168              if (file instanceof Twig.Template) {
40169                template = file;
40170              } else {
40171                // Import file
40172                template = that.importFile(file);
40173              } // Render the template in case it puts anything in its context
40174
40175
40176              return template.renderAsync(innerContext);
40177            }).then(function () {
40178              // Extend the parent context with the extended context
40179              Twig.lib.extend(context, innerContext);
40180              return {
40181                chain: chain,
40182                output: ''
40183              };
40184            });
40185          }
40186        }, {
40187          /**
40188           * Block logic tokens.
40189           *
40190           *  Format: {% use "template.twig" %}
40191           */
40192          type: Twig.logic.type.use,
40193          regex: /^use\s+(.+)$/,
40194          next: [],
40195          open: true,
40196          compile: function compile(token) {
40197            var expression = token.match[1].trim();
40198            delete token.match;
40199            token.stack = Twig.expression.compile.apply(this, [{
40200              type: Twig.expression.type.expression,
40201              value: expression
40202            }]).stack;
40203            return token;
40204          },
40205          parse: function parse(token, context, chain) {
40206            var that = this; // Resolve filename
40207
40208            return Twig.expression.parseAsync.apply(this, [token.stack, context]).then(function (file) {
40209              // Import blocks
40210              that.importBlocks(file);
40211              return {
40212                chain: chain,
40213                output: ''
40214              };
40215            });
40216          }
40217        }, {
40218          /**
40219           * Block logic tokens.
40220           *
40221           *  Format: {% includes "template.twig" [with {some: 'values'} only] %}
40222           */
40223          type: Twig.logic.type.include,
40224          regex: /^include\s+(.+?)(?:\s|$)(ignore missing(?:\s|$))?(?:with\s+([\S\s]+?))?(?:\s|$)(only)?$/,
40225          next: [],
40226          open: true,
40227          compile: function compile(token) {
40228            var match = token.match,
40229                expression = match[1].trim(),
40230                ignoreMissing = match[2] !== undefined,
40231                withContext = match[3],
40232                only = match[4] !== undefined && match[4].length;
40233            delete token.match;
40234            token.only = only;
40235            token.ignoreMissing = ignoreMissing;
40236            token.stack = Twig.expression.compile.apply(this, [{
40237              type: Twig.expression.type.expression,
40238              value: expression
40239            }]).stack;
40240
40241            if (withContext !== undefined) {
40242              token.withStack = Twig.expression.compile.apply(this, [{
40243                type: Twig.expression.type.expression,
40244                value: withContext.trim()
40245              }]).stack;
40246            }
40247
40248            return token;
40249          },
40250          parse: function parse(token, context, chain) {
40251            // Resolve filename
40252            var innerContext = {},
40253                i,
40254                template,
40255                that = this,
40256                promise = Twig.Promise.resolve();
40257
40258            if (!token.only) {
40259              innerContext = Twig.ChildContext(context);
40260            }
40261
40262            if (token.withStack !== undefined) {
40263              promise = Twig.expression.parseAsync.apply(this, [token.withStack, context]).then(function (withContext) {
40264                for (i in withContext) {
40265                  if (withContext.hasOwnProperty(i)) innerContext[i] = withContext[i];
40266                }
40267              });
40268            }
40269
40270            return promise.then(function () {
40271              return Twig.expression.parseAsync.apply(that, [token.stack, context]);
40272            }).then(function (file) {
40273              if (file instanceof Twig.Template) {
40274                template = file;
40275              } else {
40276                // Import file
40277                try {
40278                  template = that.importFile(file);
40279                } catch (err) {
40280                  if (token.ignoreMissing) {
40281                    return '';
40282                  }
40283
40284                  throw err;
40285                }
40286              }
40287
40288              return template.renderAsync(innerContext);
40289            }).then(function (output) {
40290              return {
40291                chain: chain,
40292                output: output
40293              };
40294            });
40295          }
40296        }, {
40297          type: Twig.logic.type.spaceless,
40298          regex: /^spaceless$/,
40299          next: [Twig.logic.type.endspaceless],
40300          open: true,
40301          // Parse the html and return it without any spaces between tags
40302          parse: function parse(token, context, chain) {
40303            // Parse the output without any filter
40304            return Twig.parseAsync.apply(this, [token.output, context]).then(function (unfiltered) {
40305              var // A regular expression to find closing and opening tags with spaces between them
40306              rBetweenTagSpaces = />\s+</g,
40307                  // Replace all space between closing and opening html tags
40308              output = unfiltered.replace(rBetweenTagSpaces, '><').trim(); // Rewrap output as a Twig.Markup
40309
40310              output = Twig.Markup(output);
40311              return {
40312                chain: chain,
40313                output: output
40314              };
40315            });
40316          }
40317        }, // Add the {% endspaceless %} token
40318        {
40319          type: Twig.logic.type.endspaceless,
40320          regex: /^endspaceless$/,
40321          next: [],
40322          open: false
40323        }, {
40324          /**
40325           * Macro logic tokens.
40326           *
40327           * Format: {% maro input(name, value, type, size) %}
40328           *
40329           */
40330          type: Twig.logic.type.macro,
40331          regex: /^macro\s+([a-zA-Z0-9_]+)\s*\(\s*((?:[a-zA-Z0-9_]+(?:,\s*)?)*)\s*\)$/,
40332          next: [Twig.logic.type.endmacro],
40333          open: true,
40334          compile: function compile(token) {
40335            var macroName = token.match[1],
40336                parameters = token.match[2].split(/[\s,]+/); //TODO: Clean up duplicate check
40337
40338            for (var i = 0; i < parameters.length; i++) {
40339              for (var j = 0; j < parameters.length; j++) {
40340                if (parameters[i] === parameters[j] && i !== j) {
40341                  throw new Twig.Error("Duplicate arguments for parameter: " + parameters[i]);
40342                }
40343              }
40344            }
40345
40346            token.macroName = macroName;
40347            token.parameters = parameters;
40348            delete token.match;
40349            return token;
40350          },
40351          parse: function parse(token, context, chain) {
40352            var template = this;
40353
40354            this.macros[token.macroName] = function () {
40355              // Pass global context and other macros
40356              var macroContext = {
40357                _self: template.macros // Add parameters from context to macroContext
40358
40359              };
40360
40361              for (var i = 0; i < token.parameters.length; i++) {
40362                var prop = token.parameters[i];
40363
40364                if (typeof arguments[i] !== 'undefined') {
40365                  macroContext[prop] = arguments[i];
40366                } else {
40367                  macroContext[prop] = undefined;
40368                }
40369              } // Render
40370
40371
40372              return Twig.parseAsync.apply(template, [token.output, macroContext]);
40373            };
40374
40375            return {
40376              chain: chain,
40377              output: ''
40378            };
40379          }
40380        }, {
40381          /**
40382           * End macro logic tokens.
40383           *
40384           * Format: {% endmacro %}
40385           */
40386          type: Twig.logic.type.endmacro,
40387          regex: /^endmacro$/,
40388          next: [],
40389          open: false
40390        }, {
40391          /*
40392          * import logic tokens.
40393          *
40394          * Format: {% import "template.twig" as form %}
40395          */
40396          type: Twig.logic.type.import_,
40397          regex: /^import\s+(.+)\s+as\s+([a-zA-Z0-9_]+)$/,
40398          next: [],
40399          open: true,
40400          compile: function compile(token) {
40401            var expression = token.match[1].trim(),
40402                contextName = token.match[2].trim();
40403            delete token.match;
40404            token.expression = expression;
40405            token.contextName = contextName;
40406            token.stack = Twig.expression.compile.apply(this, [{
40407              type: Twig.expression.type.expression,
40408              value: expression
40409            }]).stack;
40410            return token;
40411          },
40412          parse: function parse(token, context, chain) {
40413            var that = this,
40414                output = {
40415              chain: chain,
40416              output: ''
40417            };
40418
40419            if (token.expression === '_self') {
40420              context[token.contextName] = this.macros;
40421              return Twig.Promise.resolve(output);
40422            }
40423
40424            return Twig.expression.parseAsync.apply(this, [token.stack, context]).then(function (file) {
40425              return that.importFile(file || token.expression);
40426            }).then(function (template) {
40427              context[token.contextName] = template.renderAsync({}, {
40428                output: 'macros'
40429              });
40430              return output;
40431            });
40432          }
40433        }, {
40434          /*
40435          * from logic tokens.
40436          *
40437          * Format: {% from "template.twig" import func as form %}
40438          */
40439          type: Twig.logic.type.from,
40440          regex: /^from\s+(.+)\s+import\s+([a-zA-Z0-9_, ]+)$/,
40441          next: [],
40442          open: true,
40443          compile: function compile(token) {
40444            var expression = token.match[1].trim(),
40445                macroExpressions = token.match[2].trim().split(/\s*,\s*/),
40446                macroNames = {};
40447
40448            for (var i = 0; i < macroExpressions.length; i++) {
40449              var res = macroExpressions[i]; // match function as variable
40450
40451              var macroMatch = res.match(/^([a-zA-Z0-9_]+)\s+as\s+([a-zA-Z0-9_]+)$/);
40452
40453              if (macroMatch) {
40454                macroNames[macroMatch[1].trim()] = macroMatch[2].trim();
40455              } else if (res.match(/^([a-zA-Z0-9_]+)$/)) {
40456                macroNames[res] = res;
40457              } else {// ignore import
40458              }
40459            }
40460
40461            delete token.match;
40462            token.expression = expression;
40463            token.macroNames = macroNames;
40464            token.stack = Twig.expression.compile.apply(this, [{
40465              type: Twig.expression.type.expression,
40466              value: expression
40467            }]).stack;
40468            return token;
40469          },
40470          parse: function parse(token, context, chain) {
40471            var that = this,
40472                promise = Twig.Promise.resolve(this.macros);
40473
40474            if (token.expression !== "_self") {
40475              promise = Twig.expression.parseAsync.apply(this, [token.stack, context]).then(function (file) {
40476                return that.importFile(file || token.expression);
40477              }).then(function (template) {
40478                return template.renderAsync({}, {
40479                  output: 'macros'
40480                });
40481              });
40482            }
40483
40484            return promise.then(function (macros) {
40485              for (var macroName in token.macroNames) {
40486                if (macros.hasOwnProperty(macroName)) {
40487                  context[token.macroNames[macroName]] = macros[macroName];
40488                }
40489              }
40490
40491              return {
40492                chain: chain,
40493                output: ''
40494              };
40495            });
40496          }
40497        }, {
40498          /**
40499           * The embed tag combines the behaviour of include and extends.
40500           * It allows you to include another template's contents, just like include does.
40501           *
40502           *  Format: {% embed "template.twig" [with {some: 'values'} only] %}
40503           */
40504          type: Twig.logic.type.embed,
40505          regex: /^embed\s+(.+?)(?:\s|$)(ignore missing(?:\s|$))?(?:with\s+([\S\s]+?))?(?:\s|$)(only)?$/,
40506          next: [Twig.logic.type.endembed],
40507          open: true,
40508          compile: function compile(token) {
40509            var match = token.match,
40510                expression = match[1].trim(),
40511                ignoreMissing = match[2] !== undefined,
40512                withContext = match[3],
40513                only = match[4] !== undefined && match[4].length;
40514            delete token.match;
40515            token.only = only;
40516            token.ignoreMissing = ignoreMissing;
40517            token.stack = Twig.expression.compile.apply(this, [{
40518              type: Twig.expression.type.expression,
40519              value: expression
40520            }]).stack;
40521
40522            if (withContext !== undefined) {
40523              token.withStack = Twig.expression.compile.apply(this, [{
40524                type: Twig.expression.type.expression,
40525                value: withContext.trim()
40526              }]).stack;
40527            }
40528
40529            return token;
40530          },
40531          parse: function parse(token, context, chain) {
40532            // Resolve filename
40533            var innerContext = {},
40534                that = this,
40535                i,
40536                template,
40537                promise = Twig.Promise.resolve();
40538
40539            if (!token.only) {
40540              for (i in context) {
40541                if (context.hasOwnProperty(i)) innerContext[i] = context[i];
40542              }
40543            }
40544
40545            if (token.withStack !== undefined) {
40546              promise = Twig.expression.parseAsync.apply(this, [token.withStack, context]).then(function (withContext) {
40547                for (i in withContext) {
40548                  if (withContext.hasOwnProperty(i)) innerContext[i] = withContext[i];
40549                }
40550              });
40551            }
40552
40553            return promise.then(function () {
40554              return Twig.expression.parseAsync.apply(that, [token.stack, innerContext]);
40555            }).then(function (file) {
40556              if (file instanceof Twig.Template) {
40557                template = file;
40558              } else {
40559                // Import file
40560                try {
40561                  template = that.importFile(file);
40562                } catch (err) {
40563                  if (token.ignoreMissing) {
40564                    return '';
40565                  }
40566
40567                  throw err;
40568                }
40569              } // reset previous blocks
40570
40571
40572              that.blocks = {}; // parse tokens. output will be not used
40573
40574              return Twig.parseAsync.apply(that, [token.output, innerContext]).then(function () {
40575                // render tempalte with blocks defined in embed block
40576                return template.renderAsync(innerContext, {
40577                  'blocks': that.blocks
40578                });
40579              });
40580            }).then(function (output) {
40581              return {
40582                chain: chain,
40583                output: output
40584              };
40585            });
40586          }
40587        },
40588        /* Add the {% endembed %} token
40589         *
40590         */
40591        {
40592          type: Twig.logic.type.endembed,
40593          regex: /^endembed$/,
40594          next: [],
40595          open: false
40596        }];
40597        /**
40598         * Registry for logic handlers.
40599         */
40600
40601        Twig.logic.handler = {};
40602        /**
40603         * Define a new token type, available at Twig.logic.type.{type}
40604         */
40605
40606        Twig.logic.extendType = function (type, value) {
40607          value = value || "Twig.logic.type" + type;
40608          Twig.logic.type[type] = value;
40609        };
40610        /**
40611         * Extend the logic parsing functionality with a new token definition.
40612         *
40613         * // Define a new tag
40614         * Twig.logic.extend({
40615         *     type: Twig.logic.type.{type},
40616         *     // The pattern to match for this token
40617         *     regex: ...,
40618         *     // What token types can follow this token, leave blank if any.
40619         *     next: [ ... ]
40620         *     // Create and return compiled version of the token
40621         *     compile: function(token) { ... }
40622         *     // Parse the compiled token with the context provided by the render call
40623         *     //   and whether this token chain is complete.
40624         *     parse: function(token, context, chain) { ... }
40625         * });
40626         *
40627         * @param {Object} definition The new logic expression.
40628         */
40629
40630
40631        Twig.logic.extend = function (definition) {
40632          if (!definition.type) {
40633            throw new Twig.Error("Unable to extend logic definition. No type provided for " + definition);
40634          } else {
40635            Twig.logic.extendType(definition.type);
40636          }
40637
40638          Twig.logic.handler[definition.type] = definition;
40639        }; // Extend with built-in expressions
40640
40641
40642        while (Twig.logic.definitions.length > 0) {
40643          Twig.logic.extend(Twig.logic.definitions.shift());
40644        }
40645        /**
40646         * Compile a logic token into an object ready for parsing.
40647         *
40648         * @param {Object} raw_token An uncompiled logic token.
40649         *
40650         * @return {Object} A compiled logic token, ready for parsing.
40651         */
40652
40653
40654        Twig.logic.compile = function (raw_token) {
40655          var expression = raw_token.value.trim(),
40656              token = Twig.logic.tokenize.apply(this, [expression]),
40657              token_template = Twig.logic.handler[token.type]; // Check if the token needs compiling
40658
40659          if (token_template.compile) {
40660            token = token_template.compile.apply(this, [token]);
40661            Twig.log.trace("Twig.logic.compile: ", "Compiled logic token to ", token);
40662          }
40663
40664          return token;
40665        };
40666        /**
40667         * Tokenize logic expressions. This function matches token expressions against regular
40668         * expressions provided in token definitions provided with Twig.logic.extend.
40669         *
40670         * @param {string} expression the logic token expression to tokenize
40671         *                (i.e. what's between {% and %})
40672         *
40673         * @return {Object} The matched token with type set to the token type and match to the regex match.
40674         */
40675
40676
40677        Twig.logic.tokenize = function (expression) {
40678          var token = {},
40679              token_template_type = null,
40680              token_type = null,
40681              token_regex = null,
40682              regex_array = null,
40683              regex = null,
40684              match = null; // Ignore whitespace around expressions.
40685
40686          expression = expression.trim();
40687
40688          for (token_template_type in Twig.logic.handler) {
40689            if (Twig.logic.handler.hasOwnProperty(token_template_type)) {
40690              // Get the type and regex for this template type
40691              token_type = Twig.logic.handler[token_template_type].type;
40692              token_regex = Twig.logic.handler[token_template_type].regex; // Handle multiple regular expressions per type.
40693
40694              regex_array = [];
40695
40696              if (token_regex instanceof Array) {
40697                regex_array = token_regex;
40698              } else {
40699                regex_array.push(token_regex);
40700              } // Check regular expressions in the order they were specified in the definition.
40701
40702
40703              while (regex_array.length > 0) {
40704                regex = regex_array.shift();
40705                match = regex.exec(expression.trim());
40706
40707                if (match !== null) {
40708                  token.type = token_type;
40709                  token.match = match;
40710                  Twig.log.trace("Twig.logic.tokenize: ", "Matched a ", token_type, " regular expression of ", match);
40711                  return token;
40712                }
40713              }
40714            }
40715          } // No regex matches
40716
40717
40718          throw new Twig.Error("Unable to parse '" + expression.trim() + "'");
40719        };
40720        /**
40721         * Parse a logic token within a given context.
40722         *
40723         * What are logic chains?
40724         *      Logic chains represent a series of tokens that are connected,
40725         *          for example:
40726         *          {% if ... %} {% else %} {% endif %}
40727         *
40728         *      The chain parameter is used to signify if a chain is open of closed.
40729         *      open:
40730         *          More tokens in this chain should be parsed.
40731         *      closed:
40732         *          This token chain has completed parsing and any additional
40733         *          tokens (else, elseif, etc...) should be ignored.
40734         *
40735         * @param {Object} token The compiled token.
40736         * @param {Object} context The render context.
40737         * @param {boolean} chain Is this an open logic chain. If false, that means a
40738         *                        chain is closed and no further cases should be parsed.
40739         */
40740
40741
40742        Twig.logic.parse = function (token, context, chain, allow_async) {
40743          var output = '',
40744              promise,
40745              is_async = true,
40746              token_template;
40747          context = context || {};
40748          Twig.log.debug("Twig.logic.parse: ", "Parsing logic token ", token);
40749          token_template = Twig.logic.handler[token.type];
40750
40751          if (token_template.parse) {
40752            output = token_template.parse.apply(this, [token, context, chain]);
40753          }
40754
40755          promise = Twig.isPromise(output) ? output : Twig.Promise.resolve(output);
40756          promise.then(function (o) {
40757            is_async = false;
40758            output = o;
40759          });
40760          if (allow_async) return promise || Twig.Promise.resolve(output);
40761          if (is_async) throw new Twig.Error('You are using Twig.js in sync mode in combination with async extensions.');
40762          return output;
40763        };
40764
40765        return Twig;
40766      };
40767      /***/
40768
40769    },
40770    /* 22 */
40771
40772    /***/
40773    function (module, exports) {
40774      module.exports = function (Twig) {
40775        'use strict';
40776
40777        Twig.Templates.registerParser('source', function (params) {
40778          return params.data || '';
40779        });
40780      };
40781      /***/
40782
40783    },
40784    /* 23 */
40785
40786    /***/
40787    function (module, exports) {
40788      module.exports = function (Twig) {
40789        'use strict';
40790
40791        Twig.Templates.registerParser('twig', function (params) {
40792          return new Twig.Template(params);
40793        });
40794      };
40795      /***/
40796
40797    },
40798    /* 24 */
40799
40800    /***/
40801    function (module, exports, __webpack_require__) {
40802      // ## twig.path.js
40803      //
40804      // This file handles path parsing
40805      module.exports = function (Twig) {
40806        "use strict";
40807        /**
40808         * Namespace for path handling.
40809         */
40810
40811        Twig.path = {};
40812        /**
40813         * Generate the canonical version of a url based on the given base path and file path and in
40814         * the previously registered namespaces.
40815         *
40816         * @param  {string} template The Twig Template
40817         * @param  {string} file     The file path, may be relative and may contain namespaces.
40818         *
40819         * @return {string}          The canonical version of the path
40820         */
40821
40822        Twig.path.parsePath = function (template, file) {
40823          var namespaces = null,
40824              file = file || "";
40825
40826          if (_typeof2(template) === 'object' && _typeof2(template.options) === 'object') {
40827            namespaces = template.options.namespaces;
40828          }
40829
40830          if (_typeof2(namespaces) === 'object' && file.indexOf('::') > 0 || file.indexOf('@') >= 0) {
40831            for (var k in namespaces) {
40832              if (namespaces.hasOwnProperty(k)) {
40833                file = file.replace(k + '::', namespaces[k]);
40834                file = file.replace('@' + k, namespaces[k]);
40835              }
40836            }
40837
40838            return file;
40839          }
40840
40841          return Twig.path.relativePath(template, file);
40842        };
40843        /**
40844         * Generate the relative canonical version of a url based on the given base path and file path.
40845         *
40846         * @param {Twig.Template} template The Twig.Template.
40847         * @param {string} file The file path, relative to the base path.
40848         *
40849         * @return {string} The canonical version of the path.
40850         */
40851
40852
40853        Twig.path.relativePath = function (template, file) {
40854          var base,
40855              base_path,
40856              sep_chr = "/",
40857              new_path = [],
40858              file = file || "",
40859              val;
40860
40861          if (template.url) {
40862            if (typeof template.base !== 'undefined') {
40863              base = template.base + (template.base.charAt(template.base.length - 1) === '/' ? '' : '/');
40864            } else {
40865              base = template.url;
40866            }
40867          } else if (template.path) {
40868            // Get the system-specific path separator
40869            var path = __webpack_require__(20),
40870                sep = path.sep || sep_chr,
40871                relative = new RegExp("^\\.{1,2}" + sep.replace("\\", "\\\\"));
40872
40873            file = file.replace(/\//g, sep);
40874
40875            if (template.base !== undefined && file.match(relative) == null) {
40876              file = file.replace(template.base, '');
40877              base = template.base + sep;
40878            } else {
40879              base = path.normalize(template.path);
40880            }
40881
40882            base = base.replace(sep + sep, sep);
40883            sep_chr = sep;
40884          } else if ((template.name || template.id) && template.method && template.method !== 'fs' && template.method !== 'ajax') {
40885            // Custom registered loader
40886            base = template.base || template.name || template.id;
40887          } else {
40888            throw new Twig.Error("Cannot extend an inline template.");
40889          }
40890
40891          base_path = base.split(sep_chr); // Remove file from url
40892
40893          base_path.pop();
40894          base_path = base_path.concat(file.split(sep_chr));
40895
40896          while (base_path.length > 0) {
40897            val = base_path.shift();
40898
40899            if (val == ".") {// Ignore
40900            } else if (val == ".." && new_path.length > 0 && new_path[new_path.length - 1] != "..") {
40901              new_path.pop();
40902            } else {
40903              new_path.push(val);
40904            }
40905          }
40906
40907          return new_path.join(sep_chr);
40908        };
40909
40910        return Twig;
40911      };
40912      /***/
40913
40914    },
40915    /* 25 */
40916
40917    /***/
40918    function (module, exports) {
40919      // ## twig.tests.js
40920      //
40921      // This file handles expression tests. (is empty, is not defined, etc...)
40922      module.exports = function (Twig) {
40923        "use strict";
40924
40925        Twig.tests = {
40926          empty: function empty(value) {
40927            if (value === null || value === undefined) return true; // Handler numbers
40928
40929            if (typeof value === "number") return false; // numbers are never "empty"
40930            // Handle strings and arrays
40931
40932            if (value.length && value.length > 0) return false; // Handle objects
40933
40934            for (var key in value) {
40935              if (value.hasOwnProperty(key)) return false;
40936            }
40937
40938            return true;
40939          },
40940          odd: function odd(value) {
40941            return value % 2 === 1;
40942          },
40943          even: function even(value) {
40944            return value % 2 === 0;
40945          },
40946          divisibleby: function divisibleby(value, params) {
40947            return value % params[0] === 0;
40948          },
40949          defined: function defined(value) {
40950            return value !== undefined;
40951          },
40952          none: function none(value) {
40953            return value === null;
40954          },
40955          'null': function _null(value) {
40956            return this.none(value); // Alias of none
40957          },
40958          'same as': function sameAs(value, params) {
40959            return value === params[0];
40960          },
40961          sameas: function sameas(value, params) {
40962            console.warn('`sameas` is deprecated use `same as`');
40963            return Twig.tests['same as'](value, params);
40964          },
40965          iterable: function iterable(value) {
40966            return value && (Twig.lib.is("Array", value) || Twig.lib.is("Object", value));
40967          }
40968          /*
40969          constant ?
40970           */
40971
40972        };
40973
40974        Twig.test = function (test, value, params) {
40975          if (!Twig.tests[test]) {
40976            throw "Test " + test + " is not defined.";
40977          }
40978
40979          return Twig.tests[test](value, params);
40980        };
40981
40982        Twig.test.extend = function (test, definition) {
40983          Twig.tests[test] = definition;
40984        };
40985
40986        return Twig;
40987      };
40988      /***/
40989
40990    },
40991    /* 26 */
40992
40993    /***/
40994    function (module, exports) {
40995      // ## twig.async.js
40996      //
40997      // This file handles asynchronous tasks within twig.
40998      module.exports = function (Twig) {
40999        "use strict";
41000
41001        Twig.parseAsync = function (tokens, context) {
41002          return Twig.parse.apply(this, [tokens, context, true]);
41003        };
41004
41005        Twig.expression.parseAsync = function (tokens, context, tokens_are_parameters) {
41006          return Twig.expression.parse.apply(this, [tokens, context, tokens_are_parameters, true]);
41007        };
41008
41009        Twig.logic.parseAsync = function (token, context, chain) {
41010          return Twig.logic.parse.apply(this, [token, context, chain, true]);
41011        };
41012
41013        Twig.Template.prototype.renderAsync = function (context, params) {
41014          return this.render(context, params, true);
41015        };
41016
41017        Twig.async = {};
41018        /**
41019         * Checks for `thenable` objects
41020         */
41021
41022        Twig.isPromise = function (obj) {
41023          return obj && typeof obj.then == 'function';
41024        };
41025        /**
41026         * An alternate implementation of a Promise that does not fully follow
41027         * the spec, but instead works fully synchronous while still being
41028         * thenable.
41029         *
41030         * These promises can be mixed with regular promises at which point
41031         * the synchronous behaviour is lost.
41032         */
41033
41034
41035        Twig.Promise = function (executor) {
41036          // State
41037          var state = 'unknown';
41038          var value = null;
41039          var handlers = null;
41040
41041          function changeState(newState, v) {
41042            state = newState;
41043            value = v;
41044            notify();
41045          }
41046
41047          ;
41048
41049          function onResolve(v) {
41050            changeState('resolve', v);
41051          }
41052
41053          function onReject(e) {
41054            changeState('reject', e);
41055          }
41056
41057          function notify() {
41058            if (!handlers) return;
41059            Twig.forEach(handlers, function (h) {
41060              append(h.resolve, h.reject);
41061            });
41062            handlers = null;
41063          }
41064
41065          function append(onResolved, onRejected) {
41066            var h = {
41067              resolve: onResolved,
41068              reject: onRejected
41069            }; // The promise has yet to be rejected or resolved.
41070
41071            if (state == 'unknown') {
41072              handlers = handlers || [];
41073              return handlers.push(h);
41074            } // The state has been changed to either resolve, or reject
41075            // which means we should call the handler.
41076
41077
41078            if (h[state]) h[state](value);
41079          }
41080
41081          function run(fn, resolve, reject) {
41082            var done = false;
41083
41084            try {
41085              fn(function (v) {
41086                if (done) return;
41087                done = true;
41088                resolve(v);
41089              }, function (e) {
41090                if (done) return;
41091                done = true;
41092                reject(e);
41093              });
41094            } catch (e) {
41095              done = true;
41096              reject(e);
41097            }
41098          }
41099
41100          function ready(result) {
41101            try {
41102              if (!Twig.isPromise(result)) {
41103                return onResolve(result);
41104              }
41105
41106              run(result.then.bind(result), ready, onReject);
41107            } catch (e) {
41108              onReject(e);
41109            }
41110          }
41111
41112          run(executor, ready, onReject);
41113          return {
41114            then: function then(onResolved, onRejected) {
41115              var hasResolved = typeof onResolved == 'function';
41116              var hasRejected = typeof onRejected == 'function';
41117              return new Twig.Promise(function (resolve, reject) {
41118                append(function (result) {
41119                  if (hasResolved) {
41120                    try {
41121                      resolve(onResolved(result));
41122                    } catch (e) {
41123                      reject(e);
41124                    }
41125                  } else {
41126                    resolve(result);
41127                  }
41128                }, function (err) {
41129                  if (hasRejected) {
41130                    try {
41131                      resolve(onRejected(err));
41132                    } catch (e) {
41133                      reject(e);
41134                    }
41135                  } else {
41136                    reject(err);
41137                  }
41138                });
41139              });
41140            },
41141            catch: function _catch(onRejected) {
41142              return this.then(null, onRejected);
41143            }
41144          };
41145        };
41146
41147        Twig.Promise.resolve = function (value) {
41148          return new Twig.Promise(function (resolve) {
41149            resolve(value);
41150          });
41151        };
41152
41153        Twig.Promise.reject = function (e) {
41154          return new Twig.Promise(function (resolve, reject) {
41155            reject(e);
41156          });
41157        };
41158
41159        Twig.Promise.all = function (promises) {
41160          var results = [];
41161          return Twig.async.forEach(promises, function (p, index) {
41162            if (!Twig.isPromise(p)) {
41163              results[index] = p;
41164              return;
41165            }
41166
41167            return p.then(function (v) {
41168              results[index] = v;
41169            });
41170          }).then(function () {
41171            return results;
41172          });
41173        };
41174        /**
41175        * Go over each item in a fashion compatible with Twig.forEach,
41176        * allow the function to return a promise or call the third argument
41177        * to signal it is finished.
41178        *
41179        * Each item in the array will be called sequentially.
41180        */
41181
41182
41183        Twig.async.forEach = function forEachAsync(arr, callback) {
41184          var arg_index = 0;
41185          var callbacks = {};
41186          var promise = new Twig.Promise(function (resolve, reject) {
41187            callbacks = {
41188              resolve: resolve,
41189              reject: reject
41190            };
41191          });
41192
41193          function fail(err) {
41194            callbacks.reject(err);
41195          }
41196
41197          function next(value) {
41198            if (!Twig.isPromise(value)) return iterate();
41199            value.then(next, fail);
41200          }
41201
41202          function iterate() {
41203            var index = arg_index++;
41204
41205            if (index == arr.length) {
41206              callbacks.resolve();
41207              return;
41208            }
41209
41210            next(callback(arr[index], index));
41211          }
41212
41213          iterate();
41214          return promise;
41215        };
41216
41217        return Twig;
41218      };
41219      /***/
41220
41221    },
41222    /* 27 */
41223
41224    /***/
41225    function (module, exports) {
41226      // ## twig.exports.js
41227      //
41228      // This file provides extension points and other hooks into the twig functionality.
41229      module.exports = function (Twig) {
41230        "use strict";
41231
41232        Twig.exports = {
41233          VERSION: Twig.VERSION
41234        };
41235        /**
41236         * Create and compile a twig.js template.
41237         *
41238         * @param {Object} param Paramteres for creating a Twig template.
41239         *
41240         * @return {Twig.Template} A Twig template ready for rendering.
41241         */
41242
41243        Twig.exports.twig = function twig(params) {
41244          'use strict';
41245
41246          var id = params.id,
41247              options = {
41248            strict_variables: params.strict_variables || false,
41249            // TODO: turn autoscape on in the next major version
41250            autoescape: params.autoescape != null && params.autoescape || false,
41251            allowInlineIncludes: params.allowInlineIncludes || false,
41252            rethrow: params.rethrow || false,
41253            namespaces: params.namespaces
41254          };
41255
41256          if (Twig.cache && id) {
41257            Twig.validateId(id);
41258          }
41259
41260          if (params.debug !== undefined) {
41261            Twig.debug = params.debug;
41262          }
41263
41264          if (params.trace !== undefined) {
41265            Twig.trace = params.trace;
41266          }
41267
41268          if (params.data !== undefined) {
41269            return Twig.Templates.parsers.twig({
41270              data: params.data,
41271              path: params.hasOwnProperty('path') ? params.path : undefined,
41272              module: params.module,
41273              id: id,
41274              options: options
41275            });
41276          } else if (params.ref !== undefined) {
41277            if (params.id !== undefined) {
41278              throw new Twig.Error("Both ref and id cannot be set on a twig.js template.");
41279            }
41280
41281            return Twig.Templates.load(params.ref);
41282          } else if (params.method !== undefined) {
41283            if (!Twig.Templates.isRegisteredLoader(params.method)) {
41284              throw new Twig.Error('Loader for "' + params.method + '" is not defined.');
41285            }
41286
41287            return Twig.Templates.loadRemote(params.name || params.href || params.path || id || undefined, {
41288              id: id,
41289              method: params.method,
41290              parser: params.parser || 'twig',
41291              base: params.base,
41292              module: params.module,
41293              precompiled: params.precompiled,
41294              async: params.async,
41295              options: options
41296            }, params.load, params.error);
41297          } else if (params.href !== undefined) {
41298            return Twig.Templates.loadRemote(params.href, {
41299              id: id,
41300              method: 'ajax',
41301              parser: params.parser || 'twig',
41302              base: params.base,
41303              module: params.module,
41304              precompiled: params.precompiled,
41305              async: params.async,
41306              options: options
41307            }, params.load, params.error);
41308          } else if (params.path !== undefined) {
41309            return Twig.Templates.loadRemote(params.path, {
41310              id: id,
41311              method: 'fs',
41312              parser: params.parser || 'twig',
41313              base: params.base,
41314              module: params.module,
41315              precompiled: params.precompiled,
41316              async: params.async,
41317              options: options
41318            }, params.load, params.error);
41319          }
41320        }; // Extend Twig with a new filter.
41321
41322
41323        Twig.exports.extendFilter = function (filter, definition) {
41324          Twig.filter.extend(filter, definition);
41325        }; // Extend Twig with a new function.
41326
41327
41328        Twig.exports.extendFunction = function (fn, definition) {
41329          Twig._function.extend(fn, definition);
41330        }; // Extend Twig with a new test.
41331
41332
41333        Twig.exports.extendTest = function (test, definition) {
41334          Twig.test.extend(test, definition);
41335        }; // Extend Twig with a new definition.
41336
41337
41338        Twig.exports.extendTag = function (definition) {
41339          Twig.logic.extend(definition);
41340        }; // Provide an environment for extending Twig core.
41341        // Calls fn with the internal Twig object.
41342
41343
41344        Twig.exports.extend = function (fn) {
41345          fn(Twig);
41346        };
41347        /**
41348         * Provide an extension for use with express 2.
41349         *
41350         * @param {string} markup The template markup.
41351         * @param {array} options The express options.
41352         *
41353         * @return {string} The rendered template.
41354         */
41355
41356
41357        Twig.exports.compile = function (markup, options) {
41358          var id = options.filename,
41359              path = options.filename,
41360              template; // Try to load the template from the cache
41361
41362          template = new Twig.Template({
41363            data: markup,
41364            path: path,
41365            id: id,
41366            options: options.settings['twig options']
41367          }); // Twig.Templates.load(id) ||
41368
41369          return function (context) {
41370            return template.render(context);
41371          };
41372        };
41373        /**
41374         * Provide an extension for use with express 3.
41375         *
41376         * @param {string} path The location of the template file on disk.
41377         * @param {Object|Function} The options or callback.
41378         * @param {Function} fn callback.
41379         * 
41380         * @throws Twig.Error
41381         */
41382
41383
41384        Twig.exports.renderFile = function (path, options, fn) {
41385          // handle callback in options
41386          if (typeof options === 'function') {
41387            fn = options;
41388            options = {};
41389          }
41390
41391          options = options || {};
41392          var settings = options.settings || {};
41393          var params = {
41394            path: path,
41395            base: settings.views,
41396            load: function load(template) {
41397              // render and return template as a simple string, see https://github.com/twigjs/twig.js/pull/348 for more information
41398              fn(null, '' + template.render(options));
41399            }
41400          }; // mixin any options provided to the express app.
41401
41402          var view_options = settings['twig options'];
41403
41404          if (view_options) {
41405            for (var option in view_options) {
41406              if (view_options.hasOwnProperty(option)) {
41407                params[option] = view_options[option];
41408              }
41409            }
41410          }
41411
41412          Twig.exports.twig(params);
41413        }; // Express 3 handler
41414
41415
41416        Twig.exports.__express = Twig.exports.renderFile;
41417        /**
41418         * Shoud Twig.js cache templates.
41419         * Disable during development to see changes to templates without
41420         * reloading, and disable in production to improve performance.
41421         *
41422         * @param {boolean} cache
41423         */
41424
41425        Twig.exports.cache = function (cache) {
41426          Twig.cache = cache;
41427        }; //We need to export the path module so we can effectively test it
41428
41429
41430        Twig.exports.path = Twig.path; //Export our filters.
41431        //Resolves #307
41432
41433        Twig.exports.filters = Twig.filters;
41434        return Twig;
41435      };
41436      /***/
41437
41438    }
41439    /******/
41440    ])
41441  );
41442});
41443
41444;
41445/* WEBPACK VAR INJECTION */}.call(this, "/", __webpack_require__(/*! ./../webpack/buildin/module.js */ "../node_modules/webpack/buildin/module.js")(module)))
41446
41447/***/ }),
41448
vendor: 1,173 bytes, lines 41449-41478
41449/***/ "../node_modules/webpack/buildin/global.js":
41450/*!*************************************************!*\
41451  !*** ../node_modules/webpack/buildin/global.js ***!
41452  \*************************************************/
41453/*! no static exports found */
41454/***/ (function(module, exports) {
41455
41456function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
41457
41458var g; // This works in non-strict mode
41459
41460g = function () {
41461  return this;
41462}();
41463
41464try {
41465  // This works if eval is allowed (see CSP)
41466  g = g || new Function("return this")();
41467} catch (e) {
41468  // This works if the window reference is available
41469  if ((typeof window === "undefined" ? "undefined" : _typeof(window)) === "object") g = window;
41470} // g can still be undefined, but nothing to do about it...
41471// We return undefined, instead of nothing here, so it's
41472// easier to handle this case. if(!global) { ...}
41473
41474
41475module.exports = g;
41476
41477/***/ }),
41478
vendor: 847 bytes, lines 41479-41512
41479/***/ "../node_modules/webpack/buildin/module.js":
41480/*!*************************************************!*\
41481  !*** ../node_modules/webpack/buildin/module.js ***!
41482  \*************************************************/
41483/*! no static exports found */
41484/***/ (function(module, exports) {
41485
41486module.exports = function (module) {
41487  if (!module.webpackPolyfill) {
41488    module.deprecate = function () {};
41489
41490    module.paths = []; // module.parent = undefined by default
41491
41492    if (!module.children) module.children = [];
41493    Object.defineProperty(module, "loaded", {
41494      enumerable: true,
41495      get: function get() {
41496        return module.l;
41497      }
41498    });
41499    Object.defineProperty(module, "id", {
41500      enumerable: true,
41501      get: function get() {
41502        return module.i;
41503      }
41504    });
41505    module.webpackPolyfill = 1;
41506  }
41507
41508  return module;
41509};
41510
41511/***/ }),
41512
41513/***/ "./common/scripts/app.js":
41514/*!*******************************!*\
41515  !*** ./common/scripts/app.js ***!
41516  \*******************************/
41517/*! no exports provided */
41518/***/ (function(module, __webpack_exports__, __webpack_require__) {
41519
41520"use strict";
41521__webpack_require__.r(__webpack_exports__);
41522/* harmony import */ var _styles_app_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../styles/app.scss */ "./common/styles/app.scss");
41523/* harmony import */ var _styles_app_scss__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_styles_app_scss__WEBPACK_IMPORTED_MODULE_0__);
41524/* harmony import */ var components_mobile_header_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! components/mobile-header/index */ "./components/mobile-header/index.js");
41525/* harmony import */ var components_hover_effect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! components/hover-effect */ "./components/hover-effect/index.js");
41526/* harmony import */ var components_forms_telephone__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! components/forms/telephone */ "./components/forms/telephone/index.js");
41527/* harmony import */ var common_scripts_mediator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! common/scripts/mediator */ "./common/scripts/mediator.js");
41528/* harmony import */ var components_news__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! components/news */ "./components/news/index.js");
41529/* harmony import */ var components_popup__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! components/popup */ "./components/popup/index.js");
41530/* harmony import */ var components_popup_inline_popup_twig__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! components/popup/inline-popup.twig */ "./components/popup/inline-popup.twig");
41531/* harmony import */ var components_popup_inline_popup_twig__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(components_popup_inline_popup_twig__WEBPACK_IMPORTED_MODULE_7__);
41532/* harmony import */ var components_popup_map_popup_twig__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! components/popup/map-popup.twig */ "./components/popup/map-popup.twig");
41533/* harmony import */ var components_popup_map_popup_twig__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(components_popup_map_popup_twig__WEBPACK_IMPORTED_MODULE_8__);
41534/* harmony import */ var components_preloader__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! components/preloader */ "./components/preloader/index.js");
41535/* harmony import */ var components_slider__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! components/slider */ "./components/slider/index.js");
41536/* harmony import */ var components_forms_submit__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! components/forms/submit */ "./components/forms/submit/index.js");
41537/* harmony import */ var components_tabs_index__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! components/tabs/index */ "./components/tabs/index.js");
41538/* harmony import */ var components_team__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! components/team */ "./components/team/index.js");
41539/* harmony import */ var common_scripts_utils__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! common/scripts/utils */ "./common/scripts/utils.js");
41540/* harmony import */ var components_forms_validation__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! components/forms/validation */ "./components/forms/validation/index.js");
41541/* harmony import */ var components_yandex_map__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! components/yandex-map */ "./components/yandex-map/index.js");
41542/* harmony import */ var components_yandex_map_load__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! components/yandex-map/load */ "./components/yandex-map/load.js");
41543
41544
41545
41546
41547
41548
41549
41550
41551
41552
41553
41554
41555
41556
41557
41558
41559
41560
41561var tabletPortrait = 670;
41562var tabletLandscape = 960;
41563var laptopWidth = 1280;
41564var waitTime = 200;
41565var minWaitTime = 100;
41566var header = new components_mobile_header_index__WEBPACK_IMPORTED_MODULE_1__["default"]();
41567var mediator = new common_scripts_mediator__WEBPACK_IMPORTED_MODULE_4__["default"]();
41568var borders = document.querySelectorAll('.j-animated-borders');
41569var bordersSeparated = document.querySelectorAll('.j-animated-borders__separated');
41570var bordersSeems = document.querySelectorAll('.j-seems-borders');
41571var verticalBorder = document.querySelectorAll('.j-animated-vertical-border');
41572var horizontalBorder = document.querySelectorAll('.j-animated-horizontal-border');
41573var factoids = document.querySelector('.b-main-factoids');
41574var mainAnimatedTitles = document.querySelectorAll('.b-main-slides__span-second');
41575var mainsliderContainer = document.querySelector('.j-main-slider');
41576var disappearingImage = document.querySelector('.j-scroll-image-effect');
41577var windowWidth = window.innerWidth;
41578var tabsDevelops = document.querySelector('.j-tabs-develop');
41579var tabsProjects = document.querySelector('.j-tabs-projects');
41580header.init({
41581  element: '.j-header',
41582  autoFixed: false,
41583  autoPositionCloseButton: true,
41584  returnPosition: true
41585});
41586/**
41587 * Попап инлайновый
41588 */
41589
41590var inlinePopups = Array.from(document.querySelectorAll('.j-inline-popup'));
41591
41592if (inlinePopups.length) {
41593  inlinePopups.forEach(function (item) {
41594    var popup = new components_popup__WEBPACK_IMPORTED_MODULE_6__["default"]();
41595    popup.init({
41596      target: item,
41597      template: components_popup_inline_popup_twig__WEBPACK_IMPORTED_MODULE_7___default.a
41598    });
41599  });
41600}
41601/**
41602 * Попап карта
41603 */
41604
41605
41606var mapPopups = Array.from(document.querySelectorAll('.j-project-popup-map'));
41607
41608if (mapPopups.length) {
41609  mapPopups.forEach(function (item) {
41610    var popup = new components_popup__WEBPACK_IMPORTED_MODULE_6__["default"]();
41611    popup.init({
41612      target: item,
41613      template: components_popup_map_popup_twig__WEBPACK_IMPORTED_MODULE_8___default.a
41614    });
41615  });
41616  mediator.subscribe('openPopup', function (popup) {
41617    if (popup.type === 'map') {
41618      var _mapSelector = popup.popup.querySelector('.j-project-map');
41619
41620      if (_mapSelector) {
41621        Object(components_yandex_map_load__WEBPACK_IMPORTED_MODULE_17__["default"])().then(function (ymaps) {
41622          var yandexMap = new components_yandex_map__WEBPACK_IMPORTED_MODULE_16__["default"](ymaps);
41623          yandexMap.init({
41624            wrapper: _mapSelector,
41625            customZoomControl: true,
41626            legend: false
41627          });
41628        }).catch(function (error) {
41629          // eslint-disable-line
41630          console.error("\u041F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435 \u044F\u043D\u0434\u0435\u043A\u0441 \u043A\u0430\u0440\u0442 \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043E\u0448\u0438\u0431\u043A\u0430: ".concat(error));
41631        });
41632      }
41633    }
41634  });
41635}
41636/**
41637 * Слайдер преимуществ на главной странице
41638 * @type {Slider}
41639 */
41640
41641
41642var benefits = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"]();
41643var benefitsSlider = document.querySelector('.j-benefits-slider');
41644
41645if (benefitsSlider && window.screen.availWidth < laptopWidth) {
41646  benefits.init({
41647    target: benefitsSlider,
41648    autoplay: true,
41649    infinite: false,
41650    autoplaySpeed: 7000
41651  });
41652  setTimeout(function () {// const nextBtn = benefitsSlider.querySelector('.slider__arrow-right');
41653    //
41654    // nextBtn.click();
41655  }, minWaitTime);
41656}
41657/**
41658 * слайдеры с одним видимым слайдом
41659 */
41660
41661
41662var oneSliders = document.querySelectorAll('.j-oneslide-slider');
41663
41664if (oneSliders) {
41665  oneSliders.forEach(function (slide) {
41666    var oneSlider = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"]();
41667    oneSlider.init({
41668      target: slide
41669    });
41670  });
41671}
41672/**
41673 * Слайдер успешных проектов
41674 */
41675
41676
41677var columnSliders = document.querySelectorAll('.j-columns-slider');
41678
41679if (columnSliders && window.screen.availWidth < laptopWidth) {
41680  columnSliders.forEach(function (slide) {
41681    var columnSlider = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"]();
41682    columnSlider.init({
41683      target: slide
41684    });
41685  });
41686}
41687
41688var declarations = document.querySelectorAll('.j-declaration-slider');
41689
41690if (declarations && window.screen.availWidth < tabletPortrait) {
41691  declarations.forEach(function (slide) {
41692    var declarationSlider = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"]();
41693    declarationSlider.init({
41694      target: slide
41695    });
41696  });
41697}
41698/**
41699 * Слайдер с участниками команды
41700 */
41701
41702
41703var team = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"]();
41704var teamPopup = new components_team__WEBPACK_IMPORTED_MODULE_13__["default"]();
41705var teamSlider = document.querySelector('.j-team-slider');
41706
41707if (teamSlider) {
41708  team.init({
41709    target: teamSlider,
41710    transitionTime: 150
41711  });
41712  teamPopup.init(teamSlider);
41713}
41714
41715var teamManual = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"]();
41716var teamSliderManual = document.querySelector('.j-team-slider-manual');
41717
41718if (teamSliderManual) {
41719  teamManual.init({
41720    target: teamSliderManual,
41721    transitionTime: 150
41722  });
41723}
41724/**
41725 * Слайдер с логотипами партнеров
41726 */
41727
41728
41729var partners = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"]();
41730var partnersSlider = document.querySelector('.j-projects-slider');
41731
41732if (partnersSlider) {
41733  partners.init({
41734    target: partnersSlider
41735  });
41736}
41737
41738var principesSlider = document.querySelectorAll('.j-principes-slider');
41739
41740if (principesSlider) {
41741  principesSlider.forEach(function (slider) {
41742    var principes = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"]();
41743    principes.init({
41744      target: slider
41745    });
41746  });
41747}
41748/**
41749 * Слайдер преимуществ проектов Ларуса
41750 */
41751
41752
41753var larusFeatures = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"]();
41754var larusFeaturesSlider = document.querySelector('.j-larus-project-feature-slider');
41755
41756if (larusFeaturesSlider && window.screen.availWidth < tabletLandscape) {
41757  larusFeatures.init({
41758    target: larusFeaturesSlider
41759  });
41760}
41761/**
41762 * реинициализируем слайдер, если он в табе
41763 */
41764
41765
41766mediator.subscribe('changeTabs', function (element) {
41767  if (element.classList.contains('is-slider')) {
41768    var galleryWrap = element.querySelector('.j-projects-slider');
41769
41770    if (galleryWrap.classList.contains('b-slider_is_ready')) {
41771      return;
41772    }
41773
41774    var gallery = new components_slider__WEBPACK_IMPORTED_MODULE_10__["default"]();
41775    gallery.init({
41776      target: galleryWrap
41777    });
41778  }
41779});
41780/**
41781 * инициализация табов
41782 */
41783
41784if (tabsDevelops) {
41785  tabsDevelops = new components_tabs_index__WEBPACK_IMPORTED_MODULE_12__["default"]();
41786  tabsDevelops.init({
41787    element: '.j-tabs-develop'
41788  });
41789}
41790
41791if (tabsProjects) {
41792  tabsProjects = new components_tabs_index__WEBPACK_IMPORTED_MODULE_12__["default"]();
41793  tabsProjects.init({
41794    element: '.j-tabs-projects'
41795  });
41796}
41797
41798var tabsProjectsCollapsed = document.querySelector('.j-tabs-projects');
41799
41800if (window.screen.availWidth < tabletLandscape && tabsProjectsCollapsed) {
41801  var opened = false;
41802  tabsProjectsCollapsed.addEventListener('click', function () {
41803    if (opened) {
41804      tabsProjects.tabsParent.classList.remove('is-opened');
41805      tabsProjects.tabs.forEach(function (link) {
41806        link.style.pointerEvents = 'none';
41807      });
41808      opened = false;
41809    } else {
41810      tabsProjects.tabsParent.classList.add('is-opened');
41811      tabsProjects.tabs.forEach(function (link) {
41812        link.style.pointerEvents = 'auto';
41813        link.style.width = '100%';
41814      });
41815    }
41816  });
41817  tabsProjects.tabs.forEach(function (link) {
41818    link.addEventListener('click', function (event) {
41819      link.style.width = '0';
41820      event.target.style.width = 'max-content';
41821      opened = true;
41822    });
41823  });
41824} // Движение фактоидов
41825
41826
41827if (factoids && window.screen.availWidth < laptopWidth) {
41828  var benefitPosition = 0;
41829  var firstSlide = 0;
41830  var zero = 0;
41831  var one = 1;
41832  var two = 2;
41833  var four = 4;
41834  var factoid = factoids.querySelector('.b-main-factoids__item');
41835  var mainImages = document.querySelectorAll('.b-main-slides__img img');
41836  var slideWidth = factoid.offsetWidth;
41837
41838  var makeVisible = function makeVisible(number) {
41839    if (mainImages.length) {
41840      mainImages[number].classList.add('b-main-slides__img-scaling');
41841    }
41842  };
41843
41844  var makeHidden = function makeHidden() {
41845    mainImages.forEach(function (image) {
41846      image.classList.remove('b-main-slides__img-scaling');
41847    });
41848  };
41849
41850  var clearTitleAnimation = function clearTitleAnimation() {
41851    mainAnimatedTitles.forEach(function (title) {
41852      title.classList.remove('is-goes-left__long');
41853      title.classList.remove('is-goes-right__long');
41854    });
41855  };
41856
41857  mainsliderContainer.classList.add('is-autoplay');
41858  makeHidden();
41859  makeVisible(firstSlide);
41860  mainAnimatedTitles[firstSlide].classList.add('is-goes-left__long');
41861  factoids.style.transform = "translateX(".concat(benefitPosition, "px)");
41862  mediator.subscribe('benefitGoesLeft', function (activeSlide) {
41863    firstSlide = firstSlide - one;
41864
41865    if (window.screen.availWidth >= tabletLandscape) {
41866      benefitPosition = zero;
41867    } else {
41868      benefitPosition = benefitPosition + slideWidth;
41869    }
41870
41871    if (activeSlide === four) {
41872      firstSlide = two;
41873      benefitPosition = -slideWidth * two;
41874    }
41875
41876    makeHidden();
41877    makeVisible(firstSlide);
41878    factoids.style.transform = "translateX(".concat(benefitPosition, "px)");
41879    clearTitleAnimation();
41880    mainAnimatedTitles[firstSlide].classList.remove('is-goes-right__long');
41881    mainAnimatedTitles[firstSlide].classList.add('is-goes-right__long');
41882  });
41883  mediator.subscribe('benefitGoesRight', function (parameters) {
41884    var position = parameters.position;
41885    var activeSlide = parameters.slide;
41886
41887    if (position === zero) {
41888      firstSlide = zero;
41889      benefitPosition = zero;
41890    } else {
41891      if (window.screen.availWidth >= tabletLandscape) {
41892        if (activeSlide !== two) {
41893          benefitPosition = -slideWidth;
41894        }
41895      } else {
41896        benefitPosition = benefitPosition - slideWidth;
41897      }
41898
41899      firstSlide = firstSlide + one;
41900    }
41901
41902    makeHidden();
41903    makeVisible(firstSlide);
41904    factoids.style.transform = "translateX(".concat(benefitPosition, "px)");
41905    clearTitleAnimation();
41906    mainAnimatedTitles[firstSlide].classList.remove('is-goes-left__long');
41907    mainAnimatedTitles[firstSlide].classList.add('is-goes-left__long');
41908  });
41909}
41910/**
41911 * hover эффект
41912 */
41913
41914
41915var hoverBlocks = document.querySelectorAll('.j-hover-highlight');
41916
41917if (hoverBlocks && window.screen.availWidth >= laptopWidth) {
41918  hoverBlocks.forEach(function (block) {
41919    return new components_hover_effect__WEBPACK_IMPORTED_MODULE_2__["default"](block);
41920  });
41921}
41922
41923mediator.subscribe('receivedNews', function () {
41924  var newsBlocks = document.querySelectorAll('.j-hover-highlight');
41925
41926  if (newsBlocks && window.screen.availWidth >= laptopWidth) {
41927    newsBlocks.forEach(function (block) {
41928      return new components_hover_effect__WEBPACK_IMPORTED_MODULE_2__["default"](block);
41929    });
41930  }
41931});
41932/**
41933 * Карта на главной странице
41934 */
41935
41936var mapSelector = document.querySelector('.j-main-map');
41937
41938if (mapSelector) {
41939  Object(components_yandex_map_load__WEBPACK_IMPORTED_MODULE_17__["default"])().then(function (ymaps) {
41940    var yandexMap = new components_yandex_map__WEBPACK_IMPORTED_MODULE_16__["default"](ymaps);
41941    yandexMap.init({
41942      wrapper: mapSelector,
41943      customZoomControl: true,
41944      legend: true
41945    });
41946  }).catch(function (error) {
41947    // eslint-disable-line
41948    console.error("\u041F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435 \u044F\u043D\u0434\u0435\u043A\u0441 \u043A\u0430\u0440\u0442 \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043E\u0448\u0438\u0431\u043A\u0430: ".concat(error));
41949  });
41950}
41951/**
41952 * Карта на странице контактов
41953 */
41954
41955
41956var mapContacts = document.querySelector('.j-contacts-map');
41957
41958if (mapContacts) {
41959  Object(components_yandex_map_load__WEBPACK_IMPORTED_MODULE_17__["default"])().then(function (ymaps) {
41960    var yandexMap = new components_yandex_map__WEBPACK_IMPORTED_MODULE_16__["default"](ymaps);
41961    yandexMap.init({
41962      wrapper: mapContacts,
41963      customZoomControl: true,
41964      gps: true
41965    });
41966  }).catch(function (error) {
41967    // eslint-disable-line
41968    console.error("\u041F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435 \u044F\u043D\u0434\u0435\u043A\u0441 \u043A\u0430\u0440\u0442 \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043E\u0448\u0438\u0431\u043A\u0430: ".concat(error));
41969  });
41970}
41971/**
41972 * область видимости
41973 * @param {Object} element - просматриваемый элемент
41974 * @returns {boolean} - возвращает true, если элемент находится в области видимости
41975 */
41976
41977
41978var isScrolledIntoView = function isScrolledIntoView(element) {
41979  var docViewTop = window.pageYOffset;
41980  var docViewBottom = docViewTop + window.innerHeight;
41981  var elemTop = element.getBoundingClientRect().top + document.documentElement.scrollTop;
41982  var elemBottom = elemTop + element.offsetHeight;
41983  return elemBottom <= docViewBottom && elemTop >= docViewTop;
41984};
41985/**
41986 * область видимости
41987 * @param {Object} element - просматриваемый элемент
41988 * @param {number} offset - Отступ сверху в процентах
41989 * @returns {boolean} - возвращает true, если элемент находится в области видимости
41990 */
41991
41992
41993var isScrolledIntoTop = function isScrolledIntoTop(element, offset) {
41994  var hundred = 100;
41995  var docViewBottom = window.pageYOffset + window.innerHeight;
41996  var elementBounding = element.getBoundingClientRect();
41997  var elemTop = elementBounding.top + document.documentElement.scrollTop;
41998  var offsetPx = 0;
41999
42000  if (offset) {
42001    offsetPx = elementBounding.height * offset / hundred;
42002  }
42003
42004  return docViewBottom > elemTop + offsetPx;
42005};
42006/**
42007 * измеряет скорость скролла
42008 */
42009
42010/* eslint-disable */
42011
42012
42013var checkScrollSpeed = function (settings) {
42014  settings = settings || {};
42015  var lastPos,
42016      newPos,
42017      timer,
42018      delta,
42019      delay = settings.delay || 50; // in "ms" (higher means lower fidelity )
42020
42021  function clear() {
42022    lastPos = null;
42023    delta = 0;
42024  }
42025
42026  clear();
42027  return function () {
42028    newPos = window.scrollY;
42029
42030    if (lastPos != null) {
42031      // && newPos < maxScroll
42032      delta = newPos - lastPos;
42033    }
42034
42035    lastPos = newPos;
42036    clearTimeout(timer);
42037    timer = setTimeout(clear, delay);
42038    return delta;
42039  };
42040}();
42041/* eslint-enable */
42042
42043/**
42044 * анимация при скролле страниц
42045 */
42046
42047
42048var fadeStop = 350;
42049
42050window.onscroll = function () {
42051  // анимация линий
42052  if (window.screen.availWidth >= tabletLandscape) {
42053    borders.forEach(function (div) {
42054      if (isScrolledIntoView(div)) {
42055        div.classList.add('b-animate-borders__horizontal');
42056      }
42057    });
42058    bordersSeparated.forEach(function (div) {
42059      var top = 10;
42060      var middle = 50;
42061      var bottom = 100;
42062
42063      if (isScrolledIntoTop(div, top)) {// Сюда анимаяция для вехнего бордера
42064      }
42065
42066      if (isScrolledIntoTop(div, middle)) {// Сюда анимаяция для бокового бордера
42067      }
42068
42069      if (isScrolledIntoTop(div, bottom)) {
42070        div.classList.add('b-animate-borders__separated');
42071      }
42072    });
42073    verticalBorder.forEach(function (div) {
42074      if (isScrolledIntoView(div)) {
42075        div.classList.add('b-animate-borders__vertical-border');
42076      }
42077    });
42078    horizontalBorder.forEach(function (div) {
42079      if (isScrolledIntoView(div)) {
42080        div.classList.add('b-animate-borders__horizontal-border');
42081      }
42082    });
42083    /**
42084     * анимация на странице "проект Ларуса"
42085     */
42086
42087    if (disappearingImage) {
42088      var fadeUntil = checkScrollSpeed() > 100 ? window.pageYOffset : 300; // eslint-disable-line
42089
42090      var _one = 1;
42091      var scaleUntil = 2100;
42092      var img = disappearingImage.querySelector('img');
42093
42094      if (window.pageYOffset <= fadeStop) {
42095        disappearingImage.style.opacity = _one - window.pageYOffset / fadeUntil;
42096        img.style.transform = "scale(".concat(_one + window.pageYOffset / scaleUntil, ")");
42097      } else {
42098        disappearingImage.style.opacity = 0;
42099      }
42100    }
42101  }
42102};
42103
42104if (window.screen.availWidth >= tabletLandscape) {
42105  bordersSeems.forEach(function (div) {
42106    if (isScrolledIntoView(div)) {
42107      div.classList.add('b-animate-borders__separated');
42108    }
42109  });
42110
42111  if (disappearingImage && window.pageYOffset > fadeStop) {
42112    disappearingImage.classList.add('is-scrolled');
42113  }
42114}
42115/**
42116 * новости
42117 */
42118
42119
42120var newsForm = document.querySelector('#newsForm');
42121
42122if (newsForm) {
42123  var news = new components_news__WEBPACK_IMPORTED_MODULE_5__["default"]();
42124  news.init(newsForm);
42125}
42126/**
42127 * новости на главной странице
42128 * @type {Element}
42129 */
42130
42131
42132var newsMain = document.querySelector('#newsMainpage');
42133
42134if (newsMain) {
42135  /**
42136   * вычисляет позицию блока новости, добавляя необходимый класс
42137   * для скрытия границ
42138   */
42139  var newsBlock = document.querySelectorAll('.b-new__blank');
42140  var newsMainPosition = newsMain.getBoundingClientRect();
42141  var leftMin = 0;
42142  var rightMin = -1;
42143
42144  var destroyBorder = function destroyBorder(div) {
42145    var borderElements = div.querySelectorAll('[class*=border]');
42146    borderElements.forEach(function (border) {
42147      common_scripts_utils__WEBPACK_IMPORTED_MODULE_14__["default"].removeElement(border);
42148    });
42149  };
42150
42151  newsBlock.forEach(function (div) {
42152    var blockPosition = div.getBoundingClientRect();
42153    var leftDifference = blockPosition.left - newsMainPosition.left;
42154    var rightDifference = blockPosition.right - newsMainPosition.right;
42155
42156    if (leftDifference === leftMin) {
42157      div.classList.add('is-left');
42158    }
42159
42160    if (Math.round(rightDifference) >= rightMin) {
42161      div.classList.add('is-right');
42162    }
42163
42164    if (window.screen.availWidth < tabletLandscape) {
42165      destroyBorder(div);
42166    }
42167  });
42168}
42169/**
42170 * Валидация инпутов
42171 */
42172
42173
42174var inputs = Array.from(document.querySelectorAll('.j-input'));
42175
42176if (inputs.length) {
42177  inputs.forEach(function (item) {
42178    var inputValidation = new components_forms_validation__WEBPACK_IMPORTED_MODULE_15__["default"]();
42179    var errorMessage = item.dataset.error;
42180    inputValidation.init({
42181      target: item,
42182      error: errorMessage
42183    });
42184  });
42185}
42186/**
42187 * Маска для инпута с телефоном
42188 */
42189
42190
42191var inputTel = new components_forms_telephone__WEBPACK_IMPORTED_MODULE_3__["default"]();
42192var phoneInputs = Array.from(document.querySelectorAll('input[type="tel"]'));
42193
42194if (phoneInputs.length) {
42195  inputTel.init({
42196    input: phoneInputs
42197  });
42198}
42199
42200mediator.subscribe('openPopup', function () {
42201  var inputTelInPopup = new components_forms_telephone__WEBPACK_IMPORTED_MODULE_3__["default"]();
42202  var phoneInputsInPopup = Array.from(document.querySelectorAll('input[type="tel"]'));
42203
42204  if (phoneInputsInPopup.length) {
42205    inputTelInPopup.init({
42206      input: phoneInputsInPopup
42207    });
42208  }
42209
42210  var inputsInPopup = Array.from(document.querySelectorAll('.j-input'));
42211
42212  if (inputsInPopup.length) {
42213    inputsInPopup.forEach(function (item) {
42214      var inputValidationInPopup = new components_forms_validation__WEBPACK_IMPORTED_MODULE_15__["default"]();
42215      var errorInPopup = item.dataset.error;
42216      inputValidationInPopup.init({
42217        target: item,
42218        error: errorInPopup
42219      });
42220    });
42221  }
42222
42223  var submitSelectorInPopup = Array.from(document.querySelectorAll('.j-input-submit'));
42224
42225  if (submitSelectorInPopup.length) {
42226    submitSelectorInPopup.forEach(function (item) {
42227      var submitInputsInPopup = new components_forms_submit__WEBPACK_IMPORTED_MODULE_11__["default"]();
42228      submitInputsInPopup.init({
42229        target: item
42230      });
42231    });
42232  }
42233});
42234/**
42235 * Обработчик отправки формы и валидация при сабмите
42236 */
42237
42238var submitSelector = Array.from(document.querySelectorAll('.j-input-submit'));
42239
42240if (submitSelector.length) {
42241  submitSelector.forEach(function (item) {
42242    var submitInputs = new components_forms_submit__WEBPACK_IMPORTED_MODULE_11__["default"]();
42243    submitInputs.init({
42244      target: item
42245    });
42246  });
42247}
42248/**
42249 * для реинициализации слайдеров при ресайзе окна
42250 */
42251
42252
42253window.addEventListener('resize', common_scripts_utils__WEBPACK_IMPORTED_MODULE_14__["default"].debounce(function () {
42254  if (window.innerWidth !== windowWidth) {
42255    location.reload();
42256  }
42257}, waitTime));
42258
42259if (document.querySelector('.j-preloader')) {
42260  new components_preloader__WEBPACK_IMPORTED_MODULE_9__["default"]().init();
42261}
42262
42263/***/ }),
42264
42265/***/ "./common/scripts/mediator.js":
42266/*!************************************!*\
42267  !*** ./common/scripts/mediator.js ***!
42268  \************************************/
42269/*! exports provided: default */
42270/***/ (function(module, __webpack_exports__, __webpack_require__) {
42271
42272"use strict";
42273__webpack_require__.r(__webpack_exports__);
42274function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
42275
42276function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
42277
42278function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
42279
42280/* eslint-disable consistent-this */
42281var instance = null;
42282
42283var Mediator =
42284/*#__PURE__*/
42285function () {
42286  function Mediator() {
42287    _classCallCheck(this, Mediator);
42288
42289    if (!instance) {
42290      instance = this;
42291    }
42292
42293    this.channels = {};
42294    return instance;
42295  }
42296
42297  _createClass(Mediator, [{
42298    key: "subscribe",
42299    value: function subscribe(channel, fn) {
42300      if (!this.channels[channel]) {
42301        this.channels[channel] = [];
42302      }
42303
42304      this.channels[channel].push({
42305        context: this,
42306        callback: fn
42307      });
42308    }
42309  }, {
42310    key: "publish",
42311    value: function publish(channel) {
42312      if (!this.channels[channel]) {
42313        return false;
42314      }
42315
42316      var firstArgument = 1;
42317      var args = Array.prototype.slice.call(arguments, firstArgument);
42318      this.channels[channel].forEach(function (subscription) {
42319        subscription.callback.apply(subscription.context, args);
42320      });
42321      return this;
42322    }
42323  }, {
42324    key: "installTo",
42325    value: function installTo(obj) {
42326      obj.channels = {};
42327      obj.publish = this.publish;
42328      obj.subscribe = this.subscribe;
42329    }
42330  }, {
42331    key: "unsubscribe",
42332    value: function unsubscribe(channel) {
42333      if (!this.channels[channel]) {
42334        return;
42335      }
42336
42337      this.channels[channel] = null;
42338    }
42339  }]);
42340
42341  return Mediator;
42342}();
42343
42344/* harmony default export */ __webpack_exports__["default"] = (Mediator);
42345/* eslint-enable consistent-this */
42346
42347/***/ }),
42348
42349/***/ "./common/scripts/utils.js":
42350/*!*********************************!*\
42351  !*** ./common/scripts/utils.js ***!
42352  \*********************************/
42353/*! exports provided: default */
42354/***/ (function(module, __webpack_exports__, __webpack_require__) {
42355
42356"use strict";
42357__webpack_require__.r(__webpack_exports__);
42358/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "../node_modules/jquery/dist/jquery.js");
42359/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);
42360function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
42361
42362function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
42363
42364function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
42365
42366function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
42367
42368/**
42369 * @version 1.4
42370 * @author Kelnik Studios {http://kelnik.ru}
42371 * @link https://kelnik.gitbooks.io/kelnik-documentation/content/front-end/components/utils.html documentation
42372 */
42373
42374/**
42375 * DEPENDENCIES
42376 */
42377
42378
42379var Utils =
42380/*#__PURE__*/
42381function () {
42382  function Utils() {
42383    _classCallCheck(this, Utils);
42384  }
42385
42386  _createClass(Utils, null, [{
42387    key: "comfortableAnimationTime",
42388
42389    /**
42390     * Метод устанавливает комфорную задержку выполнения анимации.
42391     * @return {Number} comfortableAnimationTimeValue - значение в мс.
42392     */
42393    value: function comfortableAnimationTime() {
42394      var comfortableAnimationTimeValue = 300;
42395      return comfortableAnimationTimeValue;
42396    }
42397    /**
42398     * Метод полностью очищает весь html элемент.
42399     * @param {Object} element - DOM-элемент, который необходимо очистить.
42400     */
42401
42402  }, {
42403    key: "clearHtml",
42404    value: function clearHtml(element) {
42405      element.innerHTML = '';
42406    }
42407    /**
42408     * Метод вставляет содержимое в блок.
42409     * @param {Object} element - элемент в который нужно вставить.
42410     * @param {Object/string} content - вставляемый контент.
42411     */
42412
42413  }, {
42414    key: "insetContent",
42415    value: function insetContent(element, content) {
42416      if (typeof content === 'string') {
42417        element.insertAdjacentHTML('beforeend', content);
42418      } else if (_typeof(content) === 'object') {
42419        element.appendChild(content);
42420      }
42421    }
42422    /**
42423     * Метод полностью удаляет элемент из DOM-дерева.
42424     * @param {Object} element - элемент, который необходимо удалить.
42425     */
42426
42427  }, {
42428    key: "removeElement",
42429    value: function removeElement(element) {
42430      // node.remove() не работает в IE11
42431      element.parentNode.removeChild(element);
42432    }
42433    /**
42434     * Метод показывает элемент.
42435     * @param {Node} element - элемент, который необходимо показать.
42436     */
42437
42438  }, {
42439    key: "show",
42440    value: function show(element) {
42441      element.style.display = 'block';
42442    }
42443    /**
42444     * Метод скрывает элемент.
42445     * @param {Node} element - элемент, который необходимо скрыть.
42446     */
42447
42448  }, {
42449    key: "hide",
42450    value: function hide(element) {
42451      element.style.display = 'none';
42452    }
42453    /**
42454     * Метод отправляет ajax запрос на сервер.
42455     * @param {Object} data - отправляемые данные.
42456     * @param {String} url - маршрут по которому нужно произвести запрос.
42457     * @param {Function} callback -  функция обратного вызова, которая при успехе вызовет success, а при ошибке error.
42458     * @param {String} method - метод запроса
42459     */
42460
42461  }, {
42462    key: "send",
42463    value: function send(data, url) {
42464      var callback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
42465      var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'POST';
42466      // eslint-disable-line
42467      var xhr = new XMLHttpRequest();
42468      var statusSuccess = 200;
42469      var dataToSend = data;
42470      xhr.open(method, url);
42471      xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
42472      xhr.setRequestHeader('x-requested-with', 'XMLHttpRequest');
42473
42474      if (_typeof(dataToSend) === 'object') {
42475        dataToSend = jquery__WEBPACK_IMPORTED_MODULE_0___default.a.param(dataToSend);
42476      }
42477
42478      xhr.send(dataToSend);
42479
42480      xhr.onload = function XHR() {
42481        if (xhr.status === statusSuccess) {
42482          var req = JSON.parse(this.responseText);
42483          callback.success(req);
42484        } else {
42485          callback.error(xhr.status);
42486        }
42487      };
42488    }
42489    /**
42490     * Метод проверяет наличие интернета
42491     * @return {boolean} - При наличии результатом будет true, а при отсутсвии false.
42492     */
42493
42494  }, {
42495    key: "checkInternetConnection",
42496    value: function checkInternetConnection() {
42497      return navigator.onLine;
42498    }
42499    /**
42500     * Метод проверяет присутствует ли ключ в объекте
42501     * @param {Object} object - проверяем объект
42502     * @param {String} key - ключ, наличие которого проверяет в объекте
42503     * @return {boolean} - присутствует или нет ключ в объекте
42504     */
42505
42506  }, {
42507    key: "keyExist",
42508    value: function keyExist(object, key) {
42509      return Object.prototype.hasOwnProperty.call(object, key);
42510    }
42511    /**
42512     * Метод проверяет пустой объект или нет
42513     * @param {Object} object - объект проверяемый на пустоту
42514     * @return {boolean} - true если пустой и false если полный
42515     */
42516
42517  }, {
42518    key: "isEmptyObject",
42519    value: function isEmptyObject(object) {
42520      var empty = 0;
42521      return Object.keys(object).length === empty;
42522    }
42523    /**
42524     * Проверяет переданные данные на строку
42525     * @param {String} string - данные на проверку
42526     * @return {boolean} - возращает true, если строка, и false наоборот
42527     */
42528
42529  }, {
42530    key: "isString",
42531    value: function isString(string) {
42532      return typeof string === 'string';
42533    }
42534    /**
42535     * Узнает index элемента в родительской элемент
42536     * Аналог jquery.index()
42537     * @param {Node} element - искомый элемент
42538     * @return {number} - порядковый номер (индекс) в родительском элементе
42539     */
42540
42541  }, {
42542    key: "getElementIndex",
42543    value: function getElementIndex(element) {
42544      return Array.from(element.parentNode.children).indexOf(element);
42545    }
42546    /**
42547     * Проверяет, поддерживает ли устройство touch-события
42548     * @return {boolean} - возращает true, если Touch-устройство, и false наоборот
42549     */
42550
42551  }, {
42552    key: "isTouch",
42553    value: function isTouch() {
42554      return Boolean(typeof window !== 'undefined' && ('ontouchstart' in window || window.DocumentTouch && typeof document !== 'undefined' && document instanceof window.DocumentTouch)) || Boolean(typeof navigator !== 'undefined' && (navigator.maxTouchPoints || navigator.msMaxTouchPoints));
42555    }
42556    /**
42557     * Узнает находится ли элемент во вьюпорте
42558     * @param {Node} element - искомый элемент
42559     * @return {boolean} - возращает true, если элемент виден на экране, и false наоборот
42560     */
42561
42562  }, {
42563    key: "isInViewport",
42564    value: function isInViewport(element) {
42565      var rect = element.getBoundingClientRect();
42566      var windowHeight = window.innerHeight || document.documentElement.clientHeight;
42567      var windowWidth = window.innerWidth || document.documentElement.clientWidth;
42568      var belowViewport = 0;
42569      var verticalInView = rect.top <= windowHeight && rect.top + rect.height >= belowViewport;
42570      var horizontalInView = rect.left <= windowWidth && rect.left + rect.width >= belowViewport;
42571      return verticalInView && horizontalInView;
42572    }
42573    /**
42574     * Возвращает передаваемую функцию не чаще, чем раз в wait мс
42575     * @param {Object} func - функция
42576     * @param {number} wait - время ожидания, мс
42577     * @returns {Function} - func
42578     */
42579
42580  }, {
42581    key: "debounce",
42582    value: function debounce(func, wait) {
42583      /* eslint-disable */
42584      var timeout;
42585      return function () {
42586        var _this = this;
42587
42588        for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
42589          args[_key] = arguments[_key];
42590        }
42591
42592        clearTimeout(timeout);
42593        timeout = setTimeout(function () {
42594          func.apply(_this, args);
42595        }, wait);
42596      };
42597      /* eslint-enable */
42598    }
42599  }, {
42600    key: "closest",
42601    value: function closest(element, selector) {
42602      if (!selector) {
42603        return false;
42604      }
42605
42606      var first = 0;
42607      var foundElements = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element).closest(selector);
42608
42609      if (!foundElements.length) {
42610        return false;
42611      }
42612
42613      return foundElements[first];
42614    }
42615  }]);
42616
42617  return Utils;
42618}();
42619
42620/* harmony default export */ __webpack_exports__["default"] = (Utils);
42621
42622/***/ }),
42623
42624/***/ "./common/styles/app.scss":
42625/*!********************************!*\
42626  !*** ./common/styles/app.scss ***!
42627  \********************************/
42628/*! no static exports found */
42629/***/ (function(module, exports, __webpack_require__) {
42630
42631// extracted by mini-css-extract-plugin
42632
42633/***/ }),
42634
42635/***/ "./components/forms/submit/index.js":
42636/*!******************************************!*\
42637  !*** ./components/forms/submit/index.js ***!
42638  \******************************************/
42639/*! exports provided: default */
42640/***/ (function(module, __webpack_exports__, __webpack_require__) {
42641
42642"use strict";
42643__webpack_require__.r(__webpack_exports__);
42644/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var components_forms_validation_validation_twig__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! components/forms/validation/validation.twig */ "./components/forms/validation/validation.twig");
42645/* harmony import */ var components_forms_validation_validation_twig__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(components_forms_validation_validation_twig__WEBPACK_IMPORTED_MODULE_0__);
42646/* harmony import */ var common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! common/scripts/utils */ "./common/scripts/utils.js");
42647/* harmony import */ var components_forms_validation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! components/forms/validation */ "./components/forms/validation/index.js");
42648function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
42649
42650function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
42651
42652function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
42653
42654
42655
42656
42657
42658var Submit =
42659/*#__PURE__*/
42660function () {
42661  function Submit() {
42662    _classCallCheck(this, Submit);
42663  }
42664
42665  _createClass(Submit, [{
42666    key: "init",
42667    value: function init(options) {
42668      this.target = options.target;
42669      this.form = this.target.closest('form');
42670      this.formWrap = this.target.closest('.b-callback__form');
42671      this.replyWrap = this.formWrap.nextElementSibling;
42672      this.url = this.form.getAttribute('action');
42673      this.method = this.form.getAttribute('method');
42674      this.inputs = this.form.querySelectorAll('.j-input');
42675      this.noErrors = 0;
42676      this.bindEvents();
42677    }
42678  }, {
42679    key: "bindEvents",
42680    value: function bindEvents() {
42681      var _this = this;
42682
42683      this.target.addEventListener('click', function (event) {
42684        event.preventDefault();
42685
42686        _this.validationCheck();
42687      });
42688    }
42689  }, {
42690    key: "validationCheck",
42691    value: function validationCheck() {
42692      this.inputs.forEach(function (item) {
42693        var inputValidation = new components_forms_validation__WEBPACK_IMPORTED_MODULE_2__["default"]();
42694        var errorMessage = item.dataset.error;
42695        inputValidation.init({
42696          target: item,
42697          error: errorMessage
42698        });
42699        inputValidation.validate();
42700      });
42701
42702      if (document.querySelectorAll('.has-error').length === this.noErrors) {
42703        this.send();
42704      }
42705    }
42706  }, {
42707    key: "send",
42708    value: function send() {
42709      var that = this;
42710      var formData = $(this.form).serialize();
42711      common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__["default"].send(formData, this.url, {
42712        success: function success(respond) {
42713          that.showSuccessMessage(respond);
42714        },
42715        error: function error(_error) {
42716          console.error("\u043E\u0448\u0438\u0431\u043A\u0430 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435: ".concat(_error));
42717        }
42718      }, this.method);
42719    }
42720  }, {
42721    key: "showSuccessMessage",
42722    value: function showSuccessMessage(data) {
42723      this.formWrap.style.display = 'none';
42724      common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__["default"].insetContent(this.replyWrap, components_forms_validation_validation_twig__WEBPACK_IMPORTED_MODULE_0___default()(data.data));
42725    }
42726  }]);
42727
42728  return Submit;
42729}();
42730
42731/* harmony default export */ __webpack_exports__["default"] = (Submit);
42732/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "../node_modules/jquery/dist/jquery.js")))
42733
42734/***/ }),
42735
42736/***/ "./components/forms/telephone/index.js":
42737/*!*********************************************!*\
42738  !*** ./components/forms/telephone/index.js ***!
42739  \*********************************************/
42740/*! exports provided: default */
42741/***/ (function(module, __webpack_exports__, __webpack_require__) {
42742
42743"use strict";
42744__webpack_require__.r(__webpack_exports__);
42745/* harmony import */ var inputmask__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! inputmask */ "../node_modules/inputmask/index.js");
42746/* harmony import */ var inputmask__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(inputmask__WEBPACK_IMPORTED_MODULE_0__);
42747function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
42748
42749function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
42750
42751function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
42752
42753/**
42754 * @version 1.0alpha
42755 * @author Kelnik Studios {http://kelnik.ru}
42756 * @link https://kelnik.gitbooks.io/kelnik-documentation/content/front-end/components/forms/input-tel.html documentation
42757 */
42758
42759/**
42760 * Dependencies
42761 */
42762
42763/**
42764 * Модуль ввешает маску на input типом tel
42765 */
42766
42767var InputTelephone =
42768/*#__PURE__*/
42769function () {
42770  function InputTelephone() {
42771    _classCallCheck(this, InputTelephone);
42772  }
42773
42774  _createClass(InputTelephone, [{
42775    key: "init",
42776    value: function init(options) {
42777      this.input = options.input;
42778      this.mask = options.mask || '+7(999) 999-99-99';
42779      this.setMask();
42780    }
42781    /**
42782     * Устанавливаем маску на инпут
42783     */
42784
42785  }, {
42786    key: "setMask",
42787    value: function setMask() {
42788      inputmask__WEBPACK_IMPORTED_MODULE_0___default()({
42789        mask: this.mask
42790      }).mask(this.input);
42791    }
42792  }]);
42793
42794  return InputTelephone;
42795}();
42796
42797/* harmony default export */ __webpack_exports__["default"] = (InputTelephone);
42798
42799/***/ }),
42800
42801/***/ "./components/forms/validation/index.js":
42802/*!**********************************************!*\
42803  !*** ./components/forms/validation/index.js ***!
42804  \**********************************************/
42805/*! exports provided: default */
42806/***/ (function(module, __webpack_exports__, __webpack_require__) {
42807
42808"use strict";
42809__webpack_require__.r(__webpack_exports__);
42810/* harmony import */ var hyperform__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! hyperform */ "../node_modules/hyperform/src/hyperform.js");
42811/* harmony import */ var common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! common/scripts/utils */ "./common/scripts/utils.js");
42812function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
42813
42814function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
42815
42816function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
42817
42818/**
42819 * Dependencies
42820 */
42821
42822
42823var focusClass = 'is-focused';
42824
42825var Validation =
42826/*#__PURE__*/
42827function () {
42828  function Validation() {
42829    _classCallCheck(this, Validation);
42830
42831    this.errorClass = 'has-error';
42832    this.errorWrapClass = 'b-form-error';
42833  }
42834
42835  _createClass(Validation, [{
42836    key: "init",
42837    value: function init(options) {
42838      this.input = options.target;
42839      this.errorMessage = options.error || 'Введите текст в поле ввода';
42840      this.inputWrap = this.input.closest('div');
42841      this.errorWrap = this.inputWrap.querySelector(".".concat(this.errorWrapClass));
42842      this.bindEvents();
42843    }
42844  }, {
42845    key: "bindEvents",
42846    value: function bindEvents() {
42847      this.input.addEventListener('blur', this.validate.bind(this));
42848      this.input.addEventListener('input', this.validate.bind(this));
42849    }
42850  }, {
42851    key: "createErrorWrap",
42852    value: function createErrorWrap() {
42853      if (this.errorWrap === null) {
42854        common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__["default"].insetContent(this.inputWrap, "<div class=\"".concat(this.errorWrapClass, "\"></div>"));
42855      }
42856
42857      this.errorWrap = this.inputWrap.querySelector(".".concat(this.errorWrapClass));
42858    }
42859  }, {
42860    key: "validate",
42861    value: function validate() {
42862      this.createErrorWrap();
42863      this.labelConduct();
42864
42865      if (hyperform__WEBPACK_IMPORTED_MODULE_0__["default"].willValidate(this.input)) {
42866        var isValid = hyperform__WEBPACK_IMPORTED_MODULE_0__["default"].ValidityState(this.input).valid; // eslint-disable-line
42867
42868        if (isValid) {
42869          common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__["default"].clearHtml(this.errorWrap);
42870          this.inputWrap.classList.remove(this.errorClass);
42871        } else {
42872          common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__["default"].clearHtml(this.errorWrap);
42873          common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__["default"].insetContent(this.errorWrap, this.errorMessage);
42874          this.inputWrap.classList.add(this.errorClass);
42875        }
42876      }
42877    }
42878  }, {
42879    key: "labelConduct",
42880    value: function labelConduct() {
42881      this.label = this.input.nextSibling.nextSibling;
42882
42883      if (this.input.value === '') {
42884        this.label.classList.remove(focusClass);
42885      } else {
42886        this.label.classList.add(focusClass);
42887      }
42888    }
42889  }]);
42890
42891  return Validation;
42892}();
42893
42894/* harmony default export */ __webpack_exports__["default"] = (Validation);
42895
42896/***/ }),
42897
42898/***/ "./components/forms/validation/validation.twig":
42899/*!*****************************************************!*\
42900  !*** ./components/forms/validation/validation.twig ***!
42901  \*****************************************************/
42902/*! no static exports found */
42903/***/ (function(module, exports, __webpack_require__) {
42904
42905var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig,
42906    template = twig({"id":"92660d3c46547e89a434052b65c6ab22f5bd306bd8fb4ee2cf62243e66bdf97d3df5bb8eb96e216d6d69665acedc40186823db6c4b27c0cbbd7f67d76a9894e0","data":[{"type":"raw","value":"<h4 class=\"b-callback-reply__title\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"title","match":["title"]}]},{"type":"raw","value":"</h4>\n<div class=\"b-callback-reply__text\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"message","match":["message"]}]},{"type":"raw","value":"</div>\n<div class=\"b-callback-reply__icon\">\n    <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"152\" height=\"152\" viewBox=\"0 0 152 152\"><defs>
42906<path id=\"vv93a\" d=\"M644 475c0-41.974 34.026-76 76-76s76 34.026 76 76-34.026 76-76 76-76-34.026-76-76z\"/><path id=\"vv93b\" d=\"M716.25 477.5l17.5-17.5 6.25 6.25L716.25 490 700 473.75l6.25-6.25z\"/></defs><g><g opacity=\".2\" transform=\"translate(-644 -399)\"><use fill=\"#d69d3a\" xlink:href=\"#vv93a\"/></g><g transform=\"translate(-644 -399)\"><use fill=\"#d69d3a\" xlink:href=\"#vv93b\"/></g></g></svg>\n</div>\n"}],"allowInlineIncludes":true,"rethrow":true});
42907
42908module.exports = function(context) { return template.render(context); }
42909
42910/***/ }),
42911
42912/***/ "./components/hover-effect/index.js":
42913/*!******************************************!*\
42914  !*** ./components/hover-effect/index.js ***!
42915  \******************************************/
42916/*! exports provided: default */
42917/***/ (function(module, __webpack_exports__, __webpack_require__) {
42918
42919"use strict";
42920__webpack_require__.r(__webpack_exports__);
42921function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
42922
42923function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
42924
42925function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
42926
42927var defaultPosition = 0;
42928var half = 2;
42929var rightClassIn = 'is-goes-right';
42930var leftClassIn = 'is-goes-left';
42931var rightClassOut = 'is-goes-right__out';
42932var leftClassOut = 'is-goes-left__out';
42933var itemWithBgImg = 'is-goes-with-image';
42934
42935var HoverEffect =
42936/*#__PURE__*/
42937function () {
42938  function HoverEffect(element) {
42939    _classCallCheck(this, HoverEffect);
42940
42941    this.width = element.offsetWidth;
42942    this.title = element.querySelector('[class*=ttl]');
42943    element.classList.add('b-highlight-parent'); // Если фон с изображением то делаем клип и на сам текст
42944
42945    this.withBgImg = element.dataset.withBgImg;
42946    this.createLayer(element);
42947    this.checkElementWithBg(this.title);
42948
42949    this._loadEvents(element);
42950  }
42951  /**
42952   * Создает слой-маску
42953   * @param {Object} element - div
42954   */
42955
42956
42957  _createClass(HoverEffect, [{
42958    key: "createLayer",
42959    value: function createLayer(element) {
42960      this.layer = document.createElement('div');
42961      this.layer.className = 'b-highlight-layer';
42962      element.appendChild(this.layer);
42963    }
42964  }, {
42965    key: "_loadEvents",
42966    value: function _loadEvents(element) {
42967      var _this = this;
42968
42969      element.addEventListener('mouseenter', function (event) {
42970        _this.layer.style.left = '0';
42971
42972        _this.getCursorDirection(event);
42973
42974        _this.moveLayerIn(_this.direction);
42975      });
42976      element.addEventListener('mouseleave', function (event) {
42977        _this.getCursorDirection(event);
42978
42979        _this.moveLayerOut(_this.direction);
42980      });
42981    }
42982  }, {
42983    key: "getCursorDirection",
42984    value: function getCursorDirection(event) {
42985      this.direction = event.offsetX;
42986      return this.direction;
42987    }
42988    /**
42989     * перемещает созданный слой поверх родительского блока
42990     * @param {Number} coordX - значение координаты x курсора
42991     */
42992
42993  }, {
42994    key: "moveLayerIn",
42995    value: function moveLayerIn(coordX) {
42996      if (coordX > this.width / half) {
42997        this.title.classList.add(rightClassIn);
42998      } else {
42999        this.title.classList.add(leftClassIn);
43000      }
43001
43002      this.title.classList.remove(rightClassOut);
43003      this.title.classList.remove(leftClassOut);
43004    }
43005    /**
43006     * перемещает созданный слой за пределы родительского блока
43007     * @param {Number} coordX - значение координаты x курсора
43008     */
43009
43010  }, {
43011    key: "moveLayerOut",
43012    value: function moveLayerOut(coordX) {
43013      if (coordX > defaultPosition) {
43014        this.layer.style.left = '100%';
43015        this.title.classList.add('is-goes-left__out');
43016      } else {
43017        this.layer.style.left = '-100%';
43018        this.title.classList.add('is-goes-right__out');
43019      }
43020
43021      this.title.classList.remove(rightClassIn);
43022      this.title.classList.remove(leftClassIn);
43023    }
43024  }, {
43025    key: "checkElementWithBg",
43026    value: function checkElementWithBg(title) {
43027      if (typeof this.withBgImg !== 'undefined') {
43028        title.classList.add(itemWithBgImg);
43029      }
43030    }
43031  }]);
43032
43033  return HoverEffect;
43034}();
43035
43036/* harmony default export */ __webpack_exports__["default"] = (HoverEffect);
43037
43038/***/ }),
43039
43040/***/ "./components/mobile-header/index.js":
43041/*!*******************************************!*\
43042  !*** ./components/mobile-header/index.js ***!
43043  \*******************************************/
43044/*! exports provided: default */
43045/***/ (function(module, __webpack_exports__, __webpack_require__) {
43046
43047"use strict";
43048__webpack_require__.r(__webpack_exports__);
43049/* harmony import */ var _mobile_header_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mobile-header.scss */ "./components/mobile-header/mobile-header.scss");
43050/* harmony import */ var _mobile_header_scss__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_mobile_header_scss__WEBPACK_IMPORTED_MODULE_0__);
43051/* harmony import */ var hammerjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! hammerjs */ "../node_modules/hammerjs/hammer.js");
43052/* harmony import */ var hammerjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(hammerjs__WEBPACK_IMPORTED_MODULE_1__);
43053function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
43054
43055function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
43056
43057function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
43058
43059/**
43060 * @version 1.1alpha
43061 * @author Kelnik Studios {http://kelnik.ru}
43062 * @link https://kelnik.gitbooks.io/kelnik-documentation/content/front-end/components/mobile-header.html documentation
43063 */
43064
43065/**
43066 * Dependencies
43067 */
43068
43069
43070/**
43071 * Component
43072 */
43073
43074var Header =
43075/*#__PURE__*/
43076function () {
43077  function Header() {
43078    _classCallCheck(this, Header);
43079  }
43080
43081  _createClass(Header, [{
43082    key: "init",
43083    value: function init(options) {
43084      this.headerParent = document.querySelector(options.element) || null;
43085      /**
43086       * Проверка на наличие хэдера
43087       */
43088
43089      if (!this.headerParent) {
43090        console.error('Need target element - https://kelnik.gitbooks.io/kelnik-documentation/content/front-end/components/mobile-header.html');
43091        return;
43092      }
43093
43094      this.body = document.body;
43095      this.header = this.headerParent.querySelector('.b-header-wrap');
43096      this.menu = this.headerParent.querySelector('.b-header__mobile-menu');
43097      this.openButton = this.headerParent.querySelector('.b-header__open-menu');
43098      this.closeButton = this.headerParent.querySelector('.b-header__mobile-menu-close');
43099      this.scrollPosition = 0;
43100      this.autoFixed = options.autoFixed;
43101      this.autoPositionCloseButton = options.autoPositionCloseButton;
43102      this.returnPosition = options.returnPosition;
43103      this.swipeDirection = options.swipeDirection || 'right';
43104      /**
43105       * Проверка на корректное указание направления для свайпа (доступно только слева направо, и справа налево)
43106       */
43107
43108      if (this.swipeDirection !== 'left' && this.swipeDirection !== 'right') {
43109        console.error('Wrong direction swipe - https://kelnik.gitbooks.io/kelnik-documentation/content/front-end/components/mobile-header.html');
43110      }
43111
43112      this.useOptions();
43113      this.bindEvents();
43114      this.setHeightHeader();
43115    }
43116    /**
43117     * События
43118     */
43119
43120  }, {
43121    key: "bindEvents",
43122    value: function bindEvents() {
43123      var _this = this;
43124
43125      /**
43126       * Cобытия для позиционирования кнопки закрыть и установки высоты хэдеру
43127       */
43128      window.addEventListener('resize', this.changePositionCloseButton.bind(this));
43129      window.addEventListener('resize', this.setHeightHeader.bind(this));
43130      /**
43131       * Cобытия для открытия/закрытия меню
43132       */
43133
43134      this.openButton.addEventListener('click', this.openMenu.bind(this));
43135      this.closeButton.addEventListener('click', this.closeMenu.bind(this));
43136      /**
43137       * Закрытие меню по свайпу (по умолчанию - слева направо)
43138       */
43139
43140      new hammerjs__WEBPACK_IMPORTED_MODULE_1___default.a(this.menu).on("swipe".concat(this.swipeDirection), function () {
43141        _this.closeMenu();
43142      });
43143    }
43144    /**
43145     * Метод применения настроек
43146     */
43147
43148  }, {
43149    key: "useOptions",
43150    value: function useOptions() {
43151      /**
43152       * Запуск скрипта скролла при настройке autoFixed: true
43153       * @type {boolean}
43154       */
43155      if (this.autoFixed) {
43156        this.header.classList.add('b-header_position_fixed');
43157        this.changePositionHeader();
43158      }
43159    }
43160    /**
43161     * Метод реализации появления/скрытия хэдера
43162     */
43163
43164  }, {
43165    key: "changePositionHeader",
43166    value: function changePositionHeader() {
43167      var _this2 = this;
43168
43169      // шаг времени задержки отрабатывания функции скрытия хэдера
43170      var stepScrollTop = -5; // шаг времени задержки отрабатывания функции отображения хэдера
43171
43172      var stepScrollBottom = 5;
43173      var heightHeader = this.header.offsetHeight; // текущая позиция скролла
43174
43175      var scrollPosition = 0;
43176      var minScrollPosition = 0;
43177      document.addEventListener('scroll', function () {
43178        /**
43179         * Отключение метода если меню открыто
43180         */
43181        if (_this2.menu.classList.contains('b-header__mobile-menu_state_open')) {
43182          return;
43183        }
43184
43185        var scrollTopPosition = window.pageYOffset;
43186        /**
43187         * Cкролл вниз при условии, что прошла половина высоты хэдера
43188         */
43189
43190        if (scrollTopPosition > heightHeader && scrollTopPosition - scrollPosition > stepScrollBottom) {
43191          _this2.header.classList.add('b-header_position_fixed');
43192
43193          _this2.header.classList.add('b-header_position_hide');
43194        }
43195        /**
43196         * Cкролл вверх
43197         */
43198
43199
43200        if (scrollTopPosition - scrollPosition < stepScrollTop) {
43201          _this2.header.classList.remove('b-header_position_hide');
43202        }
43203        /**
43204         * Отрицательный скролл (прокрутка вверх, находясь при этом в самой верхней точке)
43205         */
43206
43207
43208        if (scrollTopPosition < minScrollPosition) {
43209          _this2.header.classList.remove('b-header_position_fixed');
43210        }
43211
43212        scrollPosition = scrollTopPosition;
43213      });
43214    }
43215    /**
43216     * Метод открытия меню
43217     */
43218
43219  }, {
43220    key: "openMenu",
43221    value: function openMenu() {
43222      var _this3 = this;
43223
43224      this.scrollPosition = window.pageYOffset;
43225      this.menu.classList.add('b-header__mobile-menu_state_open');
43226      this.changePositionCloseButton();
43227      var defaultSpeed = 300;
43228      setTimeout(function () {
43229        _this3.body.classList.add('body-fixed');
43230      }, defaultSpeed); // this.setHeightMenu(); //!BUG
43231    }
43232    /**
43233     * Метод закрытия меню
43234     */
43235
43236  }, {
43237    key: "closeMenu",
43238    value: function closeMenu() {
43239      this.menu.classList.remove('b-header__mobile-menu_state_open');
43240      this.body.classList.remove('body-fixed');
43241      this.returnContentPosition();
43242    }
43243    /**
43244     * Метод возврата позиции контента при закрытии меню
43245     */
43246
43247  }, {
43248    key: "returnContentPosition",
43249    value: function returnContentPosition() {
43250      if (!this.returnPosition) {
43251        return;
43252      }
43253
43254      var topScrollPosition = 0;
43255      window.scrollBy(topScrollPosition, this.scrollPosition);
43256    }
43257    /**
43258     * Метод позиционирования кнопки закрытия
43259     */
43260
43261  }, {
43262    key: "changePositionCloseButton",
43263    value: function changePositionCloseButton() {
43264      if (!this.autoPositionCloseButton) {
43265        return;
43266      }
43267
43268      var positionOpenButtonTop = this.openButton.getBoundingClientRect().top;
43269      var positionOpenButtonLeft = this.openButton.getBoundingClientRect().left;
43270      this.closeButton.style.left = "".concat(positionOpenButtonLeft, "px");
43271      this.closeButton.style.top = "".concat(positionOpenButtonTop, "px");
43272    }
43273    /**
43274     * Метод установки высоты хэдеру
43275     */
43276
43277  }, {
43278    key: "setHeightHeader",
43279    value: function setHeightHeader() {
43280      this.headerParent.style.height = "".concat(this.header.offsetHeight, "px");
43281    }
43282    /**
43283     * BUG! Метод установки высоты меню исходя из высоты видимой области экрана
43284     */
43285
43286  }, {
43287    key: "setHeightMenu",
43288    value: function setHeightMenu() {
43289      var heightScreen = document.documentElement.clientHeight;
43290      this.menu.style.height = "".concat(heightScreen, "px");
43291    }
43292  }]);
43293
43294  return Header;
43295}();
43296
43297/* harmony default export */ __webpack_exports__["default"] = (Header);
43298
43299/***/ }),
43300
43301/***/ "./components/mobile-header/mobile-header.scss":
43302/*!*****************************************************!*\
43303  !*** ./components/mobile-header/mobile-header.scss ***!
43304  \*****************************************************/
43305/*! no static exports found */
43306/***/ (function(module, exports, __webpack_require__) {
43307
43308// extracted by mini-css-extract-plugin
43309
43310/***/ }),
43311
43312/***/ "./components/news/basicTemplate.twig":
43313/*!********************************************!*\
43314  !*** ./components/news/basicTemplate.twig ***!
43315  \********************************************/
43316/*! no static exports found */
43317/***/ (function(module, exports, __webpack_require__) {
43318
43319var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig,
43320    template = twig({"id":"1278d551cb715797107065bf20ed23797da32e9ef3065033e45ecaf200d4e9d8a140ccb76a046be55bc6422a9fa084c6ebed4d6bae27e0f6aa68684e21dbc81a","data":[{"type":"raw","value":"<a href=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"link","match":["link"]}]},{"type":"raw","value":"\" class=\"b-new__blank b-animate-borders__separated j-hover-highlight\">\n    <div class=\"b-top-border\"></div>\n    <div class=\"b-left-border\"></div>\n    <div class=\"b-right-border\"></div>\n    <div class=\"b-bottom-border\"></div>\n    <div class=\"b-new__date\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"date","match":["date"]}]},{"type":"raw","value":"</div>\n    <div class=\"b-new__ttl\" data-text=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"title","match":["title"]}]},{"type":"raw","value":"\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"title","match":["title"]}]},{"type":"raw","value":"</div>\n    <div class=\"b-new__text\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"announce","match":["announce"]}]},{"type":"raw","value":"</div>\n</a>\n"}],"allowInlineIncludes":true,"rethrow":true});
43321
43322module.exports = function(context) { return template.render(context); }
43323
43324/***/ }),
43325
43326/***/ "./components/news/imageTemplate.twig":
43327/*!********************************************!*\
43328  !*** ./components/news/imageTemplate.twig ***!
43329  \********************************************/
43330/*! no static exports found */
43331/***/ (function(module, exports, __webpack_require__) {
43332
43333var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig,
43334    template = twig({"id":"bdb480e764186af2aa09ca35cd51a74910de3c11c0b3a9705e9d4b1b53e1935557464b344dff9c6283ec74e18290d9a8a737eb496fa24c62b39dd472ecb11657","data":[{"type":"raw","value":"<a href=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"link","match":["link"]}]},{"type":"raw","value":"\" class=\"b-new__background j-hover-highlight\" data-with-bg-img style=\"background-image: url('"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"image","match":["image"]}]},{"type":"raw","value":"')\">\n    <div class=\"b-new__date\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"date","match":["date"]}]},{"type":"raw","value":"</div>\n    <div class=\"b-new__ttl\" data-text=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"title","match":["title"]}]},{"type":"raw","value":"\"><span>"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"title","match":["title"]}]},{"type":"raw","value":"</span></div>\n    <div class=\"b-new__text\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"announce","match":["announce"]}]},{"type":"raw","value":"</div>\n</a>\n"}],"allowInlineIncludes":true,"rethrow":true});
43335
43336module.exports = function(context) { return template.render(context); }
43337
43338/***/ }),
43339
43340/***/ "./components/news/index.js":
43341/*!**********************************!*\
43342  !*** ./components/news/index.js ***!
43343  \**********************************/
43344/*! exports provided: default */
43345/***/ (function(module, __webpack_exports__, __webpack_require__) {
43346
43347"use strict";
43348__webpack_require__.r(__webpack_exports__);
43349/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var components_news_basicTemplate_twig__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! components/news/basicTemplate.twig */ "./components/news/basicTemplate.twig");
43350/* harmony import */ var components_news_basicTemplate_twig__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(components_news_basicTemplate_twig__WEBPACK_IMPORTED_MODULE_0__);
43351/* harmony import */ var components_news_imageTemplate_twig__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! components/news/imageTemplate.twig */ "./components/news/imageTemplate.twig");
43352/* harmony import */ var components_news_imageTemplate_twig__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(components_news_imageTemplate_twig__WEBPACK_IMPORTED_MODULE_1__);
43353/* harmony import */ var common_scripts_mediator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! common/scripts/mediator */ "./common/scripts/mediator.js");
43354/* harmony import */ var common_scripts_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! common/scripts/utils */ "./common/scripts/utils.js");
43355function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
43356
43357function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
43358
43359function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
43360
43361
43362
43363
43364
43365var mediator = new common_scripts_mediator__WEBPACK_IMPORTED_MODULE_2__["default"]();
43366var tabletLandscape = 960;
43367var hiddenClass = 'is-hidden';
43368
43369var News =
43370/*#__PURE__*/
43371function () {
43372  function News() {
43373    var _this = this;
43374
43375    _classCallCheck(this, News);
43376
43377    this.moreBtn = document.querySelector('.j-load-more');
43378    this.filters = document.querySelectorAll('.j-news-filter');
43379    this.pageInput = document.querySelector('#page');
43380    this.parent = document.querySelector('#news');
43381    this.moreBtn.addEventListener('click', function () {
43382      _this.pageInput.value++; // eslint-disable-line
43383
43384      _this.send();
43385    });
43386    this.filters.forEach(function (input) {
43387      input.addEventListener('change', function () {
43388        _this.filterChange();
43389      });
43390    });
43391  }
43392
43393  _createClass(News, [{
43394    key: "init",
43395    value: function init(form) {
43396      this.form = form;
43397      this.url = this.form.getAttribute('action');
43398      this.method = this.form.getAttribute('method');
43399      this.send();
43400    }
43401  }, {
43402    key: "filterChange",
43403    value: function filterChange() {
43404      common_scripts_utils__WEBPACK_IMPORTED_MODULE_3__["default"].clearHtml(this.parent);
43405      this.pageInput.value = 1;
43406      this.send();
43407    }
43408  }, {
43409    key: "send",
43410    value: function send() {
43411      var that = this;
43412      this.dataToSend = $(this.form).serialize();
43413      common_scripts_utils__WEBPACK_IMPORTED_MODULE_3__["default"].send(this.dataToSend, this.url, {
43414        success: function success(respond) {
43415          respond.data.forEach(function (item) {
43416            that.insertTemplate(item);
43417          });
43418          that.getBlockPosition();
43419
43420          if (respond.request.isLast) {
43421            that.hideBtn();
43422          } else {
43423            that.showBtn();
43424          }
43425
43426          mediator.publish('receivedNews');
43427        },
43428        error: function error(_error) {
43429          console.error("\u043E\u0448\u0438\u0431\u043A\u0430 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435: ".concat(_error));
43430        }
43431      });
43432    }
43433  }, {
43434    key: "insertTemplate",
43435    value: function insertTemplate(data) {
43436      var template = data.image ? components_news_imageTemplate_twig__WEBPACK_IMPORTED_MODULE_1___default.a : components_news_basicTemplate_twig__WEBPACK_IMPORTED_MODULE_0___default.a;
43437      this.parent.insertAdjacentHTML('beforeend', template(data));
43438    }
43439    /**
43440     * вычисляет позицию блока новости, добавляя необходимый класс
43441     * для скрытия границ
43442     */
43443
43444  }, {
43445    key: "getBlockPosition",
43446    value: function getBlockPosition() {
43447      var _this2 = this;
43448
43449      var block = document.querySelectorAll('.b-new__blank');
43450      var parentPosition = this.parent.getBoundingClientRect();
43451      var leftMin = 0;
43452      var rightMin = -1;
43453      block.forEach(function (div) {
43454        var blockPosition = div.getBoundingClientRect();
43455        var leftDifference = blockPosition.left - parentPosition.left;
43456        var rightDifference = blockPosition.right - parentPosition.right;
43457
43458        if (leftDifference === leftMin) {
43459          div.classList.add('is-left');
43460        }
43461
43462        if (Math.round(rightDifference) >= rightMin) {
43463          div.classList.add('is-right');
43464        }
43465
43466        if (window.screen.availWidth < tabletLandscape) {
43467          _this2.destroyBorder(div);
43468        }
43469      });
43470    }
43471  }, {
43472    key: "destroyBorder",
43473    value: function destroyBorder(div) {
43474      var borders = div.querySelectorAll('[class*=border]');
43475      borders.forEach(function (border) {
43476        common_scripts_utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeElement(border);
43477      });
43478    }
43479  }, {
43480    key: "showBtn",
43481    value: function showBtn() {
43482      this.moreBtn.classList.remove(hiddenClass);
43483    }
43484  }, {
43485    key: "hideBtn",
43486    value: function hideBtn() {
43487      this.moreBtn.classList.add(hiddenClass);
43488    }
43489  }]);
43490
43491  return News;
43492}();
43493
43494/* harmony default export */ __webpack_exports__["default"] = (News);
43495/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "../node_modules/jquery/dist/jquery.js")))
43496
43497/***/ }),
43498
43499/***/ "./components/popup/index.js":
43500/*!***********************************!*\
43501  !*** ./components/popup/index.js ***!
43502  \***********************************/
43503/*! exports provided: default */
43504/***/ (function(module, __webpack_exports__, __webpack_require__) {
43505
43506"use strict";
43507__webpack_require__.r(__webpack_exports__);
43508/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var common_scripts_mediator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! common/scripts/mediator */ "./common/scripts/mediator.js");
43509/* harmony import */ var components_popup_popup_twig__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! components/popup/popup.twig */ "./components/popup/popup.twig");
43510/* harmony import */ var components_popup_popup_twig__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(components_popup_popup_twig__WEBPACK_IMPORTED_MODULE_1__);
43511/* harmony import */ var common_scripts_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! common/scripts/utils */ "./common/scripts/utils.js");
43512function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
43513
43514function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
43515
43516function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
43517
43518/**
43519 * @version 1.1beta
43520 * @author Kelnik Studios {http://kelnik.ru}
43521 * @link https://kelnik.gitbooks.io/kelnik-documentation/content/front-end/components/popup.html documentation
43522 */
43523
43524/**
43525 * DEPENDENCIES
43526 */
43527
43528
43529
43530var mediator = new common_scripts_mediator__WEBPACK_IMPORTED_MODULE_0__["default"]();
43531
43532var Popup =
43533/*#__PURE__*/
43534function () {
43535  function Popup() {
43536    _classCallCheck(this, Popup);
43537  }
43538
43539  _createClass(Popup, [{
43540    key: "init",
43541    value: function init(options) {
43542      this.body = document.body;
43543      this.template = options.template || components_popup_popup_twig__WEBPACK_IMPORTED_MODULE_1___default.a;
43544      this.templateContent = options.templateContent || false;
43545      this.target = options.target;
43546      this.closeButtonAriaLabel = options.closeButtonAriaLabel || 'Закрыть всплывающее окно';
43547      this.stateClass = 'b-popup_state_open';
43548      this.bindEvents();
43549    }
43550    /**
43551     * Вешаем слушателей событий
43552     */
43553
43554  }, {
43555    key: "bindEvents",
43556    value: function bindEvents() {
43557      var _this = this;
43558
43559      this.target.addEventListener('click', this.makeOpen.bind(this));
43560      document.addEventListener('keyup', function (element) {
43561        _this.closeOnPressButton(element);
43562      });
43563    }
43564    /**
43565     * Байнд событий после создания popup.
43566     */
43567
43568  }, {
43569    key: "bindEventsAfterOpen",
43570    value: function bindEventsAfterOpen() {
43571      var _this2 = this;
43572
43573      this.closeButton.addEventListener('click', this.close.bind(this));
43574      this.popup.addEventListener('click', function (element) {
43575        _this2.closeOnClickOverlay(element);
43576      });
43577    }
43578    /**
43579     * Добавляет body position:fixed, дабы избежать прокрутки страницы при открытом попапе.
43580     * Когда-нибудь перенесем в Mediator.
43581     */
43582
43583  }, {
43584    key: "fixedBody",
43585    value: function fixedBody() {
43586      this.body.classList.toggle('body-fixed');
43587    }
43588    /**
43589     * Запуск попапа при клике на кнопку.
43590     */
43591
43592  }, {
43593    key: "makeOpen",
43594    value: function makeOpen() {
43595      this.contentTypeCheck();
43596    }
43597    /**
43598     * Проверка типа попапа - статика/ajax.
43599     */
43600
43601  }, {
43602    key: "contentTypeCheck",
43603    value: function contentTypeCheck() {
43604      var dataAttributeHref = this.target.dataset.href;
43605      var dataAttributeAjax = this.target.dataset.ajax;
43606      var dataAttributeAjaxData = $.param(this.target.dataset);
43607      this.type = this.target.dataset.type || 'default';
43608
43609      if (dataAttributeHref) {
43610        var contentId = document.getElementById(dataAttributeHref);
43611
43612        if (!contentId) {
43613          console.error("\u0421\u043E\u0437\u0434\u0430\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u043D\u044B\u0439 \u0431\u043B\u043E\u043A \u043F\u043E\u043F\u0430\u043F\u0430 \u0441 id \"".concat(dataAttributeHref, "\""));
43614          return;
43615        }
43616
43617        var staticContent = contentId.innerHTML;
43618        this.outputOnDisplay(staticContent);
43619        this.open();
43620      } else if (dataAttributeAjax) {
43621        this.outputOnDisplay();
43622        this.send(dataAttributeAjaxData, this.open.bind(this));
43623      }
43624    }
43625    /**
43626     * Вывод попапа на экран.
43627     * @param {String} content - контент из статики или из json.
43628     */
43629
43630  }, {
43631    key: "outputOnDisplay",
43632    value: function outputOnDisplay(content) {
43633      this.setData(content);
43634      this.insertTemplate();
43635      this.getElements();
43636    }
43637    /**
43638     * Подготовка данных для шаблона
43639     * @param {String} content - контент из статики или из json.
43640     */
43641
43642  }, {
43643    key: "setData",
43644    value: function setData(content) {
43645      this.data = {
43646        content: content,
43647        buttonAriaLabel: this.closeButtonAriaLabel
43648      };
43649    }
43650    /**
43651     * Вставка шаблона.
43652     */
43653
43654  }, {
43655    key: "insertTemplate",
43656    value: function insertTemplate() {
43657      this.body.insertAdjacentHTML('afterbegin', this.template(this.data));
43658    }
43659    /**
43660     * Получаем попап и его элементы, вешаем события.
43661     */
43662
43663  }, {
43664    key: "getElements",
43665    value: function getElements() {
43666      this.popup = document.querySelector('.b-popup');
43667      this.content = document.querySelector('.b-popup__content');
43668      this.closeButton = this.popup.querySelector('.b-popup__close');
43669      this.overlay = this.popup.querySelector('.b-popup__overlay');
43670      this.bindEventsAfterOpen();
43671    }
43672    /**
43673     * Вставка контента
43674     * @param {String} popup - элемент, куда вставляется контент. (не сам попап, а его контентная часть!)
43675     * @param {String} content - вставляемый контент.
43676     */
43677
43678  }, {
43679    key: "send",
43680
43681    /**
43682     * Метод отправки ajax запроса
43683     * @param {Object} sentData - отправляемые данные.
43684     * @param {Function} complete - функция открытия попапа
43685     * @return {Boolean} - false - если нет интернета, запрос прерывается.
43686     * @return {Boolean} - true - успешное выполнение запроса.
43687     */
43688    value: function send(sentData) {
43689      var complete = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
43690
43691      if (!this.checkInternet()) {
43692        this.resending(sentData);
43693        return false;
43694      }
43695
43696      var that = this;
43697      var url = this.target.dataset.ajax;
43698      var callback = {
43699        success: function success(req) {
43700          if (req.request.result) {
43701            if (that.templateContent) {
43702              Popup.insetContent(that.content, that.templateContent(req.data));
43703            } else {
43704              Popup.insetContent(that.content, req.data.content);
43705            }
43706
43707            complete();
43708          } else {
43709            that.errorHandler('data');
43710            console.error(req.request.errors);
43711          }
43712        },
43713        error: function error(err) {
43714          that.errorHandler('server');
43715          console.error("server error ".concat(err));
43716        }
43717      };
43718      common_scripts_utils__WEBPACK_IMPORTED_MODULE_2__["default"].send(sentData, url, callback);
43719      return true;
43720    }
43721    /**
43722     * Метод закрытия попапа по клику на оверлей.
43723     * @param {Object} element - элемент по которому произошло событие. Cм. метод bindEventsAfterOpen
43724     */
43725
43726  }, {
43727    key: "closeOnClickOverlay",
43728    value: function closeOnClickOverlay(element) {
43729      if (element.target === this.overlay) {
43730        this.close();
43731      }
43732    }
43733    /**
43734     * Метод закрытия попапа по нажатию на ESC
43735     * @param {Object} element - элемент по которому произошло событие. Cм. метод bindEvents
43736     */
43737
43738  }, {
43739    key: "closeOnPressButton",
43740    value: function closeOnPressButton(element) {
43741      var keyCodeESC = 27;
43742
43743      if (element.keyCode === keyCodeESC) {
43744        this.close();
43745      }
43746    }
43747    /**
43748     * Метод открывает попап
43749     */
43750
43751  }, {
43752    key: "open",
43753    value: function open() {
43754      this.popup.classList.add(this.stateClass);
43755      this.fixedBody();
43756      mediator.publish('openPopup', this);
43757    }
43758    /**
43759     * Метод закрывает попап
43760     */
43761
43762  }, {
43763    key: "close",
43764    value: function close() {
43765      this.popup.classList.remove(this.stateClass);
43766      this.remove();
43767      this.fixedBody();
43768      mediator.publish('closePopup', this);
43769    }
43770    /**
43771     * Удаление попапа со страницы.
43772     */
43773
43774  }, {
43775    key: "remove",
43776    value: function remove() {
43777      common_scripts_utils__WEBPACK_IMPORTED_MODULE_2__["default"].removeElement(this.popup);
43778    }
43779    /**
43780     * Метод обработки ошибок.
43781     * @param {String} typeError - тип ошибки.
43782     */
43783
43784  }, {
43785    key: "errorHandler",
43786    value: function errorHandler(typeError) {
43787      var _this3 = this;
43788
43789      var errorList = [{
43790        type: 'internet',
43791        html: '<h1>Вы не подключены к интернету. Повторите запрос позднее</h1>'
43792      }, {
43793        type: 'server',
43794        html: '<h1>На сервере произошла ошибка. Повторите запрос позднее</h1>'
43795      }, {
43796        type: 'data',
43797        html: '<h1>На сервере произошла ошибка. Повторите запрос позднее</h1>'
43798      }];
43799      errorList.forEach(function (item) {
43800        if (typeError === item.type) {
43801          Popup.insetContent(_this3.content, item.html);
43802        }
43803      });
43804    }
43805    /**
43806     * Проверка на наличие интернета.
43807     * @return {boolean} true - интернет есть.
43808     * @return {boolean} false - интернетa нет.
43809     */
43810
43811  }, {
43812    key: "checkInternet",
43813    value: function checkInternet() {
43814      clearInterval(this.setInterval);
43815
43816      if (!common_scripts_utils__WEBPACK_IMPORTED_MODULE_2__["default"].checkInternetConnection()) {
43817        this.errorHandler('internet');
43818        return false;
43819      }
43820
43821      return true;
43822    }
43823    /**
43824     * Повторный запрос на сервер.
43825     * @param {object} sentData - отрправляемые данные.
43826     *
43827     */
43828
43829  }, {
43830    key: "resending",
43831    value: function resending(sentData) {
43832      var interval = 5000;
43833      var that = this;
43834      this.setInterval = setInterval(function () {
43835        that.send(sentData);
43836      }, interval);
43837    }
43838  }], [{
43839    key: "insetContent",
43840    value: function insetContent(popup, content) {
43841      common_scripts_utils__WEBPACK_IMPORTED_MODULE_2__["default"].clearHtml(popup);
43842      common_scripts_utils__WEBPACK_IMPORTED_MODULE_2__["default"].insetContent(popup, content);
43843    }
43844  }]);
43845
43846  return Popup;
43847}();
43848
43849/* harmony default export */ __webpack_exports__["default"] = (Popup);
43850/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "../node_modules/jquery/dist/jquery.js")))
43851
43852/***/ }),
43853
43854/***/ "./components/popup/inline-popup.twig":
43855/*!********************************************!*\
43856  !*** ./components/popup/inline-popup.twig ***!
43857  \********************************************/
43858/*! no static exports found */
43859/***/ (function(module, exports, __webpack_require__) {
43860
43861var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig,
43862    template = twig({"id":"ce815a20b2dc8fd2706482ba71b5709c49e2d23b63c26b94c8d0a5b5ce4ec5d0d5b771148bcd9676d07c08613cb5ecc35c6f3304f502b923f73feaf23be13024","data":[{"type":"raw","value":"<div class=\"b-popup\">\n    <div class=\"b-popup__overlay\"></div>\n\n    <div class=\"b-popup__inline-wrap\">\n        <button class=\"b-popup__close\"\n                aria-label=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"buttonAriaLabel","match":["buttonAriaLabel"]},{"type":"Twig.expression.type.filter","value":"default","match":["|default","default"],"params":[{"type":"Twig.expression.type.parameter.start","value":"(","match":["("]},{"type":"Twig.expression.type.string","value":"Закрыть всплывающее окно"},{"type":"Twig.expression.type.parameter.end","value":")","match":[")"],"expression":false}]}]},{"type":"raw","value":"\">\n            "},{"type":"output","stack":[{"type":"Twig.expression.type._function","fn":"source","params":[{"type":"Twig.expression.type.parameter.start","value":"(","match":["("]},{"type":"Twig.expression.type.string","value":"/local/templates/larus/icons/popup/media/close.svg"},{"type":"Twig.expression.type.parameter.end","value":")","match":[")"],"expression":false}]}]},{"type":"raw","value":"\n        </button>\n        <div class=\"b-popup__inline-content\">\n            "},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"content","match":["content"]}]},{"type":"raw","value":"\n        </div>\n    </div>\n</div>\n"}],"allowInlineIncludes":true,"rethrow":true});
43863
43864module.exports = function(context) { return template.render(context); }
43865
43866/***/ }),
43867
43868/***/ "./components/popup/map-popup.twig":
43869/*!*****************************************!*\
43870  !*** ./components/popup/map-popup.twig ***!
43871  \*****************************************/
43872/*! no static exports found */
43873/***/ (function(module, exports, __webpack_require__) {
43874
43875__webpack_require__(/*! ./media/close.svg.twig */ "./components/popup/media/close.svg.twig");
43876
43877var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig,
43878    template = twig({"id":"298d819fa2c96ad054bf1564ba612560cf863d2aaee4a0e46ece75e7974a856a69c9f30f08c21158bbee5a67cda62ab1958b3ac92b7bf0fb657d2f29fa64d16a","data":[{"type":"raw","value":"<div class=\"b-popup b-popup_for_map\">\n    <div class=\"b-popup__overlay\"></div>\n\n    <div class=\"b-popup__inline-wrap\">\n        <button class=\"b-popup__close\"\n                aria-label=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"buttonAriaLabel","match":["buttonAriaLabel"]},{"type":"Twig.expression.type.filter","value":"default","match":["|default","default"],"params":[{"type":"Twig.expression.type.parameter.start","value":"(","match":["("]},{"type":"Twig.expression.type.string","value":"Закрыть всплывающее окно"},{"type":"Twig.expression.type.parameter.end","value":")","match":[")"],"expression":false}]}]},{"type":"raw","value":"\">\n            "},{"type":"logic","token":{"type":"Twig.logic.type.include","only":false,"ignoreMissing":false,"stack":[{"type":"Twig.expression.type.string","value":"ae89ff9261739113d94bf7246acf11e5812364b9ca2b06a470b646a87c6c6783bff23afaee96a7af898541dbdb826ffc69ccc87f47432fa8c74e25b63cfccb36"}]}},{"type":"raw","value":"        </button>\n        <div class=\"b-popup__inline-content\">\n            "},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"content","match":["content"]}]},{"type":"raw","value":"\n        </div>\n    </div>\n</div>\n"}],"allowInlineIncludes":true,"rethrow":true});
43879
43880module.exports = function(context) { return template.render(context); }
43881
43882/***/ }),
43883
43884/***/ "./components/popup/media/close.svg.twig":
43885/*!***********************************************!*\
43886  !*** ./components/popup/media/close.svg.twig ***!
43887  \***********************************************/
43888/*! no static exports found */
43889/***/ (function(module, exports, __webpack_require__) {
43890
43891var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig,
43892    template = twig({"id":"ae89ff9261739113d94bf7246acf11e5812364b9ca2b06a470b646a87c6c6783bff23afaee96a7af898541dbdb826ffc69ccc87f47432fa8c74e25b63cfccb36","data":[{"type":"raw","value":"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"26\" height=\"26\" viewBox=\"0 0 26 26\"><defs><path id=\"73hta\" d=\"M1051.444 73L1050 71.556 1061.556 60 1050 48.444l
438921.444-1.444L1063 58.556 1074.556 47l1.444 1.444L1064.444 60 1076 71.556 1074.556 73 1063 61.444z\"/></defs><g><g transform=\"translate(-1050 -47)\"><use xlink:href=\"#73hta\"/></g></g></svg>\n"}],"allowInlineIncludes":true,"rethrow":true});
43893
43894module.exports = function(context) { return template.render(context); }
43895
43896/***/ }),
43897
43898/***/ "./components/popup/popup.twig":
43899/*!*************************************!*\
43900  !*** ./components/popup/popup.twig ***!
43901  \*************************************/
43902/*! no static exports found */
43903/***/ (function(module, exports, __webpack_require__) {
43904
43905var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig,
43906    template = twig({"id":"10f75d32d063079414a9d912a5dc70f4a43aa635b135aa0c00c34edc5bad75ed2d89f539e5dbd533fa35230be4e1f6702fff80a0ca53eddbc277ca1f7a07fd35","data":[{"type":"raw","value":"<div class=\"b-popup\">\n    <div class=\"b-popup__overlay\"></div>\n\n    <button class=\"b-popup__close\" aria-label=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"buttonAriaLabel","match":["buttonAriaLabel"]},{"type":"Twig.expression.type.filter","value":"default","match":["|default","default"],"params":[{"type":"Twig.expression.type.parameter.start","value":"(","match":["("]},{"type":"Twig.expression.type.string","value":"Закрыть всплывающее окно"},{"type":"Twig.expression.type.parameter.end","value":")","match":[")"],"expression":false}]}]},{"type":"raw","value":"\">\n        "},{"type":"output","stack":[{"type":"Twig.expression.type._function","fn":"source","params":[{"type":"Twig.expression.type.parameter.start","value":"(","match":["("]},{"type":"Twig.expression.type.string","value":"/local/templates/larus/images/popup/close.svg"},{"type":"Twig.expression.type.parameter.end","value":")","match":[")"],"expression":false}]}]},{"type":"raw","value":"\n    </button>\n\n    <div class=\"b-popup__wrap\">\n        <div class=\"b-popup__content\">\n            "},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"content","match":["content"]}]},{"type":"raw","value":"\n        </div>\n    </div>\n</div>\n"}],"allowInlineIncludes":true,"rethrow":true});
43907
43908module.exports = function(context) { return template.render(context); }
43909
43910/***/ }),
43911
43912/***/ "./components/preloader/index.js":
43913/*!***************************************!*\
43914  !*** ./components/preloader/index.js ***!
43915  \***************************************/
43916/*! exports provided: default */
43917/***/ (function(module, __webpack_exports__, __webpack_require__) {
43918
43919"use strict";
43920__webpack_require__.r(__webpack_exports__);
43921/* harmony import */ var _common_scripts_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../common/scripts/utils */ "./common/scripts/utils.js");
43922function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
43923
43924function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
43925
43926function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
43927
43928
43929
43930var Preloader =
43931/*#__PURE__*/
43932function () {
43933  function Preloader() {
43934    _classCallCheck(this, Preloader);
43935
43936    this.preloaderSelector = '.j-preloader';
43937    this.duration = 300;
43938  }
43939
43940  _createClass(Preloader, [{
43941    key: "init",
43942    value: function init() {
43943      this._initElements();
43944
43945      if (!this.preloader) {
43946        console.error("Preloader '".concat(this.preloaderSelector, "' not found"));
43947        return;
43948      }
43949
43950      if (this._isNotFirstLoad()) {
43951        this._hidePreloader();
43952
43953        return;
43954      }
43955
43956      this._bindEvents();
43957    }
43958  }, {
43959    key: "_initElements",
43960    value: function _initElements() {
43961      this.preloader = document.querySelector(this.preloaderSelector);
43962    }
43963  }, {
43964    key: "_bindEvents",
43965    value: function _bindEvents() {
43966      var _this = this;
43967
43968      window.onload = function () {
43969        _this._saveInStore();
43970
43971        _this._hidePreloader();
43972      };
43973    }
43974  }, {
43975    key: "_isNotFirstLoad",
43976    value: function _isNotFirstLoad() {
43977      return localStorage.getItem('pageLoaded') === 'true';
43978    }
43979  }, {
43980    key: "_hidePreloader",
43981    value: function _hidePreloader() {
43982      var _this2 = this;
43983
43984      this.preloader.classList.add('is-hide');
43985      setTimeout(function () {
43986        _common_scripts_utils__WEBPACK_IMPORTED_MODULE_0__["default"].hide(_this2.preloader);
43987      }, this.duration);
43988    }
43989  }, {
43990    key: "_saveInStore",
43991    value: function _saveInStore() {
43992      localStorage.setItem('pageLoaded', 'true');
43993    }
43994  }]);
43995
43996  return Preloader;
43997}();
43998
43999/* harmony default export */ __webpack_exports__["default"] = (Preloader);
44000
44001/***/ }),
44002
44003/***/ "./components/slider/index.js":
44004/*!************************************!*\
44005  !*** ./components/slider/index.js ***!
44006  \************************************/
44007/*! exports provided: default */
44008/***/ (function(module, __webpack_exports__, __webpack_require__) {
44009
44010"use strict";
44011__webpack_require__.r(__webpack_exports__);
44012/* harmony import */ var common_scripts_mediator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! common/scripts/mediator */ "./common/scripts/mediator.js");
44013/* harmony import */ var hammerjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! hammerjs */ "../node_modules/hammerjs/hammer.js");
44014/* harmony import */ var hammerjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(hammerjs__WEBPACK_IMPORTED_MODULE_1__);
44015/* harmony import */ var _slider_twig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./slider.twig */ "./components/slider/slider.twig");
44016/* harmony import */ var _slider_twig__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_slider_twig__WEBPACK_IMPORTED_MODULE_2__);
44017/* harmony import */ var common_scripts_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! common/scripts/utils */ "./common/scripts/utils.js");
44018function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
44019
44020function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
44021
44022function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
44023
44024/**
44025 * @version 2.0alpha
44026 * @author Kelnik Studios {http://kelnik.ru}
44027 * @link https://kelnik.gitbooks.io/kelnik-documentation/content/front-end/components/пока нет documentation
44028 */
44029
44030/**
44031 * DEPENDENCIES
44032 */
44033
44034/* eslint-disable */
44035
44036
44037
44038
44039var mediator = new common_scripts_mediator__WEBPACK_IMPORTED_MODULE_0__["default"]();
44040
44041var Slider =
44042/*#__PURE__*/
44043function () {
44044  function Slider() {
44045    _classCallCheck(this, Slider);
44046  }
44047
44048  _createClass(Slider, [{
44049    key: "init",
44050
44051    /**
44052     * Инициализация параметров
44053     */
44054    value: function init(options) {
44055      this.gallery = options.target;
44056      this.transitionTime = options.transitionTime || 300;
44057      this.infinite = options.infinite || false;
44058      this.autoplay = options.autoplay || false;
44059      this.autoplayTurn = 'right';
44060      this.autoplaySpeed = options.autoplaySpeed || 3000;
44061      this.dots = options.dots || false;
44062      this.childrens = Array.from(this.gallery.children);
44063      this.itemsCount = this.childrens.length;
44064      this.activeSlide = 1;
44065      this.width = 0;
44066      this.position = 0;
44067      this.flexHeight = false; // Utils.clearHtml(this.gallery); //почему то в IE очищает - this.childrens
44068
44069      this.createGallery();
44070    }
44071    /**
44072     * Главный метод. Создает весь слайдер.
44073     */
44074
44075  }, {
44076    key: "createGallery",
44077    value: function createGallery() {
44078      common_scripts_utils__WEBPACK_IMPORTED_MODULE_3__["default"].insetContent(this.gallery, _slider_twig__WEBPACK_IMPORTED_MODULE_2___default()());
44079
44080      if (!this.gallery) {
44081        console.error('Такого контейнера для слайдера не существует!');
44082        return false;
44083      }
44084
44085      this.getElements();
44086
44087      if (this.dots) {
44088        this.createDots();
44089      }
44090
44091      this.bindEvents();
44092      this.appendChilds();
44093      this.setHeight();
44094      this.dotActivate();
44095      this.ready();
44096      this.autoplayStart();
44097      this.createCounter();
44098      this.swipeFactoids();
44099
44100      if (this.itemsCount === 1) {
44101        var counter = this.gallery.querySelector('.b-slider__counter');
44102        var arrows = this.gallery.querySelector('.b-slider__arrows');
44103        counter.style.display = 'none';
44104        arrows.style.display = 'none';
44105      }
44106
44107      if (this.gallery.classList.contains('b-principe-carousel-view-2')) {
44108        // у этого слайдера особое положение стрелок
44109        this.setArrowsCustomPosition();
44110      }
44111    }
44112    /**
44113     * Получаем элементы слайдера.
44114     */
44115
44116  }, {
44117    key: "getElements",
44118    value: function getElements() {
44119      this.dotsWrapper = this.gallery.querySelector('.b-slider__dots');
44120      this.wrapper = this.gallery.querySelector('.b-slider__wrapper');
44121      this.arrowLeft = this.gallery.querySelector('.slider__arrow-left');
44122      this.arrowRight = this.gallery.querySelector('.slider__arrow-right');
44123      this.countActive = this.gallery.querySelector('.b-slider__counter-active');
44124      this.countAll = this.gallery.querySelector('.b-slider__counter-all');
44125    }
44126  }, {
44127    key: "swipeFactoids",
44128    value: function swipeFactoids() {
44129      var container = this.gallery.closest('.j-main-slider');
44130
44131      if (!container) {
44132        return;
44133      }
44134
44135      this.factoidsWrapper = container.querySelector('.j-factoids-wrapper');
44136      var touchEvent = new hammerjs__WEBPACK_IMPORTED_MODULE_1___default.a(this.factoidsWrapper);
44137      touchEvent.on('swiperight', this.isSlideLeft.bind(this));
44138      touchEvent.on('swipeleft', this.isSlideRight.bind(this));
44139    }
44140  }, {
44141    key: "createCounter",
44142    value: function createCounter() {
44143      this.countActive.innerHTML = this.numberFormat(this.activeSlide);
44144      this.countAll.innerHTML = this.numberFormat(this.itemsCount);
44145    }
44146    /**
44147     * возвращает число в формате 00 (дизайн)
44148     * @param {Number} number - число
44149     * @returns {string}
44150     */
44151
44152  }, {
44153    key: "numberFormat",
44154    value: function numberFormat(number) {
44155      return ('0' + number).slice(-2);
44156    }
44157    /**
44158     * Создаёт точки в html.
44159     */
44160
44161  }, {
44162    key: "createDots",
44163    value: function createDots() {
44164      for (var i = 0; i < this.itemsCount; i++) {
44165        this.dotsWrapper.appendChild(this.createDot());
44166      }
44167    }
44168    /**
44169     * Создаёт точку.
44170     * @return {HTMLButtonElement}
44171     */
44172
44173  }, {
44174    key: "createDot",
44175    value: function createDot() {
44176      var dot = document.createElement('button');
44177      dot.classList.add('b-slider__dot');
44178      return dot;
44179    }
44180    /**
44181     * Навешивает события на контролы
44182     */
44183
44184  }, {
44185    key: "bindEvents",
44186    value: function bindEvents() {
44187      var _this = this;
44188
44189      var touchEvent = new hammerjs__WEBPACK_IMPORTED_MODULE_1___default.a(this.gallery);
44190      touchEvent.on('swiperight', this.isSlideLeft.bind(this));
44191      touchEvent.on('swipeleft', this.isSlideRight.bind(this));
44192      this.arrowLeft.classList.add('is-last');
44193      this.arrowLeft.addEventListener('click', this.isSlideLeft.bind(this), false);
44194      this.arrowRight.addEventListener('click', this.isSlideRight.bind(this), false);
44195      this.dotsWrapper.addEventListener('click', function (event) {
44196        var index = common_scripts_utils__WEBPACK_IMPORTED_MODULE_3__["default"].getElementIndex(event.target) + 1;
44197        _this.activeSlide = index;
44198
44199        _this.dotActivate();
44200
44201        _this.slideTo(_this.goTo(index));
44202      });
44203      window.addEventListener('resize', function () {
44204        _this.refresh();
44205      });
44206    }
44207  }, {
44208    // key: "refresh",
44209    // value: function refresh() {
44210    //   this.width = this.gallery.querySelectorAll('.b-slider__item')[this.activeSlide].offsetWidth;
44211    //   this.position = -(this.width * (this.activeSlide - 1));
44212    //   this.slideTo(this.position);
44213    //   this.setHeight();
44214    // }
44215
44216      key: "refresh",
44217      value: function refresh() {
44218          var slides = this.gallery.querySelectorAll('.b-slider__item');
44219          var safeIndex = this.activeSlide % slides.length;
44220
44221          this.width = slides[safeIndex].offsetWidth;
44222          this.position = -(this.width * (this.activeSlide - 1));
44223          this.slideTo(this.position);
44224          this.setHeight();
44225      }
44226
44227    /**
44228     * Добавляет слайды.
44229     */
44230
44231  }, {
44232    key: "appendChilds",
44233    value: function appendChilds() {
44234      for (var i = 0; i < this.childrens.length; i++) {
44235        var item = document.createElement('div');
44236        item.classList.add('b-slider__item');
44237        item.appendChild(this.childrens[i]);
44238        this.wrapper.appendChild(item);
44239        this.width = this.wrapper.offsetWidth - this.getScrollbarWidth();
44240      }
44241    }
44242  }, {
44243    key: "getScrollbarWidth",
44244    value: function getScrollbarWidth() {
44245      var outer = document.createElement('div');
44246      outer.style.visibility = 'hidden';
44247      outer.style.width = '100px';
44248      document.body.appendChild(outer);
44249      var widthNoScroll = outer.offsetWidth;
44250      outer.style.overflow = 'scroll';
44251      var inner = document.createElement('div');
44252      inner.style.width = '100%';
44253      outer.appendChild(inner);
44254      var widthWithScroll = inner.offsetWidth;
44255      outer.parentNode.removeChild(outer);
44256      return widthNoScroll - widthWithScroll;
44257    }
44258    /**
44259     * Определяет максимальную высоту слайдов, и устанавливает ее обертке ().
44260     */
44261
44262  }, {
44263    key: "setHeight",
44264    value: function setHeight() {
44265      var _this2 = this;
44266
44267      var currentSlide = this.wrapper.querySelector(".b-slider__item:nth-child(".concat(this.activeSlide, ")"));
44268      var currentImg = currentSlide.querySelector('img');
44269
44270      if (currentImg) {
44271        currentImg.onload = function () {
44272          var slideHeight = currentSlide.offsetHeight;
44273
44274          _this2.wrapper.style.setProperty('height', "".concat(slideHeight, "px"), '');
44275        };
44276      }
44277    }
44278    /**
44279     * Меняет активное значение у точки.
44280     */
44281
44282  }, {
44283    key: "dotActivate",
44284    value: function dotActivate() {
44285      var _this3 = this;
44286
44287      this.allDots = Array.from(this.gallery.querySelectorAll('.b-slider__dot'));
44288      var activeDotClass = 'b-slider__dot_is_active';
44289      this.allDots.forEach(function (element, index) {
44290        if (_this3.activeSlide - 1 === index) {
44291          element.classList.add(activeDotClass);
44292
44293          _this3.transitionControl();
44294        } else {
44295          element.classList.remove(activeDotClass);
44296        }
44297      });
44298    }
44299    /**
44300     * Показывает слайдер когда все методы выполнятся.
44301     */
44302
44303  }, {
44304    key: "ready",
44305    value: function ready() {
44306      this.gallery.classList.add('b-slider_is_ready');
44307    }
44308    /**
44309     * Перелистывает к переданной позиции.
44310     * @param {Number} toPosition - позиция слайдера по X оси.
44311     */
44312
44313  }, {
44314    key: "slideTo",
44315    value: function slideTo(toPosition) {
44316      this.wrapper.style.transform = "translateX(".concat(toPosition, "px)");
44317    }
44318    /**
44319     * Листает слайдер вправо.
44320     */
44321
44322  }, {
44323    key: "slideLeft",
44324    value: function slideLeft() {
44325      this.transitionControl();
44326      this.slideTo(this.position);
44327      this.activeSlide -= 1;
44328      this.dotActivate();
44329      this.refresh();
44330    }
44331    /**
44332     * Листает слайдер влево.
44333     */
44334
44335  }, {
44336    key: "slideRight",
44337    value: function slideRight() {
44338      this.transitionControl();
44339      this.slideTo(this.position);
44340      this.activeSlide += 1;
44341      this.dotActivate();
44342      this.refresh();
44343    }
44344    /**
44345     * Проверяет можно ли листать влево (если не нужен инфинити скролл, то в if просто вернуть false).
44346     */
44347
44348  }, {
44349    key: "isSlideLeft",
44350    value: function isSlideLeft() {
44351      this.arrowRight.classList.remove('is-last');
44352      this.clearAutoplay();
44353
44354      if (this.position >= 0) {
44355        if (!this.infinite) {
44356          return false;
44357        }
44358
44359        this.position = -((this.itemsCount - 1) * this.width);
44360        this.activeSlide = this.itemsCount + 1;
44361      } else {
44362        this.position += this.width;
44363      }
44364
44365      if (this.gallery.classList.contains('j-benefits-slider')) {
44366        mediator.publish('benefitGoesLeft', this.activeSlide);
44367      }
44368
44369      if (this.activeSlide === 2) {
44370        this.arrowLeft.classList.add('is-last');
44371      }
44372
44373      this.countActive.innerHTML = this.numberFormat(this.activeSlide - 1);
44374      this.slideLeft();
44375      return true;
44376    }
44377    /**
44378     * Проверяет можно ли листать вправо (если не нужен инфинити скролл, то в if просто вернуть false).
44379     */
44380
44381  }, {
44382    key: "isSlideRight",
44383    value: function isSlideRight() {
44384      var parentWidth = this.gallery.offsetWidth;
44385      var slideWidth = this.gallery.querySelector('.b-slider__item').offsetWidth;
44386      var slideStop = Math.round(parentWidth / slideWidth);
44387      this.arrowLeft.classList.remove('is-last');
44388      this.clearAutoplay();
44389
44390      if (this.position <= -(this.width * (this.itemsCount - slideStop))) {
44391        if (!this.infinite) {
44392          return false;
44393        }
44394
44395        this.position = 0;
44396        this.activeSlide = 0;
44397      } else {
44398        this.position -= this.width;
44399      }
44400
44401      if (this.gallery.classList.contains('j-benefits-slider')) {
44402        mediator.publish('benefitGoesRight', {
44403          position: this.position,
44404          slide: this.activeSlide
44405        });
44406      }
44407
44408      if (this.activeSlide === this.itemsCount - 1) {
44409        this.arrowRight.classList.add('is-last');
44410      }
44411
44412      this.countActive.innerHTML = this.numberFormat(this.activeSlide + 1);
44413      this.slideRight();
44414      return true;
44415    }
44416    /**
44417     * Определяет новую позицию слайда в зависимости на какую точку нажали.
44418     * @param value {number} - Порядковый номер слайда.
44419     * @return {number} - Новая позиция.
44420     */
44421
44422  }, {
44423    key: "goTo",
44424    value: function goTo(value) {
44425      var newPosition = -(this.width * (value - 1));
44426      this.position = newPosition;
44427      return newPosition;
44428    }
44429    /**
44430     * Добавляет transition только на время слайда (чтобы небыло анимации при ресайзе)
44431     */
44432
44433  }, {
44434    key: "transitionControl",
44435    value: function transitionControl() {
44436      var _this4 = this;
44437
44438      this.wrapper.style.transitionDuration = "".concat(100 / this.transitionTime, "s");
44439      setTimeout(function () {
44440        _this4.wrapper.style.removeProperty('transition-duration');
44441      }, this.transitionTime);
44442    }
44443    /**
44444     * Метод автопролистывания слайдов.
44445     * @return {boolean}
44445 - если автоплэй не задан либо false, то сетинтервал не работает
44446     */
44447
44448  }, {
44449    key: "autoplayStart",
44450    value: function autoplayStart() {
44451      var _this5 = this;
44452
44453      if (!this.autoplay) {
44454        return false;
44455      }
44456
44457      this.autoplayTime = setInterval(function () {
44458        if (_this5.autoplayTurn === 'right') {
44459          if (!_this5.isSlideRight()) {
44460            _this5.autoplayTurn = 'left';
44461
44462            _this5.isSlideLeft();
44463          }
44464        } else {
44465          if (!_this5.isSlideLeft()) {
44466            _this5.autoplayTurn = 'left';
44467
44468            _this5.isSlideRight();
44469          }
44470        }
44471      }, this.autoplaySpeed);
44472    }
44473  }, {
44474    key: "clearAutoplay",
44475    value: function clearAutoplay() {
44476      clearInterval(this.autoplayTime);
44477      this.autoplayStart();
44478    }
44479  }, {
44480    key: "setArrowsCustomPosition",
44481    value: function setArrowsCustomPosition() {
44482      var arrows = this.gallery.querySelector('.b-slider__arrows');
44483      var height = this.gallery.querySelector('.b-principe-carousel__img').offsetHeight;
44484      arrows.style.top = "".concat(height, "px");
44485    }
44486  }]);
44487
44488  return Slider;
44489}();
44490
44491/* harmony default export */ __webpack_exports__["default"] = (Slider);
44492/* eslint-enable */
44493
44494/***/ }),
44495
44496/***/ "./components/slider/media/arrow-left.svg.twig":
44497/*!*****************************************************!*\
44498  !*** ./components/slider/media/arrow-left.svg.twig ***!
44499  \*****************************************************/
44500/*! no static exports found */
44501/***/ (function(module, exports, __webpack_require__) {
44502
44503var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig,
44504    template = twig({"id":"fe9879fdd68fe9032cd7497262fe10d9b15908a9c22621f13968dfc894cb2f4fc3e09a2b25d1bfcc5236bb87f70baeb5f37344bfed3a34cf0e6bffea533ac22c","data":[{"type":"raw","value":"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"17\" height=\"16\"\n     viewBox=\"0 0 17 16\">\n    <defs>\n        <path id=\"s6e7a\" d=\"M272.431 220.8v-1.26h-14.193l6.65-6.651L264 212l-8 8 8 8 .889-.889-6.311-6.311z\"/>\n    </defs>\n    <g>\n        <g transform=\"translate(-256 -212)\">\n            <use xlink:href=\"#s6e7a\"/>\n        </g>\n    </g>\n</svg>\n"}],"allowInlineIncludes":true,"rethrow":true});
44505
44506module.exports = function(context) { return template.render(context); }
44507
44508/***/ }),
44509
44510/***/ "./components/slider/media/arrow-right.svg.twig":
44511/*!******************************************************!*\
44512  !*** ./components/slider/media/arrow-right.svg.twig ***!
44513  \******************************************************/
44514/*! no static exports found */
44515/***/ (function(module, exports, __webpack_require__) {
44516
44517var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig,
44518    template = twig({"id":"aa2b0ba6f255f8404308558f36b96a08de1cac5b8a2a7dfded2b75e69bb90c9b1d58347596fd431cd6ec5391e07154ba904f0b582f0803434e793bb48f5c1b23","data":[{"type":"raw","value":"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"17\" height=\"16\"\n     viewBox=\"0 0 17 16\">\n    <defs>\n        <path id=\"dzoza\" d=\"M286 220.8v-1.26h14.194l-6.652-6.651.89-.889 8 8-8 8-.89-.889 6.312-6.311z\"/>\n    </defs>\n    <g>\n        <g transform=\"translate(-286 -212)\">\n            <use xlink:href=\"#dzoza\"/>\n        </g>\n    </g>\n</svg>\n"}],"allowInlineIncludes":true,"rethrow":true});
44519
44520module.exports = function(context) { return template.render(context); }
44521
44522/***/ }),
44523
44524/***/ "./components/slider/slider.twig":
44525/*!***************************************!*\
44526  !*** ./components/slider/slider.twig ***!
44527  \***************************************/
44528/*! no static exports found */
44529/***/ (function(module, exports, __webpack_require__) {
44530
44531__webpack_require__(/*! ./media/arrow-right.svg.twig */ "./components/slider/media/arrow-right.svg.twig");
44532
44533__webpack_require__(/*! ./media/arrow-left.svg.twig */ "./components/slider/media/arrow-left.svg.twig");
44534
44535var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig,
44536    template = twig({"id":"44e4643878a44c1e77a8243a6d2705ad47cf77733af6aef1c362aa4eafff9f24451e4dc861814a89426ae32e4b395d0133e02a61c6557285ac24e79da25bbe88","data":[{"type":"raw","value":"\n<div class=\"b-slider__wrapper\">\n\n</div>\n\n"},{"type":"raw","value":"\n<div class=\"b-slider__counter\">\n    <span class=\"b-slider__counter-active\"></span>\n    <span>/</span>\n    <span class=\"b-slider__counter-all\"></span>\n</div>\n\n"},{"type":"raw","value":"\n<div class=\"b-slider__arrows\">\n    <button class=\"b-slider__arrow slider__arrow-left\">\n        "},{"type":"logic","token":{"type":"Twig.logic.type.include","only":false,"ignoreMissing":false,"stack":[{"type":"Twig.expression.type.string","value":"fe9879fdd68fe9032cd7497262fe10d9b15908a9c22621f13968dfc894cb2f4fc3e09a2b25d1bfcc5236bb87f70baeb5f37344bfed3a34cf0e6bffea533ac22c"}]}},{"type":"raw","value":"    </button>\n    <button class=\"b-slider__arrow slider__arrow-right\">\n        "},{"type":"logic","token":{"type":"Twig.logic.type.include","only":false,"ignoreMissing":false,"stack":[{"type":"Twig.expression.type.string","value":"aa2b0ba6f255f8404308558f36b96a08de1cac5b8a2a7dfded2b75e69bb90c9b1d58347596fd431cd6ec5391e07154ba904f0b582f0803434e793bb48f5c1b23"}]}},{"type":"raw","value":"    </button>\n</div>\n"},{"type":"raw","value":"\n<div class=\"b-slider__dots\" style=\"display: none;\">\n\n</div>\n"}],"allowInlineIncludes":true,"rethrow":true});
44537
44538module.exports = function(context) { return template.render(context); }
44539
44540/***/ }),
44541
44542/***/ "./components/tabs/index.js":
44543/*!**********************************!*\
44544  !*** ./components/tabs/index.js ***!
44545  \**********************************/
44546/*! exports provided: default */
44547/***/ (function(module, __webpack_exports__, __webpack_require__) {
44548
44549"use strict";
44550__webpack_require__.r(__webpack_exports__);
44551/* harmony import */ var common_scripts_mediator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! common/scripts/mediator */ "./common/scripts/mediator.js");
44552function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
44553
44554function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
44555
44556function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
44557
44558/**
44559 * @version 2.0alpha
44560 * @author Kelnik Studios {http://kelnik.ru}
44561 */
44562
44563/**
44564 * Dependencies
44565 */
44566// import template from './template/content.twig';
44567// import Utils from '../../common/scripts/utils';
44568
44569/**
44570 * Variables && constants
44571 */
44572// массив get параметров из урла. Будем сравнивать дата таб атрибуты табов из всех экземпляров класса с данными из
44573// массива, что бы открывать нужные табы при открытии страницы по ссылке
44574// let urlArray = [];
44575
44576/**
44577 * Табы
44578 * @param {Object} element - обератка всего блока
44579 * @constructor
44580 */
44581
44582var Tabs =
44583/*#__PURE__*/
44584function () {
44585  function Tabs() {
44586    _classCallCheck(this, Tabs);
44587
44588    this.mediator = new common_scripts_mediator__WEBPACK_IMPORTED_MODULE_0__["default"](); // нода родителя табов (элементов переключения табов)
44589
44590    this.tabsParent = {}; // массив табов (элементов переключения табов)
44591
44592    this.tabs = []; // нода родителя контента табов
44593
44594    this.contentsParent = {}; // массив элементов с контентов табов
44595
44596    this.contents = []; // записываем данные таба на котором произошло событие клика
44597
44598    this.dataTab = {}; // Класс активного(выбранного) таба
44599
44600    this.active = 'is-active'; // Класс задисабленного таба
44601
44602    this.disabled = 'is-disabled';
44603  }
44604
44605  _createClass(Tabs, [{
44606    key: "init",
44607    value: function init(options) {
44608      this.tabsParent = document.querySelector(options.element) || null; // Проверка на наличие табов
44609
44610      if (!this.tabsParent) {
44611        console.error('Need target element - ' + 'https://kelnik.gitbooks.io/kelnik-documentation/front-end/components/tabs.html');
44612        return;
44613      } // находим все табы и приводим коллекцию нод к массиву. Для работы с forEach в ИЕ.
44614
44615
44616      this.tabs = Array.from(this.tabsParent.querySelectorAll('.b-tabs__item'));
44617      this.contentsParent = document.querySelector(".".concat(this.tabsParent.dataset.content)); // находим все элементы контента и приводим коллекцию нод к массиву. Для работы с forEach в ИЕ.
44618
44619      this.contents = Array.from(this.contentsParent.querySelectorAll('.b-tabs-content__item'));
44620      this.bindEvents(); // this.checkUrlParam();
44621    }
44622    /**
44623     * Вешаем слушатель на табы
44624     */
44625
44626  }, {
44627    key: "bindEvents",
44628    value: function bindEvents() {
44629      var _this = this;
44630
44631      this.tabs.forEach(function (tab) {
44632        tab.addEventListener('click', _this.toggleTab.bind(_this));
44633      });
44634    }
44635    /**
44636     * Переключаем табы
44637     * @param {event} event - передаем событие
44638     */
44639
44640  }, {
44641    key: "toggleTab",
44642    value: function toggleTab(event) {
44643      event.preventDefault();
44644      var tab = event.currentTarget;
44645
44646      if (tab.classList.contains(this.disabled)) {
44647        return;
44648      }
44649
44650      this.setData(tab);
44651      this.changeState(); // this.stateUrl(tab);
44652
44653      this.mediator.publish('tabSwitched');
44654    }
44655    /**
44656     * Получаем значения data атрибутов таба
44657     * @param {node} activeTab - нода таба по которому произошло событие клика
44658     */
44659
44660  }, {
44661    key: "setData",
44662    value: function setData(activeTab) {
44663      this.dataTab = {
44664        tab: activeTab,
44665        id: activeTab.dataset.tab,
44666        url: activeTab.getAttribute('href'),
44667        ajax: activeTab.dataset.ajax
44668      };
44669    }
44670    /**
44671     * Проверяем есть ли в url'e параметры.
44672     */
44673    // checkUrlParam() {
44674    //     if (window.location.search) {
44675    //         this.getUrlParams();
44676    //     }
44677    // }
44678
44679    /**
44680     * Проверяем наличие в href ссылки (жмакнутый таб) наличие строки с адресом.
44681     * проверяется сам факт наличия более одного символа (в пустой ссылке всегда должен быть #)
44682     * @returns {boolean} true or false
44683     */
44684
44685  }, {
44686    key: "isLink",
44687    value: function isLink() {
44688      var arrSlice = {
44689        begin: 0,
44690        end: -1
44691      };
44692      return this.dataTab.url.slice(arrSlice.begin, arrSlice.end);
44693    }
44694    /**
44695     * Проверяем наличие класса is-disabled у жмакнутого таба
44696     * @returns {boolean} false or true
44697     */
44698
44699  }, {
44700    key: "isDisableTab",
44701    value: function isDisableTab() {
44702      return this.dataTab.tab.classList.contains(this.disabled);
44703    }
44704    /**
44705     * Меняем состояние табов
44706     */
44707
44708  }, {
44709    key: "changeState",
44710    value: function changeState() {
44711      var _this2 = this;
44712
44713      // ничего не делаем если таб неактивен
44714      if (this.isDisableTab()) {
44715        return;
44716      } // переходим по ссылке в табе при ее наличии
44717
44718
44719      if (this.isLink()) {
44720        location.href = this.dataTab.url;
44721        return;
44722      } // закружаем контент ajax'ом
44723      // if (this.dataTab.ajax) {
44724      //     this.ajaxLoad();
44725      // }
44726      // меняем состояние табов
44727
44728
44729      this.tabs.forEach(function (element) {
44730        if (element.dataset.tab === _this2.dataTab.id) {
44731          element.classList.add(_this2.active);
44732          return;
44733        }
44734
44735        element.classList.remove(_this2.active);
44736      }); // и показываем нужный контент
44737
44738      this.contents.forEach(function (element) {
44739        if (element.dataset.tabContent === _this2.dataTab.id) {
44740          element.classList.add(_this2.active);
44741
44742          _this2.mediator.publish('changeTabs', element);
44743
44744          return;
44745        }
44746
44747        element.classList.remove(_this2.active);
44748      });
44749    }
44750    /**
44751     * Сравниваем get параметры из Url'a со значениями data-tab атрибута жмакнутого таба
44752     * @param {Object} activeTab - таб на котором произошло событие клик
44753     */
44754    // забыл JSDOC - что такое activeTav? из названия понятно, но с JSDOC лучше
44755    // метод очень большой не понятно, что является результатм работы метода
44756    // по идее раз сравнивает , то должен вернуть true или false
44757    // stateUrl(activeTab) {
44758    //     // const tabId = activeTab.dataset.tab;
44759    //     const tabId = this.dataTab.id;
44760    //     const tabUrl = activeTab.getAttribute('href');
44761    //     const getUrl = window.location.search.slice(1);
44762    //     const getArray = getUrl.split('&');
44763    //     let congruenceTabUrl = true;
44764    //
44765    //     const arrSlice = {
44766    //         begin: 0,
44767    //         end  : -1
44768    //     };
44769    //
44770    //     // проверяем, есть ли url в href
44771    //     if (tabUrl.slice(arrSlice.begin, arrSlice.end)) {
44772    //         return;
44773    //     }
44774    //
44775    //     // проверяем, есть ли get параметр в url'e и если его еще пока нет, передаем туда значение data-tab атрибута
44776    //     // жмакнутого таба
44777    //     if (!getUrl) {
44778    //         urlArray[urlArray.length] = tabId;
44779    //         this.changeUrl();
44780    //
44781    //         return;
44782    //     }
44783    //
44784    //
44785    //     for (let i = 0; i < getArray.length; i++) {
44786    //         if (getArray[i] === tabId) {
44787    //             i = getArray.length;
44788    //
44789    //             return;
44790    //         }
44791    //
44792    //         for (let tabIndex = 0; tabIndex < this.tabs.length; tabIndex++) {
44793    //             if (getArray[i] === this.tabs[tabIndex].dataset.tab) {
44794    //                 urlArray[getArray.indexOf(getArray[i])] = tabId;
44795    //                 tabIndex = this.tabs.length;
44796    //                 i = getArray.length;
44797    //                 this.changeUrl();
44798    //
44799    //                 return;
44800    //             }
44801    //
44802    //             congruenceTabUrl = false;
44803    //         }
44804    //     }
44805    //
44806    //     if (!congruenceTabUrl) {
44807    //         urlArray[urlArray.length] = tabId;
44808    //         this.changeUrl();
44809    //     }
44810    // }
44811
44812    /**
44813     * Формируем строку с get параметрами для смены url'a
44814     */
44815    // changeUrl() {
44816    //     const urlString = urlArray.join('&');
44817    //
44818    //     window.history.replaceState(`?${urlString}`, null, `?${urlString}`);
44819    // }
44820    // /**
44821    //  * Подгружаем ajax
44822    //  */
44823    // ajaxLoad() {
44824    //     const that = this;
44825    //     const ajaxUrl = `/tests/${that.dataTab.ajax}`;
44826    //
44827    //     Utils.send(null, ajaxUrl,
44828    //         {
44829    //             success(req) {
44830    //                 that.addPageContent(req, that.dataTab.tab);
44831    //             },
44832    //             error(err) {
44833    //                 console.error(`ошибка на сервере: ${err}`);
44834    //             }
44835    //         });
44836    // }
44837    //
44838    // /**
44839    //  * Добавляем контент пришедший с сервера на страницу
44840    //  * @param {object} data - ответ от сервера при ajax запросе
44841    //  * @param {node} activeTab - таб по которому произошел клик
44842    //  */
44843    // addPageContent(data, activeTab) {
44844    //     this.contents.forEach((element) => {
44845    //         if (element.dataset.tabContent === activeTab.dataset.tab) {
44846    //             element.innerHTML = template(data);
44847    //             activeTab.removeAttribute('data-ajax');
44848    //         }
44849    //     });
44850    // }
44851
44852    /**
44853     * При создании экземпляра класса, проверяем есть ли у нас параметры в адресной строке.
44854     * Если есть - вытаскиваем их в массив.
44855     */
44856    // getUrlParams() {
44857    //     // берем строку из урла и обрезаем ему первый символ и ппреобразуем в массив
44858    //     const getArray = window.location.search.replace('?', '').split('&');
44859    //
44860    //     if (getArray.length) {
44861    //         // передаем массив для сравнения с data-tab атибутами
44862    //         this.comparisonTabUrl(getArray);
44863    //         urlArray = getArray;
44864    //     }
44865    // }
44866
44867    /**
44868     * Если в get параметрах url'a есть значения соответствующие значениям data-tab атрибутов, то открываем этот таб
44869     * @param {array} getArray - массив get параметров из url'a для сравнения с значениями data-tab атрибутов
44870     */
44871    // comparisonTabUrl(getArray) {
44872    //     // проходим по массиву из значений взятых в урле
44873    //     getArray.forEach((element) => {
44874    //         // проходим по массиву data-tab элементов
44875    //         this.tabs.forEach((tab) => {
44876    //             // ищем совпадение значений data-tab атирубтов со значениями из урла
44877    //             if (tab.dataset.tab === element) {
44878    //                 // вызываем метод смены табов в случае совпадения
44879    //                 this.setData(tab);
44880    //                 this.changeState();
44881    //             }
44882    //         });
44883    //     });
44884    // }
44885
44886  }]);
44887
44888  return Tabs;
44889}();
44890
44891/* harmony default export */ __webpack_exports__["default"] = (Tabs);
44892
44893/***/ }),
44894
44895/***/ "./components/team/index.js":
44896/*!**********************************!*\
44897  !*** ./components/team/index.js ***!
44898  \**********************************/
44899/*! exports provided: default */
44900/***/ (function(module, __webpack_exports__, __webpack_require__) {
44901
44902"use strict";
44903__webpack_require__.r(__webpack_exports__);
44904/* harmony import */ var components_team_popup_twig__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! components/team/popup.twig */ "./components/team/popup.twig");
44905/* harmony import */ var components_team_popup_twig__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(components_team_popup_twig__WEBPACK_IMPORTED_MODULE_0__);
44906/* harmony import */ var common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! common/scripts/utils */ "./common/scripts/utils.js");
44907function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
44908
44909function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
44910
44911function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
44912
44913
44914
44915
44916var teamPopup =
44917/*#__PURE__*/
44918function () {
44919  function teamPopup() {
44920    _classCallCheck(this, teamPopup);
44921
44922    this.tabButtons = Array.from(document.querySelectorAll('.j-team-tab-button'));
44923    this.tabContents = Array.from(document.querySelectorAll('.j-team-tab-content'));
44924    this.tabButtonActive = 'b-team-text__button_is_active';
44925    this.tabContentHide = 'b-team-text__tab_is_hide';
44926  }
44927
44928  _createClass(teamPopup, [{
44929    key: "init",
44930    value: function init(object) {
44931      var _this = this;
44932
44933      this.body = document.body;
44934      var items = object.querySelectorAll('.b-team-slides__modal');
44935      items.forEach(function (item) {
44936        var container = common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__["default"].closest(item, '.b-team-slides__item');
44937        item.addEventListener('click', function () {
44938          _this.setData(container);
44939
44940          _this.insertTemplate();
44941
44942          _this.fixedBody();
44943        });
44944      });
44945
44946      this._bindEvents();
44947    }
44948  }, {
44949    key: "_bindEvents",
44950    value: function _bindEvents() {
44951      var _this2 = this;
44952
44953      this.tabButtons.forEach(function (tabButton) {
44954        tabButton.addEventListener('click', function () {
44955          if (tabButton.classList.contains(_this2.tabButtonActive)) {
44956            tabButton.classList.remove(_this2.tabButtonActive);
44957
44958            _this2._hideTabContents();
44959
44960            return;
44961          }
44962
44963          _this2._removeActiveButton();
44964
44965          tabButton.classList.add(_this2.tabButtonActive);
44966          var idTabContent = tabButton.dataset.tab;
44967          var tabContent = document.getElementById(idTabContent);
44968
44969          _this2._hideTabContents();
44970
44971          tabContent.classList.remove(_this2.tabContentHide);
44972        });
44973      });
44974    }
44975  }, {
44976    key: "_removeActiveButton",
44977    value: function _removeActiveButton() {
44978      var _this3 = this;
44979
44980      this.tabButtons.forEach(function (tabButton) {
44981        tabButton.classList.remove(_this3.tabButtonActive);
44982      });
44983    }
44984  }, {
44985    key: "_hideTabContents",
44986    value: function _hideTabContents() {
44987      var _this4 = this;
44988
44989      this.tabContents.forEach(function (tabContents) {
44990        tabContents.classList.add(_this4.tabContentHide);
44991      });
44992    }
44993  }, {
44994    key: "setData",
44995    value: function setData(element) {
44996      var textElement = element.querySelector('.b-team-slides__legend');
44997      this.data = {
44998        name: element.querySelector('.b-team-slides__ttl').innerHTML,
44999        status: element.querySelector('.b-team-slides__text').innerHTML,
45000        position: element.querySelector('.b-team-slides__text-hidden').innerHTML,
45001        text: textElement ? textElement.innerHTML : '',
45002        image: element.querySelector('.b-team-slides__img').src
45003      };
45004    }
45005  }, {
45006    key: "insertTemplate",
45007    value: function insertTemplate() {
45008      document.body.insertAdjacentHTML('afterbegin', components_team_popup_twig__WEBPACK_IMPORTED_MODULE_0___default()(this.data));
45009      this.initCloseBtn();
45010    }
45011  }, {
45012    key: "initCloseBtn",
45013    value: function initCloseBtn() {
45014      var _this5 = this;
45015
45016      var close = document.querySelector('.j-popup-close');
45017      close.addEventListener('click', function () {
45018        _this5.destroyPopup();
45019
45020        _this5.fixedBody();
45021      });
45022    }
45023  }, {
45024    key: "destroyPopup",
45025    value: function destroyPopup() {
45026      var popup = document.querySelector('.b-team-popup');
45027      common_scripts_utils__WEBPACK_IMPORTED_MODULE_1__["default"].removeElement(popup);
45028    }
45029    /**
45030     * Добавляет body position:fixed, дабы избежать прокрутки страницы при открытом попапе.
45031     */
45032
45033  }, {
45034    key: "fixedBody",
45035    value: function fixedBody() {
45036      this.body.classList.toggle('body-fixed');
45037    }
45038  }]);
45039
45040  return teamPopup;
45041}();
45042
45043/* harmony default export */ __webpack_exports__["default"] = (teamPopup);
45044
45045/***/ }),
45046
45047/***/ "./components/team/popup.twig":
45048/*!************************************!*\
45049  !*** ./components/team/popup.twig ***!
45050  \************************************/
45051/*! no static exports found */
45052/***/ (function(module, exports, __webpack_require__) {
45053
45054var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig,
45055    template = twig({"id":"c01309fea05918e066c9f5666e5c26479104b94f5364c7025d3cfe5c7a6fade0a74f41906224d8dbc782d67641d7cee75930750201f6007ed5e45c71de4045bf","data":[{"type":"raw","value":"<div class=\"b-team-popup\">\n    <div class=\"b-team-popup__inline-wrapper\">\n        <button class=\"b-team-popup__close j-popup-close\" aria-label=\"Закрыть всплывающее окно\">\n            <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"26\" height=\"26\" viewBox=\"0 0 26 26\"><defs><path id=\"73hta\" d=\"M1051.444 73L1050 71.556 1061.556 60 1050 48.444l1.444-1.444L1063 58.556 1074.556 47l1.444 1.444L1064.444 60 1076 71.556 1074.556 73 1063 61.444z\"/></defs><g><g transform=\"translate(-1050 -47)\"><use fill=\"#fff\" xlink:href=\"#73hta\"/></g></g></svg>\n        </button>\n\n        <div class=\"b-team-popup__header\">\n            <div class=\"b-team-popup__name\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"name","match":["name"]}]},{"type":"raw","value":"</div>\n            <div class=\"b-team-popup__status\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"status","match":["status"]}]},{"type":"raw","value":"</div>\n            <div class=\"b-team-popup__position\">"},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"position","match":["position"]}]},{"type":"raw","value":"</div>\n            <div class=\"b-team-popup__image-wrap\">\n                <img src=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"image","match":["image"]}]},{"type":"raw","value":"\" class=\"b-team-popup__image\" alt=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"name","match":["name"]}]},{"type":"raw","value":"\">\n            </div>\n        </div>\n\n        "},{"type":"logic","token":{"type":"Twig.logic.type.if","stack":[{"type":"Twig.expression.type.variable","value":"text","match":["text"]}],"output":[{"type":"raw","value":"        <div class=\"b-team-popup__body\">\n            "},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"text","match":["text"]}]},{"type":"raw","value":"\n        </div>\n        "}]}},{"type":"raw","value":"    </div>\n</div>\n"}],"allowInlineIncludes":true,"rethrow":true});
45056
45057module.exports = function(context) { return template.render(context); }
45058
45059/***/ }),
45060
45061/***/ "./components/yandex-map/index.js":
45062/*!****************************************!*\
45063  !*** ./components/yandex-map/index.js ***!
45064  \****************************************/
45065/*! exports provided: default */
45066/***/ (function(module, __webpack_exports__, __webpack_require__) {
45067
45068"use strict";
45069__webpack_require__.r(__webpack_exports__);
45070/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var _templates_markers_main_twig__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./templates/markers/main.twig */ "./components/yandex-map/templates/markers/main.twig");
45071/* harmony import */ var _templates_markers_main_twig__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_templates_markers_main_twig__WEBPACK_IMPORTED_MODULE_0__);
45072/* harmony import */ var _templates_markers_secondary_twig__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./templates/markers/secondary.twig */ "./components/yandex-map/templates/markers/secondary.twig");
45073/* harmony import */ var _templates_markers_secondary_twig__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_templates_markers_secondary_twig__WEBPACK_IMPORTED_MODULE_1__);
45074/* harmony import */ var _templates_markers_text_twig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./templates/markers/text.twig */ "./components/yandex-map/templates/markers/text.twig");
45075/* harmony import */ var _templates_markers_text_twig__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_templates_markers_text_twig__WEBPACK_IMPORTED_MODULE_2__);
45076/* harmony import */ var _templates_ballons_link_twig__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./templates/ballons/link.twig */ "./components/yandex-map/templates/ballons/link.twig");
45077/* harmony import */ var _templates_ballons_link_twig__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_templates_ballons_link_twig__WEBPACK_IMPORTED_MODULE_3__);
45078/* harmony import */ var _templates_legend_twig__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./templates/legend.twig */ "./components/yandex-map/templates/legend.twig");
45079/* harmony import */ var _templates_legend_twig__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_templates_legend_twig__WEBPACK_IMPORTED_MODULE_4__);
45080/* harmony import */ var _templates_controls_twig__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./templates/control
45080s.twig */ "./components/yandex-map/templates/controls.twig");
45081/* harmony import */ var _templates_controls_twig__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_templates_controls_twig__WEBPACK_IMPORTED_MODULE_5__);
45082/* harmony import */ var common_scripts_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! common/scripts/utils */ "./common/scripts/utils.js");
45083/* harmony import */ var common_scripts_mediator__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! common/scripts/mediator */ "./common/scripts/mediator.js");
45084function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
45085
45086function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
45087
45088function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
45089
45090function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
45091
45092function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
45093
45094function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
45095
45096function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
45097
45098/* eslint-disable */
45099
45100/**
45101 * @version 1.0
45102 * @author Kelnik Studios {http://kelnik.ru}
45103 * Взято с https://gitlab.kelnik.pro/samolet/himki/blob/dev/src/scripts/app/yandex-maps.js
45104 */
45105
45106
45107
45108
45109
45110
45111
45112
45113var mediator = new common_scripts_mediator__WEBPACK_IMPORTED_MODULE_7__["default"]();
45114
45115var YandexMap =
45116/*#__PURE__*/
45117function () {
45118  function YandexMap(ymaps) {
45119    _classCallCheck(this, YandexMap);
45120
45121    /**
45122     * Экземпляр загруженных яндекс карт.
45123     */
45124    this.ymaps = ymaps;
45125    /**
45126     * Все настроки карты
45127     * @type {Object}
45128     */
45129
45130    this.settings = {};
45131    /**
45132     * Яндексовый объект карты
45133     * @type {null}
45134     */
45135
45136    this.map = {};
45137    /**
45138     * URL по которому будет выполнен ajax запрос за данными
45139     */
45140
45141    this.url = '';
45142    /**
45143     * Класса DOM-элемента в который будет вставлена карта
45144     */
45145
45146    this.base = '.b-yandex-map__base';
45147  }
45148  /**
45149   * @param {Object} outerOptions - настройки из внешнего файла
45150   * @param {Function} initYandexMap - функция обратного вызова, срабатывает, когда карта уже загрузилась
45151   * и показывается
45152   */
45153
45154
45155  _createClass(YandexMap, [{
45156    key: "init",
45157    value: function init(outerOptions) {
45158      var _this = this;
45159
45160      this.mapWrapper = outerOptions.wrapper;
45161      this.content = this.mapWrapper.querySelector(this.base);
45162      this.id = this.content.id;
45163      this.url = this.mapWrapper.dataset.ajax;
45164      this.json = this.mapWrapper.dataset.json;
45165
45166      if (this.json) {
45167        this.json = JSON.parse(atob(this.json));
45168      }
45169
45170      this.completeSettings(outerOptions, function () {
45171        _this.initYandexMap(function () {
45172          _this.initControls();
45173
45174          _this.initScrollZoom();
45175
45176          _this.initMarkers();
45177
45178          _this.initTabs();
45179
45180          _this.initCircles();
45181
45182          _this.disableMobileDrag();
45183
45184          _this.initLegend();
45185
45186          _this.initGPS();
45187        });
45188      });
45189    }
45190    /**
45191     * Непосредственное создание экземпляра Яндекс Карт
45192     * @param initMapCallback - коллбэк остальных методов модуля. Сработают только тогда, когда карта будет полностью создана
45193     */
45194
45195  }, {
45196    key: "initYandexMap",
45197    value: function initYandexMap() {
45198      var initMapCallback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
45199      this.map = new this.ymaps.Map(this.id, this.settings);
45200      initMapCallback();
45201    }
45202  }, {
45203    key: "initLegend",
45204    value: function initLegend() {
45205      if (!this.settings.legend) {
45206        return;
45207      }
45208
45209      var CustomControlClass = function CustomControlClass(options) {
45210        CustomControlClass.superclass.constructor.call(this, options);
45211        this._$content = null;
45212        this._geocoderDeferred = null;
45213      }; // наследуем от collection.Item
45214
45215
45216      ymaps.util.augment(CustomControlClass, ymaps.collection.Item, {
45217        onAddToMap: function onAddToMap(map) {
45218          CustomControlClass.superclass.onAddToMap.call(this, map);
45219          this._lastCenter = null;
45220          this.getParent().getChildElement(this).then(this._onGetChildElement, this);
45221        },
45222        onRemoveFromMap: function onRemoveFromMap(oldMap) {
45223          this._lastCenter = null;
45224
45225          if (this._$content) {
45226            this._$content.remove();
45227
45228            this._mapEventGroup.removeAll();
45229          }
45230
45231          CustomControlClass.superclass.onRemoveFromMap.call(this, oldMap);
45232        },
45233        _onGetChildElement: function _onGetChildElement(parentDomContainer) {
45234          // Создаем HTML-элемент с текстом.
45235          this._$content = $(_templates_legend_twig__WEBPACK_IMPORTED_MODULE_4___default()()).appendTo(parentDomContainer);
45236        }
45237      });
45238      var customControl = new CustomControlClass();
45239      this.map.controls.add(customControl, {
45240        float: 'none',
45241        position: {
45242          top: 0,
45243          left: 0
45244        }
45245      });
45246    }
45247  }, {
45248    key: "initGPS",
45249    value: function initGPS() {
45250      if (!this.settings.gps) {
45251        return;
45252      } // Создаем собственный класс.
45253
45254
45255      var GPSClass = function GPSClass(options) {
45256        GPSClass.superclass.constructor.call(this, options);
45257        this._$content = null;
45258        this._geocoderDeferred = null;
45259      }; // И наследуем его от collection.Item.
45260
45261
45262      ymaps.util.augment(GPSClass, ymaps.collection.Item, {
45263        onAddToMap: function onAddToMap(map) {
45264          GPSClass.superclass.onAddToMap.call(this, map);
45265          this._lastCenter = null;
45266          this.getParent().getChildElement(this).then(this._onGetChildElement, this);
45267        },
45268        onRemoveFromMap: function onRemoveFromMap(oldMap) {
45269          this._lastCenter = null;
45270
45271          if (this._$content) {
45272            this._$content.remove();
45273
45274            this._mapEventGroup.removeAll();
45275          }
45276
45277          GPSClass.superclass.onRemoveFromMap.call(this, oldMap);
45278        },
45279        _onGetChildElement: function _onGetChildElement(parentDomContainer) {
45280          // Создаем HTML-элемент с текстом.
45281          this._$content = $('<button class="b-yandex-map__gps-btn j-get-geolocation"></button>').appendTo(parentDomContainer); // this._mapEventGroup = this.getMap().events.group();
45282        },
45283        _createRequest: function _createRequest() {
45284          var lastCenter = this._lastCenter = this.getMap().getCenter().join(','); // Запрашиваем информацию о месте по координатам центра карты.
45285
45286          ymaps.geocode(this._lastCenter, {
45287            // Указываем, что ответ должен быть в формате JSON.
45288            json: true,
45289            // Устанавливаем лимит на кол-во записей в ответе.
45290            results: 1
45291          }).then(function (result) {
45292            // Будем обрабатывать только ответ от последнего запроса.
45293            if (lastCenter == this._lastCenter) {
45294              this._onServerResponse(result);
45295            }
45296          }, this);
45297        },
45298        _onServerResponse: function _onServerResponse(result) {
45299          // Данные от сервера были получены и теперь их необходимо отобразить.
45300          // Описание ответа в формате JSON.
45301          var members = result.GeoObjectCollection.featureMember,
45302              geoObjectData = members && members.length ? members[0].GeoObject : null;
45303
45304          if (geoObjectData) {
45305            this._$content.text(geoObjectData.metaDataProperty.GeocoderMetaData.text);
45306          }
45307        }
45308      });
45309      var gps = new GPSClass();
45310      this.map.controls.add(gps, {
45311        float: 'none',
45312        position: {
45313          top: this.settings.height / 2 + 16,
45314          right: 15
45315        }
45316      });
45317    }
45318  }, {
45319    key: "getGeoLocation",
45320    value: function getGeoLocation() {
45321      var geolocation = ymaps.geolocation; // Сравним положение, вычисленное по ip пользователя и
45322      // положение, вычисленное средствами браузера.
45323
45324      geolocation.get({
45325        provider: 'yandex',
45326        mapStateAutoApply: true
45327      }).then(function (result) {
45328        // Красным цветом пометим положение, вычисленное через ip.
45329        result.geoObjects.options.set('preset', 'islands#redCircleIcon');
45330        result.geoObjects.get(0).properties.set({
45331          balloonContentBody: 'Мое местоположение'
45332        });
45333        myMap.geoObjects.add(result.geoObjects);
45334      });
45335      geolocation.get({
45336        provider: 'browser',
45337        mapStateAutoApply: true
45338      }).then(function (result) {
45339        // Синим цветом пометим положение, полученное через браузер.
45340        // Если браузер не поддерживает эту функциональность, метка не будет добавлена на карту.
45341        result.geoObjects.options.set('preset', 'islands#blueCircleIcon');
45342        myMap.geoObjects.add(result.geoObjects);
45343      });
45344    }
45345    /**
45346     * Склеивает все настройки карты в одну перменную
45347     */
45348
45349  }, {
45350    key: "completeSettings",
45351    value: function completeSettings(outerOptions) {
45352      var initCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
45353
45354      if (this.url) {
45355        this.connectSettings(this.setDefaultSettings());
45356        this.connectSettings(this.getScriptSettings(outerOptions));
45357        this.getServerSettings(this.url, initCallback);
45358        return;
45359      }
45360
45361      this.connectSettings(this.setDefaultSettings());
45362      this.connectSettings(this.getScriptSettings(outerOptions));
45363      this.connectSettings(this.json);
45364      initCallback();
45365    }
45366    /**
45367     * Получает настройки от сервера
45368     */
45369
45370  }, {
45371    key: "getServerSettings",
45372    value: function getServerSettings(url) {
45373      var _this2 = this;
45374
45375      var serverSuccess = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
45376      common_scripts_utils__WEBPACK_IMPORTED_MODULE_6__["default"].send('', url, {
45377        success: function success(response) {
45378          _this2.connectSettings(response.data);
45379
45380          serverSuccess();
45381        },
45382        error: function error(_error) {
45383          console.error("\u041F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043E\u0448\u0438\u0431\u043A\u0430: ".concat(_error));
45384        }
45385      }, 'GET');
45386    }
45387    /**
45388     * Склеивает конкртеную настройку в общую настройку всей карты
45389     * @param {Object} outerSettings - объект настроек карты
45390     */
45391
45392  }, {
45393    key: "connectSettings",
45394    value: function connectSettings(outerSettings) {
45395      if (typeof outerSettings === "object") {
45396        Object.assign(this.settings, outerSettings);
45397      }
45398    }
45399    /**
45400     * Устаналивает настройки по умолчанию
45401     * @return {{center: {lat, lng}, zoom: number, minZoom: number, maxZoom: number, zoomStep: number}} -
45402     * объект настроек карты
45403     */
45404
45405  }, {
45406    key: "setDefaultSettings",
45407    value: function setDefaultSettings() {
45408      var latCenter = 59.939014;
45409      var lngCenter = 30.315545; // высчитываем высоту обертки карты, а равно высоту карты, для позиционирования элементов управления
45410
45411      var heightMap = this.content.offsetHeight;
45412      return {
45413        center: [latCenter, lngCenter],
45414        mapTypeControl: false,
45415        zoom: 12,
45416        minZoom: 10,
45417        maxZoom: 18,
45418        zoomStep: 1,
45419        controls: [],
45420        zoomControl: true,
45421        customZoomControl: false,
45422        fullScreenControl: true,
45423        customFullScreenControl: false,
45424        height: heightMap,
45425        zoomScroll: false
45426      };
45427    }
45428    /**
45429     * Устаналивает пользовательские настройки
45430     * @return {object} - объект настроек карты из скрипта со страницы
45431     */
45432
45433  }, {
45434    key: "getScriptSettings",
45435    value: function getScriptSettings(outerOptions) {
45436      return outerOptions;
45437    }
45438    /**
45439     * Добавляем элементы управления на карту
45440     */
45441
45442  }, {
45443    key: "initControls",
45444    value: function initControls() {
45445      var _this3 = this;
45446
45447      if (!this.settings.height) {
45448        mediator.subscribe('tabSwitched', function () {
45449          _this3.settings.height = _this3.mapWrapper.offsetHeight;
45450
45451          _this3.addZoomControl();
45452        });
45453      } else {
45454        this.addZoomControl();
45455      }
45456
45457      this.addFullScreenControl();
45458    }
45459    /**
45460    * Добавляет элемент управления масштабом карты
45461    */
45462
45463  }, {
45464    key: "addZoomControl",
45465    value: function addZoomControl() {
45466      // Проверяем отключен ли показ элементов управления вообще
45467      // Если да, то ничего не показываем
45468      if (!this.settings.zoomControl || this.addZoomControl.flag) {
45469        return;
45470      } // Проверяем нужно ли показывать кастомный элемент управление
45471      // Если нет то показываем стандартные
45472
45473
45474      if (!this.settings.customZoomControl) {
45475        this.map.controls.add("zoomControl");
45476        return;
45477      } // Показываем кастомные элементы управление
45478
45479
45480      var zoomControl = new ymaps.control.ZoomControl({
45481        options: {
45482          layout: this.createLayoutZoomControl()
45483        }
45484      });
45485      this.map.controls.add(zoomControl, {
45486        float: 'none',
45487        position: {
45488          top: this.mapWrapper.offsetHeight / 2 - 70,
45489          right: '15px'
45490        }
45491      });
45492      this.addZoomControl.flag = true;
45493    }
45494  }, {
45495    key: "initScrollZoom",
45496    value: function initScrollZoom() {
45497      var scrollZoom = this.settings.zoomScroll;
45498
45499      switch (scrollZoom) {
45500        case true:
45501          this.map.behaviors.enable('scrollZoom');
45502          break;
45503
45504        case false:
45505          this.map.behaviors.disable('scrollZoom');
45506      }
45507    }
45508    /**
45509     * Создаем дизайнерский элемент управления картой
45510     * @return {object} - объект кастомного макета кнопок зуммирования карты
45511     */
45512
45513  }, {
45514    key: "createLayoutZoomControl",
45515    value: function createLayoutZoomControl() {
45516      // если на странице более одной карты, то id кнопок зуммирования должны отличаться
45517      // иначе зум будет срабатывать одновременно на всех картах
45518      // mapId передаем в шаблонную строку для создания уникальных id кнопок
45519      var mapId = this.id; // Создадим пользовательский макет ползунка масштаба.
45520
45521      var zoomLayout = ymaps.templateLayoutFactory.createClass(_templates_controls_twig__WEBPACK_IMPORTED_MODULE_5___default()({
45522        id: mapId
45523      }), {
45524        // Переопределяем методы макета, чтобы выполнять дополнительные действия
45525        // при построении и очистке макета.
45526        build: function build() {
45527          // Вызываем родительский метод build.
45528          zoomLayout.superclass.build.call(this); // Привязываем функции-обработчики к контексту и сохраняем ссылки
45529          // на них, чтобы потом отписаться от событий.
45530
45531          this.zoomInCallback = ymaps.util.bind(this.zoomIn, this);
45532          this.zoomOutCallback = ymaps.util.bind(this.zoomOut, this); // Начинаем слушать клики на кнопках макета.
45533
45534          $("#".concat(mapId, "-in")).bind('click', this.zoomInCallback);
45535          $("#".concat(mapId, "-out")).bind('click', this.zoomOutCallback);
45536        },
45537        clear: function clear() {
45538          // Снимаем обработчики кликов.
45539          $("#".concat(mapId, "-in")).unbind('click', this.zoomInCallback);
45540          $("#".concat(mapId, "-out")).unbind('click', this.zoomOutCallback); // Вызываем родительский метод clear.
45541
45542          zoomLayout.superclass.clear.call(this);
45543        },
45544        zoomIn: function zoomIn() {
45545          var map = this.getData().control.getMap();
45546          map.setZoom(map.getZoom() + 1, {
45547            checkZoomRange: true
45548          });
45549        },
45550        zoomOut: function zoomOut() {
45551          var map = this.getData().control.getMap();
45552          map.setZoom(map.getZoom() - 1, {
45553            checkZoomRange: true
45554          });
45555        }
45556      });
45557      return zoomLayout;
45558    }
45559    /**
45560     * Добавляет кнопку открытия карты на полный экран
45561     */
45562
45563  }, {
45564    key: "addFullScreenControl",
45565    value: function addFullScreenControl() {
45566      if (!this.settings.fullScreenControl) {
45567        return;
45568      }
45569
45570      if (!this.settings.customFullScreenControl) {
45571        var takeOptions = {};
45572
45573        if (this.settings.fullScreenControlOptions) {
45574          takeOptions = this.settings.fullScreenControlOptions;
45575        }
45576
45577        var fullscreenControl = new ymaps.control.FullscreenControl({
45578          options: takeOptions
45579        });
45580        this.map.controls.add(fullscreenControl);
45581        return;
45582      } //тут вызываем метод создающий кастомный контрол
45583
45584    }
45585    /**
45586     * Показываем маркеры объектов инфраструктуры на карте
45587     */
45588
45589  }, {
45590    key: "initMarkers",
45591    value: function initMarkers() {
45592      var _this4 = this;
45593
45594      var markers = this.settings.markers;
45595
45596      if (typeof markers !== "object") {
45597        return;
45598      }
45599
45600      if (this.settings.htmlMarkers) {
45601        this.initHtmlMarkers();
45602      }
45603
45604      markers.forEach(function (element) {
45605        // проверяем есть ли свойство offset у маркера, если нет
45606        // создаем массив значений смещения маркера на половину своей ширины и высоты
45607        // для того, что бы координата маркера и центр иконки маркера были совмещены
45608        var markerOffset = element.offset ? element.offset : element.size.map(function (size) {
45609          return -(size / 2);
45610        }); // проверяем является ли маркер маркером ЖК.
45611
45612        var iconBalloon = "";
45613        var objectType = "";
45614        var balloonLogo = element.logo || '';
45615        var balloonLink = element.link || '';
45616        var complex = "complex";
45617
45618        if (element.type === 0) {
45619          iconBalloon = element.iconBalloon;
45620          objectType = iconBalloon ? complex : false;
45621        } else {
45622          iconBalloon = element.iconBalloon ? element.iconBalloon : element.icon;
45623          objectType = element.objectType;
45624        } // если в объекте маркера нет ни текста ни заголовка, то баллун не показываем
45625
45626
45627        if (!element.title && !element.text) {
45628          var _marker = new ymaps.Placemark(element.coords, {
45629            type: element.type
45630          }, {
45631            iconLayout: 'default#image',
45632            iconImageHref: element.icon,
45633            iconImageSize: element.size,
45634            iconImageOffset: markerOffset
45635          });
45636
45637          _this4.map.geoObjects.add(_marker);
45638
45639          _this4.closeBallonOnClickMap();
45640
45641          return;
45642        } // выводим класс модификатор для разметки баллуна маркера ЖК, вне зависимости - есть в объекте маркера
45643        // objectType или нет
45644
45645
45646        var marker = new ymaps.Placemark(element.coords, {
45647          type: element.type,
45648          balloonIcon: objectType !== undefined ? element.image : iconBalloon,
45649          balloonHeader: element.title,
45650          balloonContent: element.text,
45651          balloonLogo: balloonLogo,
45652          hintContent: element.title
45653        }, {
45654          balloonShadow: false,
45655          balloonLayout: _this4.createBalloonLayout(objectType),
45656          balloonContentLayout: _this4.createBalloonContentLayout(iconBalloon, balloonLogo, balloonLink),
45657          balloonPanelMaxMapArea: 0,
45658          // hintLayout            : this.createBalloonLayout(objectType),
45659          // hintContentLayout     : this.createBalloonContentLayout(iconBalloon),
45660          // Не скрываем иконку при открытом балуне.
45661          hideIconOnBalloonOpen: false,
45662          iconLayout: 'default#image',
45663          iconImageHref: element.icon,
45664          iconImageSize: element.size,
45665          iconImageOffset: markerOffset
45666        });
45667
45668        _this4.map.geoObjects.add(marker);
45669      });
45670    }
45671    /**
45672     * Показываем html маркеры объектов инфраструктуры на карте
45673     */
45674
45675  }, {
45676    key: "initHtmlMarkers",
45677    value: function initHtmlMarkers() {
45678      var _this5 = this;
45679
45680      var htmlMarkers = this.settings.htmlMarkers;
45681      var template = null;
45682      htmlMarkers.forEach(function (element) {
45683        switch (element.layout) {
45684          case 'main':
45685            template = _templates_markers_main_twig__WEBPACK_IMPORTED_MODULE_0___default.a;
45686            break;
45687
45688          case 'secondary':
45689            template = _templates_markers_secondary_twig__WEBPACK_IMPORTED_MODULE_1___default.a;
45690            break;
45691
45692          case 'text':
45693            template = _templates_markers_text_twig__WEBPACK_IMPORTED_MODULE_2___default.a;
45694            break;
45695
45696          default:
45697            template = _templates_markers_main_twig__WEBPACK_IMPORTED_MODULE_0___default.a;
45698        }
45699
45700        var properties = element; //Как-то по другому передаватать настройки
45701
45702        var CustomLayoutClass = ymaps.templateLayoutFactory.createClass(template(properties));
45703        var placemark = new ymaps.Placemark(element.coords, {}, {
45704          iconLayout: CustomLayoutClass
45705        });
45706
45707        _this5.map.geoObjects.add(placemark);
45708      });
45709    }
45710    /**
45711     * Навешивает обработчки события клик по карте и геобъектам для закрытия бал
45711унов.
45712     */
45713
45714  }, {
45715    key: "closeBallonOnClickMap",
45716    value: function closeBallonOnClickMap() {
45717      var _this6 = this;
45718
45719      this.map.geoObjects.events.add('click', function () {
45720        _this6.map.balloon.close();
45721      });
45722      this.map.events.add('click', function () {
45723        _this6.map.balloon.close();
45724      });
45725    }
45726    /**
45727     * @param {string} iconBalloon - строка: значение свойства iconBalloon объекта маркера
45728     * @returns {Object} - объект макета контента балуна
45729     */
45730
45731  }, {
45732    key: "createBalloonContentLayout",
45733    value: function createBalloonContentLayout(iconBalloon, balloonLogo, balloonLink) {
45734      var iconHtml = "";
45735      var logoHtml = "";
45736      var linkHtml = "";
45737
45738      if (iconBalloon) {
45739        iconHtml = "<img class=\"b-yandex-map__balloon-icon\" src=\"$[properties.balloonIcon]\" alt=\"icon map\">";
45740      }
45741
45742      if (balloonLogo) {
45743        logoHtml = "<img class=\"b-yandex-map__balloon-logo\" src=\"$[properties.balloonLogo]\">";
45744      }
45745
45746      if (balloonLink) {
45747        linkHtml = "<a href=\"".concat(balloonLink, "\" class=\"b-yandex-map__balloon-link\">").concat(_templates_ballons_link_twig__WEBPACK_IMPORTED_MODULE_3___default()(), " \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435</a>");
45748      }
45749
45750      var html = "\n            <div class=\"b-yandex-map__balloon-img-wrap\">\n                ".concat(iconHtml, "\n                ").concat(logoHtml, "\n            </div>\n            <div class=\"b-yandex-map__balloon-title\">$[properties.balloonHeader]</div>\n            <div class=\"b-yandex-map__balloon-content\">$[properties.balloonContent]</div>\n            ").concat(linkHtml, "\n            ");
45751      var balloonContentLayout = ymaps.templateLayoutFactory.createClass(html);
45752      return balloonContentLayout;
45753    }
45754    /**
45755     *
45756     * @param {string} classModify - строка: значение свойства objectType объекта маркера
45757     * @returns {object} - объект макета баллуна
45758     */
45759
45760  }, {
45761    key: "createBalloonLayout",
45762    value: function createBalloonLayout(classModify) {
45763      var balloonClass = "b-yandex-map__balloon";
45764      var balloomClassModify = classModify ? "".concat(balloonClass, "_theme_").concat(classModify) : "";
45765      var balloonClose = "b-map-balloon__close";
45766      var balloonArrow = "b-map-balloon__arrow";
45767      var balloonContentWrap = "b-map-balloon__content-wrap";
45768      var classTab = ".b-map-tabs__item";
45769
45770      var tabItems = _toConsumableArray(this.mapWrapper.querySelectorAll(classTab));
45771
45772      var customBalloon = document.querySelector('.b-yandex-map__info'); // Создание макета балуна
45773
45774      var balloonLayout = ymaps.templateLayoutFactory.createClass("<div class=\"".concat(balloonClass, " ").concat(balloomClassModify, "\">\n                <div class=\"").concat(balloonClose, "\"></div>\n                <div class=\"").concat(balloonArrow, "\"></div>\n                <div class=\"").concat(balloonContentWrap, "\">\n                    $[[options.contentLayout]]\n                </div>\n            </div>"), {
45775        /**
45776         * Строит экземпляр макета на основе шаблона и добавляет его в родительский HTML-элемент.
45777         * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/layout.templateBased.Base.xml#build
45778         * @function
45779         * @name build
45780         */
45781        build: function build() {
45782          var _this7 = this;
45783
45784          this.constructor.superclass.build.call(this);
45785          this._$element = $(".".concat(balloonClass), this.getParentElement());
45786          this.applyElementOffset();
45787
45788          this._$element.find(".".concat(balloonClose)).on('click', $.proxy(this.onCloseClick, this));
45789
45790          tabItems.forEach(function (tab) {
45791            tab.addEventListener('click', $.proxy(_this7.onCloseClick, _this7));
45792          });
45793          customBalloon.innerHTML = this._$element[0].innerHTML;
45794          this.closeCustomBalloon();
45795        },
45796        closeCustomBalloon: function closeCustomBalloon() {
45797          var closeBtn = customBalloon.querySelector('.b-map-balloon__close');
45798          closeBtn.addEventListener('click', function () {
45799            closeBtn.parentElement.innerHTML = '';
45800          });
45801        },
45802
45803        /**
45804         * Удаляет содержимое макета из DOM.
45805         * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/layout.templateBased.Base.xml#clear
45806         * @function
45807         * @name clear
45808         */
45809        clear: function clear() {
45810          this._$element.find(".".concat(balloonClose)).off('click');
45811
45812          this.constructor.superclass.clear.call(this);
45813        },
45814
45815        /**
45816         * Метод будет вызван системой шаблонов АПИ при изменении размеров вложенного макета.
45817         * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/IBalloonLayout.xml#event-userclose
45818         * @function
45819         * @name onSublayoutSizeChange
45820         */
45821        onSublayoutSizeChange: function onSublayoutSizeChange() {
45822          balloonLayout.superclass.onSublayoutSizeChange.apply(this, arguments);
45823
45824          if (!this._isElement(this._$element)) {
45825            return;
45826          }
45827
45828          this.applyElementOffset();
45829          this.events.fire('shapechange');
45830        },
45831
45832        /**
45833         * Сдвигаем балун, чтобы "хвостик" указ
45833ывал на точку привязки.
45834         * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/IBalloonLayout.xml#event-userclose
45835         * @function
45836         * @name applyElementOffset
45837         */
45838        applyElementOffset: function applyElementOffset() {
45839          this._$element.css({
45840            /*left: -(this._$element[0].offsetWidth / 2),
45841            top : -(this._$element[0].offsetHeight +
45842                this._$element.find(`.${balloonArrow}`)[0].offsetHeight * 2)*/
45843            visibility: 'hidden'
45844          });
45845        },
45846
45847        /**
45848         * Закрывает балун при клике на крестик, кидая событие "userclose" на макете.
45849         * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/IBalloonLayout.xml#event-userclose
45850         * @function
45851         * @param {event} event - событие
45852         * @name onCloseClick
45853         */
45854        onCloseClick: function onCloseClick(event) {
45855          event.preventDefault();
45856          this.events.fire('userclose');
45857        },
45858
45859        /**
45860         * Используется для автопозиционирования (balloonAutoPan).
45861         * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/ILayout.xml#getClientBounds
45862         * @function
45863         * @returns {object} - Координаты левого верхнего и правого нижнего углов шаблона относительно
45864         * точки привязки.
45865         * @name getShape
45866         */
45867        getShape: function getShape() {
45868          if (!this._isElement(this._$element)) {
45869            return balloonLayout.superclass.getShape.call(this);
45870          }
45871
45872          var position = this._$element.position();
45873
45874          return new ymaps.shape.Rectangle(new ymaps.geometry.pixel.Rectangle([[position.left, position.top], [position.left + this._$element[0].offsetWidth, position.top + this._$element[0].offsetHeight + this._$element.find(".".concat(balloonArrow))[0].offsetHeight]]));
45875        },
45876
45877        /**
45878         * Проверяем наличие элемента (в ИЕ и Опере его еще может не быть).
45879         * @function
45880         * @private
45881         * @name _isElement
45882         * @param {jQuery} [element] Элемент.
45883         * @returns {Boolean} Флаг наличия.
45884         */
45885        _isElement: function _isElement(element) {
45886          return element && element[0] && element.find(".".concat(balloonArrow))[0];
45887        }
45888      });
45889      return balloonLayout;
45890    }
45891    /**
45892     * Инициализируем табы
45893     */
45894
45895  }, {
45896    key: "initTabs",
45897    value: function initTabs() {
45898      var _this8 = this;
45899
45900      var classTab = ".b-yandex-map__tab-item";
45901      var tabItems = this.mapWrapper.querySelectorAll(classTab); // Проверяем наличие табов
45902
45903      if (!tabItems.length) {
45904        return;
45905      }
45906
45907      var tabsArray = _toConsumableArray(tabItems);
45908
45909      tabsArray.forEach(function (tab) {
45910        tab.addEventListener("click", function (event) {
45911          event.preventDefault();
45912
45913          _this8.toggleTabs(tab);
45914
45915          _this8.toggleMarkers(tab);
45916        });
45917      });
45918    }
45919    /**
45920     * Показываем/скрываем маркеры на карте
45921     * @param {node} tab - нода таба по которому произошол клик
45922     */
45923
45924  }, {
45925    key: "toggleMarkers",
45926    value: function toggleMarkers(tab) {
45927      var classLink = ".b-yandex-map__tab-link";
45928      var type = parseInt(tab.querySelector(classLink).dataset.type);
45929      this.map.geoObjects.each(function (geoObject) {
45930        var currentType = parseInt(geoObject.properties.get('type'));
45931
45932        if (currentType) {
45933          if (type === 0) {
45934            geoObject.options.set('visible', true);
45935          } else if (currentType === 0) {
45936            geoObject.options.set('visible', true);
45937          } else if (currentType !== type) {
45938            geoObject.options.set('visible', false);
45939          } else {
45940            geoObject.options.set('visible', true);
45941          }
45942        }
45943      });
45944    }
45945    /**
45946     * Переключаем табы
45947     * @param {node} tab - нода таба по которому произошол клик
45948     */
45949
45950  }, {
45951    key: "toggleTabs",
45952    value: function toggleTabs(tab) {
45953      var isActive = "is-active";
45954      var classLink = ".b-yandex-map__tab-link";
45955      var classTab = ".b-yandex-map__tab-item";
45956      var activeType = tab.querySelector(classLink).dataset.type;
45957
45958      var tabItems = _toConsumableArray(this.mapWrapper.querySelectorAll(classTab));
45959
45960      tabItems.forEach(function (item) {
45961        var itemType = item.querySelector(classLink).dataset.type;
45962
45963        if (itemType === activeType) {
45964          item.classList.add(isActive);
45965          return;
45966        }
45967
45968        item.classList.remove(isActive);
45969      });
45970    }
45971    /**
45972     * Инициализация радиусов
45973     */
45974
45975  }, {
45976    key: "initCircles",
45977    value: function initCircles() {
45978      var _this9 = this;
45979
45980      var circles = this.settings.circles;
45981
45982      if (circles) {
45983        circles.forEach(function (circle) {
45984          var myCircle = new ymaps.Circle([circle.center, circle.radius], {}, {
45985            fillColor: circle.fillColor,
45986            fillOpacity: circle.fillOpacity,
45987            strokeColor: circle.strokeColor,
45988            strokeOpacity: circle.strokeOpacity,
45989            strokeWidth: circle.strokeWidth,
45990            strokeStyle: circle.strokeStyle
45991          });
45992
45993          _this9.map.geoObjects.add(myCircle);
45994        });
45995      }
45996    }
45997    /**
45998     * Отключаем перетаскивание карты при прокрутке одним пальцем на мобилке
45999     */
46000    // TODO Переписать правильно, что бы убрать игнорирование линтом
46001
46002    /* eslint-disable */
46003
46004  }, {
46005    key: "disableMobileDrag",
46006    value: function disableMobileDrag() {
46007      var isMobile = {
46008        Android: function Android() {
46009          return navigator.userAgent.match(/Android/i);
46010        },
46011        BlackBerry: function BlackBerry() {
46012          return navigator.userAgent.match(/BlackBerry/i);
46013        },
46014        iOS: function iOS() {
46015          return navigator.userAgent.match(/iPhone|iPad|iPod/i);
46016        },
46017        Opera: function Opera() {
46018          return navigator.userAgent.match(/Opera Mini/i);
46019        },
46020        Windows: function Windows() {
46021          return navigator.userAgent.match(/IEMobile/i);
46022        },
46023        any: function any() {
46024          return isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows();
46025        }
46026      };
46027
46028      if (isMobile.any()) {
46029        this.map.behaviors.disable('drag');
46030      }
46031    }
46032  }]);
46033
46034  return YandexMap;
46035}();
46036
46037/* harmony default export */ __webpack_exports__["default"] = (YandexMap);
46038/* eslint-enable */
46039/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "../node_modules/jquery/dist/jquery.js")))
46040
46041/***/ }),
46042
46043/***/ "./components/yandex-map/load.js":
46044/*!***************************************!*\
46045  !*** ./components/yandex-map/load.js ***!
46046  \***************************************/
46047/*! exports provided: default */
46048/***/ (function(module, __webpack_exports__, __webpack_require__) {
46049
46050"use strict";
46051__webpack_require__.r(__webpack_exports__);
46052/* harmony default export */ __webpack_exports__["default"] = (function () {
46053  return new Promise(function (resolve, reject) {
46054    var script = document.createElement('script');
46055    script.src = "https://api-maps.yandex.ru/2.1/?lang=ru_RU";
46056    script.async = true;
46057    script.defer = true;
46058    script.type = 'text/javascript';
46059    script.onload = resolve;
46060
46061    script.onerror = function (error) {
46062      reject(error);
46063    };
46064
46065    document.body.appendChild(script);
46066  }).then(function () {
46067    return new Promise(function (resolve) {
46068      window.ymaps.ready(resolve);
46069    });
46070  });
46071});
46072
46073/***/ })
46073,
46074
46075/***/ "./components/yandex-map/templates/ballons/link.twig":
46076/*!***********************************************************!*\
46077  !*** ./components/yandex-map/templates/ballons/link.twig ***!
46078  \***********************************************************/
46079/*! no static exports found */
46080/***/ (function(module, exports, __webpack_require__) {
46081
46082var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig,
46083    template = twig({"id":"0bb5892bcde02c3b4637dba981d29665afbe8b138198698c5451333a64258d9b50b2df32cbc33058ba3f81f7220a7b1f1a142dfef3ac6c194b8c32a3b6deebd8","data":[{"type":"raw","value":"<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n    <path fill=\"#D69D3A\"\n          d=\"M13.6906399,17.0862931 C15.0822696,12.312546 19.1528131,10.7653756 24,10.1210339 L24,8 C19.6313007,8.51693203 15.7085408,8.98042792 13.2770608,12.7023499 L11.999668,14.6576842 L10.7227407,12.7020459 C8.29260345,8.98024502 4.3698796,8.51676861 0,8 L0,10.120995 C4.84776924,10.7651878 8.91788794,12.3119857 10.3105928,17.0862931 L13.6906399,17.0862931 Z\">\n        <animate attributeName=\"d\" dur=\"2500ms\" repeatCount=\"indefinite\" values=\"M13.6906399,17.0862931 C15.0822696,12.312546 19.1528131,10.7653756 24,10.1210339 L24,8 C19.6313007,8.51693203 15.7085408,8.98042792 13.2770608,12.7023499 L11.999668,14.6576842 L10.7227407,12.7020459 C8.29260345,8.98024502 4.3698796,8.51676861 0,8 L0,10.120995 C4.84776924,10.7651878 8.91788794,12.3119857 10.3105928,17.0862931 L13.6906399,17.0862931 Z;\n          M13.6906399,18.0862931 C15.0822696,13.312546 18.1528131,11.7653756 23,11.1210339 L24,9.00004954 C19.6313007,9.51693203 15.7085408,9.98042792 13.2770608,13.7023499 L11.999668,15.6576842 L10.7227407,13.7020459 C8.09055882,10.5167686 4.3698796,10.5167686 4.54747351e-13,10 L1,12.120995 C5.84776924,12.7651878 8.91788794,13.3119857 10.3105928,18.0862931 L13.6906399,18.0862931 Z;\n          M12.6906399,18.0862931 C14.0822696,13.312546 19.1528131,14.7653756 24,14.1210339 L24,12.0000495 C19.6313007,12.516932 15.7085408,9.98042792 13.2770608,13.7023499 L11.999668,15.6576842 L10.7227407,13.7020459 C8.29260345,9.98024502 4.3698796,12.5167686 4.54747351e-13,12 L0,14.120995 C4.84776924,14.7651878 9.91788794,13.3119857 11.3105928,18.0862931 L12.6906399,18.0862931 Z;\n              M12.6906399,18.0862931 C14.0822696,13.312546 18.1528131,12.7653756 23,12.1210339 L23,10.0000495 C18.6313007,10.516932 15.7085408,9.98042792 13.2770608,13.7023499 L11.999668,15.6576842 L10.7227407,13.7020459 C8.29260345,9.98024502 5.3698796,8.51676861 1,8 L1,10.120995 C5.84776924,10.7651878 9.91788794,13.3119857 11.3105928,18.0862931 L12.6906399,18.0862931 Z;\n         M13.6906399,17.0862931 C15.0822696,12.312546 19.1528131,10.7653756 24,10.1210339 L24,8 C19.6313007,8.51693203 15.7085408,8.98042792 13.2770608,12.7023499 L11.999668,14.6576842 L10.7227407,12.7020459 C8.29260345,8.98024502 4.3698796,8.51676861 0,8 L0,10.120995 C4.84776924,10.7651878 8.91788794,12.3119857 10.3105928,17.0862931 L13.6906399,17.0862931 Z\"></animate>\n    </path>\n</svg>\n"}],"allowInlineIncludes":true,"rethrow":true});
46084
46085module.exports = function(context) { return template.render(context); }
46086
46087/***/ }),
46088
46089/***/ "./components/yandex-map/templates/controls.twig":
46090/*!*******************************************************!*\
46091  !*** ./components/yandex-map/templates/controls.twig ***!
46092  \*******************************************************/
46093/*! no static exports found */
46094/***/ (function(module, exports, __webpack_require__) {
46095
46096var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig,
46097    template = twig({"id":"6552024d57740b0e56935e28b295e120908d85dcb36de8526d8701b165c51dba02aed70342ceea08200c2c6d858639e1328819363ec4bc2fdcb403e9481a632e","data":[{"type":"raw","value":"<div class='b-yandex-map__zoom-controls'>\n    <button type=\"button\" id=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"id","match":["id"]}]},{"type":"raw","value":"-in\" class=\"b-yandex-map__zoom-btn\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\"\n             xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n             width=\"12\"\n             height=\"12\"\n             viewBox=\"0 0 12 12\"\n             class=\"b-yandex-map__zoom-icon b-yandex-map__zoom-icon_plus_icon\">\n            <path id=\"d3l0a\" d=\"M1772 1247a1 1 0 0 1 2 0v10a1 1 0 0 1-2 0z\"></path>\n            <path id=\"d3l0b\" d=\"M1778 1251a1 1 0 0 1 0 2h-10a1 1 0 0 1 0-2z\"></path>\n            <g transform=\"translate(-1767 -1246)\">\n                <use fill=\"#666\" xlink:href=\"#d3l0a\"></use>\n            </g>\n            <g transform=\"translate(-1767 -1246)\">\n                <use fill=\"#666\" xlink:href=\"#d3l0b\"></use>\n            </g>\n        </svg>\n    </button>\n    <button type=\"button\" id=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"id","match":["id"]}]},{"type":"raw","value":"-out\" class=\"b-yandex-map__zoom-btn\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\"\n             xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n             width=\"12\"\n             height=\"12\"\n             viewB
46097ox=\"0 0 12 2\"\n             class=\"b-yandex-map__zoom-icon b-yandex-map__zoom-icon_minus_icon\">\n            <path id=\"cihja\" d=\"M1778 1283a1 1 0 0 1 0 2h-10a1 1 0 0 1 0-2z\"></path>\n            <g transform=\"translate(-1767 -1283)\">\n                <use fill=\"#666\" xlink:href=\"#cihja\"></use>\n            </g>\n        </svg>\n    </button>\n</div>\n"}],"allowInlineIncludes":true,"rethrow":true});
46098
46099module.exports = function(context) { return template.render(context); }
46100
46101/***/ }),
46102
46103/***/ "./components/yandex-map/templates/legend.twig":
46104/*!*****************************************************!*\
46105  !*** ./components/yandex-map/templates/legend.twig ***!
46106  \*****************************************************/
46107/*! no static exports found */
46108/***/ (function(module, exports, __webpack_require__) {
46109
46110var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig,
46111    template = twig({"id":"c13581a9da7a2169bba6dd0b23a8443fa3d31c53491e80a08ca2d4310e4027e6e37f8bd0d851b3b2102d86b6d6a2a8976d9a63f51c7e3fa3c758a14daaadb31d","data":[{"type":"raw","value":"<ul class=\"b-legend-list\">\n    <li>\n        <img src=\"/local/templates/larus/images/yandex-map/pin-yellow.png\" class=\"b-legend-list__img\" alt=\"Текущие проекты\">\n        Текущие проекты\n    </li>\n    <li>\n        <img src=\"/local/templates/larus/images/yandex-map/pin-white.png\" class=\"b-legend-list__img\" alt=\"Реализованные проекты\">\n        Реализованные проекты\n    </li>\n</ul>\n"}],"allowInlineIncludes":true,"rethrow":true});
46112
46113module.exports = function(context) { return template.render(context); }
46114
46115/***/ }),
46116
46117/***/ "./components/yandex-map/templates/markers/main.twig":
46118/*!***********************************************************!*\
46119  !*** ./components/yandex-map/templates/markers/main.twig ***!
46120  \***********************************************************/
46121/*! no static exports found */
46122/***/ (function(module, exports, __webpack_require__) {
46123
46124var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig,
46125    template = twig({"id":"a33044ec7657bad6bb7bc41742f825672fe35840b13375776bb298816bd433ac6cf3b3ea5f9d84798058cc23ba4e343ecb9a504dfab1933c3658f884e376187d","data":[{"type":"raw","value":"<div class=\"b-yandex-map__html-marker\">\n    <div class=\"b-yandex-map__html-marker-title\"> "},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"title","match":["title"]}]},{"type":"raw","value":" </div>\n    <div class=\"b-yandex-map__html-marker-text\"> "},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"text","match":["text"]}]},{"type":"raw","value":" </div>\n    <div class=\"b-yandex-map__html-marker-icon\">\n        <img src=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"icon","match":["icon"]},{"type":"Twig.expression.type.key.period","key":"src"}]},{"type":"raw","value":"\" alt=\""},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"icon","match":["icon"]},{"type":"Twig.expression.type.key.period","key":"alt"}]},{"type":"raw","value":"\">\n    </div>\n</div>"}],"allowInlineIncludes":true,"rethrow":true});
46126
46127module.exports = function(context) { return template.render(context); }
46128
46129/***/ }),
46130
46131/***/ "./components/yandex-map/templates/markers/secondary.twig":
46132/*!****************************************************************!*\
46133  !*** ./components/yandex-map/templates/markers/secondary.twig ***!
46134  \****************************************************************/
46135/*! no static exports found */
46136/***/ (function(module, exports, __webpack_require__) {
46137
46138var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig,
46139    template = twig({"id":"f609061db4850bb07859b90304403ed805d17b1b771a9df5cf018696b212512e6d6713a2275ead59c02a6118bfa17b151af68d56833423a11b7844aae00b5c5f","data":[{"type":"raw","value":"<div class=\"b-yandex-map__html-marker-2\"> "},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"title","match":["title"]}]},{"type":"raw","value":" </div>"}],"allowInlineIncludes":true,"rethrow":true});
46140
46141module.exports = function(context) { return template.render(context); }
46142
46143/***/ }),
46144
46145/***/ "./components/yandex-map/templates/markers/text.twig":
46146/*!***********************************************************!*\
46147  !*** ./components/yandex-map/templates/markers/text.twig ***!
46148  \***********************************************************/
46149/*! no static exports found */
46150/***/ (function(module, exports, __webpack_require__) {
46151
46152var twig = __webpack_require__(/*! twig */ "../node_modules/twig/twig.js").twig,
46153    template = twig({"id":"9c13f08ed767416695fb484b7898edc9ef3537de6458353d60fd7ad0ab497eb03a8092ae190f878eec2083811e266771a658b45808423d77a30d12ad8fc548fc","data":[{"type":"raw","value":"<div class=\"b-yandex-map__html-text\">\n    "},{"type":"output","stack":[{"type":"Twig.expression.type.variable","value":"text","match":["text"]}]},{"type":"raw","value":"\n</div>"}],"allowInlineIncludes":true,"rethrow":true});
46154
46155module.exports = function(context) { return template.render(context); }
46156
46157/***/ }),
46158
46159/***/ 1:
46160/*!*************************************************!*\
46161  !*** multi babel-polyfill ./common/scripts/app ***!
46162  \*************************************************/
46163/*! no static exports found */
46164/***/ (function(module, exports, __webpack_require__) {
46165
46166__webpack_require__(/*! babel-polyfill */"../node_modules/babel-polyfill/lib/index.js");
46167module.exports = __webpack_require__(/*! ./common/scripts/app */"./common/scripts/app.js");
46168
46169
46170/***/ }),
46171
46172/***/ 2:
46173/*!********************!*\
46174  !*** fs (ignored) ***!
46175  \********************/
46176/*! no static exports found */
46177/***/ (function(module, exports) {
46178
46179/* (ignored) */
46180
46181/***/ })
46182
46183/******/ });
46184//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbGliL2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvZm4vcmVnZXhwL2VzY2FwZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2EtZnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hLW51bWJlci12YWx1ZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FkdmFuY2Utc3RyaW5nLWluZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYW4taW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hbi1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1jb3B5LXdpdGhpbi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FycmF5LWZpbGwuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1mcm9tLWl0ZXJhYmxlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1tZXRob2RzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktcmVkdWNlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FycmF5LXNwZWNpZXMtY3JlYXRlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYmluZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NsYXNzb2YuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb2YuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24tdG8tanNvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24td2Vhay5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb3JlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY3JlYXRlLXByb3BlcnR5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY3R4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGF0ZS10by1pc28tc3RyaW5nLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGF0ZS10by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZWZpbmVkLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kb20tY3JlYXRlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZW51bS1idWcta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2VudW0ta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2V4cG9ydC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLWlzLXJlZ2V4cC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZml4LXJlLXdrcy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZsYWdzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZmxhdHRlbi1pbnRvLWFycmF5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZm9yLW9mLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZnVuY3Rpb24tdG8tc3RyaW5nLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZ2xvYmFsLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faGFzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faGlkZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2h0bWwuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2luaGVyaXQtaWYtcmVxdWlyZWQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pbnZva2UuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pb2JqZWN0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtYXJyYXktaXRlci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLXJlZ2V4cC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItY2FsbC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWRldGVjdC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItc3RlcC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2xpYnJhcnkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tYXRoLWV4cG
461840xLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWF0aC1mcm91bmQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tYXRoLWxvZzFwLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWF0aC1zY2FsZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX21hdGgtc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX21ldGEuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX21pY3JvdGFzay5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtYXNzaWduLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcHMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZm9yY2VkLXBhbS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1nb3BkLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcG4tZXh0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcG4uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wcy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1ncG8uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1rZXlzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXBpZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1zYXAuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtdG8tYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vd24ta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3BhcnNlLWZsb2F0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcGFyc2UtaW50LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcGVyZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb21pc2UtcmVzb2x2ZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS1hbGwuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3JlZ2V4cC1leGVjLWFic3RyYWN0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcmVnZXhwLWV4ZWMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZXBsYWNlci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NhbWUtdmFsdWUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtY29sbGVjdGlvbi1mcm9tLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2V0LWNvbGxlY3Rpb24tb2YuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtcHJvdG8uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtc3BlY2llcy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLWtleS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NoYXJlZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpY3QtbWV0aG9kLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctaHRtbC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1wYWQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctcmVwZWF0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLXRyaW0uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctd3MuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190YXNrLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tYWJzb2x1dGUtaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdHlwZWQtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190eXBlZC1idWZmZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190eXBlZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3VpZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3VzZXItYWdlbnQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL192YWxpZGF0ZS1jb2xsZWN0aW9uLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fd2tzLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3drcy1leHQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL193a3MuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvY29yZS5yZWdleHAuZXNjYXBlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuY29weS13aXRoaW4uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5ldmVyeS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbGwuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maW5kLWluZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmluZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZvci1lYWNoLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmluZGV4LW9mLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaXMtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmpvaW4uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5sYXN0LWluZGV4LW9mLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkubWFwLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkub2YuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5yZWR1Y2UtcmlnaHQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zbGljZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNvbWUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zb3J0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc3BlY2llcy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUubm93LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1pc28tc3RyaW5nLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1qc29uLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmJpbmQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5oYXMtaW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5uYW1lLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWFwLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hY29zaC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYXNpbmguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmF0YW5oLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jYnJ0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jbHozMi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY29zaC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguZXhwbTEuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmZyb3VuZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguaHlwb3QuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmltdWwuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmxvZzEwLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5sb2cxcC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguc2luaC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgudGFuaC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgudHJ1bmMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuZXBzaWxvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1maW5pdGUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1uYW4uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtc2FmZS1pbnRlZ2VyLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLm1heC1zYWZlLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIubWluLXNhZmUtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIudG8tZml4ZWQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIudG8tcHJlY2lzaW9uLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmZyZWV6ZS
461845qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWV4dGVuc2libGUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZnJvemVuLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLXNlYWxlZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnByZXZlbnQtZXh0ZW5zaW9ucy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5zZWFsLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucGFyc2UtZmxvYXQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5hcHBseS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuY29uc3RydWN0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlbGV0ZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZW51bWVyYXRlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuaGFzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5pcy1leHRlbnNpYmxlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5vd24ta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QucHJldmVudC1leHRlbnNpb25zLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuZXhlYy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5mbGFncy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5tYXRjaC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5yZXBsYWNlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5zcGxpdC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC50by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zZXQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYW5jaG9yLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmJpZy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5ibGluay5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5ib2xkLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmNvZGUtcG9pbnQtYXQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZW5kcy13aXRoLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZpeGVkLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRjb2xvci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5mb250c2l6ZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5mcm9tLWNvZGUtcG9pbnQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaXRhbGljcy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5saW5rLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnJhdy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5yZXBlYXQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc21hbGwuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3RhcnRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3RyaWtlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN1Yi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdXAuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcudHJpbS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN5bWJvbC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmFycmF5LWJ1ZmZlci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmRhdGEtdmlldy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmZsb2F0MzItYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDY0LWFycmF5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuaW50MTYtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5pbnQzMi1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmludDgtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50MTYtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50MzItYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50OC1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWNsYW1wZWQtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi53ZWFrLW1hcC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LndlYWstc2V0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuYXJyYXkuZmxhdC1tYXAuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5hcnJheS5mbGF0dGVuLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuYXJyYXkuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5hc2FwLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuZXJyb3IuaXMtZXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXAuZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hcC5vZi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hcC50by1qc29uLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5jbGFtcC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguZGVnLXBlci1yYWQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmRlZ3JlZXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmZzY2FsZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguaWFkZGguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmltdWxoLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5pc3ViaC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGgucmFkLXBlci1kZWcuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLnJhZGlhbnMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLnNjYWxlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5zaWduYml0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC51bXVsaC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtZ2V0dGVyLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmRlZmluZS1zZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0Lmxvb2t1cC1nZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QubG9va3VwLXNldHRlci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC52YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5vYnNlcnZhYmxlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcucHJvbWlzZS50cnkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmRlZmluZS1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZGVsZXRlLW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtbWV0YWRhdGEta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtb3duLW1ldGFkYXRhLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuaGFzLW93bi1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QubWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zZXQuZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnNldC5vZi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnNldC50by1qc29uLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLmF0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLm1hdGNoLWFsbC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtZW5kLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1zdGFydC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy50cmltLWxlZnQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcudHJpbS1yaWdodC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN5bWJvbC5hc3luYy1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3lzdGVtLmdsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LndlYWstbWFwLmZyb20uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2
46184RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy53ZWFrLW1hcC5vZi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LndlYWstc2V0LmZyb20uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy53ZWFrLXNldC5vZi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmltbWVkaWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnRpbWVycy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL25vZGVfbW9kdWxlcy9jb3JlLWpzL3NoaW0uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oYW1tZXJqcy9oYW1tZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL2NvbXBvbmVudHMvY3VzdG9tX21lc3NhZ2VzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy9jb21wb25lbnRzL2hvb2tzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy9jb21wb25lbnRzL2xvY2FsaXphdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvY29tcG9uZW50cy9tZXNzYWdlX3N0b3JlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy9jb21wb25lbnRzL3JlZ2lzdHJ5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy9jb21wb25lbnRzL3JlbmRlcmVyLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy9jb21wb25lbnRzL3N0ZXBfZGVmYXVsdHMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL2NvbXBvbmVudHMvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL2NvbXBvbmVudHMvd3JhcHBlci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvaHlwZXJmb3JtLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy9wb2x5ZmlsbHMvY2hlY2tWYWxpZGl0eS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvcG9seWZpbGxzL3Byb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3BvbHlmaWxscy9yZXBvcnRWYWxpZGl0eS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvcG9seWZpbGxzL3NldEN1c3RvbVZhbGlkaXR5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy9wb2x5ZmlsbHMvc3RlcERvd24uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3BvbHlmaWxscy9zdGVwVXAuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3BvbHlmaWxscy92YWxpZGF0aW9uTWVzc2FnZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvcG9seWZpbGxzL3ZhbGlkaXR5U3RhdGUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3BvbHlmaWxscy92YWx1ZUFzRGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvcG9seWZpbGxzL3ZhbHVlQXNOdW1iZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3BvbHlmaWxscy93aWxsVmFsaWRhdGUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3Rvb2xzL2NhdGNoX3N1Ym1pdC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdG9vbHMvY29tbWFfc3BsaXQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3Rvb2xzL2RhdGVfdG9fc3RyaW5nLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy9mb3JtYXRfZGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdG9vbHMvZ2VuZXJhdGVfaWQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3Rvb2xzL2dldF9kYXRlX2Zyb21fd2Vlay5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdG9vbHMvZ2V0X25leHRfdmFsaWQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3Rvb2xzL2dldF9yYWRpb2dyb3VwLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy9nZXRfdHlwZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdG9vbHMvZ2V0X3ZhbGlkYXRlZF9lbGVtZW50cy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdG9vbHMvZ2V0X3dlZWtfb2ZfeWVhci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdG9vbHMvaXNfZmllbGQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3Rvb2xzL2lzX3ZhbGlkYXRpb25fY2FuZGlkYXRlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy9tYXJrLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy9tYXRjaGVzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy9wb2x5ZmlsbC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdG9vbHMvcG9seXVuZmlsbC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdG9vbHMvcHJvcGVydHlfaW5zdGFsbGVyLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy9wcm9wZXJ0eV91bmluc3RhbGxlci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdG9vbHMvcmV0dXJuX2hvb2tfb3IuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeX
46184BlcmZvcm0vc3JjL3Rvb2xzL3NwcmludGYuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3Rvb2xzL3N0cmluZ190b19kYXRlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy9zdHJpbmdfdG9fbnVtYmVyLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy90cmlnZ2VyX2V2ZW50LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy90cmltLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy90b29scy91bmljb2RlX3N0cmluZ19sZW5ndGguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3Rvb2xzL3ZhbGlkaXR5X3N0YXRlX2NoZWNrZXJzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy92YWxpZGF0b3JzL2JhZF9pbnB1dC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdmFsaWRhdG9ycy9tYXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3ZhbGlkYXRvcnMvbWF4bGVuZ3RoLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy92YWxpZGF0b3JzL21pbi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdmFsaWRhdG9ycy9taW5sZW5ndGguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3ZhbGlkYXRvcnMvcGF0dGVybi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdmFsaWRhdG9ycy9yZXF1aXJlZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2h5cGVyZm9ybS9zcmMvdmFsaWRhdG9ycy9zdGVwLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaHlwZXJmb3JtL3NyYy92YWxpZGF0b3JzL3R5cGUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9oeXBlcmZvcm0vc3JjL3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9pbnB1dG1hc2svZGlzdC9pbnB1dG1hc2svZGVwZW5kZW5jeUxpYnMvaW5wdXRtYXNrLmRlcGVuZGVuY3lMaWIuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9pbnB1dG1hc2svZGlzdC9pbnB1dG1hc2svZ2xvYmFsL3dpbmRvdy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2lucHV0bWFzay9kaXN0L2lucHV0bWFzay9pbnB1dG1hc2suZGF0ZS5leHRlbnNpb25zLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaW5wdXRtYXNrL2Rpc3QvaW5wdXRtYXNrL2lucHV0bWFzay5leHRlbnNpb25zLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaW5wdXRtYXNrL2Rpc3QvaW5wdXRtYXNrL2lucHV0bWFzay5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2lucHV0bWFzay9kaXN0L2lucHV0bWFzay9pbnB1dG1hc2subnVtZXJpYy5leHRlbnNpb25zLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaW5wdXRtYXNrL2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvanF1ZXJ5L2Rpc3QvanF1ZXJ5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvcGF0aC1icm93c2VyaWZ5L2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvdHdpZy90d2lnLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vLy4vY29tbW9uL3NjcmlwdHMvYXBwLmpzIiwid2VicGFjazovLy8uL2NvbW1vbi9zY3JpcHRzL21lZGlhdG9yLmpzIiwid2VicGFjazovLy8uL2NvbW1vbi9zY3JpcHRzL3V0aWxzLmpzIiwid2VicGFjazovLy8uL2NvbW1vbi9zdHlsZXMvYXBwLnNjc3M/NDNkMiIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm1zL3N1Ym1pdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm1zL3RlbGVwaG9uZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm1zL3ZhbGlkYXRpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3Jtcy92YWxpZGF0aW9uL3ZhbGlkYXRpb24udHdpZyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2hvdmVyLWVmZmVjdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL21vYmlsZS1oZWFkZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9tb2JpbGUtaGVhZGVyL21vYmlsZS1oZWFkZXIuc2Nzcz82NTBmIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvbmV3cy9iYXNpY1RlbXBsYXRlLnR3aWciLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9uZXdzL2ltYWdlVGVtcGxhdGUudHdpZyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL25ld3MvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9wb3B1cC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL3BvcHVwL2lubGluZS1wb3B1cC50d2lnIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvcG9wdXAvbWFwLXBvcHVwLnR3aWciLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9wb3B1cC9tZWRpYS9jbG9zZS5zdmcudHdpZyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL3BvcHVwL3BvcHVwLnR3aWciLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9wcmVsb2FkZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9zbGlkZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9zbGlkZXIvbWVkaWEvYXJyb3ctbGVmdC5zdmcudHdpZyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL3NsaWRlci9tZWRpYS9hcnJvdy1yaWdodC5zdmcudHdpZyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL3NsaWRlci9zbGlkZXIudHdpZyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL3RhYnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy90ZWFtL2luZGV4LmpzIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvdGVhbS9wb3B1cC50d2lnIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMveWFuZGV4LW1hcC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL3lhbmRleC1tYXAvbG9hZC5qcyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL3lhbmRleC1tYXAvdGVtcGxhdGVzL2JhbGxvbnMvbGluay50d2lnIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMveWFuZGV4LW1hcC90ZW1wbGF0ZXMvY29udHJvbHMudHdpZyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL3lhbmRleC1tYXAvdGVtcGxhdGVzL2xlZ2VuZC50d2lnIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMveWFuZGV4LW1hcC90ZW1wbGF0ZXMvbWFya2Vycy9tYWluLnR3aWciLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy95YW5kZXgtbWFwL3RlbXBsYXRlcy9tYXJrZXJzL3NlY29uZGFyeS50d2lnIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMveWFuZGV4LW1hcC90ZW1wbGF0ZXMvbWFya2Vycy90ZXh0LnR3aWciLCJ3ZWJwYWNrOi8vL2ZzIChpZ25vcmVkKSJdLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybi
46184BpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxucmVxdWlyZShcImNvcmUtanMvc2hpbVwiKTtcblxucmVxdWlyZShcInJlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvZm4vcmVnZXhwL2VzY2FwZVwiKTtcblxuaWYgKGdsb2JhbC5fYmFiZWxQb2x5ZmlsbCkge1xuICB0aHJvdyBuZXcgRXJyb3IoXCJvbmx5IG9uZSBpbnN0YW5jZSBvZiBiYWJlbC1wb2x5ZmlsbCBpcyBhbGxvd2VkXCIpO1xufVxuZ2xvYmFsLl9iYWJlbFBvbHlmaWxsID0gdHJ1ZTtcblxudmFyIERFRklORV9QUk9QRVJUWSA9IFwiZGVmaW5lUHJvcGVydHlcIjtcbmZ1bmN0aW9uIGRlZmluZShPLCBrZXksIHZhbHVlKSB7XG4gIE9ba2V5XSB8fCBPYmplY3RbREVGSU5FX1BST1BFUlRZXShPLCBrZXksIHtcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IHZhbHVlXG4gIH0pO1xufVxuXG5kZWZpbmUoU3RyaW5nLnByb3RvdHlwZSwgXCJwYWRMZWZ0XCIsIFwiXCIucGFkU3RhcnQpO1xuZGVmaW5lKFN0cmluZy5wcm90b3R5cGUsIFwicGFkUmlnaHRcIiwgXCJcIi5wYWRFbmQpO1xuXG5cInBvcCxyZXZlcnNl
46184LHNoaWZ0LGtleXMsdmFsdWVzLGVudHJpZXMsaW5kZXhPZixldmVyeSxzb21lLGZvckVhY2gsbWFwLGZpbHRlcixmaW5kLGZpbmRJbmRleCxpbmNsdWRlcyxqb2luLHNsaWNlLGNvbmNhdCxwdXNoLHNwbGljZSx1bnNoaWZ0LHNvcnQsbGFzdEluZGV4T2YscmVkdWNlLHJlZHVjZVJpZ2h0LGNvcHlXaXRoaW4sZmlsbFwiLnNwbGl0KFwiLFwiKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgW11ba2V5XSAmJiBkZWZpbmUoQXJyYXksIGtleSwgRnVuY3Rpb24uY2FsbC5iaW5kKFtdW2tleV0pKTtcbn0pOyIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvY29yZS5yZWdleHAuZXNjYXBlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5SZWdFeHAuZXNjYXBlO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIG1zZykge1xuICBpZiAodHlwZW9mIGl0ICE9ICdudW1iZXInICYmIGNvZihpdCkgIT0gJ051bWJlcicpIHRocm93IFR5cGVFcnJvcihtc2cpO1xuICByZXR1cm4gK2l0O1xufTtcbiIsIi8vIDIyLjEuMy4zMSBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbnZhciBVTlNDT1BBQkxFUyA9IHJlcXVpcmUoJy4vX3drcycpKCd1bnNjb3BhYmxlcycpO1xudmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5pZiAoQXJyYXlQcm90b1tVTlNDT1BBQkxFU10gPT0gdW5kZWZpbmVkKSByZXF1aXJlKCcuL19oaWRlJykoQXJyYXlQcm90bywgVU5TQ09QQUJMRVMsIHt9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICBBcnJheVByb3RvW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuIC8vIGBBZHZhbmNlU3RyaW5nSW5kZXhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYWR2YW5jZXN0cmluZ2luZGV4XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChTLCBpbmRleCwgdW5pY29kZSkge1xuICByZXR1cm4gaW5kZXggKyAodW5pY29kZSA/IGF0KFMsIGluZGV4KS5sZW5ndGggOiAxKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUsIGZvcmJpZGRlbkZpZWxkKSB7XG4gIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpIHx8IChmb3JiaWRkZW5GaWVsZCAhPT0gdW5kZWZpbmVkICYmIGZvcmJpZGRlbkZpZWxkIGluIGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihuYW1lICsgJzogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIi8vIDIyLjEuMy4zIEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluKHRhcmdldCwgc3RhcnQsIGVuZCA9IHRoaXMubGVuZ3RoKVxuJ3VzZSBzdHJpY3QnO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFtdLmNvcHlXaXRoaW4gfHwgZnVuY3Rpb24gY29weVdpdGhpbih0YXJnZXQgLyogPSAwICovLCBzdGFydCAvKiA9IDAsIGVuZCA9IEBsZW5ndGggKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgdmFyIGxlbiA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgdmFyIHRvID0gdG9BYnNvbHV0ZUluZGV4KHRhcmdldCwgbGVuKTtcbiAgdmFyIGZyb20gPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbik7XG4gIHZhciBlbmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGNvdW50ID0gTWF0aC5taW4oKGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuKSkgLSBmcm9tLCBsZW4gLSB0byk7XG4gIHZhciBpbmMgPSAxO1xuICBpZiAoZnJvbSA8IHRvICYmIHRvIDwgZnJvbSArIGNvdW50KSB7XG4gICAgaW5jID0gLTE7XG4gICAgZnJvbSArPSBjb3VudCAtIDE7XG4gICAgdG8gKz0gY291bnQgLSAxO1xuICB9XG4gIHdoaWxlIChjb3VudC0tID4gMCkge1xuICAgIGlmIChmcm9tIGluIE8pIE9bdG9dID0gT1tmcm9tXTtcbiAgICBlbHNlIGRlbGV0ZSBPW3RvXTtcbiAgICB0byArPSBpbmM7XG4gICAgZnJvbSArPSBpbmM7XG4gIH0gcmV0dXJuIE87XG59O1xuIiwiLy8gMjIuMS4zLjYgQXJyYXkucHJvdG90eXBlLmZpbGwodmFsdWUsIHN0YXJ0ID0gMCwgZW5kID0gdGhpcy5sZW5ndGgpXG4ndXNlIHN0cmljdCc7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZpbGwodmFsdWUgLyogLCBzdGFydCA9IDAsIGVuZCA9IEBsZW5ndGggKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGxlbmd0aCk7XG4gIHZhciBlbmQgPSBhTGVuID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGVuZFBvcyA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuZ3RoKTtcbiAgd2hpbGUgKGVuZFBvcyA+IGluZGV4KSBPW2luZGV4KytdID0gdmFsdWU7XG4gIHJldHVybi
46184BPO1xufTtcbiIsInZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyLCBJVEVSQVRPUikge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGZvck9mKGl0ZXIsIGZhbHNlLCByZXN1bHQucHVzaCwgcmVzdWx0LCBJVEVSQVRPUik7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIGlmICh2YWx1ZSAhPSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pIHtcbiAgICAgIGlmIChPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG4iLCIvLyAwIC0+IEFycmF5I2ZvckVhY2hcbi8vIDEgLT4gQXJyYXkjbWFwXG4vLyAyIC0+IEFycmF5I2ZpbHRlclxuLy8gMyAtPiBBcnJheSNzb21lXG4vLyA0IC0+IEFycmF5I2V2ZXJ5XG4vLyA1IC0+IEFycmF5I2ZpbmRcbi8vIDYgLT4gQXJyYXkjZmluZEluZGV4XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgYXNjID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRZUEUsICRjcmVhdGUpIHtcbiAgdmFyIElTX01BUCA9IFRZUEUgPT0gMTtcbiAgdmFyIElTX0ZJTFRFUiA9IFRZUEUgPT0gMjtcbiAgdmFyIElTX1NPTUUgPSBUWVBFID09IDM7XG4gIHZhciBJU19FVkVSWSA9IFRZUEUgPT0gNDtcbiAgdmFyIElTX0ZJTkRfSU5ERVggPSBUWVBFID09IDY7XG4gIHZhciBOT19IT0xFUyA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYO1xuICB2YXIgY3JlYXRlID0gJGNyZWF0ZSB8fCBhc2M7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgc2VsZiA9IElPYmplY3QoTyk7XG4gICAgdmFyIGYgPSBjdHgoY2FsbGJhY2tmbiwgdGhhdCwgMyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKHNlbGYubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciByZXN1bHQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkO1xuICAgIHZhciB2YWwsIHJlcztcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKE5PX0hPTEVTIHx8IGluZGV4IGluIHNlbGYpIHtcbiAgICAgIHZhbCA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzID0gZih2YWwsIGluZGV4LCBPKTtcbiAgICAgIGlmIChUWVBFKSB7XG4gICAgICAgIGlmIChJU19NQVApIHJlc3VsdFtpbmRleF0gPSByZXM7ICAgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYgKHJlcykgc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbDsgICAgICAgICAgICAgIC8vIGZpbmRcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBpbmRleDsgICAgICAgICAgICAvLyBmaW5kSW5kZXhcbiAgICAgICAgICBjYXNlIDI6IHJlc3VsdC5wdXNoKHZhbCk7ICAgICAgICAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIGlmIChJU19FVkVSWSkgcmV0dXJuIGZhbHNlOyAvLyBldmVyeVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSVNfRklORF9JTkRFWCA/IC0xIDogSVNfU09NRSB8fCBJU19FVkVSWSA/IElTX0VWRVJZIDogcmVzdWx0O1xuICB9O1xufTtcbiIsInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRoYXQsIGNhbGxiYWNrZm4sIGFMZW4sIG1lbW8sIGlzUmlnaHQpIHtcbiAgYUZ1bmN0aW9uKGNhbGxiYWNrZm4pO1xuICB2YXIgTyA9IHRvT2JqZWN0KHRoYXQpO1xuICB2YXIgc2VsZiA9IElPYmplY3QoTyk7XG4gIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gIHZhciBpbmRleCA9IGlzUmlnaHQgPyBsZW5ndGggLSAxIDogMDtcbiAgdmFyIGkgPSBpc1JpZ2h0ID8gLTEgOiAxO1xuICBpZiAoYUxlbiA8IDIpIGZvciAoOzspIHtcbiAgICBpZiAoaW5kZXggaW4gc2VsZikge1xuICAgICAgbWVtbyA9IHNlbGZbaW5kZXhdO1xuICAgICAgaW5kZXggKz0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpbmRleCArPSBpO1xuICAgIGlmIChpc1JpZ2h0ID8gaW5kZXggPCAwIDogbGVuZ3RoIDw9IGluZGV4KSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTtcbiAgICB9XG4gI
46184H1cbiAgZm9yICg7aXNSaWdodCA/IGluZGV4ID49IDAgOiBsZW5ndGggPiBpbmRleDsgaW5kZXggKz0gaSkgaWYgKGluZGV4IGluIHNlbGYpIHtcbiAgICBtZW1vID0gY2FsbGJhY2tmbihtZW1vLCBzZWxmW2luZGV4XSwgaW5kZXgsIE8pO1xuICB9XG4gIHJldHVybiBtZW1vO1xufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL19pcy1hcnJheScpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbCkge1xuICB2YXIgQztcbiAgaWYgKGlzQXJyYXkob3JpZ2luYWwpKSB7XG4gICAgQyA9IG9yaWdpbmFsLmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYgKHR5cGVvZiBDID09ICdmdW5jdGlvbicgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNPYmplY3QoQykpIHtcbiAgICAgIEMgPSBDW1NQRUNJRVNdO1xuICAgICAgaWYgKEMgPT09IG51bGwpIEMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IHJldHVybiBDID09PSB1bmRlZmluZWQgPyBBcnJheSA6IEM7XG59O1xuIiwiLy8gOS40LjIuMyBBcnJheVNwZWNpZXNDcmVhdGUob3JpZ2luYWxBcnJheSwgbGVuZ3RoKVxudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWwsIGxlbmd0aCkge1xuICByZXR1cm4gbmV3IChzcGVjaWVzQ29uc3RydWN0b3Iob3JpZ2luYWwpKShsZW5ndGgpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBpbnZva2UgPSByZXF1aXJlKCcuL19pbnZva2UnKTtcbnZhciBhcnJheVNsaWNlID0gW10uc2xpY2U7XG52YXIgZmFjdG9yaWVzID0ge307XG5cbnZhciBjb25zdHJ1Y3QgPSBmdW5jdGlvbiAoRiwgbGVuLCBhcmdzKSB7XG4gIGlmICghKGxlbiBpbiBmYWN0b3JpZXMpKSB7XG4gICAgZm9yICh2YXIgbiA9IFtdLCBpID0gMDsgaSA8IGxlbjsgaSsrKSBuW2ldID0gJ2FbJyArIGkgKyAnXSc7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgZmFjdG9yaWVzW2xlbl0gPSBGdW5jdGlvbignRixhJywgJ3JldHVybiBuZXcgRignICsgbi5qb2luKCcsJykgKyAnKScpO1xuICB9IHJldHVybiBmYWN0b3JpZXNbbGVuXShGLCBhcmdzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24uYmluZCB8fCBmdW5jdGlvbiBiaW5kKHRoYXQgLyogLCAuLi5hcmdzICovKSB7XG4gIHZhciBmbiA9IGFGdW5jdGlvbih0aGlzKTtcbiAgdmFyIHBhcnRBcmdzID0gYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHZhciBib3VuZCA9IGZ1bmN0aW9uICgvKiBhcmdzLi4uICovKSB7XG4gICAgdmFyIGFyZ3MgPSBwYXJ0QXJncy5jb25jYXQoYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgYm91bmQgPyBjb25zdHJ1Y3QoZm4sIGFyZ3MubGVuZ3RoLCBhcmdzKSA6IGludm9rZShmbiwgYXJncywgdGhhdCk7XG4gIH07XG4gIGlmIChpc09iamVjdChmbi5wcm90b3R5cGUpKSBib3VuZC5wcm90b3R5cGUgPSBmbi5wcm90b3R5cGU7XG4gIHJldHVybiBib3VuZDtcbn07XG4iLCIvLyBnZXR0aW5nIHRhZyBmcm9tIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBBUkcgPSBjb2YoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgJGl0ZXJEZWZpbmUgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpO1xudmFyIHN0ZXAgPSByZXF1aXJlKCcuL19pdGVyLXN0ZXAnKTtcbnZhciBzZXRTcGVjaWVzID0gcmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFzdEtleSA9IHJlcXVpcmUoJy4vX21ldGEnKS5mYXN0S2V5O1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIFNJWkUgPSBERVNDUklQVE9SUyA/ICdfcycgOiAnc2l6ZSc7XG5cbnZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uICh0aGF0LCBrZXkpIHtcbiAgLy8gZmFzdCBjYXNlXG4gIHZhciBpbmRleCA9IGZhc3RLZXkoa2V5KTtcbiAgdmFyIGVudHJ5O1xuICBpZiAoaW5kZXggIT09ICdGJykgcmV0dXJuIHRoYXQuX2lbaW5kZXhdO1xuICAvLyBmcm96ZW4gb2JqZWN0IGNhc2VcbiAgZm9yIChlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pIHtcbiAgICBpZiAoZW50cnkuayA9PSBrZXkpIHJldHVybi
46184BlbnRyeTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgTkFNRSwgJ19pJyk7XG4gICAgICB0aGF0Ll90ID0gTkFNRTsgICAgICAgICAvLyBjb2xsZWN0aW9uIHR5cGVcbiAgICAgIHRoYXQuX2kgPSBjcmVhdGUobnVsbCk7IC8vIGluZGV4XG4gICAgICB0aGF0Ll9mID0gdW5kZWZpbmVkOyAgICAvLyBmaXJzdCBlbnRyeVxuICAgICAgdGhhdC5fbCA9IHVuZGVmaW5lZDsgICAgLy8gbGFzdCBlbnRyeVxuICAgICAgdGhhdFtTSVpFXSA9IDA7ICAgICAgICAgLy8gc2l6ZVxuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgIH0pO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7XG4gICAgICAvLyAyMy4xLjMuMSBNYXAucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIC8vIDIzLjIuMy4yIFNldC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgICBmb3IgKHZhciB0aGF0ID0gdmFsaWRhdGUodGhpcywgTkFNRSksIGRhdGEgPSB0aGF0Ll9pLCBlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pIHtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZW50cnkucCkgZW50cnkucCA9IGVudHJ5LnAubiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZWxldGUgZGF0YVtlbnRyeS5pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGF0Ll9mID0gdGhhdC5fbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhhdFtTSVpFXSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjMgTWFwLnByb3RvdHlwZS5kZWxldGUoa2V5KVxuICAgICAgLy8gMjMuMi4zLjQgU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2Y
46184XIgdGhhdCA9IHZhbGlkYXRlKHRoaXMsIE5BTUUpO1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICB2YXIgbmV4dCA9IGVudHJ5Lm47XG4gICAgICAgICAgdmFyIHByZXYgPSBlbnRyeS5wO1xuICAgICAgICAgIGRlbGV0ZSB0aGF0Ll9pW2VudHJ5LmldO1xuICAgICAgICAgIGVudHJ5LnIgPSB0cnVlO1xuICAgICAgICAgIGlmIChwcmV2KSBwcmV2Lm4gPSBuZXh0O1xuICAgICAgICAgIGlmIChuZXh0KSBuZXh0LnAgPSBwcmV2O1xuICAgICAgICAgIGlmICh0aGF0Ll9mID09IGVudHJ5KSB0aGF0Ll9mID0gbmV4dDtcbiAgICAgICAgICBpZiAodGhhdC5fbCA9PSBlbnRyeSkgdGhhdC5fbCA9IHByZXY7XG4gICAgICAgICAgdGhhdFtTSVpFXS0tO1xuICAgICAgICB9IHJldHVybiAhIWVudHJ5O1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjIuMy42IFNldC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgLy8gMjMuMS4zLjUgTWFwLnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgICAgIHZhbGlkYXRlKHRoaXMsIE5BTUUpO1xuICAgICAgICB2YXIgZiA9IGN0eChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7XG4gICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgd2hpbGUgKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhpcy5fZikge1xuICAgICAgICAgIGYoZW50cnkudiwgZW50cnkuaywgdGhpcyk7XG4gICAgICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnIpIGVudHJ5ID0gZW50cnkucDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy43IE1hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjIuMy43IFNldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWdldEVudHJ5KHZhbGlkYXRlKHRoaXMsIE5BTUUpLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChERVNDUklQVE9SUykgZFAoQy5wcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZSh0aGlzLCBOQU1FKVtTSVpFXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQztcbiAgfSxcbiAgZGVmOiBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgdmFyIHByZXYsIGluZGV4O1xuICAgIC8vIGNoYW5nZSBleGlzdGluZyBlbnRyeVxuICAgIGlmIChlbnRyeSkge1xuICAgICAgZW50cnkudiA9IHZhbHVlO1xuICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhhdC5fbCA9IGVudHJ5ID0ge1xuICAgICAgICBpOiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSwgLy8gPC0gaW5kZXhcbiAgICAgICAgazoga2V5LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIGtleVxuICAgICAgICB2OiB2YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gdmFsdWVcbiAgICAgICAgcDogcHJldiA9IHRoYXQuX2wsICAgICAgICAgICAgIC8vIDwtIHByZXZpb3VzIGVudHJ5XG4gICAgICAgIG46IHVuZGVmaW5lZCwgICAgICAgICAgICAgICAgICAvLyA8LSBuZXh0IGVudHJ5XG4gICAgICAgIHI6IGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSByZW1vdmVkXG4gICAgICB9O1xuICAgICAgaWYgKCF0aGF0Ll9mKSB0aGF0Ll9mID0gZW50cnk7XG4gICAgICBpZiAocHJldikgcHJldi5uID0gZW50cnk7XG4gICAgICB0aGF0W1NJWkVdKys7XG4gICAgICAvLyBhZGQgdG8gaW5kZXhcbiAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSB0aGF0Ll9pW2luZGV4XSA9IGVudHJ5O1xuICAgIH0gcmV0dXJuIHRoYXQ7XG4gIH0sXG4gIGdldEVudHJ5OiBnZXRFbnRyeSxcbiAgc2V0U3Ryb25nOiBmdW5jdGlvbiAoQywgTkFNRSwgSVNfTUFQKSB7XG4gICAgLy8gYWRkIC5rZXlzLCAudmFsdWVzLCAuZW50cmllcywgW0BAaXRlcmF0b3JdXG4gICAgLy8gMjMuMS4zLjQsIDIzLjEuMy44LCAyMy4xLjMuMTEsIDIzLjEuMy4xMiwgMjMuMi4zLjUsIDIzLjIuMy44LCAyMy4yLjMuMTAsIDIzLjIuMy4xMVxuICAgICRpdGVyRGVmaW5lKEMsIE5BTUUsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICAgICAgdGhpcy5fdCA9IHZhbGlkYXRlKGl0ZXJhdGVkLCBOQU1FKTsgLy8gdGFyZ2V0XG4gICAgICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgICAgICAvLyBraW5kXG4gICAgICB0aGlzLl9sID0gdW5kZWZpbmVkOyAgICAgICAgICAgICAgICAvLyBwcmV2aW91c1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHZhciBraW5kID0gdGhhdC5faztcbiAgICAgIHZhciBlbnRyeSA9IHRoYXQuX2w7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yKSBlbnRyeSA9IGVudHJ5LnA7XG4gICAgICAvLyBnZXQgbmV4dCBlbnRyeVxuICAgICAgaWYgKCF0aGF0Ll90IHx8ICEodGhhdC5fbCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhhdC5fdC5fZikpIHtcbiAgICAgICAgLy8gb3IgZmluaXNoIHRoZSBpdGVyYXRpb25cbiAgICAgICAgdGhhdC5fdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHN0ZXAoMSk7XG4gICAgICB9XG4gICAgICAvLyByZXR1cm4gc3RlcCBieSBraW5kXG4gICAgICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBzdGVwKDAsIGVudHJ5LmspO1xuICAgICAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBzdGVwKDAsIGVudHJ5LnYpO1xuICAgICAgcmV0dXJuIHN0ZXAoMCwgW2VudHJ5LmssIGVudHJ5LnZdKTtcbiAgICB9LCBJU19NQVAgPyAnZW50cmllcycgOiAndmFsdWVzJywgIUlTX01BUCwgdHJ1ZSk7XG5cbiAgICAvLyBhZGQgW0BAc3BlY2llc10sIDIzLjEuMi4yLCAyMy4yLjIuMlxuICAgIHNldFNwZWNpZXMoTkFNRSk7XG4gIH1cbn07XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciBmcm9tID0gcmVxdWlyZSgnLi9fYXJyYXktZnJvbS1pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSkge1xuICByZXR1cm4gZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIGlmIChjbGFzc29mKHRoaXMpICE9IE5BTUUpIHRocm93IFR5cGVFcnJvcihOQU1FICsgXCIjdG9KU09OIGlzbid0IGdlbmVyaWNcIik7XG4gICAgcmV0dXJuIGZyb20odGhpcyk7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJyk7XG52YXIgZ2V0V2VhayA9IHJlcXVpcmUoJy4vX21ldGEnKS5nZXRXZWFrO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyIGNyZWF0ZUFycmF
461845TWV0aG9kID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpO1xudmFyICRoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBhcnJheUZpbmQgPSBjcmVhdGVBcnJheU1ldGhvZCg1KTtcbnZhciBhcnJheUZpbmRJbmRleCA9IGNyZWF0ZUFycmF5TWV0aG9kKDYpO1xudmFyIGlkID0gMDtcblxuLy8gZmFsbGJhY2sgZm9yIHVuY2F1Z2h0IGZyb3plbiBrZXlzXG52YXIgdW5jYXVnaHRGcm96ZW5TdG9yZSA9IGZ1bmN0aW9uICh0aGF0KSB7XG4gIHJldHVybiB0aGF0Ll9sIHx8ICh0aGF0Ll9sID0gbmV3IFVuY2F1Z2h0RnJvemVuU3RvcmUoKSk7XG59O1xudmFyIFVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuYSA9IFtdO1xufTtcbnZhciBmaW5kVW5jYXVnaHRGcm96ZW4gPSBmdW5jdGlvbiAoc3RvcmUsIGtleSkge1xuICByZXR1cm4gYXJyYXlGaW5kKHN0b3JlLmEsIGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBpdFswXSA9PT0ga2V5O1xuICB9KTtcbn07XG5VbmNhdWdodEZyb3plblN0b3JlLnByb3RvdHlwZSA9IHtcbiAgZ2V0OiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYgKGVudHJ5KSByZXR1cm4gZW50cnlbMV07XG4gIH0sXG4gIGhhczogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhIWZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYgKGVudHJ5KSBlbnRyeVsxXSA9IHZhbHVlO1xuICAgIGVsc2UgdGhpcy5hLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSxcbiAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgaW5kZXggPSBhcnJheUZpbmRJbmRleCh0aGlzLmEsIGZ1bmN0aW9uIChpdCkge1xuICAgICAgcmV0dXJuIGl0WzBdID09PSBrZXk7XG4gICAgfSk7XG4gICAgaWYgKH5pbmRleCkgdGhpcy5hLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuICEhfmluZGV4O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uICh3cmFwcGVyLCBOQU1FLCBJU19NQVAsIEFEREVSKSB7XG4gICAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkge1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBDLCBOQU1FLCAnX2knKTtcbiAgICAgIHRoYXQuX3QgPSBOQU1FOyAgICAgIC8vIGNvbGxlY3Rpb24gdHlwZVxuICAgICAgdGhhdC5faSA9IGlkKys7ICAgICAgLy8gY29sbGVjdGlvbiBpZFxuICAgICAgdGhhdC5fbCA9IHVuZGVmaW5lZDsgLy8gbGVhayBzdG9yZSBmb3IgdW5jYXVnaHQgZnJvemVuIG9iamVjdHNcbiAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMy4zLjIgV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjQuMy4zIFdlYWtTZXQucHJvdG90eXBlLmRlbGV0ZSh2YWx1ZSlcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2Y
46184XIgZGF0YSA9IGdldFdlYWsoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHZhbGlkYXRlKHRoaXMsIE5BTUUpKVsnZGVsZXRlJ10oa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCB0aGlzLl9pKSAmJiBkZWxldGUgZGF0YVt0aGlzLl9pXTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4zLjMuNCBXZWFrTWFwLnByb3RvdHlwZS5oYXMoa2V5KVxuICAgICAgLy8gMjMuNC4zLjQgV2Vha1NldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWsoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHZhbGlkYXRlKHRoaXMsIE5BTUUpKS5oYXMoa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCB0aGlzLl9pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQztcbiAgfSxcbiAgZGVmOiBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgIHZhciBkYXRhID0gZ2V0V2Vhayhhbk9iamVjdChrZXkpLCB0cnVlKTtcbiAgICBpZiAoZGF0YSA9PT0gdHJ1ZSkgdW5jYXVnaHRGcm96ZW5TdG9yZSh0aGF0KS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgZWxzZSBkYXRhW3RoYXQuX2ldID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoYXQ7XG4gIH0sXG4gIHVmc3RvcmU6IHVuY2F1Z2h0RnJvemVuU3RvcmVcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJyk7XG52YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciAkaXRlckRldGVjdCA9IHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0Jyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi9faW5oZXJpdC1pZi1yZXF1aXJlZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChOQU1FLCB3cmFwcGVyLCBtZXRob2RzLCBjb21tb24sIElTX01BUCwgSVNfV0VBSykge1xuICB2YXIgQmFzZSA9IGdsb2JhbFtOQU1FXTtcbiAgdmFyIEMgPSBCYXNlO1xuICB2YXIgQURERVIgPSBJU19NQVAgPyAnc2V0JyA6ICdhZGQnO1xuICB2YXIgcHJvdG8gPSBDICYmIEMucHJvdG90eXBlO1xuICB2YXIgTyA9IHt9O1xuICB2YXIgZml4TWV0aG9kID0gZnVuY3Rpb24gKEtFWSkge1xuICAgIHZhciBmbiA9IHByb3RvW0tFWV07XG4gICAgcmVkZWZpbmUocHJvdG8sIEtFWSxcbiAgICAgIEtFWSA9PSAnZGVsZXRlJyA/IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChhKSA/IGZhbHNlIDogZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpO1xuICAgICAgfSA6IEtFWSA9PSAnaGFzJyA/IGZ1bmN0aW9uIGhhcyhhKSB7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChhKSA/IGZhbHNlIDogZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpO1xuICAgICAgfSA6IEtFWSA9PSAnZ2V0JyA/IGZ1bmN0aW9uIGdldChhKSB7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChhKSA/IHVuZGVmaW5lZCA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2FkZCcgPyBmdW5jdGlvbiBhZGQoYSkgeyBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7IHJldHVybiB0aGlzOyB9XG4gICAgICAgIDogZnVuY3Rpb24gc2V0KGEsIGIpIHsgZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEsIGIpOyByZXR1cm4gdGhpczsgfVxuICAgICk7XG4gIH07XG4gIGlmICh0eXBlb2YgQyAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBwcm90by5mb3JFYWNoICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3IEMoKS5lbnRyaWVzKCkubmV4dCgpO1xuICB9KSkpIHtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIEMgPSBjb21tb24uZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUik7XG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICAgIG1ldGEuTkVFRCA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGluc3RhbmNlID0gbmV3IEMoKTtcbiAgICAvLyBlYXJseSBpbXBsZW1lbnRhdGlvbnMgbm90IHN1cHBvcnRzIGNoYWluaW5nXG4gICAgdmFyIEhBU05UX0NIQUlOSU5HID0gaW5zdGFuY2VbQURERVJdKElTX1dFQUsgPyB7fSA6IC0wLCAxKSAhPSBpbnN0YW5jZTtcbiAgICAvLyBWOCB+ICBDaHJvbWl1bSA0MC0gd2Vhay1jb2xsZWN0aW9ucyB0aHJvd3Mgb24gcHJpbWl0aXZlcywgYnV0IHNob3VsZCByZXR1cm4gZmFsc2VcbiAgICB2YXIgVEhST1dTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IGluc3RhbmNlLmhhcygxKTsgfSk7XG4gICAgLy8gbW9zdCBlYXJseSBpbXBsZW1lbnRhdGlvbnMgZG9lc24ndCBzdXBwb3J0cyBpdGVyYWJsZXMsIG1vc3QgbW9kZXJuIC0gbm90IGNsb3NlIGl0IGNvcnJlY3RseVxuICAgIHZhciBBQ0NFUFRfSVRFUkFCTEVTID0gJGl0ZXJEZXRlY3QoZnVuY3Rpb24gKGl0ZXIpIHsgbmV3IEMoaXRlcik7IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIC8vIGZvciBlYXJseSBpbXBsZW1lbnRhdGlvbnMgLTAgYW5kICswIG5vdCB0aGUgc2FtZVxuICAgIHZhciBCVUdHWV9aRVJPID0gIUlTX1dFQUsgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVjggfiBDaHJvbWl1bSA0Mi0gZmFpbHMgb25seSB3aXRoIDUrIGVsZW1lbnRzXG4gICAgICB2Y
46184XIgJGluc3RhbmNlID0gbmV3IEMoKTtcbiAgICAgIHZhciBpbmRleCA9IDU7XG4gICAgICB3aGlsZSAoaW5kZXgtLSkgJGluc3RhbmNlW0FEREVSXShpbmRleCwgaW5kZXgpO1xuICAgICAgcmV0dXJuICEkaW5zdGFuY2UuaGFzKC0wKTtcbiAgICB9KTtcbiAgICBpZiAoIUFDQ0VQVF9JVEVSQUJMRVMpIHtcbiAgICAgIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0YXJnZXQsIGl0ZXJhYmxlKSB7XG4gICAgICAgIGFuSW5zdGFuY2UodGFyZ2V0LCBDLCBOQU1FKTtcbiAgICAgICAgdmFyIHRoYXQgPSBpbmhlcml0SWZSZXF1aXJlZChuZXcgQmFzZSgpLCB0YXJnZXQsIEMpO1xuICAgICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBmb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0aGF0W0FEREVSXSwgdGhhdCk7XG4gICAgICAgIHJldHVybiB0aGF0O1xuICAgICAgfSk7XG4gICAgICBDLnByb3RvdHlwZSA9IHByb3RvO1xuICAgICAgcHJvdG8uY29uc3RydWN0b3IgPSBDO1xuICAgIH1cbiAgICBpZiAoVEhST1dTX09OX1BSSU1JVElWRVMgfHwgQlVHR1lfWkVSTykge1xuICAgICAgZml4TWV0aG9kKCdkZWxldGUnKTtcbiAgICAgIGZpeE1ldGhvZCgnaGFzJyk7XG4gICAgICBJU19NQVAgJiYgZml4TWV0aG9kKCdnZXQnKTtcbiAgICB9XG4gICAgaWYgKEJVR0dZX1pFUk8gfHwgSEFTTlRfQ0hBSU5JTkcpIGZpeE1ldGhvZChBRERFUik7XG4gICAgLy8gd2VhayBjb2xsZWN0aW9ucyBzaG91bGQgbm90IGNvbnRhaW5zIC5jbGVhciBtZXRob2RcbiAgICBpZiAoSVNfV0VBSyAmJiBwcm90by5jbGVhcikgZGVsZXRlIHByb3RvLmNsZWFyO1xuICB9XG5cbiAgc2V0VG9TdHJpbmdUYWcoQywgTkFNRSk7XG5cbiAgT1tOQU1FXSA9IEM7XG4gICRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogKEMgIT0gQmFzZSksIE8pO1xuXG4gIGlmICghSVNfV0VBSykgY29tbW9uLnNldFN0cm9uZyhDLCBOQU1FLCBJU19NQVApO1xuXG4gIHJldHVybiBDO1xufTtcbiIsInZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7IHZlcnNpb246ICcyLjYuNScgfTtcbmlmICh0eXBlb2YgX19lID09ICdudW1iZXInKSBfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBpbmRleCwgdmFsdWUpIHtcbiAgaWYgKGluZGV4IGluIG9iamVjdCkgJGRlZmluZVByb3BlcnR5LmYob2JqZWN0LCBpbmRleCwgY3JlYXRlRGVzYygwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtpbmRleF0gPSB2YWx1ZTtcbn07XG4iLCIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmICh0aGF0ID09PSB1bmRlZmluZWQpIHJldHVybiBmbjtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyMC4zLjQuMzYgLyAxNS45LjUuNDMgRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc
46184oKVxudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBnZXRUaW1lID0gRGF0ZS5wcm90b3R5cGUuZ2V0VGltZTtcbnZhciAkdG9JU09TdHJpbmcgPSBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZztcblxudmFyIGx6ID0gZnVuY3Rpb24gKG51bSkge1xuICByZXR1cm4gbnVtID4gOSA/IG51bSA6ICcwJyArIG51bTtcbn07XG5cbi8vIFBoYW50b21KUyAvIG9sZCBXZWJLaXQgaGFzIGEgYnJva2VuIGltcGxlbWVudGF0aW9uc1xubW9kdWxlLmV4cG9ydHMgPSAoZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJHRvSVNPU3RyaW5nLmNhbGwobmV3IERhdGUoLTVlMTMgLSAxKSkgIT0gJzAzODUtMDctMjVUMDc6MDY6MzkuOTk5Wic7XG59KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAkdG9JU09TdHJpbmcuY2FsbChuZXcgRGF0ZShOYU4pKTtcbn0pKSA/IGZ1bmN0aW9uIHRvSVNPU3RyaW5nKCkge1xuICBpZiAoIWlzRmluaXRlKGdldFRpbWUuY2FsbCh0aGlzKSkpIHRocm93IFJhbmdlRXJyb3IoJ0ludmFsaWQgdGltZSB2YWx1ZScpO1xuICB2YXIgZCA9IHRoaXM7XG4gIHZhciB5ID0gZC5nZXRVVENGdWxsWWVhcigpO1xuICB2YXIgbSA9IGQuZ2V0VVRDTWlsbGlzZWNvbmRzKCk7XG4gIHZhciBzID0geSA8IDAgPyAnLScgOiB5ID4gOTk5OSA/ICcrJyA6ICcnO1xuICByZXR1cm4gcyArICgnMDAwMDAnICsgTWF0aC5hYnMoeSkpLnNsaWNlKHMgPyAtNiA6IC00KSArXG4gICAgJy0nICsgbHooZC5nZXRVVENNb250aCgpICsgMSkgKyAnLScgKyBseihkLmdldFVUQ0RhdGUoKSkgK1xuICAgICdUJyArIGx6KGQuZ2V0VVRDSG91cnMoKSkgKyAnOicgKyBseihkLmdldFVUQ01pbnV0ZXMoKSkgK1xuICAgICc6JyArIGx6KGQuZ2V0VVRDU2Vjb25kcygpKSArICcuJyArIChtID4gOTkgPyBtIDogJzAnICsgbHoobSkpICsgJ1onO1xufSA6ICR0b0lTT1N0cmluZztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgTlVNQkVSID0gJ251bWJlcic7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGhpbnQpIHtcbiAgaWYgKGhpbnQgIT09ICdzdHJpbmcnICYmIGhpbnQgIT09IE5VTUJFUiAmJiBoaW50ICE9PSAnZGVmYXVsdCcpIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0IGhpbnQnKTtcbiAgcmV0dXJuIHRvUHJpbWl0aXZlKGFuT2JqZWN0KHRoaXMpLCBoaW50ICE9IE5VTUJFUik7XG59O1xuIiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCIvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTtcbiIsIi8vIGFsbCBlbnVtZXJhYmxlIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBzeW1ib2xzXG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgZ09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgcElFID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHJlc3VsdCA9IGdldEtleXMoaXQpO1xuICB2YXIgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgaWYgKGdldFN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IGdldFN5bWJvbHMoaXQpO1xuICAgIHZhciBpc0VudW0gPSBwSUUuZjtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAoc3ltYm9scy5sZW5ndGggPiBpKSBpZiAoaXNFbnVtLmNhbGwoaXQsIGtleSA9IHN5bWJvbHNbaSsrXSkpIHJlc3VsdC5wdXNoKGtleSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbiAodHlwZSwgbmFtZSwgc291cmNlKSB7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GO1xuICB2YXIgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuRztcbiAgdmFyIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlM7XG4gIHZhciBJU19QUk9UTyA9IHR5cGUgJiAkZXhwb3J0LlA7XG4gIHZhciBJU19CSU5EID0gdHlwZSAmICRleHBvcnQuQjtcbiAgdmFyIHRhcmdldCA9IElTX0dMT0JBTCA/IGdsb2JhbCA6IElTX1NUQVRJQyA/IGdsb2JhbFtuYW1lXSB8fCAoZ2xvYmFsW25hbWVdID0ge30pIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXTtcbiAgdmFyIGV4cG9ydHMgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KTtcbiAgdmFyIGV4cFByb3RvID0gZXhwb3J0c1tQUk9UT1RZUEVdIHx8IChleHBvcnRzW1BST1RPVFlQRV0gPSB7fSk7XG4gIHZhciBrZXksIG93biwgb3V0LCBleHA7XG4gIGlmIChJU19HTE9CQUwpIHNvdXJjZSA9IG5hbWU7XG4gIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcbiAgICBvdXQgP
46184SAob3duID8gdGFyZ2V0IDogc291cmNlKVtrZXldO1xuICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG4gICAgZXhwID0gSVNfQklORCAmJiBvd24gPyBjdHgob3V0LCBnbG9iYWwpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIGlmICh0YXJnZXQpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBvdXQsIHR5cGUgJiAkZXhwb3J0LlUpO1xuICAgIC8vIGV4cG9ydFxuICAgIGlmIChleHBvcnRzW2tleV0gIT0gb3V0KSBoaWRlKGV4cG9ydHMsIGtleSwgZXhwKTtcbiAgICBpZiAoSVNfUFJPVE8gJiYgZXhwUHJvdG9ba2V5XSAhPSBvdXQpIGV4cFByb3RvW2tleV0gPSBvdXQ7XG4gIH1cbn07XG5nbG9iYWwuY29yZSA9IGNvcmU7XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgICAvLyBmb3JjZWRcbiRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgICAvLyBwcm90b1xuJGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcbiRleHBvcnQuVSA9IDY0OyAgLy8gc2FmZVxuJGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgXG5tb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7XG4iLCJ2YXIgTUFUQ0ggPSByZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSkge1xuICB2YXIgcmUgPSAvLi87XG4gIHRyeSB7XG4gICAgJy8uLydbS0VZXShyZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0cnkge1xuICAgICAgcmVbTUFUQ0hdID0gZmFsc2U7XG4gICAgICByZXR1cm4gIScvLi8nW0tFWV0ocmUpO1xuICAgIH0gY2F0Y2ggKGYpIHsgLyogZW1wdHkgKi8gfVxuICB9IHJldHVybiB0cnVlO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4vZXM2LnJlZ2V4cC5leGVjJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG52YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG52YXIgcmVnZXhwRXhlYyA9IHJlcXVpcmUoJy4vX3JlZ2V4cC1leGVjJyk7XG5cbnZhciBTUEVDSUVTID0gd2tzKCdzcGVjaWVzJyk7XG5cbnZhciBSRVBMQUNFX1NVUFBPUlRTX05BTUVEX0dST1VQUyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vICNyZXBsYWNlIG5lZWRzIGJ1aWx0LWluIHN1cHBvcnQgZm9yIG5hbWVkIGdyb3Vwcy5cbiAgLy8gI21hdGNoIHdvcmtzIGZpbmUgYmVjYXVzZSBpdCBqdXN0IHJldHVybiB0aGUgZXhlYyByZXN1bHRzLCBldmVuIGlmIGl0IGhhc1xuICAvLyBhIFwiZ3JvcHNcIiBwcm9wZXJ0eS5cbiAgdmFyIHJlID0gLy4vO1xuICByZS5leGVjID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICByZXN1bHQuZ3JvdXBzID0geyBhOiAnNycgfTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICByZXR1cm4gJycucmVwbGFjZShyZSwgJyQ8YT4nKSAhPT0gJzcnO1xufSk7XG5cbnZhciBTUExJVF9XT1JLU19XSVRIX09WRVJXUklUVEVOX0VYRUMgPSAoZnVuY3Rpb24gKCkge1xuICAvLyBDaHJvbWUgNTEgaGFzIGEgYnVnZ3kgXCJzcGxpdFwiIGltcGxlbWVudGF0aW9uIHdoZW4gUmVnRXhwI2V4ZWMgIT09IG5hdGl2ZUV4ZWNcbiAgdmFyIHJlID0gLyg/OikvO1xuICB2YXIgb3JpZ2luYWxFeGVjID0gcmUuZXhlYztcbiAgcmUuZXhlYyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG9yaWdpbmFsRXhlYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICB2YXIgcmVzdWx0ID0gJ2FiJy5zcGxpdChyZSk7XG4gIHJldHVybiByZXN1bHQubGVuZ3RoID09PSAyICYmIHJlc3VsdFswXSA9PT0gJ2EnICYmIHJlc3VsdFsxXSA9PT0gJ2InO1xufSkoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBsZW5ndGgsIGV4ZWMpIHtcbiAgdmFyIFNZTUJPTCA9IHdrcyhLRVkpO1xuXG4gIHZhciBERUxFR0FURVNfVE9fU1lNQk9MID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTdHJpbmcgbWV0aG9kcyBjYWxsIHN5bWJvbC1uYW1lZCBSZWdFcCBtZXRob2RzXG4gICAgdmFyIE8gPSB7fTtcbiAgICBPW1NZTUJPTF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9O1xuICAgIHJldHVybiAnJ1tLRVldKE8pICE9IDc7XG4gIH0pO1xuXG4gIHZhciBERUxFR0FURVNfVE9fRVhFQyA9IERFTEVHQVRFU19UT19TWU1CT0wgPyAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIC8vIFN5bWJvbC1uYW1lZCBSZWdFeHAgbWV0aG9kcyBjYWxsIC5leGVjXG4gICAgdmFyIGV4ZWNDYWxsZWQgPSBmYWxzZTtcbiAgICB2YXIgcmUgPSAvYS87XG4gICAgcmUuZXhlYyA9IGZ1bmN0aW9uICgpIHsgZXhlY0NhbGxlZCA9IHRydWU7IHJldHVybiBudWxsOyB9O1xuICAgIGlmIChLRVkgPT09ICdzcGxpdCcpIHtcbiAgICAgIC8vIFJlZ0V4cFtAQHNwbGl0XSBkb2Vzbid0IGNhbGwgdGhlIHJlZ2V4J3MgZXhlYyBtZXRob2QsIGJ1dCBmaXJzdCBjcmVhdGVzXG4gICAgICAvLyBhIG5ldyBvbmUuIFdlIG5lZWQgdG8gcmV0dXJuIHRoZSBwYXRjaGVkIHJlZ2V4IHdoZW4gY3JlYXRpbmcgdGhlIG5ldyBvbmUuXG4gICAgICByZS5jb25zdHJ1Y3RvciA9IHt9O1xuICAgICAgcmUuY29uc3RydWN0b3JbU1BFQ0lFU10gPSBmdW5jdGlvbiAoKSB7IHJldHVybiByZTsgfTtcbiAgICB9XG4gICAgcmVbU1lNQk9MXSgnJyk7XG4gICAgcmV0dXJuICFleGVjQ2FsbGVkO1xuICB9KSA6IHVuZGVmaW5lZDtcblxuICBpZiAoXG4gICAgIURFTEVHQVRFU19UT19TWU1CT0wgfHxcbiAgICAhREVMRUdBVEVTX1RPX0VYRUMgfHxcbiAgICAoS0VZID09PSAncmVwbGFjZScgJiYgIVJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTKSB8fFxuICAgIChLRVkgPT09ICdzcGxpdCcgJiYgIVNQTElUX1dPUktTX1dJVEhfT1ZFUldSSVRURU5fRVhFQylcbiAgKSB7XG4gICAgdmFyIG5hdGl2ZVJlZ0V4cE1ldGhvZCA9IC8uL1tTWU1CT0xdO1xuICAgIHZhciBmbnMgPSBleGVjKFxuICAgICAgZGVmaW5lZCxcbiAgICAgIFNZTUJPTCxcbiAgICAgICcnW0tFWV0sXG4gICAgICBmdW5jdGlvbiBtYXliZUNhbGxOYXRpdmUobmF0aXZlTWV0aG9kLCByZWdleHAsIHN0ciwgYXJnMiwgZm9yY2VTd
46184HJpbmdNZXRob2QpIHtcbiAgICAgICAgaWYgKHJlZ2V4cC5leGVjID09PSByZWdleHBFeGVjKSB7XG4gICAgICAgICAgaWYgKERFTEVHQVRFU19UT19TWU1CT0wgJiYgIWZvcmNlU3RyaW5nTWV0aG9kKSB7XG4gICAgICAgICAgICAvLyBUaGUgbmF0aXZlIFN0cmluZyBtZXRob2QgYWxyZWFkeSBkZWxlZ2F0ZXMgdG8gQEBtZXRob2QgKHRoaXNcbiAgICAgICAgICAgIC8vIHBvbHlmaWxsZWQgZnVuY3Rpb24pLCBsZWFzaW5nIHRvIGluZmluaXRlIHJlY3Vyc2lvbi5cbiAgICAgICAgICAgIC8vIFdlIGF2b2lkIGl0IGJ5IGRpcmVjdGx5IGNhbGxpbmcgdGhlIG5hdGl2ZSBAQG1ldGhvZCBtZXRob2QuXG4gICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbmF0aXZlUmVnRXhwTWV0aG9kLmNhbGwocmVnZXhwLCBzdHIsIGFyZzIpIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBuYXRpdmVNZXRob2QuY2FsbChzdHIsIHJlZ2V4cCwgYXJnMikgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkb25lOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICk7XG4gICAgdmFyIHN0cmZuID0gZm5zWzBdO1xuICAgIHZhciByeGZuID0gZm5zWzFdO1xuXG4gICAgcmVkZWZpbmUoU3RyaW5nLnByb3RvdHlwZSwgS0VZLCBzdHJmbik7XG4gICAgaGlkZShSZWdFeHAucHJvdG90eXBlLCBTWU1CT0wsIGxlbmd0aCA9PSAyXG4gICAgICAvLyAyMS4yLjUuOCBSZWdFeHAucHJvdG90eXBlW0BAcmVwbGFjZV0oc3RyaW5nLCByZXBsYWNlVmFsdWUpXG4gICAgICAvLyAyMS4yLjUuMTEgUmVnRXhwLnByb3RvdHlwZVtAQHNwbGl0XShzdHJpbmcsIGxpbWl0KVxuICAgICAgPyBmdW5jdGlvbiAoc3RyaW5nLCBhcmcpIHsgcmV0dXJuIHJ4Zm4uY2FsbChzdHJpbmcsIHRoaXMsIGFyZyk7IH1cbiAgICAgIC8vIDIxLjIuNS42IFJlZ0V4cC5wcm90b3R5cGVbQEBtYXRjaF0oc3RyaW5nKVxuICAgICAgLy8gMjEuMi41LjkgUmVnRXhwLnByb3RvdHlwZVtAQHNlYXJjaF0oc3RyaW5nKVxuICAgICAgOiBmdW5jdGlvbiAoc3RyaW5nKSB7IHJldHVybiByeGZuLmNhbGwoc3RyaW5nLCB0aGlzKTsgfVxuICAgICk7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyMS4yLjUuMyBnZXQgUmVnRXhwLnByb3RvdHlwZS5mbGFnc1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRoYXQgPSBhbk9iamVjdCh0aGlzKTtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuICBpZiAodGhhdC5nbG9iYWwpIHJlc3VsdCArPSAnZyc7XG4gIGlmICh0aGF0Lmlnbm9yZUNhc2UpIHJlc3VsdCArPSAnaSc7XG4gIGlmICh0aGF0Lm11bHRpbGluZSkgcmVzdWx0ICs9ICdtJztcbiAgaWYgKHRoYXQudW5pY29kZSkgcmVzdWx0ICs9ICd1JztcbiAgaWYgKHRoYXQuc3RpY2t5KSByZXN1bHQgKz0gJ3knO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtZmxhdE1hcC8jc2VjLUZsYXR0ZW5JbnRvQXJyYXlcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9faXMtYXJyYXknKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgSVNfQ09OQ0FUX1NQUkVBREFCTEUgPSByZXF1aXJlKCcuL193a3MnKSgnaXNDb25jYXRTcHJlYWRhYmxlJyk7XG5cbmZ1bmN0aW9uIGZsYXR0ZW5JbnRvQXJyYXkodGFyZ2V0LCBvcmlnaW5hbCwgc291cmNlLCBzb3VyY2VMZW4sIHN0YXJ0LCBkZXB0aCwgbWFwcGVyLCB0aGlzQXJnKSB7XG4gIHZhciB0YXJnZXRJbmRleCA9IHN0YXJ0O1xuICB2YXIgc291cmNlSW5kZXggPSAwO1xuICB2YXIgbWFwRm4gPSBtYXBwZXIgPyBjdHgobWFwcGVyLCB0aGlzQXJnLCAzKSA6IGZhbHNlO1xuICB2YXIgZWxlbWVudCwgc3ByZWFkYWJsZTtcblxuICB3aGlsZSAoc291cmNlSW5kZXggPCBzb3VyY2VMZW4pIHtcbiAgICBpZiAoc291cmNlSW5kZXggaW4gc291cmNlKSB7XG4gICAgICBlbGVtZW50ID0gbWFwRm4gPyBtYXBGbihzb3VyY2Vbc291cmNlSW5kZXhdLCBzb3VyY2VJbmRleCwgb3JpZ2luYWwpIDogc291cmNlW3NvdXJjZUluZGV4XTtcblxuICAgICAgc3ByZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgaWYgKGlzT2JqZWN0KGVsZW1lbnQpKSB7XG4gICAgICAgIHNwcmVhZGFibGUgPSBlbGVtZW50W0lTX0NPTkNBVF9TUFJFQURBQkxFXTtcbiAgICAgICAgc3ByZWFkYWJsZSA9IHNwcmVhZGFibGUgIT09IHVuZGVmaW5lZCA/ICEhc3ByZWFkYWJsZSA6IGlzQXJyYXkoZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzcHJlYWRhYmxlICYmIGRlcHRoID4gMCkge1xuICAgICAgICB0YXJnZXRJbmRleCA9IGZsYXR0ZW5JbnRvQXJyYXkodGFyZ2V0LCBvcmlnaW5hbCwgZWxlbWVudCwgdG9MZW5ndGgoZWxlbWVudC5sZW5ndGgpLCB0YXJnZXRJbmRleCwgZGVwdGggLSAxKSAtIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gMHgxZmZmZmZmZmZmZmZmZikgdGhyb3cgVHlwZUVycm9yKCk7XG4gICAgICAgIHRhcmdldFt0YXJnZXRJbmRleF0gPSBlbGVtZW50O1xuICAgICAgfVxuXG4gICAgICB0YXJnZXRJbmRleCsrO1xuICAgIH1cbiAgICBzb3VyY2VJbmRleCsrO1xuICB9XG4gIHJldHVybiB0YXJnZXRJbmRleDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmbGF0dGVuSW50b0FycmF5O1xuIiwidmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKTtcbnZhciBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgZ2V0SXRlckZuID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBCUkVBSyA9IHt9O1xudmFyIFJFVFVSTiA9IHt9O1xudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgZW50cmllcywgZm4sIHRoYXQsIElURVJBVE9SKSB7XG4gIHZhciBpdGVyRm4gPSBJVEVSQVRPUiA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGl0ZXJhYmxlOyB9IDogZ2V0SXRlckZuKGl0ZXJhYmxlKTtcbiAgdmFyIGYgPSBjdHgoZm4sIHRoYXQsIGVudHJpZXMgPyAyIDogMSk7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGgsIHN0ZXAsIGl0ZXJhdG9yLCByZXN1bHQ7XG4gIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcihpdGVyYWJsZSArICcgaXMgbm90IGl0ZXJhYmxlIScpO1xuICAvLyBmYXN0IGNhc2UgZm9yIGFycmF5cyB3aXRoIGRlZmF1bHQgaXRlcmF0b3JcbiAgaWYgKGlzQXJyYXlJdGVyKGl0ZXJGbikpIGZvciAobGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICByZXN1bHQgPSBlbnRyaWVzID8gZihhbk9
46184iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBmKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSBmb3IgKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoaXRlcmFibGUpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7KSB7XG4gICAgcmVzdWx0ID0gY2FsbChpdGVyYXRvciwgZiwgc3RlcC52YWx1ZSwgZW50cmllcyk7XG4gICAgaWYgKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5leHBvcnRzLkJSRUFLID0gQlJFQUs7XG5leHBvcnRzLlJFVFVSTiA9IFJFVFVSTjtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ25hdGl2ZS1mdW5jdGlvbi10by1zdHJpbmcnLCBGdW5jdGlvbi50b1N0cmluZyk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZiAodHlwZW9mIF9fZyA9PSAnbnVtYmVyJykgX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4iLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwidmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX3NldC1wcm90bycpLnNldDtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRoYXQsIHRhcmdldCwgQykge1xuICB2YXIgUyA9IHRhcmdldC5jb25zdHJ1Y3RvcjtcbiAgdmFyIFA7XG4gIGlmIChTICE9PSBDICYmIHR5cGVvZiBTID09ICdmdW5jdGlvbicgJiYgKFAgPSBTLnByb3RvdHlwZSkgIT09IEMucHJvdG90eXBlICYmIGlzT2JqZWN0KFApICYmIHNldFByb3RvdHlwZU9mKSB7XG4gICAgc2V0UHJvdG90eXBlT2YodGhhdCwgUCk7XG4gIH0gcmV0dXJuIHRoYXQ7XG59O1xuIiwiLy8gZmFzdCBhcHBseSwgaHR0cDovL2pzcGVyZi5sbmtpdC5jb20vZmFzdC1hcHBseS81XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgYXJncywgdGhhdCkge1xuICB2YXIgdW4gPSB0aGF0ID09PSB1bmRlZmluZWQ7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiB1biA/IGZuKClcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCk7XG4gICAgY2FzZSAxOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIGNhc2UgMzogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgY2FzZSA0OiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgfSByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJncyk7XG59O1xuIiwiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTtcbiIsIi8vIGNoZWNrIG9uIGRlZmF1bHQgQXJyYXkgaXRlcmF0b3JcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEFycmF
461845UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCAhPT0gdW5kZWZpbmVkICYmIChJdGVyYXRvcnMuQXJyYXkgPT09IGl0IHx8IEFycmF5UHJvdG9bSVRFUkFUT1JdID09PSBpdCk7XG59O1xuIiwiLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICByZXR1cm4gY29mKGFyZykgPT0gJ0FycmF5Jztcbn07XG4iLCIvLyAyMC4xLjIuMyBOdW1iZXIuaXNJbnRlZ2VyKG51bWJlcilcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNJbnRlZ2VyKGl0KSB7XG4gIHJldHVybiAhaXNPYmplY3QoaXQpICYmIGlzRmluaXRlKGl0KSAmJiBmbG9vcihpdCkgPT09IGl0O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuIiwiLy8gNy4yLjggSXNSZWdFeHAoYXJndW1lbnQpXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbnZhciBNQVRDSCA9IHJlcXVpcmUoJy4vX3drcycpKCdtYXRjaCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIGlzUmVnRXhwO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmICgoaXNSZWdFeHAgPSBpdFtNQVRDSF0pICE9PSB1bmRlZmluZWQgPyAhIWlzUmVnRXhwIDogY29mKGl0KSA9PSAnUmVnRXhwJyk7XG59O1xuIiwiLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSBhbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGRlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVH
46184ID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgdHlwZW9mIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCJ2YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIHJpdGVyID0gWzddW0lURVJBVE9SXSgpO1xuICByaXRlclsncmV0dXJuJ10gPSBmdW5jdGlvbiAoKSB7IFNBRkVfQ0xPU0lORyA9IHRydWU7IH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsXG4gIEFycmF5LmZyb20ocml0ZXIsIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYywgc2tpcENsb3NpbmcpIHtcbiAgaWYgKCFza2lwQ2xvc2luZyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBzYWZlID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IFs3XTtcbiAgICB2YXIgaXRlciA9IGFycltJVEVSQVRPUl0oKTtcbiAgICBpdGVyLm5leHQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB7IGRvbmU6IHNhZmUgPSB0cnVlIH07IH07XG4gICAgYXJyW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGl0ZXI7IH07XG4gICAgZXhlYyhhcnIpO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIHNhZmU7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZG9uZSwgdmFsdWUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiAhIWRvbmUgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiIsIi8vIDIwLjIuMi4xNCBNYXRoLmV4cG0xKHgpXG52YXIgJGV4cG0xID0gTWF0aC5leHBtMTtcbm1vZHVsZS5leHBvcnRzID0gKCEkZXhwbTFcbiAgLy8gT2xkIEZGIGJ1Z1xuICB8fCAkZXhwbTEoMTApID4gMjIwMjUuNDY1Nzk0ODA2NzE5IHx8ICRleHBtMSgxMCkgPCAyMjAyNS40NjU3OTQ4MDY3MTY1MTY4XG4gIC8vIFRvciBCcm93c2VyIGJ1Z1xuICB8fCAkZXhwbTEoLTJlLTE3KSAhPSAtMmUtMTdcbikgPyBmdW5jdGlvbiBleHBtMSh4KSB7XG4gIHJldHVybiAoeCA9ICt4KSA9PSAwID8geCA6IHggPiAtMWUtNiAmJiB4IDwgMWUtNiA/IHggKyB4ICogeCAvIDIgOiBNYXRoLmV4cCh4KSAtIDE7XG59IDogJGV4cG0xO1xuIiwiLy8gMjAuMi4yLjE2IE1hdGguZnJvdW5kKHgpXG52YXIgc2lnbiA9IHJlcXVpcmUoJy4vX21hdGgtc2lnbicpO1xudmFyIHBvdyA9IE1hdGgucG93O1xudmFyIEVQU0lMT04gPSBwb3coMiwgLTUyKTtcbnZhciBFUFNJTE9OMzIgPSBwb3coMiwgLTIzKTtcbnZhciBNQVgzMiA9IHBvdygyLCAxMjcpICogKDIgLSBFUFNJTE9OMzIpO1xudmFyIE1JTjMyID0gcG93KDIsIC0xMjYpO1xuXG52YXIgcm91bmRUaWVzVG9FdmVuID0gZnVuY3Rpb24gKG4pIHtcbiAgcmV0dXJuIG4gKyAxIC8gRVBTSUxPTiAtIDEgLyBFUFNJTE9OO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBNYXRoLmZyb3VuZCB8fCBmdW5jdGlvbiBmcm91bmQoeCkge1xuICB2YXIgJGFicyA9IE1hdGguYWJzKHgpO1xuICB2YXIgJHNpZ24gPSBzaWduKHgpO1xuICB2YXIgYSwgcmVzdWx0O1xuICBpZiAoJGFicyA8IE1JTjMyKSByZXR1cm4gJHNpZ24gKiByb3VuZFRpZXNUb0V2ZW4oJGFicyAvIE1JTjMyIC8gRVBTSUxPTjMyKSAqIE1JTjMyICogRVBTSUxPTjMyO1xuICBhID0gKDEgKyBFUFNJTE9OMzIgLyBFUFNJTE9OKSAqICRhYnM7XG4gIHJlc3VsdCA9IGEgLSAoYSAtICRhYnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIGlmIChyZXN1bHQgPiBNQVgzMiB8fCByZXN1bHQgIT0gcmVzdWx0KSByZXR1cm4gJHNpZ24gKiBJbmZpbml0eTtcbiAgcmV0dXJuICRzaWduICogcmVzdWx0O1xufTtcbiIsIi8vIDIwLjIuMi4yMCBNYXRoLmxvZzFwKHgpXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgubG9nMXAgfHwgZnVuY3Rpb24gbG9nMXAoeCkge1xuICByZXR1cm4gKHggPSAreCkgPiAtMWUtOCAmJiB4IDwgMWUtOCA/IHggLSB4ICoge
46184CAvIDIgOiBNYXRoLmxvZygxICsgeCk7XG59O1xuIiwiLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xubW9kdWxlLmV4cG9ydHMgPSBNYXRoLnNjYWxlIHx8IGZ1bmN0aW9uIHNjYWxlKHgsIGluTG93LCBpbkhpZ2gsIG91dExvdywgb3V0SGlnaCkge1xuICBpZiAoXG4gICAgYXJndW1lbnRzLmxlbmd0aCA9PT0gMFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgfHwgeCAhPSB4XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICB8fCBpbkxvdyAhPSBpbkxvd1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgfHwgaW5IaWdoICE9IGluSGlnaFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgfHwgb3V0TG93ICE9IG91dExvd1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgfHwgb3V0SGlnaCAhPSBvdXRIaWdoXG4gICkgcmV0dXJuIE5hTjtcbiAgaWYgKHggPT09IEluZmluaXR5IHx8IHggPT09IC1JbmZpbml0eSkgcmV0dXJuIHg7XG4gIHJldHVybiAoeCAtIGluTG93KSAqIChvdXRIaWdoIC0gb3V0TG93KSAvIChpbkhpZ2ggLSBpbkxvdykgKyBvdXRMb3c7XG59O1xuIiwiLy8gMjAuMi4yLjI4IE1hdGguc2lnbih4KVxubW9kdWxlLmV4cG9ydHMgPSBNYXRoLnNpZ24gfHwgZnVuY3Rpb24gc2lnbih4KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgcmV0dXJuICh4ID0gK3gpID09IDAgfHwgeCAhPSB4ID8geCA6IHggPCAwID8gLTEgOiAxO1xufTtcbiIsInZhciBNRVRBID0gcmVxdWlyZSgnLi9fdWlkJykoJ21ldGEnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHNldERlc2MgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGlkID0gMDtcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIEZSRUVaRSA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xudmFyIHNldE1ldGEgPSBmdW5jdGlvbiAoaXQpIHtcbiAgc2V0RGVzYyhpdCwgTUVUQSwgeyB2YWx1ZToge1xuICAgIGk6ICdPJyArICsraWQsIC8vIG9iamVjdCBJRFxuICAgIHc6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xudmFyIGZhc3RLZXkgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZiAoIWhhcyhpdCwgTUVUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQV0uaTtcbn07XG52YXIgZ2V0V2VhayA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIGlmICghaGFzKGl0LCBNRVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIGhhc2ggd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQV0udztcbn07XG4vLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcbnZhciBvbkZyZWV6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoRlJFRVpFICYmIG1ldGEuTkVFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEEpKSBzZXRNZXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIEtFWTogTUVUQSxcbiAgTkVFRDogZmFsc2UsXG4gIGZhc3RLZXk6IGZhc3RLZXksXG4gIGdldFdlYWs6IGdldFdlYWssXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTtcbiIsInZhciBNYXAgPSByZXF1aXJlKCcuL2VzNi5tYXAnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ21ldGFkYXRhJyk7XG52YXIgc3RvcmUgPSBzaGFyZWQuc3RvcmUgfHwgKHNoYXJlZC5zdG9yZSA9IG5ldyAocmVxdWlyZSgnLi9lczYud2Vhay1tYXAnKSkoKSk7XG5cbnZhciBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwID0gZnVuY3Rpb24gKHRhcmdldCwgdGFyZ2V0S2V5LCBjcmVhdGUpIHtcbiAgdmFyIHRhcmdldE1ldGFkYXRhID0gc3RvcmUuZ2V0KHRhcmdldCk7XG4gIGlmICghdGFyZ2V0TWV0YWRhdGEpIHtcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBzdG9yZS5zZXQodGFyZ2V0LCB0YXJnZXRNZXRhZGF0YSA9IG5ldyBNYXAoKSk7XG4gIH1cbiAgdmFyIGtleU1ldGFkYXRhID0gdGFyZ2V0TWV0YWRhdGEuZ2V0KHRhcmdldEtleSk7XG4gIGlmICgha2V5TWV0YWRhdGEpIHtcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB0YXJnZXRNZXRhZGF0YS5zZXQodGFyZ2V0S2V5LCBrZXlNZXRhZGF0YSA9IG5ldyBNYXAoKSk7XG4gIH0gcmV0dXJuIGtleU1ldGFkYXRhO1xufTtcbnZhciBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gZnVuY3Rpb24gKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gIHZhciBtZXRhZGF0YU1hcCA9IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgZmFsc2UpO1xuICByZXR1cm4gbWV0YWRhdGFNYXAgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogbWV0YWRhdGFNYXAuaGFzKE1ldGFkYXRhS2V5KTtcbn07XG52YXIgb3JkaW5hcnlHZXRPd25NZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTywgUCkge1xuICB2YXIgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIGZhbHNlKTtcbiAgcmV0dXJuIG1ldGFkYXRhTWFwID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBtZXRhZGF0YU1hcC5nZXQoTWV0YWRhdGFLZXkpO1xufTtcbnZhciBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhID0gZnVuY3Rpb24gKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKSB7XG4gIGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgdHJ1ZSkuc2V0KE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlKTtcbn07XG52YXIgb3JkaW5hcnlPd25NZXRhZGF0YUtleXMgPSBmdW5jdGlvbiAodGFyZ2V0LCB0YXJnZXRLZXkpIHtcbiAgdmFyIG1ldGFkYXRhTWFwID0gZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCh0YXJnZXQsIHRhcmdldEtleSwgZmFsc2UpO1xuICB2YXIga2V5cyA9IFtdO1xuICBpZiAobWV0YWRhdGFNYXApIG1ldGFkYXRhTWFwLmZvckVhY2goZnVuY3Rpb24gKF8sIGtleSkgeyBrZXlzLnB1c2goa2V5KTsgfSk7XG4gIHJldHVybi
46184BrZXlzO1xufTtcbnZhciB0b01ldGFLZXkgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiBTdHJpbmcoaXQpO1xufTtcbnZhciBleHAgPSBmdW5jdGlvbiAoTykge1xuICAkZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCBPKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzdG9yZTogc3RvcmUsXG4gIG1hcDogZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCxcbiAgaGFzOiBvcmRpbmFyeUhhc093bk1ldGFkYXRhLFxuICBnZXQ6IG9yZGluYXJ5R2V0T3duTWV0YWRhdGEsXG4gIHNldDogb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSxcbiAga2V5czogb3JkaW5hcnlPd25NZXRhZGF0YUtleXMsXG4gIGtleTogdG9NZXRhS2V5LFxuICBleHA6IGV4cFxufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIE9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcbnZhciBpc05vZGUgPSByZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaGVhZCwgbGFzdCwgbm90aWZ5O1xuXG4gIHZhciBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjt
46184cbiAgICBpZiAoaXNOb2RlICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpIHBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUgKGhlYWQpIHtcbiAgICAgIGZuID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaGVhZCkgbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZiAoaXNOb2RlKSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyLCBleGNlcHQgaU9TIFNhZmFyaSAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgfSBlbHNlIGlmIChPYnNlcnZlciAmJiAhKGdsb2JhbC5uYXZpZ2F0b3IgJiYgZ2xvYmFsLm5hdmlnYXRvci5zdGFuZGFsb25lKSkge1xuICAgIHZhciB0b2dnbGUgPSB0cnVlO1xuICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBPYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7XG4gICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDJcbiAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb21pc2UudGhlbihmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgdmFyIHRhc2sgPSB7IGZuOiBmbiwgbmV4dDogdW5kZWZpbmVkIH07XG4gICAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gICAgaWYgKCFoZWFkKSB7XG4gICAgICBoZWFkID0gdGFzaztcbiAgICAgIG5vdGlmeSgpO1xuICAgIH0gbGFzdCA9IHRhc2s7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjUuNC4xLjUgTmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5cbmZ1bmN0aW9uIFByb21pc2VDYXBhYmlsaXR5KEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIChDKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4yLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSwgLi4uKVxudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUFMgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpO1xudmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgJGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgdmFyIEEgPSB7fTtcbiAgdmFyIEIgPSB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciBTID0gU3ltYm9sKCk7XG4gIHZhciBLID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JztcbiAgQVtTXSA9IDc7XG4gIEsuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGspIHsgQltrXSA9IGs7IH0pO1xuICByZXR1cm4gJGFzc2lnbih7fSwgQSlbU10gIT0gNyB8fCBPYmplY3Qua2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gSztcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDE7XG4gIHZhciBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICB2YXIgaXNFbnVtID0gcElFLmY7XG4gIHdoaWxlIChhTGVuID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IElPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldFN5bWJvbHMgPyBnZXRLZXlzKFMpLmNvbmNhdChnZXRTeW1ib2xzKFMpKSA6IGdldEtleXMoUyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBqID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBqKSBpZiAoaXNFbnVtLmNhbGwoUywga2V5ID0ga2V5c1tqKytdKSkgVFtrZXldID0gU1trZXldO1xuICB9IHJldHVybi
46184BUO1xufSA6ICRhc3NpZ247XG4iLCIvLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGRQcyA9IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcbnZhciBFbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2lmcmFtZScpO1xuICB2YXIgaSA9IGVudW1CdWdLZXlzLmxlbmd0aDtcbiAgdmFyIGx0ID0gJzwnO1xuICB2YXIgZ3QgPSAnPic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlcXVpcmUoJy4vX2h0bWwnKS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG4gIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG4gIC8vIGh0bWwucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShsdCArICdzY3JpcHQnICsgZ3QgKyAnZG9jdW1lbnQuRj1PYmplY3QnICsgbHQgKyAnL3NjcmlwdCcgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZSAoaS0tKSBkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2ldXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHkoKTtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkUHMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBkUCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZFAoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIScpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBQO1xuICB3aGlsZSAobGVuZ3RoID4gaSkgZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgcmV0dXJuIE87XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gRm9yY2VkIHJlcGxhY2VtZW50IHByb3RvdHlwZSBhY2Nlc3NvcnMgbWV0aG9kc1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19saWJyYXJ5JykgfHwgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICB2YXIgSyA9IE1hdGgucmFuZG9tKCk7XG4gIC8vIEluIEZGIHRocm93cyBvbmx5IGRlZmluZSBtZXRob2RzXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZiwgbm8tdXNlbGVzcy1jYWxsXG4gIF9fZGVmaW5lU2V0dGVyX18uY2FsbChudWxsLCBLLCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xuICBkZWxldGUgcmVxdWlyZSgnLi9fZ2xvYmFsJylbS107XG59KTtcbiIsInZhciBwSUUgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgP
46184SByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJyk7XG52YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBnT1BEIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgTyA9IHRvSU9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIGdPUEQoTywgUCk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoaGFzKE8sIFApKSByZXR1cm4gY3JlYXRlRGVzYyghcElFLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59O1xuIiwiLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBnT1BOID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mO1xudmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbnZhciB3aW5kb3dOYW1lcyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzXG4gID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXG52YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ09QTihpdCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gd2luZG93TmFtZXMuc2xpY2UoKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgcmV0dXJuIHdpbmRvd05hbWVzICYmIHRvU3RyaW5nLmNhbGwoaXQpID09ICdbb2JqZWN0IFdpbmRvd10nID8gZ2V0V2luZG93TmFtZXMoaXQpIDogZ09QTih0b0lPYmplY3QoaXQpKTtcbn07XG4iLCIvLyAxOS4xLjIuNyAvIDE1LjIuMy40IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJykuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykge1xuICByZXR1cm4gJGtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuIiwiZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiIsIi8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcbnZhciBPYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIChPKSB7XG4gIE8gPSB0b09iamVjdChPKTtcbiAgaWYgKGhhcyhPLCBJRV9QUk9UTykpIHJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XG59O1xuIiwidmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBhcnJheUluZGV4T2YgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKGZhbHNlKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSU9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgaWYgKGtleSAhPSBJRV9QUk9UTykgaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIiwiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG4iLCIvLyBtb3N0IE9iamVjdCBtZXRob2RzIGJ5IEVTNiBzaG91bGQgYWNjZXB0IHByaW1pdGl2ZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVksIGV4ZWMpIHtcbiAgdmFyIGZuID0gKGNvcmUuT2JqZWN0IHx8IHt9KVtLRVldIHx8IE9iamVjdFtLRVldO1xuICB2YXIgZXhwID0ge307XG4gIGV4cFtLRVldID0gZXhlYyhmbik7XG4gICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkgeyBmbigxKTsgfSksICdPYmplY3QnLCBleHApO1xufTtcbiIsInZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgaXNFbnVtID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpLmY7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpc0VudHJpZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KGl0KTtcbiAgICB2YXIga2V5cyA9IGdldEtleXMoTyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaSkgaWYgKGlzRW51bS5jYWxsKE8sIGtleSA9IGtleXNbaSsrXSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGlzRW50cmllcyA/IFtrZXksIE9ba2V5XV0gOiBPW2tleV0pO1xuICAgIH0gcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn07XG4iLCIvLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJyk7XG52YXIgZ09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBSZWZsZWN0ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuUmVmbGVjdDtcbm1vZHVsZS5leHBvcnRzID0gUmVmbGVjdCAmJi
46184BSZWZsZWN0Lm93bktleXMgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkge1xuICB2YXIga2V5cyA9IGdPUE4uZihhbk9iamVjdChpdCkpO1xuICB2YXIgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgcmV0dXJuIGdldFN5bWJvbHMgPyBrZXlzLmNvbmNhdChnZXRTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiIsInZhciAkcGFyc2VGbG9hdCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLnBhcnNlRmxvYXQ7XG52YXIgJHRyaW0gPSByZXF1aXJlKCcuL19zdHJpbmctdHJpbScpLnRyaW07XG5cbm1vZHVsZS5leHBvcnRzID0gMSAvICRwYXJzZUZsb2F0KHJlcXVpcmUoJy4vX3N0cmluZy13cycpICsgJy0wJykgIT09IC1JbmZpbml0eSA/IGZ1bmN0aW9uIHBhcnNlRmxvYXQoc3RyKSB7XG4gIHZhciBzdHJpbmcgPSAkdHJpbShTdHJpbmcoc3RyKSwgMyk7XG4gIHZhciByZXN1bHQgPSAkcGFyc2VGbG9hdChzdHJpbmcpO1xuICByZXR1cm4gcmVzdWx0ID09PSAwICYmIHN0cmluZy5jaGFyQXQoMCkgPT0gJy0nID8gLTAgOiByZXN1bHQ7XG59IDogJHBhcnNlRmxvYXQ7XG4iLCJ2YXIgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykucGFyc2VJbnQ7XG52YXIgJHRyaW0gPSByZXF1aXJlKCcuL19zdHJpbmctdHJpbScpLnRyaW07XG52YXIgd3MgPSByZXF1aXJlKCcuL19zdHJpbmctd3MnKTtcbnZhciBoZXggPSAvXlstK10/MFt4WF0vO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICRwYXJzZUludCh3cyArICcwOCcpICE9PSA4IHx8ICRwYXJzZUludCh3cyArICcweDE2JykgIT09IDIyID8gZnVuY3Rpb24gcGFyc2VJbnQoc3RyLCByYWRpeCkge1xuICB2YXIgc3RyaW5nID0gJHRyaW0oU3RyaW5nKHN0ciksIDMpO1xuICByZXR1cm4gJHBhcnNlSW50KHN0cmluZywgKHJhZGl4ID4+PiAwKSB8fCAoaGV4LnRlc3Qoc3RyaW5nKSA/IDE2IDogMTApKTtcbn0gOiAkcGFyc2VJbnQ7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHsgZTogZmFsc2UsIHY6IGV4ZWMoKSB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHsgZTogdHJ1ZSwgdjogZSB9O1xuICB9XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQywgeCkge1xuICBhbk9iamVjdChDKTtcbiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iLCJ2YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzcmMsIHNhZmUpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykgcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNyY1trZXldLCBzYWZlKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBTUkMgPSByZXF1aXJlKCcuL191aWQnKSgnc3JjJyk7XG52YXIgJHRvU3RyaW5nID0gcmVxdWlyZSgnLi9fZnVuY3Rpb24tdG8tc3RyaW5nJyk7XG52YXIgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJztcbnZhciBUUEwgPSAoJycgKyAkdG9TdHJpbmcpLnNwbGl0KFRPX1NUUklORyk7XG5cbnJlcXVpcmUoJy4vX2NvcmUnKS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiAkdG9TdHJpbmcuY2FsbChpdCk7XG59O1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWwsIHNhZmUpIHtcbiAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2YgdmFsID09ICdmdW5jdGlvbic7XG4gIGlmIChpc0Z1bmN0aW9uKSBoYXModmFsLCAnbmFtZScpIHx8IGhpZGUodmFsLCAnbmFtZScsIGtleSk7XG4gIGlmIChPW2tleV0gPT09IHZhbCkgcmV0dXJuO1xuICBpZiAoaXNGdW5jdGlvbikgaGFzKHZhbCwgU1JDKSB8fCBoaWRlKHZhbCwgU1JDLCBPW2tleV0gPyAnJyArIE9ba2V5XSA6IFRQTC5qb2luKFN0cmluZyhrZXkpKSk7XG4gIGlmIChPID09PSBnbG9iYWwpIHtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSBpZiAoIXNhZmUpIHtcbiAgICBkZWxldGUgT1trZXldO1xuICAgIGhpZGUoTywga2V5LCB2YWwpO1xuICB9IGVsc2UgaWYgKE9ba2V5XSkge1xuICAgIE9ba2V5XSA9IHZhbDtcbiAgfSBlbHNlIHtcbiAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgfVxuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsIFRPX1NUUklORywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIHRoaXNbU1JDXSB8fCAkdG9TdHJpbmcuY2FsbCh0aGlzKTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciBidWlsdGluRXhlYyA9IFJlZ0V4cC5wcm90b3R5cGUuZXhlYztcblxuIC8vIGBSZWdFeHBFeGVjYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cGV4ZWNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFIsIFMpIHtcbiAgdmFyIGV4ZWMgPSBSLmV4ZWM7XG4gIGlmICh0eXBlb2YgZXhlYyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciByZXN1bHQgPSBleGVjLmNhbGwoUiwgUyk7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWdFeHAgZXhlYyBtZXRob2QgcmV0dXJuZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYW4gT2JqZWN0IG9yIG51bGwnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBpZiAoY2xhc3NvZihSKSAhPT0gJ1JlZ0V4cCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWdFeHAjZXhlYyBjYWxsZWQgb24gaW5jb21wYXRpYmxlIHJlY2VpdmVyJyk7XG4gIH1cbiAgcmV0dXJuIGJ1aWx0aW5FeGVjLmNhbGwoUiwgUyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVnZXhwRmxhZ3MgPSByZXF1aXJlKCcuL19mbGFncycpO1xuXG52YXIgbmF0aXZlRXhlYyA9IFJlZ0V4cC5wcm90b3R5cGUuZXhlYztcbi8vIFRoaXMgYWx3YXlzIHJlZmVycyB0byB0aGUgbmF0aXZlIGltcGxlbWVudGF0aW9uLCBiZWNhdXNlIHRoZVxuLy8gU3RyaW5nI3JlcGxhY2UgcG9seWZpbGwgdXNlcyAuL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMuanMsXG4vLyB3aGljaCBsb2FkcyB0aGlzIGZpbGUgYmVmb3JlIHBhdGNoaW5nIHRoZSBtZXRob2QuXG52YXIgbmF0aXZlUmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcblxudmFyIHBhdGNoZWRFeGVjID0gbmF0aXZlRXhlYztcblxudmFyIExBU1RfSU5ERVggPSAnbGFzdEluZGV4JztcblxudmFyIFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciByZTEgPSAvYS8sXG4gICAgICByZTIgPSAvYiovZztcbiAgbmF0aXZlRXhlYy5jYWxsKHJlMSwgJ2EnKTtcbiAgbmF0aXZlRXhlYy5jYWxsKHJlMiwgJ2EnKTtcbiAgcmV0dXJuIHJlMVtMQVNUX0lOREVYXSAhPT0gMCB8fCByZTJbTEFTVF9JTkRFWF0gIT09IDA7XG59KSgpO1xuXG4vLyBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cCwgY29waWVkIGZyb20gZXM1LXNoaW0ncyBTdHJpbmcjc3BsaXQgcGF0Y2guXG52YXIgTlBDR19JTkNMVURFRCA9IC8oKT8/Ly5leGVjKCcnKVsxXSAhPT0gdW5kZWZpbmVkO1xuXG52YXIgUEFUQ0ggPSBVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcgfHwgTlBDR19JTkNMVURFRDtcblxuaWYgKFBBVENIKSB7XG4gIHBhdGNoZWRFeGVjID0gZnVuY3Rpb24gZXhlYyhzdHIpIHtcbiAgICB2YXIgcmUgPSB0aGlzO1xuICAgIHZhciBsYXN0SW5kZXgsIHJlQ29weSwgbWF0Y2gsIGk7XG5cbiAgICBpZiAoTlBDR19JTkNMVURFRCkge1xuICAgICAgcmVDb3B5ID0gbmV3IFJlZ0V4cCgnXicgKyByZS5zb3VyY2UgKyAnJCg/IVxcXFxzKScsIHJlZ2V4cEZsYWdzLmNhbGwocmUpKTtcbiAgICB9XG4gICAgaWYgKFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORykgbGFzdEluZGV4ID0gcmVbTEFTVF9JTkRFWF07XG5cbiAgICBtYXRjaCA9IG5hdGl2ZUV4ZWMuY2FsbChyZSwgc3RyKTtcblxuICAgIGlmIChVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcgJiYgbWF0Y2gpIHtcbiAgICAgIHJlW0xBU1RfSU5ERVhdID0gcmUuZ2xvYmFsID8gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGggOiBsYXN0SW5kZXg7XG4gICAgfVxuICAgIGlmIChOUENHX0lOQ0xVREVEICYmIG1hdGNoICYmIG1hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIEZpeCBicm93c2VycyB3aG9zZSBgZXhlY2AgbWV0aG9kcyBkb24ndCBjb25zaXN0ZW50bHkgcmV0dXJuIGB1bmRlZmluZWRgXG4gICAgICAvLyBmb3IgTlBDRywgbGlrZSBJRTguIE5PVEU6IFRoaXMgZG9lc24nIHdvcmsgZm9yIC8oLj8pPy9cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb29wLWZ1bmNcbiAgICAgIG5hdGl2ZVJlcGxhY2UuY2FsbChtYXRjaFswXSwgcmVDb3B5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKSBtY
46184XRjaFtpXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoZWRFeGVjO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocmVnRXhwLCByZXBsYWNlKSB7XG4gIHZhciByZXBsYWNlciA9IHJlcGxhY2UgPT09IE9iamVjdChyZXBsYWNlKSA/IGZ1bmN0aW9uIChwYXJ0KSB7XG4gICAgcmV0dXJuIHJlcGxhY2VbcGFydF07XG4gIH0gOiByZXBsYWNlO1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIFN0cmluZyhpdCkucmVwbGFjZShyZWdFeHAsIHJlcGxhY2VyKTtcbiAgfTtcbn07XG4iLCIvLyA3LjIuOSBTYW1lVmFsdWUoeCwgeSlcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmlzIHx8IGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICByZXR1cm4geCA9PT0geSA/IHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5IDogeCAhPSB4ICYmIHkgIT0geTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT0xMRUNUSU9OKSB7XG4gICRleHBvcnQoJGV4cG9ydC5TLCBDT0xMRUNUSU9OLCB7IGZyb206IGZ1bmN0aW9uIGZyb20oc291cmNlIC8qICwgbWFwRm4sIHRoaXNBcmcgKi8pIHtcbiAgICB2YXIgbWFwRm4gPSBhcmd1bWVudHNbMV07XG4gICAgdmFyIG1hcHBpbmcsIEEsIG4sIGNiO1xuICAgIGFGdW5jdGlvbih0aGlzKTtcbiAgICBtYXBwaW5nID0gbWFwRm4gIT09IHVuZGVmaW5lZDtcbiAgICBpZiAobWFwcGluZykgYUZ1bmN0aW9uKG1hcEZuKTtcbiAgICBpZiAoc291cmNlID09IHVuZGVmaW5lZCkgcmV0dXJuIG5ldyB0aGlzKCk7XG4gICAgQSA9IFtdO1xuICAgIGlmIChtYXBwaW5nKSB7XG4gICAgICBuID0gMDtcbiAgICAgIGNiID0gY3R4KG1hcEZuLCBhcmd1bWVudHNbMl0sIDIpO1xuICAgICAgZm9yT2Yoc291cmNlLCBmYWxzZSwgZnVuY3Rpb24gKG5leHRJdGVtKSB7XG4gICAgICAgIEEucHVzaChjYihuZXh0SXRlbSwgbisrKSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yT2Yoc291cmNlLCBmYWxzZSwgQS5wdXNoLCBBKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyB0aGlzKEEpO1xuICB9IH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTExFQ1RJT04pIHtcbiAgJGV4cG9ydCgkZXhwb3J0LlMsIENPTExFQ1RJT04sIHsgb2Y6IGZ1bmN0aW9uIG9mKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBBID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSBBW2xlbmd0aF0gPSBhcmd1bWVudHNbbGVuZ3RoXTtcbiAgICByZXR1cm4gbmV3IHRoaXMoQSk7XG4gIH0gfSk7XG59O1xuIiwiLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBjaGVjayA9IGZ1bmN0aW9uIChPLCBwcm90bykge1xuICBhbk9iamVjdChPKTtcbiAgaWYgKCFpc09iamVjdChwcm90bykgJiYgcHJvdG8gIT09IG51bGwpIHRocm93IFR5cGVFcnJvcihwcm90byArIFwiOiBjYW4ndCBzZXQgYXMgcHJvdG90eXBlIVwiKTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIGZ1bmN0aW9uICh0ZXN0LCBidWdneSwgc2V0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXQgP
46184SByZXF1aXJlKCcuL19jdHgnKShGdW5jdGlvbi5jYWxsLCByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpLmYoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycpLnNldCwgMik7XG4gICAgICAgIHNldCh0ZXN0LCBbXSk7XG4gICAgICAgIGJ1Z2d5ID0gISh0ZXN0IGluc3RhbmNlb2YgQXJyYXkpO1xuICAgICAgfSBjYXRjaCAoZSkgeyBidWdneSA9IHRydWU7IH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgICAgICBjaGVjayhPLCBwcm90byk7XG4gICAgICAgIGlmIChidWdneSkgTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICAgICAgZWxzZSBzZXQoTywgcHJvdG8pO1xuICAgICAgICByZXR1cm4gTztcbiAgICAgIH07XG4gICAgfSh7fSwgZmFsc2UpIDogdW5kZWZpbmVkKSxcbiAgY2hlY2s6IGNoZWNrXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgdmFyIEMgPSBnbG9iYWxbS0VZXTtcbiAgaWYgKERFU0NSSVBUT1JTICYmIEMgJiYgIUNbU1BFQ0lFU10pIGRQLmYoQywgU1BFQ0lFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgfSk7XG59O1xuIiwidmFyIGRlZiA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCB0YWcsIHN0YXQpIHtcbiAgaWYgKGl0ICYmICFoYXMoaXQgPSBzdGF0ID8gaXQgOiBpdC5wcm90b3R5cGUsIFRBRykpIGRlZihpdCwgVEFHLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRhZyB9KTtcbn07XG4iLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ2tleXMnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gdWlkKGtleSkpO1xufTtcbiIsInZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KTtcbn0pKCd2ZXJzaW9ucycsIFtdKS5wdXNoKHtcbiAgdmVyc2lvbjogY29yZS52ZXJzaW9uLFxuICBtb2RlOiByZXF1aXJlKCcuL19saWJyYXJ5JykgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnwqkgMjAxOSBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSdcbn0pO1xuIiwiLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBEKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBhRnVuY3Rpb24oUyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobWV0aG9kLCBhcmcpIHtcbiAgcmV0dXJuICEhbWV0aG9kICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jYWxsXG4gICAgYXJnID8gbWV0aG9kLmNhbGwobnVsbCwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCAxKSA6IG1ldGhvZC5jYWxsKG51bGwpO1xuICB9KTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhhdCwgcG9zKSB7XG4gICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSk7XG4gICAgdmFyIGkgPSB0b0ludGVnZXIocG9zKTtcbiAgICB2YXIgbCA9IHMubGVuZ3RoO1xuICAgIHZhciBhLCBiO1xuICAgIGlmIChpIDwgMCB8fCBpID49IGwpIHJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuIiwiLy8gaGVscGVyIGZvciBTdHJpbmcje3N0YXJ0c1dpdGgsIGVuZHNXaXRoLCBpbmNsdWRlc31cbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4vX2lzLXJlZ2V4cCcpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRoYXQsIHNlYXJjaFN0cmluZywgTkFNRSkge1xuICBpZiAoaXNSZWdFeHAoc2VhcmNoU3RyaW5nKSkgdGhyb3cgVHlwZUVycm9yKCdTdHJpbmcjJyArIE5BTUUgKyBcIiBkb2Vzbid0IGFjY2VwdCByZWdleCFcIik7XG4gIHJldHVybi
46184BTdHJpbmcoZGVmaW5lZCh0aGF0KSk7XG59O1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciBxdW90ID0gL1wiL2c7XG4vLyBCLjIuMy4yLjEgQ3JlYXRlSFRNTChzdHJpbmcsIHRhZywgYXR0cmlidXRlLCB2YWx1ZSlcbnZhciBjcmVhdGVIVE1MID0gZnVuY3Rpb24gKHN0cmluZywgdGFnLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gIHZhciBTID0gU3RyaW5nKGRlZmluZWQoc3RyaW5nKSk7XG4gIHZhciBwMSA9ICc8JyArIHRhZztcbiAgaWYgKGF0dHJpYnV0ZSAhPT0gJycpIHAxICs9ICcgJyArIGF0dHJpYnV0ZSArICc9XCInICsgU3RyaW5nKHZhbHVlKS5yZXBsYWNlKHF1b3QsICcmcXVvdDsnKSArICdcIic7XG4gIHJldHVybiBwMSArICc+JyArIFMgKyAnPC8nICsgdGFnICsgJz4nO1xufTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUsIGV4ZWMpIHtcbiAgdmFyIE8gPSB7fTtcbiAgT1tOQU1FXSA9IGV4ZWMoY3JlYXRlSFRNTCk7XG4gICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciB0ZXN0ID0gJydbTkFNRV0oJ1wiJyk7XG4gICAgcmV0dXJuIHRlc3QgIT09IHRlc3QudG9Mb3dlckNhc2UoKSB8fCB0ZXN0LnNwbGl0KCdcIicpLmxlbmd0aCA+IDM7XG4gIH0pLCAnU3RyaW5nJywgTyk7XG59O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc3RyaW5nLXBhZC1zdGFydC1lbmRcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIHJlcGVhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1yZXBlYXQnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcsIGxlZnQpIHtcbiAgdmFyIFMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSk7XG4gIHZhciBzdHJpbmdMZW5ndGggPSBTLmxlbmd0aDtcbiAgdmFyIGZpbGxTdHIgPSBmaWxsU3RyaW5nID09PSB1bmRlZmluZWQgPyAnICcgOiBTdHJpbmcoZmlsbFN0cmluZyk7XG4gIHZhciBpbnRNYXhMZW5ndGggPSB0b0xlbmd0aChtYXhMZW5ndGgpO1xuICBpZiAoaW50TWF4TGVuZ3RoIDw9IHN0cmluZ0xlbmd0aCB8fCBmaWxsU3RyID09ICcnKSByZXR1cm4gUztcbiAgdmFyIGZpbGxMZW4gPSBpbnRNYXhMZW5ndGggLSBzdHJpbmdMZW5ndGg7XG4gIHZhciBzdHJpbmdGaWxsZXIgPSByZXBlYXQuY2FsbChmaWxsU3RyLCBNYXRoLmNlaWwoZmlsbExlbiAvIGZpbGxTdHIubGVuZ3RoKSk7XG4gIGlmIChzdHJpbmdGaWxsZXIubGVuZ3RoID4gZmlsbExlbikgc3RyaW5nRmlsbGVyID0gc3RyaW5nRmlsbGVyLnNsaWNlKDAsIGZpbGxMZW4pO1xuICByZXR1cm4gbGVmdCA/IHN0cmluZ0ZpbGxlciArIFMgOiBTICsgc3RyaW5nRmlsbGVyO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZXBlYXQoY291bnQpIHtcbiAgdmFyIHN0ciA9IFN0cmluZyhkZWZpbmVkKHRoaXMpKTtcbiAgdmFyIHJlcyA9ICcnO1xuICB2YXIgbiA9IHRvSW50ZWdlcihjb3VudCk7XG4gIGlmIChuIDwgMCB8fCBuID09IEluZmluaXR5KSB0aHJvdyBSYW5nZUVycm9yKFwiQ291bnQgY2FuJ3QgYmUgbmVnYXRpdmVcIik7XG4gIGZvciAoO24gPiAwOyAobiA+Pj49IDEpICYmIChzdHIgKz0gc3RyKSkgaWYgKG4gJiAxKSByZXMgKz0gc3RyO1xuICByZXR1cm4gcmVzO1xufTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgc3BhY2VzID0gcmVxdWlyZSgnLi9fc3RyaW5nLXdzJyk7XG52YXIgc3BhY2UgPSAnWycgKyBzcGFjZXMgKyAnXSc7XG52YXIgbm9uID0gJ1xcdTIwMGJcXHUwMDg1JztcbnZhciBsdHJpbSA9IFJlZ0V4cCgnXicgKyBzcGFjZSArIHNwYWNlICsgJyonKTtcbnZhciBydHJpbSA9IFJlZ0V4cChzcGFjZSArIHNwYWNlICsgJyokJyk7XG5cbnZhciBleHBvcnRlciA9IGZ1bmN0aW9uIChLRVksIGV4ZWMsIEFMSUFTKSB7XG4gIHZhciBleHAgPSB7fTtcbiAgdmFyIEZPUkNFID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXNwYWNlc1tLRVldKCkgfHwgbm9uW0tFWV0oKSAhPSBub247XG4gIH0pO1xuICB2YXIgZm4gPSBleHBbS0VZXSA9IEZPUkNFID8gZXhlYyh0cmltKSA6IHNwYWNlc1tLRVldO1xuICBpZiAoQUxJQVMpIGV4cFtBTElBU10gPSBmbjtcbiAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBGT1JDRSwgJ1N0cmluZycsIGV4cCk7XG59O1xuXG4vLyAxIC0+IFN0cmluZyN0cmltTGVmdFxuLy8gMiAtPiBTdHJpbmcjdHJpbVJpZ2h0XG4vLyAzIC0+IFN0cmluZyN0cmltXG52YXIgdHJpbSA9IGV4cG9ydGVyLnRyaW0gPSBmdW5jdGlvbiAoc3RyaW5nLCBUWVBFKSB7XG4gIHN0cmluZyA9IFN0cmluZyhkZWZpbmVkKHN0cmluZykpO1xuICBpZiAoVFlQRSAmIDEpIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGx0cmltLCAnJyk7XG4gIGlmIChUWVBFICYgMikgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocnRyaW0sICcnKTtcbiAgcmV0dXJuIHN0cmluZztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0ZXI7XG4iLCJtb2R1bGUuZXhwb3J0cyA9ICdcXHgwOVxceDBBXFx4MEJcXHgwQ1xceDBEXFx4MjBcXHhBMFxcdTE2ODBcXHUxODBFXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwMycgK1xuICAnXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG4iLCJ2YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgaW52b2tlID0gcmVxdWlyZSgnLi9faW52b2tlJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4vX2h0bWwnKTtcbnZhciBjZWwgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHNldFRhc2sgPSBnbG9iYWwuc2V0SW1tZWRpYXRlO1xudmFyIGNsZWFyVGFzayA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbDtcbnZhciBEaXNwYXRjaCA9IGdsb2JhbC5EaXNwYXRjaDtcbnZhciBjb3VudGVyID0gMDtcbnZhciBx
46184dWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xudmFyIHJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGlkID0gK3RoaXM7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgaWYgKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuLmNhbGwoZXZlbnQuZGF0YSk7XG59O1xuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXRUYXNrIHx8ICFjbGVhclRhc2spIHtcbiAgc2V0VGFzayA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGkgPSAxO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICBpbnZva2UodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXJUYXNrID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYgKHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gU3BoZXJlIChKUyBnYW1lIGVuZ2luZSkgRGlzcGF0Y2ggQVBJXG4gIH0gZWxzZSBpZiAoRGlzcGF0Y2ggJiYgRGlzcGF0Y2gubm93KSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIERpc3BhdGNoLm5vdyhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCkge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gY3R4KHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsICcqJyk7XG4gICAgfTtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY2VsKCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNlbCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bi5jYWxsKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChjdHgocnVuLCBpZCwgMSksIDApO1xuICAgIH07XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldFRhc2ssXG4gIGNsZWFyOiBjbGVhclRhc2tcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTtcbiIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvaW5kZXhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgdmFyIG51bWJlciA9IHRvSW50ZWdlcihpdCk7XG4gIHZhciBsZW5ndGggPSB0b0xlbmd0aChudW1iZXIpO1xuICBpZiAobnVtYmVyICE9PSBsZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIGxlbmd0aCEnKTtcbiAgcmV0dXJuIGxlbmd0aDtcbn07XG4iLCIvLyA3LjEuNCBUb0ludGVnZXJcbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xufTtcbiIsIi8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybi
46184BJT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG4iLCIvLyA3LjEuMTUgVG9MZW5ndGhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcbiIsIi8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG59O1xuIiwiLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFMpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiBpdDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuaWYgKHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykpIHtcbiAgdmFyIExJQlJBUlkgPSByZXF1aXJlKCcuL19saWJyYXJ5Jyk7XG4gIHZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbiAgdmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbiAgdmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiAgdmFyICR0eXBlZCA9IHJlcXVpcmUoJy4vX3R5cGVkJyk7XG4gIHZhciAkYnVmZmVyID0gcmVxdWlyZSgnLi9fdHlwZWQtYnVmZmVyJyk7XG4gIHZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbiAgdmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xuICB2YXIgcHJvcGVydHlEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xuICB2YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbiAgdmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJyk7XG4gIHZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG4gIHZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xuICB2YXIgdG9JbmRleCA9IHJlcXVpcmUoJy4vX3RvLWluZGV4Jyk7XG4gIHZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xuICB2YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbiAgdmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xuICB2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbiAgdmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4gIHZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xuICB2YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG4gIHZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG4gIHZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbiAgdmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG4gIHZhciBnZXRJdGVyRm4gPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuICB2YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG4gIHZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcbiAgdmFyIGNyZWF0ZUFycmF5TWV0aG9kID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpO1xuICB2YXIgY3JlYXRlQXJyYXlJbmNsdWRlcyA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJyk7XG4gIHZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG4gIHZhciBBcnJheUl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG4gIHZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbiAgdmFyICRpdGVyRGV0ZWN0ID0gcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKTtcbiAgdmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuL19zZXQtc3BlY2llcycpO1xuICB2YXIgYXJyYXlGaWxsID0gcmVxdWlyZSgnLi9fYXJyYXktZmlsbCcpO1xuICB2YXIgYXJyYXlDb3B5V2l0aGluID0gcmVxdWlyZSgnLi9fYXJyYXktY29weS13aXRoaW4nKTtcbiAgdmFyICREUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xuICB2YXIgJEdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xuICB2YXIgZFAgPSAkRFAuZjtcbiAgdmFyIGdPUEQgPSAkR09QRC5mO1xuICB2YXIgUmFuZ2VFcnJvciA9IGdsb2JhbC5SYW5nZUVycm9yO1xuICB2YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbiAgdmFyIFVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheTtcbiAgdmFyIEFSUkFZX0JVRkZFUiA9ICdBcnJheUJ1ZmZlcic7XG4gIHZhciBTSEFSRURfQlVGRkVSID0gJ1NoYXJlZCcgKyBBUlJBWV9CVUZGRVI7XG4gIHZhciBCWVRFU19QRVJfRUxFTUVOVCA9ICdCWVRFU19QRVJfRUxFTUVOVCc7XG4gIHZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbiAgdmFyIEFycmF
461845UHJvdG8gPSBBcnJheVtQUk9UT1RZUEVdO1xuICB2YXIgJEFycmF5QnVmZmVyID0gJGJ1ZmZlci5BcnJheUJ1ZmZlcjtcbiAgdmFyICREYXRhVmlldyA9ICRidWZmZXIuRGF0YVZpZXc7XG4gIHZhciBhcnJheUZvckVhY2ggPSBjcmVhdGVBcnJheU1ldGhvZCgwKTtcbiAgdmFyIGFycmF5RmlsdGVyID0gY3JlYXRlQXJyYXlNZXRob2QoMik7XG4gIHZhciBhcnJheVNvbWUgPSBjcmVhdGVBcnJheU1ldGhvZCgzKTtcbiAgdmFyIGFycmF5RXZlcnkgPSBjcmVhdGVBcnJheU1ldGhvZCg0KTtcbiAgdmFyIGFycmF5RmluZCA9IGNyZWF0ZUFycmF5TWV0aG9kKDUpO1xuICB2YXIgYXJyYXlGaW5kSW5kZXggPSBjcmVhdGVBcnJheU1ldGhvZCg2KTtcbiAgdmFyIGFycmF5SW5jbHVkZXMgPSBjcmVhdGVBcnJheUluY2x1ZGVzKHRydWUpO1xuICB2YXIgYXJyYXlJbmRleE9mID0gY3JlYXRlQXJyYXlJbmNsdWRlcyhmYWxzZSk7XG4gIHZhciBhcnJheVZhbHVlcyA9IEFycmF5SXRlcmF0b3JzLnZhbHVlcztcbiAgdmFyIGFycmF5S2V5cyA9IEFycmF5SXRlcmF0b3JzLmtleXM7XG4gIHZhciBhcnJheUVudHJpZXMgPSBBcnJheUl0ZXJhdG9ycy5lbnRyaWVzO1xuICB2YXIgYXJyYXlMYXN0SW5kZXhPZiA9IEFycmF5UHJvdG8ubGFzdEluZGV4T2Y7XG4gIHZhciBhcnJheVJlZHVjZSA9IEFycmF5UHJvdG8ucmVkdWNlO1xuICB2YXIgYXJyYXlSZWR1Y2VSaWdodCA9IEFycmF5UHJvdG8ucmVkdWNlUmlnaHQ7XG4gIHZhciBhcnJheUpvaW4gPSBBcnJheVByb3RvLmpvaW47XG4gIHZhciBhcnJheVNvcnQgPSBBcnJheVByb3RvLnNvcnQ7XG4gIHZhciBhcnJheVNsaWNlID0gQXJyYXlQcm90by5zbGljZTtcbiAgdmFyIGFycmF5VG9TdHJpbmcgPSBBcnJheVByb3RvLnRvU3RyaW5nO1xuICB2YXIgYXJyYXlUb0xvY2FsZVN0cmluZyA9IEFycmF5UHJvdG8udG9Mb2NhbGVTdHJpbmc7XG4gIHZhciBJVEVSQVRPUiA9IHdrcygnaXRlcmF0b3InKTtcbiAgdmFyIFRBRyA9IHdrcygndG9TdHJpbmdUYWcnKTtcbiAgdmFyIFRZUEVEX0NPTlNUUlVDVE9SID0gdWlkKCd0eXBlZF9jb25zdHJ1Y3RvcicpO1xuICB2YXIgREVGX0NPTlNUUlVDVE9SID0gdWlkKCdkZWZfY29uc3RydWN0b3InKTtcbiAgdmFyIEFMTF9DT05TVFJVQ1RPUlMgPSAkdHlwZWQuQ09OU1RSO1xuICB2YXIgVFlQRURfQVJSQVkgPSAkdHlwZWQuVFlQRUQ7XG4gIHZhciBWSUVXID0gJHR5cGVkLlZJRVc7XG4gIHZhciBXUk9OR19MRU5HVEggPSAnV3JvbmcgbGVuZ3RoISc7XG5cbiAgdmFyICRtYXAgPSBjcmVhdGVBcnJheU1ldGhvZCgxLCBmdW5jdGlvbiAoTywgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFsbG9jYXRlKHNwZWNpZXNDb25zdHJ1Y3RvcihPLCBPW0RFRl9DT05TVFJVQ1RPUl0pLCBsZW5ndGgpO1xuICB9KTtcblxuICB2YXIgTElUVExFX0VORElBTiA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobmV3IFVpbnQxNkFycmF
461845KFsxXSkuYnVmZmVyKVswXSA9PT0gMTtcbiAgfSk7XG5cbiAgdmFyIEZPUkNFRF9TRVQgPSAhIVVpbnQ4QXJyYXkgJiYgISFVaW50OEFycmF5W1BST1RPVFlQRV0uc2V0ICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICBuZXcgVWludDhBcnJheSgxKS5zZXQoe30pO1xuICB9KTtcblxuICB2YXIgdG9PZmZzZXQgPSBmdW5jdGlvbiAoaXQsIEJZVEVTKSB7XG4gICAgdmFyIG9mZnNldCA9IHRvSW50ZWdlcihpdCk7XG4gICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICUgQllURVMpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG9mZnNldCEnKTtcbiAgICByZXR1cm4gb2Zmc2V0O1xuICB9O1xuXG4gIHZhciB2YWxpZGF0ZSA9IGZ1bmN0aW9uIChpdCkge1xuICAgIGlmIChpc09iamVjdChpdCkgJiYgVFlQRURfQVJSQVkgaW4gaXQpIHJldHVybiBpdDtcbiAgICB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIHR5cGVkIGFycmF5IScpO1xuICB9O1xuXG4gIHZhciBhbGxvY2F0ZSA9IGZ1bmN0aW9uIChDLCBsZW5ndGgpIHtcbiAgICBpZiAoIShpc09iamVjdChDKSAmJiBUWVBFRF9DT05TVFJVQ1RPUiBpbiBDKSkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdJdCBpcyBub3QgYSB0eXBlZCBhcnJheSBjb25zdHJ1Y3RvciEnKTtcbiAgICB9IHJldHVybiBuZXcgQyhsZW5ndGgpO1xuICB9O1xuXG4gIHZhciBzcGVjaWVzRnJvbUxpc3QgPSBmdW5jdGlvbiAoTywgbGlzdCkge1xuICAgIHJldHVybiBmcm9tTGlzdChzcGVjaWVzQ29uc3RydWN0b3IoTywgT1tERUZfQ09OU1RSVUNUT1JdKSwgbGlzdCk7XG4gIH07XG5cbiAgdmFyIGZyb21MaXN0ID0gZnVuY3Rpb24gKEMsIGxpc3QpIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgICB2YXIgcmVzdWx0ID0gYWxsb2NhdGUoQywgbGVuZ3RoKTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHJlc3VsdFtpbmRleF0gPSBsaXN0W2luZGV4KytdO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgdmFyIGFkZEdldHRlciA9IGZ1bmN0aW9uIChpdCwga2V5LCBpbnRlcm5hbCkge1xuICAgIGRQKGl0LCBrZXksIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kW2ludGVybmFsXTsgfSB9KTtcbiAgfTtcblxuICB2YXIgJGZyb20gPSBmdW5jdGlvbiBmcm9tKHNvdXJjZSAvKiAsIG1hcGZuLCB0aGlzQXJnICovKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdChzb3VyY2UpO1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgbWFwZm4gPSBhTGVuID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gICAgdmFyIGl0ZXJGbiA9IGdldEl0ZXJGbihPKTtcbiAgICB2YXIgaSwgbGVuZ3RoLCB2YWx1ZXMsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3I7XG4gICAgaWYgKGl0ZXJGbiAhPSB1bmRlZmluZWQgJiYgIWlzQXJyYXlJdGVyKGl0ZXJGbikpIHtcbiAgICAgIGZvciAoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChPKSwgdmFsdWVzID0gW10sIGkgPSAwOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGkrKykge1xuICAgICAgICB2YWx1ZXMucHVzaChzdGVwLnZhbHVlKTtcbiAgICAgIH0gTyA9IHZhbHVlcztcbiAgICB9XG4gICAgaWYgKG1hcHBpbmcgJiYgYUxlbiA+IDIpIG1hcGZuID0gY3R4KG1hcGZuLCBhcmd1bWVudHNbMl0sIDIpO1xuICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKSwgcmVzdWx0ID0gYWxsb2NhdGUodGhpcywgbGVuZ3RoKTsgbGVuZ3RoID4gaTsgaSsrKSB7XG4gICAgICByZXN1bHRbaV0gPSBtYXBwaW5nID8gbWFwZm4oT1tpXSwgaSkgOiBPW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHZhciAkb2YgPSBmdW5jdGlvbiBvZigvKiAuLi5pdGVtcyAqLykge1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIHJlc3VsdCA9IGFsbG9jYXRlKHRoaXMsIGxlbmd0aCk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSByZXN1bHRbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4KytdO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gaU9TIFNhZmFyaSA2LnggZmFpbHMgaGVyZVxuICB2YXIgVE9fTE9DQUxFX0JVRyA9ICEhVWludDhBcnJheSAmJiBmYWlscyhmdW5jdGlvbiAoKSB7IGFycmF5VG9Mb2NhbGVTdHJpbmcuY2FsbChuZXcgVWludDhBcnJheSgxKSk7IH0pO1xuXG4gIHZhciAkdG9Mb2NhbGVTdHJpbmcgPSBmdW5jdGlvbiB0b0xvY2FsZVN0cmluZygpIHtcbiAgICByZXR1cm4gYXJyYXlUb0xvY2FsZVN0cmluZy5hcHBseShUT19MT0NBTEVfQlVHID8gYXJyYXlTbGljZS5jYWxsKHZhbGlkYXRlKHRoaXMpKSA6IHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICB9O1xuXG4gIHZhciBwcm90byA9IHtcbiAgICBjb3B5V2l0aGluOiBmdW5jdGlvbiBjb3B5V2l0aGluKHRhcmdldCwgc3RhcnQgLyogLCBlbmQgKi8pIHtcbiAgICAgIHJldHVybiBhcnJheUNvcHlXaXRoaW4uY2FsbCh2YWxpZGF0ZSh0aGlzKSwgdGFyZ2V0LCBzdGFydCwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlFdmVyeSh2YWxpZGF0ZSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgZmlsbDogZnVuY3Rpb24gZmlsbCh2YWx1ZSAvKiAsIHN0YXJ0LCBlbmQgKi8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5RmlsbC5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgICByZXR1cm4gc3BlY2llc0Zyb21MaXN0KHRoaXMsIGFycmF5RmlsdGVyKHZhbGlkYXRlKHRoaXMpLCBjYWxsYmFja2ZuLFxuICAgICAgICBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCkpO1xuICAgIH0sXG4gICAgZmluZDogZnVuY3Rpb24gZmluZChwcmVkaWNhdGUgLyogLCB0aGlzQXJnICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlGaW5kKHZhbGlkYXRlKHRoaXMpLCBwcmVkaWNhdGUsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGZpbmRJbmRleDogZnVuY3Rpb24gZmluZEluZGV4KHByZWRpY2F0ZSAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybi
46184BhcnJheUZpbmRJbmRleCh2YWxpZGF0ZSh0aGlzKSwgcHJlZGljYXRlLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgICBhcnJheUZvckVhY2godmFsaWRhdGUodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGluZGV4T2Y6IGZ1bmN0aW9uIGluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCAqLykge1xuICAgICAgcmV0dXJuIGFycmF5SW5kZXhPZih2YWxpZGF0ZSh0aGlzKSwgc2VhcmNoRWxlbWVudCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggKi8pIHtcbiAgICAgIHJldHVybiBhcnJheUluY2x1ZGVzKHZhbGlkYXRlKHRoaXMpLCBzZWFyY2hFbGVtZW50LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBqb2luOiBmdW5jdGlvbiBqb2luKHNlcGFyYXRvcikgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlKb2luLmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgbGFzdEluZGV4T2Y6IGZ1bmN0aW9uIGxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggKi8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5TGFzdEluZGV4T2YuYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBtYXA6IGZ1bmN0aW9uIG1hcChtYXBmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybiAkbWFwKHZhbGlkYXRlKHRoaXMpLCBtYXBmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlSZWR1Y2UuYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICByZWR1Y2VSaWdodDogZnVuY3Rpb24gcmVkdWNlUmlnaHQoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlSZWR1Y2VSaWdodC5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHJldmVyc2U6IGZ1bmN0aW9uIHJldmVyc2UoKSB7XG4gICAgICB2Y
46184XIgdGhhdCA9IHRoaXM7XG4gICAgICB2YXIgbGVuZ3RoID0gdmFsaWRhdGUodGhhdCkubGVuZ3RoO1xuICAgICAgdmFyIG1pZGRsZSA9IE1hdGguZmxvb3IobGVuZ3RoIC8gMik7XG4gICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgdmFyIHZhbHVlO1xuICAgICAgd2hpbGUgKGluZGV4IDwgbWlkZGxlKSB7XG4gICAgICAgIHZhbHVlID0gdGhhdFtpbmRleF07XG4gICAgICAgIHRoYXRbaW5kZXgrK10gPSB0aGF0Wy0tbGVuZ3RoXTtcbiAgICAgICAgdGhhdFtsZW5ndGhdID0gdmFsdWU7XG4gICAgICB9IHJldHVybiB0aGF0O1xuICAgIH0sXG4gICAgc29tZTogZnVuY3Rpb24gc29tZShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuIGFycmF5U29tZSh2YWxpZGF0ZSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgc29ydDogZnVuY3Rpb24gc29ydChjb21wYXJlZm4pIHtcbiAgICAgIHJldHVybiBhcnJheVNvcnQuY2FsbCh2YWxpZGF0ZSh0aGlzKSwgY29tcGFyZWZuKTtcbiAgICB9LFxuICAgIHN1YmFycmF5OiBmdW5jdGlvbiBzdWJhcnJheShiZWdpbiwgZW5kKSB7XG4gICAgICB2YXIgTyA9IHZhbGlkYXRlKHRoaXMpO1xuICAgICAgdmFyIGxlbmd0aCA9IE8ubGVuZ3RoO1xuICAgICAgdmFyICRiZWdpbiA9IHRvQWJzb2x1dGVJbmRleChiZWdpbiwgbGVuZ3RoKTtcbiAgICAgIHJldHVybiBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihPLCBPW0RFRl9DT05TVFJVQ1RPUl0pKShcbiAgICAgICAgTy5idWZmZXIsXG4gICAgICAgIE8uYnl0ZU9mZnNldCArICRiZWdpbiAqIE8uQllURVNfUEVSX0VMRU1FTlQsXG4gICAgICAgIHRvTGVuZ3RoKChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvQWJzb2x1dGVJbmRleChlbmQsIGxlbmd0aCkpIC0gJGJlZ2luKVxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyICRzbGljZSA9IGZ1bmN0aW9uIHNsaWNlKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gc3BlY2llc0Zyb21MaXN0KHRoaXMsIGFycmF5U2xpY2UuY2FsbCh2YWxpZGF0ZSh0aGlzKSwgc3RhcnQsIGVuZCkpO1xuICB9O1xuXG4gIHZhciAkc2V0ID0gZnVuY3Rpb24gc2V0KGFycmF5TGlrZSAvKiAsIG9mZnNldCAqLykge1xuICAgIHZhbGlkYXRlKHRoaXMpO1xuICAgIHZhciBvZmZzZXQgPSB0b09mZnNldChhcmd1bWVudHNbMV0sIDEpO1xuICAgIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICB2YXIgc3JjID0gdG9PYmplY3QoYXJyYXlMaWtlKTtcbiAgICB2YXIgbGVuID0gdG9MZW5ndGgoc3JjLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBpZiAobGVuICsgb2Zmc2V0ID4gbGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgd2hpbGUgKGluZGV4IDwgbGVuKSB0aGlzW29mZnNldCArIGluZGV4XSA9IHNyY1tpbmRleCsrXTtcbiAgfTtcblxuICB2YXIgJGl0ZXJhdG9ycyA9IHtcbiAgICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKCkge1xuICAgICAgcmV0dXJuIGFycmF5RW50cmllcy5jYWxsKHZhbGlkYXRlKHRoaXMpKTtcbiAgICB9LFxuICAgIGtleXM6IGZ1bmN0aW9uIGtleXMoKSB7XG4gICAgICByZXR1cm4gYXJyYXlLZXlzLmNhbGwodmFsaWRhdGUodGhpcykpO1xuICAgIH0sXG4gICAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoKSB7XG4gICAgICByZXR1cm4gYXJyYXlWYWx1ZXMuY2FsbCh2YWxpZGF0ZSh0aGlzKSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBpc1RBSW5kZXggPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHtcbiAgICByZXR1cm4gaXNPYmplY3QodGFyZ2V0KVxuICAgICAgJiYgdGFyZ2V0W1RZUEVEX0FSUkFZXVxuICAgICAgJiYgdHlwZW9mIGtleSAhPSAnc3ltYm9sJ1xuICAgICAgJiYga2V5IGluIHRhcmdldFxuICAgICAgJiYgU3RyaW5nKCtrZXkpID09IFN0cmluZyhrZXkpO1xuICB9O1xuICB2YXIgJGdldERlc2MgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIHtcbiAgICByZXR1cm4gaXNUQUluZGV4KHRhcmdldCwga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSlcbiAgICAgID8gcHJvcGVydHlEZXNjKDIsIHRhcmdldFtrZXldKVxuICAgICAgOiBnT1BEKHRhcmdldCwga2V5KTtcbiAgfTtcbiAgdmFyICRzZXREZXNjID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgICBpZiAoaXNUQUluZGV4KHRhcmdldCwga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSlcbiAgICAgICYmIGlzT2JqZWN0KGRlc2MpXG4gICAgICAmJiBoYXMoZGVzYywgJ3ZhbHVlJylcbiAgICAgICYmICFoYXMoZGVzYywgJ2dldCcpXG4gICAgICAmJiAhaGFzKGRlc2MsICdzZXQnKVxuICAgICAgLy8gVE9ETzogYWRkIHZhbGlkYXRpb24gZGVzY3JpcHRvciB3L28gY2FsbGluZyBhY2Nlc3NvcnNcbiAgICAgICYmICFkZXNjLmNvbmZpZ3VyYWJsZVxuICAgICAgJiYgKCFoYXMoZGVzYywgJ3dyaXRhYmxlJykgfHwgZGVzYy53cml0YWJsZSlcbiAgICAgICYmICghaGFzKGRlc2MsICdlbnVtZXJhYmxlJykgfHwgZGVzYy5lbnVtZXJhYmxlKVxuICAgICkge1xuICAgICAgdGFyZ2V0W2tleV0gPSBkZXNjLnZhbHVlO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IHJldHVybiBkUCh0YXJnZXQsIGtleSwgZGVzYyk7XG4gIH07XG5cbiAgaWYgKCFBTExfQ09OU1RSVUNUT1JTKSB7XG4gICAgJEdPUEQuZiA9ICRnZXREZXNjO1xuICAgICREUC5mID0gJHNldERlc2M7XG4gIH1cblxuICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFBTExfQ09OU1RSVUNUT1JTLCAnT2JqZWN0Jywge1xuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldERlc2MsXG4gICAgZGVmaW5lUHJvcGVydHk6ICRzZXREZXNjXG4gIH0pO1xuXG4gIGlmIChmYWlscyhmdW5jdGlvbiAoKSB7IGFycmF5VG9TdHJpbmcuY2FsbCh7fSk7IH0pKSB7XG4gICAgYXJyYXlUb1N0cmluZyA9IGFycmF5VG9Mb2NhbGVTdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybi
46184BhcnJheUpvaW4uY2FsbCh0aGlzKTtcbiAgICB9O1xuICB9XG5cbiAgdmFyICRUeXBlZEFycmF5UHJvdG90eXBlJCA9IHJlZGVmaW5lQWxsKHt9LCBwcm90byk7XG4gIHJlZGVmaW5lQWxsKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJGl0ZXJhdG9ycyk7XG4gIGhpZGUoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCBJVEVSQVRPUiwgJGl0ZXJhdG9ycy52YWx1ZXMpO1xuICByZWRlZmluZUFsbCgkVHlwZWRBcnJheVByb3RvdHlwZSQsIHtcbiAgICBzbGljZTogJHNsaWNlLFxuICAgIHNldDogJHNldCxcbiAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24gKCkgeyAvKiBub29wICovIH0sXG4gICAgdG9TdHJpbmc6IGFycmF5VG9TdHJpbmcsXG4gICAgdG9Mb2NhbGVTdHJpbmc6ICR0b0xvY2FsZVN0cmluZ1xuICB9KTtcbiAgYWRkR2V0dGVyKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJ2J1ZmZlcicsICdiJyk7XG4gIGFkZEdldHRlcigkVHlwZWRBcnJheVByb3RvdHlwZSQsICdieXRlT2Zmc2V0JywgJ28nKTtcbiAgYWRkR2V0dGVyKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJ2J5dGVMZW5ndGgnLCAnbCcpO1xuICBhZGRHZXR0ZXIoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAnbGVuZ3RoJywgJ2UnKTtcbiAgZFAoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCBUQUcsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXNbVFlQRURfQVJSQVldOyB9XG4gIH0pO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50c1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVksIEJZVEVTLCB3cmFwcGVyLCBDTEFNUEVEKSB7XG4gICAgQ0xBTVBFRCA9ICEhQ0xBTVBFRDtcbiAgICB2YXIgTkFNRSA9IEtFWSArIChDTEFNUEVEID8gJ0NsYW1wZWQnIDogJycpICsgJ0FycmF5JztcbiAgICB2YXIgR0VUVEVSID0gJ2dldCcgKyBLRVk7XG4gICAgdmFyIFNFVFRFUiA9ICdzZXQnICsgS0VZO1xuICAgIHZhciBUeXBlZEFycmF5ID0gZ2xvYmFsW05BTUVdO1xuICAgIHZhciBCYXNlID0gVHlwZWRBcnJheSB8fCB7fTtcbiAgICB2YXIgVEFDID0gVHlwZWRBcnJheSAmJiBnZXRQcm90b3R5cGVPZihUeXBlZEFycmF5KTtcbiAgICB2YXIgRk9SQ0VEID0gIVR5cGVkQXJyYXkgfHwgISR0eXBlZC5BQlY7XG4gICAgdmFyIE8gPSB7fTtcbiAgICB2YXIgVHlwZWRBcnJheVByb3RvdHlwZSA9IFR5cGVkQXJyYXkgJiYgVHlwZWRBcnJheVtQUk9UT1RZUEVdO1xuICAgIHZhciBnZXR0ZXIgPSBmdW5jdGlvbiAodGhhdCwgaW5kZXgpIHtcbiAgICAgIHZhciBkYXRhID0gdGhhdC5fZDtcbiAgICAgIHJldHVybiBkYXRhLnZbR0VUVEVSXShpbmRleCAqIEJZVEVTICsgZGF0YS5vLCBMSVRUTEVfRU5ESUFOKTtcbiAgICB9O1xuICAgIHZhciBzZXR0ZXIgPSBmdW5jdGlvbiAodGhhdCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICB2Y
46184XIgZGF0YSA9IHRoYXQuX2Q7XG4gICAgICBpZiAoQ0xBTVBFRCkgdmFsdWUgPSAodmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlKSkgPCAwID8gMCA6IHZhbHVlID4gMHhmZiA/IDB4ZmYgOiB2YWx1ZSAmIDB4ZmY7XG4gICAgICBkYXRhLnZbU0VUVEVSXShpbmRleCAqIEJZVEVTICsgZGF0YS5vLCB2YWx1ZSwgTElUVExFX0VORElBTik7XG4gICAgfTtcbiAgICB2YXIgYWRkRWxlbWVudCA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCkge1xuICAgICAgZFAodGhhdCwgaW5kZXgsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGdldHRlcih0aGlzLCBpbmRleCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIHNldHRlcih0aGlzLCBpbmRleCwgdmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIHtcbiAgICAgIFR5cGVkQXJyYXkgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBkYXRhLCAkb2Zmc2V0LCAkbGVuZ3RoKSB7XG4gICAgICAgIGFuSW5zdGFuY2UodGhhdCwgVHlwZWRBcnJheSwgTkFNRSwgJ19kJyk7XG4gICAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgICB2YXIgYnVmZmVyLCBieXRlTGVuZ3RoLCBsZW5ndGgsIGtsYXNzO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICAgICAgbGVuZ3RoID0gdG9JbmRleChkYXRhKTtcbiAgICAgICAgICBieXRlTGVuZ3RoID0gbGVuZ3RoICogQllURVM7XG4gICAgICAgICAgYnVmZmVyID0gbmV3ICRBcnJheUJ1ZmZlcihieXRlTGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgJEFycmF5QnVmZmVyIHx8IChrbGFzcyA9IGNsYXNzb2YoZGF0YSkpID09IEFSUkFZX0JVRkZFUiB8fCBrbGFzcyA9PSBTSEFSRURfQlVGRkVSKSB7XG4gICAgICAgICAgYnVmZmVyID0gZGF0YTtcbiAgICAgICAgICBvZmZzZXQgPSB0b09mZnNldCgkb2Zmc2V0LCBCWVRFUyk7XG4gICAgICAgICAgdmFyICRsZW4gPSBkYXRhLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgaWYgKCRsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKCRsZW4gJSBCWVRFUykgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgICAgICAgICAgYnl0ZUxlbmd0aCA9ICRsZW4gLSBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAoYnl0ZUxlbmd0aCA8IDApIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnl0ZUxlbmd0aCA9IHRvTGVuZ3RoKCRsZW5ndGgpICogQllURVM7XG4gICAgICAgICAgICBpZiAoYnl0ZUxlbmd0aCArIG9mZnNldCA+ICRsZW4pIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGVuZ3RoID0gYnl0ZUxlbmd0aCAvIEJZVEVTO1xuICAgICAgICB9IGVsc2UgaWYgKFRZUEVEX0FSUkFZIGluIGRhdGEpIHtcbiAgICAgICAgICByZXR1cm4gZnJvbUxpc3QoVHlwZWRBcnJheSwgZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuICRmcm9tLmNhbGwoVHlwZWRBcnJheSwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaGlkZSh0aGF0LCAnX2QnLCB7XG4gICAgICAgICAgYjogYnVmZmVyLFxuICAgICAgICAgIG86IG9mZnNldCxcbiAgICAgICAgICBsOiBieXRlTGVuZ3RoLFxuICAgICAgICAgIGU6IGxlbmd0aCxcbiAgICAgICAgICB2OiBuZXcgJERhdGFWaWV3KGJ1ZmZlcilcbiAgICAgICAgfSk7XG4gICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkgYWRkRWxlbWVudCh0aGF0LCBpbmRleCsrKTtcbiAgICAgIH0pO1xuICAgICAgVHlwZWRBcnJheVByb3RvdHlwZSA9IFR5cGVkQXJyYXlbUFJPVE9UWVBFXSA9IGNyZWF0ZSgkVHlwZWRBcnJheVByb3RvdHlwZSQpO1xuICAgICAgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCAnY29uc3RydWN0b3InLCBUeXBlZEFycmF5KTtcbiAgICB9IGVsc2UgaWYgKCFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICBUeXBlZEFycmF5KDEpO1xuICAgIH0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICBuZXcgVHlwZWRBcnJheSgtMSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgfSkgfHwgISRpdGVyRGV0ZWN0KGZ1bmN0aW9uIChpdGVyKSB7XG4gICAgICBuZXcgVHlwZWRBcnJheSgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgICAgbmV3IFR5cGVkQXJyYXkobnVsbCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICBuZXcgVHlwZWRBcnJheSgxLjUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgICAgbmV3IFR5cGVkQXJyYXkoaXRlcik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgfSwgdHJ1ZSkpIHtcbiAgICAgIFR5cGVkQXJyYXkgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBkYXRhLCAkb2Zmc2V0LCAkbGVuZ3RoKSB7XG4gICAgICAgIGFuSW5zdGFuY2UodGhhdCwgVHlwZWRBcnJheSwgTkFNRSk7XG4gICAgICAgIHZhciBrbGFzcztcbiAgICAgICAgLy8gYHdzYCBtb2R1bGUgYnVnLCB0ZW1wb3JhcmlseSByZW1vdmUgdmFsaWRhdGlvbiBsZW5ndGggZm9yIFVpbnQ4QXJyYXlcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvcHVsbC82NDVcbiAgICAgICAgaWYgKCFpc09iamVjdChkYXRhKSkgcmV0dXJuIG5ldyBCYXNlKHRvSW5kZXgoZGF0YSkpO1xuICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mICRBcnJheUJ1ZmZlciB8fCAoa2xhc3MgPSBjbGFzc29mKGRhdGEpKSA9PSBBUlJBWV9CVUZGRVIgfHwga2xhc3MgPT0gU0hBUkVEX0JVRkZFUikge1xuICAgICAgICAgIHJldHVybiAkbGVuZ3RoICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gbmV3IEJhc2UoZGF0YSwgdG9PZmZzZXQoJG9mZnNldCwgQllURVMpLCAkbGVuZ3RoKVxuICAgICAgICAgICAgOiAkb2Zmc2V0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBuZXcgQmFzZShkYXRhLCB0b09mZnNldCgkb2Zmc2V0LCBCWVRFUykpXG4gICAgICAgICAgICAgIDogbm
46184V3IEJhc2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFRZUEVEX0FSUkFZIGluIGRhdGEpIHJldHVybiBmcm9tTGlzdChUeXBlZEFycmF5LCBkYXRhKTtcbiAgICAgICAgcmV0dXJuICRmcm9tLmNhbGwoVHlwZWRBcnJheSwgZGF0YSk7XG4gICAgICB9KTtcbiAgICAgIGFycmF5Rm9yRWFjaChUQUMgIT09IEZ1bmN0aW9uLnByb3RvdHlwZSA/IGdPUE4oQmFzZSkuY29uY2F0KGdPUE4oVEFDKSkgOiBnT1BOKEJhc2UpLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICghKGtleSBpbiBUeXBlZEFycmF5KSkgaGlkZShUeXBlZEFycmF5LCBrZXksIEJhc2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICAgIFR5cGVkQXJyYXlbUFJPVE9UWVBFXSA9IFR5cGVkQXJyYXlQcm90b3R5cGU7XG4gICAgICBpZiAoIUxJQlJBUlkpIFR5cGVkQXJyYXlQcm90b3R5cGUuY29uc3RydWN0b3IgPSBUeXBlZEFycmF5O1xuICAgIH1cbiAgICB2YXIgJG5hdGl2ZUl0ZXJhdG9yID0gVHlwZWRBcnJheVByb3RvdHlwZVtJVEVSQVRPUl07XG4gICAgdmFyIENPUlJFQ1RfSVRFUl9OQU1FID0gISEkbmF0aXZlSXRlcmF0b3JcbiAgICAgICYmICgkbmF0aXZlSXRlcmF0b3IubmFtZSA9PSAndmFsdWVzJyB8fCAkbmF0aXZlSXRlcmF0b3IubmFtZSA9PSB1bmRlZmluZWQpO1xuICAgIHZhciAkaXRlcmF0b3IgPSAkaXRlcmF0b3JzLnZhbHVlcztcbiAgICBoaWRlKFR5cGVkQXJyYXksIFRZUEVEX0NPTlNUUlVDVE9SLCB0cnVlKTtcbiAgICBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIFRZUEVEX0FSUkFZLCBOQU1FKTtcbiAgICBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIFZJRVcsIHRydWUpO1xuICAgIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgREVGX0NPTlNUUlVDVE9SLCBUeXBlZEFycmF5KTtcblxuICAgIGlmIChDTEFNUEVEID8gbmV3IFR5cGVkQXJyYXkoMSlbVEFHXSAhPSBOQU1FIDogIShUQUcgaW4gVHlwZWRBcnJheVByb3RvdHlwZSkpIHtcbiAgICAgIGRQKFR5cGVkQXJyYXlQcm90b3R5cGUsIFRBRywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE5BTUU7IH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIE9bTkFNRV0gPSBUeXBlZEFycmF5O1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAoVHlwZWRBcnJheSAhPSBCYXNlKSwgTyk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUywgTkFNRSwge1xuICAgICAgQllURVNfUEVSX0VMRU1FTlQ6IEJZVEVTXG4gICAgfSk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uICgpIHsgQmFzZS5vZi5jYWxsKFR5cGVkQXJyYXksIDEpOyB9KSwgTkFNRSwge1xuICAgICAgZnJvbTogJGZyb20sXG4gICAgICBvZjogJG9mXG4gICAgfSk7XG5cbiAgICBpZiAoIShCWVRFU19QRVJfRUxFTUVOVCBpbiBUeXBlZEFycmF5UHJvdG90eXBlKSkgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBCWVRFU19QRVJfRUxFTUVOVCwgQllURVMpO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAsIE5BTUUsIHByb3RvKTtcblxuICAgIHNldFNwZWNpZXMoTkFNRSk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIEZPUkNFRF9TRVQsIE5BTUUsIHsgc2V0OiAkc2V0IH0pO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhQ09SUkVDVF9JVEVSX05BTUUsIE5BTUUsICRpdGVyYXRvcnMpO1xuXG4gICAgaWYgKCFMSUJSQVJZICYmIFR5cGVkQXJyYXlQcm90b3R5cGUudG9TdHJpbmcgIT0gYXJyYXlUb1N0cmluZykgVHlwZWRBcnJheVByb3RvdHlwZS50b1N0cmluZyA9IGFycmF5VG9TdHJpbmc7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5ldyBUeXBlZEFycmF5KDEpLnNsaWNlKCk7XG4gICAgfSksIE5BTUUsIHsgc2xpY2U6ICRzbGljZSB9KTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBbMSwgMl0udG9Mb2NhbGVTdHJpbmcoKSAhPSBuZXcgVHlwZWRBcnJheShbMSwgMl0pLnRvTG9jYWxlU3RyaW5nKCk7XG4gICAgfSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIFR5cGVkQXJyYXlQcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcuY2FsbChbMSwgMl0pO1xuICAgIH0pKSwgTkFNRSwgeyB0b0xvY2FsZVN0cmluZzogJHRvTG9jYWxlU3RyaW5nIH0pO1xuXG4gICAgSXRlcmF0b3JzW05BTUVdID0gQ09SUkVDVF9JVEVSX05BTUUgPyAkbmF0aXZlSXRlcmF0b3IgOiAkaXRlcmF0b3I7XG4gICAgaWYgKCFMSUJSQVJZICYmICFDT1JSRUNUX0lURVJfTkFNRSkgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBJVEVSQVRPUiwgJGl0ZXJhdG9yKTtcbiAgfTtcbn0gZWxzZSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciAkdHlwZWQgPSByZXF1aXJlKCcuL190eXBlZCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9JbmRleCA9IHJlcXVpcmUoJy4vX3RvLWluZGV4Jyk7XG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZjtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgYXJyYXlGaWxsID0gcmVxdWlyZSgnLi9fYXJyYXktZmlsbCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBBUlJBWV9CVUZGRVIgPSAnQXJyYXlCdWZmZXInO1xudmFyIERBVEFfVklFVyA9ICdEYXRhVmlldyc7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgV1JPTkdfTEVOR1RIID0gJ1dyb25nIGxlbmd0aCEnO1xudmFyIFdST05HX0lOREVYID0gJ1dyb25nIGluZGV4ISc7XG52YXIgJEFycmF5QnVmZmVyID0gZ2xvYmFsW0FSUkFZX0JVRkZFUl07XG52YXIgJERhdGFWaWV3ID0gZ2xvYmFsW0RBVEFfVklFV107XG52YXIgTWF0aCA9IGdsb2JhbC5NYXRoO1xudmFyIFJhbmdlRXJyb3IgPSBnbG9iYWwuUmFuZ2VFcnJvcjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3ctcmVzdHJpY3RlZC1uYW1lc1xudmFyIEluZmluaXR5ID0gZ2xvYmFsLkluZmluaXR5O1xudmFyIEJhc2VCdWZmZXIgPSAkQXJyYXlCdWZmZXI7XG52YXIgYWJzID0gTWF0aC5hYnM7XG52YXIgcG93ID0gTWF0aC5wb3c7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIGxvZyA9IE1hdGgubG9nO1xudmFyIExOMiA9IE1hdGguTE4yO1xudmFyIEJVRkZFUiA9ICdidWZmZXInO1xudmFyIEJZVEVfTEVOR1RIID0gJ2J5dGVMZW5ndGgnO1xudmFyIEJZVEVfT0ZGU0VUID0gJ2J5dGVPZmZzZXQnO1xudmFyICRCVUZGRVIgPSBERVNDUklQVE9SUyA/ICdfYicgOiBCVUZGRVI7XG52YXIgJExFTkdUSCA9IERFU0NSSVBUT1JTID8gJ19sJ
46184yA6IEJZVEVfTEVOR1RIO1xudmFyICRPRkZTRVQgPSBERVNDUklQVE9SUyA/ICdfbycgOiBCWVRFX09GRlNFVDtcblxuLy8gSUVFRTc1NCBjb252ZXJzaW9ucyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2llZWU3NTRcbmZ1bmN0aW9uIHBhY2tJRUVFNzU0KHZhbHVlLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShuQnl0ZXMpO1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDE7XG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMTtcbiAgdmFyIHJ0ID0gbUxlbiA9PT0gMjMgPyBwb3coMiwgLTI0KSAtIHBvdygyLCAtNzcpIDogMDtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCB2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwID8gMSA6IDA7XG4gIHZhciBlLCBtLCBjO1xuICB2YWx1ZSA9IGFicyh2YWx1ZSk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgaWYgKHZhbHVlICE9IHZhbHVlIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBtID0gdmFsdWUgIT0gdmFsdWUgPyAxIDogMDtcbiAgICBlID0gZU1heDtcbiAgfSBlbHNlIHtcbiAgICBlID0gZmxvb3IobG9nKHZhbHVlKSAvIExOMik7XG4gICAgaWYgKHZhbHVlICogKGMgPSBwb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLTtcbiAgICAgIGMgKj0gMjtcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogcG93KDIsIDEgLSBlQmlhcyk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrO1xuICAgICAgYyAvPSAyO1xuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwO1xuICAgICAgZSA9IGVNYXg7XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIHBvdygyLCBtTGVuKTtcbiAgICAgIGUgPSBlICsgZUJpYXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIHBvdygyLCBlQmlhcyAtIDEpICogcG93KDIsIG1MZW4pO1xuICAgICAgZSA9IDA7XG4gICAgfVxuICB9XG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltpKytdID0gbSAmIDI1NSwgbSAvPSAyNTYsIG1MZW4gLT0gOCk7XG4gIGUgPSBlIDw8IG1MZW4gfCBtO1xuICBlTGVuICs9IG1MZW47XG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW2krK10gPSBlICYgMjU1LCBlIC89IDI1NiwgZUxlbiAtPSA4KTtcbiAgYnVmZmVyWy0taV0gfD0gcyAqIDEyODtcbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cbmZ1bmN0aW9uIHVucGFja0lFRUU3NTQoYnVmZmVyLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDE7XG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxO1xuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7XG4gIHZhciBuQml0cyA9IGVMZW4gLSA3O1xuICB2YXIgaSA9IG5CeXRlcyAtIDE7XG4gIHZhciBzID0gYnVmZmVyW2ktLV07XG4gIHZhciBlID0gcyAmIDEyNztcbiAgdmFyIG07XG4gIHMgPj49IDc7XG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW2ldLCBpLS0sIG5CaXRzIC09IDgpO1xuICBtID0gZSAmICgxIDw8IC1uQml0cykgLSAxO1xuICBlID4+PSAtbkJpdHM7XG4gIG5CaXRzICs9IG1MZW47XG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW2ldLCBpLS0sIG5CaXRzIC09IDgpO1xuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXM7XG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogcyA/IC1JbmZpbml0eSA6IEluZmluaXR5O1xuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgcG93KDIsIG1MZW4pO1xuICAgIGUgPSBlIC0gZUJpYXM7XG4gIH0gcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBwb3coMiwgZSAtIG1MZW4pO1xufVxuXG5mdW5jdGlvbiB1bnBhY2tJMzIoYnl0ZXMpIHtcbiAgcmV0dXJuIGJ5dGVzWzNdIDw8IDI0IHwgYnl0ZXNbMl0gPDwgMTYgfCBieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF07XG59XG5mdW5jdGlvbiBwYWNrSTgoaXQpIHtcbiAgcmV0dXJuIFtpdCAmIDB4ZmZdO1xufVxuZnVuY3Rpb24gcGFja0kxNihpdCkge1xuICByZXR1cm4gW2l0ICYgMHhmZiwgaXQgPj4gOCAmIDB4ZmZdO1xufVxuZnVuY3Rpb24gcGFja0kzMihpdCkge1xuICByZXR1cm4gW2l0ICYgMHhmZiwgaXQgPj4gOCAmIDB4ZmYsIGl0ID4+IDE2ICYgMHhmZiwgaXQgPj4gMjQgJiAweGZmXTtcbn1cbmZ1bmN0aW9uIHBhY2tGNjQoaXQpIHtcbiAgcmV0dXJuIHBhY2tJRUVFNzU0KGl0LCA1MiwgOCk7XG59XG5mdW5jdGlvbiBwYWNrRjMyKGl0KSB7XG4gIHJldHVybiBwYWNrSUVFRTc1NChpdCwgMjMsIDQpO1xufVxuXG5mdW5jdGlvbiBhZGRHZXR0ZXIoQywga2V5LCBpbnRlcm5hbCkge1xuICBkUChDW1BST1RPVFlQRV0sIGtleSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXNbaW50ZXJuYWxdOyB9IH0pO1xufVxuXG5mdW5jdGlvbiBnZXQodmlldywgYnl0ZXMsIGluZGV4LCBpc0xpdHRsZUVuZGlhbikge1xuICB2YXIgbnVtSW5kZXggPSAraW5kZXg7XG4gIHZhciBpbnRJbmRleCA9IHRvSW5kZXgobnVtSW5kZXgpO1xuICBpZiAoaW50SW5kZXggKyBieXRlcyA+IHZpZXdbJExFTkdUSF0pIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfSU5ERVgpO1xuICB2YXIgc3RvcmUgPSB2aWV3WyRCVUZGRVJdLl9iO1xuICB2YXIgc3RhcnQgPSBpbnRJbmRleCArIHZpZXdbJE9GRlNFVF07XG4gIHZhciBwYWNrID0gc3RvcmUuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgYnl0ZXMpO1xuICByZXR1cm4gaXNMaXR0bGVFbmRpYW4gPyBwYWNrIDogcGFjay5yZXZlcnNlKCk7XG59XG5mdW5jdGlvbiBzZXQodmlldywgYnl0ZXMsIGluZGV4LCBjb252ZXJzaW9uLCB2YWx1ZSwgaXNMaXR0bGVFbmRpYW4pIHtcbiAgdmFyIG51bUluZGV4ID0gK2luZGV4O1xuICB2YXIgaW50SW5kZXggPSB0b0luZGV4KG51bUluZGV4KTtcbiAgaWYgKGludEluZGV4ICsgYnl0ZXMgPiB2aWV3WyRMRU5HVEhdKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0lOREVYKTtcbiAgdmFyIHN0b3JlID0gdmlld1skQlVGRkVSXS5fYjtcbiAgdmFyIHN0YXJ0ID0gaW50SW5kZXggKyB2aWV3WyRPRkZTRVRdO1xuICB2YXIgcGFjayA9IGNvbnZlcnNpb24oK3ZhbHVlKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlczsgaSsrKSBzdG9yZVtzdGFydCArIGldID0gcGFja1tpc0xpdHRsZUVuZGlhbiA/IGkgOiBieXRlcyAtIGkgLSAxXTtcbn1cblxuaWYgKCEkdHlwZWQuQUJWKSB7XG4gICRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIEFycmF5QnVmZmVyKGxlbmd0aCkge1xuICAgIGFuSW5zdGFuY2UodGhpcywgJEFycmF5QnVmZmVyLCBBUlJBWV9CVUZGRVIpO1xuICAgIHZhciBieXRlTGVuZ3RoID0gdG9JbmRleChsZW5ndGgpO1xuICAgIHRoaXMuX2IgPSBhcnJheUZpbGwuY2FsbChuZXcgQXJyYXkoYnl0ZUxlbmd0aCksIDApO1xuICAgIHRoaXNbJExFTkdUSF0gPSBieXRlTGVuZ3RoO1xuICB9O1xuXG4gICREYXRhVmlldyA9IGZ1bmN0aW9uIERhdGFWaWV3KGJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCkge1xuICAgIGFuSW5zdGFuY2UodGhpcywgJERhdGFWaWV3LCBEQVRBX1ZJRVcpO1xuICAgIGFuSW5zdGFuY2UoYnVmZmVyLCAkQXJyYXlCdWZmZXIsIERBVEFfVklFVyk7XG4gICAgdmFyIGJ1ZmZlckxlbmd0aCA9IGJ1ZmZlclskTEVOR1RIXTtcbiAgICB2YXIgb2Zmc2V0ID0gdG9JbnRlZ2VyKGJ5dG
46184VPZmZzZXQpO1xuICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJ1ZmZlckxlbmd0aCkgdGhyb3cgUmFuZ2VFcnJvcignV3Jvbmcgb2Zmc2V0IScpO1xuICAgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID09PSB1bmRlZmluZWQgPyBidWZmZXJMZW5ndGggLSBvZmZzZXQgOiB0b0xlbmd0aChieXRlTGVuZ3RoKTtcbiAgICBpZiAob2Zmc2V0ICsgYnl0ZUxlbmd0aCA+IGJ1ZmZlckxlbmd0aCkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgIHRoaXNbJEJVRkZFUl0gPSBidWZmZXI7XG4gICAgdGhpc1skT0ZGU0VUXSA9IG9mZnNldDtcbiAgICB0aGlzWyRMRU5HVEhdID0gYnl0ZUxlbmd0aDtcbiAgfTtcblxuICBpZiAoREVTQ1JJUFRPUlMpIHtcbiAgICBhZGRHZXR0ZXIoJEFycmF5QnVmZmVyLCBCWVRFX0xFTkdUSCwgJ19sJyk7XG4gICAgYWRkR2V0dGVyKCREYXRhVmlldywgQlVGRkVSLCAnX2InKTtcbiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCBCWVRFX0xFTkdUSCwgJ19sJyk7XG4gICAgYWRkR2V0dGVyKCREYXRhVmlldywgQllURV9PRkZTRVQsICdfbycpO1xuICB9XG5cbiAgcmVkZWZpbmVBbGwoJERhdGFWaWV3W1BST1RPVFlQRV0sIHtcbiAgICBnZXRJbnQ4OiBmdW5jdGlvbiBnZXRJbnQ4KGJ5dGVPZmZzZXQpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcywgMSwgYnl0ZU9mZnNldClbMF0gPDwgMjQgPj4gMjQ7XG4gICAgfSxcbiAgICBnZXRVaW50ODogZnVuY3Rpb24gZ2V0VWludDgoYnl0ZU9mZnNldCkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCAxLCBieXRlT2Zmc2V0KVswXTtcbiAgICB9LFxuICAgIGdldEludDE2OiBmdW5jdGlvbiBnZXRJbnQxNihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICB2Y
46184XIgYnl0ZXMgPSBnZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKTtcbiAgICAgIHJldHVybiAoYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzBdKSA8PCAxNiA+PiAxNjtcbiAgICB9LFxuICAgIGdldFVpbnQxNjogZnVuY3Rpb24gZ2V0VWludDE2KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHZhciBieXRlcyA9IGdldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pO1xuICAgICAgcmV0dXJuIGJ5dGVzWzFdIDw8IDggfCBieXRlc1swXTtcbiAgICB9LFxuICAgIGdldEludDMyOiBmdW5jdGlvbiBnZXRJbnQzMihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICByZXR1cm4gdW5wYWNrSTMyKGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pKTtcbiAgICB9LFxuICAgIGdldFVpbnQzMjogZnVuY3Rpb24gZ2V0VWludDMyKGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHJldHVybiB1bnBhY2tJMzIoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSkpID4+PiAwO1xuICAgIH0sXG4gICAgZ2V0RmxvYXQzMjogZnVuY3Rpb24gZ2V0RmxvYXQzMihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICByZXR1cm4gdW5wYWNrSUVFRTc1NChnZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKSwgMjMsIDQpO1xuICAgIH0sXG4gICAgZ2V0RmxvYXQ2NDogZnVuY3Rpb24gZ2V0RmxvYXQ2NChieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICByZXR1cm4gdW5wYWNrSUVFRTc1NChnZXQodGhpcywgOCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKSwgNTIsIDgpO1xuICAgIH0sXG4gICAgc2V0SW50ODogZnVuY3Rpb24gc2V0SW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgc2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQsIHBhY2tJOCwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2V0VWludDg6IGZ1bmN0aW9uIHNldFVpbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7XG4gICAgICBzZXQodGhpcywgMSwgYnl0ZU9mZnNldCwgcGFja0k4LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBzZXRJbnQxNjogZnVuY3Rpb24gc2V0SW50MTYoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBwYWNrSTE2LCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldFVpbnQxNjogZnVuY3Rpb24gc2V0VWludDE2KGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgcGFja0kxNiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRJbnQzMjogZnVuY3Rpb24gc2V0SW50MzIoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBwYWNrSTMyLCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldFVpbnQzMjogZnVuY3Rpb24gc2V0VWludDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0kzMiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRGbG9hdDMyOiBmdW5jdGlvbiBzZXRGbG9hdDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0YzMiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRGbG9hdDY0OiBmdW5jdGlvbiBzZXRGbG9hdDY0KGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgOCwgYnl0ZU9mZnNldCwgcGFja0Y2NCwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfVxuICB9KTtcbn0gZWxzZSB7XG4gIGlmICghZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICRBcnJheUJ1ZmZlcigxKTtcbiAgfSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICBuZXcgJEFycmF5QnVmZmVyKC0xKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgfSkgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyAkQXJyYXlCdWZmZXIoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICBuZXcgJEFycmF5QnVmZmVyKDEuNSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbmV3ICRBcnJheUJ1ZmZlcihOYU4pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIHJldHVybiAkQXJyYXlCdWZmZXIubmFtZSAhPSBBUlJBWV9CVUZGRVI7XG4gIH0pKSB7XG4gICAgJEFycmF5QnVmZmVyID0gZnVuY3Rpb24gQXJyYXlCdWZmZXIobGVuZ3RoKSB7XG4gICAgICBhbkluc3RhbmNlKHRoaXMsICRBcnJheUJ1ZmZlcik7XG4gICAgICByZXR1cm4gbmV3IEJhc2VCdWZmZXIodG9JbmRleChsZW5ndGgpKTtcbiAgICB9O1xuICAgIHZhciBBcnJheUJ1ZmZlclByb3RvID0gJEFycmF5QnVmZmVyW1BST1RPVFlQRV0gPSBCYXNlQnVmZmVyW1BST1RPVFlQRV07XG4gICAgZm9yICh2YXIga2V5cyA9IGdPUE4o
46184QmFzZUJ1ZmZlciksIGogPSAwLCBrZXk7IGtleXMubGVuZ3RoID4gajspIHtcbiAgICAgIGlmICghKChrZXkgPSBrZXlzW2orK10pIGluICRBcnJheUJ1ZmZlcikpIGhpZGUoJEFycmF5QnVmZmVyLCBrZXksIEJhc2VCdWZmZXJba2V5XSk7XG4gICAgfVxuICAgIGlmICghTElCUkFSWSkgQXJyYXlCdWZmZXJQcm90by5jb25zdHJ1Y3RvciA9ICRBcnJheUJ1ZmZlcjtcbiAgfVxuICAvLyBpT1MgU2FmYXJpIDcueCBidWdcbiAgdmFyIHZpZXcgPSBuZXcgJERhdGFWaWV3KG5ldyAkQXJyYXlCdWZmZXIoMikpO1xuICB2YXIgJHNldEludDggPSAkRGF0YVZpZXdbUFJPVE9UWVBFXS5zZXRJbnQ4O1xuICB2aWV3LnNldEludDgoMCwgMjE0NzQ4MzY0OCk7XG4gIHZpZXcuc2V0SW50OCgxLCAyMTQ3NDgzNjQ5KTtcbiAgaWYgKHZpZXcuZ2V0SW50OCgwKSB8fCAhdmlldy5nZXRJbnQ4KDEpKSByZWRlZmluZUFsbCgkRGF0YVZpZXdbUFJPVE9UWVBFXSwge1xuICAgIHNldEludDg6IGZ1bmN0aW9uIHNldEludDgoYnl0ZU9mZnNldCwgdmFsdWUpIHtcbiAgICAgICRzZXRJbnQ4LmNhbGwodGhpcywgYnl0ZU9mZnNldCwgdmFsdWUgPDwgMjQgPj4gMjQpO1xuICAgIH0sXG4gICAgc2V0VWludDg6IGZ1bmN0aW9uIHNldFVpbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7XG4gICAgICAkc2V0SW50OC5jYWxsKHRoaXMsIGJ5dGVPZmZzZXQsIHZhbHVlIDw8IDI0ID4+IDI0KTtcbiAgICB9XG4gIH0sIHRydWUpO1xufVxuc2V0VG9TdHJpbmdUYWcoJEFycmF5QnVmZmVyLCBBUlJBWV9CVUZGRVIpO1xuc2V0VG9TdHJpbmdUYWcoJERhdGFWaWV3LCBEQVRBX1ZJRVcpO1xuaGlkZSgkRGF0YVZpZXdbUFJPVE9UWVBFXSwgJHR5cGVkLlZJRVcsIHRydWUpO1xuZXhwb3J0c1tBUlJBWV9CVUZGRVJdID0gJEFycmF5QnVmZmVyO1xuZXhwb3J0c1tEQVRBX1ZJRVddID0gJERhdGFWaWV3O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG52YXIgVFlQRUQgPSB1aWQoJ3R5cGVkX2FycmF5Jyk7XG52YXIgVklFVyA9IHVpZCgndmlldycpO1xudmFyIEFCViA9ICEhKGdsb2JhbC5BcnJheUJ1ZmZlciAmJiBnbG9iYWwuRGF0YVZpZXcpO1xudmFyIENPTlNUUiA9IEFCVjtcbnZhciBpID0gMDtcbnZhciBsID0gOTtcbnZhciBUeXBlZDtcblxudmFyIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnMgPSAoXG4gICdJbnQ4QXJyYXksVWludDhBcnJheSxVaW50OENsYW1wZWRBcnJheSxJbnQxNkFycmF5LFVpbnQxNkFycmF
461845LEludDMyQXJyYXksVWludDMyQXJyYXksRmxvYXQzMkFycmF5LEZsb2F0NjRBcnJheSdcbikuc3BsaXQoJywnKTtcblxud2hpbGUgKGkgPCBsKSB7XG4gIGlmIChUeXBlZCA9IGdsb2JhbFtUeXBlZEFycmF5Q29uc3RydWN0b3JzW2krK11dKSB7XG4gICAgaGlkZShUeXBlZC5wcm90b3R5cGUsIFRZUEVELCB0cnVlKTtcbiAgICBoaWRlKFR5cGVkLnByb3RvdHlwZSwgVklFVywgdHJ1ZSk7XG4gIH0gZWxzZSBDT05TVFIgPSBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEFCVjogQUJWLFxuICBDT05TVFI6IENPTlNUUixcbiAgVFlQRUQ6IFRZUEVELFxuICBWSUVXOiBWSUVXXG59O1xuIiwidmFyIGlkID0gMDtcbnZhciBweCA9IE1hdGgucmFuZG9tKCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBweCkudG9TdHJpbmcoMzYpKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgbmF2aWdhdG9yID0gZ2xvYmFsLm5hdmlnYXRvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAnJztcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRZUEUpIHtcbiAgaWYgKCFpc09iamVjdChpdCkgfHwgaXQuX3QgIT09IFRZUEUpIHRocm93IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQhJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyIHdrc0V4dCA9IHJlcXVpcmUoJy4vX3drcy1leHQnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHZhciAkU3ltYm9sID0gY29yZS5TeW1ib2wgfHwgKGNvcmUuU3ltYm9sID0gTElCUkFSWSA/IHt9IDogZ2xvYmFsLlN5bWJvbCB8fCB7fSk7XG4gIGlmIChuYW1lLmNoYXJBdCgwKSAhPSAnXycgJiYgIShuYW1lIGluICRTeW1ib2wpKSBkZWZpbmVQcm9wZXJ0eSgkU3ltYm9sLCBuYW1lLCB7IHZhbHVlOiB3a3NFeHQuZihuYW1lKSB9KTtcbn07XG4iLCJleHBvcnRzLmYgPSByZXF1aXJlKCcuL193a3MnKTtcbiIsInZhciBzdG9yZSA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2w7XG52YXIgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL2JlbmphbWluZ3IvUmV4RXhwLmVzY2FwZVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcmUgPSByZXF1aXJlKCcuL19yZXBsYWNlcicpKC9bXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZ0V4cCcsIHsgZXNjYXBlOiBmdW5jdGlvbiBlc2NhcGUoaXQpIHsgcmV0dXJuICRyZShpdCk7IH0gfSk7XG4iLCIvLyAyMi4xLjMuMyBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0LCBlbmQgPSB0aGlzLmxlbmd0aClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7IGNvcHlXaXRoaW46IHJlcXVpcmUoJy4vX2FycmF5LWNvcHktd2l0aGluJykgfSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdjb3B5V2l0aGluJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRldmVyeSA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSg0KTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLmV2ZXJ5LCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuNSAvIDE1LjQuNC4xNiBBcnJheS5wcm90b3R5cGUuZXZlcnkoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRldmVyeSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcbiIsIi8vIDIyLjEuMy42IEFycmF5LnByb3RvdHlwZS5maWxsKHZhbHVlLCBzdGFydCA9IDAsIGVuZCA9IHRoaXMubGVuZ3RoKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHsgZmlsbDogcmVxdWlyZSgnLi9fYXJyYXktZmlsbCcpIH0pO1xuXG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKSgnZmlsbCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZmlsdGVyID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDIpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10uZmlsdGVyLCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuNyAvIDE1LjQuNC4yMCBBcnJheS5wcm90b3R5cGUuZmlsdGVyKGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRmaWx0ZXIodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzWzFdKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuOSBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4KHByZWRpY2F0ZSwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGZpbmQgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoNik7XG52YXIgS0VZID0gJ2ZpbmRJbmRleCc7XG52YXIgZm9yY2VkID0gdHJ1ZTtcbi8vIFNob3VsZG4ndCBza2lwIGhvbGVzXG5pZiAoS0VZIGluIFtdKSBBcnJheSgxKVtLRVldKGZ1bmN0aW9uICgpIHsgZm9yY2VkID0gZmFsc2U7IH0pO1xuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBmb3JjZWQsICdBcnJheScsIHtcbiAgZmluZEluZGV4OiBmdW5jdGlvbiBmaW5kSW5kZXgoY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHtcbiAgICByZXR1cm4gJGZpbmQodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKEtFWSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuOCBBcnJheS5wcm90b3R5cGUuZmluZChwcmVkaWNhdGUsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRmaW5kID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDUpO1xudmFyIEtFWSA9ICdmaW5kJztcbnZhciBmb3JjZWQgPSB0cnVlO1xuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbmlmIChLRVkgaW4gW10pIEFycmF5KDEpW0tFWV0oZnVuY3Rpb24gKCkgeyBmb3JjZWQgPSBmYWxzZTsgfSk7XG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZvcmNlZCwgJ0FycmF5Jywge1xuICBmaW5kOiBmdW5jdGlvbiBmaW5kKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKShLRVkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZm9yRWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgwKTtcbnZhciBTVFJJQ1QgPSByZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10uZm9yRWFjaCwgdHJ1ZSk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIVNUUklDVCwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTAgLyAxNS4
461840LjQuMTggQXJyYXkucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkZm9yRWFjaCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHsgQXJyYXkuZnJvbShpdGVyKTsgfSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4yLjEgQXJyYXkuZnJvbShhcnJheUxpa2UsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICBmcm9tOiBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSAvKiAsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkICovKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICAgIHZhciBDID0gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIG1hcGZuID0gYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGl0ZXJGbiA9IGdldEl0ZXJGbihPKTtcbiAgICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICAgIGlmIChtYXBwaW5nKSBtYXBmbiA9IGN0eChtYXBmbiwgYUxlbiA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQsIDIpO1xuICAgIC8vIGlmIG9iamVjdCBpc24ndCBpdGVyYWJsZSBvciBpdCdzIGFycmF5IHdpdGggZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBzaW1wbGUgY2FzZVxuICAgIGlmIChpdGVyRm4gIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcihpdGVyRm4pKSkge1xuICAgICAgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKE8pLCByZXN1bHQgPSBuZXcgQygpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGluZGV4KyspIHtcbiAgICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IGNhbGwoaXRlcmF0b3IsIG1hcGZuLCBbc3RlcC52YWx1ZSwgaW5kZXhdLCB0cnVlKSA6IHN0ZXAudmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgICBmb3IgKHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRpbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgJG5hdGl2ZSA9IFtdLmluZGV4T2Y7XG52YXIgTkVHQVRJVkVfWkVSTyA9ICEhJG5hdGl2ZSAmJiAxIC8gWzFdLmluZGV4T2YoMSwgLTApIDwgMDtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoTkVHQVRJVkVfWkVSTyB8fCAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKCRuYXRpdmUpKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTEgLyAxNS40LjQuMTQgQXJyYXkucHJvdG90eXBlLmluZGV4T2Yoc2VhcmNoRWxlbWVudCBbLCBmcm9tSW5kZXhdKVxuICBpbmRleE9mOiBmdW5jdGlvbiBpbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggPSAwICovKSB7XG4gICAgcmV0dXJuIE5FR0FUSVZFX1pFUk9cbiAgICAgIC8vIGNvbnZlcnQgLTAgdG8gKzBcbiAgICAgID8gJG5hdGl2ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IDBcbiAgICAgIDogJGluZGV4T2YodGhpcywgc2VhcmNoRWxlbWVudCwgYXJndW1lbnRzWzFdKTtcbiAgfVxufSk7XG4iLCIvLyAyMi4xLjIuMiAvIDE1LjQuMy4yIEFycmF5LmlzQXJyYXkoYXJnKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdBcnJheScsIHsgaXNBcnJheTogcmVxdWlyZSgnLi9faXMtYXJyYXknKSB9KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgc3RlcCA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGtpbmQgPSB0aGlzLl9rO1xuICB2YXIgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmICghTyB8fCBpbmRleCA+PS
46184BPLmxlbmd0aCkge1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmpvaW4oc2VwYXJhdG9yKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgYXJyYXlKb2luID0gW10uam9pbjtcblxuLy8gZmFsbGJhY2sgZm9yIG5vdCBhcnJheS1saWtlIHN0cmluZ3NcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKHJlcXVpcmUoJy4vX2lvYmplY3QnKSAhPSBPYmplY3QgfHwgIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShhcnJheUpvaW4pKSwgJ0FycmF5Jywge1xuICBqb2luOiBmdW5jdGlvbiBqb2luKHNlcGFyYXRvcikge1xuICAgIHJldHVybiBhcnJheUpvaW4uY2FsbCh0b0lPYmplY3QodGhpcyksIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkID8gJywnIDogc2VwYXJhdG9yKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciAkbmF0aXZlID0gW10ubGFzdEluZGV4T2Y7XG52YXIgTkVHQVRJVkVfWkVSTyA9ICEhJG5hdGl2ZSAmJiAxIC8gWzFdLmxhc3RJbmRleE9mKDEsIC0wKSA8IDA7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKE5FR0FUSVZFX1pFUk8gfHwgIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKSgkbmF0aXZlKSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjE0IC8gMTUuNC40LjE1IEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IFssIGZyb21JbmRleF0pXG4gIGxhc3RJbmRleE9mOiBmdW5jdGlvbiBsYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ID0gQFsqLTFdICovKSB7XG4gICAgLy8gY29udmVydCAtMCB0byArMFxuICAgIGlmIChORUdBVElWRV9aRVJPKSByZXR1cm4gJG5hdGl2ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IDA7XG4gICAgdmFyIE8gPSB0b0lPYmplY3QodGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSBsZW5ndGggLSAxO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgaW5kZXggPSBNYXRoLm1pbihpbmRleCwgdG9JbnRlZ2VyKGFyZ3VtZW50c1sxXSkpO1xuICAgIGlmIChpbmRleCA8IDApIGluZGV4ID0gbGVuZ3RoICsgaW5kZXg7XG4gICAgZm9yICg7aW5kZXggPj0gMDsgaW5kZXgtLSkgaWYgKGluZGV4IGluIE8pIGlmIChPW2luZGV4XSA9PT0gc2VhcmNoRWxlbWVudCkgcmV0dXJuIGluZGV4IHx8IDA7XG4gICAgcmV0dXJuIC0xO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJG1hcCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgxKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLm1hcCwgdHJ1ZSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjE1IC8gMTUuNC40LjE5IEFycmF5LnByb3RvdHlwZS5tYXAoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgbWFwOiBmdW5jdGlvbiBtYXAoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICByZXR1cm4gJG1hcCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuL19jcmVhdGUtcHJvcGVydHknKTtcblxuLy8gV2ViS2l0IEFycmF5Lm9mIGlzbid0IGdlbmVyaWNcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuICEoQXJyYXkub2YuY2FsbChGKSBpbnN0YW5jZW9mIEYpO1xufSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4yLjMgQXJyYXkub2YoIC4uLml0ZW1zKVxuICBvZjogZnVuY3Rpb24gb2YoLyogLi4uYXJncyAqLykge1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciByZXN1bHQgPSBuZXcgKHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXkpKGFMZW4pO1xuICAgIHdoaWxlIChhTGVuID4gaW5kZXgpIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIGFyZ3VtZW50c1tpbmRleCsrXSk7XG4gICAgcmVzdWx0Lmxlbmd0aCA9IGFMZW47XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRyZWR1Y2UgPSByZXF1aXJlKCcuL19hcnJheS1yZWR1Y2UnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLnJlZHVjZVJpZ2h0LCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTkgLyAxNS40LjQuMjIgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0KGNhbGxiYWNrZm4gWywgaW5pdGlhbFZhbHVlXSlcbiAgcmVkdWNlUmlnaHQ6IGZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNhbGxiYWNrZm4gLyogLCBpbml0aWFsVmFsdWUgKi8pIHtcbiAgICByZXR1cm4gJHJlZHVjZSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoLCBhcmd1bWVudHNbMV0sIHRydWUpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHJlZ
46184HVjZSA9IHJlcXVpcmUoJy4vX2FycmF5LXJlZHVjZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10ucmVkdWNlLCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTggLyAxNS40LjQuMjEgQXJyYXkucHJvdG90eXBlLnJlZHVjZShjYWxsYmFja2ZuIFssIGluaXRpYWxWYWx1ZV0pXG4gIHJlZHVjZTogZnVuY3Rpb24gcmVkdWNlKGNhbGxiYWNrZm4gLyogLCBpbml0aWFsVmFsdWUgKi8pIHtcbiAgICByZXR1cm4gJHJlZHVjZSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoLCBhcmd1bWVudHNbMV0sIGZhbHNlKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuL19odG1sJyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGFycmF5U2xpY2UgPSBbXS5zbGljZTtcblxuLy8gZmFsbGJhY2sgZm9yIG5vdCBhcnJheS1saWtlIEVTMyBzdHJpbmdzIGFuZCBET00gb2JqZWN0c1xuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgaWYgKGh0bWwpIGFycmF5U2xpY2UuY2FsbChodG1sKTtcbn0pLCAnQXJyYXknLCB7XG4gIHNsaWNlOiBmdW5jdGlvbiBzbGljZShiZWdpbiwgZW5kKSB7XG4gICAgdmFyIGxlbiA9IHRvTGVuZ3RoKHRoaXMubGVuZ3RoKTtcbiAgICB2YXIga2xhc3MgPSBjb2YodGhpcyk7XG4gICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiBlbmQ7XG4gICAgaWYgKGtsYXNzID09ICdBcnJheScpIHJldHVybiBhcnJheVNsaWNlLmNhbGwodGhpcywgYmVnaW4sIGVuZCk7XG4gICAgdmFyIHN0YXJ0ID0gdG9BYnNvbHV0ZUluZGV4KGJlZ2luLCBsZW4pO1xuICAgIHZhciB1cFRvID0gdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuKTtcbiAgICB2YXIgc2l6ZSA9IHRvTGVuZ3RoKHVwVG8gLSBzdGFydCk7XG4gICAgdmFyIGNsb25lZCA9IG5ldyBBcnJheShzaXplKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBzaXplOyBpKyspIGNsb25lZFtpXSA9IGtsYXNzID09ICdTdHJpbmcnXG4gICAgICA/IHRoaXMuY2hhckF0KHN0YXJ0ICsgaSlcbiAgICAgIDogdGhpc1tzdGFydCArIGldO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkc29tZSA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgzKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLnNvbWUsIHRydWUpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4yMyAvIDE1LjQuNC4xNyBBcnJheS5wcm90b3R5cGUuc29tZShjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxuICBzb21lOiBmdW5jdGlvbiBzb21lKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRzb21lKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgJHNvcnQgPSBbXS5zb3J0O1xudmFyIHRlc3QgPSBbMSwgMiwgM107XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gSUU4LVxuICB0ZXN0LnNvcnQodW5kZWZpbmVkKTtcbn0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIFY4IGJ1Z1xuICB0ZXN0LnNvcnQobnVsbCk7XG4gIC8vIE9sZCBXZWJLaXRcbn0pIHx8ICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoJHNvcnQpKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMjUgQXJyYXkucHJvdG90eXBlLnNvcnQoY29tcGFyZWZuKVxuICBzb3J0OiBmdW5jdGlvbiBzb3J0KGNvbXBhcmVmbikge1xuICAgIHJldHVybiBjb21wYXJlZm4gPT09IHVuZGVmaW5lZFxuICAgICAgPyAkc29ydC5jYWxsKHRvT2JqZWN0KHRoaXMpKVxuICAgICAgOiAkc29ydC5jYWxsKHRvT2JqZWN0KHRoaXMpLCBhRnVuY3Rpb24oY29tcGFyZWZuKSk7XG4gIH1cbn0pO1xuIiwicmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKSgnQXJyYXknKTtcbiIsIi8vIDIwLjMuMy4xIC8gMTUuOS40LjQgRGF0ZS5ub3coKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdEYXRlJywgeyBub3c6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOyB9IH0pO1xuIiwiLy8gMjAuMy40LjM2IC8gMTUuOS41LjQzIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JU09TdHJpbmcgPSByZXF1aXJlKCcuL19kYXRlLXRvLWlzby1zdHJpbmcnKTtcblxuLy8gUGhhbnRvbUpTIC8gb2xkIFdlYktpdCBoYXMgYSBicm9rZW4gaW1wbGVtZW50YXRpb25zXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyAhPT0gdG9JU09TdHJpbmcpLCAnRGF0ZScsIHtcbiAgdG9JU09TdHJpbmc6IHRvSVNPU3RyaW5nXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IERhdGUoTmFOKS50b0pTT04oKSAhPT0gbnVsbFxuICAgIHx8IERhdGUucHJvdG90eXBlLnRvSlNPTi5jYWxsKHsgdG9JU09TdHJpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDE7IH0gfSkgIT09IDE7XG59KSwgJ0RhdGUnLCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTihrZXkpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBwdiA9IHRvUHJpbWl0aXZlKE8pO1xuICAgIHJldHVybi
46184B0eXBlb2YgcHYgPT0gJ251bWJlcicgJiYgIWlzRmluaXRlKHB2KSA/IG51bGwgOiBPLnRvSVNPU3RyaW5nKCk7XG4gIH1cbn0pO1xuIiwidmFyIFRPX1BSSU1JVElWRSA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1ByaW1pdGl2ZScpO1xudmFyIHByb3RvID0gRGF0ZS5wcm90b3R5cGU7XG5cbmlmICghKFRPX1BSSU1JVElWRSBpbiBwcm90bykpIHJlcXVpcmUoJy4vX2hpZGUnKShwcm90bywgVE9fUFJJTUlUSVZFLCByZXF1aXJlKCcuL19kYXRlLXRvLXByaW1pdGl2ZScpKTtcbiIsInZhciBEYXRlUHJvdG8gPSBEYXRlLnByb3RvdHlwZTtcbnZhciBJTlZBTElEX0RBVEUgPSAnSW52YWxpZCBEYXRlJztcbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyICR0b1N0cmluZyA9IERhdGVQcm90b1tUT19TVFJJTkddO1xudmFyIGdldFRpbWUgPSBEYXRlUHJvdG8uZ2V0VGltZTtcbmlmIChuZXcgRGF0ZShOYU4pICsgJycgIT0gSU5WQUxJRF9EQVRFKSB7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoRGF0ZVByb3RvLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHZhciB2YWx1ZSA9IGdldFRpbWUuY2FsbCh0aGlzKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/ICR0b1N0cmluZy5jYWxsKHRoaXMpIDogSU5WQUxJRF9EQVRFO1xuICB9KTtcbn1cbiIsIi8vIDE5LjIuMy4yIC8gMTUuMy40LjUgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQodGhpc0FyZywgYXJncy4uLilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnRnVuY3Rpb24nLCB7IGJpbmQ6IHJlcXVpcmUoJy4vX2JpbmQnKSB9KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIEhBU19JTlNUQU5DRSA9IHJlcXVpcmUoJy4vX3drcycpKCdoYXNJbnN0YW5jZScpO1xudmFyIEZ1bmN0aW9uUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4vLyAxOS4yLjMuNiBGdW5jdGlvbi5wcm90b3R5cGVbQEBoYXNJbnN0YW5jZV0oVilcbmlmICghKEhBU19JTlNUQU5DRSBpbiBGdW5jdGlvblByb3RvKSkgcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZihGdW5jdGlvblByb3RvLCBIQVNfSU5TVEFOQ0UsIHsgdmFsdWU6IGZ1bmN0aW9uIChPKSB7XG4gIGlmICh0eXBlb2YgdGhpcyAhPSAnZnVuY3Rpb24nIHx8ICFpc09iamVjdChPKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWlzT2JqZWN0KHRoaXMucHJvdG90eXBlKSkgcmV0dXJuIE8gaW5zdGFuY2VvZiB0aGlzO1xuICAvLyBmb3IgZW52aXJvbm1lbnQgdy9vIG5hdGl2ZSBgQEBoYXNJbnN0YW5jZWAgbG9naWMgZW5vdWdoIGBpbnN0YW5jZW9mYCwgYnV0IGFkZCB0aGlzOlxuICB3aGlsZSAoTyA9IGdldFByb3RvdHlwZU9mKE8pKSBpZiAodGhpcy5wcm90b3R5cGUgPT09IE8pIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59IH0pO1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBGUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgbmFtZVJFID0gL15cXHMqZnVuY3Rpb24gKFteIChdKikvO1xudmFyIE5BTUUgPSAnbmFtZSc7XG5cbi8vIDE5LjIuNC4yIG5hbWVcbk5BTUUgaW4gRlByb3RvIHx8IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgZFAoRlByb3RvLCBOQU1FLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoJycgKyB0aGlzKS5tYXRjaChuYW1lUkUpWzFdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cm9uZyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tc3Ryb25nJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgTUFQID0gJ01hcCc7XG5cbi8vIDIzLjEgTWFwIE9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKE1BUCwgZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gTWFwKCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMS4zLjYgTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICB2YXIgZW50cnkgPSBzdHJvbmcuZ2V0RW50cnkodmFsaWRhdGUodGhpcywgTUFQKSwga2V5KTtcbiAgICByZXR1cm4gZW50cnkgJiYgZW50cnkudjtcbiAgfSxcbiAgLy8gMjMuMS4zLjkgTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlcbiAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiBzdHJvbmcuZGVmKHZhbGlkYXRlKHRoaXMsIE1BUCksIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgfVxufSwgc3Ryb25nLCB0cnVlKTtcbiIsIi8vIDIwLjIuMi4zIE1hdGguYWNvc2goeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgbG9nMXAgPSByZXF1aXJlKCcuL19tYXRoLWxvZzFwJyk7XG52YXIgc3FydCA9IE1hdGguc3FydDtcbnZhciAkYWNvc2ggPSBNYXRoLmFjb3NoO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoJGFjb3NoXG4gIC8vIFY4IGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTM1MDlcbiAgJiYgTWF0aC5mbG9vcigkYWNvc2goTnVtYmVyLk1BWF9WQUxVRSkpID09IDcxMFxuICAvLyBUb3IgQnJvd3NlciBidWc6IE1hdGguYWNvc2goSW5maW5pdHkpIC0+IE5hTlxuICAmJiAkYWNvc2goSW5maW5pdHkpID09IEluZmluaXR5XG4pLCAnTWF0aCcsIHtcbiAgYWNvc2g6IGZ1bmN0aW9uIGFjb3NoKHgpIHtcbiAgICByZXR1cm4gKHggPSAreCkgPCAxID8gTmFOIDogeCA+IDk0OTA2MjY1LjYyNDI1MTU2
46184XG4gICAgICA/IE1hdGgubG9nKHgpICsgTWF0aC5MTjJcbiAgICAgIDogbG9nMXAoeCAtIDEgKyBzcXJ0KHggLSAxKSAqIHNxcnQoeCArIDEpKTtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuNSBNYXRoLmFzaW5oKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRhc2luaCA9IE1hdGguYXNpbmg7XG5cbmZ1bmN0aW9uIGFzaW5oKHgpIHtcbiAgcmV0dXJuICFpc0Zpbml0ZSh4ID0gK3gpIHx8IHggPT0gMCA/IHggOiB4IDwgMCA/IC1hc2luaCgteCkgOiBNYXRoLmxvZyh4ICsgTWF0aC5zcXJ0KHggKiB4ICsgMSkpO1xufVxuXG4vLyBUb3IgQnJvd3NlciBidWc6IE1hdGguYXNpbmgoMCkgLT4gLTBcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogISgkYXNpbmggJiYgMSAvICRhc2luaCgwKSA+IDApLCAnTWF0aCcsIHsgYXNpbmg6IGFzaW5oIH0pO1xuIiwiLy8gMjAuMi4yLjcgTWF0aC5hdGFuaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkYXRhbmggPSBNYXRoLmF0YW5oO1xuXG4vLyBUb3IgQnJvd3NlciBidWc6IE1hdGguYXRhbmgoLTApIC0+IDBcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogISgkYXRhbmggJiYgMSAvICRhdGFuaCgtMCkgPCAwKSwgJ01hdGgnLCB7XG4gIGF0YW5oOiBmdW5jdGlvbiBhdGFuaCh4KSB7XG4gICAgcmV0dXJuICh4ID0gK3gpID09IDAgPyB4IDogTWF0aC5sb2coKDEgKyB4KSAvICgxIC0geCkpIC8gMjtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuOSBNYXRoLmNicnQoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgc2lnbiA9IHJlcXVpcmUoJy4vX21hdGgtc2lnbicpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNicnQ6IGZ1bmN0aW9uIGNicnQoeCkge1xuICAgIHJldHVybiBzaWduKHggPSAreCkgKiBNYXRoLnBvdyhNYXRoLmFicyh4KSwgMSAvIDMpO1xuICB9XG59KTtcbiIsIi8vIDIwLjIuMi4xMSBNYXRoLmNsejMyKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNsejMyOiBmdW5jdGlvbiBjbHozMih4KSB7XG4gICAgcmV0dXJuICh4ID4+Pj0gMCkgPyAzMSAtIE1hdGguZmxvb3IoTWF0aC5sb2coeCArIDAuNSkgKiBNYXRoLkxPRzJFKSA6IDMyO1xuICB9XG59KTtcbiIsIi8vIDIwLjIuMi4xMiBNYXRoLmNvc2goeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZXhwID0gTWF0aC5leHA7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgY29zaDogZnVuY3Rpb24gY29zaCh4KSB7XG4gICAgcmV0dXJuIChleHAoeCA9ICt4KSArIGV4cCgteCkpIC8gMjtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuMTQgTWF0aC5leHBtMSh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZXhwbTEgPSByZXF1aXJlKCcuL19tYXRoLWV4cG0xJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCRleHBtMSAhPSBNYXRoLmV4cG0xKSwgJ01hdGgnLCB7IGV4cG0xOiAkZXhwbTEgfSk7XG4iLCIvLyAyMC4yLjIuMTYgTWF0aC5mcm91bmQoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgZnJvdW5kOiByZXF1aXJlKCcuL19tYXRoLWZyb3VuZCcpIH0pO1xuIiwiLy8gMjAuMi4yLjE3IE1hdGguaHlwb3QoW3ZhbHVlMVssIHZhbHVlMlssIOKApiBdXV0pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFicyA9IE1hdGguYWJzO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGh5cG90OiBmdW5jdGlvbiBoeXBvdCh2YWx1ZTEsIHZhbHVlMikgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIHN1bSA9IDA7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgbGFyZyA9IDA7XG4gICAgdmFyIGFyZywgZGl2O1xuICAgIHdoaWxlIChpIDwgYUxlbikge1xuICAgICAgYXJnID0gYWJzKGFyZ3VtZW50c1tpKytdKTtcbiAgICAgIGlmIChsYXJnIDwgYXJnKSB7XG4gICAgICAgIGRpdiA9IGxhcmcgLyBhcmc7XG4gICAgICAgIHN1bSA9IHN1bSAqIGRpdiAqIGRpdiArIDE7XG4gICAgICAgIGxhcmcgPSBhcmc7XG4gICAgICB9IGVsc2UgaWYgKGFyZyA+IDApIHtcbiAgICAgICAgZGl2ID0gYXJnIC8gbGFyZztcbiAgICAgICAgc3VtICs9IGRpdiAqIGRpdjtcbiAgICAgIH0gZWxzZSBzdW0gKz0gYXJnO1xuICAgIH1cbiAgICByZXR1cm4gbGFyZyA9PT0gSW5maW5pdHkgPyBJbmZpbml0eSA6IGxhcmcgKiBNYXRoLnNxcnQoc3VtKTtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuMTggTWF0aC5pbXVsKHgsIHkpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRpbXVsID0gTWF0aC5pbXVsO1xuXG4vLyBzb21lIFdlYktpdCB2ZXJzaW9ucyBmYWlscyB3aXRoIGJpZyBudW1iZXJzLCBzb21lIGhhcyB3cm9uZyBhcml0eVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICRpbXVsKDB4ZmZmZmZmZmYsIDUpICE9IC01IHx8ICRpbXVsLmxlbmd0aCAhPSAyO1xufSksICdNYXRoJywge1xuICBpbXVsOiBmdW5jdGlvbiBpbXVsKHgsIHkpIHtcbiAgICB2YXIgVUlOVDE2ID0gMHhmZmZmO1xuICAgIHZhciB4biA9ICt4O1xuICAgIHZhciB5biA9ICt5O1xuICAgIHZhciB4bCA9IFVJTlQxNiAmIHhuO1xuICAgIHZhciB5bCA9IFVJTlQxNiAmIHluO1xuICAgIHJldHVybiAwIHwgeGwgKiB5bCArICgoVUlOVDE2ICYgeG4gPj4+IDE2KSAqIHlsICsgeGwgKiAoVUlOVDE2ICYgeW4gPj4+IDE2KSA8PCAxNiA+Pj4gMCk7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMi4yLjIxIE1hdGgubG9nMTAoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgbG9nMTA6IGZ1bmN0aW9uIGxvZzEwKHgpIHtcbiAgICByZXR1cm4gTWF0aC5sb2coeCkgKiBNYXRoLkxPRzEwRTtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuMjAgTWF0aC5sb2cxcCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywgeyBsb2cxcDogcmVxdWlyZSgnLi9fbWF0aC1sb2cxcCcpIH0pO1xuIiwiLy8gMjAuMi4yLjIyIE1hdGgubG9nMih4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBsb2cyOiBmdW5jdGlvbiBsb2cyKHgpIHtcbiAgICByZXR1cm4gTWF0aC5sb2coeCkgLyBNYXRoLkxOMjtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuMjggTWF0aC5zaWduKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7IHNpZ246IHJlcXVpcmUoJy4vX21hdGgtc2lnbicpIH0pO1xuIiwiLy8gMjAuMi4yLjMwIE1hdGguc2luaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBleHBtMSA9IHJlcXVpcmUoJy4vX21hdGgtZXhwbTEnKTtcbnZhciBleHAgPSBNYXRoLmV4cDtcblxuLy8gVjggbmVhciBDaHJvbWl1bSAzOCBoYXMgYSBwcm9ibGVtIHdpdGggdmVyeSBzbWFsbCBudW1iZXJzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gIU1hdGguc2luaCgtMmUtMTcpICE9IC0yZS0xNztcbn0pLCAnTWF0aCcsIHtcbiAgc2luaDogZnVuY3Rpb24gc2luaCh4KSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKHggPSAreCkgPCAxXG4gICAgICA/IChleHBtMSh4KSAtIGV4cG0xKC14KSkgLyAyXG4gICAgICA6IChleHAoeCAtIDEpIC0gZXhwKC14IC0gMSkpICogKE1hdGguRSAvIDIpO1xuICB9XG59KTtcbiIsIi8vIDIwLjIuMi4zMyBNYXRoLnRhbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZXhwbTEgPSByZXF1aXJlKCcuL19tYXRoLWV4cG
461840xJyk7XG52YXIgZXhwID0gTWF0aC5leHA7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgdGFuaDogZnVuY3Rpb24gdGFuaCh4KSB7XG4gICAgdmFyIGEgPSBleHBtMSh4ID0gK3gpO1xuICAgIHZhciBiID0gZXhwbTEoLXgpO1xuICAgIHJldHVybiBhID09IEluZmluaXR5ID8gMSA6IGIgPT0gSW5maW5pdHkgPyAtMSA6IChhIC0gYikgLyAoZXhwKHgpICsgZXhwKC14KSk7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMi4yLjM0IE1hdGgudHJ1bmMoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgdHJ1bmM6IGZ1bmN0aW9uIHRydW5jKGl0KSB7XG4gICAgcmV0dXJuIChpdCA+IDAgPyBNYXRoLmZsb29yIDogTWF0aC5jZWlsKShpdCk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi9faW5oZXJpdC1pZi1yZXF1aXJlZCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgJHRyaW0gPSByZXF1aXJlKCcuL19zdHJpbmctdHJpbScpLnRyaW07XG52YXIgTlVNQkVSID0gJ051bWJlcic7XG52YXIgJE51bWJlciA9IGdsb2JhbFtOVU1CRVJdO1xudmFyIEJhc2UgPSAkTnVtYmVyO1xudmFyIHByb3RvID0gJE51bWJlci5wcm90b3R5cGU7XG4vLyBPcGVyYSB+MTIgaGFzIGJyb2tlbiBPYmplY3QjdG9TdHJpbmdcbnZhciBCUk9LRU5fQ09GID0gY29mKHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKShwcm90bykpID09IE5VTUJFUjtcbnZhciBUUklNID0gJ3RyaW0nIGluIFN0cmluZy5wcm90b3R5cGU7XG5cbi8vIDcuMS4zIFRvTnVtYmVyKGFyZ3VtZW50KVxudmFyIHRvTnVtYmVyID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBpdCA9IHRvUHJpbWl0aXZlKGFyZ3VtZW50LCBmYWxzZSk7XG4gIGlmICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgJiYgaXQubGVuZ3RoID4gMikge1xuICAgIGl0ID0gVFJJTSA/IGl0LnRyaW0oKSA6ICR0cmltKGl0LCAzKTtcbiAgICB2YXIgZmlyc3QgPSBpdC5jaGFyQ29kZUF0KDApO1xuICAgIHZhciB0aGlyZCwgcmFkaXgsIG1heENvZGU7XG4gICAgaWYgKGZpcnN0ID09PSA0MyB8fCBmaXJzdCA9PT0gNDUpIHtcbiAgICAgIHRoaXJkID0gaXQuY2hhckNvZGVBdCgyKTtcbiAgICAgIGlmICh0aGlyZCA9PT0gODggfHwgdGhpcmQgPT09IDEyMCkgcmV0dXJuIE5hTjsgLy8gTnVtYmVyKCcrMHgxJykgc2hvdWxkIGJlIE5hTiwgb2xkIFY4IGZpeFxuICAgIH0gZWxzZSBpZiAoZmlyc3QgPT09IDQ4KSB7XG4gICAgICBzd2l0Y2ggKGl0LmNoYXJDb2RlQXQoMSkpIHtcbiAgICAgICAgY2FzZSA2NjogY2FzZSA5ODogcmFkaXggPSAyOyBtYXhDb2RlID0gNDk7IGJyZWFrOyAvLyBmYXN0IGVxdWFsIC9eMGJbMDFdKyQvaVxuICAgICAgICBjYXNlIDc5OiBjYXNlIDExMTogcmFkaXggPSA4OyBtYXhDb2RlID0gNTU7IGJyZWFrOyAvLyBmYXN0IGVxdWFsIC9eMG9bMC03XSskL2lcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuICtpdDtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGRpZ2l0cyA9IGl0LnNsaWNlKDIpLCBpID0gMCwgbCA9IGRpZ2l0cy5sZW5ndGgsIGNvZGU7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29kZSA9IGRpZ2l0cy5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAvLyBwYXJzZUludCBwYXJzZXMgYSBzdHJpbmcgdG8gYSBmaXJzdCB1bmF2YWlsYWJsZSBzeW1ib2xcbiAgICAgICAgLy8gYnV0IFRvTnVtYmVyIHNob3VsZCByZXR1cm4gTmFOIGlmIGEgc3RyaW5nIGNvbnRhaW5zIHVuYXZhaWxhYmxlIHN5bWJvbHNcbiAgICAgICAgaWYgKGNvZGUgPCA0OCB8fCBjb2RlID4gbWF4Q29kZSkgcmV0dXJuIE5hTjtcbiAgICAgIH0gcmV0dXJuIHBhcnNlSW50KGRpZ2l0cywgcmFkaXgpO1xuICAgIH1cbiAgfSByZXR1cm4gK2l0O1xufTtcblxuaWYgKCEkTnVtYmVyKCcgMG8xJykgfHwgISROdW1iZXIoJzBiMScpIHx8ICROdW1iZXIoJysweDEnKSkge1xuICAkTnVtYmVyID0gZnVuY3Rpb24gTnVtYmVyKHZhbHVlKSB7XG4gICAgdmFyIGl0ID0gYXJndW1lbnRzLmxlbmd0aCA8IDEgPyAwIDogdmFsdWU7XG4gICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgIHJldHVybiB0aGF0IGluc3RhbmNlb2YgJE51bWJlclxuICAgICAgLy8gY2hlY2sgb24gMS4uY29uc3RydWN0b3IoZm9vKSBjYXNlXG4gICAgICAmJiAoQlJPS0VOX0NPRiA/IGZhaWxzKGZ1bmN0aW9uICgpIHsgcHJvdG8udmFsdWVPZi5jYWxsKHRoYXQpOyB9KSA6IGNvZih0aGF0KSAhPSBOVU1CRVIpXG4gICAgICAgID8gaW5oZXJpdElmUmVxdWlyZWQobmV3IEJhc2UodG9OdW1iZXIoaXQpKSwgdGhhdCwgJE51bWJlcikgOiB0b051bWJlcihpdCk7XG4gIH07XG4gIGZvciAodmFyIGtleXMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZ09QTihCYXNlKSA6IChcbiAgICAvLyBFUzM6XG4gICAgJ01BWF9WQUxVRSxNSU5fVkFMVUUsTmFOLE5FR0FUSVZFX0lORklOSVRZLFBPU0lUSVZFX0lORklOSVRZLCcgK1xuICAgIC8vIEVTNiAoaW4gY2FzZSwgaWYgbW9kdWxlcyB3aXRoIEVTNiBOdW1iZXIgc3RhdGljcyByZXF1aXJlZCBiZWZvcmUpOlxuICAgICdFUFNJTE9OLGlzRmluaXRlLGlzSW50ZWdlcixpc05hTixpc1NhZmVJbnRlZ2VyLE1BWF9TQUZFX0lOVEVHRVIsJyArXG4gICAgJ01JTl9TQUZFX0lOVEVHRVIscGFyc2VGbG9hdCxwYXJzZUludCxpc0ludGVnZXInXG4gICkuc3BsaXQoJywnKSwgaiA9IDAsIGtleTsga2V5cy5sZW5ndGggPiBqOyBqKyspIHtcbiAgICBpZiAoaGFzKEJhc2UsIGtleSA9IGtleXNbal0pICYmICFoYXMoJE51bWJlciwga2V5KSkge1xuICAgICAgZFAoJE51bWJlciwga2V5LCBnT1BEKEJhc2UsIGtleSkpO1xuICAgIH1cbiAgfVxuICAkTnVtYmVyLnByb3RvdHlwZSA9IHByb3RvO1xuICBwcm90by5jb25zdHJ1Y3RvciA9ICROdW1iZXI7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoZ2xvYmFsLCBOVU1CRVIsICROdW1iZXIpO1xufVxuIiwiLy8gMjAuMS4yLjEgTnVtYmVyLkVQU0lMT05cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywgeyBFUFNJTE9OOiBNYXRoLnBvdygyLCAtNTIpIH0pO1xuIiwiLy8gMjAuMS4yLjIgTnVtYmVyLmlzRmluaXRlKG51bWJlcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgX2lzRmluaXRlID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuaXNGaW5pdGU7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge1xuICBpc0Zpbml0ZTogZnVuY3Rpb24gaXNGaW5pdGUo
46184aXQpIHtcbiAgICByZXR1cm4gdHlwZW9mIGl0ID09ICdudW1iZXInICYmIF9pc0Zpbml0ZShpdCk7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHsgaXNJbnRlZ2VyOiByZXF1aXJlKCcuL19pcy1pbnRlZ2VyJykgfSk7XG4iLCIvLyAyMC4xLjIuNCBOdW1iZXIuaXNOYU4obnVtYmVyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7XG4gIGlzTmFOOiBmdW5jdGlvbiBpc05hTihudW1iZXIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgcmV0dXJuIG51bWJlciAhPSBudW1iZXI7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMS4yLjUgTnVtYmVyLmlzU2FmZUludGVnZXIobnVtYmVyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBpc0ludGVnZXIgPSByZXF1aXJlKCcuL19pcy1pbnRlZ2VyJyk7XG52YXIgYWJzID0gTWF0aC5hYnM7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge1xuICBpc1NhZmVJbnRlZ2VyOiBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKG51bWJlcikge1xuICAgIHJldHVybiBpc0ludGVnZXIobnVtYmVyKSAmJiBhYnMobnVtYmVyKSA8PSAweDFmZmZmZmZmZmZmZmZmO1xuICB9XG59KTtcbiIsIi8vIDIwLjEuMi42IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHsgTUFYX1NBRkVfSU5URUdFUjogMHgxZmZmZmZmZmZmZmZmZiB9KTtcbiIsIi8vIDIwLjEuMi4xMCBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7IE1JTl9TQUZFX0lOVEVHRVI6IC0weDFmZmZmZmZmZmZmZmZmIH0pO1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFyc2VGbG9hdCA9IHJlcXVpcmUoJy4vX3BhcnNlLWZsb2F0Jyk7XG4vLyAyMC4xLjIuMTIgTnVtYmVyLnBhcnNlRmxvYXQoc3RyaW5nKVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTnVtYmVyLnBhcnNlRmxvYXQgIT0gJHBhcnNlRmxvYXQpLCAnTnVtYmVyJywgeyBwYXJzZUZsb2F0OiAkcGFyc2VGbG9hdCB9KTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi9fcGFyc2UtaW50Jyk7XG4vLyAyMC4xLjIuMTMgTnVtYmVyLnBhcnNlSW50KHN0cmluZywgcmFkaXgpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChOdW1iZXIucGFyc2VJbnQgIT0gJHBhcnNlSW50KSwgJ051bWJlcicsIHsgcGFyc2VJbnQ6ICRwYXJzZUludCB9KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIGFOdW1iZXJWYWx1ZSA9IHJlcXVpcmUoJy4vX2EtbnVtYmVyLXZhbHVlJyk7XG52YXIgcmVwZWF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLXJlcGVhdCcpO1xudmFyICR0b0ZpeGVkID0gMS4wLnRvRml4ZWQ7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIGRhdGEgPSBbMCwgMCwgMCwgMCwgMCwgMF07XG52YXIgRVJST1IgPSAnTnVtYmVyLnRvRml4ZWQ6IGluY29ycmVjdCBpbnZvY2F0aW9uISc7XG52YXIgWkVSTyA9ICcwJztcblxudmFyIG11bHRpcGx5ID0gZnVuY3Rpb24gKG4sIGMpIHtcbiAgdmFyIGkgPSAtMTtcbiAgdmFyIGMyID0gYztcbiAgd2hpbGUgKCsraSA8IDYpIHtcbiAgICBjMiArPSBuICogZGF0YVtpXTtcbiAgICBkYXRhW2ldID0gYzIgJSAxZTc7XG4gICAgYzIgPSBmbG9vcihjMiAvIDFlNyk7XG4gIH1cbn07XG52YXIgZGl2aWRlID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIGkgPSA2O1xuICB2YXIgYyA9IDA7XG4gIHdoaWxlICgtLWkgPj0gMCkge1xuICAgIGMgKz0gZGF0YVtpXTtcbiAgICBkYXRhW2ldID0gZmxvb3IoYyAvIG4pO1xuICAgIGMgPSAoYyAlIG4pICogMWU3O1xuICB9XG59O1xudmFyIG51bVRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaSA9IDY7XG4gIHZhciBzID0gJyc7XG4gIHdoaWxlICgtLWkgPj0gMCkge1xuICAgIGlmIChzICE9PSAnJyB8fCBpID09PSAwIHx8IGRhdGFbaV0gIT09IDApIHtcbiAgICAgIHZhciB0ID0gU3RyaW5nKGRhdGFbaV0pO1xuICAgICAgcyA9IHMgPT09ICcnID8gdCA6IHMgKyByZXBlYXQuY2FsbChaRVJPLCA3IC0gdC5sZW5ndGgpICsgdDtcbiAgICB9XG4gIH0gcmV0dXJuIHM7XG59O1xudmFyIHBvdyA9IGZ1bmN0aW9uICh4LCBuLCBhY2MpIHtcbiAgcmV0dXJuIG4gPT09IDAgPyBhY2MgOiBuICUgMiA9PT0gMSA/IHBvdyh4LCBuIC0gMSwgYWNjICogeCkgOiBwb3coeCAqIHgsIG4gLyAyLCBhY2MpO1xufTtcbnZhciBsb2cgPSBmdW5jdGlvbiAoeCkge1xuICB2YXIgbiA9IDA7XG4gIHZhciB4MiA9IHg7XG4gIHdoaWxlICh4MiA+PSA0MDk2KSB7XG4gICAgbiArPSAxMjtcbiAgICB4MiAvPSA0MDk2O1xuICB9XG4gIHdoaWxlICh4MiA+PSAyKSB7XG4gICAgbiArPSAxO1xuICAgIHgyIC89IDI7XG4gIH0gcmV0dXJuIG47XG59O1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICghISR0b0ZpeGVkICYmIChcbiAgMC4wMDAwOC50b0ZpeGVkKDMpICE9PSAnMC4wMDAnIHx8XG4gIDAuOS50b0ZpeGVkKDApICE9PSAnMScgfHxcbiAgMS4yNTUudG9GaXhlZCgyKSAhPT0gJzEuMjUnIHx8XG4gIDEwMDAwMDAwMDAwMDAwMDAxMjguMC50b0ZpeGVkKDApICE9PSAnMTAwMDAwMDAwMDAwMDAwMDEyOCdcbikgfHwgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICAvLyBWOCB+IEFuZHJvaWQgNC4zLVxuICAkdG9GaXhlZC5jYWxsKHt9KTtcbn0pKSwgJ051bWJlcicsIHtcbiAgdG9GaXhlZDogZnVuY3Rpb24gdG9GaXhlZChmcmFjdGlvbkRpZ2l0cykge1xuICAgIHZhciB4ID0gYU51bWJlclZhbHVlKHRoaXMsIEVSUk9SKTtcbiAgICB2YXIgZiA9IHRvSW50ZWdlcihmcmFjdGlvbkRpZ2l0cyk7XG4gICAgdmFyIHMgPSAnJztcbiAgICB2YXIgbSA9IFpFUk87XG4gICAgdmFyIGUsIHosIGosIGs7XG4gICAgaWYgKGYgPCAwIHx8IGYgPiAyMCkgdGhyb3cgUmFuZ2VFcnJvcihFUlJPUik7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmICh4ICE9IHgpIHJldHVybiAnTmFOJztcbiAgICBpZiAoeCA8PSAtMWUyMSB8fCB4ID49IDFlMjEpIHJldHVybi
46184BTdHJpbmcoeCk7XG4gICAgaWYgKHggPCAwKSB7XG4gICAgICBzID0gJy0nO1xuICAgICAgeCA9IC14O1xuICAgIH1cbiAgICBpZiAoeCA+IDFlLTIxKSB7XG4gICAgICBlID0gbG9nKHggKiBwb3coMiwgNjksIDEpKSAtIDY5O1xuICAgICAgeiA9IGUgPCAwID8geCAqIHBvdygyLCAtZSwgMSkgOiB4IC8gcG93KDIsIGUsIDEpO1xuICAgICAgeiAqPSAweDEwMDAwMDAwMDAwMDAwO1xuICAgICAgZSA9IDUyIC0gZTtcbiAgICAgIGlmIChlID4gMCkge1xuICAgICAgICBtdWx0aXBseSgwLCB6KTtcbiAgICAgICAgaiA9IGY7XG4gICAgICAgIHdoaWxlIChqID49IDcpIHtcbiAgICAgICAgICBtdWx0aXBseSgxZTcsIDApO1xuICAgICAgICAgIGogLT0gNztcbiAgICAgICAgfVxuICAgICAgICBtdWx0aXBseShwb3coMTAsIGosIDEpLCAwKTtcbiAgICAgICAgaiA9IGUgLSAxO1xuICAgICAgICB3aGlsZSAoaiA+PSAyMykge1xuICAgICAgICAgIGRpdmlkZSgxIDw8IDIzKTtcbiAgICAgICAgICBqIC09IDIzO1xuICAgICAgICB9XG4gICAgICAgIGRpdmlkZSgxIDw8IGopO1xuICAgICAgICBtdWx0aXBseSgxLCAxKTtcbiAgICAgICAgZGl2aWRlKDIpO1xuICAgICAgICBtID0gbnVtVG9TdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG11bHRpcGx5KDAsIHopO1xuICAgICAgICBtdWx0aXBseSgxIDw8IC1lLCAwKTtcbiAgICAgICAgbSA9IG51bVRvU3RyaW5nKCkgKyByZXBlYXQuY2FsbChaRVJPLCBmKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGYgPiAwKSB7XG4gICAgICBrID0gbS5sZW5ndGg7XG4gICAgICBtID0gcyArIChrIDw9IGYgPyAnMC4nICsgcmVwZWF0LmNhbGwoWkVSTywgZiAtIGspICsgbSA6IG0uc2xpY2UoMCwgayAtIGYpICsgJy4nICsgbS5zbGljZShrIC0gZikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gcyArIG07XG4gICAgfSByZXR1cm4gbTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgYU51bWJlclZhbHVlID0gcmVxdWlyZSgnLi9fYS1udW1iZXItdmFsdWUnKTtcbnZhciAkdG9QcmVjaXNpb24gPSAxLjAudG9QcmVjaXNpb247XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKCRmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIElFNy1cbiAgcmV0dXJuICR0b1ByZWNpc2lvbi5jYWxsKDEsIHVuZGVmaW5lZCkgIT09ICcxJztcbn0pIHx8ICEkZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBWOCB+IEFuZHJvaWQgNC4zLVxuICAkdG9QcmVjaXNpb24uY2FsbCh7fSk7XG59KSksICdOdW1iZXInLCB7XG4gIHRvUHJlY2lzaW9uOiBmdW5jdGlvbiB0b1ByZWNpc2lvbihwcmVjaXNpb24pIHtcbiAgICB2YXIgdGhhdCA9IGFOdW1iZXJWYWx1ZSh0aGlzLCAnTnVtYmVyI3RvUHJlY2lzaW9uOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnKTtcbiAgICByZXR1cm4gcHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyAkdG9QcmVjaXNpb24uY2FsbCh0aGF0KSA6ICR0b1ByZWNpc2lvbi5jYWxsKHRoYXQsIHByZWNpc2lvbik7XG4gIH1cbn0pO1xuIiwiLy8gMTkuMS4zLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GLCAnT2JqZWN0JywgeyBhc3NpZ246IHJlcXVpcmUoJy4vX29iamVjdC1hc3NpZ24nKSB9KTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4vLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0JywgeyBjcmVhdGU6IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKSB9KTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4vLyAxOS4xLjIuMyAvIDE1LjIuMy43IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpLCAnT2JqZWN0JywgeyBkZWZpbmVQcm9wZXJ0aWVzOiByZXF1aXJlKCcuL19vYmplY3QtZHBzJykgfSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuLy8gMTkuMS4yLjQgLyAxNS4yLjMuNiBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyksICdPYmplY3QnLCB7IGRlZmluZVByb3BlcnR5OiByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mIH0pO1xuIiwiLy8gMTkuMS4yLjUgT2JqZWN0LmZyZWV6ZShPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgbWV0YSA9IHJlcXVpcmUoJy4vX21ldGEnKS5vbkZyZWV6ZTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdmcmVlemUnLCBmdW5jdGlvbiAoJGZyZWV6ZSkge1xuICByZXR1cm4gZnVuY3Rpb24gZnJlZXplKGl0KSB7XG4gICAgcmV0dXJuICRmcmVlemUgJiYgaXNPYmplY3QoaXQpID8gJGZyZWV6ZShtZXRhKGl0KSkgOiBpdDtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2dldE93blByb3BlcnR5RGVzY3JpcHRvcicsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodG9JT2JqZWN0KGl0KSwga2V5KTtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4yLjcgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZ2V0T3duUHJvcGVydHlOYW1lcycsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHJlcXVpcmUoJy4vX29iamVjdC1nb3BuLWV4dCcpLmY7XG59KTtcbiIsIi8vIDE5LjEuMi45IE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgJGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2dldFByb3RvdHlwZU9mJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2YoaXQpIHtcbiAgICByZXR1cm4gJGdldFByb3RvdHlwZU9mKHRvT2JqZWN0KGl0KSk7XG4gIH07XG59
46184KTtcbiIsIi8vIDE5LjEuMi4xMSBPYmplY3QuaXNFeHRlbnNpYmxlKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdpc0V4dGVuc2libGUnLCBmdW5jdGlvbiAoJGlzRXh0ZW5zaWJsZSkge1xuICByZXR1cm4gZnVuY3Rpb24gaXNFeHRlbnNpYmxlKGl0KSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/ICRpc0V4dGVuc2libGUgPyAkaXNFeHRlbnNpYmxlKGl0KSA6IHRydWUgOiBmYWxzZTtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4yLjEyIE9iamVjdC5pc0Zyb3plbihPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnaXNGcm96ZW4nLCBmdW5jdGlvbiAoJGlzRnJvemVuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpc0Zyb3plbihpdCkge1xuICAgIHJldHVybiBpc09iamVjdChpdCkgPyAkaXNGcm96ZW4gPyAkaXNGcm96ZW4oaXQpIDogZmFsc2UgOiB0cnVlO1xuICB9O1xufSk7XG4iLCIvLyAxOS4xLjIuMTMgT2JqZWN0LmlzU2VhbGVkKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdpc1NlYWxlZCcsIGZ1bmN0aW9uICgkaXNTZWFsZWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlzU2VhbGVkKGl0KSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/ICRpc1NlYWxlZCA/ICRpc1NlYWxlZChpdCkgOiBmYWxzZSA6IHRydWU7XG4gIH07XG59KTtcbiIsIi8vIDE5LjEuMy4xMCBPYmplY3QuaXModmFsdWUxLCB2YWx1ZTIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7IGlzOiByZXF1aXJlKCcuL19zYW1lLXZhbHVlJykgfSk7XG4iLCIvLyAxOS4xLjIuMTQgT2JqZWN0LmtleXMoTylcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdrZXlzJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24ga2V5cyhpdCkge1xuICAgIHJldHVybiAka2V5cyh0b09iamVjdChpdCkpO1xuICB9O1xufSk7XG4iLCIvLyAxOS4xLjIuMTUgT2JqZWN0LnByZXZlbn
46184RFeHRlbnNpb25zKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBtZXRhID0gcmVxdWlyZSgnLi9fbWV0YScpLm9uRnJlZXplO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ3ByZXZlbnRFeHRlbnNpb25zJywgZnVuY3Rpb24gKCRwcmV2ZW50RXh0ZW5zaW9ucykge1xuICByZXR1cm4gZnVuY3Rpb24gcHJldmVudEV4dGVuc2lvbnMoaXQpIHtcbiAgICByZXR1cm4gJHByZXZlbnRFeHRlbnNpb25zICYmIGlzT2JqZWN0KGl0KSA/ICRwcmV2ZW50RXh0ZW5zaW9ucyhtZXRhKGl0KSkgOiBpdDtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4yLjE3IE9iamVjdC5zZWFsKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBtZXRhID0gcmVxdWlyZSgnLi9fbWV0YScpLm9uRnJlZXplO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ3NlYWwnLCBmdW5jdGlvbiAoJHNlYWwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNlYWwoaXQpIHtcbiAgICByZXR1cm4gJHNlYWwgJiYgaXNPYmplY3QoaXQpID8gJHNlYWwobWV0YShpdCkpIDogaXQ7XG4gIH07XG59KTtcbiIsIi8vIDE5LjEuMy4xOSBPYmplY3Quc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7IHNldFByb3RvdHlwZU9mOiByZXF1aXJlKCcuL19zZXQtcHJvdG8nKS5zZXQgfSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIHRlc3QgPSB7fTtcbnRlc3RbcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyldID0gJ3onO1xuaWYgKHRlc3QgKyAnJyAhPSAnW29iamVjdCB6XScpIHtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShPYmplY3QucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG4gIH0sIHRydWUpO1xufVxuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFyc2VGbG9hdCA9IHJlcXVpcmUoJy4vX3BhcnNlLWZsb2F0Jyk7XG4vLyAxOC4yLjQgcGFyc2VGbG9hdChzdHJpbmcpXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuRiAqIChwYXJzZUZsb2F0ICE9ICRwYXJzZUZsb2F0KSwgeyBwYXJzZUZsb2F0OiAkcGFyc2VGbG9hdCB9KTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi9fcGFyc2UtaW50Jyk7XG4vLyAxOC4yLjUgcGFyc2VJbnQoc3RyaW5nLCByYWRpeClcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5GICogKHBhcnNlSW50ICE9ICRwYXJzZUludCksIHsgcGFyc2VJbnQ6ICRwYXJzZUludCB9KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4vX3BlcmZvcm0nKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuL191c2VyLWFnZW50Jyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuL19wcm9taXNlLXJlc29sdmUnKTtcbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zO1xudmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjggfHwgJyc7XG52YXIgJFByb21pc2UgPSBnbG9iYWxbUFJPTUlTRV07XG52YXIgaXNOb2RlID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG52YXIgZW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgSW50ZXJuYWwsIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlID0gJFByb21pc2UucmVzb2x2ZSgxKTtcbiAgICB2YXIgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtyZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpXSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGVtcHR5LCBlbXB0eSk7XG4gICAgfTtcbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgcmV0dXJuIChpc05vZGUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKVxuICAgICAgJiYgcHJvbWlzZS50aGVuKGVtcHR5KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlXG4gICAgICAvLyB2OCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gICAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjVcbiAgICAgIC8vIHdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gICAgICAmJiB2OC5pbmRleE9mKCc2LjYnKSAhPT0gMFxuICAgICAgJiYgdXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZS82NicpID09PSAtMTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59KCk7XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChwcm9taXNlLCBpc1JlamVjdCkge1xuICBpZiAocHJvbWlzZS5fbikgcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciBvayA9IHByb21pc2UuX3MgPT0gMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uIChyZWFjdGlvbikge1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2Y
46184XIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZS5faCA9PSAyKSBvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlKTtcbiAgICAgICAgICAgIHByb21pc2UuX2ggPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZW50ZXIoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpOyAvLyBtYXkgdGhyb3dcbiAgICAgICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgICAgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkge1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoZW4uY2FsbChyZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IGkpIHJ1bihjaGFpbltpKytdKTsgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICBwcm9taXNlLl9jID0gW107XG4gICAgcHJvbWlzZS5fbiA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhcHJvbWlzZS5faCkgb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciB1bmhhbmRsZWQgPSBpc1VuaGFuZGxlZChwcm9taXNlKTtcbiAgICB2YXIgcmVzdWx0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmICh1bmhhbmRsZWQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbikge1xuICAgICAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHZhbHVlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHByb21pc2UuX2ggPSBpc05vZGUgfHwgaXNVbmhhbmRsZWQocHJvbWlzZSkgPyAyIDogMTtcbiAgICB9IHByb21pc2UuX2EgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHVuaGFuZGxlZCAmJiByZXN1bHQuZSkgdGhyb3cgcmVzdWx0LnY7XG4gIH0pO1xufTtcbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHJldHVybiBwcm9taXNlLl9oICE9PSAxICYmIChwcm9taXNlLl9hIHx8IHByb21pc2UuX2MpLmxlbmd0aCA9PT0gMDtcbn07XG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhhbmRsZXI7XG4gICAgaWYgKGlzTm9kZSkge1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCkge1xuICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcHJvbWlzZS5fdiB9KTtcbiAgICB9XG4gIH0pO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZiAoIXByb21pc2UuX2EpIHByb21pc2UuX2EgPSBwcm9taXNlLl9jLnNsaWNlKCk7XG4gIG5vdGlmeShwcm9taXNlLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICB2YXIgdGhlbjtcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICB0cnkge1xuICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3MgPSAxO1xuICAgICAgbm90aWZ5KHByb21pc2UsIGZhbHNlKTtcbiAgICB9XG4gI
46184H0gY2F0Y2ggKGUpIHtcbiAgICAkcmVqZWN0LmNhbGwoeyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoIVVTRV9OQVRJVkUpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgJFByb21pc2UgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgJHJlamVjdC5jYWxsKHRoaXMsIGVycik7XG4gICAgfVxuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgdGhpcy5fYyA9IFtdOyAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICB0aGlzLl9hID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgdGhpcy5fcyA9IDA7ICAgICAgICAgICAgICAvLyA8LSBzdGF0ZVxuICAgIHRoaXMuX2QgPSBmYWxzZTsgICAgICAgICAgLy8gPC0gZG9uZVxuICAgIHRoaXMuX3YgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gdmFsdWVcbiAgICB0aGlzLl9oID0gMDsgICAgICAgICAgICAgIC8vIDwtIHJlamVjdGlvbiBzdGF0ZSwgMCAtIGRlZmF1bHQsIDEgLSBoYW5kbGVkLCAyIC0gdW5oYW5kbGVkXG4gICAgdGhpcy5fbiA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJykoJFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2Y
46184XIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJFByb21pc2UpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gaXNOb2RlID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX2EpIHRoaXMuX2EucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fcykgbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBjdHgoJHJlc29sdmUsIHByb21pc2UsIDEpO1xuICAgIHRoaXMucmVqZWN0ID0gY3R4KCRyZWplY3QsIHByb21pc2UsIDEpO1xuICB9O1xuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBDID09PSAkUHJvbWlzZSB8fCBDID09PSBXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHsgUHJvbWlzZTogJFByb21pc2UgfSk7XG5yZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpKCRQcm9taXNlLCBQUk9NSVNFKTtcbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi9fY29yZScpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIHZhciAkJHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICQkcmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTElCUkFSWSB8fCAhVVNFX05BVElWRSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShMSUJSQVJZICYmIHRoaXMgPT09IFdyYXBwZXIgPyAkUHJvbWlzZSA6IHRoaXMsIHgpO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHtcbiAgJFByb21pc2UuYWxsKGl0ZXIpWydjYXRjaCddKGVtcHR5KTtcbn0pKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuMSBQcm9taXNlLmFsbChpdGVyYWJsZSlcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2Y
46184XIgJGluZGV4ID0gaW5kZXgrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiLy8gMjYuMS4xIFJlZmxlY3QuYXBwbHkodGFyZ2V0LCB0aGlzQXJndW1lbnQsIGFyZ3VtZW50c0xpc3QpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHJBcHBseSA9IChyZXF1aXJlKCcuL19nbG9iYWwnKS5SZWZsZWN0IHx8IHt9KS5hcHBseTtcbnZhciBmQXBwbHkgPSBGdW5jdGlvbi5hcHBseTtcbi8vIE1TIEVkZ2UgYXJndW1lbnRzTGlzdCBhcmd1bWVudCBpcyBvcHRpb25hbFxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJBcHBseShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSksICdSZWZsZWN0Jywge1xuICBhcHBseTogZnVuY3Rpb24gYXBwbHkodGFyZ2V0LCB0aGlzQXJndW1lbnQsIGFyZ3VtZW50c0xpc3QpIHtcbiAgICB2YXIgVCA9IGFGdW5jdGlvbih0YXJnZXQpO1xuICAgIHZhciBMID0gYW5PYmplY3QoYXJndW1lbnRzTGlzdCk7XG4gICAgcmV0dXJuIHJBcHBseSA/IHJBcHBseShULCB0aGlzQXJndW1lbnQsIEwpIDogZkFwcGx5LmNhbGwoVCwgdGhpc0FyZ3VtZW50LCBMKTtcbiAgfVxufSk7XG4iLCIvLyAyNi4xLjIgUmVmbGVjdC5jb25zdHJ1Y3QodGFyZ2V0LCBhcmd1bWVudHNMaXN0IFssIG5ld1RhcmdldF0pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi9fYmluZCcpO1xudmFyIHJDb25zdHJ1Y3QgPSAocmVxdWlyZSgnLi9fZ2xvYmFsJykuUmVmbGVjdCB8fCB7fSkuY29uc3RydWN0O1xuXG4vLyBNUyBFZGdlIHN1cHBvcnRzIG9ubHkgMiBhcmd1bWVudHMgYW5kIGFyZ3VtZW50c0xpc3QgYXJndW1lbnQgaXMgb3B0aW9uYWxcbi8vIEZGIE5pZ2h0bHkgc2V0cyB0aGlyZCBhcmd1bWVudCBhcyBgbmV3LnRhcmdldGAsIGJ1dCBkb2VzIG5vdCBjcmVhdGUgYHRoaXNgIGZyb20gaXRcbnZhciBORVdfVEFSR0VUX0JVRyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gIShyQ29uc3RydWN0KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgW10sIEYpIGluc3RhbmNlb2YgRik7XG59KTtcbnZhciBBUkdTX0JVRyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJDb25zdHJ1Y3QoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChORVdfVEFSR0VUX0JVRyB8fCBBUkdTX0JVRyksICdSZWZsZWN0Jywge1xuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIGNvbnN0cnVjdChUYXJnZXQsIGFyZ3MgLyogLCBuZXdUYXJnZXQgKi8pIHtcbiAgICBhRnVuY3Rpb24oVGFyZ2V0KTtcbiAgICBhbk9iamVjdChhcmdzKTtcbiAgICB2YXIgbmV3VGFyZ2V0ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyBUYXJnZXQgOiBhRnVuY3Rpb24oYXJndW1lbnRzWzJdKTtcbiAgICBpZiAoQVJHU19CVUcgJiYgIU5FV19UQVJHRVRfQlVHKSByZXR1cm4gckNvbnN0cnVjdChUYXJnZXQsIGFyZ3MsIG5ld1RhcmdldCk7XG4gICAgaWYgKFRhcmdldCA9PSBuZXdUYXJnZXQpIHtcbiAgICAgIC8vIHcvbyBhbHRlcmVkIG5ld1RhcmdldCwgb3B0aW1pemF0aW9uIGZvciAwLTQgYXJndW1lbnRzXG4gICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBUYXJnZXQoKTtcbiAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdKTtcbiAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgICAgIH1cbiAgICAgIC8vIHcvbyBhbHRlcmVkIG5ld1RhcmdldCwgbG90IG9mIGFyZ3VtZW50cyBjYXNlXG4gICAgICB2Y
46184XIgJGFyZ3MgPSBbbnVsbF07XG4gICAgICAkYXJncy5wdXNoLmFwcGx5KCRhcmdzLCBhcmdzKTtcbiAgICAgIHJldHVybiBuZXcgKGJpbmQuYXBwbHkoVGFyZ2V0LCAkYXJncykpKCk7XG4gICAgfVxuICAgIC8vIHdpdGggYWx0ZXJlZCBuZXdUYXJnZXQsIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGNvbnN0cnVjdG9yc1xuICAgIHZhciBwcm90byA9IG5ld1RhcmdldC5wcm90b3R5cGU7XG4gICAgdmFyIGluc3RhbmNlID0gY3JlYXRlKGlzT2JqZWN0KHByb3RvKSA/IHByb3RvIDogT2JqZWN0LnByb3RvdHlwZSk7XG4gICAgdmFyIHJlc3VsdCA9IEZ1bmN0aW9uLmFwcGx5LmNhbGwoVGFyZ2V0LCBpbnN0YW5jZSwgYXJncyk7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiBpbnN0YW5jZTtcbiAgfVxufSk7XG4iLCIvLyAyNi4xLjMgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKVxudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcblxuLy8gTVMgRWRnZSBoYXMgYnJva2VuIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkgLSB0aHJvd2luZyBpbnN0ZWFkIG9mIHJldHVybmluZyBmYWxzZVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoZFAuZih7fSwgMSwgeyB2YWx1ZTogMSB9KSwgMSwgeyB2YWx1ZTogMiB9KTtcbn0pLCAnUmVmbGVjdCcsIHtcbiAgZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpIHtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHByb3BlcnR5S2V5ID0gdG9QcmltaXRpdmUocHJvcGVydHlLZXksIHRydWUpO1xuICAgIGFuT2JqZWN0KGF0dHJpYnV0ZXMpO1xuICAgIHRyeSB7XG4gICAgICBkUC5mKHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufSk7XG4iLCIvLyAyNi4xLjQgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICB2YXIgZGVzYyA9IGdPUEQoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpO1xuICAgIHJldHVybiBkZXNjICYmICFkZXNjLmNvbmZpZ3VyYWJsZSA/IGZhbHNlIDogZGVsZXRlIHRhcmdldFtwcm9wZXJ0eUtleV07XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjYuMS41IFJlZmxlY3QuZW51bWVyYXRlKHRhcmdldClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBFbnVtZXJhdGUgPSBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgdGhpcy5fdCA9IGFuT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdmFyIGtleXMgPSB0aGlzLl9rID0gW107ICAgICAgLy8ga2V5c1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBpdGVyYXRlZCkga2V5cy5wdXNoKGtleSk7XG59O1xucmVxdWlyZSgnLi9faXRlci1jcmVhdGUnKShFbnVtZXJhdGUsICdPYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gIHZhciB0aGF0ID0gdGhpcztcbiAgdmFyIGtleXMgPSB0aGF0Ll9rO1xuICB2YXIga2V5O1xuICBkbyB7XG4gICAgaWYgKHRoYXQuX2kgPj0ga2V5cy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfSB3aGlsZSAoISgoa2V5ID0ga2V5c1t0aGF0Ll9pKytdKSBpbiB0aGF0Ll90KSk7XG4gIHJldHVybiB7IHZhbHVlOiBrZXksIGRvbmU6IGZhbHNlIH07XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBlbnVtZXJhdGU6IGZ1bmN0aW9uIGVudW1lcmF0ZSh0YXJnZXQpIHtcbiAgICByZXR1cm4gbmV3IEVudW1lcmF0ZSh0YXJnZXQpO1xuICB9XG59KTtcbiIsIi8vIDI2LjEuNyBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5S2V5KVxudmFyIGdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICByZXR1cm4gZ09QRC5mKGFuT2JqZWN0KHRhcmdldCksIHByb3BlcnR5S2V5KTtcbiAgfVxufSk7XG4iLCIvLyAyNi4xLjggUmVmbGVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGdldFByb3RvID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZ2V0UHJvdG90eXBlT2Y6IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKHRhcmdldCkge1xuICAgIHJldHVybiBnZXRQcm90byhhbk9iamVjdCh0YXJnZXQpKTtcbiAgfVxufSk7XG4iLCIvLyAyNi4xLjYgUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSBbLCByZWNlaXZlcl0pXG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcblxuZnVuY3Rpb24gZ2V0KHRhcmdldCwgcHJvcGVydHlLZXkgLyogLCByZWNlaXZlciAqLykge1xuICB2YXIgcmVjZWl2ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHRhcmdldCA6IGFyZ3VtZW50c1syXTtcbiAgdmFyIGRlc2MsIHByb3RvO1xuICBpZiAoYW5PYmplY3QodGFyZ2V0KSA9PT0gcmVjZWl2ZXIpIHJldHVybi
46184B0YXJnZXRbcHJvcGVydHlLZXldO1xuICBpZiAoZGVzYyA9IGdPUEQuZih0YXJnZXQsIHByb3BlcnR5S2V5KSkgcmV0dXJuIGhhcyhkZXNjLCAndmFsdWUnKVxuICAgID8gZGVzYy52YWx1ZVxuICAgIDogZGVzYy5nZXQgIT09IHVuZGVmaW5lZFxuICAgICAgPyBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmIChpc09iamVjdChwcm90byA9IGdldFByb3RvdHlwZU9mKHRhcmdldCkpKSByZXR1cm4gZ2V0KHByb3RvLCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpO1xufVxuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7IGdldDogZ2V0IH0pO1xuIiwiLy8gMjYuMS45IFJlZmxlY3QuaGFzKHRhcmdldCwgcHJvcGVydHlLZXkpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGhhczogZnVuY3Rpb24gaGFzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICByZXR1cm4gcHJvcGVydHlLZXkgaW4gdGFyZ2V0O1xuICB9XG59KTtcbiIsIi8vIDI2LjEuMTAgUmVmbGVjdC5pc0V4dGVuc2libGUodGFyZ2V0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyICRpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGlzRXh0ZW5zaWJsZTogZnVuY3Rpb24gaXNFeHRlbnNpYmxlKHRhcmdldCkge1xuICAgIGFuT2JqZWN0KHRhcmdldCk7XG4gICAgcmV0dXJuICRpc0V4dGVuc2libGUgPyAkaXNFeHRlbnNpYmxlKHRhcmdldCkgOiB0cnVlO1xuICB9XG59KTtcbiIsIi8vIDI2LjEuMTEgUmVmbGVjdC5vd25LZXlzKHRhcmdldClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHsgb3duS2V5czogcmVxdWlyZSgnLi9fb3duLWtleXMnKSB9KTtcbiIsIi8vIDI2LjEuMTIgUmVmbGVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgJHByZXZlbnRFeHRlbnNpb25zID0gT2JqZWN0LnByZXZlbn
46184RFeHRlbnNpb25zO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIHByZXZlbnRFeHRlbnNpb25zOiBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpIHtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoJHByZXZlbnRFeHRlbnNpb25zKSAkcHJldmVudEV4dGVuc2lvbnModGFyZ2V0KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn0pO1xuIiwiLy8gMjYuMS4xNCBSZWZsZWN0LnNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG8pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHNldFByb3RvID0gcmVxdWlyZSgnLi9fc2V0LXByb3RvJyk7XG5cbmlmIChzZXRQcm90bykgJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBzZXRQcm90b3R5cGVPZjogZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90bykge1xuICAgIHNldFByb3RvLmNoZWNrKHRhcmdldCwgcHJvdG8pO1xuICAgIHRyeSB7XG4gICAgICBzZXRQcm90by5zZXQodGFyZ2V0LCBwcm90byk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59KTtcbiIsIi8vIDI2LjEuMTMgUmVmbGVjdC5zZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSwgViBbLCByZWNlaXZlcl0pXG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5cbmZ1bmN0aW9uIHNldCh0YXJnZXQsIHByb3BlcnR5S2V5LCBWIC8qICwgcmVjZWl2ZXIgKi8pIHtcbiAgdmFyIHJlY2VpdmVyID0gYXJndW1lbnRzLmxlbmd0aCA8IDQgPyB0YXJnZXQgOiBhcmd1bWVudHNbM107XG4gIHZhciBvd25EZXNjID0gZ09QRC5mKGFuT2JqZWN0KHRhcmdldCksIHByb3BlcnR5S2V5KTtcbiAgdmFyIGV4aXN0aW5nRGVzY3JpcHRvciwgcHJvdG87XG4gIGlmICghb3duRGVzYykge1xuICAgIGlmIChpc09iamVjdChwcm90byA9IGdldFByb3RvdHlwZU9mKHRhcmdldCkpKSB7XG4gICAgICByZXR1cm4gc2V0KHByb3RvLCBwcm9wZXJ0eUtleSwgViwgcmVjZWl2ZXIpO1xuICAgIH1cbiAgICBvd25EZXNjID0gY3JlYXRlRGVzYygwKTtcbiAgfVxuICBpZiAoaGFzKG93bkRlc2MsICd2YWx1ZScpKSB7XG4gICAgaWYgKG93bkRlc2Mud3JpdGFibGUgPT09IGZhbHNlIHx8ICFpc09iamVjdChyZWNlaXZlcikpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZXhpc3RpbmdEZXNjcmlwdG9yID0gZ09QRC5mKHJlY2VpdmVyLCBwcm9wZXJ0eUtleSkpIHtcbiAgICAgIGlmIChleGlzdGluZ0Rlc2NyaXB0b3IuZ2V0IHx8IGV4aXN0aW5nRGVzY3JpcHRvci
461845zZXQgfHwgZXhpc3RpbmdEZXNjcmlwdG9yLndyaXRhYmxlID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgZXhpc3RpbmdEZXNjcmlwdG9yLnZhbHVlID0gVjtcbiAgICAgIGRQLmYocmVjZWl2ZXIsIHByb3BlcnR5S2V5LCBleGlzdGluZ0Rlc2NyaXB0b3IpO1xuICAgIH0gZWxzZSBkUC5mKHJlY2VpdmVyLCBwcm9wZXJ0eUtleSwgY3JlYXRlRGVzYygwLCBWKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIG93bkRlc2Muc2V0ID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IChvd25EZXNjLnNldC5jYWxsKHJlY2VpdmVyLCBWKSwgdHJ1ZSk7XG59XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHsgc2V0OiBzZXQgfSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaW5oZXJpdElmUmVxdWlyZWQgPSByZXF1aXJlKCcuL19pbmhlcml0LWlmLXJlcXVpcmVkJyk7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKTtcbnZhciAkZmxhZ3MgPSByZXF1aXJlKCcuL19mbGFncycpO1xudmFyICRSZWdFeHAgPSBnbG9iYWwuUmVnRXhwO1xudmFyIEJhc2UgPSAkUmVnRXhwO1xudmFyIHByb3RvID0gJFJlZ0V4cC5wcm90b3R5cGU7XG52YXIgcmUxID0gL2EvZztcbnZhciByZTIgPSAvYS9nO1xuLy8gXCJuZXdcIiBjcmVhdGVzIGEgbmV3IG9iamVjdCwgb2xkIHdlYmtpdCBidWdneSBoZXJlXG52YXIgQ09SUkVDVF9ORVcgPSBuZXcgJFJlZ0V4cChyZTEpICE9PSByZTE7XG5cbmlmIChyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICghQ09SUkVDVF9ORVcgfHwgcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJlMltyZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKV0gPSBmYWxzZTtcbiAgLy8gUmVnRXhwIGNvbnN0cnVjdG9yIGNhbiBhbHRlciBmbGFncyBhbmQgSXNSZWdFeHAgd29ya3MgY29ycmVjdCB3aXRoIEBAbWF0Y2hcbiAgcmV0dXJuICRSZWdFeHAocmUxKSAhPSByZTEgfHwgJFJlZ0V4cChyZTIpID09IHJlMiB8fCAkUmVnRXhwKHJlMSwgJ2knKSAhPSAnL2EvaSc7XG59KSkpIHtcbiAgJFJlZ0V4cCA9IGZ1bmN0aW9uIFJlZ0V4cChwLCBmKSB7XG4gICAgdmFyIHRpUkUgPSB0aGlzIGluc3RhbmNlb2YgJFJlZ0V4cDtcbiAgICB2YXIgcGlSRSA9IGlzUmVnRXhwKHApO1xuICAgIHZhciBmaVUgPSBmID09PSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuICF0aVJFICYmIHBpUkUgJiYgcC5jb25zdHJ1Y3RvciA9PT0gJFJlZ0V4cCAmJiBmaVUgPyBwXG4gICAgICA6IGluaGVyaXRJZlJlcXVpcmVkKENPUlJFQ1RfTkVXXG4gICAgICAgID8gbmV3IEJhc2UocGlSRSAmJiAhZmlVID8gcC5zb3VyY2UgOiBwLCBmKVxuICAgICAgICA6IEJhc2UoKHBpUkUgPSBwIGluc3RhbmNlb2YgJFJlZ0V4cCkgPyBwLnNvdXJjZSA6IHAsIHBpUkUgJiYgZmlVID8gJGZsYWdzLmNhbGwocCkgOiBmKVxuICAgICAgLCB0aVJFID8gdGhpcyA6IHByb3RvLCAkUmVnRXhwKTtcbiAgfTtcbiAgdmFyIHByb3h5ID0gZnVuY3Rpb24gKGtleSkge1xuICAgIGtleSBpbiAkUmVnRXhwIHx8IGRQKCRSZWdFeHAsIGtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBCYXNlW2tleV07IH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIChpdCkgeyBCYXNlW2tleV0gPSBpdDsgfVxuICAgIH0pO1xuICB9O1xuICBmb3IgKHZhciBrZXlzID0gZ09QTihCYXNlKSwgaSA9IDA7IGtleXMubGVuZ3RoID4gaTspIHByb3h5KGtleXNbaSsrXSk7XG4gIHByb3RvLmNvbnN0cnVjdG9yID0gJFJlZ0V4cDtcbiAgJFJlZ0V4cC5wcm90b3R5cGUgPSBwcm90bztcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShnbG9iYWwsICdSZWdFeHAnLCAkUmVnRXhwKTtcbn1cblxucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKSgnUmVnRXhwJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcmVnZXhwRXhlYyA9IHJlcXVpcmUoJy4vX3JlZ2V4cC1leGVjJyk7XG5yZXF1aXJlKCcuL19leHBvcnQnKSh7XG4gIHRhcmdldDogJ1JlZ0V4cCcsXG4gIHByb3RvOiB0cnVlLFxuICBmb3JjZWQ6IHJlZ2V4cEV4ZWMgIT09IC8uLy5leGVjXG59LCB7XG4gIGV4ZWM6IHJlZ2V4cEV4ZWNcbn0pO1xuIiwiLy8gMjEuMi41LjMgZ2V0IFJlZ0V4cC5wcm90b3R5cGUuZmxhZ3MoKVxuaWYgKHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgLy4vZy5mbGFncyAhPSAnZycpIHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmYoUmVnRXhwLnByb3RvdHlwZSwgJ2ZsYWdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogcmVxdWlyZSgnLi9fZmxhZ3MnKVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi9fYWR2YW5jZS1zdHJpbmctaW5kZXgnKTtcbnZhciByZWdFeHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcblxuLy8gQEBtYXRjaCBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdtYXRjaCcsIDEsIGZ1bmN0aW9uIChkZWZpbmVkLCBNQVRDSCwgJG1hdGNoLCBtYXliZUNhbGxOYXRpdmUpIHtcbiAgcmV0dXJuIFtcbiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5tYXRjaGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5tYXRjaFxuICAgIGZ1bmN0aW9uIG1hdGNoKHJlZ2V4cCkge1xuICAgICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgICAgdmFyIGZuID0gcmVnZXhwID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJlZ2V4cFtNQVRDSF07XG4gICAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZCA/IGZuLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtNQVRDSF0oU3RyaW5nKE8pKTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAbWF0Y2hdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAbWF0Y2hcbiAgICBmdW5jdGlvbiAocmVnZXhwKSB7XG4gICAgICB2Y
46184XIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKCRtYXRjaCwgcmVnZXhwLCB0aGlzKTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcbiAgICAgIHZhciByeCA9IGFuT2JqZWN0KHJlZ2V4cCk7XG4gICAgICB2YXIgUyA9IFN0cmluZyh0aGlzKTtcbiAgICAgIGlmICghcnguZ2xvYmFsKSByZXR1cm4gcmVnRXhwRXhlYyhyeCwgUyk7XG4gICAgICB2YXIgZnVsbFVuaWNvZGUgPSByeC51bmljb2RlO1xuICAgICAgcngubGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciBBID0gW107XG4gICAgICB2YXIgbiA9IDA7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgd2hpbGUgKChyZXN1bHQgPSByZWdFeHBFeGVjKHJ4LCBTKSkgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIG1hdGNoU3RyID0gU3RyaW5nKHJlc3VsdFswXSk7XG4gICAgICAgIEFbbl0gPSBtYXRjaFN0cjtcbiAgICAgICAgaWYgKG1hdGNoU3RyID09PSAnJykgcngubGFzdEluZGV4ID0gYWR2YW5jZVN0cmluZ0luZGV4KFMsIHRvTGVuZ3RoKHJ4Lmxhc3RJbmRleCksIGZ1bGxVbmljb2RlKTtcbiAgICAgICAgbisrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG4gPT09IDAgPyBudWxsIDogQTtcbiAgICB9XG4gIF07XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSByZXF1aXJlKCcuL19hZHZhbmNlLXN0cmluZy1pbmRleCcpO1xudmFyIHJlZ0V4cEV4ZWMgPSByZXF1aXJlKCcuL19yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBTVUJTVElUVVRJT05fU1lNQk9MUyA9IC9cXCQoWyQmYCddfFxcZFxcZD98PFtePl0qPikvZztcbnZhciBTVUJTVElUVVRJT05fU1lNQk9MU19OT19OQU1FRCA9IC9cXCQoWyQmYCddfFxcZFxcZD8pL2c7XG5cbnZhciBtYXliZVRvU3RyaW5nID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gaXQgOiBTdHJpbmcoaXQpO1xufTtcblxuLy8gQEByZXBsYWNlIGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ3JlcGxhY2UnLCAyLCBmdW5jdGlvbiAoZGVmaW5lZCwgUkVQTEFDRSwgJHJlcGxhY2UsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucmVwbGFjZVxuICAgIGZ1bmN0aW9uIHJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSkge1xuICAgICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgICAgdmFyIGZuID0gc2VhcmNoVmFsdWUgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2VhcmNoVmFsdWVbUkVQTEFDRV07XG4gICAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZFxuICAgICAgICA/IGZuLmNhbGwoc2VhcmNoVmFsdWUsIE8sIHJlcGxhY2VWYWx1ZSlcbiAgICAgICAgOiAkcmVwbGFjZS5jYWxsKFN0cmluZyhPKSwgc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHJlcGxhY2VdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAcmVwbGFjZVxuICAgIGZ1bmN0aW9uIChyZWdleHAsIHJlcGxhY2VWYWx1ZSkge1xuICAgICAgdmFyIHJlcyA9IG1heWJlQ2FsbE5hdGl2ZSgkcmVwbGFjZSwgcmVnZXhwLCB0aGlzLCByZXBsYWNlVmFsdWUpO1xuICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlO1xuXG4gICAgICB2Y
46184XIgcnggPSBhbk9iamVjdChyZWdleHApO1xuICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7XG4gICAgICB2YXIgZnVuY3Rpb25hbFJlcGxhY2UgPSB0eXBlb2YgcmVwbGFjZVZhbHVlID09PSAnZnVuY3Rpb24nO1xuICAgICAgaWYgKCFmdW5jdGlvbmFsUmVwbGFjZSkgcmVwbGFjZVZhbHVlID0gU3RyaW5nKHJlcGxhY2VWYWx1ZSk7XG4gICAgICB2YXIgZ2xvYmFsID0gcnguZ2xvYmFsO1xuICAgICAgaWYgKGdsb2JhbCkge1xuICAgICAgICB2YXIgZnVsbFVuaWNvZGUgPSByeC51bmljb2RlO1xuICAgICAgICByeC5sYXN0SW5kZXggPSAwO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWdFeHBFeGVjKHJ4LCBTKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkgYnJlYWs7XG4gICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICBpZiAoIWdsb2JhbCkgYnJlYWs7XG4gICAgICAgIHZhciBtYXRjaFN0ciA9IFN0cmluZyhyZXN1bHRbMF0pO1xuICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpO1xuICAgICAgfVxuICAgICAgdmFyIGFjY3VtdWxhdGVkUmVzdWx0ID0gJyc7XG4gICAgICB2YXIgbmV4dFNvdXJjZVBvc2l0aW9uID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHQgPSByZXN1bHRzW2ldO1xuICAgICAgICB2Y
46184XIgbWF0Y2hlZCA9IFN0cmluZyhyZXN1bHRbMF0pO1xuICAgICAgICB2YXIgcG9zaXRpb24gPSBtYXgobWluKHRvSW50ZWdlcihyZXN1bHQuaW5kZXgpLCBTLmxlbmd0aCksIDApO1xuICAgICAgICB2YXIgY2FwdHVyZXMgPSBbXTtcbiAgICAgICAgLy8gTk9URTogVGhpcyBpcyBlcXVpdmFsZW50IHRvXG4gICAgICAgIC8vICAgY2FwdHVyZXMgPSByZXN1bHQuc2xpY2UoMSkubWFwKG1heWJlVG9TdHJpbmcpXG4gICAgICAgIC8vIGJ1dCBmb3Igc29tZSByZWFzb24gYG5hdGl2ZVNsaWNlLmNhbGwocmVzdWx0LCAxLCByZXN1bHQubGVuZ3RoKWAgKGNhbGxlZCBpblxuICAgICAgICAvLyB0aGUgc2xpY2UgcG9seWZpbGwgd2hlbiBzbGljaW5nIG5hdGl2ZSBhcnJheXMpIFwiZG9lc24ndCB3b3JrXCIgaW4gc2FmYXJpIDkgYW5kXG4gICAgICAgIC8vIGNhdXNlcyBhIGNyYXNoIChodHRwczovL3Bhc3RlYmluLmNvbS9OMjFRemVRQSkgd2hlbiB0cnlpbmcgdG8gZGVidWcgaXQuXG4gICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgcmVzdWx0Lmxlbmd0aDsgaisrKSBjYXB0dXJlcy5wdXNoKG1heWJlVG9TdHJpbmcocmVzdWx0W2pdKSk7XG4gICAgICAgIHZhciBuYW1lZENhcHR1cmVzID0gcmVzdWx0Lmdyb3VwcztcbiAgICAgICAgaWYgKGZ1bmN0aW9uYWxSZXBsYWNlKSB7XG4gICAgICAgICAgdmFyIHJlcGxhY2VyQXJncyA9IFttYXRjaGVkXS5jb25jYXQoY2FwdHVyZXMsIHBvc2l0aW9uLCBTKTtcbiAgICAgICAgICBpZiAobmFtZWRDYXB0dXJlcyAhPT0gdW5kZWZpbmVkKSByZXBsYWNlckFyZ3MucHVzaChuYW1lZENhcHR1cmVzKTtcbiAgICAgICAgICB2Y
46184XIgcmVwbGFjZW1lbnQgPSBTdHJpbmcocmVwbGFjZVZhbHVlLmFwcGx5KHVuZGVmaW5lZCwgcmVwbGFjZXJBcmdzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVwbGFjZW1lbnQgPSBnZXRTdWJzdGl0dXRpb24obWF0Y2hlZCwgUywgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3NpdGlvbiA+PSBuZXh0U291cmNlUG9zaXRpb24pIHtcbiAgICAgICAgICBhY2N1bXVsYXRlZFJlc3VsdCArPSBTLnNsaWNlKG5leHRTb3VyY2VQb3NpdGlvbiwgcG9zaXRpb24pICsgcmVwbGFjZW1lbnQ7XG4gICAgICAgICAgbmV4dFNvdXJjZVBvc2l0aW9uID0gcG9zaXRpb24gKyBtYXRjaGVkLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtdWxhdGVkUmVzdWx0ICsgUy5zbGljZShuZXh0U291cmNlUG9zaXRpb24pO1xuICAgIH1cbiAgXTtcblxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWdldHN1YnN0aXR1dGlvblxuICBmdW5jdGlvbiBnZXRTdWJzdGl0dXRpb24obWF0Y2hlZCwgc3RyLCBwb3NpdGlvbiwgY2FwdHVyZXMsIG5hbWVkQ2FwdHVyZXMsIHJlcGxhY2VtZW50KSB7XG4gICAgdmFyIHRhaWxQb3MgPSBwb3NpdGlvbiArIG1hdGNoZWQubGVuZ3RoO1xuICAgIHZhciBtID0gY2FwdHVyZXMubGVuZ3RoO1xuICAgIHZhciBzeW1ib2xzID0gU1VCU1RJVFVUSU9OX1NZTUJPTFNfTk9fTkFNRUQ7XG4gICAgaWYgKG5hbWVkQ2FwdHVyZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbmFtZWRDYXB0dXJlcyA9IHRvT2JqZWN0KG5hbWVkQ2FwdHVyZXMpO1xuICAgICAgc3ltYm9scyA9IFNVQlNUSVRVVElPTl9TWU1CT0xTO1xuICAgIH1cbiAgICByZXR1cm4gJHJlcGxhY2UuY2FsbChyZXBsYWNlbWVudCwgc3ltYm9scywgZnVuY3Rpb24gKG1hdGNoLCBjaCkge1xuICAgICAgdmFyIGNhcHR1cmU7XG4gICAgICBzd2l0Y2ggKGNoLmNoYXJBdCgwKSkge1xuICAgICAgICBjYXNlICckJzogcmV0dXJuICckJztcbiAgICAgICAgY2FzZSAnJic6IHJldHVybiBtYXRjaGVkO1xuICAgICAgICBjYXNlICdgJzogcmV0dXJuIHN0ci5zbGljZSgwLCBwb3NpdGlvbik7XG4gICAgICAgIGNhc2UgXCInXCI6IHJldHVybiBzdHIuc2xpY2UodGFpbFBvcyk7XG4gICAgICAgIGNhc2UgJzwnOlxuICAgICAgICAgIGNhcHR1cmUgPSBuYW1lZENhcHR1cmVzW2NoLnNsaWNlKDEsIC0xKV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IC8vIFxcZFxcZD9cbiAgICAgICAgICB2Y
46184XIgbiA9ICtjaDtcbiAgICAgICAgICBpZiAobiA9PT0gMCkgcmV0dXJuIG1hdGNoO1xuICAgICAgICAgIGlmIChuID4gbSkge1xuICAgICAgICAgICAgdmFyIGYgPSBmbG9vcihuIC8gMTApO1xuICAgICAgICAgICAgaWYgKGYgPT09IDApIHJldHVybiBtYXRjaDtcbiAgICAgICAgICAgIGlmIChmIDw9IG0pIHJldHVybiBjYXB0dXJlc1tmIC0gMV0gPT09IHVuZGVmaW5lZCA/IGNoLmNoYXJBdCgxKSA6IGNhcHR1cmVzW2YgLSAxXSArIGNoLmNoYXJBdCgxKTtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FwdHVyZSA9IGNhcHR1cmVzW24gLSAxXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjYXB0dXJlID09PSB1bmRlZmluZWQgPyAnJyA6IGNhcHR1cmU7XG4gICAgfSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBzYW1lVmFsdWUgPSByZXF1aXJlKCcuL19zYW1lLXZhbHVlJyk7XG52YXIgcmVnRXhwRXhlYyA9IHJlcXVpcmUoJy4vX3JlZ2V4cC1leGVjLWFic3RyYWN0Jyk7XG5cbi8vIEBAc2VhcmNoIGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ3NlYXJjaCcsIDEsIGZ1bmN0aW9uIChkZWZpbmVkLCBTRUFSQ0gsICRzZWFyY2gsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnNlYXJjaGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zZWFyY2hcbiAgICBmdW5jdGlvbiBzZWFyY2gocmVnZXhwKSB7XG4gICAgICB2Y
46184XIgTyA9IGRlZmluZWQodGhpcyk7XG4gICAgICB2YXIgZm4gPSByZWdleHAgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVnZXhwW1NFQVJDSF07XG4gICAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZCA/IGZuLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtTRUFSQ0hdKFN0cmluZyhPKSk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHNlYXJjaF1gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEBzZWFyY2hcbiAgICBmdW5jdGlvbiAocmVnZXhwKSB7XG4gICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKCRzZWFyY2gsIHJlZ2V4cCwgdGhpcyk7XG4gICAgICBpZiAocmVzLmRvbmUpIHJldHVybiByZXMudmFsdWU7XG4gICAgICB2YXIgcnggPSBhbk9iamVjdChyZWdleHApO1xuICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7XG4gICAgICB2YXIgcHJldmlvdXNMYXN0SW5kZXggPSByeC5sYXN0SW5kZXg7XG4gICAgICBpZiAoIXNhbWVWYWx1ZShwcmV2aW91c0xhc3RJbmRleCwgMCkpIHJ4Lmxhc3RJbmRleCA9IDA7XG4gICAgICB2YXIgcmVzdWx0ID0gcmVnRXhwRXhlYyhyeCwgUyk7XG4gICAgICBpZiAoIXNhbWVWYWx1ZShyeC5sYXN0SW5kZXgsIHByZXZpb3VzTGFzdEluZGV4KSkgcngubGFzdEluZGV4ID0gcHJldmlvdXNMYXN0SW5kZXg7XG4gICAgICByZXR1cm4gcmVzdWx0ID09PSBudWxsID8gLTEgOiByZXN1bHQuaW5kZXg7XG4gICAgfVxuICBdO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4vX2lzLXJlZ2V4cCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIGFkdmFuY2VTdHJpbmdJbmRleCA9IHJlcXVpcmUoJy4vX2FkdmFuY2Utc3RyaW5nLWluZGV4Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjYWxsUmVnRXhwRXhlYyA9IHJlcXVpcmUoJy4vX3JlZ2V4cC1leGVjLWFic3RyYWN0Jyk7XG52YXIgcmVnZXhwRXhlYyA9IHJlcXVpcmUoJy4vX3JlZ2V4cC1leGVjJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyICRtaW4gPSBNYXRoLm1pbjtcbnZhciAkcHVzaCA9IFtdLnB1c2g7XG52YXIgJFNQTElUID0gJ3NwbGl0JztcbnZhciBMRU5HVEggPSAnbGVuZ3RoJztcbnZhciBMQVNUX0lOREVYID0gJ2xhc3RJbmRleCc7XG52YXIgTUFYX1VJTlQzMiA9IDB4ZmZmZmZmZmY7XG5cbi8vIGJhYmVsLW1pbmlmeSB0cmFuc3BpbGVzIFJlZ0V4cCgneCcsICd5JykgLT4gL3gveSBhbmQgaXQgY2F1c2VzIFN5bnRheEVycm9yXG52YXIgU1VQUE9SVFNfWSA9ICFmYWlscyhmdW5jdGlvbiAoKSB7IFJlZ0V4cChNQVhfVUlOVDMyLCAneScpOyB9KTtcblxuLy8gQEBzcGxpdCBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdzcGxpdCcsIDIsIGZ1bmN0aW9uIChkZWZpbmVkLCBTUExJVCwgJHNwbGl0LCBtYXliZUNhbGxOYXRpdmUpIHtcbiAgdmFyIGludGVybmFsU3BsaXQ7XG4gIGlmIChcbiAgICAnYWJiYydbJFNQTElUXSgvKGIpKi8pWzFdID09ICdjJyB8fFxuICAgICd0ZXN0J1skU1BMSVRdKC8oPzopLywgLTEpW0xFTkdUSF0gIT0gNCB8fFxuICAgICdhYidbJFNQTElUXSgvKD86YWIpKi8pW0xFTkdUSF0gIT0gMiB8fFxuICAgICcuJ1skU1BMSVRdKC8oLj8pKC4/KS8pW0xFTkdUSF0gIT0gNCB8fFxuICAgICcuJ1skU1BMSVRdKC8oKSgpLylbTEVOR1RIXSA+IDEgfHxcbiAgICAnJ1skU1BMSVRdKC8uPy8pW0xFTkdUSF1cbiAgKSB7XG4gICAgLy8gYmFzZWQgb24gZXM1LXNoaW0gaW1wbGVtZW50YXRpb24sIG5lZWQgdG8gcmV3b3JrIGl0XG4gICAgaW50ZXJuYWxTcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICB2Y
46184XIgc3RyaW5nID0gU3RyaW5nKHRoaXMpO1xuICAgICAgaWYgKHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkICYmIGxpbWl0ID09PSAwKSByZXR1cm4gW107XG4gICAgICAvLyBJZiBgc2VwYXJhdG9yYCBpcyBub3QgYSByZWdleCwgdXNlIG5hdGl2ZSBzcGxpdFxuICAgICAgaWYgKCFpc1JlZ0V4cChzZXBhcmF0b3IpKSByZXR1cm4gJHNwbGl0LmNhbGwoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICAgIHZhciBvdXRwdXQgPSBbXTtcbiAgICAgIHZhciBmbGFncyA9IChzZXBhcmF0b3IuaWdub3JlQ2FzZSA/ICdpJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoc2VwYXJhdG9yLm11bHRpbGluZSA/ICdtJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoc2VwYXJhdG9yLnVuaWNvZGUgPyAndScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5zdGlja3kgPyAneScgOiAnJyk7XG4gICAgICB2YXIgbGFzdExhc3RJbmRleCA9IDA7XG4gICAgICB2YXIgc3BsaXRMaW1pdCA9IGxpbWl0ID09PSB1bmRlZmluZWQgPyBNQVhfVUlOVDMyIDogbGltaXQgPj4+IDA7XG4gICAgICAvLyBNYWtlIGBnbG9iYWxgIGFuZCBhdm9pZCBgbGFzdEluZGV4YCBpc3N1ZXMgYnkgd29ya2luZyB3aXRoIGEgY29weVxuICAgICAgdmFyIHNlcGFyYXRvckNvcHkgPSBuZXcgUmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsIGZsYWdzICsgJ2cnKTtcbiAgICAgIHZhciBtYXRjaCwgbGFzdEluZGV4LCBsYXN0TGVuZ3RoO1xuICAgICAgd2hpbGUgKG1hdGNoID0gcmVnZXhwRXhlYy5jYWxsKHNlcGFyYXRvckNvcHksIHN0cmluZykpIHtcbiAgICAgICAgbGFzdEluZGV4ID0gc2VwYXJhdG9yQ29weVtMQVNUX0lOREVYXTtcbiAgICAgICAgaWYgKGxhc3RJbmRleCA+IGxhc3RMYXN0SW5kZXgpIHtcbiAgICAgICAgICBvdXRwdXQucHVzaChzdHJpbmcuc2xpY2UobGFzdExhc3RJbmRleCwgbWF0Y2guaW5kZXgpKTtcbiAgICAgICAgICBpZiAobWF0Y2hbTEVOR1RIXSA+IDEgJiYgbWF0Y2guaW5kZXggPCBzdHJpbmdbTEVOR1RIXSkgJHB1c2guYXBwbHkob3V0cHV0LCBtYXRjaC5zbGljZSgxKSk7XG4gICAgICAgICAgbGFzdExlbmd0aCA9IG1hdGNoWzBdW0xFTkdUSF07XG4gICAgICAgICAgbGFzdExhc3RJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgICBpZiAob3V0cHV0W0xFTkdUSF0gPj0gc3BsaXRMaW1pdCkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlcGFyYXRvckNvcHlbTEFTVF9JTkRFWF0gPT09IG1hdGNoLmluZGV4KSBzZXBhcmF0b3JDb3B5W0xBU1RfSU5ERVhdKys7IC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3BcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0TGFzdEluZGV4ID09PSBzdHJpbmdbTEVOR1RIXSkge1xuICAgICAgICBpZiAobGFzdExlbmd0aCB8fCAhc2VwYXJhdG9yQ29weS50ZXN0KCcnKSkgb3V0cHV0LnB1c2goJycpO1xuICAgICAgfSBlbHNlIG91dHB1dC5wdXNoKHN0cmluZy5zbGljZShsYXN0TGFzdEluZGV4KSk7XG4gICAgICByZXR1cm4gb3V0cHV0W0xFTkdUSF0gPiBzcGxpdExpbWl0ID8gb3V0cHV0LnNsaWNlKDAsIHNwbGl0TGltaXQpIDogb3V0cHV0O1xuICAgIH07XG4gIC8vIENoYWtyYSwgVjhcbiAgfSBlbHNlIGlmICgnMCdbJFNQTElUXSh1bmRlZmluZWQsIDApW0xFTkdUSF0pIHtcbiAgICBpbnRlcm5hbFNwbGl0ID0gZnVuY3Rpb24gKHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIHJldHVybiBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCAmJiBsaW1pdCA9PT0gMCA/IFtdIDogJHNwbGl0LmNhbGwodGhpcywgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBpbnRlcm5hbFNwbGl0ID0gJHNwbGl0O1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5zcGxpdGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zcGxpdFxuICAgIGZ1bmN0aW9uIHNwbGl0KHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIHZhciBPID0gZGVmaW5lZCh0aGlzKTtcbiAgICAgIHZhciBzcGxpdHRlciA9IHNlcGFyYXRvciA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzZXBhcmF0b3JbU1BMSVRdO1xuICAgICAgcmV0dXJuIHNwbGl0dGVyICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBzcGxpdHRlci5jYWxsKHNlcGFyYXRvciwgTywgbGltaXQpXG4gICAgICAgIDogaW50ZXJuYWxTcGxpdC5jYWxsKFN0cmluZyhPKSwgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHNwbGl0XWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS1AQHNwbGl0XG4gICAgLy9cbiAgICAvLyBOT1RFOiBUaGlzIGNhbm5vdCBiZSBwcm9wZXJseSBwb2x5ZmlsbGVkIGluIGVuZ2luZXMgdGhhdCBkb24ndCBzdXBwb3J0XG4gICAgLy8gdGhlICd5JyBmbGFnLlxuICAgIGZ1bmN0aW9uIChyZWdleHAsIGxpbWl0KSB7XG4gICAgICB2Y
46184XIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKGludGVybmFsU3BsaXQsIHJlZ2V4cCwgdGhpcywgbGltaXQsIGludGVybmFsU3BsaXQgIT09ICRzcGxpdCk7XG4gICAgICBpZiAocmVzLmRvbmUpIHJldHVybiByZXMudmFsdWU7XG5cbiAgICAgIHZhciByeCA9IGFuT2JqZWN0KHJlZ2V4cCk7XG4gICAgICB2YXIgUyA9IFN0cmluZyh0aGlzKTtcbiAgICAgIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHJ4LCBSZWdFeHApO1xuXG4gICAgICB2YXIgdW5pY29kZU1hdGNoaW5nID0gcngudW5pY29kZTtcbiAgICAgIHZhciBmbGFncyA9IChyeC5pZ25vcmVDYXNlID8gJ2knIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChyeC5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHJ4LnVuaWNvZGUgPyAndScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKFNVUFBPUlRTX1kgPyAneScgOiAnZycpO1xuXG4gICAgICAvLyBeKD8gKyByeCArICkgaXMgbmVlZGVkLCBpbiBjb21iaW5hdGlvbiB3aXRoIHNvbWUgUyBzbGljaW5nLCB0b1xuICAgICAgLy8gc2ltdWxhdGUgdGhlICd5JyBmbGFnLlxuICAgICAgdmFyIHNwbGl0dGVyID0gbmV3IEMoU1VQUE9SVFNfWSA/IHJ4IDogJ14oPzonICsgcnguc291cmNlICsgJyknLCBmbGFncyk7XG4gICAgICB2YXIgbGltID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9VSU5UMzIgOiBsaW1pdCA+Pj4gMDtcbiAgICAgIGlmIChsaW0gPT09IDApIHJldHVybiBbXTtcbiAgICAgIGlmIChTLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNhbGxSZWdFeHBFeGVjKHNwbGl0dGVyLCBTKSA9PT0gbnVsbCA/IFtTXSA6IFtdO1xuICAgICAgdmFyIHAgPSAwO1xuICAgICAgdmFyIHEgPSAwO1xuICAgICAgdmFyIEEgPSBbXTtcbiAgICAgIHdoaWxlIChxIDwgUy5sZW5ndGgpIHtcbiAgICAgICAgc3BsaXR0ZXIubGFzdEluZGV4ID0gU1VQUE9SVFNfWSA/IHEgOiAwO1xuICAgICAgICB2Y
46184XIgeiA9IGNhbGxSZWdFeHBFeGVjKHNwbGl0dGVyLCBTVVBQT1JUU19ZID8gUyA6IFMuc2xpY2UocSkpO1xuICAgICAgICB2YXIgZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHogPT09IG51bGwgfHxcbiAgICAgICAgICAoZSA9ICRtaW4odG9MZW5ndGgoc3BsaXR0ZXIubGFzdEluZGV4ICsgKFNVUFBPUlRTX1kgPyAwIDogcSkpLCBTLmxlbmd0aCkpID09PSBwXG4gICAgICAgICkge1xuICAgICAgICAgIHEgPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgcSwgdW5pY29kZU1hdGNoaW5nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBBLnB1c2goUy5zbGljZShwLCBxKSk7XG4gICAgICAgICAgaWYgKEEubGVuZ3RoID09PSBsaW0pIHJldHVybiBBO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IHoubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBBLnB1c2goeltpXSk7XG4gICAgICAgICAgICBpZiAoQS5sZW5ndGggPT09IGxpbSkgcmV0dXJuIEE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHEgPSBwID0gZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgQS5wdXNoKFMuc2xpY2UocCkpO1xuICAgICAgcmV0dXJuIEE7XG4gICAgfVxuICBdO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuL2VzNi5yZWdleHAuZmxhZ3MnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyICRmbGFncyA9IHJlcXVpcmUoJy4vX2ZsYWdzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIFRPX1NUUklORyA9ICd0b1N0cmluZyc7XG52YXIgJHRvU3RyaW5nID0gLy4vW1RPX1NUUklOR107XG5cbnZhciBkZWZpbmUgPSBmdW5jdGlvbiAoZm4pIHtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShSZWdFeHAucHJvdG90eXBlLCBUT19TVFJJTkcsIGZuLCB0cnVlKTtcbn07XG5cbi8vIDIxLjIuNS4xNCBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nKClcbmlmIChyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHsgcmV0dXJuICR0b1N0cmluZy5jYWxsKHsgc291cmNlOiAnYScsIGZsYWdzOiAnYicgfSkgIT0gJy9hL2InOyB9KSkge1xuICBkZWZpbmUoZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgdmFyIFIgPSBhbk9iamVjdCh0aGlzKTtcbiAgICByZXR1cm4gJy8nLmNvbmNhdChSLnNvdXJjZSwgJy8nLFxuICAgICAgJ2ZsYWdzJyBpbiBSID8gUi5mbGFncyA6ICFERVNDUklQVE9SUyAmJiBSIGluc3RhbmNlb2YgUmVnRXhwID8gJGZsYWdzLmNhbGwoUikgOiB1bmRlZmluZWQpO1xuICB9KTtcbi8vIEZGNDQtIFJlZ0V4cCN0b1N0cmluZyBoYXMgYSB3cm9uZyBuYW1lXG59IGVsc2UgaWYgKCR0b1N0cmluZy5uYW1lICE9IFRPX1NUUklORykge1xuICBkZWZpbmUoZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuICR0b1N0cmluZy5jYWxsKHRoaXMpO1xuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciBzdHJvbmcgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXN0cm9uZycpO1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIFNFVCA9ICdTZXQnO1xuXG4vLyAyMy4yIFNldCBPYmplY3RzXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24nKShTRVQsIGZ1bmN0aW9uIChnZXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFNldCgpIHsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjIuMy4xIFNldC5wcm90b3R5cGUuYWRkKHZhbHVlKVxuICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgIHJldHVybiBzdHJvbmcuZGVmKHZhbGlkYXRlKHRoaXMsIFNFVCksIHZhbHVlID0gdmFsdWUgPT09IDAgPyAwIDogdmFsdWUsIHZhbHVlKTtcbiAgfVxufSwgc3Ryb25nKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjIgU3RyaW5nLnByb3RvdHlwZS5hbmNob3IobmFtZSlcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2FuY2hvcicsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBhbmNob3IobmFtZSkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdhJywgJ25hbWUnLCBuYW1lKTtcbiAgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMyBTdHJpbmcucHJvdG90eXBlLmJpZygpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdiaWcnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gYmlnKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdiaWcnLCAnJywgJycpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy40IFN0cmluZy5wcm90b3R5cGUuYmxpbmsoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnYmxpbmsnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gYmxpbmsoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2JsaW5rJywgJycsICcnKTtcbiAgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNSBTdHJpbmcucHJvdG90eXBlLmJvbGQoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnYm9sZCcsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBib2xkKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdiJywgJycsICcnKTtcbiAgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKShmYWxzZSk7XG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4zLjMgU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdChwb3MpXG4gIGNvZGVQb2ludEF0OiBmdW5jdGlvbiBjb2RlUG9pbnRBdChwb3MpIHtcbiAgICByZXR1cm4gJGF0KHRoaXMsIHBvcyk7XG4gIH1cbn0pO1xuIiwiLy8gMjEuMS4zLjYgU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aChzZWFyY2hTdHJpbmcgWywgZW5kUG9zaXRpb25dKVxuJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGNvbnRleHQgPSByZXF1aXJlKCcuL19zdHJpbmctY29udGV4dCcpO1xudmFyIEVORFNfV0lUSCA9ICdlbmRzV2l0aCc7XG52YXIgJGVuZHNXaXRoID0gJydbRU5EU19XSVRIXTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscy1pcy1yZWdleHAnKShFTkRTX1dJVEgpLCAnU3RyaW5nJywge1xuICBlbmRzV2l0aDogZnVuY3Rpb24gZW5kc1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgZW5kUG9zaXRpb24gPSBAbGVuZ3RoICovKSB7XG4gICAgdmFyIHRoYXQgPSBjb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgRU5EU19XSVRIKTtcbiAgICB2YXIgZW5kUG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgbGVuID0gdG9MZW5ndGgodGhhdC5sZW5ndGgpO1xuICAgIHZhciBlbmQgPSBlbmRQb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8gbGVuIDogTWF0aC5taW4odG9MZW5ndGgoZW5kUG9zaXRpb24pLCBsZW4pO1xuICAgIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTtcbiAgICByZXR1cm4gJGVuZHNXaXRoXG4gICAgICA/ICRlbmRzV2l0aC5jYWxsKHRoYXQsIHNlYXJjaCwgZW5kKVxuICAgICAgOiB0aGF0LnNsaWNlKGVuZCAtIHNlYXJjaC5sZW5ndGgsIGVuZCkgPT09IHNlYXJjaDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy42IFN0cmluZy5wcm90b3R5cGUuZml4ZWQoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnZml4ZWQnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gZml4ZWQoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3R0JywgJycsICcnKTtcbiAgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNyBTdHJpbmcucHJvdG90eXBlLmZvbnRjb2xvcihjb2xvcilcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2ZvbnRjb2xvcicsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybi
46184BmdW5jdGlvbiBmb250Y29sb3IoY29sb3IpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnZm9udCcsICdjb2xvcicsIGNvbG9yKTtcbiAgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuOCBTdHJpbmcucHJvdG90eXBlLmZvbnRzaXplKHNpemUpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdmb250c2l6ZScsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmb250c2l6ZShzaXplKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2ZvbnQnLCAnc2l6ZScsIHNpemUpO1xuICB9O1xufSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4vX3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbnZhciAkZnJvbUNvZGVQb2ludCA9IFN0cmluZy5mcm9tQ29kZVBvaW50O1xuXG4vLyBsZW5ndGggc2hvdWxkIGJlIDEsIG9sZCBGRiBwcm9ibGVtXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICghISRmcm9tQ29kZVBvaW50ICYmICRmcm9tQ29kZVBvaW50Lmxlbmd0aCAhPSAxKSwgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4yLjIgU3RyaW5nLmZyb21Db2RlUG9pbnQoLi4uY29kZVBvaW50cylcbiAgZnJvbUNvZGVQb2ludDogZnVuY3Rpb24gZnJvbUNvZGVQb2ludCh4KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgY29kZTtcbiAgICB3aGlsZSAoYUxlbiA+IGkpIHtcbiAgICAgIGNvZGUgPSArYXJndW1lbnRzW2krK107XG4gICAgICBpZiAodG9BYnNvbHV0ZUluZGV4KGNvZGUsIDB4MTBmZmZmKSAhPT0gY29kZSkgdGhyb3cgUmFuZ2VFcnJvcihjb2RlICsgJyBpcyBub3QgYSB2YWxpZCBjb2RlIHBvaW50Jyk7XG4gICAgICByZXMucHVzaChjb2RlIDwgMHgxMDAwMFxuICAgICAgICA/IGZyb21DaGFyQ29kZShjb2RlKVxuICAgICAgICA6IGZyb21DaGFyQ29kZSgoKGNvZGUgLT0gMHgxMDAwMCkgPj4gMTApICsgMHhkODAwLCBjb2RlICUgMHg0MDAgKyAweGRjMDApXG4gICAgICApO1xuICAgIH0gcmV0dXJuIHJlcy5qb2luKCcnKTtcbiAgfVxufSk7XG4iLCIvLyAyMS4xLjMuNyBTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzKHNlYXJjaFN0cmluZywgcG9zaXRpb24gPSAwKVxuJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjb250ZXh0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWNvbnRleHQnKTtcbnZhciBJTkNMVURFUyA9ICdpbmNsdWRlcyc7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMtaXMtcmVnZXhwJykoSU5DTFVERVMpLCAnU3RyaW5nJywge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgcmV0dXJuICEhfmNvbnRleHQodGhpcywgc2VhcmNoU3RyaW5nLCBJTkNMVURFUylcbiAgICAgIC5pbmRleE9mKHNlYXJjaFN0cmluZywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjkgU3RyaW5nLnByb3RvdHlwZS5pdGFsaWNzKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2l0YWxpY3MnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gaXRhbGljcygpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnaScsICcnLCAnJyk7XG4gIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuLy8gMjEuMS4zLjI3IFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKShTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuLy8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgTyA9IHRoaXMuX3Q7XG4gIHZhciBpbmRleCA9IHRoaXMuX2k7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IE8ubGVuZ3RoKSByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIHBvaW50ID0gJGF0KE8sIGluZGV4KTtcbiAgdGhpcy5faSArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiB7IHZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2UgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMTAgU3RyaW5nLnByb3RvdHlwZS5saW5rKHVybClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2xpbmsnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gbGluayh1cmwpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYScsICdocmVmJywgdXJsKTtcbiAgfTtcbn0pO1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdTdHJpbmcnLCB7XG4gIC8vIDIxLjEuMi40IFN0cmluZy5yYXcoY2FsbFNpdGUsIC4uLnN1YnN0aXR1dGlvbnMpXG4gIHJhdzogZnVuY3Rpb24gcmF3KGNhbGxTaXRlKSB7XG4gICAgdmFyIHRwbCA9IHRvSU9iamVjdChjYWxsU2l0ZS5yYXcpO1xuICAgIHZhciBsZW4gPSB0b0xlbmd0aCh0cGwubGVuZ3RoKTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAobGVuID4gaSkge1xuICAgICAgcmVzLnB1c2goU3RyaW5nKHRwbFtpKytdKSk7XG4gICAgICBpZiAoaSA8IGFMZW4pIHJlcy5wdXNoKFN0cmluZyhhcmd1bWVudHNbaV0pKTtcbiAgICB9I
46184HJldHVybiByZXMuam9pbignJyk7XG4gIH1cbn0pO1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdTdHJpbmcnLCB7XG4gIC8vIDIxLjEuMy4xMyBTdHJpbmcucHJvdG90eXBlLnJlcGVhdChjb3VudClcbiAgcmVwZWF0OiByZXF1aXJlKCcuL19zdHJpbmctcmVwZWF0Jylcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMTEgU3RyaW5nLnByb3RvdHlwZS5zbWFsbCgpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdzbWFsbCcsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzbWFsbCgpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnc21hbGwnLCAnJywgJycpO1xuICB9O1xufSk7XG4iLCIvLyAyMS4xLjMuMTggU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoKHNlYXJjaFN0cmluZyBbLCBwb3NpdGlvbiBdKVxuJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGNvbnRleHQgPSByZXF1aXJlKCcuL19zdHJpbmctY29udGV4dCcpO1xudmFyIFNUQVJUU19XSVRIID0gJ3N0YXJ0c1dpdGgnO1xudmFyICRzdGFydHNXaXRoID0gJydbU1RBUlRTX1dJVEhdO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzLWlzLXJlZ2V4cCcpKFNUQVJUU19XSVRIKSwgJ1N0cmluZycsIHtcbiAgc3RhcnRzV2l0aDogZnVuY3Rpb24gc3RhcnRzV2l0aChzZWFyY2hTdHJpbmcgLyogLCBwb3NpdGlvbiA9IDAgKi8pIHtcbiAgICB2YXIgdGhhdCA9IGNvbnRleHQodGhpcywgc2VhcmNoU3RyaW5nLCBTVEFSVFNfV0lUSCk7XG4gICAgdmFyIGluZGV4ID0gdG9MZW5ndGgoTWF0aC5taW4oYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRoYXQubGVuZ3RoKSk7XG4gICAgdmFyIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiAkc3RhcnRzV2l0aFxuICAgICAgPyAkc3RhcnRzV2l0aC5jYWxsKHRoYXQsIHNlYXJjaCwgaW5kZXgpXG4gICAgICA6IHRoYXQuc2xpY2UoaW5kZXgsIGluZGV4ICsgc2VhcmNoLmxlbmd0aCkgPT09IHNlYXJjaDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xMiBTdHJpbmcucHJvdG90eXBlLnN0cmlrZSgpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdzdHJpa2UnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gc3RyaWtlKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzdHJpa2UnLCAnJywgJycpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xMyBTdHJpbmcucHJvdG90eXBlLnN1YigpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdzdWInLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gc3ViKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzdWInLCAnJywgJycpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xNCBTdHJpbmcucHJvdG90eXBlLnN1cCgpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdzdXAnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gc3VwKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzdXAnLCAnJywgJycpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyMS4xLjMuMjUgU3RyaW5nLnByb3RvdHlwZS50cmltKClcbnJlcXVpcmUoJy4vX3N0cmluZy10cmltJykoJ3RyaW0nLCBmdW5jdGlvbiAoJHRyaW0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyaW0oKSB7XG4gICAgcmV0dXJuICR0cmltKHRoaXMsIDMpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBFQ01BU2NyaXB0IDYgc3ltYm9scyBzaGltXG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgTUVUQSA9IHJlcXVpcmUoJy4vX21ldGEnKS5LRVk7XG52YXIgJGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG52YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG52YXIgd2tzRXh0ID0gcmVxdWlyZSgnLi9fd2tzLWV4dCcpO1xudmFyIHdrc0RlZmluZSA9IHJlcXVpcmUoJy4vX3drcy1kZWZpbmUnKTtcbnZhciBlbnVtS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0ta2V5cycpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL19pcy1hcnJheScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIF9jcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgZ09QTkV4dCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuLWV4dCcpO1xudmFyICRHT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbnZhciAkRFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgZ09QRCA9ICRHT1BELmY7XG52YXIgZFAgPSAkRFAuZjtcbnZhciBnT1
46184BOID0gZ09QTkV4dC5mO1xudmFyICRTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyICRKU09OID0gZ2xvYmFsLkpTT047XG52YXIgX3N0cmluZ2lmeSA9ICRKU09OICYmICRKU09OLnN0cmluZ2lmeTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBISURERU4gPSB3a3MoJ19oaWRkZW4nKTtcbnZhciBUT19QUklNSVRJVkUgPSB3a3MoJ3RvUHJpbWl0aXZlJyk7XG52YXIgaXNFbnVtID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG52YXIgU3ltYm9sUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC1yZWdpc3RyeScpO1xudmFyIEFsbFN5bWJvbHMgPSBzaGFyZWQoJ3N5bWJvbHMnKTtcbnZhciBPUFN5bWJvbHMgPSBzaGFyZWQoJ29wLXN5bWJvbHMnKTtcbnZhciBPYmplY3RQcm90byA9IE9iamVjdFtQUk9UT1RZUEVdO1xudmFyIFVTRV9OQVRJVkUgPSB0eXBlb2YgJFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xudmFyIFFPYmplY3QgPSBnbG9iYWwuUU9iamVjdDtcbi8vIERvbid0IHVzZSBzZXR0ZXJzIGluIFF0IFNjcmlwdCwgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzE3M1xudmFyIHNldHRlciA9ICFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRV0gfHwgIVFPYmplY3RbUFJPVE9UWVBFXS5maW5kQ2hpbGQ7XG5cbi8vIGZhbGxiYWNrIGZvciBvbGQgQW5kcm9pZCwgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTY4N1xudmFyIHNldFN5bWJvbERlc2MgPSBERVNDUklQVE9SUyAmJiAkZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX2NyZWF0ZShkUCh7fSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkUCh0aGlzLCAnYScsIHsgdmFsdWU6IDcgfSkuYTsgfVxuICB9KSkuYSAhPSA3O1xufSkgPyBmdW5jdGlvbiAoaXQsIGtleSwgRCkge1xuICB2YXIgcHJvdG9EZXNjID0gZ09QRChPYmplY3RQcm90bywga2V5KTtcbiAgaWYgKHByb3RvRGVzYykgZGVsZXRlIE9iamVjdFByb3RvW2tleV07XG4gIGRQKGl0LCBrZXksIEQpO1xuICBpZiAocHJvdG9EZXNjICYmIGl0ICE9PSBPYmplY3RQcm90bykgZFAoT2JqZWN0UHJvdG8sIGtleSwgcHJvdG9EZXNjKTtcbn0gOiBkUDtcblxudmFyIHdyYXAgPSBmdW5jdGlvbiAodGFnKSB7XG4gIHZhciBzeW0gPSBBbGxTeW1ib2xzW3RhZ10gPSBfY3JlYXRlKCRTeW1ib2xbUFJPVE9UWVBFXSk7XG4gIHN5bS5fayA9IHRhZztcbiAgcmV0dXJuIHN5bTtcbn07XG5cbnZhciBpc1N5bWJvbCA9IFVTRV9OQVRJVkUgJiYgdHlwZW9mICRTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCcgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJztcbn0gOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0IGluc3RhbmNlb2YgJFN5bWJvbDtcbn07XG5cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBEKSB7XG4gIGlmIChpdCA9PT0gT2JqZWN0UHJvdG8pICRkZWZpbmVQcm9wZXJ0eShPUFN5bWJvbHMsIGtleSwgRCk7XG4gIGFuT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgYW5PYmplY3QoRCk7XG4gIGlmIChoYXMoQWxsU3ltYm9scywga2V5KSkge1xuICAgIGlmICghRC5lbnVtZXJhYmxlKSB7XG4gICAgICBpZiAoIWhhcyhpdCwgSElEREVOKSkgZFAoaXQsIEhJRERFTiwgY3JlYXRlRGVzYygxLCB7fSkpO1xuICAgICAgaXRbSElEREVOXVtrZXldID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pIGl0W0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuICAgICAgRCA9IF9jcmVhdGUoRCwgeyBlbnVtZXJhYmxlOiBjcmVhdGVEZXNjKDAsIGZhbHNlKSB9KTtcbiAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjKGl0LCBrZXksIEQpO1xuICB9IHJldHVybiBkUChpdCwga2V5LCBEKTtcbn07XG52YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGl0LCBQKSB7XG4gIGFuT2JqZWN0KGl0KTtcbiAgdmFyIGtleXMgPSBlbnVtS2V5cyhQID0gdG9JT2JqZWN0KFApKTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuICB2YXIga2V5O1xuICB3aGlsZSAobCA+IGkpICRkZWZpbmVQcm9wZXJ0eShpdCwga2V5ID0ga2V5c1tpKytdLCBQW2tleV0pO1xuICByZXR1cm4gaXQ7XG59O1xudmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaXQsIFApIHtcbiAgcmV0dXJuIFAgPT09IHVuZGVmaW5lZCA/IF9jcmVhdGUoaXQpIDogJGRlZmluZVByb3BlcnRpZXMoX2NyZWF0ZShpdCksIFApO1xufTtcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShrZXkpIHtcbiAgdmFyIEUgPSBpc0VudW0uY2FsbCh0aGlzLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKTtcbiAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBFIHx8ICFoYXModGhpcywga2V5KSB8fCAhaGFzKEFsbFN5bWJvbHMsIGtleSkgfHwgaGFzKHRoaXMsIEhJRERFTikgJiYgdGhpc1tISURERU5dW2tleV0gPyBFIDogdHJ1ZTtcbn07XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gIGl0ID0gdG9JT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgaWYgKGl0ID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSkgcmV0dXJuO1xuICB2YXIgRCA9IGdPUEQoaXQsIGtleSk7XG4gIGlmIChEICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICEoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkpIEQuZW51bWVyYWJsZSA9IHRydWU7XG4gIHJldHVybiBEO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgdmFyIG5hbWVzID0gZ09QTih0b0lPYmplY3QoaXQpKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaSA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSB7XG4gICAgaWYgKCFoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYga2V5ICE9IEhJRERFTiAmJiBrZXkgIT0gTUVUQSkgcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSB7XG4gIHZhciBJU19PUCA9IGl0ID09PSBPYmplY3RQcm90bztcbiAgdmFyIG5hbWVzID0gZ09QTihJU19PUCA/IE9QU3ltYm9scyA6IHRvSU9iamVjdChpdCkpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIHtcbiAgICBpZiAoaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIChJU19PUCA/IGhhcyhPYmplY3RQcm90bywga2V5KSA6IHRydWUpKSByZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICB9IHJldHVybi
46184ByZXN1bHQ7XG59O1xuXG4vLyAxOS40LjEuMSBTeW1ib2woW2Rlc2NyaXB0aW9uXSlcbmlmICghVVNFX05BVElWRSkge1xuICAkU3ltYm9sID0gZnVuY3Rpb24gU3ltYm9sKCkge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgJFN5bWJvbCkgdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhJyk7XG4gICAgdmFyIHRhZyA9IHVpZChhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG4gICAgdmFyICRzZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh0aGlzID09PSBPYmplY3RQcm90bykgJHNldC5jYWxsKE9QU3ltYm9scywgdmFsdWUpO1xuICAgICAgaWYgKGhhcyh0aGlzLCBISURERU4pICYmIGhhcyh0aGlzW0hJRERFTl0sIHRhZykpIHRoaXNbSElEREVOXVt0YWddID0gZmFsc2U7XG4gICAgICBzZXRTeW1ib2xEZXNjKHRoaXMsIHRhZywgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xuICAgIH07XG4gICAgaWYgKERFU0NSSVBUT1JTICYmIHNldHRlcikgc2V0U3ltYm9sRGVzYyhPYmplY3RQcm90bywgdGFnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiAkc2V0IH0pO1xuICAgIHJldHVybiB3cmFwKHRhZyk7XG4gIH07XG4gIHJlZGVmaW5lKCRTeW1ib2xbUFJPVE9UWVBFXSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2s7XG4gIH0pO1xuXG4gICRHT1BELmYgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICAkRFAuZiA9ICRkZWZpbmVQcm9wZXJ0eTtcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mID0gZ09QTkV4dC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1waWUnKS5mID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuICByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpLmYgPSAkZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4gIGlmIChERVNDUklQVE9SUyAmJiAhcmVxdWlyZSgnLi9fbGlicmFyeScpKSB7XG4gICAgcmVkZWZpbmUoT2JqZWN0UHJvdG8sICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgdHJ1ZSk7XG4gIH1cblxuICB3a3NFeHQuZiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHdyYXAod2tzKG5hbWUpKTtcbiAgfTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgeyBTeW1ib2w6ICRTeW1ib2wgfSk7XG5cbmZvciAodmFyIGVzNlN5bWJvbHMgPSAoXG4gIC8vIDE5LjQuMi4yLCAxOS40LjIuMywgMTkuNC4yLjQsIDE5LjQuMi42LCAxOS40LjIuOCwgMTkuNC4yLjksIDE5LjQuMi4xMCwgMTkuNC4yLjExLCAxOS40LjIuMTIsIDE5LjQuMi4xMywgMTkuNC4yLjE0XG4gICdoYXNJbnN0YW5jZSxpc0NvbmNhdFNwcmVhZGFibGUsaXRlcmF0b3IsbWF0Y2gscmVwbGFjZSxzZWFyY2gsc3BlY2llcyxzcGxpdCx0b1ByaW1pdGl2ZSx0b1N0cmluZ1RhZyx1bnNjb3BhYmxlcydcbikuc3BsaXQoJywnKSwgaiA9IDA7IGVzNlN5bWJvbHMubGVuZ3RoID4gajspd2tzKGVzNlN5bWJvbHNbaisrXSk7XG5cbmZvciAodmFyIHdlbGxLbm93blN5bWJvbHMgPSAka2V5cyh3a3Muc3RvcmUpLCBrID0gMDsgd2VsbEtub3duU3ltYm9scy5sZW5ndGggPiBrOykgd2tzRGVmaW5lKHdlbGxLbm93blN5bWJvbHNbaysrXSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdTeW1ib2wnLCB7XG4gIC8vIDE5LjQuMi4xIFN5bWJvbC5mb3Ioa2V5KVxuICAnZm9yJzogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBoYXMoU3ltYm9sUmVnaXN0cnksIGtleSArPSAnJylcbiAgICAgID8gU3ltYm9sUmVnaXN0cnlba2V5XVxuICAgICAgOiBTeW1ib2xSZWdpc3RyeVtrZXldID0gJFN5bWJvbChrZXkpO1xuICB9LFxuICAvLyAxOS40LjIuNSBTeW1ib2wua2V5Rm9yKHN5bSlcbiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioc3ltKSB7XG4gICAgaWYgKCFpc1N5bWJvbChzeW0pKSB0aHJvdyBUeXBlRXJyb3Ioc3ltICsgJyBpcyBub3QgYSBzeW1ib2whJyk7XG4gICAgZm9yICh2YXIga2V5IGluIFN5bWJvbFJlZ2lzdHJ5KSBpZiAoU3ltYm9sUmVnaXN0cnlba2V5XSA9PT0gc3ltKSByZXR1cm4ga2V5O1xuICB9LFxuICB1c2VTZXR0ZXI6IGZ1bmN0aW9uICgpIHsgc2V0dGVyID0gdHJ1ZTsgfSxcbiAgdXNlU2ltcGxlOiBmdW5jdGlvbiAoKSB7IHNldHRlciA9IGZhbHNlOyB9XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ09iamVjdCcsIHtcbiAgLy8gMTkuMS4yLjIgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuICBjcmVhdGU6ICRjcmVhdGUsXG4gIC8vIDE5LjEuMi40IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LFxuICAvLyAxOS4xLjIuMyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKVxuICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcyxcbiAgLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG4gIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuICAvLyAxOS4xLjIuOCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKE8pXG4gIGdldE93blByb3BlcnR5U3ltYm9sczogJGdldE93blByb3BlcnR5U3ltYm9sc1
vendor: 60,180 bytes, line 46184
46184xufSk7XG5cbi8vIDI0LjMuMiBKU09OLnN0cmluZ2lmeSh2YWx1ZSBbLCByZXBsYWNlciBbLCBzcGFjZV1dKVxuJEpTT04gJiYgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoIVVTRV9OQVRJVkUgfHwgJGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIFMgPSAkU3ltYm9sKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICByZXR1cm4gX3N0cmluZ2lmeShbU10pICE9ICdbbnVsbF0nIHx8IF9zdHJpbmdpZnkoeyBhOiBTIH0pICE9ICd7fScgfHwgX3N0cmluZ2lmeShPYmplY3QoUykpICE9ICd7fSc7XG59KSksICdKU09OJywge1xuICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCkge1xuICAgIHZhciBhcmdzID0gW2l0XTtcbiAgICB2YXIgaSA9IDE7XG4gICAgdmFyIHJlcGxhY2VyLCAkcmVwbGFjZXI7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgICRyZXBsYWNlciA9IHJlcGxhY2VyID0gYXJnc1sxXTtcbiAgICBpZiAoIWlzT2JqZWN0KHJlcGxhY2VyKSAmJiBpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSkgcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG4gICAgaWYgKCFpc0FycmF5KHJlcGxhY2VyKSkgcmVwbGFjZXIgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiAkcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykgdmFsdWUgPSAkcmVwbGFjZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBhcmdzWzFdID0gcmVwbGFjZXI7XG4gICAgcmV0dXJuIF9zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3MpO1xuICB9XG59KTtcblxuLy8gMTkuNC4zLjQgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXShoaW50KVxuJFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0gfHwgcmVxdWlyZSgnLi9faGlkZScpKCRTeW1ib2xbUFJPVE9UWVBFXSwgVE9fUFJJTUlUSVZFLCAkU3ltYm9sW1BST1RPVFlQRV0udmFsdWVPZik7XG4vLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZygkU3ltYm9sLCAnU3ltYm9sJyk7XG4vLyAyMC4yLjEuOSBNYXRoW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpO1xuLy8gMjQuMy4zIEpTT05bQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKGdsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkdHlwZWQgPSByZXF1aXJlKCcuL190eXBlZCcpO1xudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJy4vX3R5cGVkLWJ1ZmZlcicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgQXJyYXlCdWZmZXIgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5BcnJheUJ1ZmZlcjtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgJEFycmF5QnVmZmVyID0gYnVmZmVyLkFycmF5QnVmZmVyO1xudmFyICREYXRhVmlldyA9IGJ1ZmZlci5EYXRhVmlldztcbnZhciAkaXNWaWV3ID0gJHR5cGVkLkFCViAmJiBBcnJheUJ1ZmZlci5pc1ZpZXc7XG52YXIgJHNsaWNlID0gJEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZTtcbnZhciBWSUVXID0gJHR5cGVkLlZJRVc7XG52YXIgQVJSQVlfQlVGRkVSID0gJ0FycmF5QnVmZmVyJztcblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAoQXJyYXlCdWZmZXIgIT09ICRBcnJheUJ1ZmZlciksIHsgQXJyYXlCdWZmZXI6ICRBcnJheUJ1ZmZlciB9KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhJHR5cGVkLkNPTlNUUiwgQVJSQVlfQlVGRkVSLCB7XG4gIC8vIDI0LjEuMy4xIEFycmF5QnVmZmVyLmlzVmlldyhhcmcpXG4gIGlzVmlldzogZnVuY3Rpb24gaXNWaWV3KGl0KSB7XG4gICAgcmV0dXJuICRpc1ZpZXcgJiYgJGlzVmlldyhpdCkgfHwgaXNPYmplY3QoaXQpICYmIFZJRVcgaW4gaXQ7XG4gIH1cbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuVSArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gIW5ldyAkQXJyYXlCdWZmZXIoMikuc2xpY2UoMSwgdW5kZWZpbmVkKS5ieXRlTGVuZ3RoO1xufSksIEFSUkFZX0JVRkZFUiwge1xuICAvLyAyNC4xLjQuMyBBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2Uoc3RhcnQsIGVuZClcbiAgc2xpY2U6IGZ1bmN0aW9uIHNsaWNlKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoJHNsaWNlICE9PSB1bmRlZmluZWQgJiYgZW5kID09PSB1bmRlZmluZWQpIHJldHVybiAkc2xpY2UuY2FsbChhbk9iamVjdCh0aGlzKSwgc3RhcnQpOyAvLyBGRiBmaXhcbiAgICB2YXIgbGVuID0gYW5PYmplY3QodGhpcykuYnl0ZUxlbmd0aDtcbiAgICB2YXIgZmlyc3QgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbik7XG4gICAgdmFyIGZpbiA9IHRvQWJzb2x1dGVJbmRleChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IGVuZCwgbGVuKTtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJEFycmF5QnVmZmVyKSkodG9MZW5ndGgoZmluIC0gZmlyc3QpKTtcbiAgICB2YXIgdmlld1MgPSBuZXcgJERhdGFWaWV3KHRoaXMpO1xuICAgIHZhciB2aWV3VCA9IG5ldyAkRGF0YVZpZXcocmVzdWx0KTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHdoaWxlIChmaXJzdCA8IGZpbikge1xuICAgICAgdmlld1Quc2V0VWludDgoaW5kZXgrKywgdmlld1MuZ2V0VWludDgoZmlyc3QrKykpO1xuICAgIH0gcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoQVJSQVlfQlVGRkVSKTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL190eXBlZCcpLkFCViwge1xuICBEYXRhVmlldzogcmVxdWlyZSgnLi9fdHlwZWQtYnVmZmVyJykuRGF0YVZpZXdcbn0pO1xuIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnRmxvYXQzMicsIDQsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBGbG9hdDMyQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnRmxvYXQ2NCcsIDgsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBGbG9hdDY0QXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnSW50MTYnLCAyLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gSW50MTZBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG4iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdJbnQzMicsIDQsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBJbnQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0ludDgnLCAxLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gSW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ1VpbnQxNicsIDIsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50MTZBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG4iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdVaW50MzInLCA0LCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gVWludDMyQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnVWludDgnLCAxLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gVWludDhBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG4iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdVaW50OCcsIDEsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50OENsYW1wZWRBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSwgdHJ1ZSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgZWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgwKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgbWV0YSA9IHJlcXVpcmUoJy4vX21ldGEnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuL19vYmplY3QtYXNzaWduJyk7XG52YXIgd2VhayA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24td2VhaycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgTkFUSVZFX1dFQUtfTUFQID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIElTX0lFMTEgPSAhZ2xvYmFsLkFjdGl2ZVhPYmplY3QgJiYgJ0FjdGl2ZVhPYmplY3QnIGluIGdsb2JhbDtcbnZhciBXRUFLX01BUCA9ICdXZWFrTWFwJztcbnZhciBnZXRXZWFrID0gbWV0YS5nZXRXZWFrO1xudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7XG52YXIgdW5jYXVnaHRGcm96ZW5TdG9yZSA9IHdlYWsudWZzdG9yZTtcbnZhciBJbnRlcm5hbE1hcDtcblxudmFyIHdyYXBwZXIgPSBmdW5jdGlvbiAoZ2V0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpO1xuICB9O1xufTtcblxudmFyIG1ldGhvZHMgPSB7XG4gIC8vIDIzLjMuMy4zIFdlYWtNYXAucHJvdG90eXBlLmdldChrZXkpXG4gIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgIGlmIChpc09iamVjdChrZXkpKSB7XG4gICAgICB2YXIgZGF0YSA9IGdldFdlYWsoa2V5KTtcbiAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZSh2YWxpZGF0ZSh0aGlzLCBXRUFLX01BUCkpLmdldChrZXkpO1xuICAgICAgcmV0dXJuIGRhdGEgPyBkYXRhW3RoaXMuX2ldIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfSxcbiAgLy8gMjMuMy4zLjUgV2Vha01hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpXG4gIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gd2Vhay5kZWYodmFsaWRhdGUodGhpcywgV0VBS19NQVApLCBrZXksIHZhbHVlKTtcbiAgfVxufTtcblxuLy8gMjMuMyBXZWFrTWFwIE9iamVjdHNcbnZhciAkV2Vha01hcCA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKFdFQUtfTUFQLCB3cmFwcGVyLCBtZXRob2RzLCB3ZWFrLCB0cnVlLCB0cnVlKTtcblxuLy8gSUUxMSBXZWFrTWFwIGZyb3plbiBrZXlzIGZpeFxuaWYgKE5BVElWRV9XRUFLX01BUCAmJiBJU19JRTExKSB7XG4gIEludGVybmFsTWFwID0gd2Vhay5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBXRUFLX01BUCk7XG4gIGFzc2lnbihJbnRlcm5hbE1hcC5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICBtZXRhLk5FRUQgPSB0cnVlO1xuICBlYWNoKFsnZGVsZXRlJywgJ2hhcycsICdnZXQnLCAnc2V0J10sIGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgcHJvdG8gPSAkV2Vha01hcC5wcm90b3R5cGU7XG4gICAgdmFyIG1ldGhvZCA9IHByb3RvW2tleV07XG4gICAgcmVkZWZpbmUocHJvdG8sIGtleSwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIC8vIHN0b3JlIGZyb3plbiBvYmplY3RzIG9uIGludGVybmFsIHdlYWttYXAgc2hpbVxuICAgICAgaWYgKGlzT2JqZWN0KGEpICYmICFpc0V4dGVuc2libGUoYSkpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9mKSB0aGlzLl9mID0gbmV3IEludGVybmFsTWFwKCk7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9mW2tleV0oYSwgYik7XG4gICAgICAgIHJldHVybiBrZXkgPT0gJ3NldCcgPyB0aGlzIDogcmVzdWx0O1xuICAgICAgLy8gc3RvcmUgYWxsIHRoZSByZXN0IG9uIG5hdGl2ZSB3ZWFrbWFwXG4gICAgICB9IHJldHVybiBtZXRob2QuY2FsbCh0aGlzLCBhLCBiKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgd2VhayA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24td2VhaycpO1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIFdFQUtfU0VUID0gJ1dlYWtTZXQnO1xuXG4vLyAyMy40IFdlYWtTZXQgT2JqZWN0c1xucmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKFdFQUtfU0VULCBmdW5jdGlvbiAoZ2V0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBXZWFrU2V0KCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuNC4zLjEgV2Vha1NldC5wcm90b3R5cGUuYWRkKHZhbHVlKVxuICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgIHJldHVybiB3ZWFrLmRlZih2YWxpZGF0ZSh0aGlzLCBXRUFLX1NFVCksIHZhbHVlLCB0cnVlKTtcbiAgfVxufSwgd2VhaywgZmFsc2UsIHRydWUpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1mbGF0TWFwLyNzZWMtQXJyYXkucHJvdG90eXBlLmZsYXRNYXBcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZmxhdHRlbkludG9BcnJheSA9IHJlcXVpcmUoJy4vX2ZsYXR0ZW4taW50by1hcnJheScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHtcbiAgZmxhdE1hcDogZnVuY3Rpb24gZmxhdE1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIHNvdXJjZUxlbiwgQTtcbiAgICBhRnVuY3Rpb24oY2FsbGJhY2tmbik7XG4gICAgc291cmNlTGVuID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgMCk7XG4gICAgZmxhdHRlbkludG9BcnJheShBLCBPLCBPLCBzb3VyY2VMZW4sIDAsIDEsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XG4gICAgcmV0dXJuIEE7XG4gIH1cbn0pO1xuXG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKSgnZmxhdE1hcCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1mbGF0TWFwLyNzZWMtQXJyYXkucHJvdG90eXBlLmZsYXR0ZW5cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZmxhdHRlbkludG9BcnJheSA9IHJlcXVpcmUoJy4vX2ZsYXR0ZW4taW50by1hcnJheScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHtcbiAgZmxhdHRlbjogZnVuY3Rpb24gZmxhdHRlbigvKiBkZXB0aEFyZyA9IDEgKi8pIHtcbiAgICB2YXIgZGVwdGhBcmcgPSBhcmd1bWVudHNbMF07XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgc291cmNlTGVuID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBBID0gYXJyYXlTcGVjaWVzQ3JlYXRlKE8sIDApO1xuICAgIGZsYXR0ZW5JbnRvQXJyYXkoQSwgTywgTywgc291cmNlTGVuLCAwLCBkZXB0aEFyZyA9PT0gdW5kZWZpbmVkID8gMSA6IHRvSW50ZWdlcihkZXB0aEFyZykpO1xuICAgIHJldHVybiBBO1xuICB9XG59KTtcblxucmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJykoJ2ZsYXR0ZW4nKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L0FycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkaW5jbHVkZXMgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKHRydWUpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0FycmF5Jywge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoZWwgLyogLCBmcm9tSW5kZXggPSAwICovKSB7XG4gICAgcmV0dXJuICRpbmNsdWRlcyh0aGlzLCBlbCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcblxucmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJykoJ2luY2x1ZGVzJyk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vcndhbGRyb24vdGMzOS1ub3Rlcy9ibG9iL21hc3Rlci9lczYvMjAxNC0wOS9zZXB0LTI1Lm1kIzUxMC1nbG9iYWxhc2FwLWZvci1lbnF1ZXVpbmctYS1taWNyb3Rhc2tcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgbWljcm90YXNrID0gcmVxdWlyZSgnLi9fbWljcm90YXNrJykoKTtcbnZhciBwcm9jZXNzID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykucHJvY2VzcztcbnZhciBpc05vZGUgPSByZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG5cbiRleHBvcnQoJGV4cG9ydC5HLCB7XG4gIGFzYXA6IGZ1bmN0aW9uIGFzYXAoZm4pIHtcbiAgICB2YXIgZG9tYWluID0gaXNOb2RlICYmIHByb2Nlc3MuZG9tYWluO1xuICAgIG1pY3JvdGFzayhkb21haW4gPyBkb21haW4uYmluZChmbikgOiBmbik7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9wcm9wb3NhbC1pcy1lcnJvclxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdFcnJvcicsIHtcbiAgaXNFcnJvcjogZnVuY3Rpb24gaXNFcnJvcihpdCkge1xuICAgIHJldHVybiBjb2YoaXQpID09PSAnRXJyb3InO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWdsb2JhbFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LkcsIHsgZ2xvYmFsOiByZXF1aXJlKCcuL19nbG9iYWwnKSB9KTtcbiIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLW1hcC5mcm9tXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1mcm9tJykoJ01hcCcpO1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtbWFwLm9mXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1vZicpKCdNYXAnKTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnTWFwJywgeyB0b0pTT046IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tdG8tanNvbicpKCdNYXAnKSB9KTtcbiIsIi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgY2xhbXA6IGZ1bmN0aW9uIGNsYW1wKHgsIGxvd2VyLCB1cHBlcikge1xuICAgIHJldHVybiBNYXRoLm1pbih1cHBlciwgTWF0aC5tYXgobG93ZXIsIHgpKTtcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7IERFR19QRVJfUkFEOiBNYXRoLlBJIC8gMTgwIH0pO1xuIiwiLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBSQURfUEVSX0RFRyA9IDE4MCAvIE1hdGguUEk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgZGVncmVlczogZnVuY3Rpb24gZGVncmVlcyhyYWRpYW5zKSB7XG4gICAgcmV0dXJuIHJhZGlhbnMgKiBSQURfUEVSX0RFRztcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHNjYWxlID0gcmVxdWlyZSgnLi9fbWF0aC1zY2FsZScpO1xudmFyIGZyb3VuZCA9IHJlcXVpcmUoJy4vX21hdGgtZnJvdW5kJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgZnNjYWxlOiBmdW5jdGlvbiBmc2NhbGUoeCwgaW5Mb3csIGluSGlnaCwgb3V0TG93LCBvdXRIaWdoKSB7XG4gICAgcmV0dXJuIGZyb3VuZChzY2FsZSh4LCBpbkxvdywgaW5IaWdoLCBvdXRMb3csIG91dEhpZ2gpKTtcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBpYWRkaDogZnVuY3Rpb24gaWFkZGgoeDAsIHgxLCB5MCwgeTEpIHtcbiAgICB2YXIgJHgwID0geDAgPj4+IDA7XG4gICAgdmFyICR4MSA9IHgxID4+PiAwO1xuICAgIHZhciAkeTAgPSB5MCA+Pj4gMDtcbiAgICByZXR1cm4gJHgxICsgKHkxID4+PiAwKSArICgoJHgwICYgJHkwIHwgKCR4MCB8ICR5MCkgJiB+KCR4MCArICR5MCA+Pj4gMCkpID4+PiAzMSkgfCAwO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyZW5kYW5FaWNoLzQyOTRkNWMyMTJhNmQyMjU0NzAzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGltdWxoOiBmdW5jdGlvbiBpbXVsaCh1LCB2KSB7XG4gICAgdmFyIFVJTlQxNiA9IDB4ZmZmZjtcbiAgICB2YXIgJHUgPSArdTtcbiAgICB2YXIgJHYgPSArdjtcbiAgICB2YXIgdTAgPSAkdSAmIFVJTlQxNjtcbiAgICB2YXIgdjAgPSAkdiAmIFVJTlQxNjtcbiAgICB2YXIgdTEgPSAkdSA+PiAxNjtcbiAgICB2YXIgdjEgPSAkdiA+PiAxNjtcbiAgICB2YXIgdCA9ICh1MSAqIHYwID4+PiAwKSArICh1MCAqIHYwID4+PiAxNik7XG4gICAgcmV0dXJuIHUxICogdjEgKyAodCA+PiAxNikgKyAoKHUwICogdjEgPj4+IDApICsgKHQgJiBVSU5UMTYpID4+IDE2KTtcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBpc3ViaDogZnVuY3Rpb24gaXN1YmgoeDAsIHgxLCB5MCwgeTEpIHtcbiAgICB2YXIgJHgwID0geDAgPj4+IDA7XG4gICAgdmFyICR4MSA9IHgxID4+PiAwO1xuICAgIHZhciAkeTAgPSB5MCA+Pj4gMDtcbiAgICByZXR1cm4gJHgxIC0gKHkxID4+PiAwKSAtICgofiR4MCAmICR5MCB8IH4oJHgwIF4gJHkwKSAmICR4MCAtICR5MCA+Pj4gMCkgPj4+IDMxKSB8IDA7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywgeyBSQURfUEVSX0RFRzogMTgwIC8gTWF0aC5QSSB9KTtcbiIsIi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgREVHX1BFUl9SQUQgPSBNYXRoLlBJIC8gMTgwO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIHJhZGlhbnM6IGZ1bmN0aW9uIHJhZGlhbnMoZGVncmVlcykge1xuICAgIHJldHVybiBkZWdyZWVzICogREVHX1BFUl9SQUQ7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywgeyBzY2FsZTogcmVxdWlyZSgnLi9fbWF0aC1zY2FsZScpIH0pO1xuIiwiLy8gaHR0cDovL2pmYmFzdGllbi5naXRodWIuaW8vcGFwZXJzL01hdGguc2lnbmJpdC5odG1sXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7IHNpZ25iaXQ6IGZ1bmN0aW9uIHNpZ25iaXQoeCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJldHVybiAoeCA9ICt4KSAhPSB4ID8geCA6IHggPT0gMCA/IDEgLyB4ID09IEluZmluaXR5IDogeCA+IDA7XG59IH0pO1xuIiwiLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vQnJlbmRhbkVpY2gvNDI5NGQ1YzIxMmE2ZDIyNTQ3MDNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgdW11bGg6IGZ1bmN0aW9uIHVtdWxoKHUsIHYpIHtcbiAgICB2YXIgVUlOVDE2ID0gMHhmZmZmO1xuICAgIHZhciAkdSA9ICt1O1xuICAgIHZhciAkdiA9ICt2O1xuICAgIHZhciB1MCA9ICR1ICYgVUlOVDE2O1xuICAgIHZhciB2MCA9ICR2ICYgVUlOVDE2O1xuICAgIHZhciB1MSA9ICR1ID4+PiAxNjtcbiAgICB2YXIgdjEgPSAkdiA+Pj4gMTY7XG4gICAgdmFyIHQgPSAodTEgKiB2MCA+Pj4gMCkgKyAodTAgKiB2MCA+Pj4gMTYpO1xuICAgIHJldHVybiB1MSAqIHYxICsgKHQgPj4+IDE2KSArICgodTAgKiB2MSA+Pj4gMCkgKyAodCAmIFVJTlQxNikgPj4+IDE2KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xuXG4vLyBCLjIuMi4yIE9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXyhQLCBnZXR0ZXIpXG5yZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICRleHBvcnQoJGV4cG9ydC5QICsgcmVxdWlyZSgnLi9fb2JqZWN0LWZvcmNlZC1wYW0nKSwgJ09iamVjdCcsIHtcbiAgX19kZWZpbmVHZXR0ZXJfXzogZnVuY3Rpb24gX19kZWZpbmVHZXR0ZXJfXyhQLCBnZXR0ZXIpIHtcbiAgICAkZGVmaW5lUHJvcGVydHkuZih0b09iamVjdCh0aGlzKSwgUCwgeyBnZXQ6IGFGdW5jdGlvbihnZXR0ZXIpLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciAkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcblxuLy8gQi4yLjIuMyBPYmplY3QucHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX18oUCwgc2V0dGVyKVxucmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAkZXhwb3J0KCRleHBvcnQuUCArIHJlcXVpcmUoJy4vX29iamVjdC1mb3JjZWQtcGFtJyksICdPYmplY3QnLCB7XG4gIF9fZGVmaW5lU2V0dGVyX186IGZ1bmN0aW9uIF9fZGVmaW5lU2V0dGVyX18oUCwgc2V0dGVyKSB7XG4gICAgJGRlZmluZVByb3BlcnR5LmYodG9PYmplY3QodGhpcyksIFAsIHsgc2V0OiBhRnVuY3Rpb24oc2V0dGVyKSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC12YWx1ZXMtZW50cmllc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZW50cmllcyA9IHJlcXVpcmUoJy4vX29iamVjdC10by1hcnJheScpKHRydWUpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgZW50cmllczogZnVuY3Rpb24gZW50cmllcyhpdCkge1xuICAgIHJldHVybiAkZW50cmllcyhpdCk7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvcnNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4vX293bi1rZXlzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fY3JlYXRlLXByb3BlcnR5Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KG9iamVjdCk7XG4gICAgdmFyIGdldERlc2MgPSBnT1BELmY7XG4gICAgdmFyIGtleXMgPSBvd25LZXlzKE8pO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGtleSwgZGVzYztcbiAgICB3aGlsZSAoa2V5cy5sZW5ndGggPiBpKSB7XG4gICAgICBkZXNjID0gZ2V0RGVzYyhPLCBrZXkgPSBrZXlzW2krK10pO1xuICAgICAgaWYgKGRlc2MgIT09IHVuZGVmaW5lZCkgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBrZXksIGRlc2MpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxuLy8gQi4yLjIuNCBPYmplY3QucHJvdG90eXBlLl9fbG9va3VwR2V0dGVyX18oUClcbnJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgJGV4cG9ydCgkZXhwb3J0LlAgKyByZXF1aXJlKCcuL19vYmplY3QtZm9yY2VkLXBhbScpLCAnT2JqZWN0Jywge1xuICBfX2xvb2t1cEdldHRlcl9fOiBmdW5jdGlvbiBfX2xvb2t1cEdldHRlcl9fKFApIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBLID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gICAgdmFyIEQ7XG4gICAgZG8ge1xuICAgICAgaWYgKEQgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgSykpIHJldHVybiBELmdldDtcbiAgICB9IHdoaWxlIChPID0gZ2V0UHJvdG90eXBlT2YoTykpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxuLy8gQi4yLjIuNSBPYmplY3QucHJvdG90eXBlLl9fbG9va3VwU2V0dGVyX18oUClcbnJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgJGV4cG9ydCgkZXhwb3J0LlAgKyByZXF1aXJlKCcuL19vYmplY3QtZm9yY2VkLXBhbScpLCAnT2JqZWN0Jywge1xuICBfX2xvb2t1cFNldHRlcl9fOiBmdW5jdGlvbiBfX2xvb2t1cFNldHRlcl9fKFApIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBLID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gICAgdmFyIEQ7XG4gICAgZG8ge1xuICAgICAgaWYgKEQgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgSykpIHJldHVybiBELnNldDtcbiAgICB9IHdoaWxlIChPID0gZ2V0UHJvdG90eXBlT2YoTykpO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC12YWx1ZXMtZW50cmllc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkdmFsdWVzID0gcmVxdWlyZSgnLi9fb2JqZWN0LXRvLWFycmF5JykoZmFsc2UpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoaXQpIHtcbiAgICByZXR1cm4gJHZhbHVlcyhpdCk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3plbnBhcnNpbmcvZXMtb2JzZXJ2YWJsZVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgT0JTRVJWQUJMRSA9IHJlcXVpcmUoJy4vX3drcycpKCdvYnNlcnZhYmxlJyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgUkVUVVJOID0gZm9yT2YuUkVUVVJOO1xuXG52YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24gKGZuKSB7XG4gIHJldHVybiBmbiA9PSBudWxsID8gdW5kZWZpbmVkIDogYUZ1bmN0aW9uKGZuKTtcbn07XG5cbnZhciBjbGVhbnVwU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gKHN1YnNjcmlwdGlvbikge1xuICB2YXIgY2xlYW51cCA9IHN1YnNjcmlwdGlvbi5fYztcbiAgaWYgKGNsZWFudXApIHtcbiAgICBzdWJzY3JpcHRpb24uX2MgPSB1bmRlZmluZWQ7XG4gICAgY2xlYW51cCgpO1xuICB9XG59O1xuXG52YXIgc3Vic2NyaXB0aW9uQ2xvc2VkID0gZnVuY3Rpb24gKHN1YnNjcmlwdGlvbikge1xuICByZXR1cm4gc3Vic2NyaXB0aW9uLl9vID09PSB1bmRlZmluZWQ7XG59O1xuXG52YXIgY2xvc2VTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7XG4gIGlmICghc3Vic2NyaXB0aW9uQ2xvc2VkKHN1YnNjcmlwdGlvbikpIHtcbiAgICBzdWJzY3JpcHRpb24uX28gPSB1bmRlZmluZWQ7XG4gICAgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICB9XG59O1xuXG52YXIgU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gKG9ic2VydmVyLCBzdWJzY3JpYmVyKSB7XG4gIGFuT2JqZWN0KG9ic2VydmVyKTtcbiAgdGhpcy5fYyA9IHVuZGVmaW5lZDtcbiAgdGhpcy5fbyA9IG9ic2VydmVyO1xuICBvYnNlcnZlciA9IG5ldyBTdWJzY3JpcHRpb25PYnNlcnZlcih0aGlzKTtcbiAgdHJ5IHtcbiAgICB2YXIgY2xlYW51cCA9IHN1YnNjcmliZXIob2JzZXJ2ZXIpO1xuICAgIHZhciBzdWJzY3JpcHRpb24gPSBjbGVhbnVwO1xuICAgIGlmIChjbGVhbnVwICE9IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgY2xlYW51cC51bnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJykgY2xlYW51cCA9IGZ1bmN0aW9uICgpIHsgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7IH07XG4gICAgICBlbHNlIGFGdW5jdGlvbihjbGVhbnVwKTtcbiAgICAgIHRoaXMuX2MgPSBjbGVhbnVwO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgIHJldHVybjtcbiAgfSBpZiAoc3Vic2NyaXB0aW9uQ2xvc2VkKHRoaXMpKSBjbGVhbnVwU3Vic2NyaXB0aW9uKHRoaXMpO1xufTtcblxuU3Vic2NyaXB0aW9uLnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKHt9LCB7XG4gIHVuc3Vic2NyaWJlOiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHsgY2xvc2VTdWJzY3JpcHRpb24odGhpcyk7IH1cbn0pO1xuXG52YXIgU3Vic2NyaXB0aW9uT2JzZXJ2ZXIgPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7XG4gIHRoaXMuX3MgPSBzdWJzY3JpcHRpb247XG59O1xuXG5TdWJzY3JpcHRpb25PYnNlcnZlci5wcm90b3R5cGUgPSByZWRlZmluZUFsbCh7fSwge1xuICBuZXh0OiBmdW5jdGlvbiBuZXh0KHZhbHVlKSB7XG4gICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoaXMuX3M7XG4gICAgaWYgKCFzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uKSkge1xuICAgICAgdmFyIG9ic2VydmVyID0gc3Vic2NyaXB0aW9uLl9vO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIG0gPSBnZXRNZXRob2Qob2JzZXJ2ZXIubmV4dCk7XG4gICAgICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG9ic2VydmVyLCB2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2xvc2VTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBlcnJvcjogZnVuY3Rpb24gZXJyb3IodmFsdWUpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5fcztcbiAgICBpZiAoc3Vic2NyaXB0aW9uQ2xvc2VkKHN1YnNjcmlwdGlvbikpIHRocm93IHZhbHVlO1xuICAgIHZhciBvYnNlcnZlciA9IHN1YnNjcmlwdGlvbi5fbztcbiAgICBzdWJzY3JpcHRpb24uX28gPSB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBtID0gZ2V0TWV0aG9kKG9ic2VydmVyLmVycm9yKTtcbiAgICAgIGlmICghbSkgdGhyb3cgdmFsdWU7XG4gICAgICB2YWx1ZSA9IG0uY2FsbChvYnNlcnZlciwgdmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxuICBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUodmFsdWUpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5fcztcbiAgICBpZiAoIXN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb24pKSB7XG4gICAgICB2YXIgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb24uX287XG4gICAgICBzdWJzY3JpcHRpb24uX28gPSB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbSA9IGdldE1ldGhvZChvYnNlcnZlci5jb21wbGV0ZSk7XG4gICAgICAgIHZhbHVlID0gbSA/IG0uY2FsbChvYnNlcnZlciwgdmFsdWUpIDogdW5kZWZpbmVkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9IGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cbn0pO1xuXG52YXIgJE9ic2VydmFibGUgPSBmdW5jdGlvbiBPYnNlcnZhYmxlKHN1YnNjcmliZXIpIHtcbiAgYW5JbnN0YW5jZSh0aGlzLCAkT2JzZXJ2YWJsZSwgJ09ic2VydmFibGUnLCAnX2YnKS5fZiA9IGFGdW5jdGlvbihzdWJzY3JpYmVyKTtcbn07XG5cbnJlZGVmaW5lQWxsKCRPYnNlcnZhYmxlLnByb3RvdHlwZSwge1xuICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKG9ic2VydmVyLCB0aGlzLl9mKTtcbiAgfSxcbiAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChmbikge1xuICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICByZXR1cm4gbmV3IChjb3JlLlByb21pc2UgfHwgZ2xvYmFsLlByb21pc2UpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGFGdW5jdGlvbihmbik7XG4gICAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhhdC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGZuKHZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiByZWplY3QsXG4gICAgICAgIGNvbXBsZXRlOiByZXNvbHZlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufSk7XG5cbnJlZGVmaW5lQWxsKCRPYnNlcnZhYmxlLCB7XG4gIGZyb206IGZ1bmN0aW9uIGZyb20oeCkge1xuICAgIHZhciBDID0gdHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogJE9ic2VydmFibGU7XG4gICAgdmFyIG1ldGhvZCA9IGdldE1ldGhvZChhbk9iamVjdCh4KVtPQlNFUlZBQkxFXSk7XG4gICAgaWYgKG1ldGhvZCkge1xuICAgICAgdmFyIG9ic2VydmFibGUgPSBhbk9iamVjdChtZXRob2QuY2FsbCh4KSk7XG4gICAgICByZXR1cm4gb2JzZXJ2YWJsZS5jb25zdHJ1Y3RvciA9PT0gQyA/IG9ic2VydmFibGUgOiBuZXcgQyhmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgICAgcmV0dXJuIG9ic2VydmFibGUuc3Vic2NyaWJlKG9ic2VydmVyKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEMoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICB2YXIgZG9uZSA9IGZhbHNlO1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFkb25lKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmb3JPZih4LCBmYWxzZSwgZnVuY3Rpb24gKGl0KSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoaXQpO1xuICAgICAgICAgICAgICBpZiAoZG9uZSkgcmV0dXJuIFJFVFVSTjtcbiAgICAgICAgICAgIH0pID09PSBSRVRVUk4pIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZG9uZSkgdGhyb3cgZTtcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyBkb25lID0gdHJ1ZTsgfTtcbiAgICB9KTtcbiAgfSxcbiAgb2Y6IGZ1bmN0aW9uIG9mKCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aCwgaXRlbXMgPSBuZXcgQXJyYXkobCk7IGkgPCBsOykgaXRlbXNbaV0gPSBhcmd1bWVudHNbaSsrXTtcbiAgICByZXR1cm4gbmV3ICh0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiAkT2JzZXJ2YWJsZSkoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICB2YXIgZG9uZSA9IGZhbHNlO1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFkb25lKSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpdGVtcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChpdGVtc1tqXSk7XG4gICAgICAgICAgICBpZiAoZG9uZSkgcmV0dXJuO1xuICAgICAgICAgIH0gb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyBkb25lID0gdHJ1ZTsgfTtcbiAgICB9KTtcbiAgfVxufSk7XG5cbmhpZGUoJE9ic2VydmFibGUucHJvdG90eXBlLCBPQlNFUlZBQkxFLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KTtcblxuJGV4cG9ydCgkZXhwb3J0LkcsIHsgT2JzZXJ2YWJsZTogJE9ic2VydmFibGUgfSk7XG5cbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoJ09ic2VydmFibGUnKTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByb21pc2UtZmluYWxseVxuJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4vX3Byb21pc2UtcmVzb2x2ZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuUiwgJ1Byb21pc2UnLCB7ICdmaW5hbGx5JzogZnVuY3Rpb24gKG9uRmluYWxseSkge1xuICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBjb3JlLlByb21pc2UgfHwgZ2xvYmFsLlByb21pc2UpO1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBvbkZpbmFsbHkgPT0gJ2Z1bmN0aW9uJztcbiAgcmV0dXJuIHRoaXMudGhlbihcbiAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB4OyB9KTtcbiAgICB9IDogb25GaW5hbGx5LFxuICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgdGhyb3cgZTsgfSk7XG4gICAgfSA6IG9uRmluYWxseVxuICApO1xufSB9KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByb21pc2UtdHJ5XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi9fbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuL19wZXJmb3JtJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUHJvbWlzZScsIHsgJ3RyeSc6IGZ1bmN0aW9uIChjYWxsYmFja2ZuKSB7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYodGhpcyk7XG4gIHZhciByZXN1bHQgPSBwZXJmb3JtKGNhbGxiYWNrZm4pO1xuICAocmVzdWx0LmUgPyBwcm9taXNlQ2FwYWJpbGl0eS5yZWplY3QgOiBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlKShyZXN1bHQudik7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufSB9KTtcbiIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b01ldGFLZXkgPSBtZXRhZGF0YS5rZXk7XG52YXIgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9IG1ldGFkYXRhLnNldDtcblxubWV0YWRhdGEuZXhwKHsgZGVmaW5lTWV0YWRhdGE6IGZ1bmN0aW9uIGRlZmluZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHRhcmdldEtleSkge1xuICBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCBhbk9iamVjdCh0YXJnZXQpLCB0b01ldGFLZXkodGFyZ2V0S2V5KSk7XG59IH0pO1xuIiwidmFyIG1ldGFkYXRhID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcbnZhciBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwID0gbWV0YWRhdGEubWFwO1xudmFyIHN0b3JlID0gbWV0YWRhdGEuc3RvcmU7XG5cbm1ldGFkYXRhLmV4cCh7IGRlbGV0ZU1ldGFkYXRhOiBmdW5jdGlvbiBkZWxldGVNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0IC8qICwgdGFyZ2V0S2V5ICovKSB7XG4gIHZhciB0YXJnZXRLZXkgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YUtleShhcmd1bWVudHNbMl0pO1xuICB2YXIgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKGFuT2JqZWN0KHRhcmdldCksIHRhcmdldEtleSwgZmFsc2UpO1xuICBpZiAobWV0YWRhdGFNYXAgPT09IHVuZGVmaW5lZCB8fCAhbWV0YWRhdGFNYXBbJ2RlbGV0ZSddKG1ldGFkYXRhS2V5KSkgcmV0dXJuIGZhbHNlO1xuICBpZiAobWV0YWRhdGFNYXAuc2l6ZSkgcmV0dXJuIHRydWU7XG4gIHZhciB0YXJnZXRNZXRhZGF0YSA9IHN0b3JlLmdldCh0YXJnZXQpO1xuICB0YXJnZXRNZXRhZGF0YVsnZGVsZXRlJ10odGFyZ2V0S2V5KTtcbiAgcmV0dXJuICEhdGFyZ2V0TWV0YWRhdGEuc2l6ZSB8fCBzdG9yZVsnZGVsZXRlJ10odGFyZ2V0KTtcbn0gfSk7XG4iLCJ2YXIgU2V0ID0gcmVxdWlyZSgnLi9lczYuc2V0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4vX2FycmF5LWZyb20taXRlcmFibGUnKTtcbnZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IG1ldGFkYXRhLmtleXM7XG52YXIgdG9NZXRhS2V5ID0gbWV0YWRhdGEua2V5O1xuXG52YXIgb3JkaW5hcnlNZXRhZGF0YUtleXMgPSBmdW5jdGlvbiAoTywgUCkge1xuICB2YXIgb0tleXMgPSBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKTtcbiAgdmFyIHBhcmVudCA9IGdldFByb3RvdHlwZU9mKE8pO1xuICBpZiAocGFyZW50ID09PSBudWxsKSByZXR1cm4gb0tleXM7XG4gIHZhciBwS2V5cyA9IG9yZGluYXJ5TWV0YWRhdGFLZXlzKHBhcmVudCwgUCk7XG4gIHJldHVybiBwS2V5cy5sZW5ndGggPyBvS2V5cy5sZW5ndGggPyBmcm9tKG5ldyBTZXQob0tleXMuY29uY2F0KHBLZXlzKSkpIDogcEtleXMgOiBvS2V5cztcbn07XG5cbm1ldGFkYXRhLmV4cCh7IGdldE1ldGFkYXRhS2V5czogZnVuY3Rpb24gZ2V0TWV0YWRhdGFLZXlzKHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICByZXR1cm4gb3JkaW5hcnlNZXRhZGF0YUtleXMoYW5PYmplY3QodGFyZ2V0KSwgYXJndW1lbnRzLmxlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzFdKSk7XG59IH0pO1xuIiwidmFyIG1ldGFkYXRhID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEgPSBtZXRhZGF0YS5oYXM7XG52YXIgb3JkaW5hcnlHZXRPd25NZXRhZGF0YSA9IG1ldGFkYXRhLmdldDtcbnZhciB0b01ldGFLZXkgPSBtZXRhZGF0YS5rZXk7XG5cbnZhciBvcmRpbmFyeUdldE1ldGFkYXRhID0gZnVuY3Rpb24gKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gIHZhciBoYXNPd24gPSBvcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgaWYgKGhhc093bikgcmV0dXJuIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICB2YXIgcGFyZW50ID0gZ2V0UHJvdG90eXBlT2YoTyk7XG4gIHJldHVybiBwYXJlbnQgIT09IG51bGwgPyBvcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApIDogdW5kZWZpbmVkO1xufTtcblxubWV0YWRhdGEuZXhwKHsgZ2V0TWV0YWRhdGE6IGZ1bmN0aW9uIGdldE1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5R2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldCksIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufSB9KTtcbiIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IG1ldGFkYXRhLmtleXM7XG52YXIgdG9NZXRhS2V5ID0gbWV0YWRhdGEua2V5O1xuXG5tZXRhZGF0YS5leHAoeyBnZXRPd25NZXRhZGF0YUtleXM6IGZ1bmN0aW9uIGdldE93bk1ldGFkYXRhS2V5cyh0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKGFuT2JqZWN0KHRhcmdldCksIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1sxXSkpO1xufSB9KTtcbiIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBvcmRpbmFyeUdldE93bk1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0O1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcblxubWV0YWRhdGEuZXhwKHsgZ2V0T3duTWV0YWRhdGE6IGZ1bmN0aW9uIGdldE93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldClcbiAgICAsIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufSB9KTtcbiIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gbWV0YWRhdGEuaGFzO1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcblxudmFyIG9yZGluYXJ5SGFzTWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgdmFyIGhhc093biA9IG9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICBpZiAoaGFzT3duKSByZXR1cm4gdHJ1ZTtcbiAgdmFyIHBhcmVudCA9IGdldFByb3RvdHlwZU9mKE8pO1xuICByZXR1cm4gcGFyZW50ICE9PSBudWxsID8gb3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKSA6IGZhbHNlO1xufTtcblxubWV0YWRhdGEuZXhwKHsgaGFzTWV0YWRhdGE6IGZ1bmN0aW9uIGhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5SGFzTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldCksIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufSB9KTtcbiIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gbWV0YWRhdGEuaGFzO1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcblxubWV0YWRhdGEuZXhwKHsgaGFzT3duTWV0YWRhdGE6IGZ1bmN0aW9uIGhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldClcbiAgICAsIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufSB9KTtcbiIsInZhciAkbWV0YWRhdGEgPSByZXF1aXJlKCcuL19tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIHRvTWV0YUtleSA9ICRtZXRhZGF0YS5rZXk7XG52YXIgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9ICRtZXRhZGF0YS5zZXQ7XG5cbiRtZXRhZGF0YS5leHAoeyBtZXRhZGF0YTogZnVuY3Rpb24gbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGRlY29yYXRvcih0YXJnZXQsIHRhcmdldEtleSkge1xuICAgIG9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoXG4gICAgICBtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSxcbiAgICAgICh0YXJnZXRLZXkgIT09IHVuZGVmaW5lZCA/IGFuT2JqZWN0IDogYUZ1bmN0aW9uKSh0YXJnZXQpLFxuICAgICAgdG9NZXRhS2V5KHRhcmdldEtleSlcbiAgICApO1xuICB9O1xufSB9KTtcbiIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXNldC5mcm9tXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1mcm9tJykoJ1NldCcpO1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtc2V0Lm9mXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1vZicpKCdTZXQnKTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnU2V0JywgeyB0b0pTT046IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tdG8tanNvbicpKCdTZXQnKSB9KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXRcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICBhdDogZnVuY3Rpb24gYXQocG9zKSB7XG4gICAgcmV0dXJuICRhdCh0aGlzLCBwb3MpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vU3RyaW5nLnByb3RvdHlwZS5tYXRjaEFsbC9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJyk7XG52YXIgZ2V0RmxhZ3MgPSByZXF1aXJlKCcuL19mbGFncycpO1xudmFyIFJlZ0V4cFByb3RvID0gUmVnRXhwLnByb3RvdHlwZTtcblxudmFyICRSZWdFeHBTdHJpbmdJdGVyYXRvciA9IGZ1bmN0aW9uIChyZWdleHAsIHN0cmluZykge1xuICB0aGlzLl9yID0gcmVnZXhwO1xuICB0aGlzLl9zID0gc3RyaW5nO1xufTtcblxucmVxdWlyZSgnLi9faXRlci1jcmVhdGUnKSgkUmVnRXhwU3RyaW5nSXRlcmF0b3IsICdSZWdFeHAgU3RyaW5nJywgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIG1hdGNoID0gdGhpcy5fci5leGVjKHRoaXMuX3MpO1xuICByZXR1cm4geyB2YWx1ZTogbWF0Y2gsIGRvbmU6IG1hdGNoID09PSBudWxsIH07XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdTdHJpbmcnLCB7XG4gIG1hdGNoQWxsOiBmdW5jdGlvbiBtYXRjaEFsbChyZWdleHApIHtcbiAgICBkZWZpbmVkKHRoaXMpO1xuICAgIGlmICghaXNSZWdFeHAocmVnZXhwKSkgdGhyb3cgVHlwZUVycm9yKHJlZ2V4cCArICcgaXMgbm90IGEgcmVnZXhwIScpO1xuICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuICAgIHZhciBmbGFncyA9ICdmbGFncycgaW4gUmVnRXhwUHJvdG8gPyBTdHJpbmcocmVnZXhwLmZsYWdzKSA6IGdldEZsYWdzLmNhbGwocmVnZXhwKTtcbiAgICB2YXIgcnggPSBuZXcgUmVnRXhwKHJlZ2V4cC5zb3VyY2UsIH5mbGFncy5pbmRleE9mKCdnJykgPyBmbGFncyA6ICdnJyArIGZsYWdzKTtcbiAgICByeC5sYXN0SW5kZXggPSB0b0xlbmd0aChyZWdleHAubGFzdEluZGV4KTtcbiAgICByZXR1cm4gbmV3ICRSZWdFeHBTdHJpbmdJdGVyYXRvcihyeCwgUyk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc3RyaW5nLXBhZC1zdGFydC1lbmRcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHBhZCA9IHJlcXVpcmUoJy4vX3N0cmluZy1wYWQnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuL191c2VyLWFnZW50Jyk7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8yODBcbnZhciBXRUJLSVRfQlVHID0gL1ZlcnNpb25cXC8xMFxcLlxcZCsoXFwuXFxkKyk/KCBNb2JpbGVcXC9cXHcrKT8gU2FmYXJpXFwvLy50ZXN0KHVzZXJBZ2VudCk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogV0VCS0lUX0JVRywgJ1N0cmluZycsIHtcbiAgcGFkRW5kOiBmdW5jdGlvbiBwYWRFbmQobWF4TGVuZ3RoIC8qICwgZmlsbFN0cmluZyA9ICcgJyAqLykge1xuICAgIHJldHVybiAkcGFkKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGZhbHNlKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcGFkLXN0YXJ0LWVuZFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFkID0gcmVxdWlyZSgnLi9fc3RyaW5nLXBhZCcpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4vX3VzZXItYWdlbnQnKTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzI4MFxudmFyIFdFQktJVF9CVUcgPSAvVmVyc2lvblxcLzEwXFwuXFxkKyhcXC5cXGQrKT8oIE1vYmlsZVxcL1xcdyspPyBTYWZhcmlcXC8vLnRlc3QodXNlckFnZW50KTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBXRUJLSVRfQlVHLCAnU3RyaW5nJywge1xuICBwYWRTdGFydDogZnVuY3Rpb24gcGFkU3RhcnQobWF4TGVuZ3RoIC8qICwgZmlsbFN0cmluZyA9ICcgJyAqLykge1xuICAgIHJldHVybiAkcGFkKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRydWUpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zZWJtYXJrYmFnZS9lY21hc2NyaXB0LXN0cmluZy1sZWZ0LXJpZ2h0LXRyaW1cbnJlcXVpcmUoJy4vX3N0cmluZy10cmltJykoJ3RyaW1MZWZ0JywgZnVuY3Rpb24gKCR0cmltKSB7XG4gIHJldHVybiBmdW5jdGlvbiB0cmltTGVmdCgpIHtcbiAgICByZXR1cm4gJHRyaW0odGhpcywgMSk7XG4gIH07XG59LCAndHJpbVN0YXJ0Jyk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vc2VibWFya2JhZ2UvZWNtYXNjcmlwdC1zdHJpbmctbGVmdC1yaWdodC10cmltXG5yZXF1aXJlKCcuL19zdHJpbmctdHJpbScpKCd0cmltUmlnaHQnLCBmdW5jdGlvbiAoJHRyaW0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyaW1SaWdodCgpIHtcbiAgICByZXR1cm4gJHRyaW0odGhpcywgMik7XG4gIH07XG59LCAndHJpbUVuZCcpO1xuIiwicmVxdWlyZSgnLi9fd2tzLWRlZmluZScpKCdhc3luY0l0ZXJhdG9yJyk7XG4iLCJyZXF1aXJlKCcuL193a3MtZGVmaW5lJykoJ29ic2VydmFibGUnKTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWdsb2JhbFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdTeXN0ZW0nLCB7IGdsb2JhbDogcmVxdWlyZSgnLi9fZ2xvYmFsJykgfSk7XG4iLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy13ZWFrbWFwLmZyb21cbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLWZyb20nKSgnV2Vha01hcCcpO1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtd2Vha21hcC5vZlxucmVxdWlyZSgnLi9fc2V0LWNvbGxlY3Rpb24tb2YnKSgnV2Vha01hcCcpO1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtd2Vha3NldC5mcm9tXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1mcm9tJykoJ1dlYWtTZXQnKTtcbiIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXdlYWtzZXQub2ZcbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLW9mJykoJ1dlYWtTZXQnKTtcbiIsInZhciAkaXRlcmF0b3JzID0gcmVxdWlyZSgnLi9lczYuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcbnZhciBJVEVSQVRPUiA9IHdrcygnaXRlcmF0b3InKTtcbnZhciBUT19TVFJJTkdfVEFHID0gd2tzKCd0b1N0cmluZ1RhZycpO1xudmFyIEFycmF5VmFsdWVzID0gSXRlcmF0b3JzLkFycmF5O1xuXG52YXIgRE9NSXRlcmFibGVzID0ge1xuICBDU1NSdWxlTGlzdDogdHJ1ZSwgLy8gVE9ETzogTm90IHNwZWMgY29tcGxpYW50LCBzaG91bGQgYmUgZmFsc2UuXG4gIENTU1N0eWxlRGVjbGFyYXRpb246IGZhbHNlLFxuICBDU1NWYWx1ZUxpc3Q6IGZhbHNlLFxuICBDbGllbnRSZWN0TGlzdDogZmFsc2UsXG4gIERPTVJlY3RMaXN0OiBmYWxzZSxcbiAgRE9NU3RyaW5nTGlzdDogZmFsc2UsXG4gIERPTVRva2VuTGlzdDogdHJ1ZSxcbiAgRGF0YVRyYW5zZmVySXRlbUxpc3Q6IGZhbHNlLFxuICBGaWxlTGlzdDogZmFsc2UsXG4gIEhUTUxBbGxDb2xsZWN0aW9uOiBmYWxzZSxcbiAgSFRNTENvbGxlY3Rpb246IGZhbHNlLFxuICBIVE1MRm9ybUVsZW1lbnQ6IGZhbHNlLFxuICBIVE1MU2VsZWN0RWxlbWVudDogZmFsc2UsXG4gIE1lZGlhTGlzdDogdHJ1ZSwgLy8gVE9ETzogTm90IHNwZWMgY29tcGxpYW50LCBzaG91bGQgYmUgZmFsc2UuXG4gIE1pbWVUeXBlQXJyYXk6IGZhbHNlLFxuICBOYW1lZE5vZGVNYXA6IGZhbHNlLFxuICBOb2RlTGlzdDogdHJ1ZSxcbiAgUGFpbnRSZXF1ZXN0TGlzdDogZmFsc2UsXG4gIFBsdWdpbjogZmFsc2UsXG4gIFBsdWdpbkFycmF5OiBmYWxzZSxcbiAgU1ZHTGVuZ3RoTGlzdDogZmFsc2UsXG4gIFNWR051bWJlckxpc3Q6IGZhbHNlLFxuICBTVkdQYXRoU2VnTGlzdDogZmFsc2UsXG4gIFNWR1BvaW50TGlzdDogZmFsc2UsXG4gIFNWR1N0cmluZ0xpc3Q6IGZhbHNlLFxuICBTVkdUcmFuc2Zvcm1MaXN0OiBmYWxzZSxcbiAgU291cmNlQnVmZmVyTGlzdDogZmFsc2UsXG4gIFN0eWxlU2hlZXRMaXN0OiB0cnVlLCAvLyBUT0RPOiBOb3Qgc3BlYyBjb21wbGlhbnQsIHNob3VsZCBiZSBmYWxzZS5cbiAgVGV4dFRyYWNrQ3VlTGlzdDogZmFsc2UsXG4gIFRleHRUcmFja0xpc3Q6IGZhbHNlLFxuICBUb3VjaExpc3Q6IGZhbHNlXG59O1xuXG5mb3IgKHZhciBjb2xsZWN0aW9ucyA9IGdldEtleXMoRE9NSXRlcmFibGVzKSwgaSA9IDA7IGkgPCBjb2xsZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICB2YXIgTkFNRSA9IGNvbGxlY3Rpb25zW2ldO1xuICB2YXIgZXhwbGljaXQgPSBET01JdGVyYWJsZXNbTkFNRV07XG4gIHZhciBDb2xsZWN0aW9uID0gZ2xvYmFsW05BTUVdO1xuICB2YXIgcHJvdG8gPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICB2YXIga2V5O1xuICBpZiAocHJvdG8pIHtcbiAgICBpZiAoIXByb3RvW0lURVJBVE9SXSkgaGlkZShwcm90bywgSVRFUkFUT1IsIEFycmF5VmFsdWVzKTtcbiAgICBpZiAoIXByb3RvW1RPX1NUUklOR19UQUddKSBoaWRlKHByb3RvLCBUT19TVFJJTkdfVEFHLCBOQU1FKTtcbiAgICBJdGVyYXRvcnNbTkFNRV0gPSBBcnJheVZhbHVlcztcbiAgICBpZiAoZXhwbGljaXQpIGZvciAoa2V5IGluICRpdGVyYXRvcnMpIGlmICghcHJvdG9ba2V5XSkgcmVkZWZpbmUocHJvdG8sIGtleSwgJGl0ZXJhdG9yc1trZXldLCB0cnVlKTtcbiAgfVxufVxuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKTtcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5CLCB7XG4gIHNldEltbWVkaWF0ZTogJHRhc2suc2V0LFxuICBjbGVhckltbWVkaWF0ZTogJHRhc2suY2xlYXJcbn0pO1xuIiwiLy8gaWU5LSBzZXRUaW1lb3V0ICYgc2V0SW50ZXJ2YWwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZpeFxudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuL191c2VyLWFnZW50Jyk7XG52YXIgc2xpY2UgPSBbXS5zbGljZTtcbnZhciBNU0lFID0gL01TSUUgLlxcLi8udGVzdCh1c2VyQWdlbnQpOyAvLyA8LSBkaXJ0eSBpZTktIGNoZWNrXG52YXIgd3JhcCA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChmbiwgdGltZSAvKiAsIC4uLmFyZ3MgKi8pIHtcbiAgICB2YXIgYm91bmRBcmdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gICAgdmFyIGFyZ3MgPSBib3VuZEFyZ3MgPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgMikgOiBmYWxzZTtcbiAgICByZXR1cm4gc2V0KGJvdW5kQXJncyA/IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgICAgKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbikpLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH0gOiBmbiwgdGltZSk7XG4gIH07XG59O1xuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LkIgKyAkZXhwb3J0LkYgKiBNU0lFLCB7XG4gIHNldFRpbWVvdXQ6IHdyYXAoZ2xvYmFsLnNldFRpbWVvdXQpLFxuICBzZXRJbnRlcnZhbDogd3JhcChnbG9iYWwuc2V0SW50ZXJ2YWwpXG59KTtcbiIsInJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3ltYm9sJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5jcmVhdGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0eScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnRpZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZnJlZXplJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5zZWFsJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5wcmV2ZW50LWV4dGVuc2lvbnMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmlzLWZyb3plbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMtc2VhbGVkJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1leHRlbnNpYmxlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmlzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5zZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZnVuY3Rpb24uYmluZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5mdW5jdGlvbi5uYW1lJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmhhcy1pbnN0YW5jZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5wYXJzZS1pbnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucGFyc2UtZmxvYXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmNvbnN0cnVjdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci50by1maXhlZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIudG8tcHJlY2lzaW9uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5lcHNpbG9uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5pcy1maW5pdGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmlzLWludGVnZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmlzLW5hbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtc2FmZS1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5tYXgtc2FmZS1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5taW4tc2FmZS1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1mbG9hdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIucGFyc2UtaW50Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguYWNvc2gnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5hc2luaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmF0YW5oJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguY2JydCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmNsejMyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguY29zaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmV4cG0xJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguZnJvdW5kJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguaHlwb3QnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5pbXVsJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgubG9nMTAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5sb2cxcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmxvZzInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5zaWduJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguc2luaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLnRhbmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC50cnVuYycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuZnJvbS1jb2RlLXBvaW50Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5yYXcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnRyaW0nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5jb2RlLXBvaW50LWF0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5lbmRzLXdpdGgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmluY2x1ZGVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5yZXBlYXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnN0YXJ0cy13aXRoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5hbmNob3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmJpZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuYmxpbmsnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmJvbGQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmZpeGVkJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5mb250Y29sb3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRzaXplJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5pdGFsaWNzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5saW5rJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5zbWFsbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuc3RyaWtlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5zdWInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnN1cCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5kYXRlLm5vdycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5kYXRlLnRvLWpzb24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZGF0ZS50by1pc28tc3RyaW5nJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmRhdGUudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmRhdGUudG8tcHJpbWl0aXZlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmlzLWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZyb20nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkub2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuam9pbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5zbGljZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5zb3J0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZvci1lYWNoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5Lm1hcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5maWx0ZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuc29tZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5ldmVyeScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5yZWR1Y2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlLXJpZ2h0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmluZGV4LW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5Lmxhc3QtaW5kZXgtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuY29weS13aXRoaW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZmlsbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5maW5kJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZpbmQtaW5kZXgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuc3BlY2llcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAuY29uc3RydWN0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLmV4ZWMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAuZmxhZ3MnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLm1hdGNoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5yZXBsYWNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5zZWFyY2gnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLnNwbGl0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnByb21pc2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWFwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnNldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi53ZWFrLW1hcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi53ZWFrLXNldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5hcnJheS1idWZmZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuZGF0YS12aWV3Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmludDgtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQudWludDgtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQudWludDgtY2xhbXBlZC1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5pbnQxNi1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC51aW50MTYtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuaW50MzItYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQudWludDMyLWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmZsb2F0MzItYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuZmxvYXQ2NC1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmFwcGx5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuY29uc3RydWN0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVmaW5lLXByb3BlcnR5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZW51bWVyYXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmhhcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmlzLWV4dGVuc2libGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5vd24ta2V5cycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LnByZXZlbnQtZXh0ZW5zaW9ucycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LnNldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LnNldC1wcm90b3R5cGUtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuYXJyYXkuaW5jbHVkZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuYXJyYXkuZmxhdC1tYXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuYXJyYXkuZmxhdHRlbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcuYXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1zdGFydCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcucGFkLWVuZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcudHJpbS1sZWZ0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy50cmltLXJpZ2h0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy5tYXRjaC1hbGwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC52YWx1ZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcub2JqZWN0LmVudHJpZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcub2JqZWN0LmRlZmluZS1nZXR0ZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcub2JqZWN0LmRlZmluZS1zZXR0ZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcub2JqZWN0Lmxvb2t1cC1nZXR0ZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcub2JqZWN0Lmxvb2t1cC1zZXR0ZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWFwLnRvLWpzb24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc2V0LnRvLWpzb24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWFwLm9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnNldC5vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy53ZWFrLW1hcC5vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy53ZWFrLXNldC5vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXAuZnJvbScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zZXQuZnJvbScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy53ZWFrLW1hcC5mcm9tJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LndlYWstc2V0LmZyb20nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuZ2xvYmFsJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN5c3RlbS5nbG9iYWwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuZXJyb3IuaXMtZXJyb3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5jbGFtcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLmRlZy1wZXItcmFkJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguZGVncmVlcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLmZzY2FsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLmlhZGRoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguaXN1YmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5pbXVsaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLnJhZC1wZXItZGVnJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGgucmFkaWFucycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLnNjYWxlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGgudW11bGgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5zaWduYml0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnByb21pc2UuZmluYWxseScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5wcm9taXNlLnRyeScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmRlZmluZS1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmRlbGV0ZS1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1tZXRhZGF0YS1rZXlzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEta2V5cycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1vd24tbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5hc2FwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9ic2VydmFibGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy93ZWIudGltZXJzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvd2ViLmltbWVkaWF0ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9tb2R1bGVzL19jb3JlJyk7XG4iLCIvKi
46184EgSGFtbWVyLkpTIC0gdjIuMC43IC0gMjAxNi0wNC0yMlxuICogaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby9cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgSm9yaWsgVGFuZ2VsZGVyO1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlICovXG4oZnVuY3Rpb24od2luZG93LCBkb2N1bWVudCwgZXhwb3J0TmFtZSwgdW5kZWZpbmVkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxudmFyIFZFTkRPUl9QUkVGSVhFUyA9IFsnJywgJ3dlYmtpdCcsICdNb3onLCAnTVMnLCAnbXMnLCAnbyddO1xudmFyIFRFU1RfRUxFTUVOVCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG52YXIgVFlQRV9GVU5DVElPTiA9ICdmdW5jdGlvbic7XG5cbnZhciByb3VuZCA9IE1hdGgucm91bmQ7XG52YXIgYWJzID0gTWF0aC5hYnM7XG52YXIgbm93ID0gRGF0ZS5ub3c7XG5cbi8qKlxuICogc2V0IGEgdGltZW91dCB3aXRoIGEgZ2l2ZW4gc2NvcGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge051bWJlcn0gdGltZW91dFxuICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIHNldFRpbWVvdXRDb250ZXh0KGZuLCB0aW1lb3V0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoYmluZEZuKGZuLCBjb250ZXh0KSwgdGltZW91dCk7XG59XG5cbi8qKlxuICogaWYgdGhlIGFyZ3VtZW50IGlzIGFuIGFycmF5LCB3ZSB3YW50IHRvIGV4ZWN1dGUgdGhlIGZuIG9uIGVhY2ggZW50cnlcbiAqIGlmIGl0IGFpbnQgYW4gYXJyYXkgd2UgZG9uJ3Qgd2FudCB0byBkbyBhIHRoaW5nLlxuICogdGhpcyBpcyB1c2VkIGJ5IGFsbCB0aGUgbWV0aG9kcyB0aGF0IGFjY2VwdCBhIHNpbmdsZSBhbmQgYXJyYXkgYXJndW1lbnQuXG4gKiBAcGFyYW0geyp8QXJyYXl9IGFyZ1xuICogQHBhcmFtIHtTdHJpbmd9IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHRdXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaW52b2tlQXJyYXlBcmcoYXJnLCBmbiwgY29udGV4dCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICAgICAgZWFjaChhcmcsIGNvbnRleHRbZm5dLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiB3YWxrIG9iamVjdHMgYW5kIGFycmF5c1xuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0XG4gKi9cbmZ1bmN0aW9uIGVhY2gob2JqLCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgIHZhciBpO1xuXG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvYmouZm9yRWFjaCkge1xuICAgICAgICBvYmouZm9yRWFjaChpdGVyYXRvciwgY29udGV4dCk7XG4gICAgfSBlbHNlIGlmIChvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgb2JqLmxlbmd0aCkge1xuICAgICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpbaV0sIGksIG9iaik7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGkgaW4gb2JqKSB7XG4gICAgICAgICAgICBvYmouaGFzT3duUHJvcGVydHkoaSkgJiYgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpbaV0sIGksIG9iaik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogd3JhcCBhIG1ldGhvZCB3aXRoIGEgZGVwcmVjYXRpb24gd2FybmluZyBhbmQgc3RhY2sgdHJhY2VcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgbmV3IGZ1bmN0aW9uIHdyYXBwaW5nIHRoZSBzdXBwbGllZCBtZXRob2QuXG4gKi9cbmZ1bmN0aW9uIGRlcHJlY2F0ZShtZXRob2QsIG5hbWUsIG1lc3NhZ2UpIHtcbiAgICB2YXIgZGVwcmVjYXRpb25NZXNzYWdlID0gJ0RFUFJFQ0FURUQgTUVUSE9EOiAnICsgbmFtZSArICdcXG4nICsgbWVzc2FnZSArICcgQVQgXFxuJztcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlID0gbmV3IEVycm9yKCdnZXQtc3RhY2stdHJhY2UnKTtcbiAgICAgICAgdmFyIHN0YWNrID0gZSAmJiBlLnN0YWNrID8gZS5zdGFjay5yZXBsYWNlKC9eW15cXChdKz9bXFxuJF0vZ20sICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL15cXHMrYXRcXHMrL2dtLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eT2JqZWN0Ljxhbm9ueW1vdXM+XFxzKlxcKC9nbSwgJ3thbm9ueW1vdXN9KClAJykgOiAnVW5rbm93biBTdGFjayBUcmFjZSc7XG5cbiAgICAgICAgdmFyIGxvZyA9IHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS53YXJuIHx8IHdpbmRvdy5jb25zb2xlLmxvZyk7XG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICAgIGxvZy5jYWxsKHdpbmRvdy5jb25zb2xlLCBkZXByZWNhdGlvbk1lc3NhZ2UsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBleHRlbmQgb2JqZWN0LlxuICogbWVhbnMgdGh
46184hdCBwcm9wZXJ0aWVzIGluIGRlc3Qgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgb25lcyBpbiBzcmMuXG4gKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gKiBAcGFyYW0gey4uLk9iamVjdH0gb2JqZWN0c190b19hc3NpZ25cbiAqIEByZXR1cm5zIHtPYmplY3R9IHRhcmdldFxuICovXG52YXIgYXNzaWduO1xuaWYgKHR5cGVvZiBPYmplY3QuYXNzaWduICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduKHRhcmdldCkge1xuICAgICAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgdGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvdXRwdXQgPSBPYmplY3QodGFyZ2V0KTtcbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG5leHRLZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkobmV4dEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtuZXh0S2V5XSA9IHNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH07XG59IGVsc2Uge1xuICAgIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG59XG5cbi8qKlxuICogZXh0ZW5kIG9iamVjdC5cbiAqIG1lYW5zIHRoYXQgcHJvcGVydGllcyBpbiBkZXN0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIG9uZXMgaW4gc3JjLlxuICogQHBhcmFtIHtPYmplY3R9IGRlc3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBzcmNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW21lcmdlPWZhbHNlXVxuICogQHJldHVybnMge09iamVjdH0gZGVzdFxuICovXG52YXIgZXh0ZW5kID0gZGVwcmVjYXRlKGZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMsIG1lcmdlKSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhzcmMpO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGtleXMubGVuZ3RoKSB7XG4gICAgICAgIGlmICghbWVyZ2UgfHwgKG1lcmdlICYmIGRlc3Rba2V5c1tpXV0gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIGRlc3Rba2V5c1tpXV0gPSBzcmNba2V5c1tpXV07XG4gICAgICAgIH1cbiAgICAgICAgaSsrO1xuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbn0sICdleHRlbmQnLCAnVXNlIGBhc3NpZ25gLicpO1xuXG4vKipcbiAqIG1lcmdlIHRoZSB2YWx1ZXMgZnJvbSBzcmMgaW4gdGhlIGRlc3QuXG4gKiBtZWFucyB0aGF0IHByb3BlcnRpZXMgdGhhdCBleGlzdCBpbiBkZXN0IHdpbGwgbm90IGJlIG92ZXJ3cml0dGVuIGJ5IHNyY1xuICogQHBhcmFtIHtPYmplY3R9IGRlc3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBzcmNcbiAqIEByZXR1cm5zIHtPYmplY3R9IGRlc3RcbiAqL1xudmFyIG1lcmdlID0gZGVwcmVjYXRlKGZ1bmN0aW9uIG1lcmdlKGRlc3QsIHNyYykge1xuICAgIHJldHVybiBleHRlbmQoZGVzdCwgc3JjLCB0cnVlKTtcbn0sICdtZXJnZScsICdVc2UgYGFzc2lnbmAuJyk7XG5cbi8qKlxuICogc2ltcGxlIGNsYXNzIGluaGVyaXRhbmNlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjaGlsZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gYmFzZVxuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzXVxuICovXG5mdW5jdGlvbiBpbmhlcml0KGNoaWxkLCBiYXNlLCBwcm9wZXJ0aWVzKSB7XG4gICAgdmFyIGJhc2VQID0gYmFzZS5wcm90b3R5cGUsXG4gICAgICAgIGNoaWxkUDtcblxuICAgIGNoaWxkUCA9IGNoaWxkLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoYmFzZVApO1xuICAgIGNoaWxkUC5jb25zdHJ1Y3RvciA9IGNoaWxkO1xuICAgIGNoaWxkUC5fc3VwZXIgPSBiYXNlUDtcblxuICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgIGFzc2lnbihjaGlsZFAsIHByb3BlcnRpZXMpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBzaW1wbGUgZnVuY3Rpb24gYmluZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0XG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGJpbmRGbihmbiwgY29udGV4dCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBib3VuZEZuKCkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTtcbiAgICB9O1xufVxuXG4vKipcbiAqIGxldCBhIGJvb2xlYW4gdmFsdWUgYWxzbyBiZSBhIGZ1bmN0aW9uIHRoYXQgbXVzdCByZXR1cm4gYSBib29sZWFuXG4gKiB0aGlzIGZpcnN0IGl0ZW0gaW4gYXJncyB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbnRleHRcbiAqIEBwYXJhbSB7Qm9vbGVhbnxGdW5jdGlvbn0gdmFsXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJnc11cbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBib29sT3JGbih2YWwsIGFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PSBUWVBFX0ZVTkNUSU9OKSB7XG4gICAgICAgIHJldHVybiB2YWwuYXBwbHkoYXJncyA/IGFyZ3NbMF0gfHwgdW5kZWZpbmVkIDogdW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn1cblxuLyoqXG4gKiB1c2UgdGhlIHZhbDIgd2hlbiB2YWwxIGlzIHVuZGVmaW5lZFxuICogQHBhcmFtIHsqfSB2YWwxXG4gKiBAcGFyYW0geyp9IHZhbDJcbiAqIEByZXR1cm5zIHsqfVxuICovXG5mdW5jdGlvbiBpZlVuZGVmaW5lZCh2YWwxLCB2YWwyKSB7XG4gICAgcmV0dXJuICh2YWwxID09PSB1bmRlZmluZWQpID8gdmFsMiA6IHZhbDE7XG59XG5cbi8qKlxuICogYWRkRXZlbnRMaXN0ZW5lciB3aXRoIG11bHRpcGxlIGV2ZW50cyBhdCBvbmNlXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICovXG5mdW5jdGlvbiBhZGR
46184FdmVudExpc3RlbmVycyh0YXJnZXQsIHR5cGVzLCBoYW5kbGVyKSB7XG4gICAgZWFjaChzcGxpdFN0cih0eXBlcyksIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgZmFsc2UpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIHJlbW92ZUV2ZW50TGlzdGVuZXIgd2l0aCBtdWx0aXBsZSBldmVudHMgYXQgb25jZVxuICogQHBhcmFtIHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcnModGFyZ2V0LCB0eXBlcywgaGFuZGxlcikge1xuICAgIGVhY2goc3BsaXRTdHIodHlwZXMpLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBmaW5kIGlmIGEgbm9kZSBpcyBpbiB0aGUgZ2l2ZW4gcGFyZW50XG4gKiBAbWV0aG9kIGhhc1BhcmVudFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcGFyZW50XG4gKiBAcmV0dXJuIHtCb29sZWFufSBmb3VuZFxuICovXG5mdW5jdGlvbiBoYXNQYXJlbnQobm9kZSwgcGFyZW50KSB7XG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gcGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogc21hbGwgaW5kZXhPZiB3cmFwcGVyXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge1N0cmluZ30gZmluZFxuICogQHJldHVybnMge0Jvb2xlYW59IGZvdW5kXG4gKi9cbmZ1bmN0aW9uIGluU3RyKHN0ciwgZmluZCkge1xuICAgIHJldHVybiBzdHIuaW5kZXhPZihmaW5kKSA+IC0xO1xufVxuXG4vKipcbiAqIHNwbGl0IHN0cmluZyBvbiB3aGl0ZXNwYWNlXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7QXJyYXl9IHdvcmRzXG4gKi9cbmZ1bmN0aW9uIHNwbGl0U3RyKHN0cikge1xuICAgIHJldHVybiBzdHIudHJpbSgpLnNwbGl0KC9cXHMrL2cpO1xufVxuXG4vKipcbiAqIGZpbmQgaWYgYSBhcnJheSBjb250YWlucyB0aGUgb2JqZWN0IHVzaW5nIGluZGV4T2Ygb3IgYSBzaW1wbGUgcG9seUZpbGxcbiAqIEBwYXJhbSB7QXJyYXl9IHNyY1xuICogQHBhcmFtIHtTdHJpbmd9IGZpbmRcbiAqIEBwYXJhbSB7U3RyaW5nfSBbZmluZEJ5S2V5XVxuICogQHJldHVybiB7Qm9vbGVhbnxOdW1iZXJ9IGZhbHNlIHdoZW4gbm90IGZvdW5kLCBvciB0aGUgaW5kZXhcbiAqL1xuZnVuY3Rpb24gaW5BcnJheShzcmMsIGZpbmQsIGZpbmRCeUtleSkge1xuICAgIGlmIChzcmMuaW5kZXhPZiAmJiAhZmluZEJ5S2V5KSB7XG4gICAgICAgIHJldHVybiBzcmMuaW5kZXhPZihmaW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2Y
46184XIgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgc3JjLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKChmaW5kQnlLZXkgJiYgc3JjW2ldW2ZpbmRCeUtleV0gPT0gZmluZCkgfHwgKCFmaW5kQnlLZXkgJiYgc3JjW2ldID09PSBmaW5kKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG59XG5cbi8qKlxuICogY29udmVydCBhcnJheS1saWtlIG9iamVjdHMgdG8gcmVhbCBhcnJheXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gdG9BcnJheShvYmopIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwob2JqLCAwKTtcbn1cblxuLyoqXG4gKiB1bmlxdWUgYXJyYXkgd2l0aCBvYmplY3RzIGJhc2VkIG9uIGEga2V5IChsaWtlICdpZCcpIG9yIGp1c3QgYnkgdGhlIGFycmF5J3MgdmFsdWVcbiAqIEBwYXJhbSB7QXJyYXl9IHNyYyBbe2lkOjF9LHtpZDoyfSx7aWQ6MX1dXG4gKiBAcGFyYW0ge1N0cmluZ30gW2tleV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW3NvcnQ9RmFsc2VdXG4gKiBAcmV0dXJucyB7QXJyYXl9IFt7aWQ6MX0se2lkOjJ9XVxuICovXG5mdW5jdGlvbiB1bmlxdWVBcnJheShzcmMsIGtleSwgc29ydCkge1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgIHZhciBpID0gMDtcblxuICAgIHdoaWxlIChpIDwgc3JjLmxlbmd0aCkge1xuICAgICAgICB2Y
46184XIgdmFsID0ga2V5ID8gc3JjW2ldW2tleV0gOiBzcmNbaV07XG4gICAgICAgIGlmIChpbkFycmF5KHZhbHVlcywgdmFsKSA8IDApIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChzcmNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlc1tpXSA9IHZhbDtcbiAgICAgICAgaSsrO1xuICAgIH1cblxuICAgIGlmIChzb3J0KSB7XG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5zb3J0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5zb3J0KGZ1bmN0aW9uIHNvcnRVbmlxdWVBcnJheShhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFba2V5XSA+IGJba2V5XTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbi8qKlxuICogZ2V0IHRoZSBwcmVmaXhlZCBwcm9wZXJ0eVxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gKiBAcmV0dXJucyB7U3RyaW5nfFVuZGVmaW5lZH0gcHJlZml4ZWRcbiAqL1xuZnVuY3Rpb24gcHJlZml4ZWQob2JqLCBwcm9wZXJ0eSkge1xuICAgIHZhciBwcmVmaXgsIHByb3A7XG4gICAgdmFyIGNhbWVsUHJvcCA9IHByb3BlcnR5WzBdLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zbGljZSgxKTtcblxuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSA8IFZFTkRPUl9QUkVGSVhFUy5sZW5ndGgpIHtcbiAgICAgICAgcHJlZml4ID0gVkVORE9SX1BSRUZJWEVTW2ldO1xuICAgICAgICBwcm9wID0gKHByZWZpeCkgPyBwcmVmaXggKyBjYW1lbFByb3AgOiBwcm9wZXJ0eTtcblxuICAgICAgICBpZiAocHJvcCBpbiBvYmopIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wO1xuICAgICAgICB9XG4gICAgICAgIGkrKztcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBnZXQgYSB1bmlxdWUgaWRcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHVuaXF1ZUlkXG4gKi9cbnZhciBfdW5pcXVlSWQgPSAxO1xuZnVuY3Rpb24gdW5pcXVlSWQoKSB7XG4gICAgcmV0dXJuIF91bmlxdWVJZCsrO1xufVxuXG4vKipcbiAqIGdldCB0aGUgd2luZG93IG9iamVjdCBvZiBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7RG9jdW1lbnRWaWV3fFdpbmRvd31cbiAqL1xuZnVuY3Rpb24gZ2V0V2luZG93Rm9yRWxlbWVudChlbGVtZW50KSB7XG4gICAgdmFyIGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudCB8fCBlbGVtZW50O1xuICAgIHJldHVybiAoZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3cgfHwgd2luZG93KTtcbn1cblxudmFyIE1PQklMRV9SRUdFWCA9IC9tb2JpbGV8dGFibGV0fGlwKGFkfGhvbmV8b2QpfGFuZHJvaWQvaTtcblxudmFyIFNVUFBPUlRfVE9VQ0ggPSAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93KTtcbnZhciBTVVBQT1JUX1BPSU5URVJfRVZFTlRTID0gcHJlZml4ZWQod2luZG93LCAnUG9pbnRlckV2ZW50JykgIT09IHVuZGVmaW5lZDtcbnZhciBTVVBQT1JUX09OTFlfVE9VQ0ggPSBTVVBQT1JUX1RPVUNIICYmIE1PQklMRV9SRUdFWC50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG52YXIgSU5QVVRfVFlQRV9UT1VDSCA9ICd0b3VjaCc7XG52YXIgSU5QVVRfVFlQRV9QRU4gPSAncGVuJztcbnZhciBJTlBVVF9UWVBFX01PVVNFID0gJ21vdXNlJztcbnZhciBJTlBVVF9UWVBFX0tJTkVDVCA9ICdraW5lY3QnO1xuXG52YXIgQ09NUFVURV9JTlRFUlZBTCA9IDI1O1xuXG52YXIgSU5QVVRfU1RBUlQgPSAxO1xudmFyIElOUFVUX01PVkUgPSAyO1xudmFyIElOUFVUX0VORCA9IDQ7XG52YXIgSU5QVVRfQ0FOQ0VMID0gODtcblxudmFyIERJUkVDVElPTl9OT05FID0gMTtcbnZhciBESVJFQ1RJT05fTEVGVCA9IDI7XG52YXIgRElSRUNUSU9OX1JJR0hUID0gNDtcbnZhciBESVJFQ1RJT05fVVAgPSA4O1xudmFyIERJUkVDVElPTl9ET1dOID0gMTY7XG5cbnZhciBESVJFQ1RJT05fSE9SSVpPTlRBTCA9IERJUkVDVElPTl9MRUZUIHwgRElSRUNUSU9OX1JJR0hUO1xudmFyIERJUkVDVElPTl9WRVJUSUNBTCA9IERJUkVDVElPTl9VUCB8IERJUkVDVElPTl9ET1dOO1xudmFyIERJUkVDVElPTl9BTEwgPSBESVJFQ1RJT05fSE9SSVpPTlRBTCB8IERJUkVDVElPTl9WRVJUSUNBTDtcblxudmFyIFBST1BTX1hZID0gWyd4JywgJ3knXTtcbnZhciBQUk9QU19DTElFTlRfWFkgPSBbJ2NsaWVudFgnLCAnY2xpZW50WSddO1xuXG4vKipcbiAqIGNyZWF0ZSBuZXcgaW5wdXQgdHlwZSBtYW5hZ2VyXG4gKiBAcGFyYW0ge01hbmFnZXJ9IG1hbmFnZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7SW5wdXR9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gSW5wdXQobWFuYWdlciwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgdGhpcy5lbGVtZW50ID0gbWFuYWdlci5lbGVtZW50O1xuICAgIHRoaXMudGFyZ2V0ID0gbWFuYWdlci5vcHRpb25zLmlucHV0VGFyZ2V0O1xuXG4gICAgLy8gc21hbGxlciB3cmFwcGVyIGFyb3VuZCB0aGUgaGFuZGxlciwgZm9yIHRoZSBzY29wZSBhbmQgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIG1hbmFnZXIsXG4gICAgLy8gc28gd2hlbiBkaXNhYmxlZCB0aGUgaW5wdXQgZXZlbnRzIGFyZSBjb21wbGV0ZWx5IGJ5cGFzc2VkLlxuICAgIHRoaXMuZG9tSGFuZGxlciA9IGZ1bmN0aW9uKGV2KSB7XG4gICAgICAgIGlmIChib29sT3JGbihtYW5hZ2VyLm9wdGlvbnMuZW5hYmxlLCBbbWFuYWdlcl0pKSB7XG4gICAgICAgICAgICBzZWxmLmhhbmRsZXIoZXYpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuaW5pdCgpO1xuXG59XG5cbklucHV0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBzaG91bGQgaGFuZGxlIHRoZSBpbnB1dEV2ZW50IGRhdGEgYW5kIHRyaWdnZXIgdGhlIGNhbGxiYWNrXG4gICAgICogQHZpcnR1YWxcbiAgICAgKi9cbiAgICBoYW5kbGVyOiBmdW5jdGlvbigpIHsgfSxcblxuICAgIC8qKlxuICAgICAqIGJpbmQgdGhlIGV2ZW50c1xuICAgICAqL1xuICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmV2RWwgJiYgYWRkRXZlbnRMaXN0ZW5lcnModGhpcy5lbGVtZW50LCB0aGlzLmV2RWwsIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgICAgI
46184HRoaXMuZXZUYXJnZXQgJiYgYWRkRXZlbnRMaXN0ZW5lcnModGhpcy50YXJnZXQsIHRoaXMuZXZUYXJnZXQsIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgICAgIHRoaXMuZXZXaW4gJiYgYWRkRXZlbnRMaXN0ZW5lcnMoZ2V0V2luZG93Rm9yRWxlbWVudCh0aGlzLmVsZW1lbnQpLCB0aGlzLmV2V2luLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB1bmJpbmQgdGhlIGV2ZW50c1xuICAgICAqL1xuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmV2RWwgJiYgcmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5lbGVtZW50LCB0aGlzLmV2RWwsIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgICAgIHRoaXMuZXZUYXJnZXQgJiYgcmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy50YXJnZXQsIHRoaXMuZXZUYXJnZXQsIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgICAgIHRoaXMuZXZXaW4gJiYgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoZ2V0V2luZG93Rm9yRWxlbWVudCh0aGlzLmVsZW1lbnQpLCB0aGlzLmV2V2luLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgIH1cbn07XG5cbi8qKlxuICogY3JlYXRlIG5ldyBpbnB1dCB0eXBlIG1hbmFnZXJcbiAqIGNhbGxlZCBieSB0aGUgTWFuYWdlciBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtIYW1tZXJ9IG1hbmFnZXJcbiAqIEByZXR1cm5zIHtJbnB1dH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5wdXRJbnN0YW5jZShtYW5hZ2VyKSB7XG4gICAgdmFyIFR5cGU7XG4gICAgdmFyIGlucHV0Q2xhc3MgPSBtYW5hZ2VyLm9wdGlvbnMuaW5wdXRDbGFzcztcblxuICAgIGlmIChpbnB1dENsYXNzKSB7XG4gICAgICAgIFR5cGUgPSBpbnB1dENsYXNzO1xuICAgIH0gZWxzZSBpZiAoU1VQUE9SVF9QT0lOVEVSX0VWRU5UUykge1xuICAgICAgICBUeXBlID0gUG9pbnRlckV2ZW50SW5wdXQ7XG4gICAgfSBlbHNlIGlmIChTVVBQT1JUX09OTFlfVE9VQ0gpIHtcbiAgICAgICAgVHlwZSA9IFRvdWNoSW5wdXQ7XG4gICAgfSBlbHNlIGlmICghU1VQUE9SVF9UT1VDSCkge1xuICAgICAgICBUeXBlID0gTW91c2VJbnB1dDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBUeXBlID0gVG91Y2hNb3VzZUlucHV0O1xuICAgIH1cbiAgICByZXR1cm4gbmV3IChUeXBlKShtYW5hZ2VyLCBpbnB1dEhhbmRsZXIpO1xufVxuXG4vKipcbiAqIGhhbmRsZSBpbnB1dCBldmVudHNcbiAqIEBwYXJhbSB7TWFuYWdlcn0gbWFuYWdlclxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50VHlwZVxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gKi9cbmZ1bmN0aW9uIGlucHV0SGFuZGxlcihtYW5hZ2VyLCBldmVudFR5cGUsIGlucHV0KSB7XG4gICAgdmFyIHBvaW50ZXJzTGVuID0gaW5wdXQucG9pbnRlcnMubGVuZ3RoO1xuICAgIHZhciBjaGFuZ2VkUG9pbnRlcnNMZW4gPSBpbnB1dC5jaGFuZ2VkUG9pbnRlcnMubGVuZ3RoO1xuICAgIHZhciBpc0ZpcnN0ID0gKGV2ZW50VHlwZSAmIElOUFVUX1NUQVJUICYmIChwb2ludGVyc0xlbiAtIGNoYW5nZWRQb2ludGVyc0xlbiA9PT0gMCkpO1xuICAgIHZhciBpc0ZpbmFsID0gKGV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpICYmIChwb2ludGVyc0xlbiAtIGNoYW5nZWRQb2ludGVyc0xlbiA9PT0gMCkpO1xuXG4gICAgaW5wdXQuaXNGaXJzdCA9ICEhaXNGaXJzdDtcbiAgICBpbnB1dC5pc0ZpbmFsID0gISFpc0ZpbmFsO1xuXG4gICAgaWYgKGlzRmlyc3QpIHtcbiAgICAgICAgbWFuYWdlci5zZXNzaW9uID0ge307XG4gICAgfVxuXG4gICAgLy8gc291cmNlIGV2ZW50IGlzIHRoZSBub3JtYWxpemVkIHZhbHVlIG9mIHRoZSBkb21FdmVudHNcbiAgICAvLyBsaWtlICd0b3VjaHN0YXJ0LCBtb3VzZXVwLCBwb2ludGVyZG93bidcbiAgICBpbnB1dC5ldmVudFR5cGUgPSBldmVudFR5cGU7XG5cbiAgICAvLyBjb21wdXRlIHNjYWxlLCByb3RhdGlvbiBldGNcbiAgICBjb21wdXRlSW5wdXREYXRhKG1hbmFnZXIsIGlucHV0KTtcblxuICAgIC8vIGVtaXQgc2VjcmV0IGV2ZW50XG4gICAgbWFuYWdlci5lbWl0KCdoYW1tZXIuaW5wdXQnLCBpbnB1dCk7XG5cbiAgICBtYW5hZ2VyLnJlY29nbml6ZShpbnB1dCk7XG4gICAgbWFuYWdlci5zZXNzaW9uLnByZXZJbnB1dCA9IGlucHV0O1xufVxuXG4vKipcbiAqIGV4dGVuZCB0aGUgZGF0YSB3aXRoIHNvbWUgdXNhYmxlIHByb3BlcnRpZXMgbGlrZSBzY2FsZSwgcm90YXRlLCB2ZWxvY2l0eSBldGNcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYW5hZ2VyXG4gKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUlucHV0RGF0YShtYW5hZ2VyLCBpbnB1dCkge1xuICAgIHZhciBzZXNzaW9uID0gbWFuYWdlci5zZXNzaW9uO1xuICAgIHZhciBwb2ludGVycyA9IGlucHV0LnBvaW50ZXJzO1xuICAgIHZhciBwb2ludGVyc0xlbmd0aCA9IHBvaW50ZXJzLmxlbmd0aDtcblxuICAgIC8vIHN0b3JlIHRoZSBmaXJzdCBpbnB1dCB0byBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGFuZCBkaXJlY3Rpb25cbiAgICBpZiAoIXNlc3Npb24uZmlyc3RJbnB1dCkge1xuICAgICAgICBzZXNzaW9uLmZpcnN0SW5wdXQgPSBzaW1wbGVDbG9uZUlucHV0RGF0YShpbnB1dCk7XG4gICAgfVxuXG4gICAgLy8gdG8gY29tcHV0ZSBzY2FsZSBhbmQgcm90YXRpb24gd2UgbmVlZCB0byBzdG9yZSB0aGUgbXVsdGlwbGUgdG91Y2hlc1xuICAgIGlmIChwb2ludGVyc0xlbmd0aCA+IDEgJiYgIXNlc3Npb24uZmlyc3RNdWx0aXBsZSkge1xuICAgICAgICBzZXNzaW9uLmZpcnN0TXVsdGlwbGUgPSBzaW1wbGVDbG9uZUlucHV0RGF0YShpbnB1dCk7XG4gICAgfSBlbHNlIGlmIChwb2ludGVyc0xlbmd0aCA9PT0gMSkge1xuICAgICAgICBzZXNzaW9uLmZpcnN0TXVsdGlwbGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgZmlyc3RJbnB1dCA9IHNlc3Npb24uZmlyc3RJbnB1dDtcbiAgICB2YXIgZmlyc3RNdWx0aXBsZSA9IHNlc3Npb24uZmlyc3RNdWx0aXBsZTtcbiAgICB2YXIgb2Zmc2V0Q2VudGVyID0gZmlyc3RNdWx0aXBsZSA/IGZpcnN0TXVsdGlwbGUuY2VudGVyIDogZmlyc3RJbnB1dC5jZW50ZXI7XG5cbiAgICB2YXIgY2VudGVyID0gaW5wdXQuY2VudGVyID0gZ2V0Q2VudGVyKHBvaW50ZXJzKTtcbiAgICBpbnB1dC50aW1lU3RhbXAgPSBub3coKTtcbiAgICBpbnB1dC5kZWx0YVRpbWUgPSBpbnB1dC50aW1lU3RhbXAgLSBmaXJzdElucHV0LnRpbWVTdGFtcDtcblxuICAgIGlucHV0LmFuZ2xlID0gZ2V0QW5nbGUob2Zmc2V0Q2VudGVyLCBjZW50ZXIpO1xuICAgIGlucHV0LmRpc3RhbmNlID0gZ2V0RGlzdGFuY2Uob2Zmc2V0Q2VudGVyLCBjZW50ZXIpO1xuXG4gICAgY29tcHV0ZURlbHRhWFkoc2Vzc2lvbiwgaW5wdXQpO1xuICAgIGlucHV0Lm9mZnNldERpcmVjdGlvbiA9IGdldERpcmVjdGlvbihpbnB1dC5kZWx0YVgsIGlucHV0LmRlbHRhWSk7XG5cbiAgICB2YXIgb3ZlcmFsbFZlbG9jaXR5ID0gZ2V0VmVsb2NpdHkoaW5wdXQuZGVsdGFUaW1lLCBpbnB1dC5kZWx0YVgsIGlucHV0LmRlbHRhWSk7XG4gICAgaW5wdXQub3ZlcmFsbFZlbG9jaXR5WCA9IG92ZXJhbGxWZWxvY2l0eS54O1xuICAgIGlucHV0Lm92ZXJhbGxWZWxvY2l0eVkgPSBvdmVyYWxsVmVsb2NpdHkueTtcbiAgICBpbnB1dC5vdmVyYWxsVmVsb2NpdHkgPSAoYWJzKG92ZXJhbGxWZWxvY2l0eS54KSA+IGFicyhvdmVyYWxsVmVsb2NpdHkueSkpID8gb3ZlcmFsbFZlbG9jaXR5LnggOiBvdmVyYWxsVmVsb2NpdHkueTtcblxuICAgIGlucHV0LnNjYWxlID0gZmlyc3RNdWx0aXBsZSA/IGdldFNjYWxlKGZpcnN0TXVsdGlwbGUucG9pbnRlcnMsIHBvaW50ZXJzKSA6IDE7XG4gICAgaW5wdXQucm90YXRpb24gPSBmaXJzdE11bHRpcGxlID8gZ2V0Um90YXRpb24oZmlyc3RNdWx0aXBsZS5wb2ludGVycywgcG9pbnRlcnMpIDogMDtcblxuICAgIGlucHV0Lm1heFBvaW50ZXJzID0gIXNlc3Npb24ucHJldklucHV0ID8gaW5wdXQucG9pbnRlcnMubGVuZ3RoIDogKChpbnB1dC5wb2ludGVycy5sZW5ndGggPlxuICAgICAgICBzZXNzaW9uLnByZXZJbnB1dC5tYXhQb2ludGVycykgPyBpbnB1dC5wb2ludGVycy5sZW5ndGggOiBzZXNzaW9uLnByZXZJbnB1dC5tYXhQb2ludGVycyk7XG5cbiAgICBjb21wdXRlSW50ZXJ2YWxJbnB1dERhdGEoc2Vzc2lvbiwgaW5wdXQpO1xuXG4gICAgLy8gZmluZCB0aGUgY29ycmVjdCB0YXJnZXRcbiAgICB2YXIgdGFyZ2V0ID0gbWFuYWdlci5lbGVtZW50O1xuICAgIGlmIChoYXNQYXJlbnQoaW5wdXQuc3JjRXZlbnQudGFyZ2V0LCB0YXJnZXQpKSB7XG4gICAgICAgI
46184HRhcmdldCA9IGlucHV0LnNyY0V2ZW50LnRhcmdldDtcbiAgICB9XG4gICAgaW5wdXQudGFyZ2V0ID0gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRGVsdGFYWShzZXNzaW9uLCBpbnB1dCkge1xuICAgIHZhciBjZW50ZXIgPSBpbnB1dC5jZW50ZXI7XG4gICAgdmFyIG9mZnNldCA9IHNlc3Npb24ub2Zmc2V0RGVsdGEgfHwge307XG4gICAgdmFyIHByZXZEZWx0YSA9IHNlc3Npb24ucHJldkRlbHRhIHx8IHt9O1xuICAgIHZhciBwcmV2SW5wdXQgPSBzZXNzaW9uLnByZXZJbnB1dCB8fCB7fTtcblxuICAgIGlmIChpbnB1dC5ldmVudFR5cGUgPT09IElOUFVUX1NUQVJUIHx8IHByZXZJbnB1dC5ldmVudFR5cGUgPT09IElOUFVUX0VORCkge1xuICAgICAgICBwcmV2RGVsdGEgPSBzZXNzaW9uLnByZXZEZWx0YSA9IHtcbiAgICAgICAgICAgIHg6IHByZXZJbnB1dC5kZWx0YVggfHwgMCxcbiAgICAgICAgICAgIHk6IHByZXZJbnB1dC5kZWx0YVkgfHwgMFxuICAgICAgICB9O1xuXG4gICAgICAgIG9mZnNldCA9IHNlc3Npb24ub2Zmc2V0RGVsdGEgPSB7XG4gICAgICAgICAgICB4OiBjZW50ZXIueCxcbiAgICAgICAgICAgIHk6IGNlbnRlci55XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaW5wdXQuZGVsdGFYID0gcHJldkRlbHRhLnggKyAoY2VudGVyLnggLSBvZmZzZXQueCk7XG4gICAgaW5wdXQuZGVsdGFZID0gcHJldkRlbHRhLnkgKyAoY2VudGVyLnkgLSBvZmZzZXQueSk7XG59XG5cbi8qKlxuICogdmVsb2NpdHkgaXMgY2FsY3VsYXRlZCBldmVyeSB4IG1zXG4gKiBAcGFyYW0ge09iamVjdH0gc2Vzc2lvblxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVJbnRlcnZhbElucHV0RGF0YShzZXNzaW9uLCBpbnB1dCkge1xuICAgIHZhciBsYXN0ID0gc2Vzc2lvbi5sYXN0SW50ZXJ2YWwgfHwgaW5wdXQsXG4gICAgICAgIGRlbHRhVGltZSA9IGlucHV0LnRpbWVTdGFtcCAtIGxhc3QudGltZVN0YW1wLFxuICAgICAgICB2ZWxvY2l0eSwgdmVsb2NpdHlYLCB2ZWxvY2l0eVksIGRpcmVjdGlvbjtcblxuICAgIGlmIChpbnB1dC5ldmVudFR5cGUgIT0gSU5QVVRfQ0FOQ0VMICYmIChkZWx0YVRpbWUgPiBDT01QVVRFX0lOVEVSVkFMIHx8IGxhc3QudmVsb2NpdHkgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgdmFyIGRlbHRhWCA9IGlucHV0LmRlbHRhWCAtIGxhc3QuZGVsdGFYO1xuICAgICAgICB2Y
46184XIgZGVsdGFZID0gaW5wdXQuZGVsdGFZIC0gbGFzdC5kZWx0YVk7XG5cbiAgICAgICAgdmFyIHYgPSBnZXRWZWxvY2l0eShkZWx0YVRpbWUsIGRlbHRhWCwgZGVsdGFZKTtcbiAgICAgICAgdmVsb2NpdHlYID0gdi54O1xuICAgICAgICB2ZWxvY2l0eVkgPSB2Lnk7XG4gICAgICAgIHZlbG9jaXR5ID0gKGFicyh2LngpID4gYWJzKHYueSkpID8gdi54IDogdi55O1xuICAgICAgICBkaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oZGVsdGFYLCBkZWx0YVkpO1xuXG4gICAgICAgIHNlc3Npb24ubGFzdEludGVydmFsID0gaW5wdXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdXNlIGxhdGVzdCB2ZWxvY2l0eSBpbmZvIGlmIGl0IGRvZXNuJ3Qgb3ZlcnRha2UgYSBtaW5pbXVtIHBlcmlvZFxuICAgICAgICB2ZWxvY2l0eSA9IGxhc3QudmVsb2NpdHk7XG4gICAgICAgIHZlbG9jaXR5WCA9IGxhc3QudmVsb2NpdHlYO1xuICAgICAgICB2ZWxvY2l0eVkgPSBsYXN0LnZlbG9jaXR5WTtcbiAgICAgICAgZGlyZWN0aW9uID0gbGFzdC5kaXJlY3Rpb247XG4gICAgfVxuXG4gICAgaW5wdXQudmVsb2NpdHkgPSB2ZWxvY2l0eTtcbiAgICBpbnB1dC52ZWxvY2l0eVggPSB2ZWxvY2l0eVg7XG4gICAgaW5wdXQudmVsb2NpdHlZID0gdmVsb2NpdHlZO1xuICAgIGlucHV0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbn1cblxuLyoqXG4gKiBjcmVhdGUgYSBzaW1wbGUgY2xvbmUgZnJvbSB0aGUgaW5wdXQgdXNlZCBmb3Igc3RvcmFnZSBvZiBmaXJzdElucHV0IGFuZCBmaXJzdE11bHRpcGxlXG4gKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAqIEByZXR1cm5zIHtPYmplY3R9IGNsb25lZElucHV0RGF0YVxuICovXG5mdW5jdGlvbiBzaW1wbGVDbG9uZUlucHV0RGF0YShpbnB1dCkge1xuICAgIC8vIG1ha2UgYSBzaW1wbGUgY29weSBvZiB0aGUgcG9pbnRlcnMgYmVjYXVzZSB3ZSB3aWxsIGdldCBhIHJlZmVyZW5jZSBpZiB3ZSBkb24ndFxuICAgIC8vIHdlIG9ubHkgbmVlZCBjbGllbnRYWSBmb3IgdGhlIGNhbGN1bGF0aW9uc1xuICAgIHZhciBwb2ludGVycyA9IFtdO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGlucHV0LnBvaW50ZXJzLmxlbmd0aCkge1xuICAgICAgICBwb2ludGVyc1tpXSA9IHtcbiAgICAgICAgICAgIGNsaWVudFg6IHJvdW5kKGlucHV0LnBvaW50ZXJzW2ldLmNsaWVudFgpLFxuICAgICAgICAgICAgY2xpZW50WTogcm91bmQoaW5wdXQucG9pbnRlcnNbaV0uY2xpZW50WSlcbiAgICAgICAgfTtcbiAgICAgICAgaSsrO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHRpbWVTdGFtcDogbm93KCksXG4gICAgICAgIHBvaW50ZXJzOiBwb2ludGVycyxcbiAgICAgICAgY2VudGVyOiBnZXRDZW50ZXIocG9pbnRlcnMpLFxuICAgICAgICBkZWx0YVg6IGlucHV0LmRlbHRhWCxcbiAgICAgICAgZGVsdGFZOiBpbnB1dC5kZWx0YVlcbiAgICB9O1xufVxuXG4vKipcbiAqIGdldCB0aGUgY2VudGVyIG9mIGFsbCB0aGUgcG9pbnRlcnNcbiAqIEBwYXJhbSB7QXJyYXl9IHBvaW50ZXJzXG4gKiBAcmV0dXJuIHtPYmplY3R9IGNlbnRlciBjb250YWlucyBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIGdldENlbnRlcihwb2ludGVycykge1xuICAgIHZhciBwb2ludGVyc0xlbmd0aCA9IHBvaW50ZXJzLmxlbmd0aDtcblxuICAgIC8vIG5vIG5lZWQgdG8gbG9vcCB3aGVuIG9ubHkgb25lIHRvdWNoXG4gICAgaWYgKHBvaW50ZXJzTGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiByb3VuZChwb2ludGVyc1swXS5jbGllbnRYKSxcbiAgICAgICAgICAgIHk6IHJvdW5kKHBvaW50ZXJzWzBdLmNsaWVudFkpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHggPSAwLCB5ID0gMCwgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBwb2ludGVyc0xlbmd0aCkge1xuICAgICAgICB4ICs9IHBvaW50ZXJzW2ldLmNsaWVudFg7XG4gICAgICAgIHkgKz0gcG9pbnRlcnNbaV0uY2xpZW50WTtcbiAgICAgICAgaSsrO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHg6IHJvdW5kKHggLyBwb2ludGVyc0xlbmd0aCksXG4gICAgICAgIHk6IHJvdW5kKHkgLyBwb2ludGVyc0xlbmd0aClcbiAgICB9O1xufVxuXG4vKipcbiAqIGNhbGN1bGF0ZSB0aGUgdmVsb2NpdHkgYmV0d2VlbiB0d28gcG9pbnRzLiB1bml0IGlzIGluIHB4IHBlciBtcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVRpbWVcbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiBAcGFyYW0ge051bWJlcn0geVxuICogQHJldHVybiB7T2JqZWN0fSB2ZWxvY2l0eSBgeGAgYW5kIGB5YFxuICovXG5mdW5jdGlvbiBnZXRWZWxvY2l0eShkZWx0YVRpbWUsIHgsIHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiB4IC8gZGVsdGFUaW1lIHx8IDAsXG4gICAgICAgIHk6IHkgLyBkZWx0YVRpbWUgfHwgMFxuICAgIH07XG59XG5cbi8qKlxuICogZ2V0IHRoZSBkaXJlY3Rpb24gYmV0d2VlbiB0d28gcG9pbnRzXG4gKiBAcGFyYW0ge051bWJlcn0geFxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqIEByZXR1cm4ge051bWJlcn0gZGlyZWN0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldERpcmVjdGlvbih4LCB5KSB7XG4gICAgaWYgKHggPT09IHkpIHtcbiAgICAgICAgcmV0dXJuIERJUkVDVElPTl9OT05FO1xuICAgIH1cblxuICAgIGlmIChhYnMoeCkgPj0gYWJzKHkpKSB7XG4gICAgICAgIHJldHVybiB4IDwgMCA/IERJUkVDVElPTl9MRUZUIDogRElSRUNUSU9OX1JJR0hUO1xuICAgIH1cbiAgICByZXR1cm4geSA8IDAgPyBESVJFQ1RJT05fVVAgOiBESVJFQ1RJT05fRE9XTjtcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGUgdGhlIGFic29sdXRlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50c1xuICogQHBhcmFtIHtPYmplY3R9IHAxIHt4LCB5fVxuICogQHBhcmFtIHtPYmplY3R9IHAyIHt4LCB5fVxuICogQHBhcmFtIHtBcnJheX0gW3Byb3BzXSBjb250YWluaW5nIHggYW5kIHkga2V5c1xuICogQHJldHVybiB7TnVtYmVyfSBkaXN0YW5jZVxuICovXG5mdW5jdGlvbiBnZXREaXN0YW5jZShwMSwgcDIsIHByb3BzKSB7XG4gICAgaWYgKCFwcm9wcykge1xuICAgICAgICBwcm9wcyA9IFBST1BTX1hZO1xuICAgIH1cbiAgICB2YXIgeCA9IHAyW3Byb3BzWzBdXSAtIHAxW3Byb3BzWzBdXSxcbiAgICAgICAgeSA9IHAyW3Byb3BzWzFdXSAtIHAxW3Byb3BzWzFdXTtcblxuICAgI
46184HJldHVybiBNYXRoLnNxcnQoKHggKiB4KSArICh5ICogeSkpO1xufVxuXG4vKipcbiAqIGNhbGN1bGF0ZSB0aGUgYW5nbGUgYmV0d2VlbiB0d28gY29vcmRpbmF0ZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBwMVxuICogQHBhcmFtIHtPYmplY3R9IHAyXG4gKiBAcGFyYW0ge0FycmF5fSBbcHJvcHNdIGNvbnRhaW5pbmcgeCBhbmQgeSBrZXlzXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IGFuZ2xlXG4gKi9cbmZ1bmN0aW9uIGdldEFuZ2xlKHAxLCBwMiwgcHJvcHMpIHtcbiAgICBpZiAoIXByb3BzKSB7XG4gICAgICAgIHByb3BzID0gUFJPUFNfWFk7XG4gICAgfVxuICAgIHZhciB4ID0gcDJbcHJvcHNbMF1dIC0gcDFbcHJvcHNbMF1dLFxuICAgICAgICB5ID0gcDJbcHJvcHNbMV1dIC0gcDFbcHJvcHNbMV1dO1xuICAgIHJldHVybiBNYXRoLmF0YW4yKHksIHgpICogMTgwIC8gTWF0aC5QSTtcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGUgdGhlIHJvdGF0aW9uIGRlZ3JlZXMgYmV0d2VlbiB0d28gcG9pbnRlcnNldHNcbiAqIEBwYXJhbSB7QXJyYXl9IHN0YXJ0IGFycmF5IG9mIHBvaW50ZXJzXG4gKiBAcGFyYW0ge0FycmF5fSBlbmQgYXJyYXkgb2YgcG9pbnRlcnNcbiAqIEByZXR1cm4ge051bWJlcn0gcm90YXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0Um90YXRpb24oc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiBnZXRBbmdsZShlbmRbMV0sIGVuZFswXSwgUFJPUFNfQ0xJRU5UX1hZKSArIGdldEFuZ2xlKHN0YXJ0WzFdLCBzdGFydFswXSwgUFJPUFNfQ0xJRU5UX1hZKTtcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGUgdGhlIHNjYWxlIGZhY3RvciBiZXR3ZWVuIHR3byBwb2ludGVyc2V0c1xuICogbm8gc2NhbGUgaXMgMSwgYW5kIGdvZXMgZG93biB0byAwIHdoZW4gcGluY2hlZCB0b2dldGhlciwgYW5kIGJpZ2dlciB3aGVuIHBpbmNoZWQgb3V0XG4gKiBAcGFyYW0ge0FycmF5fSBzdGFydCBhcnJheSBvZiBwb2ludGVyc1xuICogQHBhcmFtIHtBcnJheX0gZW5kIGFycmF5IG9mIHBvaW50ZXJzXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHNjYWxlXG4gKi9cbmZ1bmN0aW9uIGdldFNjYWxlKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gZ2V0RGlzdGFuY2UoZW5kWzBdLCBlbmRbMV0sIFBST1BTX0NMSUVOVF9YWSkgLyBnZXREaXN0YW5jZShzdGFydFswXSwgc3RhcnRbMV0sIFBST1BTX0NMSUVOVF9YWSk7XG59XG5cbnZhciBNT1VTRV9JTlBVVF9NQVAgPSB7XG4gICAgbW91c2Vkb3duOiBJTlBVVF9TVEFSVCxcbiAgICBtb3VzZW1vdmU6IElOUFVUX01PVkUsXG4gICAgbW91c2V1cDogSU5QVVRfRU5EXG59O1xuXG52YXIgTU9VU0VfRUxFTUVOVF9FVkVOVFMgPSAnbW91c2Vkb3duJztcbnZhciBNT1VTRV9XSU5ET1dfRVZFTlRTID0gJ21vdXNlbW92ZSBtb3VzZXVwJztcblxuLyoqXG4gKiBNb3VzZSBldmVudHMgaW5wdXRcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgSW5wdXRcbiAqL1xuZnVuY3Rpb24gTW91c2VJbnB1dCgpIHtcbiAgICB0aGlzLmV2RWwgPSBNT1VTRV9FTEVNRU5UX0VWRU5UUztcbiAgICB0aGlzLmV2V2luID0gTU9VU0VfV0lORE9XX0VWRU5UUztcblxuICAgIHRoaXMucHJlc3NlZCA9IGZhbHNlOyAvLyBtb3VzZWRvd24gc3RhdGVcblxuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoTW91c2VJbnB1dCwgSW5wdXQsIHtcbiAgICAvKipcbiAgICAgKiBoYW5kbGUgbW91c2UgZXZlbnRzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAgICovXG4gICAgaGFuZGxlcjogZnVuY3Rpb24gTUVoYW5kbGVyKGV2KSB7XG4gICAgICAgIHZhciBldmVudFR5cGUgPSBNT1VTRV9JTlBVVF9NQVBbZXYudHlwZV07XG5cbiAgICAgICAgLy8gb24gc3RhcnQgd2Ugd2FudCB0byBoYXZlIHRoZSBsZWZ0IG1vdXNlIGJ1dHRvbiBkb3duXG4gICAgICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9TVEFSVCAmJiBldi5idXR0b24gPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMucHJlc3NlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfTU9WRSAmJiBldi53aGljaCAhPT0gMSkge1xuICAgICAgICAgICAgZXZlbnRUeXBlID0gSU5QVVRfRU5EO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbW91c2UgbXVzdCBiZSBkb3duXG4gICAgICAgIGlmICghdGhpcy5wcmVzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfRU5EKSB7XG4gICAgICAgICAgICB0aGlzLnByZXNzZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCBldmVudFR5cGUsIHtcbiAgICAgICAgICAgIHBvaW50ZXJzOiBbZXZdLFxuICAgICAgICAgICAgY2hhbmdlZFBvaW50ZXJzOiBbZXZdLFxuICAgICAgICAgICAgcG9pbnRlclR5cGU6IElOUFVUX1RZUEVfTU9VU0UsXG4gICAgICAgICAgICBzcmNFdmVudDogZXZcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5cbnZhciBQT0lOVEVSX0lOUFVUX01BUCA9IHtcbiAgICBwb2ludGVyZG93bjogSU5QVVRfU1RBUlQsXG4gICAgcG9pbnRlcm1vdmU6IElOUFVUX01PVkUsXG4gICAgcG9pbnRlcnVwOiBJTlBVVF9FTkQsXG4gICAgcG9pbnRlcmNhbmNlbDogSU5QVVRfQ0FOQ0VMLFxuICAgIHBvaW50ZXJvdXQ6IElOUFVUX0NBTkNFTFxufTtcblxuLy8gaW4gSUUxMCB0aGUgcG9pbnRlciB0eXBlcyBpcyBkZWZpbmVkIGFzIGFuIGVudW1cbnZhciBJRTEwX1BPSU5URVJfVFlQRV9FTlVNID0ge1xuICAgIDI6IElOUFVUX1RZUEVfVE9VQ0gsXG4gICAgMzogSU5QVVRfVFlQRV9QRU4sXG4gICAgNDogSU5QVVRfVFlQRV9NT1VTRSxcbiAgICA1OiBJTlBVVF9UWVBFX0tJTkVDVCAvLyBzZWUgaHR0cHM6Ly90d2l0dGVyLmNvbS9qYWNvYnJvc3NpL3N0YXR1cy80ODA1OTY0Mzg0ODk4OTA4MTZcbn07XG5cbnZhciBQT0lOVEVSX0VMRU1FTlRfRVZFTlRTID0gJ3BvaW50ZXJkb3duJztcbnZhciBQT0lOVEVSX1dJTkRPV19FVkVOVFMgPSAncG9pbnRlcm1vdmUgcG9pbnRlcnVwIHBvaW50ZXJjYW5jZWwnO1xuXG4vLyBJRTEwIGhhcyBwcmVmaXhlZCBzdXBwb3J0LCBhbmQgY2FzZS1zZW5zaXRpdmVcbmlmICh3aW5kb3cuTVNQb2ludGVyRXZlbnQgJiYgIXdpbmRvdy5Qb2ludGVyRXZlbnQpIHtcbiAgICBQT0lOVEVSX0VMRU1FTlRfRVZFTlRTID0gJ01TUG9pbnRlckRvd24nO1xuICAgIFBPSU5URVJfV0lORE9XX0VWRU5UUyA9ICdNU1BvaW50ZXJNb3ZlIE1TUG9pbnRlclVwIE1TUG9pbnRlckNhbmNlbCc7XG59XG5cbi8qKlxuICogUG9pbnRlciBldmVudHMgaW5wdXRcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgSW5wdXRcbiAqL1xuZnVuY3Rpb24gUG9pbnRlckV2ZW50SW5wdXQoKSB7XG4gICAgdGhpcy5ldkVsID0gUE9JTlRFUl9FTEVNRU5UX0VWRU5UUztcbiAgICB0aGlzLmV2V2luID0gUE9JTlRFUl9XSU5ET1dfRVZFTlRTO1xuXG4gICAgSW5wdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgI
46184HRoaXMuc3RvcmUgPSAodGhpcy5tYW5hZ2VyLnNlc3Npb24ucG9pbnRlckV2ZW50cyA9IFtdKTtcbn1cblxuaW5oZXJpdChQb2ludGVyRXZlbnRJbnB1dCwgSW5wdXQsIHtcbiAgICAvKipcbiAgICAgKiBoYW5kbGUgbW91c2UgZXZlbnRzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAgICovXG4gICAgaGFuZGxlcjogZnVuY3Rpb24gUEVoYW5kbGVyKGV2KSB7XG4gICAgICAgIHZhciBzdG9yZSA9IHRoaXMuc3RvcmU7XG4gICAgICAgIHZhciByZW1vdmVQb2ludGVyID0gZmFsc2U7XG5cbiAgICAgICAgdmFyIGV2ZW50VHlwZU5vcm1hbGl6ZWQgPSBldi50eXBlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnbXMnLCAnJyk7XG4gICAgICAgIHZhciBldmVudFR5cGUgPSBQT0lOVEVSX0lOUFVUX01BUFtldmVudFR5cGVOb3JtYWxpemVkXTtcbiAgICAgICAgdmFyIHBvaW50ZXJUeXBlID0gSUUxMF9QT0lOVEVSX1RZUEVfRU5VTVtldi5wb2ludGVyVHlwZV0gfHwgZXYucG9pbnRlclR5cGU7XG5cbiAgICAgICAgdmFyIGlzVG91Y2ggPSAocG9pbnRlclR5cGUgPT0gSU5QVVRfVFlQRV9UT1VDSCk7XG5cbiAgICAgICAgLy8gZ2V0IGluZGV4IG9mIHRoZSBldmVudCBpbiB0aGUgc3RvcmVcbiAgICAgICAgdmFyIHN0b3JlSW5kZXggPSBpbkFycmF5KHN0b3JlLCBldi5wb2ludGVySWQsICdwb2ludGVySWQnKTtcblxuICAgICAgICAvLyBzdGFydCBhbmQgbW91c2UgbXVzdCBiZSBkb3duXG4gICAgICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9TVEFSVCAmJiAoZXYuYnV0dG9uID09PSAwIHx8IGlzVG91Y2gpKSB7XG4gICAgICAgICAgICBpZiAoc3RvcmVJbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgICBzdG9yZS5wdXNoKGV2KTtcbiAgICAgICAgICAgICAgICBzdG9yZUluZGV4ID0gc3RvcmUubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSkge1xuICAgICAgICAgICAgcmVtb3ZlUG9pbnRlciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpdCBub3QgZm91bmQsIHNvIHRoZSBwb2ludGVyIGhhc24ndCBiZWVuIGRvd24gKHNvIGl0J3MgcHJvYmFibHkgYSBob3ZlcilcbiAgICAgICAgaWYgKHN0b3JlSW5kZXggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1cGRhdGUgdGhlIGV2ZW50IGluIHRoZSBzdG9yZVxuICAgICAgICBzdG9yZVtzdG9yZUluZGV4XSA9IGV2O1xuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCBldmVudFR5cGUsIHtcbiAgICAgICAgICAgIHBvaW50ZXJzOiBzdG9yZSxcbiAgICAgICAgICAgIGNoYW5nZWRQb2ludGVyczogW2V2XSxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiBwb2ludGVyVHlwZSxcbiAgICAgICAgICAgIHNyY0V2ZW50OiBldlxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVtb3ZlUG9pbnRlcikge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gdGhlIHN0b3JlXG4gICAgICAgICAgICBzdG9yZS5zcGxpY2Uoc3RvcmVJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxudmFyIFNJTkdMRV9UT1VDSF9JTlBVVF9NQVAgPSB7XG4gICAgdG91Y2hzdGFydDogSU5QVVRfU1RBUlQsXG4gICAgdG91Y2htb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIHRvdWNoZW5kOiBJTlBVVF9FTkQsXG4gICAgdG91Y2hjYW5jZWw6IElOUFVUX0NBTkNFTFxufTtcblxudmFyIFNJTkdMRV9UT1VDSF9UQVJHRVRfRVZFTlRTID0gJ3RvdWNoc3RhcnQnO1xudmFyIFNJTkdMRV9UT1VDSF9XSU5ET1dfRVZFTlRTID0gJ3RvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kIHRvdWNoY2FuY2VsJztcblxuLyoqXG4gKiBUb3VjaCBldmVudHMgaW5wdXRcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgSW5wdXRcbiAqL1xuZnVuY3Rpb24gU2luZ2xlVG91Y2hJbnB1dCgpIHtcbiAgICB0aGlzLmV2VGFyZ2V0ID0gU0lOR0xFX1RPVUNIX1RBUkdFVF9FVkVOVFM7XG4gICAgdGhpcy5ldldpbiA9IFNJTkdMRV9UT1VDSF9XSU5ET1dfRVZFTlRTO1xuICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgSW5wdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuaW5oZXJpdChTaW5nbGVUb3VjaElucHV0LCBJbnB1dCwge1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIFRFaGFuZGxlcihldikge1xuICAgICAgICB2Y
46184XIgdHlwZSA9IFNJTkdMRV9UT1VDSF9JTlBVVF9NQVBbZXYudHlwZV07XG5cbiAgICAgICAgLy8gc2hvdWxkIHdlIGhhbmRsZSB0aGUgdG91Y2ggZXZlbnRzP1xuICAgICAgICBpZiAodHlwZSA9PT0gSU5QVVRfU1RBUlQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc3RhcnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRvdWNoZXMgPSBub3JtYWxpemVTaW5nbGVUb3VjaGVzLmNhbGwodGhpcywgZXYsIHR5cGUpO1xuXG4gICAgICAgIC8vIHdoZW4gZG9uZSwgcmVzZXQgdGhlIHN0YXJ0ZWQgc3RhdGVcbiAgICAgICAgaWYgKHR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSAmJiB0b3VjaGVzWzBdLmxlbmd0aCAtIHRvdWNoZXNbMV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCB0eXBlLCB7XG4gICAgICAgICAgICBwb2ludGVyczogdG91Y2hlc1swXSxcbiAgICAgICAgICAgIGNoYW5nZWRQb2ludGVyczogdG91Y2hlc1sxXSxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgICAgICAgICAgc3JjRXZlbnQ6IGV2XG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIEB0aGlzIHtUb3VjaElucHV0fVxuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKiBAcGFyYW0ge051bWJlcn0gdHlwZSBmbGFnXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfEFycmF5fSBbYWxsLCBjaGFuZ2VkXVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTaW5nbGVUb3VjaGVzKGV2LCB0eXBlKSB7XG4gICAgdmFyIGFsbCA9IHRvQXJyYXkoZXYudG91Y2hlcyk7XG4gICAgdmFyIGNoYW5nZWQgPSB0b0FycmF5KGV2LmNoYW5nZWRUb3VjaGVzKTtcblxuICAgIGlmICh0eXBlICYgKElOUFVUX0VORCB8IElOUFVUX0NBTkNFTCkpIHtcbiAgICAgICAgYWxsID0gdW5pcXVlQXJyYXkoYWxsLmNvbmNhdChjaGFuZ2VkKSwgJ2lkZW50aWZpZXInLCB0cnVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW2FsbCwgY2hhbmdlZF07XG59XG5cbnZhciBUT1VDSF9JTlBVVF9NQVAgPSB7XG4gICAgdG91Y2hzdGFydDogSU5QVVRfU1RBUlQsXG4gICAgdG91Y2htb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIHRvdWNoZW5kOiBJTlBVVF9FTkQsXG4gICAgdG91Y2hjYW5jZWw6IElOUFVUX0NBTkNFTFxufTtcblxudmFyIFRPVUNIX1RBUkdFVF9FVkVOVFMgPSAndG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgdG91Y2hjYW5jZWwnO1xuXG4vKipcbiAqIE11bHRpLXVzZXIgdG91Y2ggZXZlbnRzIGlucHV0XG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cbmZ1bmN0aW9uIFRvdWNoSW5wdXQoKSB7XG4gICAgdGhpcy5ldlRhcmdldCA9IFRPVUNIX1RBUkdFVF9FVkVOVFM7XG4gICAgdGhpcy50YXJnZXRJZHMgPSB7fTtcblxuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoVG91Y2hJbnB1dCwgSW5wdXQsIHtcbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBNVEVoYW5kbGVyKGV2KSB7XG4gICAgICAgIHZhciB0eXBlID0gVE9VQ0hfSU5QVVRfTUFQW2V2LnR5cGVdO1xuICAgICAgICB2Y
46184XIgdG91Y2hlcyA9IGdldFRvdWNoZXMuY2FsbCh0aGlzLCBldiwgdHlwZSk7XG4gICAgICAgIGlmICghdG91Y2hlcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsIHR5cGUsIHtcbiAgICAgICAgICAgIHBvaW50ZXJzOiB0b3VjaGVzWzBdLFxuICAgICAgICAgICAgY2hhbmdlZFBvaW50ZXJzOiB0b3VjaGVzWzFdLFxuICAgICAgICAgICAgcG9pbnRlclR5cGU6IElOUFVUX1RZUEVfVE9VQ0gsXG4gICAgICAgICAgICBzcmNFdmVudDogZXZcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5cbi8qKlxuICogQHRoaXMge1RvdWNoSW5wdXR9XG4gKiBAcGFyYW0ge09iamVjdH0gZXZcbiAqIEBwYXJhbSB7TnVtYmVyfSB0eXBlIGZsYWdcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR8QXJyYXl9IFthbGwsIGNoYW5nZWRdXG4gKi9cbmZ1bmN0aW9uIGdldFRvdWNoZXMoZXYsIHR5cGUpIHtcbiAgICB2YXIgYWxsVG91Y2hlcyA9IHRvQXJyYXkoZXYudG91Y2hlcyk7XG4gICAgdmFyIHRhcmdldElkcyA9IHRoaXMudGFyZ2V0SWRzO1xuXG4gICAgLy8gd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSB0b3VjaCwgdGhlIHByb2Nlc3MgY2FuIGJlIHNpbXBsaWZpZWRcbiAgICBpZiAodHlwZSAmIChJTlBVVF9TVEFSVCB8IElOUFVUX01PVkUpICYmIGFsbFRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHRhcmdldElkc1thbGxUb3VjaGVzWzBdLmlkZW50aWZpZXJdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIFthbGxUb3VjaGVzLCBhbGxUb3VjaGVzXTtcbiAgICB9XG5cbiAgICB2YXIgaSxcbiAgICAgICAgdGFyZ2V0VG91Y2hlcyxcbiAgICAgICAgY2hhbmdlZFRvdWNoZXMgPSB0b0FycmF5KGV2LmNoYW5nZWRUb3VjaGVzKSxcbiAgICAgICAgY2hhbmdlZFRhcmdldFRvdWNoZXMgPSBbXSxcbiAgICAgICAgdGFyZ2V0ID0gdGhpcy50YXJnZXQ7XG5cbiAgICAvLyBnZXQgdGFyZ2V0IHRvdWNoZXMgZnJvbSB0b3VjaGVzXG4gICAgdGFyZ2V0VG91Y2hlcyA9IGFsbFRvdWNoZXMuZmlsdGVyKGZ1bmN0aW9uKHRvdWNoKSB7XG4gICAgICAgIHJldHVybiBoYXNQYXJlbnQodG91Y2gudGFyZ2V0LCB0YXJnZXQpO1xuICAgIH0pO1xuXG4gICAgLy8gY29sbGVjdCB0b3VjaGVzXG4gICAgaWYgKHR5cGUgPT09IElOUFVUX1NUQVJUKSB7XG4gICAgICAgIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IHRhcmdldFRvdWNoZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0YXJnZXRJZHNbdGFyZ2V0VG91Y2hlc1tpXS5pZGVudGlmaWVyXSA9IHRydWU7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmaWx0ZXIgY2hhbmdlZCB0b3VjaGVzIHRvIG9ubHkgY29udGFpbiB0b3VjaGVzIHRoYXQgZXhpc3QgaW4gdGhlIGNvbGxlY3RlZCB0YXJnZXQgaWRzXG4gICAgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBjaGFuZ2VkVG91Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHRhcmdldElkc1tjaGFuZ2VkVG91Y2hlc1tpXS5pZGVudGlmaWVyXSkge1xuICAgICAgICAgICAgY2hhbmdlZFRhcmdldFRvdWNoZXMucHVzaChjaGFuZ2VkVG91Y2hlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbGVhbnVwIHJlbW92ZWQgdG91Y2hlc1xuICAgICAgICBpZiAodHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICAgICAgICBkZWxldGUgdGFyZ2V0SWRzW2NoYW5nZWRUb3VjaGVzW2ldLmlkZW50aWZpZXJdO1xuICAgICAgICB9XG4gICAgICAgIGkrKztcbiAgICB9XG5cbiAgICBpZiAoIWNoYW5nZWRUYXJnZXRUb3VjaGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIFtcbiAgICAgICAgLy8gbWVyZ2UgdGFyZ2V0VG91Y2hlcyB3aXRoIGNoYW5nZWRUYXJnZXRUb3VjaGVzIHNvIGl0IGNvbnRhaW5zIEFMTCB0b3VjaGVzLCBpbmNsdWRpbmcgJ2VuZCcgYW5kICdjYW5jZWwnXG4gICAgICAgIHVuaXF1ZUFycmF5KHRhcmdldFRvdWNoZXMuY29uY2F0KGNoYW5nZWRUYXJnZXRUb3VjaGVzKSwgJ2lkZW50aWZpZXInLCB0cnVlKSxcbiAgICAgICAgY2hhbmdlZFRhcmdldFRvdWNoZXNcbiAgICBdO1xufVxuXG4vKipcbiAqIENvbWJpbmVkIHRvdWNoIGFuZCBtb3VzZSBpbnB1dFxuICpcbiAqIFRvdWNoIGhhcyBhIGhpZ2hlciBwcmlvcml0eSB0aGVuIG1vdXNlLCBhbmQgd2hpbGUgdG91Y2hpbmcgbm8gbW91c2UgZXZlbnRzIGFyZSBhbGxvd2VkLlxuICogVGhpcyBiZWNhdXNlIHRvdWNoIGRldmljZXMgYWxzbyBlbWl0IG1vdXNlIGV2ZW50cyB3aGlsZSBkb2luZyBhIHRvdWNoLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgSW5wdXRcbiAqL1xuXG52YXIgREVEVVBfVElNRU9VVCA9IDI1MDA7XG52YXIgREVEVVBfRElTVEFOQ0UgPSAyNTtcblxuZnVuY3Rpb24gVG91Y2hNb3VzZUlucHV0KCkge1xuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB2YXIgaGFuZGxlciA9IGJpbmRGbih0aGlzLmhhbmRsZXIsIHRoaXMpO1xuICAgIHRoaXMudG91Y2ggPSBuZXcgVG91Y2hJbnB1dCh0aGlzLm1hbmFnZXIsIGhhbmRsZXIpO1xuICAgIHRoaXMubW91c2UgPSBuZXcgTW91c2VJbnB1dCh0aGlzLm1hbmFnZXIsIGhhbmRsZXIpO1xuXG4gICAgdGhpcy5wcmltYXJ5VG91Y2ggPSBudWxsO1xuICAgIHRoaXMubGFzdFRvdWNoZXMgPSBbXTtcbn1cblxuaW5oZXJpdChUb3VjaE1vdXNlSW5wdXQsIElucHV0LCB7XG4gICAgLyoqXG4gICAgICogaGFuZGxlIG1vdXNlIGFuZCB0b3VjaCBldmVudHNcbiAgICAgKiBAcGFyYW0ge0hhbW1lcn0gbWFuYWdlclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dEV2ZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgICAqL1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIFRNRWhhbmRsZXIobWFuYWdlciwgaW5wdXRFdmVudCwgaW5wdXREYXRhKSB7XG4gICAgICAgIHZhciBpc1RvdWNoID0gKGlucHV0RGF0YS5wb2ludGVyVHlwZSA9PSBJTlBVVF9UWVBFX1RPVUNIKSxcbiAgICAgICAgICAgIGlzTW91c2UgPSAoaW5wdXREYXRhLnBvaW50ZXJUeXBlID09IElOUFVUX1RZUEVfTU9VU0UpO1xuXG4gICAgICAgIGlmIChpc01vdXNlICYmIGlucHV0RGF0YS5zb3VyY2VDYXBhYmlsaXRpZXMgJiYgaW5wdXREYXRhLnNvdXJjZUNhcGFiaWxpdGllcy5maXJlc1RvdWNoRXZlbnRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgI
46184H1cblxuICAgICAgICAvLyB3aGVuIHdlJ3JlIGluIGEgdG91Y2ggZXZlbnQsIHJlY29yZCB0b3VjaGVzIHRvICBkZS1kdXBlIHN5bnRoZXRpYyBtb3VzZSBldmVudFxuICAgICAgICBpZiAoaXNUb3VjaCkge1xuICAgICAgICAgICAgcmVjb3JkVG91Y2hlcy5jYWxsKHRoaXMsIGlucHV0RXZlbnQsIGlucHV0RGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNNb3VzZSAmJiBpc1N5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgaW5wdXREYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxsYmFjayhtYW5hZ2VyLCBpbnB1dEV2ZW50LCBpbnB1dERhdGEpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZW1vdmUgdGhlIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqL1xuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudG91Y2guZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm1vdXNlLmRlc3Ryb3koKTtcbiAgICB9XG59KTtcblxuZnVuY3Rpb24gcmVjb3JkVG91Y2hlcyhldmVudFR5cGUsIGV2ZW50RGF0YSkge1xuICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9TVEFSVCkge1xuICAgICAgICB0aGlzLnByaW1hcnlUb3VjaCA9IGV2ZW50RGF0YS5jaGFuZ2VkUG9pbnRlcnNbMF0uaWRlbnRpZmllcjtcbiAgICAgICAgc2V0TGFzdFRvdWNoLmNhbGwodGhpcywgZXZlbnREYXRhKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICAgIHNldExhc3RUb3VjaC5jYWxsKHRoaXMsIGV2ZW50RGF0YSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzZXRMYXN0VG91Y2goZXZlbnREYXRhKSB7XG4gICAgdmFyIHRvdWNoID0gZXZlbnREYXRhLmNoYW5nZWRQb2ludGVyc1swXTtcblxuICAgIGlmICh0b3VjaC5pZGVudGlmaWVyID09PSB0aGlzLnByaW1hcnlUb3VjaCkge1xuICAgICAgICB2Y
46184XIgbGFzdFRvdWNoID0ge3g6IHRvdWNoLmNsaWVudFgsIHk6IHRvdWNoLmNsaWVudFl9O1xuICAgICAgICB0aGlzLmxhc3RUb3VjaGVzLnB1c2gobGFzdFRvdWNoKTtcbiAgICAgICAgdmFyIGx0cyA9IHRoaXMubGFzdFRvdWNoZXM7XG4gICAgICAgIHZhciByZW1vdmVMYXN0VG91Y2ggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBpID0gbHRzLmluZGV4T2YobGFzdFRvdWNoKTtcbiAgICAgICAgICAgIGlmIChpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBsdHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzZXRUaW1lb3V0KHJlbW92ZUxhc3RUb3VjaCwgREVEVVBfVElNRU9VVCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc1N5bnRoZXRpY0V2ZW50KGV2ZW50RGF0YSkge1xuICAgIHZhciB4ID0gZXZlbnREYXRhLnNyY0V2ZW50LmNsaWVudFgsIHkgPSBldmVudERhdGEuc3JjRXZlbnQuY2xpZW50WTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGFzdFRvdWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHQgPSB0aGlzLmxhc3RUb3VjaGVzW2ldO1xuICAgICAgICB2YXIgZHggPSBNYXRoLmFicyh4IC0gdC54KSwgZHkgPSBNYXRoLmFicyh5IC0gdC55KTtcbiAgICAgICAgaWYgKGR4IDw9IERFRFVQX0RJU1RBTkNFICYmIGR5IDw9IERFRFVQX0RJU1RBTkNFKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbnZhciBQUkVGSVhFRF9UT1VDSF9BQ1RJT04gPSBwcmVmaXhlZChURVNUX0VMRU1FTlQuc3R5bGUsICd0b3VjaEFjdGlvbicpO1xudmFyIE5BVElWRV9UT1VDSF9BQ1RJT04gPSBQUkVGSVhFRF9UT1VDSF9BQ1RJT04gIT09IHVuZGVmaW5lZDtcblxuLy8gbWFnaWNhbCB0b3VjaEFjdGlvbiB2YWx1ZVxudmFyIFRPVUNIX0FDVElPTl9DT01QVVRFID0gJ2NvbXB1dGUnO1xudmFyIFRPVUNIX0FDVElPTl9BVVRPID0gJ2F1dG8nO1xudmFyIFRPVUNIX0FDVElPTl9NQU5JUFVMQVRJT04gPSAnbWFuaXB1bGF0aW9uJzsgLy8gbm90IGltcGxlbWVudGVkXG52YXIgVE9VQ0hfQUNUSU9OX05PTkUgPSAnbm9uZSc7XG52YXIgVE9VQ0hfQUNUSU9OX1BBTl9YID0gJ3Bhbi14JztcbnZhciBUT1VDSF9BQ1RJT05fUEFOX1kgPSAncGFuLXknO1xudmFyIFRPVUNIX0FDVElPTl9NQVAgPSBnZXRUb3VjaEFjdGlvblByb3BzKCk7XG5cbi8qKlxuICogVG91Y2ggQWN0aW9uXG4gKiBzZXRzIHRoZSB0b3VjaEFjdGlvbiBwcm9wZXJ0eSBvciB1c2VzIHRoZSBqcyBhbHRlcm5hdGl2ZVxuICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBUb3VjaEFjdGlvbihtYW5hZ2VyLCB2YWx1ZSkge1xuICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XG4gICAgdGhpcy5zZXQodmFsdWUpO1xufVxuXG5Ub3VjaEFjdGlvbi5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogc2V0IHRoZSB0b3VjaEFjdGlvbiB2YWx1ZSBvbiB0aGUgZWxlbWVudCBvciBlbmFibGUgdGhlIHBvbHlmaWxsXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gICAgICovXG4gICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAvLyBmaW5kIG91dCB0aGUgdG91Y2gtYWN0aW9uIGJ5IHRoZSBldmVudCBoYW5kbGVyc1xuICAgICAgICBpZiAodmFsdWUgPT0gVE9VQ0hfQUNUSU9OX0NPTVBVVEUpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jb21wdXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoTkFUSVZFX1RPVUNIX0FDVElPTiAmJiB0aGlzLm1hbmFnZXIuZWxlbWVudC5zdHlsZSAmJiBUT1VDSF9BQ1RJT05fTUFQW3ZhbHVlXSkge1xuICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLmVsZW1lbnQuc3R5bGVbUFJFRklYRURfVE9VQ0hfQUNUSU9OXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0aW9ucyA9IHZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBqdXN0IHJlLXNldCB0aGUgdG91Y2hBY3Rpb24gdmFsdWVcbiAgICAgKi9cbiAgICB1cGRhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnNldCh0aGlzLm1hbmFnZXIub3B0aW9ucy50b3VjaEFjdGlvbik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGNvbXB1dGUgdGhlIHZhbHVlIGZvciB0aGUgdG91Y2hBY3Rpb24gcHJvcGVydHkgYmFzZWQgb24gdGhlIHJlY29nbml6ZXIncyBzZXR0aW5nc1xuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHZhbHVlXG4gICAgICovXG4gICAgY29tcHV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhY3Rpb25zID0gW107XG4gICAgICAgIGVhY2godGhpcy5tYW5hZ2VyLnJlY29nbml6ZXJzLCBmdW5jdGlvbihyZWNvZ25pemVyKSB7XG4gICAgICAgICAgICBpZiAoYm9vbE9yRm4ocmVjb2duaXplci5vcHRpb25zLmVuYWJsZSwgW3JlY29nbml6ZXJdKSkge1xuICAgICAgICAgICAgICAgIGFjdGlvbnMgPSBhY3Rpb25zLmNvbmNhdChyZWNvZ25pemVyLmdldFRvdWNoQWN0aW9uKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNsZWFuVG91Y2hBY3Rpb25zKGFjdGlvbnMuam9pbignICcpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGVhY2ggaW5wdXQgY3ljbGUgYW5kIHByb3ZpZGVzIHRoZSBwcmV2ZW50aW5nIG9mIHRoZSBicm93c2VyIGJlaGF2aW9yXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICovXG4gICAgcHJldmVudERlZmF1bHRzOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2Y
46184XIgc3JjRXZlbnQgPSBpbnB1dC5zcmNFdmVudDtcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IGlucHV0Lm9mZnNldERpcmVjdGlvbjtcblxuICAgICAgICAvLyBpZiB0aGUgdG91Y2ggYWN0aW9uIGRpZCBwcmV2ZW50ZWQgb25jZSB0aGlzIHNlc3Npb25cbiAgICAgICAgaWYgKHRoaXMubWFuYWdlci5zZXNzaW9uLnByZXZlbnRlZCkge1xuICAgICAgICAgICAgc3JjRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhY3Rpb25zID0gdGhpcy5hY3Rpb25zO1xuICAgICAgICB2YXIgaGFzTm9uZSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9OT05FKSAmJiAhVE9VQ0hfQUNUSU9OX01BUFtUT1VDSF9BQ1RJT05fTk9ORV07XG4gICAgICAgIHZhciBoYXNQYW5ZID0gaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX1BBTl9ZKSAmJiAhVE9VQ0hfQUNUSU9OX01BUFtUT1VDSF9BQ1RJT05fUEFOX1ldO1xuICAgICAgICB2YXIgaGFzUGFuWCA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9QQU5fWCkgJiYgIVRPVUNIX0FDVElPTl9NQVBbVE9VQ0hfQUNUSU9OX1BBTl9YXTtcblxuICAgICAgICBpZiAoaGFzTm9uZSkge1xuICAgICAgICAgICAgLy9kbyBub3QgcHJldmVudCBkZWZhdWx0cyBpZiB0aGlzIGlzIGEgdGFwIGdlc3R1cmVcblxuICAgICAgICAgICAgdmFyIGlzVGFwUG9pbnRlciA9IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA9PT0gMTtcbiAgICAgICAgICAgIHZhciBpc1RhcE1vdmVtZW50ID0gaW5wdXQuZGlzdGFuY2UgPCAyO1xuICAgICAgICAgICAgdmFyIGlzVGFwVG91Y2hUaW1lID0gaW5wdXQuZGVsdGFUaW1lIDwgMjUwO1xuXG4gICAgICAgICAgICBpZiAoaXNUYXBQb2ludGVyICYmIGlzVGFwTW92ZW1lbnQgJiYgaXNUYXBUb3VjaFRpbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzUGFuWCAmJiBoYXNQYW5ZKSB7XG4gICAgICAgICAgICAvLyBgcGFuLXggcGFuLXlgIG1lYW5zIGJyb3dzZXIgaGFuZGxlcyBhbGwgc2Nyb2xsaW5nL3Bhbm5pbmcsIGRvIG5vdCBwcmV2ZW50XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzTm9uZSB8fFxuICAgICAgICAgICAgKGhhc1BhblkgJiYgZGlyZWN0aW9uICYgRElSRUNUSU9OX0hPUklaT05UQUwpIHx8XG4gICAgICAgICAgICAoaGFzUGFuWCAmJiBkaXJlY3Rpb24gJiBESVJFQ1RJT05fVkVSVElDQUwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmV2ZW50U3JjKHNyY0V2ZW50KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBjYWxsIHByZXZlbnREZWZhdWx0IHRvIHByZXZlbnQgdGhlIGJyb3dzZXIncyBkZWZhdWx0IGJlaGF2aW9yIChzY3JvbGxpbmcgaW4gbW9zdCBjYXNlcylcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3JjRXZlbnRcbiAgICAgKi9cbiAgICBwcmV2ZW50U3JjOiBmdW5jdGlvbihzcmNFdmVudCkge1xuICAgICAgICB0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICBzcmNFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn07XG5cbi8qKlxuICogd2hlbiB0aGUgdG91Y2hBY3Rpb25zIGFyZSBjb2xsZWN0ZWQgdGhleSBhcmUgbm90IGEgdmFsaWQgdmFsdWUsIHNvIHdlIG5lZWQgdG8gY2xlYW4gdGhpbmdzIHVwLiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uc1xuICogQHJldHVybnMgeyp9XG4gKi9cbmZ1bmN0aW9uIGNsZWFuVG91Y2hBY3Rpb25zKGFjdGlvbnMpIHtcbiAgICAvLyBub25lXG4gICAgaWYgKGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9OT05FKSkge1xuICAgICAgICByZXR1cm4gVE9VQ0hfQUNUSU9OX05PTkU7XG4gICAgfVxuXG4gICAgdmFyIGhhc1BhblggPSBpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fUEFOX1gpO1xuICAgIHZhciBoYXNQYW5ZID0gaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX1BBTl9ZKTtcblxuICAgIC8vIGlmIGJvdGggcGFuLXggYW5kIHBhbi15IGFyZSBzZXQgKGRpZmZlcmVudCByZWNvZ25pemVyc1xuICAgIC8vIGZvciBkaWZmZXJlbnQgZGlyZWN0aW9ucywgZS5nLiBob3Jpem9udGFsIHBhbiBidXQgdmVydGljYWwgc3dpcGU/KVxuICAgIC8vIHdlIG5lZWQgbm9uZSAoYXMgb3RoZXJ3aXNlIHdpdGggcGFuLXggcGFuLXkgY29tYmluZWQgbm9uZSBvZiB0aGVzZVxuICAgIC8vIHJlY29nbml6ZXJzIHdpbGwgd29yaywgc2luY2UgdGhlIGJyb3dzZXIgd291bGQgaGFuZGxlIGFsbCBwYW5uaW5nXG4gICAgaWYgKGhhc1BhblggJiYgaGFzUGFuWSkge1xuICAgICAgICByZXR1cm4gVE9VQ0hfQUNUSU9OX05PTkU7XG4gICAgfVxuXG4gICAgLy8gcGFuLXggT1IgcGFuLXlcbiAgICBpZiAoaGFzUGFuWCB8fCBoYXNQYW5ZKSB7XG4gICAgICAgIHJldHVybiBoYXNQYW5YID8gVE9VQ0hfQUNUSU9OX1BBTl9YIDogVE9VQ0hfQUNUSU9OX1BBTl9ZO1xuICAgIH1cblxuICAgIC8vIG1hbmlwdWxhdGlvblxuICAgIGlmIChpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fTUFOSVBVTEFUSU9OKSkge1xuICAgICAgICByZXR1cm4gVE9VQ0hfQUNUSU9OX01BTklQVUxBVElPTjtcbiAgICB9XG5cbiAgICByZXR1cm4gVE9VQ0hfQUNUSU9OX0FVVE87XG59XG5cbmZ1bmN0aW9uIGdldFRvdWNoQWN0aW9uUHJvcHMoKSB7XG4gICAgaWYgKCFOQVRJVkVfVE9VQ0hfQUNUSU9OKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHRvdWNoTWFwID0ge307XG4gICAgdmFyIGNzc1N1cHBvcnRzID0gd2luZG93LkNTUyAmJiB3aW5kb3cuQ1NTLnN1cHBvcnRzO1xuICAgIFsnYXV0bycsICdtYW5pcHVsYXRpb24nLCAncGFuLXknLCAncGFuLXgnLCAncGFuLXggcGFuLXknLCAnbm9uZSddLmZvckVhY2goZnVuY3Rpb24odmFsKSB7XG5cbiAgICAgICAgLy8gSWYgY3NzLnN1cHBvcnRzIGlzIG5vdCBzdXBwb3J0ZWQgYnV0IHRoZXJlIGlzIG5hdGl2ZSB0b3VjaC1hY3Rpb24gYXNzdW1lIGl0IHN1cHBvcnRzXG4gICAgICAgIC8vIGFsbCB2YWx1ZXMuIFRoaXMgaXMgdGhlIGNhc2UgZm9yIElFIDEwIGFuZCAxMS5cbiAgICAgICAgdG91Y2hNYXBbdmFsXSA9IGNzc1N1cHBvcnRzID8gd2luZG93LkNTUy5zdXBwb3J0cygndG91Y2gtYWN0aW9uJywgdmFsKSA6IHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvdWNoTWFwO1xufVxuXG4vKipcbiAqIFJlY29nbml6ZXIgZmxvdyBleHBsYWluZWQ7ICpcbiAqIEFsbCByZWNvZ25pemVycyBoYXZlIHRoZSBpbml0aWFsIHN0YXRlIG9mI
46184FBPU1NJQkxFIHdoZW4gYSBpbnB1dCBzZXNzaW9uIHN0YXJ0cy5cbiAqIFRoZSBkZWZpbml0aW9uIG9mIGEgaW5wdXQgc2Vzc2lvbiBpcyBmcm9tIHRoZSBmaXJzdCBpbnB1dCB1bnRpbCB0aGUgbGFzdCBpbnB1dCwgd2l0aCBhbGwgaXQncyBtb3ZlbWVudCBpbiBpdC4gKlxuICogRXhhbXBsZSBzZXNzaW9uIGZvciBtb3VzZS1pbnB1dDogbW91c2Vkb3duIC0+IG1vdXNlbW92ZSAtPiBtb3VzZXVwXG4gKlxuICogT24gZWFjaCByZWNvZ25pemluZyBjeWNsZSAoc2VlIE1hbmFnZXIucmVjb2duaXplKSB0aGUgLnJlY29nbml6ZSgpIG1ldGhvZCBpcyBleGVjdXRlZFxuICogd2hpY2ggZGV0ZXJtaW5lcyB3aXRoIHN0YXRlIGl0IHNob3VsZCBiZS5cbiAqXG4gKiBJZiB0aGUgcmVjb2duaXplciBoYXMgdGhlIHN0YXRlIEZBSUxFRCwgQ0FOQ0VMTEVEIG9yIFJFQ09HTklaRUQgKGVxdWFscyBFTkRFRCksIGl0IGlzIHJlc2V0IHRvXG4gKiBQT1NTSUJMRSB0byBnaXZlIGl0IGFub3RoZXIgY2hhbmdlIG9uIHRoZSBuZXh0IGN5Y2xlLlxuICpcbiAqICAgICAgICAgICAgICAgUG9zc2libGVcbiAqICAgICAgICAgICAgICAgICAgfFxuICogICAgICAgICAgICArLS0tLS0rLS0tLS0tLS0tLS0tLS0tK1xuICogICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfFxuICogICAgICArLS0tLS0rLS0tLS0rICAgICAgICAgICAgICAgfFxuICogICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgfFxuICogICBGYWlsZWQgICAgICBDYW5jZWxsZWQgICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKy0tLS0tLStcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgICBSZWNvZ25pemVkICAgICAgIEJlZ2FuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRlZC9SZWNvZ25pemVkXG4gKi9cbnZhciBTVEFURV9QT1NTSUJMRSA9IDE7XG52YXIgU1RBVEVfQkVHQU4gPSAyO1xudmFyIFNUQVRFX0NIQU5HRUQgPSA0O1xudmFyIFNUQVRFX0VOREVEID0gODtcbnZhciBTVEFURV9SRUNPR05JWkVEID0gU1RBVEVfRU5ERUQ7XG52YXIgU1RBVEVfQ0FOQ0VMTEVEID0gMTY7XG52YXIgU1RBVEVfRkFJTEVEID0gMzI7XG5cbi8qKlxuICogUmVjb2duaXplclxuICogRXZlcnkgcmVjb2duaXplciBuZWVkcyB0byBleHRlbmQgZnJvbSB0aGlzIGNsYXNzLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICovXG5mdW5jdGlvbiBSZWNvZ25pemVyKG9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBhc3NpZ24oe30sIHRoaXMuZGVmYXVsdHMsIG9wdGlvbnMgfHwge30pO1xuXG4gICAgdGhpcy5pZCA9IHVuaXF1ZUlkKCk7XG5cbiAgICB0aGlzLm1hbmFnZXIgPSBudWxsO1xuXG4gICAgLy8gZGVmYXVsdCBpcyBlbmFibGUgdHJ1ZVxuICAgIHRoaXMub3B0aW9ucy5lbmFibGUgPSBpZlVuZGVmaW5lZCh0aGlzLm9wdGlvbnMuZW5hYmxlLCB0cnVlKTtcblxuICAgIHRoaXMuc3RhdGUgPSBTVEFURV9QT1NTSUJMRTtcblxuICAgIHRoaXMuc2ltdWx0YW5lb3VzID0ge307XG4gICAgdGhpcy5yZXF1aXJlRmFpbCA9IFtdO1xufVxuXG5SZWNvZ25pemVyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBAdmlydHVhbFxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG4gICAgZGVmYXVsdHM6IHt9LFxuXG4gICAgLyoqXG4gICAgICogc2V0IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEByZXR1cm4ge1JlY29nbml6ZXJ9XG4gICAgICovXG4gICAgc2V0OiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIGFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIGFsc28gdXBkYXRlIHRoZSB0b3VjaEFjdGlvbiwgaW4gY2FzZSBzb21ldGhpbmcgY2hhbmdlZCBhYm91dCB0aGUgZGlyZWN0aW9ucy9lbmFibGVkIHN0YXRlXG4gICAgICAgIHRoaXMubWFuYWdlciAmJiB0aGlzLm1hbmFnZXIudG91Y2hBY3Rpb24udXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZWNvZ25pemUgc2ltdWx0YW5lb3VzIHdpdGggYW4gb3RoZXIgcmVjb2duaXplci5cbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IG90aGVyUmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtSZWNvZ25pemVyfSB0aGlzXG4gICAgICovXG4gICAgcmVjb2duaXplV2l0aDogZnVuY3Rpb24ob3RoZXJSZWNvZ25pemVyKSB7XG4gICAgICAgIGlmIChpbnZva2VBcnJheUFyZyhvdGhlclJlY29nbml6ZXIsICdyZWNvZ25pemVXaXRoJywgdGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNpbXVsdGFuZW91cyA9IHRoaXMuc2ltdWx0YW5lb3VzO1xuICAgICAgICBvdGhlclJlY29nbml6ZXIgPSBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgdGhpcyk7XG4gICAgICAgIGlmICghc2ltdWx0YW5lb3VzW290aGVyUmVjb2duaXplci5pZF0pIHtcbiAgICAgICAgICAgIHNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdID0gb3RoZXJSZWNvZ25pemVyO1xuICAgICAgICAgICAgb3RoZXJSZWNvZ25pemVyLnJlY29nbml6ZVdpdGgodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGRyb3AgdGhlIHNpbXVsdGFuZW91cyBsaW5rLiBpdCBkb2VzbnQgcmVtb3ZlIHRoZSBsaW5rIG9uIHRoZSBvdGhlciByZWNvZ25pemVyLlxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICBkcm9wUmVjb2duaXplV2l0aDogZnVuY3Rpb24ob3RoZXJSZWNvZ25pemVyKSB7XG4gICAgICAgIGlmIChpbnZva2VBcnJheUFyZyhvdGhlclJlY29nbml6ZXIsICdkcm9wUmVjb2duaXplV2l0aCcsIHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIG90aGVyUmVjb2duaXplciA9IGdldFJlY29nbml6ZXJCeU5hbWVJZk1hbmFnZXIob3RoZXJSZWNvZ25pemVyLCB0aGlzKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuc2ltdWx0YW5lb3VzW290aGVyUmVjb2duaXplci5pZF07XG4gICAgICAgI
46184HJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZWNvZ25pemVyIGNhbiBvbmx5IHJ1biB3aGVuIGFuIG90aGVyIGlzIGZhaWxpbmdcbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IG90aGVyUmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtSZWNvZ25pemVyfSB0aGlzXG4gICAgICovXG4gICAgcmVxdWlyZUZhaWx1cmU6IGZ1bmN0aW9uKG90aGVyUmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcob3RoZXJSZWNvZ25pemVyLCAncmVxdWlyZUZhaWx1cmUnLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcmVxdWlyZUZhaWwgPSB0aGlzLnJlcXVpcmVGYWlsO1xuICAgICAgICBvdGhlclJlY29nbml6ZXIgPSBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgdGhpcyk7XG4gICAgICAgIGlmIChpbkFycmF5KHJlcXVpcmVGYWlsLCBvdGhlclJlY29nbml6ZXIpID09PSAtMSkge1xuICAgICAgICAgICAgcmVxdWlyZUZhaWwucHVzaChvdGhlclJlY29nbml6ZXIpO1xuICAgICAgICAgICAgb3RoZXJSZWNvZ25pemVyLnJlcXVpcmVGYWlsdXJlKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBkcm9wIHRoZSByZXF1aXJlRmFpbHVyZSBsaW5rLiBpdCBkb2VzIG5vdCByZW1vdmUgdGhlIGxpbmsgb24gdGhlIG90aGVyIHJlY29nbml6ZXIuXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSBvdGhlclJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgICAqL1xuICAgIGRyb3BSZXF1aXJlRmFpbHVyZTogZnVuY3Rpb24ob3RoZXJSZWNvZ25pemVyKSB7XG4gICAgICAgIGlmIChpbnZva2VBcnJheUFyZyhvdGhlclJlY29nbml6ZXIsICdkcm9wUmVxdWlyZUZhaWx1cmUnLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBvdGhlclJlY29nbml6ZXIgPSBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgdGhpcyk7XG4gICAgICAgIHZhciBpbmRleCA9IGluQXJyYXkodGhpcy5yZXF1aXJlRmFpbCwgb3RoZXJSZWNvZ25pemVyKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWlyZUZhaWwuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogaGFzIHJlcXVpcmUgZmFpbHVyZXMgYm9vbGVhblxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGhhc1JlcXVpcmVGYWlsdXJlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aCA+IDA7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGlmIHRoZSByZWNvZ25pemVyIGNhbiByZWNvZ25pemUgc2ltdWx0YW5lb3VzIHdpdGggYW4gb3RoZXIgcmVjb2duaXplclxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAgICovXG4gICAgY2FuUmVjb2duaXplV2l0aDogZnVuY3Rpb24ob3RoZXJSZWNvZ25pemVyKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuc2ltdWx0YW5lb3VzW290aGVyUmVjb2duaXplci5pZF07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFlvdSBzaG91bGQgdXNlIGB0cnlFbWl0YCBpbnN0ZWFkIG9mIGBlbWl0YCBkaXJlY3RseSB0byBjaGVja1xuICAgICAqIHRoYXQgYWxsIHRoZSBuZWVkZWQgcmVjb2duaXplcnMgaGFzIGZhaWxlZCBiZWZvcmUgZW1pdHRpbmcuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICovXG4gICAgZW1pdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2Y
46184XIgc3RhdGUgPSB0aGlzLnN0YXRlO1xuXG4gICAgICAgIGZ1bmN0aW9uIGVtaXQoZXZlbnQpIHtcbiAgICAgICAgICAgIHNlbGYubWFuYWdlci5lbWl0KGV2ZW50LCBpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAncGFuc3RhcnQnIGFuZCAncGFubW92ZSdcbiAgICAgICAgaWYgKHN0YXRlIDwgU1RBVEVfRU5ERUQpIHtcbiAgICAgICAgICAgIGVtaXQoc2VsZi5vcHRpb25zLmV2ZW50ICsgc3RhdGVTdHIoc3RhdGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVtaXQoc2VsZi5vcHRpb25zLmV2ZW50KTsgLy8gc2ltcGxlICdldmVudE5hbWUnIGV2ZW50c1xuXG4gICAgICAgIGlmIChpbnB1dC5hZGRpdGlvbmFsRXZlbnQpIHsgLy8gYWRkaXRpb25hbCBldmVudChwYW5sZWZ0LCBwYW5yaWdodCwgcGluY2hpbiwgcGluY2hvdXQuLi4pXG4gICAgICAgICAgICBlbWl0KGlucHV0LmFkZGl0aW9uYWxFdmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYW5lbmQgYW5kIHBhbmNhbmNlbFxuICAgICAgICBpZiAoc3RhdGUgPj0gU1RBVEVfRU5ERUQpIHtcbiAgICAgICAgICAgIGVtaXQoc2VsZi5vcHRpb25zLmV2ZW50ICsgc3RhdGVTdHIoc3RhdGUpKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayB0aGF0IGFsbCB0aGUgcmVxdWlyZSBmYWlsdXJlIHJlY29nbml6ZXJzIGhhcyBmYWlsZWQsXG4gICAgICogaWYgdHJ1ZSwgaXQgZW1pdHMgYSBnZXN0dXJlIGV2ZW50LFxuICAgICAqIG90aGVyd2lzZSwgc2V0dXAgdGhlIHN0YXRlIHRvIEZBSUxFRC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAgICAgKi9cbiAgICB0cnlFbWl0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5jYW5FbWl0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGl0J3MgZmFpbGluZyBhbnl3YXlcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX0ZBSUxFRDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogY2FuIHdlIGVtaXQ/XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgY2FuRW1pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPCB0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKCEodGhpcy5yZXF1aXJlRmFpbFtpXS5zdGF0ZSAmIChTVEFURV9GQUlMRUQgfCBTVEFURV9QT1NTSUJMRSkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB1cGRhdGUgdGhlIHJlY29nbml6ZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXREYXRhXG4gICAgICovXG4gICAgcmVjb2duaXplOiBmdW5jdGlvbihpbnB1dERhdGEpIHtcbiAgICAgICAgLy8gbWFrZSBhIG5ldyBjb3B5IG9mIHRoZSBpbnB1dERhdGFcbiAgICAgICAgLy8gc28gd2UgY2FuIGNoYW5nZSB0aGUgaW5wdXREYXRhIHdpdGhvdXQgbWVzc2luZyB1cCB0aGUgb3RoZXIgcmVjb2duaXplcnNcbiAgICAgICAgdmFyIGlucHV0RGF0YUNsb25lID0gYXNzaWduKHt9LCBpbnB1dERhdGEpO1xuXG4gICAgICAgIC8vIGlzIGlzIGVuYWJsZWQgYW5kIGFsbG93IHJlY29nbml6aW5nP1xuICAgICAgICBpZiAoIWJvb2xPckZuKHRoaXMub3B0aW9ucy5lbmFibGUsIFt0aGlzLCBpbnB1dERhdGFDbG9uZV0pKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfRkFJTEVEO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVzZXQgd2hlbiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmRcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgJiAoU1RBVEVfUkVDT0dOSVpFRCB8IFNUQVRFX0NBTkNFTExFRCB8IFNUQVRFX0ZBSUxFRCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9QT1NTSUJMRTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLnByb2Nlc3MoaW5wdXREYXRhQ2xvbmUpO1xuXG4gICAgICAgIC8vIHRoZSByZWNvZ25pemVyIGhhcyByZWNvZ25pemVkIGEgZ2VzdHVyZVxuICAgICAgICAvLyBzbyB0cmlnZ2VyIGFuIGV2ZW50XG4gICAgICAgIGlmICh0aGlzLnN0YXRlICYgKFNUQVRFX0JFR0FOIHwgU1RBVEVfQ0hBTkdFRCB8IFNUQVRFX0VOREVEIHwgU1RBVEVfQ0FOQ0VMTEVEKSkge1xuICAgICAgICAgICAgdGhpcy50cnlFbWl0KGlucHV0RGF0YUNsb25lKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSByZWNvZ25pemVyXG4gICAgICogdGhlIGFjdHVhbCByZWNvZ25pemluZyBoYXBwZW5zIGluIHRoaXMgbWV0aG9kXG4gICAgICogQHZpcnR1YWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXREYXRhXG4gICAgICogQHJldHVybnMge0NvbnN0fSBTVEFURVxuICAgICAqL1xuICAgIHByb2Nlc3M6IGZ1bmN0aW9uKGlucHV0RGF0YSkgeyB9LCAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgcHJlZmVycmVkIHRvdWNoLWFjdGlvblxuICAgICAqIEB2aXJ0dWFsXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbigpIHsgfSxcblxuICAgIC8qKlxuICAgICAqIGNhbGxlZCB3aGVuIHRoZSBnZXN0dXJlIGlzbid0IGFsbG93ZWQgdG8gcmVjb2duaXplXG4gICAgICogbGlrZSB3aGVuIGFub3RoZXIgaXMgYmVpbmcgcmVjb2duaXplZCBvciBpdCBpcyBkaXNhYmxlZFxuICAgICAqIEB2aXJ0dWFsXG4gICAgICovXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKCkgeyB9XG59O1xuXG4vKipcbiAqIGdldCBhIHVzYWJsZSBzdHJpbmcsIHVzZWQgYXMgZXZlbnQgcG9zdGZpeFxuICogQHBhcmFtIHtDb25zdH0gc3RhdGVcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0YXRlXG4gKi9cbmZ1bmN0aW9uIHN0YXRlU3RyKHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlICYgU1RBVEVfQ0FOQ0VMTEVEKSB7XG4gICAgICAgI
46184HJldHVybiAnY2FuY2VsJztcbiAgICB9IGVsc2UgaWYgKHN0YXRlICYgU1RBVEVfRU5ERUQpIHtcbiAgICAgICAgcmV0dXJuICdlbmQnO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUgJiBTVEFURV9DSEFOR0VEKSB7XG4gICAgICAgIHJldHVybiAnbW92ZSc7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSAmIFNUQVRFX0JFR0FOKSB7XG4gICAgICAgIHJldHVybiAnc3RhcnQnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogZGlyZWN0aW9uIGNvbnMgdG8gc3RyaW5nXG4gKiBAcGFyYW0ge0NvbnN0fSBkaXJlY3Rpb25cbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGRpcmVjdGlvblN0cihkaXJlY3Rpb24pIHtcbiAgICBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9ET1dOKSB7XG4gICAgICAgIHJldHVybiAnZG93bic7XG4gICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRElSRUNUSU9OX1VQKSB7XG4gICAgICAgIHJldHVybiAndXAnO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9MRUZUKSB7XG4gICAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRElSRUNUSU9OX1JJR0hUKSB7XG4gICAgICAgIHJldHVybiAncmlnaHQnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogZ2V0IGEgcmVjb2duaXplciBieSBuYW1lIGlmIGl0IGlzIGJvdW5kIHRvIGEgbWFuYWdlclxuICogQHBhcmFtIHtSZWNvZ25pemVyfFN0cmluZ30gb3RoZXJSZWNvZ25pemVyXG4gKiBAcGFyYW0ge1JlY29nbml6ZXJ9IHJlY29nbml6ZXJcbiAqIEByZXR1cm5zIHtSZWNvZ25pemVyfVxuICovXG5mdW5jdGlvbiBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgcmVjb2duaXplcikge1xuICAgIHZhciBtYW5hZ2VyID0gcmVjb2duaXplci5tYW5hZ2VyO1xuICAgIGlmIChtYW5hZ2VyKSB7XG4gICAgICAgIHJldHVybiBtYW5hZ2VyLmdldChvdGhlclJlY29nbml6ZXIpO1xuICAgIH1cbiAgICByZXR1cm4gb3RoZXJSZWNvZ25pemVyO1xufVxuXG4vKipcbiAqIFRoaXMgcmVjb2duaXplciBpcyBqdXN0IHVzZWQgYXMgYSBiYXNlIGZvciB0aGUgc2ltcGxlIGF0dHJpYnV0ZSByZWNvZ25pemVycy5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBBdHRyUmVjb2duaXplcigpIHtcbiAgICBSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoQXR0clJlY29nbml6ZXIsIFJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIEF0dHJSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDFcbiAgICAgICAgICovXG4gICAgICAgIHBvaW50ZXJzOiAxXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gY2hlY2sgaWYgaXQgdGhlIHJlY29nbml6ZXIgcmVjZWl2ZXMgdmFsaWQgaW5wdXQsIGxpa2UgaW5wdXQuZGlzdGFuY2UgPiAxMC5cbiAgICAgKiBAbWVtYmVyb2YgQXR0clJlY29nbml6ZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gcmVjb2duaXplZFxuICAgICAqL1xuICAgIGF0dHJUZXN0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2Y
46184XIgb3B0aW9uUG9pbnRlcnMgPSB0aGlzLm9wdGlvbnMucG9pbnRlcnM7XG4gICAgICAgIHJldHVybiBvcHRpb25Qb2ludGVycyA9PT0gMCB8fCBpbnB1dC5wb2ludGVycy5sZW5ndGggPT09IG9wdGlvblBvaW50ZXJzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIHRoZSBpbnB1dCBhbmQgcmV0dXJuIHRoZSBzdGF0ZSBmb3IgdGhlIHJlY29nbml6ZXJcbiAgICAgKiBAbWVtYmVyb2YgQXR0clJlY29nbml6ZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAgICAgKiBAcmV0dXJucyB7Kn0gU3RhdGVcbiAgICAgKi9cbiAgICBwcm9jZXNzOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgICAgICB2YXIgZXZlbnRUeXBlID0gaW5wdXQuZXZlbnRUeXBlO1xuXG4gICAgICAgIHZhciBpc1JlY29nbml6ZWQgPSBzdGF0ZSAmIChTVEFURV9CRUdBTiB8IFNUQVRFX0NIQU5HRUQpO1xuICAgICAgICB2YXIgaXNWYWxpZCA9IHRoaXMuYXR0clRlc3QoaW5wdXQpO1xuXG4gICAgICAgIC8vIG9uIGNhbmNlbCBpbnB1dCBhbmQgd2UndmUgcmVjb2duaXplZCBiZWZvcmUsIHJldHVybiBTVEFURV9DQU5DRUxMRURcbiAgICAgICAgaWYgKGlzUmVjb2duaXplZCAmJiAoZXZlbnRUeXBlICYgSU5QVVRfQ0FOQ0VMIHx8ICFpc1ZhbGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlIHwgU1RBVEVfQ0FOQ0VMTEVEO1xuICAgICAgICB9IGVsc2UgaWYgKGlzUmVjb2duaXplZCB8fCBpc1ZhbGlkKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfRU5EKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlIHwgU1RBVEVfRU5ERUQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCEoc3RhdGUgJiBTVEFURV9CRUdBTikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEVfQkVHQU47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUgfCBTVEFURV9DSEFOR0VEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTVEFURV9GQUlMRUQ7XG4gICAgfVxufSk7XG5cbi8qKlxuICogUGFuXG4gKiBSZWNvZ25pemVkIHdoZW4gdGhlIHBvaW50ZXIgaXMgZG93biBhbmQgbW92ZWQgaW4gdGhlIGFsbG93ZWQgZGlyZWN0aW9uLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBBdHRyUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBQYW5SZWNvZ25pemVyKCkge1xuICAgIEF0dHJSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLnBYID0gbnVsbDtcbiAgICB0aGlzLnBZID0gbnVsbDtcbn1cblxuaW5oZXJpdChQYW5SZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUGFuUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGV2ZW50OiAncGFuJyxcbiAgICAgICAgdGhyZXNob2xkOiAxMCxcbiAgICAgICAgcG9pbnRlcnM6IDEsXG4gICAgICAgIGRpcmVjdGlvbjogRElSRUNUSU9OX0FMTFxuICAgIH0sXG5cbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uO1xuICAgICAgICB2Y
46184XIgYWN0aW9ucyA9IFtdO1xuICAgICAgICBpZiAoZGlyZWN0aW9uICYgRElSRUNUSU9OX0hPUklaT05UQUwpIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaChUT1VDSF9BQ1RJT05fUEFOX1kpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXJlY3Rpb24gJiBESVJFQ1RJT05fVkVSVElDQUwpIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaChUT1VDSF9BQ1RJT05fUEFOX1gpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY3Rpb25zO1xuICAgIH0sXG5cbiAgICBkaXJlY3Rpb25UZXN0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgdmFyIGhhc01vdmVkID0gdHJ1ZTtcbiAgICAgICAgdmFyIGRpc3RhbmNlID0gaW5wdXQuZGlzdGFuY2U7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSBpbnB1dC5kaXJlY3Rpb247XG4gICAgICAgIHZhciB4ID0gaW5wdXQuZGVsdGFYO1xuICAgICAgICB2YXIgeSA9IGlucHV0LmRlbHRhWTtcblxuICAgICAgICAvLyBsb2NrIHRvIGF4aXM/XG4gICAgICAgIGlmICghKGRpcmVjdGlvbiAmIG9wdGlvbnMuZGlyZWN0aW9uKSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGlyZWN0aW9uICYgRElSRUNUSU9OX0hPUklaT05UQUwpIHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAoeCA9PT0gMCkgPyBESVJFQ1RJT05fTk9ORSA6ICh4IDwgMCkgPyBESVJFQ1RJT05fTEVGVCA6IERJUkVDVElPTl9SSUdIVDtcbiAgICAgICAgICAgICAgICBoYXNNb3ZlZCA9IHggIT0gdGhpcy5wWDtcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IE1hdGguYWJzKGlucHV0LmRlbHRhWCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICh5ID09PSAwKSA/IERJUkVDVElPTl9OT05FIDogKHkgPCAwKSA/IERJUkVDVElPTl9VUCA6IERJUkVDVElPTl9ET1dOO1xuICAgICAgICAgICAgICAgIGhhc01vdmVkID0geSAhPSB0aGlzLnBZO1xuICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gTWF0aC5hYnMoaW5wdXQuZGVsdGFZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbnB1dC5kaXJlY3Rpb24gPSBkaXJlY3Rpb247XG4gICAgICAgIHJldHVybiBoYXNNb3ZlZCAmJiBkaXN0YW5jZSA+IG9wdGlvbnMudGhyZXNob2xkICYmIGRpcmVjdGlvbiAmIG9wdGlvbnMuZGlyZWN0aW9uO1xuICAgIH0sXG5cbiAgICBhdHRyVGVzdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIEF0dHJSZWNvZ25pemVyLnByb3RvdHlwZS5hdHRyVGVzdC5jYWxsKHRoaXMsIGlucHV0KSAmJlxuICAgICAgICAgICAgKHRoaXMuc3RhdGUgJiBTVEFURV9CRUdBTiB8fCAoISh0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4pICYmIHRoaXMuZGlyZWN0aW9uVGVzdChpbnB1dCkpKTtcbiAgICB9LFxuXG4gICAgZW1pdDogZnVuY3Rpb24oaW5wdXQpIHtcblxuICAgICAgICB0aGlzLnBYID0gaW5wdXQuZGVsdGFYO1xuICAgICAgICB0aGlzLnBZID0gaW5wdXQuZGVsdGFZO1xuXG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSBkaXJlY3Rpb25TdHIoaW5wdXQuZGlyZWN0aW9uKTtcblxuICAgICAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBpbnB1dC5hZGRpdGlvbmFsRXZlbnQgPSB0aGlzLm9wdGlvbnMuZXZlbnQgKyBkaXJlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3VwZXIuZW1pdC5jYWxsKHRoaXMsIGlucHV0KTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBQaW5jaFxuICogUmVjb2duaXplZCB3aGVuIHR3byBvciBtb3JlIHBvaW50ZXJzIGFyZSBtb3ZpbmcgdG93YXJkICh6b29tLWluKSBvciBhd2F5IGZyb20gZWFjaCBvdGhlciAoem9vbS1vdXQpLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBBdHRyUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBQaW5jaFJlY29nbml6ZXIoKSB7XG4gICAgQXR0clJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuaW5oZXJpdChQaW5jaFJlY29nbml6ZXIsIEF0dHJSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBQaW5jaFJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3BpbmNoJyxcbiAgICAgICAgdGhyZXNob2xkOiAwLFxuICAgICAgICBwb2ludGVyczogMlxuICAgIH0sXG5cbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBbVE9VQ0hfQUNUSU9OX05PTkVdO1xuICAgIH0sXG5cbiAgICBhdHRyVGVzdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcywgaW5wdXQpICYmXG4gICAgICAgICAgICAoTWF0aC5hYnMoaW5wdXQuc2NhbGUgLSAxKSA+IHRoaXMub3B0aW9ucy50aHJlc2hvbGQgfHwgdGhpcy5zdGF0ZSAmIFNUQVRFX0JFR0FOKTtcbiAgICB9LFxuXG4gICAgZW1pdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaWYgKGlucHV0LnNjYWxlICE9PSAxKSB7XG4gICAgICAgICAgICB2Y
46184XIgaW5PdXQgPSBpbnB1dC5zY2FsZSA8IDEgPyAnaW4nIDogJ291dCc7XG4gICAgICAgICAgICBpbnB1dC5hZGRpdGlvbmFsRXZlbnQgPSB0aGlzLm9wdGlvbnMuZXZlbnQgKyBpbk91dDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdXBlci5lbWl0LmNhbGwodGhpcywgaW5wdXQpO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIFByZXNzXG4gKiBSZWNvZ25pemVkIHdoZW4gdGhlIHBvaW50ZXIgaXMgZG93biBmb3IgeCBtcyB3aXRob3V0IGFueSBtb3ZlbWVudC5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBQcmVzc1JlY29nbml6ZXIoKSB7XG4gICAgUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdGhpcy5fdGltZXIgPSBudWxsO1xuICAgIHRoaXMuX2lucHV0ID0gbnVsbDtcbn1cblxuaW5oZXJpdChQcmVzc1JlY29nbml6ZXIsIFJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFByZXNzUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGV2ZW50OiAncHJlc3MnLFxuICAgICAgICBwb2ludGVyczogMSxcbiAgICAgICAgdGltZTogMjUxLCAvLyBtaW5pbWFsIHRpbWUgb2YgdGhlIHBvaW50ZXIgdG8gYmUgcHJlc3NlZFxuICAgICAgICB0aHJlc2hvbGQ6IDkgLy8gYSBtaW5pbWFsIG1vdmVtZW50IGlzIG9rLCBidXQga2VlcCBpdCBsb3dcbiAgICB9LFxuXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1RPVUNIX0FDVElPTl9BVVRPXTtcbiAgICB9LFxuXG4gICAgcHJvY2VzczogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIHZhciB2YWxpZFBvaW50ZXJzID0gaW5wdXQucG9pbnRlcnMubGVuZ3RoID09PSBvcHRpb25zLnBvaW50ZXJzO1xuICAgICAgICB2Y
46184XIgdmFsaWRNb3ZlbWVudCA9IGlucHV0LmRpc3RhbmNlIDwgb3B0aW9ucy50aHJlc2hvbGQ7XG4gICAgICAgIHZhciB2YWxpZFRpbWUgPSBpbnB1dC5kZWx0YVRpbWUgPiBvcHRpb25zLnRpbWU7XG5cbiAgICAgICAgdGhpcy5faW5wdXQgPSBpbnB1dDtcblxuICAgICAgICAvLyB3ZSBvbmx5IGFsbG93IGxpdHRsZSBtb3ZlbWVudFxuICAgICAgICAvLyBhbmQgd2UndmUgcmVhY2hlZCBhbiBlbmQgZXZlbnQsIHNvIGEgdGFwIGlzIHBvc3NpYmxlXG4gICAgICAgIGlmICghdmFsaWRNb3ZlbWVudCB8fCAhdmFsaWRQb2ludGVycyB8fCAoaW5wdXQuZXZlbnRUeXBlICYgKElOUFVUX0VORCB8IElOUFVUX0NBTkNFTCkgJiYgIXZhbGlkVGltZSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5ldmVudFR5cGUgJiBJTlBVVF9TVEFSVCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0Q29udGV4dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfUkVDT0dOSVpFRDtcbiAgICAgICAgICAgICAgICB0aGlzLnRyeUVtaXQoKTtcbiAgICAgICAgICAgIH0sIG9wdGlvbnMudGltZSwgdGhpcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuZXZlbnRUeXBlICYgSU5QVVRfRU5EKSB7XG4gICAgICAgICAgICByZXR1cm4gU1RBVEVfUkVDT0dOSVpFRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU1RBVEVfRkFJTEVEO1xuICAgIH0sXG5cbiAgICByZXNldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7XG4gICAgfSxcblxuICAgIGVtaXQ6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBTVEFURV9SRUNPR05JWkVEKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5wdXQgJiYgKGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX0VORCkpIHtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCArICd1cCcsIGlucHV0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2lucHV0LnRpbWVTdGFtcCA9IG5vdygpO1xuICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LCB0aGlzLl9pbnB1dCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuLyoqXG4gKiBSb3RhdGVcbiAqIFJlY29nbml6ZWQgd2hlbiB0d28gb3IgbW9yZSBwb2ludGVyIGFyZSBtb3ZpbmcgaW4gYSBjaXJjdWxhciBtb3Rpb24uXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIEF0dHJSZWNvZ25pemVyXG4gKi9cbmZ1bmN0aW9uIFJvdGF0ZVJlY29nbml6ZXIoKSB7XG4gICAgQXR0clJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuaW5oZXJpdChSb3RhdGVSZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUm90YXRlUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGV2ZW50OiAncm90YXRlJyxcbiAgICAgICAgdGhyZXNob2xkOiAwLFxuICAgICAgICBwb2ludGVyczogMlxuICAgIH0sXG5cbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBbVE9VQ0hfQUNUSU9OX05PTkVdO1xuICAgIH0sXG5cbiAgICBhdHRyVGVzdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcywgaW5wdXQpICYmXG4gICAgICAgICAgICAoTWF0aC5hYnMoaW5wdXQucm90YXRpb24pID4gdGhpcy5vcHRpb25zLnRocmVzaG9sZCB8fCB0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4pO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIFN3aXBlXG4gKiBSZWNvZ25pemVkIHdoZW4gdGhlIHBvaW50ZXIgaXMgbW92aW5nIGZhc3QgKHZlbG9jaXR5KSwgd2l0aCBlbm91Z2ggZGlzdGFuY2UgaW4gdGhlIGFsbG93ZWQgZGlyZWN0aW9uLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBBdHRyUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBTd2lwZVJlY29nbml6ZXIoKSB7XG4gICAgQXR0clJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuaW5oZXJpdChTd2lwZVJlY29nbml6ZXIsIEF0dHJSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBTd2lwZVJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3N3aXBlJyxcbiAgICAgICAgdGhyZXNob2xkOiAxMCxcbiAgICAgICAgdmVsb2NpdHk6IDAuMyxcbiAgICAgICAgZGlyZWN0aW9uOiBESVJFQ1RJT05fSE9SSVpPTlRBTCB8IERJUkVDVElPTl9WRVJUSUNBTC
46184xcbiAgICAgICAgcG9pbnRlcnM6IDFcbiAgICB9LFxuXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gUGFuUmVjb2duaXplci5wcm90b3R5cGUuZ2V0VG91Y2hBY3Rpb24uY2FsbCh0aGlzKTtcbiAgICB9LFxuXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uO1xuICAgICAgICB2YXIgdmVsb2NpdHk7XG5cbiAgICAgICAgaWYgKGRpcmVjdGlvbiAmIChESVJFQ1RJT05fSE9SSVpPTlRBTCB8IERJUkVDVElPTl9WRVJUSUNBTCkpIHtcbiAgICAgICAgICAgIHZlbG9jaXR5ID0gaW5wdXQub3ZlcmFsbFZlbG9jaXR5O1xuICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiAmIERJUkVDVElPTl9IT1JJWk9OVEFMKSB7XG4gICAgICAgICAgICB2ZWxvY2l0eSA9IGlucHV0Lm92ZXJhbGxWZWxvY2l0eVg7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uICYgRElSRUNUSU9OX1ZFUlRJQ0FMKSB7XG4gICAgICAgICAgICB2ZWxvY2l0eSA9IGlucHV0Lm92ZXJhbGxWZWxvY2l0eVk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIuYXR0clRlc3QuY2FsbCh0aGlzLCBpbnB1dCkgJiZcbiAgICAgICAgICAgIGRpcmVjdGlvbiAmIGlucHV0Lm9mZnNldERpcmVjdGlvbiAmJlxuICAgICAgICAgICAgaW5wdXQuZGlzdGFuY2UgPiB0aGlzLm9wdGlvbnMudGhyZXNob2xkICYmXG4gICAgICAgICAgICBpbnB1dC5tYXhQb2ludGVycyA9PSB0aGlzLm9wdGlvbnMucG9pbnRlcnMgJiZcbiAgICAgICAgICAgIGFicyh2ZWxvY2l0eSkgPiB0aGlzLm9wdGlvbnMudmVsb2NpdHkgJiYgaW5wdXQuZXZlbnRUeXBlICYgSU5QVVRfRU5EO1xuICAgIH0sXG5cbiAgICBlbWl0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2Y
46184XIgZGlyZWN0aW9uID0gZGlyZWN0aW9uU3RyKGlucHV0Lm9mZnNldERpcmVjdGlvbik7XG4gICAgICAgIGlmIChkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCArIGRpcmVjdGlvbiwgaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LCBpbnB1dCk7XG4gICAgfVxufSk7XG5cbi8qKlxuICogQSB0YXAgaXMgZWNvZ25pemVkIHdoZW4gdGhlIHBvaW50ZXIgaXMgZG9pbmcgYSBzbWFsbCB0YXAvY2xpY2suIE11bHRpcGxlIHRhcHMgYXJlIHJlY29nbml6ZWQgaWYgdGhleSBvY2N1clxuICogYmV0d2VlbiB0aGUgZ2l2ZW4gaW50ZXJ2YWwgYW5kIHBvc2l0aW9uLiBUaGUgZGVsYXkgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHJlY29nbml6ZSBtdWx0aS10YXBzIHdpdGhvdXQgZmlyaW5nXG4gKiBhIHNpbmdsZSB0YXAuXG4gKlxuICogVGhlIGV2ZW50RGF0YSBmcm9tIHRoZSBlbWl0dGVkIGV2ZW50IGNvbnRhaW5zIHRoZSBwcm9wZXJ0eSBgdGFwQ291bnRgLCB3aGljaCBjb250YWlucyB0aGUgYW1vdW50IG9mXG4gKiBtdWx0aS10YXBzIGJlaW5nIHJlY29nbml6ZWQuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIFJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gVGFwUmVjb2duaXplcigpIHtcbiAgICBSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAvLyBwcmV2aW91cyB0aW1lIGFuZCBjZW50ZXIsXG4gICAgLy8gdXNlZCBmb3IgdGFwIGNvdW50aW5nXG4gICAgdGhpcy5wVGltZSA9IGZhbHNlO1xuICAgIHRoaXMucENlbnRlciA9IGZhbHNlO1xuXG4gICAgdGhpcy5fdGltZXIgPSBudWxsO1xuICAgIHRoaXMuX2lucHV0ID0gbnVsbDtcbiAgICB0aGlzLmNvdW50ID0gMDtcbn1cblxuaW5oZXJpdChUYXBSZWNvZ25pemVyLCBSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBQaW5jaFJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3RhcCcsXG4gICAgICAgIHBvaW50ZXJzOiAxLFxuICAgICAgICB0YXBzOiAxLFxuICAgICAgICBpbnRlcnZhbDogMzAwLCAvLyBtYXggdGltZSBiZXR3ZWVuIHRoZSBtdWx0aS10YXAgdGFwc1xuICAgICAgICB0aW1lOiAyNTAsIC8vIG1heCB0aW1lIG9mIHRoZSBwb2ludGVyIHRvIGJlIGRvd24gKGxpa2UgZmluZ2VyIG9uIHRoZSBzY3JlZW4pXG4gICAgICAgIHRocmVzaG9sZDogOSwgLy8gYSBtaW5pbWFsIG1vdmVtZW50IGlzIG9rLCBidXQga2VlcCBpdCBsb3dcbiAgICAgICAgcG9zVGhyZXNob2xkOiAxMCAvLyBhIG11bHRpLXRhcCBjYW4gYmUgYSBiaXQgb2ZmIHRoZSBpbml0aWFsIHBvc2l0aW9uXG4gICAgfSxcblxuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFtUT1VDSF9BQ1RJT05fTUFOSVBVTEFUSU9OXTtcbiAgICB9LFxuXG4gICAgcHJvY2VzczogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgICAgdmFyIHZhbGlkUG9pbnRlcnMgPSBpbnB1dC5wb2ludGVycy5sZW5ndGggPT09IG9wdGlvbnMucG9pbnRlcnM7XG4gICAgICAgIHZhciB2YWxpZE1vdmVtZW50ID0gaW5wdXQuZGlzdGFuY2UgPCBvcHRpb25zLnRocmVzaG9sZDtcbiAgICAgICAgdmFyIHZhbGlkVG91Y2hUaW1lID0gaW5wdXQuZGVsdGFUaW1lIDwgb3B0aW9ucy50aW1lO1xuXG4gICAgICAgIHRoaXMucmVzZXQoKTtcblxuICAgICAgICBpZiAoKGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX1NUQVJUKSAmJiAodGhpcy5jb3VudCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZhaWxUaW1lb3V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3ZSBvbmx5IGFsbG93IGxpdHRsZSBtb3ZlbWVudFxuICAgICAgICAvLyBhbmQgd2UndmUgcmVhY2hlZCBhbiBlbmQgZXZlbnQsIHNvIGEgdGFwIGlzIHBvc3NpYmxlXG4gICAgICAgIGlmICh2YWxpZE1vdmVtZW50ICYmIHZhbGlkVG91Y2hUaW1lICYmIHZhbGlkUG9pbnRlcnMpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5ldmVudFR5cGUgIT0gSU5QVVRfRU5EKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHZhbGlkSW50ZXJ2YWwgPSB0aGlzLnBUaW1lID8gKGlucHV0LnRpbWVTdGFtcCAtIHRoaXMucFRpbWUgPCBvcHRpb25zLmludGVydmFsKSA6IHRydWU7XG4gICAgICAgICAgICB2Y
46184XIgdmFsaWRNdWx0aVRhcCA9ICF0aGlzLnBDZW50ZXIgfHwgZ2V0RGlzdGFuY2UodGhpcy5wQ2VudGVyLCBpbnB1dC5jZW50ZXIpIDwgb3B0aW9ucy5wb3NUaHJlc2hvbGQ7XG5cbiAgICAgICAgICAgIHRoaXMucFRpbWUgPSBpbnB1dC50aW1lU3RhbXA7XG4gICAgICAgICAgICB0aGlzLnBDZW50ZXIgPSBpbnB1dC5jZW50ZXI7XG5cbiAgICAgICAgICAgIGlmICghdmFsaWRNdWx0aVRhcCB8fCAhdmFsaWRJbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY291bnQgPSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50ICs9IDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7XG5cbiAgICAgICAgICAgIC8vIGlmIHRhcCBjb3VudCBtYXRjaGVzIHdlIGhhdmUgcmVjb2duaXplZCBpdCxcbiAgICAgICAgICAgIC8vIGVsc2UgaXQgaGFzIGJlZ2FuIHJlY29nbml6aW5nLi4uXG4gICAgICAgICAgICB2YXIgdGFwQ291bnQgPSB0aGlzLmNvdW50ICUgb3B0aW9ucy50YXBzO1xuICAgICAgICAgICAgaWYgKHRhcENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gZmFpbGluZyByZXF1aXJlbWVudHMsIGltbWVkaWF0ZWx5IHRyaWdnZXIgdGhlIHRhcCBldmVudFxuICAgICAgICAgICAgICAgIC8vIG9yIHdhaXQgYXMgbG9uZyBhcyB0aGUgbXVsdGl0YXAgaW50ZXJ2YWwgdG8gdHJpZ2dlclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5oYXNSZXF1aXJlRmFpbHVyZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEVfUkVDT0dOSVpFRDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXRDb250ZXh0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1JFQ09HTklaRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUVtaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgb3B0aW9ucy5pbnRlcnZhbCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFURV9CRUdBTjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNUQVRFX0ZBSUxFRDtcbiAgICB9LFxuXG4gICAgZmFpbFRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXRDb250ZXh0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX0ZBSUxFRDtcbiAgICAgICAgfSwgdGhpcy5vcHRpb25zLmludGVydmFsLCB0aGlzKTtcbiAgICAgICAgcmV0dXJuIFNUQVRFX0ZBSUxFRDtcbiAgICB9LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICAgIH0sXG5cbiAgICBlbWl0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT0gU1RBVEVfUkVDT0dOSVpFRCkge1xuICAgICAgICAgICAgdGhpcy5faW5wdXQudGFwQ291bnQgPSB0aGlzLmNvdW50O1xuICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LCB0aGlzLl9pbnB1dCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuLyoqXG4gKiBTaW1wbGUgd2F5IHRvIGNyZWF0ZSBhIG1hbmFnZXIgd2l0aCBhIGRlZmF1bHQgc2V0IG9mIHJlY29nbml6ZXJzLlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEhhbW1lcihlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5yZWNvZ25pemVycyA9IGlmVW5kZWZpbmVkKG9wdGlvbnMucmVjb2duaXplcnMsIEhhbW1lci5kZWZhdWx0cy5wcmVzZXQpO1xuICAgIHJldHVybiBuZXcgTWFuYWdlcihlbGVtZW50LCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBAY29uc3Qge3N0cmluZ31cbiAqL1xuSGFtbWVyLlZFUlNJT04gPSAnMi4wLjcnO1xuXG4vKipcbiAqIGRlZmF1bHQgc2V0dGluZ3NcbiAqIEBuYW1lc3BhY2VcbiAqL1xuSGFtbWVyLmRlZmF1bHRzID0ge1xuICAgIC8qKlxuICAgICAqIHNldCBpZiBET00gZXZlbnRzIGFyZSBiZWluZyB0cmlnZ2VyZWQuXG4gICAgICogQnV0IHRoaXMgaXMgc2xvd2VyIGFuZCB1bnVzZWQgYnkgc2ltcGxlIGltcGxlbWVudGF0aW9ucywgc28gZGlzYWJsZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIGRvbUV2ZW50czogZmFsc2UsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgZm9yIHRoZSB0b3VjaEFjdGlvbiBwcm9wZXJ0eS9mYWxsYmFjay5cbiAgICAgKiBXaGVuIHNldCB0byBgY29tcHV0ZWAgaXQgd2lsbCBtYWdpY2FsbHkgc2V0IHRoZSBjb3JyZWN0IHZhbHVlIGJhc2VkIG9uIHRoZSBhZGRlZCByZWNvZ25pemVycy5cbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAqIEBkZWZhdWx0IGNvbXB1dGVcbiAgICAgKi9cbiAgICB0b3VjaEFjdGlvbjogVE9VQ0hfQUNUSU9OX0NPTVBVVEUsXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgZW5hYmxlOiB0cnVlLFxuXG4gICAgLyoqXG4gICAgICogRVhQRVJJTUVOVEFMIEZFQVRVUkUgLS0gY2FuIGJlIHJlbW92ZWQvY2hhbmdlZFxuICAgICAqIENoYW5nZSB0aGUgcGFyZW50IGlucHV0IHRhcmdldCBlbGVtZW50LlxuICAgICAqIElmIE51bGwsIHRoZW4gaXQgaXMgYmVpbmcgc2V0IHRoZSB0byBtYWluIGVsZW1lbnQuXG4gICAgICogQHR5cGUge051bGx8RXZlbnRUYXJnZXR9XG4gICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAqL1xuICAgIGlucHV0VGFyZ2V0OiBudWxsLFxuXG4gICAgLyoqXG4gICAgICogZm9yY2UgYW4gaW5wdXQgY2xhc3NcbiAgICAgKiBAdHlwZSB7TnVsbHxGdW5jdGlvbn1cbiAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICovXG4gICAgaW5wdXRDbGFzczogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgcmVjb2duaXplciBzZXR1cCB3aGVuIGNhbGxpbmcgYEhhbW1lcigpYFxuICAgICAqIFdoZW4gY3JlYXRpbmcgYSBuZXcgTWFuYWdlciB0aGVzZSB3aWxsIGJlIHNraXBwZWQuXG4gICAgICogQHR5cGUge0FycmF5fVxuICAgICAqL1xuICAgIHByZXNldDogW1xuICAgICAgICAvLyBSZWNvZ25pemVyQ2xhc3MsIG9wdGlvbnMsIFtyZWNvZ25pemVXaXRoLCAuLi5dLCBbcmVxdWlyZUZhaWx1cmUsIC4uLl1cbiAgICAgICAgW1JvdGF0ZVJlY29nbml6ZXIsIHtlbmFibGU6IGZhbHNlfV0sXG4gICAgICAgIFtQaW5jaFJlY29nbml6ZXIsIHtlbmFibGU6IGZhbHNlfSwgWydyb3RhdGUnXV0sXG4gICAgICAgIFtTd2lwZVJlY29nbml6ZXIsIHtkaXJlY3Rpb246IERJUkVDVElPTl9IT1JJWk9OVEFMfV0sXG4gICAgICAgIFtQYW5SZWNvZ25pemVyLCB7ZGlyZWN0aW9uOiBESVJFQ1RJT05fSE9SSVpPTlRBTH0sIFsnc3dpcGUnXV0sXG4gICAgICAgIFtUYXBSZWNvZ25pemVyXSxcbiAgICAgICAgW1RhcFJlY29nbml6ZXIsIHtldmVudDogJ2RvdWJsZXRhcCcsIHRhcHM6IDJ9LCBbJ3RhcCddXSxcbiAgICAgICAgW1ByZXNzUmVjb2duaXplcl1cbiAgICBdLFxuXG4gICAgLyoqXG4gICAgICogU29tZSBDU1MgcHJv
46184cGVydGllcyBjYW4gYmUgdXNlZCB0byBpbXByb3ZlIHRoZSB3b3JraW5nIG9mIEhhbW1lci5cbiAgICAgKiBBZGQgdGhlbSB0byB0aGlzIG1ldGhvZCBhbmQgdGhleSB3aWxsIGJlIHNldCB3aGVuIGNyZWF0aW5nIGEgbmV3IE1hbmFnZXIuXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqL1xuICAgIGNzc1Byb3BzOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXNhYmxlcyB0ZXh0IHNlbGVjdGlvbiB0byBpbXByb3ZlIHRoZSBkcmFnZ2luZyBnZXN0dXJlLiBNYWlubHkgZm9yIGRlc2t0b3AgYnJvd3NlcnMuXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICAgKi9cbiAgICAgICAgdXNlclNlbGVjdDogJ25vbmUnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXNhYmxlIHRoZSBXaW5kb3dzIFBob25lIGdyaXBwZXJzIHdoZW4gcHJlc3NpbmcgYW4gZWxlbWVudC5cbiAgICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICAgICAqL1xuICAgICAgICB0b3VjaFNlbGVjdDogJ25vbmUnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXNhYmxlcyB0aGUgZGVmYXVsdCBjYWxsb3V0IHNob3duIHdoZW4geW91IHRvdWNoIGFuZCBob2xkIGEgdG91Y2ggdGFyZ2V0LlxuICAgICAgICAgKiBPbiBpT1MsIHdoZW4geW91IHRvdWNoIGFuZCBob2xkIGEgdG91Y2ggdGFyZ2V0IHN1Y2ggYXMgYSBsaW5rLCBTYWZhcmkgZGlzcGxheXNcbiAgICAgICAgICogYSBjYWxsb3V0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxpbmsuIFRoaXMgcHJvcGVydHkgYWxsb3dzIHlvdSB0byBkaXNhYmxlIHRoYXQgY2FsbG91dC5cbiAgICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICAgICAqL1xuICAgICAgICB0b3VjaENhbGxvdXQ6ICdub25lJyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHdoZXRoZXIgem9vbWluZyBpcyBlbmFibGVkLiBVc2VkIGJ5IElFMTA+XG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICAgKi9cbiAgICAgICAgY29udGVudFpvb21pbmc6ICdub25lJyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHRoYXQgYW4gZW50aXJlIGVsZW1lbnQgc2hvdWxkIGJlIGRyYWdnYWJsZSBpbnN0ZWFkIG9mIGl0cyBjb250ZW50cy4gTWFpbmx5IGZvciBkZXNrdG9wIGJyb3dzZXJzLlxuICAgICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICAgICAgICovXG4gICAgICAgIHVzZXJEcmFnOiAnbm9uZScsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE92ZXJyaWRlcyB0aGUgaGlnaGxpZ2h0IGNvbG9yIHNob3duIHdoZW4gdGhlIHVzZXIgdGFwcyBhIGxpbmsgb3IgYSBKYXZhU2NyaXB0XG4gICAgICAgICAqIGNsaWNrYWJsZSBlbGVtZW50IGluIGlPUy4gVGhpcyBwcm9wZXJ0eSBvYmV5cyB0aGUgYWxwaGEgdmFsdWUsIGlmIHNwZWNpZmllZC5cbiAgICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAgICogQGRlZmF1bHQgJ3JnYmEoMCwwLDAsMCknXG4gICAgICAgICAqL1xuICAgICAgICB0YXBIaWdobGlnaHRDb2xvcjogJ3JnYmEoMCwwLDAsMCknXG4gICAgfVxufTtcblxudmFyIFNUT1AgPSAxO1xudmFyIEZPUkNFRF9TVE9QID0gMjtcblxuLyoqXG4gKiBNYW5hZ2VyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gTWFuYWdlcihlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gYXNzaWduKHt9LCBIYW1tZXIuZGVmYXVsdHMsIG9wdGlvbnMgfHwge30pO1xuXG4gICAgdGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0ID0gdGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0IHx8IGVsZW1lbnQ7XG5cbiAgICB0aGlzLmhhbmRsZXJzID0ge307XG4gICAgdGhpcy5zZXNzaW9uID0ge307XG4gICAgdGhpcy5yZWNvZ25pemVycyA9IFtdO1xuICAgIHRoaXMub2xkQ3NzUHJvcHMgPSB7fTtcblxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5pbnB1dCA9IGNyZWF0ZUlucHV0SW5zdGFuY2UodGhpcyk7XG4gICAgdGhpcy50b3VjaEFjdGlvbiA9IG5ldyBUb3VjaEFjdGlvbih0aGlzLCB0aGlzLm9wdGlvbnMudG91Y2hBY3Rpb24pO1xuXG4gICAgdG9nZ2xlQ3NzUHJvcHModGhpcywgdHJ1ZSk7XG5cbiAgICBlYWNoKHRoaXMub3B0aW9ucy5yZWNvZ25pemVycywgZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICB2Y
46184XIgcmVjb2duaXplciA9IHRoaXMuYWRkKG5ldyAoaXRlbVswXSkoaXRlbVsxXSkpO1xuICAgICAgICBpdGVtWzJdICYmIHJlY29nbml6ZXIucmVjb2duaXplV2l0aChpdGVtWzJdKTtcbiAgICAgICAgaXRlbVszXSAmJiByZWNvZ25pemVyLnJlcXVpcmVGYWlsdXJlKGl0ZW1bM10pO1xuICAgIH0sIHRoaXMpO1xufVxuXG5NYW5hZ2VyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBzZXQgb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHJldHVybnMge01hbmFnZXJ9XG4gICAgICovXG4gICAgc2V0OiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIGFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIE9wdGlvbnMgdGhhdCBuZWVkIGEgbGl0dGxlIG1vcmUgc2V0dXBcbiAgICAgICAgaWYgKG9wdGlvbnMudG91Y2hBY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5wdXRUYXJnZXQpIHtcbiAgICAgICAgICAgIC8vIENsZWFuIHVwIGV4aXN0aW5nIGV2ZW50IGxpc3RlbmVycyBhbmQgcmVpbml0aWFsaXplXG4gICAgICAgICAgICB0aGlzLmlucHV0LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQudGFyZ2V0ID0gb3B0aW9ucy5pbnB1dFRhcmdldDtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQuaW5pdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBzdG9wIHJlY29nbml6aW5nIGZvciB0aGlzIHNlc3Npb24uXG4gICAgICogVGhpcyBzZXNzaW9uIHdpbGwgYmUgZGlzY2FyZGVkLCB3aGVuIGEgbmV3IFtpbnB1dF1zdGFydCBldmVudCBpcyBmaXJlZC5cbiAgICAgKiBXaGVuIGZvcmNlZCwgdGhlIHJlY29nbml6ZXIgY3ljbGUgaXMgc3RvcHBlZCBpbW1lZGlhdGVseS5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtmb3JjZV1cbiAgICAgKi9cbiAgICBzdG9wOiBmdW5jdGlvbihmb3JjZSkge1xuICAgICAgICB0aGlzLnNlc3Npb24uc3RvcHBlZCA9IGZvcmNlID8gRk9SQ0VEX1NUT1AgOiBTVE9QO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBydW4gdGhlIHJlY29nbml6ZXJzIVxuICAgICAqIGNhbGxlZCBieSB0aGUgaW5wdXRIYW5kbGVyIGZ1bmN0aW9uIG9uIGV2ZXJ5IG1vdmVtZW50IG9mIHRoZSBwb2ludGVycyAodG91Y2hlcylcbiAgICAgKiBpdCB3YWxrcyB0aHJvdWdoIGFsbCB0aGUgcmVjb2duaXplcnMgYW5kIHRyaWVzIHRvIGRldGVjdCB0aGUgZ2VzdHVyZSB0aGF0IGlzIGJlaW5nIG1hZGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXREYXRhXG4gICAgICovXG4gICAgcmVjb2duaXplOiBmdW5jdGlvbihpbnB1dERhdGEpIHtcbiAgICAgICAgdmFyIHNlc3Npb24gPSB0aGlzLnNlc3Npb247XG4gICAgICAgIGlmIChzZXNzaW9uLnN0b3BwZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJ1biB0aGUgdG91Y2gtYWN0aW9uIHBvbHlmaWxsXG4gICAgICAgIHRoaXMudG91Y2hBY3Rpb24ucHJldmVudERlZmF1bHRzKGlucHV0RGF0YSk7XG5cbiAgICAgICAgdmFyIHJlY29nbml6ZXI7XG4gICAgICAgIHZhciByZWNvZ25pemVycyA9IHRoaXMucmVjb2duaXplcnM7XG5cbiAgICAgICAgLy8gdGhpcyBob2xkcyB0aGUgcmVjb2duaXplciB0aGF0IGlzIGJlaW5nIHJlY29nbml6ZWQuXG4gICAgICAgIC8vIHNvIHRoZSByZWNvZ25pemVyJ3Mgc3RhdGUgbmVlZHMgdG8gYmUgQkVHQU4sIENIQU5HRUQsIEVOREVEIG9yIFJFQ09HTklaRURcbiAgICAgICAgLy8gaWYgbm8gcmVjb2duaXplciBpcyBkZXRlY3RpbmcgYSB0aGluZywgaXQgaXMgc2V0IHRvIGBudWxsYFxuICAgICAgICB2Y
46184XIgY3VyUmVjb2duaXplciA9IHNlc3Npb24uY3VyUmVjb2duaXplcjtcblxuICAgICAgICAvLyByZXNldCB3aGVuIHRoZSBsYXN0IHJlY29nbml6ZXIgaXMgcmVjb2duaXplZFxuICAgICAgICAvLyBvciB3aGVuIHdlJ3JlIGluIGEgbmV3IHNlc3Npb25cbiAgICAgICAgaWYgKCFjdXJSZWNvZ25pemVyIHx8IChjdXJSZWNvZ25pemVyICYmIGN1clJlY29nbml6ZXIuc3RhdGUgJiBTVEFURV9SRUNPR05JWkVEKSkge1xuICAgICAgICAgICAgY3VyUmVjb2duaXplciA9IHNlc3Npb24uY3VyUmVjb2duaXplciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgcmVjb2duaXplcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZWNvZ25pemVyID0gcmVjb2duaXplcnNbaV07XG5cbiAgICAgICAgICAgIC8vIGZpbmQgb3V0IGlmIHdlIGFyZSBhbGxvd2VkIHRyeSB0byByZWNvZ25pemUgdGhlIGlucHV0IGZvciB0aGlzIG9uZS5cbiAgICAgICAgICAgIC8vIDEuICAgYWxsb3cgaWYgdGhlIHNlc3Npb24gaXMgTk9UIGZvcmNlZCBzdG9wcGVkIChzZWUgdGhlIC5zdG9wKCkgbWV0aG9kKVxuICAgICAgICAgICAgLy8gMi4gICBhbGxvdyBpZiB3ZSBzdGlsbCBoYXZlbid0IHJlY29nbml6ZWQgYSBnZXN0dXJlIGluIHRoaXMgc2Vzc2lvbiwgb3IgdGhlIHRoaXMgcmVjb2duaXplciBpcyB0aGUgb25lXG4gICAgICAgICAgICAvLyAgICAgIHRoYXQgaXMgYmVpbmcgcmVjb2duaXplZC5cbiAgICAgICAgICAgIC8vIDMuICAgYWxsb3cgaWYgdGhlIHJlY29nbml6ZXIgaXMgYWxsb3dlZCB0byBydW4gc2ltdWx0YW5lb3VzIHdpdGggdGhlIGN1cnJlbnQgcmVjb2duaXplZCByZWNvZ25pemVyLlxuICAgICAgICAgICAgLy8gICAgICB0aGlzIGNhbiBiZSBzZXR1cCB3aXRoIHRoZSBgcmVjb2duaXplV2l0aCgpYCBtZXRob2Qgb24gdGhlIHJlY29nbml6ZXIuXG4gICAgICAgICAgICBpZiAoc2Vzc2lvbi5zdG9wcGVkICE9PSBGT1JDRURfU1RPUCAmJiAoIC8vIDFcbiAgICAgICAgICAgICAgICAgICAgIWN1clJlY29nbml6ZXIgfHwgcmVjb2duaXplciA9PSBjdXJSZWNvZ25pemVyIHx8IC8vIDJcbiAgICAgICAgICAgICAgICAgICAgcmVjb2duaXplci5jYW5SZWNvZ25pemVXaXRoKGN1clJlY29nbml6ZXIpKSkgeyAvLyAzXG4gICAgICAgICAgICAgICAgcmVjb2duaXplci5yZWNvZ25pemUoaW5wdXREYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVjb2duaXplci5yZXNldCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiB0aGUgcmVjb2duaXplciBoYXMgYmVlbiByZWNvZ25pemluZyB0aGUgaW5wdXQgYXMgYSB2YWxpZCBnZXN0dXJlLCB3ZSB3YW50IHRvIHN0b3JlIHRoaXMgb25lIGFzIHRoZVxuICAgICAgICAgICAgLy8gY3VycmVudCBhY3RpdmUgcmVjb2duaXplci4gYnV0IG9ubHkgaWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGFuIGFjdGl2ZSByZWNvZ25pemVyXG4gICAgICAgICAgICBpZiAoIWN1clJlY29nbml6ZXIgJiYgcmVjb2duaXplci5zdGF0ZSAmIChTVEFURV9CRUdBTiB8IFNUQVRFX0NIQU5HRUQgfCBTVEFURV9FTkRFRCkpIHtcbiAgICAgICAgICAgICAgICBjdXJSZWNvZ25pemVyID0gc2Vzc2lvbi5jdXJSZWNvZ25pemVyID0gcmVjb2duaXplcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBnZXQgYSByZWNvZ25pemVyIGJ5IGl0cyBldmVudCBuYW1lLlxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcnxTdHJpbmd9IHJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcnxOdWxsfVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24ocmVjb2duaXplcikge1xuICAgICAgICBpZiAocmVjb2duaXplciBpbnN0YW5jZW9mIFJlY29nbml6ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiByZWNvZ25pemVyO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlY29nbml6ZXJzID0gdGhpcy5yZWNvZ25pemVycztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWNvZ25pemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHJlY29nbml6ZXJzW2ldLm9wdGlvbnMuZXZlbnQgPT0gcmVjb2duaXplcikge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWNvZ25pemVyc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogYWRkIGEgcmVjb2duaXplciB0byB0aGUgbWFuYWdlclxuICAgICAqIGV4aXN0aW5nIHJlY29nbml6ZXJzIHdpdGggdGhlIHNhbWUgZXZlbnQgbmFtZSB3aWxsIGJlIHJlbW92ZWRcbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IHJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcnxNYW5hZ2VyfVxuICAgICAqL1xuICAgIGFkZDogZnVuY3Rpb24ocmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcocmVjb2duaXplciwgJ2FkZCcsIHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlbW92ZSBleGlzdGluZ1xuICAgICAgICB2Y
46184XIgZXhpc3RpbmcgPSB0aGlzLmdldChyZWNvZ25pemVyLm9wdGlvbnMuZXZlbnQpO1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlKGV4aXN0aW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVjb2duaXplcnMucHVzaChyZWNvZ25pemVyKTtcbiAgICAgICAgcmVjb2duaXplci5tYW5hZ2VyID0gdGhpcztcblxuICAgICAgICB0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gcmVjb2duaXplcjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVtb3ZlIGEgcmVjb2duaXplciBieSBuYW1lIG9yIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfFN0cmluZ30gcmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtNYW5hZ2VyfVxuICAgICAqL1xuICAgIHJlbW92ZTogZnVuY3Rpb24ocmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcocmVjb2duaXplciwgJ3JlbW92ZScsIHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJlY29nbml6ZXIgPSB0aGlzLmdldChyZWNvZ25pemVyKTtcblxuICAgICAgICAvLyBsZXQncyBtYWtlIHN1cmUgdGhpcyByZWNvZ25pemVyIGV4aXN0c1xuICAgICAgICBpZiAocmVjb2duaXplcikge1xuICAgICAgICAgICAgdmFyIHJlY29nbml6ZXJzID0gdGhpcy5yZWNvZ25pemVycztcbiAgICAgICAgICAgIHZhciBpbmRleCA9IGluQXJyYXkocmVjb2duaXplcnMsIHJlY29nbml6ZXIpO1xuXG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmVjb2duaXplcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGJpbmQgZXZlbnRcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgICAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICBvbjogZnVuY3Rpb24oZXZlbnRzLCBoYW5kbGVyKSB7XG4gICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYW5kbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnM7XG4gICAgICAgIGVhY2goc3BsaXRTdHIoZXZlbnRzKSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGhhbmRsZXJzW2V2ZW50XSA9IGhhbmRsZXJzW2V2ZW50XSB8fCBbXTtcbiAgICAgICAgICAgIGhhbmRsZXJzW2V2ZW50XS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHVuYmluZCBldmVudCwgbGVhdmUgZW1pdCBibGFuayB0byByZW1vdmUgYWxsIGhhbmRsZXJzXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50c1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtoYW5kbGVyXVxuICAgICAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICBvZmY6IGZ1bmN0aW9uKGV2ZW50cywgaGFuZGxlcikge1xuICAgICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnM7XG4gICAgICAgIGVhY2goc3BsaXRTdHIoZXZlbnRzKSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGVyc1tldmVudF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW2V2ZW50XSAmJiBoYW5kbGVyc1tldmVudF0uc3BsaWNlKGluQXJyYXkoaGFuZGxlcnNbZXZlbnRdLCBoYW5kbGVyKSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZW1pdCBldmVudCB0byB0aGUgbGlzdGVuZXJzXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICAgKi9cbiAgICBlbWl0OiBmdW5jdGlvbihldmVudCwgZGF0YSkge1xuICAgICAgICAvLyB3ZSBhbHNvIHdhbnQgdG8gdHJpZ2dlciBkb20gZXZlbnRzXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZG9tRXZlbnRzKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRG9tRXZlbnQoZXZlbnQsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm8gaGFuZGxlcnMsIHNvIHNraXAgaXQgYWxsXG4gICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnNbZXZlbnRdICYmIHRoaXMuaGFuZGxlcnNbZXZlbnRdLnNsaWNlKCk7XG4gICAgICAgIGlmICghaGFuZGxlcnMgfHwgIWhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YS50eXBlID0gZXZlbnQ7XG4gICAgICAgIGRhdGEucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGRhdGEuc3JjRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfTtcblxuICAgICAgICB2Y
46184XIgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgaGFuZGxlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBoYW5kbGVyc1tpXShkYXRhKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBkZXN0cm95IHRoZSBtYW5hZ2VyIGFuZCB1bmJpbmRzIGFsbCBldmVudHNcbiAgICAgKiBpdCBkb2Vzbid0IHVuYmluZCBkb20gZXZlbnRzLCB0aGF0IGlzIHRoZSB1c2VyIG93biByZXNwb25zaWJpbGl0eVxuICAgICAqL1xuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQgJiYgdG9nZ2xlQ3NzUHJvcHModGhpcywgZmFsc2UpO1xuXG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5zZXNzaW9uID0ge307XG4gICAgICAgIHRoaXMuaW5wdXQuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBudWxsO1xuICAgIH1cbn07XG5cbi8qKlxuICogYWRkL3JlbW92ZSB0aGUgY3NzIHByb3BlcnRpZXMgYXMgZGVmaW5lZCBpbiBtYW5hZ2VyLm9wdGlvbnMuY3NzUHJvcHNcbiAqIEBwYXJhbSB7TWFuYWdlcn0gbWFuYWdlclxuICogQHBhcmFtIHtCb29sZWFufSBhZGRcbiAqL1xuZnVuY3Rpb24gdG9nZ2xlQ3NzUHJvcHMobWFuYWdlciwgYWRkKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBtYW5hZ2VyLmVsZW1lbnQ7XG4gICAgaWYgKCFlbGVtZW50LnN0eWxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHByb3A7XG4gICAgZWFjaChtYW5hZ2VyLm9wdGlvbnMuY3NzUHJvcHMsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIHByb3AgPSBwcmVmaXhlZChlbGVtZW50LnN0eWxlLCBuYW1lKTtcbiAgICAgICAgaWYgKGFkZCkge1xuICAgICAgICAgICAgbWFuYWdlci5vbGRDc3NQcm9wc1twcm9wXSA9IGVsZW1lbnQuc3R5bGVbcHJvcF07XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gbWFuYWdlci5vbGRDc3NQcm9wc1twcm9wXSB8fCAnJztcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghYWRkKSB7XG4gICAgICAgIG1hbmFnZXIub2xkQ3NzUHJvcHMgPSB7fTtcbiAgICB9XG59XG5cbi8qKlxuICogdHJpZ2dlciBkb20gZXZlbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAqL1xuZnVuY3Rpb24gdHJpZ2dlckRvbUV2ZW50KGV2ZW50LCBkYXRhKSB7XG4gICAgdmFyIGdlc3R1cmVFdmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGdlc3R1cmVFdmVudC5pbml0RXZlbnQoZXZlbnQsIHRydWUsIHRydWUpO1xuICAgIGdlc3R1cmVFdmVudC5nZXN0dXJlID0gZGF0YTtcbiAgICBkYXRhLnRhcmdldC5kaXNwYXRjaEV2ZW50KGdlc3R1cmVFdmVudCk7XG59XG5cbmFzc2lnbihIYW1tZXIsIHtcbiAgICBJTlBVVF9TVEFSVDogSU5QVVRfU1RBUlQsXG4gICAgSU5QVVRfTU9WRTogSU5QVVRfTU9WRSxcbiAgICBJTlBVVF9FTkQ6IElOUFVUX0VORCxcbiAgICBJTlBVVF9DQU5DRUw6IElOUFVUX0NBTkNFTCxcblxuICAgIFNUQVRFX1BPU1NJQkxFOiBTVEFURV9QT1NTSUJMRSxcbiAgICBTVEFURV9CRUdBTjogU1RBVEVfQkVHQU4sXG4gICAgU1RBVEVfQ0hBTkdFRDogU1RBVEVfQ0hBTkdFRCxcbiAgICBTVEFURV9FTkRFRDogU1RBVEVfRU5ERUQsXG4gICAgU1RBVEVfUkVDT0dOSVpFRDogU1RBVEVfUkVDT0dOSVpFRCxcbiAgICBTVEFURV9DQU5DRUxMRUQ6IFNUQVRFX0NBTkNFTExFRCxcbiAgICBTVEFURV9GQUlMRUQ6IFNUQVRFX0ZBSUxFRCxcblxuICAgIERJUkVDVElPTl9OT05FOiBESVJFQ1RJT05fTk9ORSxcbiAgICBESVJFQ1RJT05fTEVGVDogRElSRUNUSU9OX0xFRlQsXG4gICAgRElSRUNUSU9OX1JJR0hUOiBESVJFQ1RJT05fUklHSFQsXG4gICAgRElSRUNUSU9OX1VQOiBESVJFQ1RJT05fVVAsXG4gICAgRElSRUNUSU9OX0RPV046IERJUkVDVElPTl9ET1dOLFxuICAgIERJUkVDVElPTl9IT1JJWk9OVEFMOiBESVJFQ1RJT05fSE9SSVpPTlRBTCxcbiAgICBESVJFQ1RJT05fVkVSVElDQUw6IERJUkVDVElPTl9WRVJUSUNBTC
46184xcbiAgICBESVJFQ1RJT05fQUxMOiBESVJFQ1RJT05fQUxMLFxuXG4gICAgTWFuYWdlcjogTWFuYWdlcixcbiAgICBJbnB1dDogSW5wdXQsXG4gICAgVG91Y2hBY3Rpb246IFRvdWNoQWN0aW9uLFxuXG4gICAgVG91Y2hJbnB1dDogVG91Y2hJbnB1dCxcbiAgICBNb3VzZUlucHV0OiBNb3VzZUlucHV0LFxuICAgIFBvaW50ZXJFdmVudElucHV0OiBQb2ludGVyRXZlbnRJbnB1dCxcbiAgICBUb3VjaE1vdXNlSW5wdXQ6IFRvdWNoTW91c2VJbnB1dCxcbiAgICBTaW5nbGVUb3VjaElucHV0OiBTaW5nbGVUb3VjaElucHV0LFxuXG4gICAgUmVjb2duaXplcjogUmVjb2duaXplcixcbiAgICBBdHRyUmVjb2duaXplcjogQXR0clJlY29nbml6ZXIsXG4gICAgVGFwOiBUYXBSZWNvZ25pemVyLFxuICAgIFBhbjogUGFuUmVjb2duaXplcixcbiAgICBTd2lwZTogU3dpcGVSZWNvZ25pemVyLFxuICAgIFBpbmNoOiBQaW5jaFJlY29nbml6ZXIsXG4gICAgUm90YXRlOiBSb3RhdGVSZWNvZ25pemVyLFxuICAgIFByZXNzOiBQcmVzc1JlY29nbml6ZXIsXG5cbiAgICBvbjogYWRkRXZlbnRMaXN0ZW5lcnMsXG4gICAgb2ZmOiByZW1vdmVFdmVudExpc3RlbmVycyxcbiAgICBlYWNoOiBlYWNoLFxuICAgIG1lcmdlOiBtZXJnZSxcbiAgICBleHRlbmQ6IGV4dGVuZCxcbiAgICBhc3NpZ246IGFzc2lnbixcbiAgICBpbmhlcml0OiBpbmhlcml0LFxuICAgIGJpbmRGbjogYmluZEZuLFxuICAgIHByZWZpeGVkOiBwcmVmaXhlZFxufSk7XG5cbi8vIHRoaXMgcHJldmVudHMgZXJyb3JzIHdoZW4gSGFtbWVyIGlzIGxvYWRlZCBpbiB0aGUgcHJlc2VuY2Ugb2YgYW4gQU1EXG4vLyAgc3R5bGUgbG9hZGVyIGJ1dCBieSBzY3JpcHQgdGFnLCBub3QgYnkgdGhlIGxvYWRlci5cbnZhciBmcmVlR2xvYmFsID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fSkpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmZyZWVHbG9iYWwuSGFtbWVyID0gSGFtbWVyO1xuXG5pZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gSGFtbWVyO1xuICAgIH0pO1xufSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBIYW1tZXI7XG59IGVsc2Uge1xuICAgIHdpbmRvd1tleHBvcnROYW1lXSA9IEhhbW1lcjtcbn1cblxufSkod2luZG93LCBkb2N1bWVudCwgJ0hhbW1lcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbi8qKlxuICogaW50ZXJuYWwgc3RvcmFnZSBmb3IgY3VzdG9tIGVycm9yIG1lc3NhZ2VzXG4gKi9cbmNvbnN0IHN0b3JlID0gbmV3IFdlYWtNYXAoKTtcblxuXG4vKipcbiAqIHJlZ2lzdGVyIGN1c3RvbSBlcnJvciBtZXNzYWdlcyBwZXIgZWxlbWVudFxuICovXG5jb25zdCBjdXN0b21fbWVzc2FnZXMgPSB7XG5cbiAgc2V0KGVsZW1lbnQsIHZhbGlkYXRvciwgbWVzc2FnZSkge1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gc3RvcmUuZ2V0KGVsZW1lbnQpIHx8IHt9O1xuICAgIG1lc3NhZ2VzW3ZhbGlkYXRvcl0gPSBtZXNzYWdlO1xuICAgIHN0b3JlLnNldChlbGVtZW50LCBtZXNzYWdlcyk7XG4gICAgcmV0dXJuIGN1c3RvbV9tZXNzYWdlcztcbiAgfSxcblxuICBnZXQoZWxlbWVudCwgdmFsaWRhdG9yLCBfZGVmYXVsdD11bmRlZmluZWQpIHtcbiAgICBjb25zdCBtZXNzYWdlcyA9IHN0b3JlLmdldChlbGVtZW50KTtcbiAgICBpZiAobWVzc2FnZXMgPT09IHVuZGVmaW5lZCB8fCAhICh2YWxpZGF0b3IgaW4gbWVzc2FnZXMpKSB7XG4gICAgICBjb25zdCBkYXRhX2lkID0gJ2RhdGEtJyArIHZhbGlkYXRvci5yZXBsYWNlKC9bQS1aXS9nLCAnLSQmJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShkYXRhX2lkKSkge1xuICAgICAgICAvKiBpZiB0aGUgZWxlbWVudCBoYXMgYSBkYXRhLXZhbGlkYXRvciBhdHRyaWJ1dGUsIHVzZSB0aGlzIGFzIGZhbGxiYWNrLlxuICAgICAgICAgKiBFLmcuLCBpZiB2YWxpZGF0b3IgPT0gJ3ZhbHVlTWlzc2luZycsIHRoZSBlbGVtZW50IGNhbiBzcGVjaWZ5IGFcbiAgICAgICAgICogY3VzdG9tIHZhbGlkYXRpb24gbWVzc2FnZSBsaWtlIHRoaXM6XG4gICAgICAgICAqICAgICA8aW5wdXQgZGF0YS12YWx1ZS1taXNzaW5nPVwiT2ggbm9lcyFcIj5cbiAgICAgICAgICovXG4gICAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShkYXRhX2lkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfZGVmYXVsdDtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2VzW3ZhbGlkYXRvcl07XG4gIH0sXG5cbiAgZGVsZXRlKGVsZW1lbnQsIHZhbGlkYXRvcj1udWxsKSB7XG4gICAgaWYgKCEgdmFsaWRhdG9yKSB7XG4gICAgICByZXR1cm4gc3RvcmUuZGVsZXRlKGVsZW1lbnQpO1xuICAgIH1cbiAgICBjb25zdCBtZXNzYWdlcyA9IHN0b3JlLmdldChlbGVtZW50KSB8fCB7fTtcbiAgICBpZiAodmFsaWRhdG9yIGluIG1lc3NhZ2VzKSB7XG4gICAgICBkZWxldGUobWVzc2FnZXNbdmFsaWRhdG9yXSk7XG4gICAgICBzdG9yZS5zZXQoZWxlbWVudCwgbWVzc2FnZXMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxufTtcblxuZXhwb3J0IGRlZmF1bHQgY3VzdG9tX21lc3NhZ2VzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmNvbnN0IHJlZ2lzdHJ5ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuXG4vKipcbiAqIHJ1biBhbGwgYWN0aW9ucyByZWdpc3RlcmVkIGZvciBhIGhvb2tcbiAqXG4gKiBFdmVyeSBhY3Rpb24gZ2V0cyBjYWxsZWQgd2l0aCBhIHN0YXRlIG9iamVjdCBhcyBgdGhpc2AgYXJndW1lbnQgYW5kIHdpdGggdGhlXG4gKiBob29rJ3MgY2FsbCBhcmd1bWVudHMgYXMgY2FsbCBhcmd1bWVudHMuXG4gKlxuICogQHJldHVybiBtaXhlZCB0aGUgcmV0dXJuZWQgdmFsdWUgb2YgdGhlIGFjdGlvbiBjYWxscyBvciB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGxfaG9vayhob29rKSB7XG4gIHZhciByZXN1bHQ7XG4gIGNvbnN0IGNhbGxfYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG5cbiAgaWYgKGhvb2sgaW4gcmVnaXN0cnkpIHtcbiAgICByZXN1bHQgPSByZWdpc3RyeVtob29rXS5yZWR1Y2UoKGZ1bmN0aW9uKGFyZ3MpIHtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHByZXZpb3VzUmVzdWx0LCBjdXJyZW50QWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGludGVyaW1SZXN1bHQgPSBjdXJyZW50QWN0aW9uLmFwcGx5KHtcbiAgICAgICAgICBzdGF0ZTogcHJldmlvdXNSZXN1bHQsXG4gICAgICAgICAgaG9vazogaG9vayxcbiAgICAgICAgfSwgYXJncyk7XG4gICAgICAgI
46184HJldHVybiAoaW50ZXJpbVJlc3VsdCAhPT0gdW5kZWZpbmVkKT8gaW50ZXJpbVJlc3VsdCA6IHByZXZpb3VzUmVzdWx0O1xuICAgICAgfTtcblxuICAgIH0pKGNhbGxfYXJncyksIHJlc3VsdCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZpbHRlciBhIHZhbHVlIHRocm91Z2ggaG9va2VkIGZ1bmN0aW9uc1xuICpcbiAqIEFsbG93cyBmb3IgYWRkaXRpb25hbCBwYXJhbWV0ZXJzOlxuICoganM+IGRvX2ZpbHRlcignZm9vJywgbnVsbCwgY3VycmVudF9lbGVtZW50KVxuICovXG5leHBvcnQgZnVuY3Rpb24gZG9fZmlsdGVyKGhvb2ssIGluaXRpYWxfdmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IGluaXRpYWxfdmFsdWU7XG4gIHZhciBjYWxsX2FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG4gIGlmIChob29rIGluIHJlZ2lzdHJ5KSB7XG4gICAgcmVzdWx0ID0gcmVnaXN0cnlbaG9va10ucmVkdWNlKGZ1bmN0aW9uKHByZXZpb3VzUmVzdWx0LCBjdXJyZW50QWN0aW9uKSB7XG4gICAgICBjYWxsX2FyZ3NbMF0gPSBwcmV2aW91c1Jlc3VsdDtcbiAgICAgIGNvbnN0IGludGVyaW1SZXN1bHQgPSBjdXJyZW50QWN0aW9uLmFwcGx5KHtcbiAgICAgICAgc3RhdGU6IHByZXZpb3VzUmVzdWx0LFxuICAgICAgICBob29rOiBob29rLFxuICAgICAgfSwgY2FsbF9hcmdzKTtcbiAgICAgIHJldHVybiAoaW50ZXJpbVJlc3VsdCAhPT0gdW5kZWZpbmVkKT8gaW50ZXJpbVJlc3VsdCA6IHByZXZpb3VzUmVzdWx0O1xuICAgIH0sIHJlc3VsdCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIHJlbW92ZSBhbiBhY3Rpb24gYWdhaW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZV9ob29rKGhvb2ssIGFjdGlvbikge1xuICBpZiAoaG9vayBpbiByZWdpc3RyeSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVnaXN0cnlbaG9va10ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWdpc3RyeVtob29rXVtpXSA9PT0gYWN0aW9uKSB7XG4gICAgICAgIHJlZ2lzdHJ5W2hvb2tdLnNwbGljZShpLCAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5leHBvcnQgeyByZW1vdmVfaG9vayBhcyByZW1vdmVfZmlsdGVyIH07XG5cbi8qKlxuICogYWRkIGFuIGFjdGlvbiB0byBhIGhvb2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZF9ob29rKGhvb2ssIGFjdGlvbiwgcG9zaXRpb24pIHtcbiAgaWYgKCEgKGhvb2sgaW4gcmVnaXN0cnkpKSB7XG4gICAgcmVnaXN0cnlbaG9va10gPSBbXTtcbiAgfVxuICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIHBvc2l0aW9uID0gcmVnaXN0cnlbaG9va10ubGVuZ3RoO1xuICB9XG4gIHJlZ2lzdHJ5W2hvb2tdLnNwbGljZShwb3NpdGlvbiwgMCwgYWN0aW9uKTtcbn1cbmV4cG9ydCB7IGFkZF9ob29rIGFzIGFkZF9maWx0ZXIgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG4vKipcbiAqIHRoZSBmb2xsb3dpbmcgdmFsaWRhdGlvbiBtZXNzYWdlcyBhcmUgZnJvbSBGaXJlZm94IHNvdXJjZSxcbiAqIGh0dHA6Ly9teHIubW96aWxsYS5vcmcvbW96aWxsYS1jZW50cmFsL3NvdXJjZS9kb20vbG9jYWxlcy9lbi1VUy9jaHJvbWUvZG9tL2RvbS5wcm9wZXJ0aWVzXG4gKiByZWxlYXNlZCB1bmRlciBNUEwgbGljZW5zZSwgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5jb25zdCBjYXRhbG9nID0ge1xuICBlbjoge1xuICAgIFRleHRUb29Mb25nOiAnUGxlYXNlIHNob3J0ZW4gdGhpcyB0ZXh0IHRvICVsIGNoYXJhY3RlcnMgb3IgbGVzcyAoeW91IGFyZSBjdXJyZW50bHkgdXNpbmcgJWwgY2hhcmFjdGVycykuJyxcbiAgICBWYWx1ZU1pc3Npbmc6ICdQbGVhc2UgZmlsbCBvdXQgdGhpcyBmaWVsZC4nLFxuICAgIENoZWNrYm94TWlzc2luZzogJ1BsZWFzZSBjaGVjayB0aGlzIGJveCBpZiB5b3Ugd2FudCB0byBwcm9jZWVkLicsXG4gICAgUmFkaW9NaXNzaW5nOiAnUGxlYXNlIHNlbGVjdCBvbmUgb2YgdGhlc2Ugb3B0aW9ucy4nLFxuICAgIEZpbGVNaXNzaW5nOiAnUGxlYXNlIHNlbGVjdCBhIGZpbGUuJyxcbiAgICBTZWxlY3RNaXNzaW5nOiAnUGxlYXNlIHNlbGVjdCBhbiBpdGVtIGluIHRoZSBsaXN0LicsXG4gICAgSW52YWxpZEVtYWlsOiAnUGxlYXNlIGVudGVyIGFuIGVtYWlsIGFkZHJlc3MuJyxcbiAgICBJbnZhbGlkVVJMOiAnUGxlYXNlIGVudGVyIGEgVVJMLicsXG4gICAgUGF0dGVybk1pc21hdGNoOiAnUGxlYXNlIG1hdGNoIHRoZSByZXF1ZXN0ZWQgZm9ybWF0LicsXG4gICAgUGF0dGVybk1pc21hdGNoV2l0aFRpdGxlOiAnUGxlYXNlIG1hdGNoIHRoZSByZXF1ZXN0ZWQgZm9ybWF0OiAlbC4nLFxuICAgIE51bWJlclJhbmdlT3ZlcmZsb3c6ICdQbGVhc2Ugc2VsZWN0IGEgdmFsdWUgdGhhdCBpcyBubyBtb3JlIHRoYW4gJWwuJyxcbiAgICBEYXRlUmFuZ2VPdmVyZmxvdzogJ1BsZWFzZSBzZWxlY3QgYSB2YWx1ZSB0aGF0IGlzIG5vIGxhdGVyIHRoYW4gJWwuJyxcbiAgICBUaW1lUmFuZ2VPdmVyZmxvdzogJ1BsZWFzZSBzZWxlY3QgYSB2YWx1ZSB0aGF0IGlzIG5vIGxhdGVyIHRoYW4gJWwuJyxcbiAgICBOdW1iZXJSYW5nZVVuZGVyZmxvdzogJ1BsZWFzZSBzZWxlY3QgYSB2YWx1ZSB0aGF0IGlzIG5vIGxlc3MgdGhhbiAlbC4nLFxuICAgIERhdGVSYW5nZVVuZGVyZmxvdzogJ1BsZWFzZSBzZWxlY3QgYSB2YWx1ZSB0aGF0IGlzIG5vIGVhcmxpZXIgdGhhbiAlbC4nLFxuICAgIFRpbWVSYW5nZVVuZGVyZmxvdzogJ1BsZWFzZSBzZWxlY3QgYSB2YWx1ZSB0aGF0IGlzIG5vIGVhcmxpZXIgdGhhbiAlbC4nLFxuICAgIFN0ZXBNaXNtYXRjaDogJ1BsZWFzZSBzZWxlY3QgYSB2YWxpZCB2YWx1ZS4gVGhlIHR3byBuZWFyZXN0IHZhbGlkIHZhbHVlcyBhcmUgJWwgYW5kICVsLicsXG4gICAgU3RlcE1pc21hdGNoT25lVmFsdWU6ICdQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgdmFsdWUuIFRoZSBuZWFyZXN0IHZhbGlkIHZhbHVlIGlzICVsLicsXG4gICAgQmFkSW5wdXROdW1iZXI6ICdQbGVhc2UgZW50ZXIgYSBudW1iZXIuJyxcbiAgfSxcbn07XG5cblxuLyoqXG4gKiB0aGUgZ2xvYmFsIGxhbmd1YWdlIEh5cGVyZm9ybSB3aWxsIHVzZVxuICovXG52YXIgbGFuZ3VhZ2UgPSAnZW4nO1xuXG5cbi8qKlxuICogdGhlIGJhc2UgbGFuZ3VhZ2UgYWNjb3JkaW5nIHRvIEJDUDQ3LCBpLmUuLCBvbmx5IHRoZSBwaWVjZSBiZWZvcmUgdGhlIGZpcnN0IGh5cGhlblxuICovXG52YXIgYmFzZV9sYW5nID0gJ2VuJztcblxuXG4vKipcbiAqIHNldCB0aGUgbGFuZ3VhZ2UgZm9yIEh5cGVyZm9ybeKAmXMgbWVzc2FnZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldF9sYW5ndWFnZShuZXdsYW5nKSB7XG4gIGxhbmd1YWdlID0gbmV3bGFuZztcbiAgYmFzZV9sYW5nID0gbmV3bGFuZy5yZXBsYWNlKC9bLV9dLiovLCAnJyk7XG59XG5cblxuLyoqXG4gKiBhZGQgYSBsb29rdXAgY2F0YWxvZyBcInN0cmluZzogdHJhbnNsYXRpb25cIiBmb3IgYSBsYW5ndWFnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkX3RyYW5zbGF0aW9uKGxhbmcsIG5ld19jYXRhbG9nKSB7XG4gIGlmICghIC
46184hsYW5nIGluIGNhdGFsb2cpKSB7XG4gICAgY2F0YWxvZ1tsYW5nXSA9IHt9O1xuICB9XG4gIGZvciAobGV0IGtleSBpbiBuZXdfY2F0YWxvZykge1xuICAgIGlmIChuZXdfY2F0YWxvZy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBjYXRhbG9nW2xhbmddW2tleV0gPSBuZXdfY2F0YWxvZ1trZXldO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qKlxuICogcmV0dXJuIGBzYCB0cmFuc2xhdGVkIGludG8gdGhlIGN1cnJlbnQgbGFuZ3VhZ2VcbiAqXG4gKiBEZWZhdWx0cyB0byB0aGUgYmFzZSBsYW5ndWFnZSBhbmQgdGhlbiBFbmdsaXNoIGlmIHRoZSBmb3JtZXIgaGFzIG5vXG4gKiB0cmFuc2xhdGlvbiBmb3IgYHNgLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzKSB7XG4gIGlmICgobGFuZ3VhZ2UgaW4gY2F0YWxvZykgJiYgKHMgaW4gY2F0YWxvZ1tsYW5ndWFnZV0pKSB7XG4gICAgcmV0dXJuIGNhdGFsb2dbbGFuZ3VhZ2VdW3NdO1xuICB9IGVsc2UgaWYgKChiYXNlX2xhbmcgaW4gY2F0YWxvZykgJiYgKHMgaW4gY2F0YWxvZ1tiYXNlX2xhbmddKSkge1xuICAgIHJldHVybiBjYXRhbG9nW2Jhc2VfbGFuZ11bc107XG4gIH0gZWxzZSBpZiAocyBpbiBjYXRhbG9nLmVuKSB7XG4gICAgcmV0dXJuIGNhdGFsb2cuZW5bc107XG4gIH1cbiAgcmV0dXJuIHM7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxuaW1wb3J0IHsgZ2V0X3dyYXBwZXIgfSBmcm9tICcuL3dyYXBwZXInO1xuaW1wb3J0IG1hcmsgZnJvbSAnLi4vdG9vbHMvbWFyayc7XG5cblxuLyoqXG4gKiB0aGUgaW50ZXJuYWwgc3RvcmFnZSBmb3IgbWVzc2FnZXNcbiAqL1xuY29uc3Qgc3RvcmUgPSBuZXcgV2Vha01hcCgpO1xuXG5cbi8qIGpzaGludCAtVzA1MyAqLy8qIGFsbG93IG5ldyBTdHJpbmcoKSAqL1xuLyoqXG4gKiBoYW5kbGUgdmFsaWRhdGlvbiBtZXNzYWdlc1xuICpcbiAqIEZhbGxzIGJhY2sgdG8gYnJvd3Nlci1uYXRpdmUgZXJyb3JzLCBpZiBhbnkgYXJlIGF2YWlsYWJsZS4gVGhlIG1lc3NhZ2VzXG4gKiBhcmUgU3RyaW5nIG9iamVjdHMgc28gdGhhdCB3ZSBjYW4gbWFyaygpIHRoZW0uXG4gKi9cbmNvbnN0IG1lc3NhZ2Vfc3RvcmUgPSB7XG5cbiAgc2V0KGVsZW1lbnQsIG1lc3NhZ2UsIGlzX2N1c3RvbT1mYWxzZSkge1xuICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2Ygd2luZG93LkhUTUxGaWVsZFNldEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHdyYXBwZWRfZm9ybSA9IGdldF93cmFwcGVyKGVsZW1lbnQpO1xuICAgICAgaWYgKHdyYXBwZWRfZm9ybSAmJiAhIHdyYXBwZWRfZm9ybS5zZXR0aW5ncy5leHRlbmRGaWVsZHNldCkge1xuICAgICAgICAvKiBtYWtlIHRoaXMgYSBuby1vcCBmb3IgPGZpZWxkc2V0PiBpbiBzdHJpY3QgbW9kZSAqL1xuICAgICAgICByZXR1cm4gbWVzc2FnZV9zdG9yZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBtZXNzYWdlID0gbmV3IFN0cmluZyhtZXNzYWdlKTtcbiAgICB9XG4gICAgaWYgKGlzX2N1c3RvbSkge1xuICAgICAgbWVzc2FnZS5pc19jdXN0b20gPSB0cnVlO1xuICAgIH1cbiAgICBtYXJrKG1lc3NhZ2UpO1xuICAgIHN0b3JlLnNldChlbGVtZW50LCBtZXNzYWdlKTtcblxuICAgIC8qIGFsbG93IHRoZSA6aW52YWxpZCBzZWxlY3RvciB0byBtYXRjaCAqL1xuICAgIGlmICgnX29yaWdpbmFsX3NldEN1c3RvbVZhbGlkaXR5JyBpbiBlbGVtZW50KSB7XG4gICAgICBlbGVtZW50Ll9vcmlnaW5hbF9zZXRDdXN0b21WYWxpZGl0eShtZXNzYWdlLnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBtZXNzYWdlX3N0b3JlO1xuICB9LFxuXG4gIGdldChlbGVtZW50KSB7XG4gICAgdmFyIG1lc3NhZ2UgPSBzdG9yZS5nZXQoZWxlbWVudCk7XG4gICAgaWYgKG1lc3NhZ2UgPT09IHVuZGVmaW5lZCAmJiAoJ19vcmlnaW5hbF92YWxpZGF0aW9uTWVzc2FnZScgaW4gZWxlbWVudCkpIHtcbiAgICAgIC8qIGdldCB0aGUgYnJvd3NlcidzIHZhbGlkYXRpb24gbWVzc2FnZSwgaWYgd2UgaGF2ZSBub25lLiBNYXliZSBpdFxuICAgICAgICoga25vd3MgbW9yZSB0aGFuIHdlLiAqL1xuICAgICAgbWVzc2FnZSA9IG5ldyBTdHJpbmcoZWxlbWVudC5fb3JpZ2luYWxfdmFsaWRhdGlvbk1lc3NhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZT8gbWVzc2FnZSA6IG5ldyBTdHJpbmcoJycpO1xuICB9LFxuXG4gIGRlbGV0ZShlbGVtZW50LCBpc19jdXN0b209ZmFsc2UpIHtcbiAgICBpZiAoJ19vcmlnaW5hbF9zZXRDdXN0b21WYWxpZGl0eScgaW4gZWxlbWVudCkge1xuICAgICAgZWxlbWVudC5fb3JpZ2luYWxfc2V0Q3VzdG9tVmFsaWRpdHkoJycpO1xuICAgIH1cbiAgICB2YXIgbWVzc2FnZSA9IHN0b3JlLmdldChlbGVtZW50KTtcbiAgICBpZiAobWVzc2FnZSAmJiBpc19jdXN0b20gJiYgISBtZXNzYWdlLmlzX2N1c3RvbSkge1xuICAgICAgLyogZG8gbm90IGRlbGV0ZSBcIm5hdGl2ZVwiIG1lc3NhZ2VzLCBpZiBhc2tlZCAqL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc3RvcmUuZGVsZXRlKGVsZW1lbnQpO1xuICB9LFxuXG59O1xuLyoganNoaW50ICtXMDUzICovXG5cbmV4cG9ydCB7IG1lc3NhZ2Vfc3RvcmUgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG5jb25zdCBpbnRlcm5hbF9yZWdpc3RyeSA9IG5ldyBXZWFrTWFwKCk7XG5cblxuLyoqXG4gKiBBIHJlZ2lzdHJ5IGZvciBjdXN0b20gdmFsaWRhdG9yc1xuICpcbiAqIHNsaW0gd3JhcHBlciBhcm91bmQgYSBXZWFrTWFwIHRvIGVuc3VyZSB0aGUgdmFsdWVzIGFyZSBhcnJheXNcbiAqIChoZW5jZSBhbGxvd2luZyA+IDEgdmFsaWRhdG9ycyBwZXIgZWxlbWVudClcbiAqL1xuY29uc3QgY3VzdG9tX3ZhbGlkYXRvcl9yZWdpc3RyeSA9IHtcblxuICBzZXQoZWxlbWVudCwgdmFsaWRhdG9yKSB7XG4gICAgY29uc3QgY3VycmVudCA9IGludGVybmFsX3JlZ2lzdHJ5LmdldChlbGVtZW50KSB8fCBbXTtcbiAgICBjdXJyZW50LnB1c2godmFsaWRhdG9yKTtcbiAgICBpbnRlcm5hbF9yZWdpc3RyeS5zZXQoZWxlbWVudCwgY3VycmVudCk7XG4gICAgcmV0dXJuIGN1c3RvbV92YWxpZGF0b3JfcmVnaXN0cnk7XG4gIH0sXG5cbiAgZ2V0KGVsZW1lbnQpIHtcbiAgICByZXR1cm4gaW50ZXJuYWxfcmVnaXN0cnkuZ2V0KGVsZW1lbnQpIHx8IFtdO1xuICB9LFxuXG4gIGRlbGV0ZShlbGVtZW50KSB7XG4gICAgcmV0dXJuIGludGVybmFsX3JlZ2lzdHJ5LmRlbGV0ZShlbGVtZW50KTtcbiAgfSxcblxufTtcblxuZXhwb3J0IGRlZmF1bHQgY3VzdG9tX3ZhbGlkYXRvcl9yZWdpc3RyeTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgeyBtZXNzYWdlX3N0b3JlIH0gZnJvbSAnLi9tZXNzYWdlX3N0b3JlJztcbmltcG9ydCB7
46184IGdldF93cmFwcGVyIH0gZnJvbSAnLi93cmFwcGVyJztcbmltcG9ydCBnZW5lcmF0ZV9pZCBmcm9tICcuLi90b29scy9nZW5lcmF0ZV9pZCc7XG5pbXBvcnQgeyBnZXRfcmFkaW9ncm91cCB9IGZyb20gJy4uL3Rvb2xzL2dldF9yYWRpb2dyb3VwJztcblxuXG5jb25zdCB3YXJuaW5nc0NhY2hlID0gbmV3IFdlYWtNYXAoKTtcblxuXG5jb25zdCBEZWZhdWx0UmVuZGVyZXIgPSB7XG5cbiAgLyoqXG4gICAqIGNhbGxlZCB3aGVuIGEgd2FybmluZyBzaG91bGQgYmVjb21lIHZpc2libGVcbiAgICovXG4gIGF0dGFjaFdhcm5pbmc6IGZ1bmN0aW9uKHdhcm5pbmcsIGVsZW1lbnQpIHtcbiAgICAvKiBzaG91bGQgYWxzbyB3b3JrLCBpZiBlbGVtZW50IGlzIGxhc3QsXG4gICAgICogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDc5MzYzMC8xMTMxOTUgKi9cbiAgICBlbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHdhcm5pbmcsIGVsZW1lbnQubmV4dFNpYmxpbmcpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBjYWxsZWQgd2hlbiBhIHdhcm5pbmcgc2hvdWxkIHZhbmlzaFxuICAgKi9cbiAgZGV0YWNoV2FybmluZzogZnVuY3Rpb24od2FybmluZywgZWxlbWVudCkge1xuICAgIC8qIGJlIGNvbnNlcnZhdGl2ZSBoZXJlLCBzaW5jZSBhbiBvdmVyd3JpdHRlbiBhdHRhY2hXYXJuaW5nKCkgbWlnaHQgbm90XG4gICAgICogYWN0dWFsbHkgaGF2ZSBhdHRhY2hlZCB0aGUgd2FybmluZy4gKi9cbiAgICBpZiAod2FybmluZy5wYXJlbnROb2RlKSB7XG4gICAgICB3YXJuaW5nLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQod2FybmluZyk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBjYWxsZWQgd2hlbiBmZWVkYmFjayB0byBhbiBlbGVtZW50J3Mgc3RhdGUgc2hvdWxkIGJlIGhhbmRsZWRcbiAgICpcbiAgICogaS5lLiwgc2hvd2luZyBhbmQgaGlkaW5nIHdhcm5pbmdzXG4gICAqL1xuICBzaG93V2FybmluZzogZnVuY3Rpb24oZWxlbWVudCwgd2hvbGVfZm9ybV92YWxpZGF0ZWQ9ZmFsc2UpIHtcbiAgICAvKiBkb24ndCByZW5kZXIgZXJyb3IgbWVzc2FnZXMgb24gc3Vic2VxdWVudCByYWRpbyBidXR0b25zIG9mIHRoZVxuICAgICAqIHNhbWUgZ3JvdXAuIFRoaXMgYXNzdW1lcywgdGhhdCBlbGVtZW50LnZhbGlkaXR5LnZhbHVlTWlzc2luZyBpcyB0aGUgb25seVxuICAgICAqIHBvc3NpYmxlIHZhbGlkYXRpb24gZmFpbHVyZSBmb3IgcmFkaW8gYnV0dG9ucy4gKi9cbiAgICBpZiAod2hvbGVfZm9ybV92YWxpZGF0ZWQgJiYgZWxlbWVudC50eXBlID09PSAncmFkaW8nICYmXG4gICAgICAgIGdldF9yYWRpb2dyb3VwKGVsZW1lbnQpWzBdICE9PSBlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbXNnID0gbWVzc2FnZV9zdG9yZS5nZXQoZWxlbWVudCkudG9TdHJpbmcoKTtcbiAgICB2YXIgd2FybmluZyA9IHdhcm5pbmdzQ2FjaGUuZ2V0KGVsZW1lbnQpO1xuXG4gICAgaWYgKG1zZykge1xuICAgICAgaWYgKCEgd2FybmluZykge1xuICAgICAgICBjb25zdCB3cmFwcGVyID0gZ2V0X3dyYXBwZXIoZWxlbWVudCk7XG4gICAgICAgIHdhcm5pbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgd2FybmluZy5jbGFzc05hbWUgPSB3cmFwcGVyICYmIHdyYXBwZXIuc2V0dGluZ3MuY2xhc3Nlcy53YXJuaW5nIHx8ICdoZi13YXJuaW5nJztcbiAgICAgICAgd2FybmluZy5pZCA9IGdlbmVyYXRlX2lkKCk7XG4gICAgICAgIHdhcm5pbmcuc2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnLCAncG9saXRlJyk7XG4gICAgICAgIHdhcm5pbmdzQ2FjaGUuc2V0KGVsZW1lbnQsIHdhcm5pbmcpO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1lcnJvcm1lc3NhZ2UnLCB3YXJuaW5nLmlkKTtcbiAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKSkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIHdhcm5pbmcuaWQpO1xuICAgICAgfVxuICAgICAgUmVuZGVyZXIuc2V0TWVzc2FnZSh3YXJuaW5nLCBtc2csIGVsZW1lbnQpO1xuICAgICAgUmVuZGVyZXIuYXR0YWNoV2FybmluZyh3YXJuaW5nLCBlbGVtZW50KTtcblxuICAgIH0gZWxzZSBpZiAod2FybmluZyAmJiB3YXJuaW5nLnBhcmVudE5vZGUpIHtcbiAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpID09PSB3YXJuaW5nLmlkKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5Jyk7XG4gICAgICB9XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1lcnJvcm1lc3NhZ2UnKTtcbiAgICAgIFJlbmRlcmVyLmRldGFjaFdhcm5pbmcod2FybmluZywgZWxlbWVudCk7XG5cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIHNldCB0aGUgd2FybmluZydzIGNvbnRlbnRcbiAgICpcbiAgICogT3ZlcndyaXRlIHRoaXMgbWV0aG9kLCBpZiB5b3Ugd2FudCwgZS5nLiwgdG8gYWxsb3cgSFRNTCBpbiB3YXJuaW5nc1xuICAgKiBvciBwcmVwcm9jZXNzIHRoZSBjb250ZW50LlxuICAgKi9cbiAgc2V0TWVzc2FnZTogZnVuY3Rpb24od2FybmluZywgbWVzc2FnZSwgZWxlbWVudCkge1xuICAgIHdhcm5pbmcudGV4dENvbnRlbnQgPSBtZXNzYWdlO1xuICB9XG5cbn07XG5cblxuY29uc3QgUmVuZGVyZXIgPSB7XG5cbiAgYXR0YWNoV2FybmluZzogRGVmYXVsdFJlbmRlcmVyLmF0dGFjaFdhcm5pbmcsXG4gIGRldGFjaFdhcm5pbmc6IERlZmF1bHRSZW5kZXJlci5kZXRhY2hXYXJuaW5nLFxuICBzaG93V2FybmluZzogRGVmYXVsdFJlbmRlcmVyLnNob3dXYXJuaW5nLFxuICBzZXRNZXNzYWdlOiBEZWZhdWx0UmVuZGVyZXIuc2V0TWVzc2FnZSxcblxuICBzZXQ6IGZ1bmN0aW9uKHJlbmRlcmVyLCBhY3Rpb24pIHtcbiAgICBpZiAocmVuZGVyZXIuaW5kZXhPZignXycpID4gLTEpIHtcbiAgICAgIC8qIGdsb2JhbCBjb25zb2xlICovXG4gICAgICAvLyBUT0RPIGRlbGV0ZSBiZWZvcmUgbmV4dCBub24tcGF0Y2ggdmVyc2lvblxuICAgICAgY29uc29sZS5sb2coJ1JlbmRlcmVyLnNldDogcGxlYXNlIHVzZSBjYW1lbENhc2UgbmFtZXMuICcrcmVuZGVyZXIrJyB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbm9uLXBhdGNoIHJlbGVhc2UuJyk7XG4gICAgICByZW5kZXJlciA9IHJlbmRlcmVyLnJlcGxhY2UoL18oW2Etel0pL2csIGcgPT4gZ1sxXS50b1VwcGVyQ2FzZSgpKTtcbiAgICB9XG4gICAgaWYgKCEgYWN0aW9uKSB7XG4gICAgICBhY3Rpb24gPSBEZWZhdWx0UmVuZGVyZXJbcmVuZGVyZXJdO1xuICAgIH1cbiAgICBSZW5kZXJlcltyZW5kZXJlcl0gPSBhY3Rpb247XG4gIH0sXG5cbiAgZ2V0V2FybmluZzogZWxlbWVudCA9PiB3YXJuaW5nc0NhY2hlLmdldChlbGVtZW50KSxcblxufTtcblxuXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG5leHBvcnQgY29uc3QgZGVmYXVsdF9zdGVwID0ge1xuICAnZGF0ZXRpbWUtbG9jYWwnOiA2MCxcbiAgZGF0ZXRpbWU6IDYwLFxuICB0aW1lOiA2MCxcbn07XG5cbmV4cG9ydCBjb25zdCBzdGVwX3NjYWxlX2ZhY3RvciA9IHtcbiAgJ2RhdGV0aW1lLWxvY2FsJzogMTAwMCxcbiAgZGF0ZXRpbWU6IDEwM
46184DAsXG4gIGRhdGU6IDg2NDAwMDAwLFxuICB3ZWVrOiA2MDQ4MDAwMDAsXG4gIHRpbWU6IDEwMDAsXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdF9zdGVwX2Jhc2UgPSB7XG4gIHdlZWs6IC0yNTkyMDAwMDAsXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdF9taW4gPSB7XG4gIHJhbmdlOiAwLFxufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRfbWF4ID0ge1xuICByYW5nZTogMTAwLFxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogYW5kIGRhdGV0aW1lLWxvY2FsPyBTcGVjIHNheXMg4oCcTmFoIeKAnSAqL1xuZXhwb3J0IGNvbnN0IGRhdGVzID0gWyAnZGF0ZXRpbWUnLCAnZGF0ZScsICdtb250aCcsICd3ZWVrJywgJ3RpbWUnLCBdO1xuXG5leHBvcnQgY29uc3QgcGxhaW5fbnVtYmVycyA9IFsgJ251bWJlcicsICdyYW5nZScsIF07XG5cbi8qIGV2ZXJ5dGhpbmcgdGhhdCByZXR1cm5zIHNvbWV0aGluZyBtZWFuaW5nZnVsIGZvciB2YWx1ZUFzTnVtYmVyIGFuZFxuICogY2FuIGhhdmUgdGhlIHN0ZXAgYXR0cmlidXRlICovXG5leHBvcnQgY29uc3QgbnVtYmVycyA9IGRhdGVzLmNvbmNhdChwbGFpbl9udW1iZXJzLCAnZGF0ZXRpbWUtbG9jYWwnKTtcblxuLyogdGhlIHNwZWMgc2F5cyB0byBvbmx5IGNoZWNrIHRob3NlIGZvciBzeW50YXggaW4gdmFsaWRpdHkudHlwZU1pc21hdGNoLlxuICogwq9cXF8o44OEKV8vwq8gKi9cbmV4cG9ydCBjb25zdCB0eXBlX2NoZWNrZWQgPSBbICdlbWFpbCcsICd1cmwnLCBdO1xuXG4vKiBjaGVjayB0aGVzZSBmb3IgdmFsaWRpdHkuYmFkSW5wdXQgKi9cbmV4cG9ydCBjb25zdCBpbnB1dF9jaGVja2VkID0gWyAnZW1haWwnLCAnZGF0ZScsICdtb250aCcsICd3ZWVrJywgJ3RpbWUnLFxuICAnZGF0ZXRpbWUnLCAnZGF0ZXRpbWUtbG9jYWwnLCAnbnVtYmVyJywgJ3JhbmdlJywgJ2NvbG9yJywgXTtcblxuZXhwb3J0IGNvbnN0IHRleHQgPSBbICd0ZXh0JywgJ3NlYXJjaCcsICd0ZWwnLCAncGFzc3dvcmQnLCBdLmNvbmNhdCh0eXBlX2NoZWNrZWQpO1xuXG4vKiBpbnB1dCBlbGVtZW50IHR5cGVzLCB0aGF0IGFyZSBjYW5kaWRhdGVzIGZvciB0aGUgdmFsaWRhdGlvbiBBUEkuXG4gKiBNaXNzaW5nIGZyb20gdGhpcyBzZXQgYXJlOiBidXR0b24sIGhpZGRlbiwgbWVudSAoZnJvbSA8YnV0dG9uPiksIHJlc2V0IGFuZFxuICogdGhlIHR5cGVzIGZvciBub24tPGlucHV0PiBlbGVtZW50cy4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0aW9uX2NhbmRpZGF0ZXMgPSBbICdjaGVja2JveCcsICdjb2xvcicsICdmaWxlJywgJ2ltYWdlJyxcbiAgJ3JhZGlvJywgJ3N1Ym1pdCcsIF0uY29uY2F0KG51bWJlcnMsIHRleHQpO1xuXG4vKiBhbGwga25vd24gdHlwZXMgb2YgPGlucHV0PiAqL1xuZXhwb3J0IGNvbnN0IGlucHV0cyA9IFsnYnV0dG9uJywgJ2hpZGRlbicsICdyZXNldCddLmNvbmNhdCh2YWxpZGF0aW9uX2NhbmRpZGF0ZXMpO1xuXG4vKiBhcHBhcmVudGx5IDxzZWxlY3Q+IGFuZCA8dGV4dGFyZWE+IGhhdmUgdHlwZXMgb2YgdGhlaXIgb3duICovXG5leHBvcnQgY29uc3Qgbm9uX2lucHV0cyA9IFsnc2VsZWN0LW9uZScsICdzZWxlY3QtbXVsdGlwbGUnLCAndGV4dGFyZWEnXTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgeyBjYXRjaF9zdWJtaXQsIHVuY2F0Y2hfc3VibWl0IH0gZnJvbSAnLi4vdG9vbHMvY2F0Y2hfc3VibWl0JztcbmltcG9ydCBWYWxpZGl0eVN0YXRlIGZyb20gJy4uL3BvbHlmaWxscy92YWxpZGl0eVN0YXRlJztcbmltcG9ydCByZXBvcnRWYWxpZGl0eSBmcm9tICcuLi9wb2x5ZmlsbHMvcmVwb3J0VmFsaWRpdHknO1xuaW1wb3J0IHVuaW5zdGFsbCBmcm9tICcuLi90b29scy9wcm9wZXJ0eV91bmluc3RhbGxlcic7XG5pbXBvcnQgcG9seWZpbGwgZnJvbSAnLi4vdG9vbHMvcG9seWZpbGwnO1xuaW1wb3J0IHBvbHl1bmZpbGwgZnJvbSAnLi4vdG9vbHMvcG9seXVuZmlsbCc7XG5cblxuY29uc3QgaW5zdGFuY2VzID0gbmV3IFdlYWtNYXAoKTtcblxuXG4vKipcbiAqIHdyYXAgPGZvcm0+cywgd2luZG93IG9yIGRvY3VtZW50LCB0aGF0IGdldCB0cmVhdGVkIHdpdGggdGhlIGdsb2JhbFxuICogaHlwZXJmb3JtKClcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gV3JhcHBlcihmb3JtLCBzZXR0aW5ncykge1xuXG4gIC8qIGRvIG5vdCBhbGxvdyBtb3JlIHRoYW4gb25lIGluc3RhbmNlIHBlciBmb3JtLiBPdGhlcndpc2Ugd2UnZCBlbmRcbiAgICogdXAgd2l0aCBkb3VibGUgZXZlbnQgaGFuZGxlcnMsIHBvbHlmaWxscyByZS1hcHBsaWVkLCAuLi4gKi9cbiAgdmFyIGV4aXN0aW5nID0gaW5zdGFuY2VzLmdldChmb3JtKTtcbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgZXhpc3Rpbmcuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cblxuICB0aGlzLmZvcm0gPSBmb3JtO1xuICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gIHRoaXMucmV2YWxpZGF0b3IgPSB0aGlzLnJldmFsaWRhdGUuYmluZCh0aGlzKTtcblxuICBpbnN0YW5jZXMuc2V0KGZvcm0sIHRoaXMpO1xuXG4gIGNhdGNoX3N1Ym1pdChmb3JtLCBzZXR0aW5ncy5yZXZhbGlkYXRlID09PSAnbmV2ZXInKTtcblxuICBpZiAoZm9ybSA9PT0gd2luZG93IHx8IGZvcm0ubm9kZVR5cGUgPT09IDkpIHtcbiAgICAvKiBpbnN0YWxsIG9uIHRoZSBwcm90b3R5cGVzLCB3aGVuIGNhbGxlZCBmb3IgdGhlIHdob2xlIGRvY3VtZW50ICovXG4gICAgdGhpcy5pbnN0YWxsKFtcbiAgICAgIHdpbmRvdy5IVE1MQnV0dG9uRWxlbWVudC5wcm90b3R5cGUsXG4gICAgICB3aW5kb3cuSFRNTElucHV0RWxlbWVudC5wcm90b3R5cGUsXG4gICAgICB3aW5kb3cuSFRNTFNlbGVjdEVsZW1lbnQucHJvdG90eXBlLFxuICAgICAgd2luZG93LkhUTUxUZXh0QXJlYUVsZW1lbnQucHJvdG90eXBlLFxuICAgICAgd2luZG93LkhUTUxGaWVsZFNldEVsZW1lbnQucHJvdG90eXBlLFxuICAgIF0pO1xuICAgIHBvbHlmaWxsKHdpbmRvdy5IVE1MRm9ybUVsZW1lbnQpO1xuICB9IGVsc2UgaWYgKGZvcm0gaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEZvcm1FbGVtZW50IHx8XG4gICAgICAgICAgICAgZm9ybSBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MRmllbGRTZXRFbGVtZW50KSB7XG4gICAgdGhpcy5pbnN0YWxsKGZvcm0uZWxlbWVudHMpO1xuICAgIGlmIChmb3JtIGluc3RhbmNlb2Ygd2luZG93LkhUTUxGb3JtRWxlbWVudCkge1xuICAgICAgcG9seWZpbGwoZm9ybSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNldHRpbmdzLnJldmFsaWRhdGUgPT09ICdvbmlucHV0JyB8fCBzZXR0aW5ncy5yZXZhbGlkYXRlID09PSAnaHlicmlkJykge1xuICAgIC8qIGluIGEgcGVyZmVjdCB3b3JsZCB3ZSdkIGp1c3QgYmluZCB0byBcImlucHV0XCIsIGJ1dCBzdXBwb3J0IGhlcmUgaXNcbiAgICAgKiBhYnlzbWFsOiBodHRwOi8vY2FuaXVzZS5jb20vI2ZlYXQ9aW5wdXQtZXZlbnQgKi9cbiAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5yZXZhbGlkYXRvcik7XG4gICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLnJldmFsaWRhdG9yKTtcbiAgfVxuICBpZiAoc2V0dGluZ3MucmV2YWxpZGF0ZSA9PT0gJ29uYmx1cicgfHwgc2V0dGluZ3MucmV2YWxpZGF0ZSA9PT0gJ2h5YnJpZCcpIHtcbiAgICAvKiB1c2VDYXB0dXJlPXRydWUsIGJlY2F1c2UgYGJsdXJgIGRvZXNuJ3QgYnViYmxlLiBTZWVcbiAgICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvYmx1ciNFdmVudF9kZWxlZ2F0aW9uXG4gICAgICogZm9yIGEgZGlzY3Vzc2lvbiAqL1xuICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMucmV2YWxpZGF0b3IsIHRydWUpO1xuICB9XG59XG5cblxuV3JhcHBlci5wcm90b3R5cGUgPSB7XG5cbiAgZGVzdHJveSgpIHtcbiAgICB1bmNhdGNoX3N1Ym1pdCh0aGlzLmZvcm0pO1xuICAgIGluc3RhbmNlcy5kZWxldGUodGhpcy5mb3JtKTtcbiAgICB0aGlzLmZvcm0ucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLnJldmFsaWRhdG9yKTtcbiAgICB0aGlzLmZvcm0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5yZXZhbGlkYXRvcik7XG4gICAgdGhpcy5mb3JtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLnJldmFsaWRhdG9yLCB0cnVlKTtcbiAgICBpZiAodGhpcy5mb3JtID09PSB3aW5kb3cgfHwgdGhpcy5mb3JtLm5vZGVUeXBlID09PSA5KSB7XG4gICAgICB0aGlzLnVuaW5zdGFsbChbXG4gICAgICAgI
46184HdpbmRvdy5IVE1MQnV0dG9uRWxlbWVudC5wcm90b3R5cGUsXG4gICAgICAgIHdpbmRvdy5IVE1MSW5wdXRFbGVtZW50LnByb3RvdHlwZSxcbiAgICAgICAgd2luZG93LkhUTUxTZWxlY3RFbGVtZW50LnByb3RvdHlwZSxcbiAgICAgICAgd2luZG93LkhUTUxUZXh0QXJlYUVsZW1lbnQucHJvdG90eXBlLFxuICAgICAgICB3aW5kb3cuSFRNTEZpZWxkU2V0RWxlbWVudC5wcm90b3R5cGUsXG4gICAgICBdKTtcbiAgICAgIHBvbHl1bmZpbGwod2luZG93LkhUTUxGb3JtRWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmZvcm0gaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEZvcm1FbGVtZW50IHx8XG4gICAgICAgICAgICAgICB0aGlzLmZvcm0gaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEZpZWxkU2V0RWxlbWVudCkge1xuICAgICAgdGhpcy51bmluc3RhbGwodGhpcy5mb3JtLmVsZW1lbnRzKTtcbiAgICAgIGlmICh0aGlzLmZvcm0gaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgICAgIHBvbHl1bmZpbGwodGhpcy5mb3JtKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIHJldmFsaWRhdGUgYW4gaW5wdXQgZWxlbWVudFxuICAgKi9cbiAgcmV2YWxpZGF0ZShldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEJ1dHRvbkVsZW1lbnQgfHxcbiAgICAgICAgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxUZXh0QXJlYUVsZW1lbnQgfHxcbiAgICAgICAgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxTZWxlY3RFbGVtZW50IHx8XG4gICAgICAgIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSW5wdXRFbGVtZW50KSB7XG5cbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLnJldmFsaWRhdGUgPT09ICdoeWJyaWQnKSB7XG4gICAgICAgIC8qIFwiaHlicmlkXCIgc29tZXdoYXQgc2ltdWxhdGVzIHdoYXQgYnJvd3NlcnMgZG8uIFNlZSBmb3IgZXhhbXBsZVxuICAgICAgICAgKiBGaXJlZm94J3MgOi1tb3otdWktaW52YWxpZCBwc2V1ZG8tY2xhc3M6XG4gICAgICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy86LW1vei11aS1pbnZhbGlkICovXG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnYmx1cicgJiZcbiAgICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSAhPT0gZXZlbnQudGFyZ2V0LmRlZmF1bHRWYWx1ZSB8fFxuICAgICAgICAgICAgVmFsaWRpdHlTdGF0ZShldmVudC50YXJnZXQpLnZhbGlkKSB7XG4gICAgICAgICAgLyogb24gYmx1ciwgdXBkYXRlIHRoZSByZXBvcnQgd2hlbiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQgZnJvbSB0aGVcbiAgICAgICAgICAgKiBkZWZhdWx0IG9yIHdoZW4gdGhlIGVsZW1lbnQgaXMgdmFsaWQgKHBvc3NpYmx5IHJlbW92aW5nIGEgc3RpbGxcbiAgICAgICAgICAgKiBzdGFuZGluZyBpbnZhbGlkaXR5IHJlcG9ydCkuICovXG4gICAgICAgICAgcmVwb3J0VmFsaWRpdHkoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC5rZXlDb2RlICE9PSA5KSB8fFxuICAgICAgICAgICAgICAgICAgICBldmVudC50eXBlID09PSAnY2hhbmdlJykge1xuICAgICAgICAgIGlmIChWYWxpZGl0eVN0YXRlKGV2ZW50LnRhcmdldCkudmFsaWQpIHtcbiAgICAgICAgICAgIC8vIHJlcG9ydCBpbnN0YW50bHksIHdoZW4gYW4gZWxlbWVudCBiZWNvbWVzIHZhbGlkLFxuICAgICAgICAgICAgLy8gcG9zdHBvbmUgcmVwb3J0IHRvIGJsdXIgZXZlbnQsIHdoZW4gYW4gZWxlbWVudCBpcyBpbnZhbGlkXG4gICAgICAgICAgICByZXBvcnRWYWxpZGl0eShldmVudC50YXJnZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgIT09ICdrZXl1cCcgfHwgZXZlbnQua2V5Q29kZSAhPT0gOSkge1xuICAgICAgICAvKiBkbyBfbm90XyB2YWxpZGF0ZSwgd2hlbiB0aGUgdXNlciBcInRhYmJlZFwiIGludG8gdGhlIGZpZWxkIGluaXRpYWxseSxcbiAgICAgICAgICogaS5lLiwgYSBrZXl1cCBldmVudCB3aXRoIGtleUNvZGUgOSAqL1xuICAgICAgICByZXBvcnRWYWxpZGl0eShldmVudC50YXJnZXQpO1xuICAgICAgfVxuXG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBpbnN0YWxsIHRoZSBwb2x5ZmlsbHMgb24gZWFjaCBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIElmIHlvdSBhZGQgZWxlbWVudHMgZHluYW1pY2FsbHksIHlvdSBoYXZlIHRvIGNhbGwgaW5zdGFsbCgpIG9uIHRoZW1cbiAgICogeW91cnNlbGY6XG4gICAqXG4gICAqIGpzPiB2YXIgZm9ybSA9IGh5cGVyZm9ybShkb2N1bWVudC5mb3Jtc1swXSk7XG4gICAqIGpzPiBkb2N1bWVudC5mb3Jtc1swXS5hcHBlbmRDaGlsZChpbnB1dCk7XG4gICAqIGpzPiBmb3JtLmluc3RhbGwoaW5wdXQpO1xuICAgKlxuICAgKiBZb3UgY2FuIHNraXAgdGhpcywgaWYgeW91IGNhbGxlZCBoeXBlcmZvcm0gb24gd2luZG93IG9yIGRvY3VtZW50LlxuICAgKi9cbiAgaW5zdGFsbChlbHMpIHtcbiAgICBpZiAoZWxzIGluc3RhbmNlb2Ygd2luZG93LkVsZW1lbnQpIHtcbiAgICAgIGVscyA9IFsgZWxzIF07XG4gICAgfVxuXG4gICAgY29uc3QgZWxzX2xlbmd0aCA9IGVscy5sZW5ndGg7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsc19sZW5ndGg7IGkrKykge1xuICAgICAgcG9seWZpbGwoZWxzW2ldKTtcbiAgICB9XG4gIH0sXG5cbiAgdW5pbnN0YWxsKGVscykge1xuICAgIGlmIChlbHMgaW5zdGFuY2VvZiB3aW5kb3cuRWxlbWVudCkge1xuICAgICAgZWxzID0gWyBlbHMgXTtcbiAgICB9XG5cbiAgICBjb25zdCBlbHNfbGVuZ3RoID0gZWxzLmxlbmd0aDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxzX2xlbmd0aDsgaSsrKSB7XG4gICAgICBwb2x5dW5maWxsKGVsc1tpXSk7XG4gICAgfVxuICB9LFxuXG59O1xuXG5cbi8qKlxuICogdHJ5IHRvIGdldCB0aGUgYXBwcm9wcmlhdGUgd3JhcHBlciBmb3IgYSBzcGVjaWZpYyBlbGVtZW50IGJ5IGxvb2tpbmcgdXBcbiAqIGl0cyBwYXJlbnQgY2hhaW5cbiAqXG4gKiBAcmV0dXJuIFdyYXBwZXIgfCB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldF93cmFwcGVyKGVsZW1lbnQpIHtcbiAgdmFyIHdyYXBwZWQ7XG5cbiAgaWYgKGVsZW1lbnQuZm9ybSkge1xuICAgIC8qIHRyeSBhIHNob3J0Y3V0IHdpdGggdGhlIGVsZW1lbnQncyA8Zm9ybT4gKi9cbiAgICB3cmFwcGVkI
46184D0gaW5zdGFuY2VzLmdldChlbGVtZW50LmZvcm0pO1xuICB9XG5cbiAgLyogd2FsayB1cCB0aGUgcGFyZW50IG5vZGVzIHVudGlsIGRvY3VtZW50IChpbmNsdWRpbmcpICovXG4gIHdoaWxlICghIHdyYXBwZWQgJiYgZWxlbWVudCkge1xuICAgIHdyYXBwZWQgPSBpbnN0YW5jZXMuZ2V0KGVsZW1lbnQpO1xuICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gIH1cblxuICBpZiAoISB3cmFwcGVkKSB7XG4gICAgLyogdHJ5IHRoZSBnbG9iYWwgaW5zdGFuY2UsIGlmIGV4aXN0cy4gVGhpcyBtYXkgYWxzbyBiZSB1bmRlZmluZWQuICovXG4gICAgd3JhcHBlZCA9IGluc3RhbmNlcy5nZXQod2luZG93KTtcbiAgfVxuXG4gIHJldHVybiB3cmFwcGVkO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBjaGVja1ZhbGlkaXR5IGZyb20gJy4vcG9seWZpbGxzL2NoZWNrVmFsaWRpdHknO1xuaW1wb3J0IHJlcG9ydFZhbGlkaXR5IGZyb20gJy4vcG9seWZpbGxzL3JlcG9ydFZhbGlkaXR5JztcbmltcG9ydCBzZXRDdXN0b21WYWxpZGl0eSBmcm9tICcuL3BvbHlmaWxscy9zZXRDdXN0b21WYWxpZGl0eSc7XG5pbXBvcnQgc3RlcERvd24gZnJvbSAnLi9wb2x5ZmlsbHMvc3RlcERvd24nO1xuaW1wb3J0IHN0ZXBVcCBmcm9tICcuL3BvbHlmaWxscy9zdGVwVXAnO1xuaW1wb3J0IHZhbGlkYXRpb25NZXNzYWdlIGZyb20gJy4vcG9seWZpbGxzL3ZhbGlkYXRpb25NZXNzYWdlJztcbmltcG9ydCBWYWxpZGl0eVN0YXRlIGZyb20gJy4vcG9seWZpbGxzL3ZhbGlkaXR5U3RhdGUnO1xuaW1wb3J0IHZhbHVlQXNEYXRlIGZyb20gJy4vcG9seWZpbGxzL3ZhbHVlQXNEYXRlJztcbmltcG9ydCB2YWx1ZUFzTnVtYmVyIGZyb20gJy4vcG9seWZpbGxzL3ZhbHVlQXNOdW1iZXInO1xuaW1wb3J0IHdpbGxWYWxpZGF0ZSBmcm9tICcuL3BvbHlmaWxscy93aWxsVmFsaWRhdGUnO1xuaW1wb3J0IGN1c3RvbV9tZXNzYWdlcyBmcm9tICcuL2NvbXBvbmVudHMvY3VzdG9tX21lc3NhZ2VzJztcbmltcG9ydCB7IGFkZF9ob29rLCByZW1vdmVfaG9vayB9IGZyb20gJy4vY29tcG9uZW50cy9ob29rcyc7XG5pbXBvcnQgeyBzZXRfbGFuZ3VhZ2UsIGFkZF90cmFuc2xhdGlvbiB9IGZyb20gJy4vY29tcG9uZW50cy9sb2NhbGl6YXRpb24nO1xuaW1wb3J0IEN1c3RvbVZhbGlkYXRvclJlZ2lzdHJ5IGZyb20gJy4vY29tcG9uZW50cy9yZWdpc3RyeSc7XG5pbXBvcnQgUmVuZGVyZXIgZnJvbSAnLi9jb21wb25lbnRzL3JlbmRlcmVyJztcbmltcG9ydCBXcmFwcGVyIGZyb20gJy4vY29tcG9uZW50cy93cmFwcGVyJztcbmltcG9ydCBzcHJpbnRmIGZyb20gJy4vdG9vbHMvc3ByaW50Zic7XG5pbXBvcnQgdmVyc2lvbiBmcm9tICcuL3ZlcnNpb24nO1xuXG5cbi8qIGRlcHJlY2F0ZSB0aGUgb2xkIHNuYWtlX2Nhc2UgbmFtZXNcbiAqIFRPRE86IGRlbG1lIGJlZm9yZSBuZXh0IG5vbi1wYXRjaCByZWxlYXNlXG4gKi9cbmZ1bmN0aW9uIHcobmFtZSkge1xuICBjb25zdCBkZXByZWNhdGVkX21lc3NhZ2UgPSAnUGxlYXNlIHVzZSBjYW1lbENhc2UgbWV0aG9kIG5hbWVzISBUaGUgbmFtZSBcIiVzXCIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG5vbi1wYXRjaCByZWxlYXNlLic7XG4gIC8qIGdsb2JhbCBjb25zb2xlICovXG4gIGNvbnNvbGUubG9nKHNwcmludGYoZGVwcmVjYXRlZF9tZXNzYWdlLCBuYW1lKSk7XG59XG5cblxuLyoqXG4gKiBwdWJsaWMgaHlwZXJmb3JtIGludGVyZmFjZTpcbiAqL1xuZnVuY3Rpb24gaHlwZXJmb3JtKGZvcm0sIHtcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXMsXG4gICAgICAgICAgICAgICAgICAgICBkZWJ1Zz1mYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgIGV4dGVuZF9maWVsZHNldCxcbiAgICAgICAgICAgICAgICAgICAgIGV4dGVuZEZpZWxkc2V0LFxuICAgICAgICAgICAgICAgICAgICAgbm92YWxpZGF0ZV9vbl9lbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgIG5vdmFsaWRhdGVPbkVsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICAgcHJldmVudF9pbXBsaWNpdF9zdWJtaXQsXG4gICAgICAgICAgICAgICAgICAgICBwcmV2ZW50SW1wbGljaXRTdWJtaXQvKiBUT0RPOiB1bmNvbW1lbnQgPWZhbHNlICovLFxuICAgICAgICAgICAgICAgICAgICAgcmV2YWxpZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgIHN0cmljdD1mYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgIHZhbGlkX2V2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgdmFsaWRFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlTmFtZWxlc3M9ZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgfT17fSkge1xuXG4gIGlmICghIGNsYXNzZXMpIHtcbiAgICBjbGFzc2VzID0ge307XG4gIH1cbiAgLy8gVE9ETzogY2xlYW4gdXAgYmVmb3JlIG5leHQgbm9uLXBhdGNoIHJlbGVhc2VcbiAgaWYgKGV4dGVuZEZpZWxkc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoZXh0ZW5kX2ZpZWxkc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuZEZpZWxkc2V0ID0gISBzdHJpY3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHcoJ2V4dGVuZF9maWVsZHNldCcpO1xuICAgICAgZXh0ZW5kRmllbGRzZXQgPSBleHRlbmRfZmllbGRzZXQ7XG4gICAgfVxuICB9XG4gIGlmIChub3ZhbGlkYXRlT25FbGVtZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKG5vdmFsaWRhdGVfb25fZWxlbWVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbm92YWxpZGF0ZU9uRWxlbWVudHMgPSAhIHN0cmljdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdygnbm92YWxpZGF0ZV9vbl9lbGVtZW50cycpO1xuICAgICAgbm92YWxpZGF0ZU9uRWxlbWVudHMgPSBub3ZhbGlkYXRlX29uX2VsZW1lbnRzO1xuICAgIH1cbiAgfVxuICBpZiAocHJldmVudEltcGxpY2l0U3VibWl0ID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAocHJldmVudF9pbXBsaWNpdF9zdWJtaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJldmVudEltcGxpY2l0U3VibWl0ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHcoJ3ByZXZlbnRfaW1wbGljaXRfc3VibWl0Jyk7XG4gICAgICBwcmV2ZW50SW1wbGljaXRTdWJtaXQgP
46184SBwcmV2ZW50X2ltcGxpY2l0X3N1Ym1pdDtcbiAgICB9XG4gIH1cbiAgaWYgKHJldmFsaWRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgIC8qIG90aGVyIHJlY29nbml6ZWQgdmFsdWVzOiAnb25pbnB1dCcsICdvbmJsdXInLCAnb25zdWJtaXQnIGFuZCAnbmV2ZXInICovXG4gICAgcmV2YWxpZGF0ZSA9IHN0cmljdD8gJ29uc3VibWl0JyA6ICdoeWJyaWQnO1xuICB9XG4gIGlmICh2YWxpZEV2ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsaWRfZXZlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsaWRFdmVudCA9ICEgc3RyaWN0O1xuICAgIH0gZWxzZSB7XG4gICAgICB3KCd2YWxpZF9ldmVudCcpO1xuICAgICAgdmFsaWRFdmVudCA9IHZhbGlkX2V2ZW50O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNldHRpbmdzID0geyBkZWJ1Zywgc3RyaWN0LCBwcmV2ZW50SW1wbGljaXRTdWJtaXQsIHJldmFsaWRhdGUsXG4gICAgICAgICAgICAgICAgICAgICB2YWxpZEV2ZW50LCBleHRlbmRGaWVsZHNldCwgY2xhc3Nlcywgbm92YWxpZGF0ZU9uRWxlbWVudHMsXG4gICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZU5hbWVsZXNzLFxuICAgICAgICAgICAgICAgICAgIH07XG5cbiAgaWYgKGZvcm0gaW5zdGFuY2VvZiB3aW5kb3cuTm9kZUxpc3QgfHxcbiAgICAgIGZvcm0gaW5zdGFuY2VvZiB3aW5kb3cuSFRNTENvbGxlY3Rpb24gfHxcbiAgICAgIGZvcm0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPT4gaHlwZXJmb3JtKGVsZW1lbnQsIHNldHRpbmdzKSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFdyYXBwZXIoZm9ybSwgc2V0dGluZ3MpO1xufVxuXG5oeXBlcmZvcm0udmVyc2lvbiA9IHZlcnNpb247XG5cbmh5cGVyZm9ybS5jaGVja1ZhbGlkaXR5ID0gY2hlY2tWYWxpZGl0eTtcbmh5cGVyZm9ybS5yZXBvcnRWYWxpZGl0eSA9IHJlcG9ydFZhbGlkaXR5O1xuaHlwZXJmb3JtLnNldEN1c3RvbVZhbGlkaXR5ID0gc2V0Q3VzdG9tVmFsaWRpdHk7XG5oeXBlcmZvcm0uc3RlcERvd24gPSBzdGVwRG93bjtcbmh5cGVyZm9ybS5zdGVwVXAgPSBzdGVwVXA7XG5oeXBlcmZvcm0udmFsaWRhdGlvbk1lc3NhZ2UgPSB2YWxpZGF0aW9uTWVzc2FnZTtcbmh5cGVyZm9ybS5WYWxpZGl0eVN0YXRlID0gVmFsaWRpdHlTdGF0ZTtcbmh5cGVyZm9ybS52YWx1ZUFzRGF0ZSA9IHZhbHVlQXNEYXRlO1xuaHlwZXJmb3JtLnZhbHVlQXNOdW1iZXIgPSB2YWx1ZUFzTnVtYmVyO1xuaHlwZXJmb3JtLndpbGxWYWxpZGF0ZSA9IHdpbGxWYWxpZGF0ZTtcblxuaHlwZXJmb3JtLnNldExhbmd1YWdlID0gbGFuZyA9PiB7IHNldF9sYW5ndWFnZShsYW5nKTsgcmV0dXJuIGh5cGVyZm9ybTsgfTtcbmh5cGVyZm9ybS5hZGRUcmFuc2xhdGlvbiA9IChsYW5nLCBjYXRhbG9nKSA9PiB7IGFkZF90cmFuc2xhdGlvbihsYW5nLCBjYXRhbG9nKTsgcmV0dXJuIGh5cGVyZm9ybTsgfTtcbmh5cGVyZm9ybS5zZXRSZW5kZXJlciA9IChyZW5kZXJlciwgYWN0aW9uKSA9PiB7IFJlbmRlcmVyLnNldChyZW5kZXJlciwgYWN0aW9uKTsgcmV0dXJuIGh5cGVyZm9ybTsgfTtcbmh5cGVyZm9ybS5hZGRWYWxpZGF0b3IgPSAoZWxlbWVudCwgdmFsaWRhdG9yKSA9PiB7IEN1c3RvbVZhbGlkYXRvclJlZ2lzdHJ5LnNldChlbGVtZW50LCB2YWxpZGF0b3IpOyByZXR1cm4gaHlwZXJmb3JtOyB9O1xuaHlwZXJmb3JtLnNldE1lc3NhZ2UgPSAoZWxlbWVudCwgdmFsaWRhdG9yLCBtZXNzYWdlKSA9PiB7IGN1c3RvbV9tZXNzYWdlcy5zZXQoZWxlbWVudCwgdmFsaWRhdG9yLCBtZXNzYWdlKTsgcmV0dXJuIGh5cGVyZm9ybTsgfTtcbmh5cGVyZm9ybS5hZGRIb29rID0gKGhvb2ssIGFjdGlvbiwgcG9zaXRpb24pID0+IHsgYWRkX2hvb2soaG9vaywgYWN0aW9uLCBwb3NpdGlvbik7IHJldHVybiBoeXBlcmZvcm07IH07XG5oeXBlcmZvcm0ucmVtb3ZlSG9vayA9IChob29rLCBhY3Rpb24pID0+IHsgcmVtb3ZlX2hvb2soaG9vaywgYWN0aW9uKTsgcmV0dXJuIGh5cGVyZm9ybTsgfTtcblxuLy8gVE9ETzogUmVtb3ZlIGluIG5leHQgbm9uLXBhdGNoIHZlcnNpb25cbmh5cGVyZm9ybS5zZXRfbGFuZ3VhZ2UgPSBsYW5nID0+IHsgdygnc2V0X2xhbmd1YWdlJyk7IHNldF9sYW5ndWFnZShsYW5nKTsgcmV0dXJuIGh5cGVyZm9ybTsgfTtcbmh5cGVyZm9ybS5hZGRfdHJhbnNsYXRpb24gPSAobGFuZywgY2F0YWxvZykgPT4geyB3KCdhZGRfdHJhbnNsYXRpb24nKTsgYWRkX3RyYW5zbGF0aW9uKGxhbmcsIGNhdGFsb2cpOyByZXR1cm4gaHlwZXJmb3JtOyB9O1xuaHlwZXJmb3JtLnNldF9yZW5kZXJlciA9IChyZW5kZXJlciwgYWN0aW9uKSA9PiB7IHcoJ3NldF9yZW5kZXJlcicpOyBSZW5kZXJlci5zZXQocmVuZGVyZXIsIGFjdGlvbik7IHJldHVybiBoeXBlcmZvcm07IH07XG5oeXBlcmZvcm0uYWRkX3ZhbGlkYXRvciA9IChlbGVtZW50LCB2YWxpZGF0b3IpID0+IHsgdygnYWRkX3ZhbGlkYXRvcicpOyBDdXN0b21WYWxpZGF0b3JSZWdpc3RyeS5zZXQoZWxlbWVudCwgdmFsaWRhdG9yKTsgcmV0dXJuIGh5cGVyZm9ybTsgfTtcbmh5cGVyZm9ybS5zZXRfbWVzc2FnZSA9IChlbGVtZW50LCB2YWxpZGF0b3IsIG1lc3NhZ2UpID0+IHsgdygnc2V0X21lc3NhZ2UnKTsgY3VzdG9tX21lc3NhZ2VzLnNldChlbGVtZW50LCB2YWxpZGF0b3IsIG1lc3NhZ2UpOyByZXR1cm4gaHlwZXJmb3JtOyB9O1xuaHlwZXJmb3JtLmFkZF9ob29rID0gKGhvb2ssIGFjdGlvbiwgcG9zaXRpb24pID0+IHsgdygnYWRkX2hvb2snKTsgYWRkX2hvb2soaG9vaywgYWN0aW9uLCBwb3NpdGlvbik7IHJldHVybiBoeXBlcmZvcm07IH07XG5oeXBlcmZvcm0ucmVtb3ZlX2hvb2sgPSAoaG9vaywgYWN0aW9uKSA9PiB7IHcoJ3JlbW92ZV9ob29rJyk7IHJlbW92ZV9ob29rKGhvb2ssIGFjdGlvbik7IHJldHVybiBoeXBlcmZvcm07IH07XG5cbmlmIChkb2N1bWVudC5jdXJyZW50U2NyaXB0ICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuaGFzQXR0cmlidXRlKCdkYXRhLWhmLWF1dG9sb2FkJykpIHtcbiAgaHlwZXJmb3JtKHdpbmRvdyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGh5cGVyZm9ybTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgeyBnZXRfdmFsaWRhdGVkX2VsZW1lbnRzIH0gZnJvbSAnLi4vdG9vbHMvZ2V0X3ZhbGlkYXRlZF9lbGVtZW50cyc7XG5pbXBvcnQgcmV0dXJuX2hvb2tfb3IgZnJvbSAnLi4vdG9vbHMvcmV0dXJuX2hvb2tfb3InO1xuaW1wb3J0IHRyaWdnZXJfZXZlbnQgZnJvbSAnLi4vdG9vbHMvdHJpZ2dlcl9ldmVudCc7XG5pbXBvcnQgVmFsaWRpdHlTdGF0ZSBmcm9tICcuL3ZhbGlkaXR5U3RhdGUnO1xuaW1wb3J0IHsgZ2V0X3dyYXBwZXIgfSBmcm9tICcuLi9jb21wb25lbnRzL3dyYXBwZXInO1xuXG5cbi8qKlxuICogY2hlY2sgYW4gZWxlbWVudCdzIHZhbGlkaXR5IHdpdGggcmVzcGVjdCB0byBpdCdzIGZvcm1cbiAqL1xuY29uc3QgY2hlY2tWYWxpZGl0eSA9IHJldHVybl9ob29rX29yKCdjaGVja1ZhbGlkaXR5JywgZnVuY3Rpb24oZWxlbWVudCkge1xuICAvKiBpZiB0aGlzIGlzIGEgPGZvcm0+LCBjaGVjayB2YWxpZGl0eSBvZiBhbGwgY2hpbGQgaW5wdXRzICovXG4gIGlmIChlbGVtZW50IGluc3RhbmNlb2Ygd2luZG93LkhUTUxGb3JtRWxlbWVudCkge1xuICAgIHJldHVybi
46184BnZXRfdmFsaWRhdGVkX2VsZW1lbnRzKGVsZW1lbnQpLm1hcChjaGVja1ZhbGlkaXR5KS5ldmVyeShiPT5iKTtcbiAgfVxuXG4gIC8qIGRlZmF1bHQgaXMgdHJ1ZSwgYWxzbyBmb3IgZWxlbWVudHMgdGhhdCBhcmUgbm8gdmFsaWRhdGlvbiBjYW5kaWRhdGVzICovXG4gIGNvbnN0IHZhbGlkID0gVmFsaWRpdHlTdGF0ZShlbGVtZW50KS52YWxpZDtcbiAgaWYgKHZhbGlkKSB7XG4gICAgY29uc3Qgd3JhcHBlZF9mb3JtID0gZ2V0X3dyYXBwZXIoZWxlbWVudCk7XG4gICAgaWYgKHdyYXBwZWRfZm9ybSAmJiB3cmFwcGVkX2Zvcm0uc2V0dGluZ3MudmFsaWRFdmVudCkge1xuICAgICAgdHJpZ2dlcl9ldmVudChlbGVtZW50LCAndmFsaWQnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdHJpZ2dlcl9ldmVudChlbGVtZW50LCAnaW52YWxpZCcsIHsgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHJldHVybiB2YWxpZDtcbn0pO1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNoZWNrVmFsaWRpdHk7XG4iLCIndXNlIHN0cmljdCc7XG5cblxuaW1wb3J0IGluc3RhbGxfcHJvcGVydHkgZnJvbSAnLi4vdG9vbHMvcHJvcGVydHlfaW5zdGFsbGVyJztcbmltcG9ydCB1bmluc3RhbGxfcHJvcGVydHkgZnJvbSAnLi4vdG9vbHMvcHJvcGVydHlfdW5pbnN0YWxsZXInO1xuaW1wb3J0IHsgY2FsbF9ob29rLCBkb19maWx0ZXIgfSBmcm9tICcuLi9jb21wb25lbnRzL2hvb2tzJztcblxuXG5jb25zdCBnQSA9IHByb3AgPT4gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBkb19maWx0ZXIoJ2F0dHJfZ2V0XycrcHJvcCwgdGhpcy5nZXRBdHRyaWJ1dGUocHJvcCksIHRoaXMpO1xufTtcblxuY29uc3Qgc0EgPSBwcm9wID0+IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHRoaXMuc2V0QXR0cmlidXRlKHByb3AsIGRvX2ZpbHRlcignYXR0cl9zZXRfJytwcm9wLCB2YWx1ZSwgdGhpcykpO1xufTtcblxuY29uc3QgZ0FiID0gcHJvcCA9PiBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGRvX2ZpbHRlcignYXR0cl9nZXRfJytwcm9wLCB0aGlzLmhhc0F0dHJpYnV0ZShwcm9wKSwgdGhpcyk7XG59O1xuXG5jb25zdCBzQWIgPSBwcm9wID0+IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGlmIChkb19maWx0ZXIoJ2F0dHJfc2V0XycrcHJvcCwgdmFsdWUsIHRoaXMpKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUocHJvcCwgcHJvcCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUocHJvcCk7XG4gIH1cbn07XG5cbmNvbnN0IGdBbiA9IHByb3AgPT4gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBkb19maWx0ZXIoJ2F0dHJfZ2V0XycrcHJvcCwgTWF0aC5tYXgoMCwgTnVtYmVyKHRoaXMuZ2V0QXR0cmlidXRlKHByb3ApKSksIHRoaXMpO1xufTtcblxuY29uc3Qgc0FuID0gcHJvcCA9PiBmdW5jdGlvbih2YWx1ZSkge1xuICB2YWx1ZSA9IGRvX2ZpbHRlcignYXR0cl9zZXRfJytwcm9wLCB2YWx1ZSwgdGhpcyk7XG4gIGlmICgvXlswLTldKyQvLnRlc3QodmFsdWUpKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUocHJvcCwgdmFsdWUpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBpbnN0YWxsX3Byb3BlcnRpZXMoZWxlbWVudCkge1xuICBmb3IgKGxldCBwcm9wIG9mIFsgJ2FjY2VwdCcsICdtYXgnLCAnbWluJywgJ3BhdHRlcm4nLCAncGxhY2Vob2xkZXInLCAnc3RlcCcsIF0pIHtcbiAgICBpbnN0YWxsX3Byb3BlcnR5KGVsZW1lbnQsIHByb3AsIHtcbiAgICAgIGdldDogZ0EocHJvcCksXG4gICAgICBzZXQ6IHNBKHByb3ApLFxuICAgIH0pO1xuICB9XG5cbiAgZm9yIChsZXQgcHJvcCBvZiBbICdtdWx0aXBsZScsICdyZXF1aXJlZCcsICdyZWFkT25seScsIF0pIHtcbiAgICBpbnN0YWxsX3Byb3BlcnR5KGVsZW1lbnQsIHByb3AsIHtcbiAgICAgIGdldDogZ0FiKHByb3AudG9Mb3dlckNhc2UoKSksXG4gICAgICBzZXQ6IHNBYihwcm9wLnRvTG93ZXJDYXNlKCkpLFxuICAgIH0pO1xuICB9XG5cbiAgZm9yIChsZXQgcHJvcCBvZiBbICdtaW5MZW5ndGgnLCAnbWF4TGVuZ3RoJywgXSkge1xuICAgIGluc3RhbGxfcHJvcGVydHkoZWxlbWVudCwgcHJvcCwge1xuICAgICAgZ2V0OiBnQW4ocHJvcC50b0xvd2VyQ2FzZSgpKSxcbiAgICAgIHNldDogc0FuKHByb3AudG9Mb3dlckNhc2UoKSksXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5pbnN0YWxsX3Byb3BlcnRpZXMoZWxlbWVudCkge1xuICBmb3IgKGxldCBwcm9wIG9mIFsgJ2FjY2VwdCcsICdtYXgnLCAnbWluJywgJ3BhdHRlcm4nLCAncGxhY2Vob2xkZXInLCAnc3RlcCcsXG4gICAgICAgJ211bHRpcGxlJywgJ3JlcXVpcmVkJywgJ3JlYWRPbmx5JywgJ21pbkxlbmd0aCcsICdtYXhMZW5ndGgnLCBdKSB7XG4gICAgdW5pbnN0YWxsX3Byb3BlcnR5KGVsZW1lbnQsIHByb3ApO1xuICB9XG59XG5cbmV4cG9ydCB7IGluc3RhbGxfcHJvcGVydGllcywgdW5pbnN0YWxsX3Byb3BlcnRpZXMgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgeyBnZXRfdmFsaWRhdGVkX2VsZW1lbnRzIH0gZnJvbSAnLi4vdG9vbHMvZ2V0X3ZhbGlkYXRlZF9lbGVtZW50cyc7XG5pbXBvcnQgdHJpZ2dlcl9ldmVudCBmcm9tICcuLi90b29scy90cmlnZ2VyX2V2ZW50JztcbmltcG9ydCBSZW5kZXJlciBmcm9tICcuLi9jb21wb25lbnRzL3JlbmRlcmVyJztcbmltcG9ydCBWYWxpZGl0eVN0YXRlIGZyb20gJy4vdmFsaWRpdHlTdGF0ZSc7XG5pbXBvcnQgeyBnZXRfd3JhcHBlciB9IGZyb20gJy4uL2NvbXBvbmVudHMvd3JhcHBlcic7XG5cblxuLyoqXG4gKiBjaGVjayBlbGVtZW50J3MgdmFsaWRpdHkgYW5kIHJlcG9ydCBhbiBlcnJvciBiYWNrIHRvIHRoZSB1c2VyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlcG9ydFZhbGlkaXR5KGVsZW1lbnQpIHtcbiAgLyogaWYgdGhpcyBpcyBhIDxmb3JtPiwgcmVwb3J0IHZhbGlkaXR5IG9mIGFsbCBjaGlsZCBpbnB1dHMgKi9cbiAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgZWxlbWVudC5fX2hmX2Zvcm1fdmFsaWRhdGlvbiA9IHRydWU7XG4gICAgY29uc3QgZm9ybV92YWxpZCA9IGdldF92YWxpZGF0ZWRfZWxlbWVudHMoZWxlbWVudCkubWFwKHJlcG9ydFZhbGlkaXR5KS5ldmVyeShiPT5iKTtcbiAgICBkZWxldGUoZWxlbWVudC5fX2hmX2Zvcm1fdmFsaWRhdGlvbik7XG4gICAgcmV0dXJuIGZvcm1fdmFsaWQ7XG4gIH1cblxuICAvKiB3ZSBjb3B5IGNoZWNrVmFsaWRpdHkoKSBoZXJlLCBiL2Mgd2UgaGF2ZSB0byBjaGVjayBpZiB0aGUgXCJpbnZhbGlkXCJcbiAgICogZXZlbnQgd2FzIGNhbmNlbGVkLiAqL1xuICBjb25zdCB2YWxpZCA9IFZhbGlkaXR5U3RhdGUoZWxlbWVudCkudmFsaWQ7XG4gIHZhciBldmVudDtcbiAgaWYgKHZhbGlkKSB7XG4gICAgY29uc3Qgd3JhcHBlZF9mb3JtID0gZ2V0X3dyYXBwZXIoZWxlbWVudCk7XG4gICAgaWYgKHdyYXBwZWRfZm9ybSAmJiB3cmFwcGVkX2Zvcm0uc2V0dGluZ3MudmFsaWRFdmVudCkge1xuICAgICAgZXZlbnQgPSB0cmlnZ2VyX2V2ZW50KGVsZW1lbnQsICd2YWxpZCcsIHsgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICB9XG4gI
46184H0gZWxzZSB7XG4gICAgZXZlbnQgPSB0cmlnZ2VyX2V2ZW50KGVsZW1lbnQsICdpbnZhbGlkJywgeyBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICB9XG5cbiAgaWYgKCEgZXZlbnQgfHwgISBldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgUmVuZGVyZXIuc2hvd1dhcm5pbmcoZWxlbWVudCwgISFlbGVtZW50LmZvcm0uX19oZl9mb3JtX3ZhbGlkYXRpb24pO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCB7IG1lc3NhZ2Vfc3RvcmUgfSBmcm9tICcuLi9jb21wb25lbnRzL21lc3NhZ2Vfc3RvcmUnO1xuaW1wb3J0IFJlbmRlcmVyIGZyb20gJy4uL2NvbXBvbmVudHMvcmVuZGVyZXInO1xuaW1wb3J0IHZhbGlkaXR5X3N0YXRlX2NoZWNrZXJzIGZyb20gJy4uL3Rvb2xzL3ZhbGlkaXR5X3N0YXRlX2NoZWNrZXJzJztcblxuXG4vKipcbiAqIHNldCBhIGN1c3RvbSB2YWxpZGl0eSBtZXNzYWdlIG9yIGRlbGV0ZSBpdCB3aXRoIGFuIGVtcHR5IHN0cmluZ1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZXRDdXN0b21WYWxpZGl0eShlbGVtZW50LCBtc2cpIHtcbiAgaWYgKCEgbXNnKSB7XG4gICAgbWVzc2FnZV9zdG9yZS5kZWxldGUoZWxlbWVudCwgdHJ1ZSk7XG4gIH0gZWxzZSB7XG4gICAgbWVzc2FnZV9zdG9yZS5zZXQoZWxlbWVudCwgbXNnLCB0cnVlKTtcbiAgfVxuICAvKiBsaXZlLXVwZGF0ZSB0aGUgd2FybmluZyAqL1xuICBjb25zdCB3YXJuaW5nID0gUmVuZGVyZXIuZ2V0V2FybmluZyhlbGVtZW50KTtcbiAgaWYgKHdhcm5pbmcpIHtcbiAgICBSZW5kZXJlci5zZXRNZXNzYWdlKHdhcm5pbmcsIG1zZywgZWxlbWVudCk7XG4gIH1cbiAgLyogdXBkYXRlIGFueSBjbGFzc2VzIGlmIHRoZSB2YWxpZGl0eSBzdGF0ZSBjaGFuZ2VzICovXG4gIHZhbGlkaXR5X3N0YXRlX2NoZWNrZXJzLnZhbGlkKGVsZW1lbnQpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBnZXRfbmV4dF92YWxpZCBmcm9tICcuLi90b29scy9nZXRfbmV4dF92YWxpZCc7XG5pbXBvcnQgZ2V0X3R5cGUgZnJvbSAnLi4vdG9vbHMvZ2V0X3R5cGUnO1xuaW1wb3J0IHsgbnVtYmVycyB9IGZyb20gJy4uL2NvbXBvbmVudHMvdHlwZXMnO1xuaW1wb3J0IHZhbHVlQXNOdW1iZXIgZnJvbSAnLi92YWx1ZUFzTnVtYmVyJztcblxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0ZXBEb3duKGVsZW1lbnQsIG49MSkge1xuICBpZiAobnVtYmVycy5pbmRleE9mKGdldF90eXBlKGVsZW1lbnQpKSA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgd2luZG93LkRPTUV4Y2VwdGlvbignc3RlcERvd24gZW5jb3VudGVyZWQgaW52YWxpZCB0eXBlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW52YWxpZFN0YXRlRXJyb3InKTtcbiAgfVxuICBpZiAoKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzdGVwJykgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdhbnknKSB7XG4gICAgdGhyb3cgbmV3IHdpbmRvdy5ET01FeGNlcHRpb24oJ3N0ZXBEb3duIGVuY291bnRlcmVkIHN0ZXAgXCJhbnlcIicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ludmFsaWRTdGF0ZUVycm9yJyk7XG4gIH1cblxuICBjb25zdCBwcmV2ID0gZ2V0X25leHRfdmFsaWQoZWxlbWVudCwgbilbMF07XG5cbiAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICB2YWx1ZUFzTnVtYmVyKGVsZW1lbnQsIHByZXYpO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxuaW1wb3J0IGdldF9uZXh0X3ZhbGlkIGZyb20gJy4uL3Rvb2xzL2dldF9uZXh0X3ZhbGlkJztcbmltcG9ydCBnZXRfdHlwZSBmcm9tICcuLi90b29scy9nZXRfdHlwZSc7XG5pbXBvcnQgeyBudW1iZXJzIH0gZnJvbSAnLi4vY29tcG9uZW50cy90eXBlcyc7XG5pbXBvcnQgdmFsdWVBc051bWJlciBmcm9tICcuL3ZhbHVlQXNOdW1iZXInO1xuXG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RlcFVwKGVsZW1lbnQsIG49MSkge1xuICBpZiAobnVtYmVycy5pbmRleE9mKGdldF90eXBlKGVsZW1lbnQpKSA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgd2luZG93LkRPTUV4Y2VwdGlvbignc3RlcFVwIGVuY291bnRlcmVkIGludmFsaWQgdHlwZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ludmFsaWRTdGF0ZUVycm9yJyk7XG4gIH1cbiAgaWYgKChlbGVtZW50LmdldEF0dHJpYnV0ZSgnc3RlcCcpIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAnYW55Jykge1xuICAgIHRocm93IG5ldyB3aW5kb3cuRE9NRXhjZXB0aW9uKCdzdGVwVXAgZW5jb3VudGVyZWQgc3RlcCBcImFueVwiJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW52YWxpZFN0YXRlRXJyb3InKTtcbiAgfVxuXG4gIGNvbnN0IG5leHQgPSBnZXRfbmV4dF92YWxpZChlbGVtZW50LCBuKVsxXTtcblxuICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgIHZhbHVlQXNOdW1iZXIoZWxlbWVudCwgbmV4dCk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgeyBtZXNzYWdlX3N0b3JlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9tZXNzYWdlX3N0b3JlJztcblxuXG4vKipcbiAqIGdldCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIGZvciBhbiBlbGVtZW50LCBlbXB0eSBzdHJpbmcsIGlmIHRoZSBlbGVtZW50XG4gKiBzYXRpc2ZpZXMgYWxsIGNvbnN0cmFpbnRzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0aW9uTWVzc2FnZShlbGVtZW50KSB7XG4gIGNvbnN0IG1zZyA9IG1lc3NhZ2Vfc3RvcmUuZ2V0KGVsZW1lbnQpO1xuICBpZiAoISBtc2cpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKiBtYWtlIGl0IGEgcHJpbWl0aXZlIGFnYWluLCBzaW5jZSBtZXNzYWdlX3N0b3JlIHJldHVybnMgU3RyaW5nKCkuICovXG4gIHJldHVybiBtc2cudG9TdHJpbmcoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgaXNfdmFsaWRhdGlvbl9jYW5kaWRhdGUgZnJvbSAnLi4vdG9vbHMvaXNfdmFsaWRhdGlvbl9jYW5kaWRhdGUnO1xuaW1wb3J0IG1hcmsgZnJvbSAnLi4vdG9vbHMvbWFyayc7XG5pbXBvcnQgdmFsaWRpdHlfc3RhdGVfY2hlY2tlcnMgZnJvbSAnLi4vdG9vbHMvdmFsaWRpdHlfc3RhdGVfY2hlY2tlcnMnO1xuXG5cbi8qKlxuICogdGhlIHZhbGlkaXR5IHN0YXRlIGNvbnN0cnVjdG9yXG4gKi9cbmNvbnN0IFZhbGlkaXR5U3RhdGUgPSBmdW5jdGlvbihlbGVtZW50KSB7XG4gIGlmICghIC
46184hlbGVtZW50IGluc3RhbmNlb2Ygd2luZG93LkhUTUxFbGVtZW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IGNyZWF0ZSBhIFZhbGlkaXR5U3RhdGUgZm9yIGEgbm9uLWVsZW1lbnQnKTtcbiAgfVxuXG4gIGNvbnN0IGNhY2hlZCA9IFZhbGlkaXR5U3RhdGUuY2FjaGUuZ2V0KGVsZW1lbnQpO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuXG4gIGlmICghICh0aGlzIGluc3RhbmNlb2YgVmFsaWRpdHlTdGF0ZSkpIHtcbiAgICAvKiB3b3JraW5nIGFyb3VuZCBhIGZvcmdvdHRlbiBgbmV3YCAqL1xuICAgIHJldHVybiBuZXcgVmFsaWRpdHlTdGF0ZShlbGVtZW50KTtcbiAgfVxuXG4gIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gIFZhbGlkaXR5U3RhdGUuY2FjaGUuc2V0KGVsZW1lbnQsIHRoaXMpO1xufTtcblxuXG4vKipcbiAqIHRoZSBwcm90b3R5cGUgZm9yIG5ldyB2YWxpZGl0eVN0YXRlIGluc3RhbmNlc1xuICovXG5jb25zdCBWYWxpZGl0eVN0YXRlUHJvdG90eXBlID0ge307XG5WYWxpZGl0eVN0YXRlLnByb3RvdHlwZSA9IFZhbGlkaXR5U3RhdGVQcm90b3R5cGU7XG5cblZhbGlkaXR5U3RhdGUuY2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuXG4vKiBzbWFsbCB3cmFwcGVyIGFyb3VuZCB0aGUgYWN0dWFsIHZhbGlkYXRvciB0byBjaGVjayBpZiB0aGUgdmFsaWRhdG9yXG4gKiBzaG91bGQgYWN0dWFsbHkgYmUgY2FsbGVkLiBgdGhpc2AgcmVmZXJzIHRvIHRoZSBWYWxpZGl0eVN0YXRlIG9iamVjdC4gKi9cbmNvbnN0IGNoZWNrZXJfZ2V0dGVyID0gZnVuYyA9PiB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBpZiAoISBpc192YWxpZGF0aW9uX2NhbmRpZGF0ZSh0aGlzLmVsZW1lbnQpKSB7XG4gICAgICAvKiBub3QgYmVpbmcgdmFsaWRhdGVkID09IHZhbGlkIGJ5IGRlZmF1bHQgKi9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZnVuYyh0aGlzLmVsZW1lbnQpO1xuICB9O1xufTtcblxuLyoqXG4gKiBjb3B5IGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgdmFsaWRpdHkgY2hlY2tlcnMgdG8gdGhlIFZhbGlkaXR5U3RhdGVcbiAqIHByb3RvdHlwZVxuICovXG5mb3IgKGxldCBwcm9wIGluIHZhbGlkaXR5X3N0YXRlX2NoZWNrZXJzKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWYWxpZGl0eVN0YXRlUHJvdG90eXBlLCBwcm9wLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBjaGVja2VyX2dldHRlcih2YWxpZGl0eV9zdGF0ZV9jaGVja2Vyc1twcm9wXSksXG4gICAgc2V0OiB1bmRlZmluZWQsXG4gIH0pO1xufVxuXG4vKipcbiAqIG1hcmsgdGhlIHZhbGlkaXR5IHByb3RvdHlwZSwgYmVjYXVzZSB0aGF0IGlzIHdoYXQgdGhlIGNsaWVudC1mYWNpbmdcbiAqIGNvZGUgZGVhbHMgd2l0aCBtb3N0bHksIG5vdCB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciB0aGluZyAqL1xubWFyayhWYWxpZGl0eVN0YXRlUHJvdG90eXBlKTtcblxuZXhwb3J0IGRlZmF1bHQgVmFsaWRpdHlTdGF0ZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgZ2V0X3R5cGUgZnJvbSAnLi4vdG9vbHMvZ2V0X3R5cGUnO1xuaW1wb3J0IHN0cmluZ190b19kYXRlIGZyb20gJy4uL3Rvb2xzL3N0cmluZ190b19kYXRlJztcbmltcG9ydCBkYXRlX3RvX3N0cmluZyBmcm9tICcuLi90b29scy9kYXRlX3RvX3N0cmluZyc7XG5pbXBvcnQgeyBkYXRlcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvdHlwZXMnO1xuXG5cbi8qKlxuICogaW1wbGVtZW50IHRoZSB2YWx1ZUFzRGF0ZSBmdW5jdGlvbmFsaXR5XG4gKlxuICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2RvbS1pbnB1dC12YWx1ZWFzZGF0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWx1ZUFzRGF0ZShlbGVtZW50LCB2YWx1ZT11bmRlZmluZWQpIHtcbiAgY29uc3QgdHlwZSA9IGdldF90eXBlKGVsZW1lbnQpO1xuICBpZiAoZGF0ZXMuaW5kZXhPZih0eXBlKSA+IC0xKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8qIHNldHRlcjogdmFsdWUgbXVzdCBiZSBudWxsIG9yIGEgRGF0ZSgpICovXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgZWxlbWVudC52YWx1ZSA9ICcnO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgaWYgKGlzTmFOKHZhbHVlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgICBlbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlbWVudC52YWx1ZSA9IGRhdGVfdG9fc3RyaW5nKHZhbHVlLCB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IHdpbmRvdy5ET01FeGNlcHRpb24oXG4gICAgICAgICAgJ3ZhbHVlQXNEYXRlIHNldHRlciBlbmNvdW50ZXJlZCBpbnZhbGlkIHZhbHVlJywgJ1R5cGVFcnJvcicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlX2RhdGUgPSBzdHJpbmdfdG9fZGF0ZShlbGVtZW50LnZhbHVlLCB0eXBlKTtcbiAgICByZXR1cm4gdmFsdWVfZGF0ZSBpbnN0YW5jZW9mIERhdGU/IHZhbHVlX2RhdGUgOiBudWxsO1xuXG4gIH0gZWxzZSBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIC8qIHRyeWluZyB0byBzZXQgYSBkYXRlIG9uIGEgbm90LWRhdGUgaW5wdXQgZmFpbHMgKi9cbiAgICB0aHJvdyBuZXcgd2luZG93LkRPTUV4Y2VwdGlvbihcbiAgICAgICd2YWx1ZUFzRGF0ZSBzZXR0ZXIgY2Fubm90IHNldCBkYXRlIG9uIHRoaXMgZWxlbWVudCcsXG4gICAgICAnSW52YWxpZFN0YXRlRXJyb3InKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBnZXRfdHlwZSBmcm9tICcuLi90b29scy9nZXRfdHlwZSc7XG5pbXBvcnQgc3RyaW5nX3RvX251bWJlciBmcm9tICcuLi90b29scy9zdHJpbmdfdG9fbnVtYmVyJztcbmltcG9ydCB7IG51bWJlcnMgfSBmcm9tICcuLi9jb21wb25lbnRzL3R5cGVzJztcbmltcG9ydCB2YWx1ZUFzRGF0ZSBmcm9tICcuL3ZhbHVlQXNEYXRlJztcblxuXG4vKipcbiAqIGltcGxlbWVudCB0aGUgdmFsdWVBc051bWJlciBmdW5jdGlvbmFsaXR5XG4gKlxuICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2RvbS1pbnB1dC12YWx1ZWFzbnVtYmVyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbHVlQXNOdW1iZXIoZWxlbWVudCwgdmFsdWU9dW5kZWZpbmVkKSB7XG4gIGNvbnN0IHR5cGUgPSBnZXRfdHlwZShlbGVtZW50KTtcbiAgaWYgKG51bWJlcnMuaW5kZXhPZih0eXBlKSA+IC0xKSB7XG4gICAgaWYgKHR5cGUgPT09ICdyYW5nZScgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ211bHRpcGxlJykpIHtcbiAgICAgIC8qIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNkby1ub3QtYXBwbHkgKi9cbiAgICAgIHJldHVybi
46184BOYU47XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8qIHNldHRlcjogdmFsdWUgbXVzdCBiZSBOYU4gb3IgYSBmaW5pdGUgbnVtYmVyICovXG4gICAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICAgIGVsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB3aW5kb3cuaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLyogdHJ5IHNldHRpbmcgYXMgYSBkYXRlLCBidXQuLi4gKi9cbiAgICAgICAgICB2YWx1ZUFzRGF0ZShlbGVtZW50LCBuZXcgRGF0ZSh2YWx1ZSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLyogLi4uIHdoZW4gdmFsdWVBc0RhdGUgaXMgbm90IHJlc3BvbnNpYmxlLCAuLi4gKi9cbiAgICAgICAgICBpZiAoISAoZSBpbnN0YW5jZW9mIHdpbmRvdy5ET01FeGNlcHRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvKiAuLi4gc2V0IGl0IHZpYSBOdW1iZXIudG9TdHJpbmcoKS4gKi9cbiAgICAgICAgICBlbGVtZW50LnZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IHdpbmRvdy5ET01FeGNlcHRpb24oXG4gICAgICAgICAgJ3ZhbHVlQXNOdW1iZXIgc2V0dGVyIGVuY291bnRlcmVkIGludmFsaWQgdmFsdWUnLCAnVHlwZUVycm9yJyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZ190b19udW1iZXIoZWxlbWVudC52YWx1ZSwgdHlwZSk7XG5cbiAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLyogdHJ5aW5nIHRvIHNldCBhIG51bWJlciBvbiBhIG5vdC1udW1iZXIgaW5wdXQgZmFpbHMgKi9cbiAgICB0aHJvdyBuZXcgd2luZG93LkRPTUV4Y2VwdGlvbihcbiAgICAgICd2YWx1ZUFzTnVtYmVyIHNldHRlciBjYW5ub3Qgc2V0IG51bWJlciBvbiB0aGlzIGVsZW1lbnQnLFxuICAgICAgJ0ludmFsaWRTdGF0ZUVycm9yJyk7XG4gIH1cblxuICByZXR1cm4gTmFOO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBpc192YWxpZGF0aW9uX2NhbmRpZGF0ZSBmcm9tICcuLi90b29scy9pc192YWxpZGF0aW9uX2NhbmRpZGF0ZSc7XG5cblxuLyoqXG4gKiBjaGVjaywgaWYgYW4gZWxlbWVudCB3aWxsIGJlIHN1YmplY3QgdG8gSFRNTDUgdmFsaWRhdGlvbiBhdCBhbGxcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd2lsbFZhbGlkYXRlKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGlzX3ZhbGlkYXRpb25fY2FuZGlkYXRlKGVsZW1lbnQpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCB0cmlnZ2VyX2V2ZW50LCB7IGNyZWF0ZV9ldmVudCB9IGZyb20gJy4vdHJpZ2dlcl9ldmVudCc7XG5pbXBvcnQgbWF0Y2hlcyBmcm9tICcuL21hdGNoZXMnO1xuaW1wb3J0IHsgZ2V0X3ZhbGlkYXRlZF9lbGVtZW50cyB9IGZyb20gJy4vZ2V0X3ZhbGlkYXRlZF9lbGVtZW50cyc7XG5pbXBvcnQgcmVwb3J0VmFsaWRpdHkgZnJvbSAnLi4vcG9seWZpbGxzL3JlcG9ydFZhbGlkaXR5JztcbmltcG9ydCB7IHRleHQgYXMgdGV4dF90eXBlcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0X3dyYXBwZXIgfSBmcm9tICcuLi9jb21wb25lbnRzL3dyYXBwZXInO1xuXG5cbi8qKlxuICogc3VibWl0IGEgZm9ybSwgYmVjYXVzZSBgZWxlbWVudGAgdHJpZ2dlcmVkIGl0XG4gKlxuICogVGhpcyBtZXRob2QgYWxzbyBkaXNwYXRjaGVzIGEgc3VibWl0IGV2ZW50IG9uIHRoZSBmb3JtIHByaW9yIHRvIHRoZVxuICogc3VibWlzc2lvbi4gVGhlIGV2ZW50IGNvbnRhaW5zIHRoZSB0cmlnZ2VyIGVsZW1lbnQgYXMgYHN1Ym1pdHRlZFZpYWAuXG4gKlxuICogSWYgdGhlIGVsZW1lbnQgaXMgYSBidXR0b24gd2l0aCBhIG5hbWUsIHRoZSBuYW1lPXZhbHVlIHBhaXIgd2lsbCBiZSBhZGRlZFxuICogdG8gdGhlIHN1Ym1pdHRlZCBkYXRhLlxuICovXG5mdW5jdGlvbiBzdWJtaXRfZm9ybV92aWEoZWxlbWVudCkge1xuICAvKiBhcHBhcmVudGx5LCB0aGUgc3VibWl0IGV2ZW50IGlzIG5vdCB0cmlnZ2VyZWQgaW4gbW9zdCBicm93c2VycyBvblxuICAgKiB0aGUgc3VibWl0KCkgbWV0aG9kLCBzbyB3ZSBkbyBpdCBtYW51YWxseSBoZXJlIHRvIG1vZGVsIGEgbmF0dXJhbFxuICAgKiBzdWJtaXQgYXMgY2xvc2VseSBhcyBwb3NzaWJsZS5cbiAgICogTm93IHRvIHRoZSBmdW4gZmFjdDogSWYgeW91IHRyaWdnZXIgYSBzdWJtaXQgZXZlbnQgZnJvbSBhIGZvcm0sIHdoYXRcbiAgICogZG8geW91IHRoaW5rIHNob3VsZCBoYXBwZW4/XG4gICAqIDEpIHRoZSBmb3JtIHdpbGwgYmUgYXV0b21hZ2ljYWxseSBzdWJtaXR0ZWQgYnkgdGhlIGJyb3dzZXIsIG9yXG4gICAqIDIpIG5vdGhpbmcuXG4gICAqIEFuZCBhcyB5b3UgYWxyZWFkeSBzdXNwZWN0ZWQsIHRoZSBjb3JyZWN0IGFuc3dlciBpczogYm90aCEgRmlyZWZveFxuICAgKiBvcHRzIGZvciAxKSwgQ2hyb21lIGZvciAyKS4gWWF5ISAqL1xuICB2YXIgZXZlbnRfZ290X2NhbmNlbGxlZDtcblxuICB2YXIgc3VibWl0X2V2ZW50ID0gY3JlYXRlX2V2ZW50KCdzdWJtaXQnLCB7IGNhbmNlbGFibG
46184U6IHRydWUgfSk7XG4gIC8qIGZvcmNlIEZpcmVmb3ggdG8gbm90IHN1Ym1pdCB0aGUgZm9ybSwgdGhlbiBmYWtlIHByZXZlbnREZWZhdWx0KCkgKi9cbiAgc3VibWl0X2V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJtaXRfZXZlbnQsICdkZWZhdWx0UHJldmVudGVkJywge1xuICAgIHZhbHVlOiBmYWxzZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJtaXRfZXZlbnQsICdwcmV2ZW50RGVmYXVsdCcsIHtcbiAgICB2YWx1ZTogKCkgPT4gc3VibWl0X2V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSBldmVudF9nb3RfY2FuY2VsbGVkID0gdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgfSk7XG4gIHRyaWdnZXJfZXZlbnQoZWxlbWVudC5mb3JtLCBzdWJtaXRfZXZlbnQsIHt9LCB7IHN1Ym1pdHRlZFZpYTogZWxlbWVudCB9KTtcblxuICBpZiAoISBldmVudF9nb3RfY2FuY2VsbGVkKSB7XG4gICAgYWRkX3N1Ym1pdF9maWVsZChlbGVtZW50KTtcbiAgICB3aW5kb3cuSFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQuY2FsbChlbGVtZW50LmZvcm0pO1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHJlbW92ZV9zdWJtaXRfZmllbGQoZWxlbWVudCkpO1xuICB9XG59XG5cblxuLyoqXG4gKiBpZiBhIHN1Ym1pdCBidXR0b24gd2FzIGNsaWNrZWQsIGFkZCBpdHMgbmFtZT12YWx1ZSBieSBtZWFucyBvZiBhIHR5cGU9aGlkZGVuXG4gKiBpbnB1dCBmaWVsZFxuICovXG5mdW5jdGlvbiBhZGRfc3VibWl0X2ZpZWxkKGJ1dHRvbikge1xuICBpZiAoWydpbWFnZScsICdzdWJtaXQnXS5pbmRleE9mKGJ1dHRvbi50eXBlKSA+IC0xICYmIGJ1dHRvbi5uYW1lKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IGdldF93cmFwcGVyKGJ1dHRvbi5mb3JtKSB8fCB7fTtcbiAgICB2YXIgc3VibWl0X2hlbHBlciA9IHdyYXBwZXIuc3VibWl0X2hlbHBlcjtcbiAgICBpZiAoc3VibWl0X2hlbHBlcikge1xuICAgICAgaWYgKHN1Ym1pdF9oZWxwZXIucGFyZW50Tm9kZSkge1xuICAgICAgICBzdWJtaXRfaGVscGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3VibWl0X2hlbHBlcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1Ym1pdF9oZWxwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgc3VibWl0X2hlbHBlci50eXBlID0gJ2hpZGRlbic7XG4gICAgICB3cmFwcGVyLnN1Ym1pdF9oZWxwZXIgPSBzdWJtaXRfaGVscGVyO1xuICAgIH1cbiAgICBzdWJtaXRfaGVscGVyLm5hbWUgPSBidXR0b24ubmFtZTtcbiAgICBzdWJtaXRfaGVscGVyLnZhbHVlID0gYnV0dG9uLnZhbHVlO1xuICAgIGJ1dHRvbi5mb3JtLmFwcGVuZENoaWxkKHN1Ym1pdF9oZWxwZXIpO1xuICB9XG59XG5cblxuLyoqXG4gKiByZW1vdmUgYSBwb3NzaWJsZSBoZWxwZXIgaW5wdXQsIHRoYXQgd2FzIGFkZGVkIGJ5IGBhZGRfc3VibWl0X2ZpZWxkYFxuICovXG5mdW5jdGlvbiByZW1vdmVfc3VibWl0X2ZpZWxkKGJ1dHRvbikge1xuICBpZiAoWydpbWFnZScsICdzdWJtaXQnXS5pbmRleE9mKGJ1dHRvbi50eXBlKSA+IC0xICYmIGJ1dHRvbi5uYW1lKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IGdldF93cmFwcGVyKGJ1dHRvbi5mb3JtKSB8fCB7fTtcbiAgICBjb25zdCBzdWJtaXRfaGVscGVyID0gd3JhcHBlci5zdWJtaXRfaGVscGVyO1xuICAgIGlmIChzdWJtaXRfaGVscGVyICYmIHN1Ym1pdF9oZWxwZXIucGFyZW50Tm9kZSkge1xuICAgICAgc3VibWl0X2hlbHBlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN1Ym1pdF9oZWxwZXIpO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qKlxuICogY2hlY2sgYSBmb3JtJ3MgdmFsaWRpdHkgYW5kIHN1Ym1pdCBpdFxuICpcbiAqIFRoZSBtZXRob2QgdHJpZ2dlcnMgYSBjYW5jZWxsYWJsZSBgdmFsaWRhdGVgIGV2ZW50IG9uIHRoZSBmb3JtLiBJZiB0aGVcbiAqIGV2ZW50IGlzIGNhbmNlbGxlZCwgZm9ybSBzdWJtaXNzaW9uIHdpbGwgYmUgYWJvcnRlZCwgdG9vLlxuICpcbiAqIElmIHRoZSBmb3JtIGlzIGZvdW5kIHRvIGNvbnRhaW4gaW52YWxpZCBmaWVsZHMsIGZvY3VzIHRoZSBmaXJzdCBmaWVsZC5cbiAqL1xuZnVuY3Rpb24gY2hlY2soYnV0dG9uKSB7XG4gIC8qIHRyaWdnZXIgYSBcInZhbGlkYXRlXCIgZXZlbnQgb24gdGhlIGZvcm0gdG8gYmUgc3VibWl0dGVkICovXG4gIGNvbnN0IHZhbF9ldmVudCA9IHRyaWdnZXJfZXZlbnQoYnV0dG9uLmZvcm0sICd2YWxpZGF0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICBpZiAodmFsX2V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAvKiBza2lwIHRoZSB3aG9sZSBzdWJtaXQgdGhpbmcsIGlmIHRoZSB2YWxpZGF0aW9uIGlzIGNhbmNlbGVkLiBBIHVzZXJcbiAgICAgKiBjYW4gc3RpbGwgY2FsbCBmb3JtLnN1Ym1pdCgpIGFmdGVyd2FyZHMuICovXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHZhbGlkID0gdHJ1ZTtcbiAgdmFyIGZpcnN0X2ludmFsaWQ7XG4gIGJ1dHRvbi5mb3JtLl9faGZfZm9ybV92YWxpZGF0aW9uID0gdHJ1ZTtcbiAgZ2V0X3ZhbGlkYXRlZF9lbGVtZW50cyhidXR0b24uZm9ybSkubWFwKGVsZW1lbnQgPT4ge1xuICAgIGlmICghIHJlcG9ydFZhbGlkaXR5KGVsZW1lbnQpKSB7XG4gICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgaWYgKCEgZmlyc3RfaW52YWxpZCAmJiAoJ2ZvY3VzJyBpbiBlbGVtZW50KSkge1xuICAgICAgICBmaXJzdF9pbnZhbGlkID0gZWxlbWVudDtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBkZWxldGUoYnV0dG9uLmZvcm0uX19oZl9mb3JtX3ZhbGlkYXRpb24pO1xuXG4gIGlmICh2YWxpZCkge1xuICAgIHN1Ym1pdF9mb3JtX3ZpYShidXR0b24pO1xuICB9IGVsc2UgaWYgKGZpcnN0X2ludmFsaWQpIHtcbiAgICAvKiBmb2N1cyB0aGUgZmlyc3QgaW52YWxpZCBlbGVtZW50LCBpZiB2YWxpZGF0aW9uIHdlbnQgc291dGggKi9cbiAgICBmaXJzdF9pbnZhbGlkLmZvY3VzKCk7XG4gICAgLyogdGVsbCB0aGUgdGFsZSwgaWYgYW55b25lIHdhbnRzIHRvIHJlYWN0IHRvIGl0ICovXG4gICAgdHJpZ2dlcl9ldmVudChidXR0b24uZm9ybSwgJ2Zvcm1pbnZhbGlkJyk7XG4gIH1cbn1cblxuXG4vKipcbiAqIHRlc3QgaWYgbm9kZSBpcyBhIHN1Ym1pdCBidXR0b25cbiAqL1xuZnVuY3Rpb24gaXNfc3VibWl0X2J1dHRvbihub2RlKSB7XG4gIHJldHVybiAoXG4gICAgLyogbXVzdCBiZSBhbiBpbnB1dCBvciBidXR0b24gZWxlbWVudC4uLiAqL1xuICAgIChub2RlLm5vZGVOYW1lID09PSAnSU5QVVQnIHx8XG4gICAgIG5vZGUubm9kZU5hbWUgPT09ICdCVVRUT04nKSAmJlxuXG4gICAgLyogLi4uYW5kIGhh
46184dmUgYSBzdWJtaXR0aW5nIHR5cGUgKi9cbiAgICAobm9kZS50eXBlID09PSAnaW1hZ2UnIHx8IG5vZGUudHlwZSA9PT0gJ3N1Ym1pdCcpXG4gICk7XG59XG5cblxuLyoqXG4gKiB0ZXN0LCBpZiB0aGUgY2xpY2sgZXZlbnQgd291bGQgdHJpZ2dlciBhIHN1Ym1pdFxuICovXG5mdW5jdGlvbiBpc19zdWJtaXR0aW5nX2NsaWNrKGV2ZW50LCBidXR0b24pIHtcbiAgcmV0dXJuIChcbiAgICAvKiBwcmV2ZW50ZWQgZGVmYXVsdDogd29uJ3QgdHJpZ2dlciBhIHN1Ym1pdCAqL1xuICAgICEgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCAmJlxuXG4gICAgLyogbGVmdCBidXR0b24gb3IgbWlkZGxlIGJ1dHRvbiAoc3VibWl0cyBpbiBDaHJvbWUpICovXG4gICAgKCEgKCdidXR0b24nIGluIGV2ZW50KSB8fFxuICAgICBldmVudC5idXR0b24gPCAyKSAmJlxuXG4gICAgLyogbXVzdCBiZSBhIHN1Ym1pdCBidXR0b24uLi4gKi9cbiAgICBpc19zdWJtaXRfYnV0dG9uKGJ1dHRvbikgJiZcblxuICAgIC8qIHRoZSBidXR0b24gbmVlZHMgYSBmb3JtLCB0aGF0J3MgZ29pbmcgdG8gYmUgc3VibWl0dGVkICovXG4gICAgYnV0dG9uLmZvcm0gJiZcblxuICAgIC8qIGFnYWluLCBpZiB0aGUgZm9ybSBzaG91bGQgbm90IGJlIHZhbGlkYXRlZCwgd2UncmUgb3V0IG9mIHRoZSBnYW1lICovXG4gICAgISBidXR0b24uZm9ybS5oYXNBdHRyaWJ1dGUoJ25vdmFsaWRhdGUnKVxuICApO1xufVxuXG5cbi8qKlxuICogdGVzdCwgaWYgdGhlIGtleXByZXNzIGV2ZW50IHdvdWxkIHRyaWdnZXIgYSBzdWJtaXRcbiAqL1xuZnVuY3Rpb24gaXNfc3VibWl0dGluZ19rZXlwcmVzcyhldmVudCkge1xuICByZXR1cm4gKFxuICAgIC8qIHByZXZlbnRlZCBkZWZhdWx0OiB3b24ndCB0cmlnZ2VyIGEgc3VibWl0ICovXG4gICAgISBldmVudC5kZWZhdWx0UHJldmVudGVkICYmXG5cbiAgICAoXG4gICAgICAoXG4gICAgICAgIC8qIC4uLmFuZCA8RW50ZXI+IHdhcyBwcmVzc2VkLi4uICovXG4gICAgICAgIGV2ZW50LmtleUNvZGUgPT09IDEzICYmXG5cbiAgICAgICAgLyogLi4ub24gYW4gPGlucHV0PiB0aGF0IGlzLi4uICovXG4gICAgICAgIGV2ZW50LnRhcmdldC5ub2RlTmFtZSA9PT0gJ0lOUFVUJyAmJlxuXG4gICAgICAgIC8qIC4uLmEgc3RhbmRhcmQgdGV4dCBpbnB1dCBmaWVsZCAobm90IGNoZWNrYm94LCAuLi4pICovXG4gICAgICAgIHRleHRfdHlwZXMuaW5kZXhPZihldmVudC50YXJnZXQudHlwZSkgPiAtMVxuICAgICAgKSB8fCAoXG4gICAgICAgIC8qIG9yIDxFbnRlcj4gb3IgPFNwYWNlPiB3YXMgcHJlc3NlZC4uLiAqL1xuICAgICAgICAoZXZlbnQua2V5Q29kZSA9PT0gMTMgfHxcbiAgICAgICAgIGV2ZW50LmtleUNvZGUgPT09IDMyKSAmJlxuXG4gICAgICAgIC8qIC4uLm9uIGEgc3VibWl0IGJ1dHRvbiAqL1xuICAgICAgICBpc19zdWJtaXRfYnV0dG9uKGV2ZW50LnRhcmdldClcbiAgICAgIClcbiAgICApICYmXG5cbiAgICAvKiB0aGVyZSdzIGEgZm9ybS4uLiAqL1xuICAgIGV2ZW50LnRhcmdldC5mb3JtICYmXG5cbiAgICAvKiAuLi5hbmQgdGhlIGZvcm0gYWxsb3dzIHZhbGlkYXRpb24gKi9cbiAgICAhIGV2ZW50LnRhcmdldC5mb3JtLmhhc0F0dHJpYnV0ZSgnbm92YWxpZGF0ZScpXG4gICk7XG59XG5cblxuLyoqXG4gKiBjYXRjaCBjbGlja3MgdG8gY2hpbGRyZW4gb2YgPGJ1dHRvbj5zXG4gKi9cbmZ1bmN0aW9uIGdldF9jbGlja2VkX2J1dHRvbihlbGVtZW50KSB7XG4gIGlmIChpc19zdWJtaXRfYnV0dG9uKGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH0gZWxzZSBpZiAobWF0Y2hlcyhlbGVtZW50LCAnYnV0dG9uOm5vdChbdHlwZV0pICosIGJ1dHRvblt0eXBlPVwic3VibWl0XCJdIConKSkge1xuICAgIHJldHVybiBnZXRfY2xpY2tlZF9idXR0b24oZWxlbWVudC5wYXJlbnROb2RlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5cbi8qKlxuICogcmV0dXJuIGV2ZW50IGhhbmRsZXIgdG8gY2F0Y2ggZXhwbGljaXQgc3VibWlzc2lvbiBieSBjbGljayBvbiBhIGJ1dHRvblxuICovXG5mdW5jdGlvbiBnZXRfY2xpY2tfaGFuZGxlcihpZ25vcmU9ZmFsc2UpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgY29uc3QgYnV0dG9uID0gZ2V0X2NsaWNrZWRfYnV0dG9uKGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKGJ1dHRvbiAmJiBpc19zdWJtaXR0aW5nX2NsaWNrKGV2ZW50LCBidXR0b24pKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGlnbm9yZSB8fCBidXR0b24uaGFzQXR0cmlidXRlKCdmb3Jtbm92YWxpZGF0ZScpKSB7XG4gICAgICAgIC8qIGlmIHZhbGlkYXRpb24gc2hvdWxkIGJlIGlnbm9yZWQsIHdlJ3JlIG5vdCBpbnRlcmVzdGVkIGluIGFueSBjaGVja3MgKi9cbiAgICAgICAgc3VibWl0X2Zvcm1fdmlhKGJ1dHRvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVjayhidXR0b24pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbmNvbnN0IGNsaWNrX2hhbmRsZXIgPSBnZXRfY2xpY2tfaGFuZGxlcigpO1xuY29uc3QgaWdub3JlZF9jbGlja19oYW5kbGVyID0gZ2V0X2NsaWNrX2hhbmRsZXIodHJ1ZSk7XG5cblxuLyoqXG4gKiBjYXRjaCBpbXBsaWNpdCBzdWJtaXNzaW9uIGJ5IHByZXNzaW5nIDxFbnRlcj4gaW4gc29tZSBzaXR1YXRpb25zXG4gKi9cbmZ1bmN0aW9uIGdldF9rZXlwcmVzc19oYW5kbGVyKGlnbm9yZSkge1xuICByZXR1cm4gZnVuY3Rpb24ga2V5cHJlc3NfaGFuZGxlcihldmVudCkge1xuICAgIGlmIChpc19zdWJtaXR0aW5nX2tleXByZXNzKGV2ZW50KSkgIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBnZXRfd3JhcHBlcihldmVudC50YXJnZXQuZm9ybSkgfHwgeyBzZXR0aW5nczoge30gfTtcbiAgICAgIGlmICh3cmFwcGVyLnNldHRpbmdzLnByZXZlbnRJbXBsaWNpdFN1Ym1pdCkge1xuICAgICAgICAvKiB1c2VyIGRvZXNuJ3Qgd2FudCBhbiBpbXBsaWNpdCBzdWJtaXQuIENhbmNlbCBoZXJlLiAqL1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8qIGNoZWNrLCB0aGF0IHR
46184oZXJlIGlzIG5vIHN1Ym1pdCBidXR0b24gaW4gdGhlIGZvcm0uIE90aGVyd2lzZVxuICAgICAgKiB0aGF0IHNob3VsZCBiZSBjbGlja2VkLiAqL1xuICAgICAgY29uc3QgZWwgPSBldmVudC50YXJnZXQuZm9ybS5lbGVtZW50cy5sZW5ndGg7XG4gICAgICB2YXIgc3VibWl0O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbDsgaSsrKSB7XG4gICAgICAgIGlmIChbJ2ltYWdlJywgJ3N1Ym1pdCddLmluZGV4T2YoZXZlbnQudGFyZ2V0LmZvcm0uZWxlbWVudHNbaV0udHlwZSkgPiAtMSkge1xuICAgICAgICAgIHN1Ym1pdCA9IGV2ZW50LnRhcmdldC5mb3JtLmVsZW1lbnRzW2ldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdWJtaXQpIHtcbiAgICAgICAgc3VibWl0LmNsaWNrKCk7XG4gICAgICB9IGVsc2UgaWYgKGlnbm9yZSkge1xuICAgICAgICBzdWJtaXRfZm9ybV92aWEoZXZlbnQudGFyZ2V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrKGV2ZW50LnRhcmdldCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuY29uc3Qga2V5cHJlc3NfaGFuZGxlciA9IGdldF9rZXlwcmVzc19oYW5kbGVyKCk7XG5jb25zdCBpZ25vcmVkX2tleXByZXNzX2hhbmRsZXIgPSBnZXRfa2V5cHJlc3NfaGFuZGxlcih0cnVlKTtcblxuXG4vKipcbiAqIGNhdGNoIGFsbCByZWxldmFudCBldmVudHMgX3ByaW9yXyB0byBhIGZvcm0gYmVpbmcgc3VibWl0dGVkXG4gKlxuICogQHBhcmFtIGJvb2wgaWdub3JlIGJ5cGFzcyB2YWxpZGF0aW9uLCB3aGVuIGFuIGF0dGVtcHQgdG8gc3VibWl0IHRoZVxuICogICAgICAgICAgICAgICAgICAgIGZvcm0gaXMgZGV0ZWN0ZWQuIFRydWUsIHdoZW4gdGhlIHdyYXBwZXIncyByZXZhbGlkYXRlXG4gKiAgICAgICAgICAgICAgICAgICAgc2V0dGluZyBpcyAnbmV2ZXInLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2F0Y2hfc3VibWl0KGxpc3RlbmluZ19ub2RlLCBpZ25vcmU9ZmFsc2UpIHtcbiAgaWYgKGlnbm9yZSkge1xuICAgIGxpc3RlbmluZ19ub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaWdub3JlZF9jbGlja19oYW5kbGVyKTtcbiAgICBsaXN0ZW5pbmdfbm9kZS5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIGlnbm9yZWRfa2V5cHJlc3NfaGFuZGxlcik7XG4gIH0gZWxzZSB7XG4gICAgbGlzdGVuaW5nX25vZGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbGlja19oYW5kbGVyKTtcbiAgICBsaXN0ZW5pbmdfbm9kZS5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIGtleXByZXNzX2hhbmRsZXIpO1xuICB9XG59XG5cblxuLyoqXG4gKiBkZWNvbW1pc3Npb24gdGhlIGV2ZW50IGxpc3RlbmVycyBmcm9tIGNhdGNoX3N1Ym1pdCgpIGFnYWluXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmNhdGNoX3N1Ym1pdChsaXN0ZW5pbmdfbm9kZSkge1xuICBsaXN0ZW5pbmdfbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGlnbm9yZWRfY2xpY2tfaGFuZGxlcik7XG4gIGxpc3RlbmluZ19ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgaWdub3JlZF9rZXlwcmVzc19oYW5kbGVyKTtcbiAgbGlzdGVuaW5nX25vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbGlja19oYW5kbGVyKTtcbiAgbGlzdGVuaW5nX25vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCBrZXlwcmVzc19oYW5kbGVyKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgdHJpbSBmcm9tICcuL3RyaW0nO1xuXG5cbi8qKlxuICogc3BsaXQgYSBzdHJpbmcgb24gY29tbWEgYW5kIHRyaW0gdGhlIGNvbXBvbmVudHNcbiAqXG4gKiBBcyBzcGVjaWZpZWQgYXRcbiAqIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZnJhc3RydWN0dXJlLmh0bWwjc3BsaXQtYS1zdHJpbmctb24tY29tbWFzXG4gKiBwbHVzIHJlbW92aW5nIGVtcHR5IGVudHJpZXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0cikge1xuICByZXR1cm4gc3RyLnNwbGl0KCcsJylcbiAgICAgICAgICAgIC5tYXAoaXRlbSA9PiB0cmltKGl0ZW0pKVxuICAgICAgICAgICAgLmZpbHRlcihiPT5iKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgc3ByaW50ZiBmcm9tICcuL3NwcmludGYnO1xuaW1wb3J0IGdldF93ZWVrX29mX3llYXIgZnJvbSAnLi9nZXRfd2Vla19vZl95ZWFyJztcblxuXG5mdW5jdGlvbiBwYWQobnVtLCBzaXplPTIpIHtcbiAgdmFyIHMgPSBudW0gKyAnJztcbiAgd2hpbGUgKHMubGVuZ3RoIDwgc2l6ZSkge1xuICAgIHMgPSAnMCcgKyBzO1xuICB9XG4gIHJldHVybiBzO1xufVxuXG5cbi8qKlxuICogY2FsY3VsYXRlIGEgc3RyaW5nIGZyb20gYSBkYXRlIGFjY29yZGluZyB0byBIVE1MNVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkYXRlX3RvX3N0cmluZyhkYXRlLCBlbGVtZW50X3R5cGUpIHtcbiAgaWYgKCEgKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3dpdGNoIChlbGVtZW50X3R5cGUpIHtcbiAgICBjYXNlICdkYXRldGltZSc6XG4gICAgICByZXR1cm4gZGF0ZV90b19zdHJpbmcoZGF0ZSwgJ2RhdGUnKSArICdUJyArXG4gICAgICAgICAgICAgZGF0ZV90b19zdHJpbmcoZGF0ZSwgJ3RpbWUnKTtcblxuICAgIGNhc2UgJ2RhdGV0aW1lLWxvY2FsJzpcbiAgICAgIHJldHVybiBzcHJpbnRmKCclcy0lcy0lc1Qlczolczolcy4lcycsXG4gICAgICAgICAgICAgICAgICAgICBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICAgICAgICAgICBwYWQoZGF0ZS5nZXRNb250aCgpICsgMSksXG4gICAgICAgICAgICAgICAgICAgICBwYWQoZGF0ZS5nZXREYXRlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgcGFkKGRhdGUuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgICAgICAgICBwYWQoZGF0ZS5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICAgICAgICAgcGFkKGRhdGUuZ2V0U2Vjb25kcygpKSxcbiAgICAgICAgICAgICAgICAgICAgIHBhZChkYXRlLmdldE1pbGxpc2Vjb25kcygpLCAzKVxuICAgICAgICAgICAgICAgICAgICkucmVwbGFjZSgvKDowMCk/XFwuMDAwJC8sICcnKTtcblxuICAgIGNhc2UgJ2Rh
46184dGUnOlxuICAgICAgcmV0dXJuIHNwcmludGYoJyVzLSVzLSVzJyxcbiAgICAgICAgICAgICAgICAgICAgIGRhdGUuZ2V0VVRDRnVsbFllYXIoKSxcbiAgICAgICAgICAgICAgICAgICAgIHBhZChkYXRlLmdldFVUQ01vbnRoKCkgKyAxKSxcbiAgICAgICAgICAgICAgICAgICAgIHBhZChkYXRlLmdldFVUQ0RhdGUoKSkpO1xuXG4gICAgY2FzZSAnbW9udGgnOlxuICAgICAgcmV0dXJuIHNwcmludGYoJyVzLSVzJywgZGF0ZS5nZXRVVENGdWxsWWVhcigpLFxuICAgICAgICAgICAgICAgICAgICAgcGFkKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpKTtcblxuICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgY29uc3QgcGFyYW1zID0gZ2V0X3dlZWtfb2ZfeWVhcihkYXRlKTtcbiAgICAgIHJldHVybiBzcHJpbnRmLmNhbGwobnVsbCwgJyVzLVclcycsIHBhcmFtc1swXSwgcGFkKHBhcmFtc1sxXSkpO1xuXG4gICAgY2FzZSAndGltZSc6XG4gICAgICByZXR1cm4gc3ByaW50ZignJXM6JXM6JXMuJXMnLFxuICAgICAgICAgICAgICAgICAgICAgIHBhZChkYXRlLmdldFVUQ0hvdXJzKCkpLFxuICAgICAgICAgICAgICAgICAgICAgIHBhZChkYXRlLmdldFVUQ01pbnV0ZXMoKSksXG4gICAgICAgICAgICAgICAgICAgICAgcGFkKGRhdGUuZ2V0VVRDU2Vjb25kcygpKSxcbiAgICAgICAgICAgICAgICAgICAgICBwYWQoZGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKSwgMylcbiAgICAgICAgICAgICAgICAgICAgKS5yZXBsYWNlKC8oOjAwKT9cXC4wMDAkLywgJycpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGF0ZSwgcGFydD11bmRlZmluZWQpIHtcbiAgc3dpdGNoIChwYXJ0KSB7XG4gICAgY2FzZSAnZGF0ZSc6XG4gICAgICByZXR1cm4gKGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nIHx8IGRhdGUudG9EYXRlU3RyaW5nKS5jYWxsKGRhdGUpO1xuICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgcmV0dXJuIChkYXRlLnRvTG9jYWxlVGltZVN0cmluZyB8fCBkYXRlLnRvVGltZVN0cmluZykuY2FsbChkYXRlKTtcbiAgICBjYXNlICdtb250aCc6XG4gICAgICByZXR1cm4gKCd0b0xvY2FsZURhdGVTdHJpbmcnIGluIGRhdGUpP1xuICAgICAgICBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh1bmRlZmluZWQsIHtcbiAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgICAgbW9udGg6ICcyLWRpZ2l0JyxcbiAgICAgICAgfSlcbiAgICAgICAgOlxuICAgICAgICBkYXRlLnRvRGF0ZVN0cmluZygpO1xuICAgIC8vIGNhc2UgJ3dlZWsnOlxuICAgIC8vIFRPRE9cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIChkYXRlLnRvTG9jYWxlU3RyaW5nIHx8IGRhdGUudG9TdHJpbmcpLmNhbGwoZGF0ZSk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG4vKipcbiAqIGNvdW50ZXIgdGhhdCB3aWxsIGJlIGluY3JlbWVudGVkIHdpdGggZXZlcnkgY2FsbFxuICpcbiAqIFdpbGwgZW5mb3JjZSB1bmlxdWVuZXNzLCBhcyBsb25nIGFzIG5vIG1vcmUgdGhhbiAxIGh5cGVyZm9ybSBzY3JpcHRzXG4gKiBhcmUgbG9hZGVkLiAoSW4gdGhhdCBjYXNlIHdlIHN0aWxsIGhhdmUgdGhlIFwicmFuZG9tXCIgcGFydCBiZWxvdy4pXG4gKi9cbnZhciB1aWQgPSAwO1xuXG5cbi8qKlxuICogZ2VuZXJhdGUgYSByYW5kb20gSURcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2dvcmRvbmJyYW5kZXIvMjIzMDMxN1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihwcmVmaXg9J2hmXycpIHtcbiAgcmV0dXJuIHByZWZpeCArICggdWlkKysgKSArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG4vKipcbiAqIHJldHVybiBhIG5ldyBEYXRlKCkgcmVwcmVzZW50aW5nIHRoZSBJU08gZGF0ZSBmb3IgYSB3ZWVrIG51bWJlclxuICpcbiAqIEBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTY1OTExNzUvMTEzMTk1XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHdlZWssIHllYXIpIHtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIDAsIDEgKyAod2VlayAtIDEpICogNykpO1xuXG4gIGlmIChkYXRlLmdldFVUQ0RheSgpIDw9IDQvKiB0aHVyc2RheSAqLykge1xuICAgIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSAtIGRhdGUuZ2V0VVRDRGF5KCkgKyAxKTtcbiAgfSBlbHNlIHtcbiAgICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyA4IC0gZGF0ZS5nZXRVVENEYXkoKSk7XG4gIH1cblxuICByZXR1cm4gZGF0ZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgZGF0ZV90b19zdHJpbmcgZnJvbSAnLi9kYXRlX3RvX3N0cmluZyc7XG5pbXBvcnQgc3RyaW5nX3RvX251bWJlciBmcm9tICcuL3N0cmluZ190b19udW1iZXInO1xuaW1wb3J0IGdldF90eXBlIGZyb20gJy4vZ2V0X3R5cGUnO1xuaW1wb3J0IF8gZnJvbSAnLi4vY29tcG9uZW50cy9sb2NhbGl6YXRpb24nO1xuaW1wb3J0IHsgZGVmYXVsdF9zdGVwLCBzdGVwX3NjYWxlX2ZhY3RvciwgZGVmYXVsdF9zdGVwX2Jhc2UsIGRlZmF1bHRfbWluLFxuICAgICAgICAgZGVmYXVsdF9tYXgsIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zdGVwX2RlZmF1bHRzJztcbmltcG9ydCB7IGRhdGVzIH0gZnJvbSAnLi4vY29tcG9uZW50cy90eXBlcyc7XG5cblxuLyoqXG4gKiBnZXQgcHJldmlvdXMgYW5kIG5leHQgdmFsaWQgdmFsdWVzIGZvciBhIHN0ZXBwZWQgaW5wdXQgZWxlbWVudFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbGVtZW50LCBuPTEpIHtcbiAgY29uc3QgdHlwZSA9IGdldF90eXBlKGVsZW1lbnQpO1xuXG4gIGNvbnN0IGFNaW4gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbWluJyk7XG4gIGxldCBtaW4gPSBkZWZh
46184dWx0X21pblt0eXBlXSB8fCBOYU47XG4gIGlmIChhTWluKSB7XG4gICAgY29uc3QgcE1pbiA9IHN0cmluZ190b19udW1iZXIoYU1pbiwgdHlwZSk7XG4gICAgaWYgKCEgaXNOYU4ocE1pbikpIHtcbiAgICAgIG1pbiA9IHBNaW47XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYU1heCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtYXgnKTtcbiAgbGV0IG1heCA9IGRlZmF1bHRfbWF4W3R5cGVdIHx8IE5hTjtcbiAgaWYgKGFNYXgpIHtcbiAgICBjb25zdCBwTWF4ID0gc3RyaW5nX3RvX251bWJlcihhTWF4LCB0eXBlKTtcbiAgICBpZiAoISBpc05hTihwTWF4KSkge1xuICAgICAgbWF4ID0gcE1heDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBhU3RlcCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzdGVwJyk7XG4gIGxldCBzdGVwID0gZGVmYXVsdF9zdGVwW3R5cGVdIHx8IDE7XG4gIGlmIChhU3RlcCAmJiBhU3RlcC50b0xvd2VyQ2FzZSgpID09PSAnYW55Jykge1xuICAgIC8qIHF1aWNrIHJldHVybjogd2UgY2Fubm90IGNhbGN1bGF0ZSBwcmV2IGFuZCBuZXh0ICovXG4gICAgcmV0dXJuIFtfKCdhbnkgdmFsdWUnKSwgXygnYW55IHZhbHVlJyldO1xuICB9IGVsc2UgaWYgKGFTdGVwKSB7XG4gICAgY29uc3QgcFN0ZXAgPSBzdHJpbmdfdG9fbnVtYmVyKGFTdGVwLCB0eXBlKTtcbiAgICBpZiAoISBpc05hTihwU3RlcCkpIHtcbiAgICAgIHN0ZXAgPSBwU3RlcDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZWZhdWx0X3ZhbHVlID0gc3RyaW5nX3RvX251bWJlcihlbGVtZW50LmdldEF0dHJpYnV0ZSgndmFsdWUnKSwgdHlwZSk7XG5cbiAgY29uc3QgdmFsdWUgPSBzdHJpbmdfdG9fbnVtYmVyKGVsZW1lbnQudmFsdWUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd2YWx1ZScpLCB0eXBlKTtcblxuICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgLyogcXVpY2sgcmV0dXJuOiB3ZSBjYW5ub3QgY2FsY3VsYXRlIHdpdGhvdXQgYSBzb2xpZCBiYXNlICovXG4gICAgcmV0dXJuIFtfKCdhbnkgdmFsaWQgdmFsdWUnKSwgXygnYW55IHZhbGlkIHZhbHVlJyldO1xuICB9XG5cbiAgY29uc3Qgc3RlcF9iYXNlID0gKFxuICAgICEgaXNOYU4obWluKT8gbWluIDogKFxuICAgICAgISBpc05hTihkZWZhdWx0X3ZhbHVlKT8gZGVmYXVsdF92YWx1ZSA6IChcbiAgICAgICAgZGVmYXVsdF9zdGVwX2Jhc2VbdHlwZV0gfHwgMFxuICAgICAgKVxuICAgIClcbiAgKTtcblxuICBjb25zdCBzY2FsZSA9IHN0ZXBfc2NhbGVfZmFjdG9yW3R5cGVdIHx8IDE7XG5cbiAgdmFyIHByZXYgPSBzdGVwX2Jhc2UgK1xuICAgIE1hdGguZmxvb3IoKHZhbHVlIC0gc3RlcF9iYXNlKSAvIChzdGVwICogc2NhbGUpKSAqIChzdGVwICogc2NhbGUpICogbjtcbiAgdmFyIG5leHQgPSBzdGVwX2Jhc2UgK1xuICAgIChNYXRoLmZsb29yKCh2YWx1ZSAtIHN0ZXBfYmFzZSkgLyAoc3RlcCAqIHNjYWxlKSkgKyAxKSAqIChzdGVwICogc2NhbGUpICogbjtcblxuICBpZiAocHJldiA8IG1pbikge1xuICAgIHByZXYgPSBudWxsO1xuICB9IGVsc2UgaWYgKHByZXYgPiBtYXgpIHtcbiAgICBwcmV2ID0gbWF4O1xuICB9XG5cbiAgaWYgKG5leHQgPiBtYXgpIHtcbiAgICBuZXh0ID0gbnVsbDtcbiAgfSBlbHNlIGlmIChuZXh0IDwgbWluKSB7XG4gICAgbmV4dCA9IG1pbjtcbiAgfVxuXG4gIC8qIGNvbnZlcnQgdG8gZGF0ZSBvYmplY3RzLCBpZiBhcHByb3ByaWF0ZSAqL1xuICBpZiAoZGF0ZXMuaW5kZXhPZih0eXBlKSA+IC0xKSB7XG4gICAgcHJldiA9IGRhdGVfdG9fc3RyaW5nKG5ldyBEYXRlKHByZXYpLCB0eXBlKTtcbiAgICBuZXh0ID0gZGF0ZV90b19zdHJpbmcobmV3IERhdGUobmV4dCksIHR5cGUpO1xuICB9XG5cbiAgcmV0dXJuIFtwcmV2LCBuZXh0XTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG4vKipcbiAqIGdldCBhbGwgcmFkaW8gYnV0dG9ucyAoaW5jbHVkaW5nIGBlbGVtZW50YCkgdGhhdCBiZWxvbmcgdG8gZWxlbWVudCdzXG4gKiByYWRpbyBncm91cFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0X3JhZGlvZ3JvdXAoZWxlbWVudCkge1xuICBpZiAoZWxlbWVudC5mb3JtKSB7XG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChcbiAgICAgIGVsZW1lbnQuZm9ybS5lbGVtZW50cyxcbiAgICAgIHJhZGlvID0+IHJhZGlvLnR5cGUgPT09ICdyYWRpbycgJiYgcmFkaW8ubmFtZSA9PT0gZWxlbWVudC5uYW1lXG4gICAgKTtcbiAgfVxuICByZXR1cm4gW2VsZW1lbnRdO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCB7IGlucHV0cyB9IGZyb20gJy4uL2NvbXBvbmVudHMvdHlwZXMnO1xuXG5cbi8qKlxuICogZ2V0IHRoZSBlbGVtZW50J3MgdHlwZSBpbiBhIGJhY2t3YXJkcy1jb21wYXRpYmxlIHdheVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50IGluc3RhbmNlb2Ygd2luZG93LkhUTUxUZXh0QXJlYUVsZW1lbnQpIHtcbiAgICByZXR1cm4gJ3RleHRhcmVhJztcblxuICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTFNlbGVjdEVsZW1lbnQpIHtcbiAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ211bHRpcGxlJyk/ICdzZWxlY3QtbXVsdGlwbGUnIDogJ3NlbGVjdC1vbmUnO1xuXG4gIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MQnV0dG9uRWxlbWVudCkge1xuICAgIHJldHVybiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSB8fCAnc3VibWl0JykudG9Mb3dlckNhc2UoKTtcblxuICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElucHV0RWxlbWVudCkge1xuICAgIGNvbnN0IGF0dHIgPSAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoYXR0ciAmJiBpbnB1dHMuaW5kZXhPZihhdHRyKSA+IC0xKSB7XG4gICAgICByZXR1cm4gYXR0cjtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogcGVyaGFwcyB0aGUgRE9NIGhhcyBpbi1kZXB0aCBrbm93bGVkZ2UuIFRha2UgdGhhdCBiZWZvcmUgcmV0dXJuaW5nXG4gICAgICAgKiAndGV4dCcuICovXG4gICAgICByZXR1cm4gZWxlbWVudC50eXBlIHx8ICd0ZXh0JztcbiAgICB9XG5cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgeyBnZXRfd3JhcHBlciB9IGZyb20gJy4uL2NvbXBvbmVudHMvd3JhcHBlcic7XG5cblxuLyoqXG4gKiBmaWx0ZXIgYSBmb3JtJ3MgZWxlbWVudHMgZm9yIHRoZSBvbmVzIG5lZWRpbmcgdmFsaWRhdGlvbiBwcmlvciB0b1xuICogYSBzdWJtaXRcbiAqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRfdmFsaWRhdGVkX2VsZW1lbnRzKGZvcm0pIHtcbiAgY29uc3Qgd3JhcHBlZF9mb3JtID0gZ2V0X3dyYXBwZXIoZm9ybSk7XG5cbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChmb3JtLmVsZW1lbnRzLCBlbGVtZW50ID0+IHtcbiAgICAvKiBpdCBtdXN0IGhh
46184dmUgYSBuYW1lIChvciB2YWxpZGF0aW5nIG5hbWVsZXNzIGlucHV0cyBpcyBhbGxvd2VkKSAqL1xuICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpIHx8XG4gICAgICAgICh3cmFwcGVkX2Zvcm0gJiYgd3JhcHBlZF9mb3JtLnNldHRpbmdzLnZhbGlkYXRlTmFtZWxlc3MpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG4vKiBGb3IgYSBnaXZlbiBkYXRlLCBnZXQgdGhlIElTTyB3ZWVrIG51bWJlclxuICpcbiAqIFNvdXJjZTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNjExNzg4OS8xMTMxOTVcbiAqXG4gKiBCYXNlZCBvbiBpbmZvcm1hdGlvbiBhdDpcbiAqXG4gKiAgICBodHRwOi8vd3d3Lm1lcmx5bi5kZW1vbi5jby51ay93ZWVrY2FsYy5odG0jV05SXG4gKlxuICogQWxnb3JpdGhtIGlzIHRvIGZpbmQgbmVhcmVzdCB0aHVyc2RheSwgaXQncyB5ZWFyXG4gKiBpcyB0aGUgeWVhciBvZiB0aGUgd2VlayBudW1iZXIuIFRoZW4gZ2V0IHdlZWtzXG4gKiBiZXR3ZWVuIHRoYXQgZGF0ZSBhbmQgdGhlIGZpcnN0IGRheSBvZiB0aGF0IHllYXIuXG4gKlxuICogTm90ZSB0aGF0IGRhdGVzIGluIG9uZSB5ZWFyIGNhbiBiZSB3ZWVrcyBvZiBwcmV2aW91c1xuICogb3IgbmV4dCB5ZWFyLCBvdmVybGFwIGlzIHVwIHRvIDMgZGF5cy5cbiAqXG4gKiBlLmcuIDIwMTQvMTIvMjkgaXMgTW9uZGF5IGluIHdlZWsgIDEgb2YgMjAxNVxuICogICAgICAyMDEyLzEvMSAgIGlzIFN1bmRheSBpbiB3ZWVrIDUyIG9mIDIwMTFcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZCkge1xuICAvKiBDb3B5IGRhdGUgc28gZG9uJ3QgbW9kaWZ5IG9yaWdpbmFsICovXG4gIGQgPSBuZXcgRGF0ZSgrZCk7XG4gIGQuc2V0VVRDSG91cnMoMCwgMCwgMCk7XG4gIC8qIFNldCB0byBuZWFyZXN0IFRodXJzZGF5OiBjdXJyZW50IGRhdGUgKyA0IC0gY3VycmVudCBkYXkgbnVtYmVyXG4gICAqIE1ha2UgU3VuZGF5J3MgZGF5IG51bWJlciA3ICovXG4gIGQuc2V0VVRDRGF0ZShkLmdldFVUQ0RhdGUoKSArIDQgLSAoZC5nZXRVVENEYXkoKXx8NykpO1xuICAvKiBHZXQgZmlyc3QgZGF5IG9mIHllYXIgKi9cbiAgY29uc3QgeWVhclN0YXJ0ID0gbmV3IERhdGUoZC5nZXRVVENGdWxsWWVhcigpLDAsMSk7XG4gIC8qIENhbGN1bGF0ZSBmdWxsIHdlZWtzIHRvIG5lYXJlc3QgVGh1cnNkYXkgKi9cbiAgY29uc3Qgd2Vla05vID0gTWF0aC5jZWlsKCggKCAoZCAtIHllYXJTdGFydCkgLyA4NjQwMDAwMCkgKyAxKS83KTtcbiAgLyogUmV0dXJuIGFycmF5IG9mIHllYXIgYW5kIHdlZWsgbnVtYmVyICovXG4gIHJldHVybiBbZC5nZXRVVENGdWxsWWVhcigpLCB3ZWVrTm9dO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbGVtZW50KSB7XG4gIHJldHVybiAoXG4gICAgICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MQnV0dG9uRWxlbWVudCB8fFxuICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElucHV0RWxlbWVudCB8fFxuICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTFNlbGVjdEVsZW1lbnQgfHxcbiAgICAgICAgICBlbGVtZW50IGluc3RhbmNlb2Ygd2luZG93LkhUTUxUZXh0QXJlYUVsZW1lbnQgfHxcbiAgICAgICAgICBlbGVtZW50IGluc3RhbmNlb2Ygd2luZG93LkhUTUxGaWVsZFNldEVsZW1lbnQgfHxcbiAgICAgICAgICBlbGVtZW50ID09PSB3aW5kb3cuSFRNTEJ1dHRvbkVsZW1lbnQucHJvdG90eXBlIHx8XG4gICAgICAgICAgZWxlbWVudCA9PT0gd2luZG93LkhUTUxJbnB1dEVsZW1lbnQucHJvdG90eXBlIHx8XG4gICAgICAgICAgZWxlbWVudCA9PT0gd2luZG93LkhUTUxTZWxlY3RFbGVtZW50LnByb3RvdHlwZSB8fFxuICAgICAgICAgIGVsZW1lbnQgPT09IHdpbmRvdy5IVE1MVGV4dEFyZWFFbGVtZW50LnByb3RvdHlwZSB8fFxuICAgICAgICAgIGVsZW1lbnQgPT09IHdpbmRvdy5IVE1MRmllbGRTZXRFbGVtZW50LnByb3RvdHlwZVxuICAgICAgICAgKTtcbn1cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCB7IGRvX2ZpbHRlciB9IGZyb20gJy4uL2NvbXBvbmVudHMvaG9va3MnO1xuaW1wb3J0IHsgdmFsaWRhdGlvbl9jYW5kaWRhdGVzLCBub25faW5wdXRzIH0gZnJvbSAnLi4vY29tcG9uZW50cy90eXBlcyc7XG5pbXBvcnQgeyBnZXRfd3JhcHBlciB9IGZyb20gJy4uL2NvbXBvbmVudHMvd3JhcHBlcic7XG5pbXBvcnQgZ2V0X3R5cGUgZnJvbSAnLi4vdG9vbHMvZ2V0X3R5cGUnO1xuXG5cbi8qKlxuICogY2hlY2sgaWYgYW4gZWxlbWVudCBzaG91bGQgYmUgaWdub3JlZCBkdWUgdG8gYW55IG9mIGl0cyBwYXJlbnRzXG4gKlxuICogQ2hlY2tzIDxmaWVsZHNldCBkaXNhYmxlZD4gYW5kIDxkYXRhbGlzdD4uXG4gKi9cbmZ1bmN0aW9uIGlzX2luX2Rpc2FsbG93ZWRfcGFyZW50KGVsZW1lbnQpIHtcbiAgbGV0IHAgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gIHdoaWxlIChwICYmIHAubm9kZVR5cGUgPT09IDEpIHtcbiAgICBpZiAocCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MRmllbGRTZXRFbGVtZW50ICYmXG4gICAgICAgIHAuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSB7XG4gICAgICAvKiBxdWljayByZXR1cm4sIGlmIGl0J3MgYSBjaGlsZCBvZiBhIGRpc2FibGVkIGZpZWxkc2V0ICovXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHAubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0RBVEFMSVNUJykge1xuICAgICAgLyogcXVpY2sgcmV0dXJuLCBpZiBpdCdzIGEgY2hpbGQgb2YgYSBkYXRhbGlzdFxuICAgICAgICogRG8gbm90IHVzZSBIVE1MRGF0YUxpc3RFbGVtZW50IHRvIHN1cHBvcnQgb2xkZXIgYnJvd3NlcnMsXG4gICAgICAgKiB0b28uXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjdGhlLWRhdGFsaXN0LWVsZW1lbnQ6YmFycmVkLWZyb20tY29uc3RyYWludC12YWxpZGF0aW9uXG4gICAgICAgKi9cbiAgICAgIHJldHVybi
46184B0cnVlO1xuICAgIH0gZWxzZSBpZiAocCA9PT0gZWxlbWVudC5mb3JtKSB7XG4gICAgICAvKiB0aGUgb3V0ZXIgYm91bmRhcnkuIFdlIGNhbiBzdG9wIGxvb2tpbmcgZm9yIHJlbGV2YW50IGVsZW1lbnRzLiAqL1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHAgPSBwLnBhcmVudE5vZGU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5cbi8qKlxuICogY2hlY2sgaWYgYW4gZWxlbWVudCBpcyBhIGNhbmRpZGF0ZSBmb3IgY29uc3RyYWludCB2YWxpZGF0aW9uXG4gKlxuICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2JhcnJlZC1mcm9tLWNvbnN0cmFpbnQtdmFsaWRhdGlvblxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbGVtZW50KSB7XG5cbiAgLyogYWxsb3cgYSBzaG9ydGN1dCB2aWEgZmlsdGVycywgZS5nLiB0byB2YWxpZGF0ZSB0eXBlPWhpZGRlbiBmaWVsZHMgKi9cbiAgY29uc3QgZmlsdGVyZWQgPSBkb19maWx0ZXIoJ2lzX3ZhbGlkYXRpb25fY2FuZGlkYXRlJywgbnVsbCwgZWxlbWVudCk7XG4gIGlmIChmaWx0ZXJlZCAhPT0gbnVsbCkge1xuICAgIHJldHVybiAhISBmaWx0ZXJlZDtcbiAgfVxuXG4gIC8qIGl0IG11c3QgYmUgYW55IG9mIHRob3NlIGVsZW1lbnRzICovXG4gIGlmIChlbGVtZW50IGluc3RhbmNlb2Ygd2luZG93LkhUTUxTZWxlY3RFbGVtZW50XG4gICAgICB8fFxuICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MVGV4dEFyZWFFbGVtZW50XG4gICAgICB8fFxuICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MQnV0dG9uRWxlbWVudFxuICAgICAgfHxcbiAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElucHV0RWxlbWVudCkge1xuXG4gICAgY29uc3QgdHlwZSA9IGdldF90eXBlKGVsZW1lbnQpO1xuICAgIC8qIGl0cyB0eXBlIG11c3QgYmUgaW4gdGhlIHdoaXRlbGlzdCAqL1xuICAgIGlmIChub25faW5wdXRzLmluZGV4T2YodHlwZSkgPiAtMSB8fFxuICAgICAgICB2YWxpZGF0aW9uX2NhbmRpZGF0ZXMuaW5kZXhPZih0eXBlKSA+IC0xKSB7XG5cbiAgICAgIC8qIGl0IG11c3RuJ3QgYmUgZGlzYWJsZWQgb3IgcmVhZG9ubHkgKi9cbiAgICAgIGlmICghIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpICYmXG4gICAgICAgICAgISBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgncmVhZG9ubHknKSkge1xuXG4gICAgICAgIGNvbnN0IHdyYXBwZWRfZm9ybSA9IGdldF93cmFwcGVyKGVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIC8qIHRoZSBwYXJlbnQgZm9ybSBkb2Vzbid0IGFsbG93IG5vbi1zdGFuZGFyZCBcIm5vdmFsaWRhdGVcIiBhdHRyaWJ1dGVzLi4uICovXG4gICAgICAgICAgICAod3JhcHBlZF9mb3JtICYmICEgd3JhcHBlZF9mb3JtLnNldHRpbmdzLm5vdmFsaWRhdGVPbkVsZW1lbnRzKSB8fFxuICAgICAgICAgICAgLyogLi4ub3IgaXQgZG9lc24ndCBoYXZlIHN1Y2ggYW4gYXR0cmlidXRlL3Byb3BlcnR5ICovXG4gICAgICAgICAgICAoISBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbm92YWxpZGF0ZScpICYmICEgZWxlbWVudC5ub1ZhbGlkYXRlKVxuICAgICAgICAgICAgKSB7XG5cbiAgICAgICAgICAvKiBpdCBpc24ndCBwYXJ0IG9mIGEgPGZpZWxkc2V0IGRpc2FibGVkPiAqL1xuICAgICAgICAgIGlmICghIGlzX2luX2Rpc2FsbG93ZWRfcGFyZW50KGVsZW1lbnQpKSB7XG5cbiAgICAgICAgICAgIC8qIHRoZW4gaXQncyBhIGNhbmRpZGF0ZSAqL1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyogdGhpcyBpcyBubyBIVE1MNSB2YWxpZGF0aW9uIGNhbmRpZGF0ZS4uLiAqL1xuICByZXR1cm4gZmFsc2U7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogbWFyayBhbiBvYmplY3Qgd2l0aCBhICdfX2h5cGVyZm9ybT10cnVlJyBwcm9wZXJ0eVxuICpcbiAqIFdlIHVzZSB0aGlzIHRvIGRpc3Rpbmd1aXNoIG91ciBwcm9wZXJ0aWVzIGZyb20gdGhlIG5hdGl2ZSBvbmVzLiBVc2FnZTpcbiAqIGpzPiBtYXJrKG9iaik7XG4gKiBqcz4gYXNzZXJ0KG9iai5fX2h5cGVyZm9ybSA9PT0gdHJ1ZSlcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob2JqKSB7XG4gIGlmIChbJ29iamVjdCcsICdmdW5jdGlvbiddLmluZGV4T2YodHlwZW9mIG9iaikgPiAtMSkge1xuICAgIGRlbGV0ZSBvYmouX19oeXBlcmZvcm07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgJ19faHlwZXJmb3JtJywge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIHNoaW0gbGF5ZXIgZm9yIHRoZSBFbGVtZW50Lm1hdGNoZXMgbWV0aG9kICovXG5cbmNvbnN0IGVwID0gd2luZG93LkVsZW1lbnQucHJvdG90eXBlO1xuY29uc3QgbmF0aXZlX21hdGNoZXMgPSBlcC5tYXRjaGVzIHx8XG4gICAgICAgICAgICAgICAgICAgICAgIGVwLm1hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICAgICBlcC5tc01hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICAgICBlcC53ZWJraXRNYXRjaGVzU2VsZWN0b3I7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gIHJldHVybiBuYXRpdmVfbWF0Y2hlcy5jYWxsKGVsZW1lbnQsIHNlbGVjdG9yKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgaW5zdGFsbF9wcm9wZXJ0eSBmcm9tICcuL3Byb3BlcnR5X2luc3RhbGxlcic7XG5pbXBvcnQgaXNfZmllbGQgZnJvbSAnLi9pc19maWVsZCc7XG5pbXBvcnQgbWFyayBmcm9tICcuL21hcmsnO1xuXG5pbXBvcnQgY2hlY2tWYWxpZGl0eSBmcm9tICcuLi9wb2x5ZmlsbHMvY2hlY2tWYWxpZGl0eSc7XG5pbXBvcnQgcmVwb3J0VmFsaWRpdHkgZnJvbSAnLi4vcG9seWZpbGxzL3JlcG9ydFZhbGlkaXR5JztcbmltcG9ydCBzZXRDdXN0b21WYWxpZGl0eSBmcm9tICcuLi9wb2x5ZmlsbHMvc2V0Q3VzdG9tVmFsaWRpdHknO1xuaW1wb3J0IHN0ZXBEb3duIGZyb20gJy4uL3BvbHlmaWxscy9zdGVwRG93bic7XG5pbXBvcnQgc3RlcFVwIGZyb20gJy4uL3BvbHlmaWxscy9zdGVwVXAnO1xuaW1wb3J0IHZhbGlkYXRpb25NZXNzYWdlIGZyb20gJy4uL3BvbHlmaWxscy92YWxpZGF0aW9uTWVzc2FnZSc7XG5pbXBvcnQgVmFsaWRpdHlTdGF0ZSBmcm9tICcuLi9wb2x5ZmlsbHMvdmFsaWRpdHlTdGF0ZSc7XG5pbXBvcnQgdmFsdWVBc0RhdGUgZnJvbSAnLi4vcG9seWZpbGxzL3ZhbHVlQXNEYXRlJztcbmltcG9ydCB2YWx1ZUFzTnVtYmVyIGZyb20gJy4uL3BvbHlmaWxscy92YWx1ZUFzTnVtYmVyJztcbmltcG9ydCB3aWxsVmFsaWRhdGUgZnJvbSAnLi4vcG9seWZpbGxzL3dpbGxWYWxpZGF0ZSc7XG5pbXBvcnQgeyBpbnN0YWxsX3Byb3BlcnRpZXMgfSBmcm9tICcuLi9wb2x5ZmlsbHMvcHJvcGVydGllcyc7XG5cblxuY29uc3QgcG9seWZpbGxzID0ge1xuICAgIGNoZWNrVmFsaWRpdHk6IHtcbiAgICAgIHZhbHVlOiBtYXJrKGZ1bmN0aW9uKCkgeyByZXR1cm4gY2hlY2tWYWxpZGl0eSh0aGlzKTsgfSksXG4gICAgfSxcbiAgICByZXBvcnRWYWxpZGl0eToge1xuICAgICAgdmFsdWU6IG1hcmsoZnVuY3Rpb24oKSB7IHJldHVybi
46184ByZXBvcnRWYWxpZGl0eSh0aGlzKTsgfSksXG4gICAgfSxcbiAgICBzZXRDdXN0b21WYWxpZGl0eToge1xuICAgICAgdmFsdWU6IG1hcmsoZnVuY3Rpb24gKG1zZykgeyByZXR1cm4gc2V0Q3VzdG9tVmFsaWRpdHkodGhpcywgbXNnKTsgfSksXG4gICAgfSxcbiAgICBzdGVwRG93bjoge1xuICAgICAgdmFsdWU6IG1hcmsoZnVuY3Rpb24obj0xKSB7IHJldHVybiBzdGVwRG93bih0aGlzLCBuKTsgfSksXG4gICAgfSxcbiAgICBzdGVwVXA6IHtcbiAgICAgIHZhbHVlOiBtYXJrKGZ1bmN0aW9uKG49MSkgeyByZXR1cm4gc3RlcFVwKHRoaXMsIG4pOyB9KSxcbiAgICB9LFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiB7XG4gICAgICBnZXQ6IG1hcmsoZnVuY3Rpb24oKSB7IHJldHVybiB2YWxpZGF0aW9uTWVzc2FnZSh0aGlzKTsgfSksXG4gICAgfSxcbiAgICB2YWxpZGl0eToge1xuICAgICAgZ2V0OiBtYXJrKGZ1bmN0aW9uKCkgeyByZXR1cm4gVmFsaWRpdHlTdGF0ZSh0aGlzKTsgfSksXG4gICAgfSxcbiAgICB2YWx1ZUFzRGF0ZToge1xuICAgICAgZ2V0OiBtYXJrKGZ1bmN0aW9uKCkgeyByZXR1cm4gdmFsdWVBc0RhdGUodGhpcyk7IH0pLFxuICAgICAgc2V0OiBtYXJrKGZ1bmN0aW9uKHZhbHVlKSB7IHZhbHVlQXNEYXRlKHRoaXMsIHZhbHVlKTsgfSksXG4gICAgfSxcbiAgICB2YWx1ZUFzTnVtYmVyOiB7XG4gICAgICBnZXQ6IG1hcmsoZnVuY3Rpb24oKSB7IHJldHVybiB2YWx1ZUFzTnVtYmVyKHRoaXMpOyB9KSxcbiAgICAgIHNldDogbWFyayhmdW5jdGlvbih2YWx1ZSkgeyB2YWx1ZUFzTnVtYmVyKHRoaXMsIHZhbHVlKTsgfSksXG4gICAgfSxcbiAgICB3aWxsVmFsaWRhdGU6IHtcbiAgICAgIGdldDogbWFyayhmdW5jdGlvbigpIHsgcmV0dXJuIHdpbGxWYWxpZGF0ZSh0aGlzKTsgfSksXG4gICAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgaWYgKGlzX2ZpZWxkKGVsZW1lbnQpKSB7XG5cbiAgICBmb3IgKGxldCBwcm9wIGluIHBvbHlmaWxscykge1xuICAgICAgaW5zdGFsbF9wcm9wZXJ0eShlbGVtZW50LCBwcm9wLCBwb2x5ZmlsbHNbcHJvcF0pO1xuICAgIH1cblxuICAgIGluc3RhbGxfcHJvcGVydGllcyhlbGVtZW50KTtcblxuICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEZvcm1FbGVtZW50IHx8XG4gICAgICAgICAgICAgZWxlbWVudCA9PT0gd2luZG93LkhUTUxGb3JtRWxlbWVudC5wcm90b3R5cGUpIHtcbiAgICBpbnN0YWxsX3Byb3BlcnR5KGVsZW1lbnQsICdjaGVja1ZhbGlkaXR5JywgcG9seWZpbGxzLmNoZWNrVmFsaWRpdHkpO1xuICAgIGluc3RhbGxfcHJvcGVydHkoZWxlbWVudCwgJ3JlcG9ydFZhbGlkaXR5JywgcG9seWZpbGxzLnJlcG9ydFZhbGlkaXR5KTtcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBpc19maWVsZCBmcm9tICcuL2lzX2ZpZWxkJztcbmltcG9ydCB1bmluc3RhbGxfcHJvcGVydHkgZnJvbSAnLi9wcm9wZXJ0eV91bmluc3RhbGxlcic7XG5pbXBvcnQgeyB1bmluc3RhbGxfcHJvcGVydGllcyB9IGZyb20gJy4uL3BvbHlmaWxscy9wcm9wZXJ0aWVzJztcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbGVtZW50KSB7XG4gIGlmIChpc19maWVsZChlbGVtZW50KSkge1xuXG4gICAgdW5pbnN0YWxsX3Byb3BlcnR5KGVsZW1lbnQsICdjaGVja1ZhbGlkaXR5Jyk7XG4gICAgdW5pbnN0YWxsX3Byb3BlcnR5KGVsZW1lbnQsICdyZXBvcnRWYWxpZGl0eScpO1xuICAgIHVuaW5zdGFsbF9wcm9wZXJ0eShlbGVtZW50LCAnc2V0Q3VzdG9tVmFsaWRpdHknKTtcbiAgICB1bmluc3RhbGxfcHJvcGVydHkoZWxlbWVudCwgJ3N0ZXBEb3duJyk7XG4gICAgdW5pbnN0YWxsX3Byb3BlcnR5KGVsZW1lbnQsICdzdGVwVXAnKTtcbiAgICB1bmluc3RhbGxfcHJvcGVydHkoZWxlbWVudCwgJ3ZhbGlkYXRpb25NZXNzYWdlJyk7XG4gICAgdW5pbnN0YWxsX3Byb3BlcnR5KGVsZW1lbnQsICd2YWxpZGl0eScpO1xuICAgIHVuaW5zdGFsbF9wcm9wZXJ0eShlbGVtZW50LCAndmFsdWVBc0RhdGUnKTtcbiAgICB1bmluc3RhbGxfcHJvcGVydHkoZWxlbWVudCwgJ3ZhbHVlQXNOdW1iZXInKTtcbiAgICB1bmluc3RhbGxfcHJvcGVydHkoZWxlbWVudCwgJ3dpbGxWYWxpZGF0ZScpO1xuXG4gICAgdW5pbnN0YWxsX3Byb3BlcnRpZXMoZWxlbWVudCk7XG5cbiAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2Ygd2luZG93LkhUTUxGb3JtRWxlbWVudCkge1xuICAgIHVuaW5zdGFsbF9wcm9wZXJ0eShlbGVtZW50LCAnY2hlY2tWYWxpZGl0eScpO1xuICAgIHVuaW5zdGFsbF9wcm9wZXJ0eShlbGVtZW50LCAncmVwb3J0VmFsaWRpdHknKTtcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCB7IGdldF93cmFwcGVyIH0gZnJvbSAnLi4vY29tcG9uZW50cy93cmFwcGVyJztcblxuXG4vKipcbiAqIGFkZCBgcHJvcGVydHlgIHRvIGFuIGVsZW1lbnRcbiAqXG4gKiBBVFRFTlRJT04hIFRoaXMgZnVuY3Rpb24gd2lsbCBzZWFyY2ggZm9yIGFuIGVxdWFsbHkgbmFtZWQgcHJvcGVydHkgb24gdGhlXG4gKiAqcHJvdG90eXBlKiBvZiBhbiBlbGVtZW50LCBpZiBlbGVtZW50IGlzIGEgY29uY3JldGUgRE9NIG5vZGUuIERvIG5vdCB1c2VcbiAqIGl0IGFzIGdlbmVyYWwtcHVycG9zZSBwcm9wZXJ0eSBpbnN0YWxsZXIuXG4gKlxuICoganM+IGluc3RhbGxlcihlbGVtZW50LCAnZm9vJywgeyB2YWx1ZTogJ2JhcicgfSk7XG4gKiBqcz4gYXNzZXJ0KGVsZW1lbnQuZm9vID09PSAnYmFyJyk7XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVsZW1lbnQsIHByb3BlcnR5LCBkZXNjcmlwdG9yKSB7XG4gIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgZGVzY3JpcHRvci
461845lbnVtZXJhYmxlID0gdHJ1ZTtcbiAgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikge1xuICAgIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICB9XG5cbiAgLyogb24gY29uY3JldGUgaW5zdGFuY2VzLCBpLmUuLCA8aW5wdXQ+IGVsZW1lbnRzLCB0aGUgbmFpdmUgbG9va3VwXG4gICAqIHlpZWxkcyB1bmRlZmluZWQuIFdlIGhhdmUgdG8gbG9vayBvbiBpdHMgcHJvdG90eXBlIHRoZW4uIE9uIGVsZW1lbnRzXG4gICAqIGxpa2UgdGhlIGFjdHVhbCBIVE1MSW5wdXRFbGVtZW50IG9iamVjdCB0aGUgZmlyc3QgbGluZSB3b3Jrcy4gKi9cbiAgbGV0IG9yaWdpbmFsX2Rlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGVsZW1lbnQsIHByb3BlcnR5KTtcbiAgaWYgKG9yaWdpbmFsX2Rlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgIG9yaWdpbmFsX2Rlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5nZXRQcm90b3R5cGVPZihlbGVtZW50KSwgcHJvcGVydHkpO1xuICB9XG5cbiAgaWYgKG9yaWdpbmFsX2Rlc2NyaXB0b3IpIHtcblxuICAgIGlmIChvcmlnaW5hbF9kZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgIC8qIFNhZmFyaSA8PSA5IGFuZCBQaGFudG9tSlMgd2lsbCBlbmQgdXAgaGVyZSA6LSggTm90aGluZyB0byBkbyBleGNlcHRcbiAgICAgICAqIHdhcm5pbmcgKi9cbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBnZXRfd3JhcHBlcihlbGVtZW50KTtcbiAgICAgIGlmICh3cmFwcGVyICYmIHdyYXBwZXIuc2V0dGluZ3MuZGVidWcpIHtcbiAgICAgICAgLyogZ2xvYmFsIGNvbnNvbGUgKi9cbiAgICAgICAgY29uc29sZS5sb2coJ1toeXBlcmZvcm1dIGNhbm5vdCBpbnN0YWxsIGN1c3RvbSBwcm9wZXJ0eSAnK3Byb3BlcnR5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKiB3ZSBhbHJlYWR5IGluc3RhbGxlZCB0aGF0IHByb3BlcnR5Li4uICovXG4gICAgaWYgKChvcmlnaW5hbF9kZXNjcmlwdG9yLmdldCAmJiBvcmlnaW5hbF9kZXNjcmlwdG9yLmdldC5fX2h5cGVyZm9ybSkgfHxcbiAgICAgICAgKG9yaWdpbmFsX2Rlc2NyaXB0b3IudmFsdWUgJiYgb3JpZ2luYWxfZGVzY3JpcHRvci
4618452YWx1ZS5fX2h5cGVyZm9ybSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKiBwdWJsaXNoIGV4aXN0aW5nIHByb3BlcnR5IHVuZGVyIG5ldyBuYW1lLCBpZiBpdCdzIG5vdCBmcm9tIHVzICovXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgZWxlbWVudCxcbiAgICAgICdfb3JpZ2luYWxfJytwcm9wZXJ0eSxcbiAgICAgIG9yaWdpbmFsX2Rlc2NyaXB0b3JcbiAgICApO1xuICB9XG5cbiAgZGVsZXRlIGVsZW1lbnRbcHJvcGVydHldO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgcHJvcGVydHksIGRlc2NyaXB0b3IpO1xuXG4gIHJldHVybiB0cnVlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCB7IGdldF93cmFwcGVyIH0gZnJvbSAnLi4vY29tcG9uZW50cy93cmFwcGVyJztcblxuXG4vKipcbiAqIHJlbW92ZSBgcHJvcGVydHlgIGZyb20gZWxlbWVudCBhbmQgcmVzdG9yZSBfb3JpZ2luYWxfcHJvcGVydHksIGlmIHByZXNlbnRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWxlbWVudCwgcHJvcGVydHkpIHtcbiAgdHJ5IHtcbiAgICBkZWxldGUgZWxlbWVudFtwcm9wZXJ0eV07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvKiBTYWZhcmkgPD0gOSBhbmQgUGhhbnRvbUpTIHdpbGwgZW5kIHVwIGhlcmUgOi0oIE5vdGhpbmcgdG8gZG8gZXhjZXB0XG4gICAgICogd2FybmluZyAqL1xuICAgIGNvbnN0IHdyYXBwZXIgPSBnZXRfd3JhcHBlcihlbGVtZW50KTtcbiAgICBpZiAod3JhcHBlciAmJiB3cmFwcGVyLnNldHRpbmdzLmRlYnVnKSB7XG4gICAgICAvKiBnbG9iYWwgY29uc29sZSAqL1xuICAgICAgY29uc29sZS5sb2coJ1toeXBlcmZvcm1dIGNhbm5vdCB1bmluc3RhbGwgY3VzdG9tIHByb3BlcnR5ICcrcHJvcGVydHkpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBvcmlnaW5hbF9kZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX29yaWdpbmFsXycrcHJvcGVydHkpO1xuXG4gIGlmIChvcmlnaW5hbF9kZXNjcmlwdG9yKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsIHByb3BlcnR5LCBvcmlnaW5hbF9kZXNjcmlwdG9yKTtcbiAgfVxuXG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxuaW1wb3J0IHsgY2FsbF9ob29rIH0gZnJvbSAnLi4vY29tcG9uZW50cy9ob29rcy5qcyc7XG5cblxuLyoqXG4gKiByZXR1cm4gZWl0aGVyIHRoZSBkYXRhIG9mIGEgaG9vayBjYWxsIG9yIHRoZSByZXN1bHQgb2YgYWN0aW9uLCBpZiB0aGVcbiAqIGZvcm1lciBpcyB1bmRlZmluZWRcbiAqXG4gKiBAcmV0dXJuIGZ1bmN0aW9uIGEgZnVuY3Rpb24gd3JhcHBlciBhcm91bmQgYWN0aW9uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGhvb2ssIGFjdGlvbikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgZGF0YSA9IGNhbGxfaG9vayhob29rLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcblxuICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdHIsIC4uLmFyZ3MpIHtcbiAgY29uc3QgYXJnc19sZW5ndGggPSBhcmdzLmxlbmd0aDtcbiAgdmFyIGdsb2JhbF9pbmRleCA9IDA7XG5cbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8lKFswLTldK1xcJCk/KFtzbF0pL2csIChtYXRjaCwgcG9zaXRpb24sIHR5cGUpID0+IHtcbiAgICB2YXIgbG9jYWxfaW5kZXggPSBnbG9iYWxfaW5kZXg7XG4gICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICBsb2NhbF9pbmRleCA9IE51bWJlcihwb3NpdGlvbi5yZXBsYWNlKC9cXCQkLywgJycpKSAtIDE7XG4gICAgfVxuICAgIGdsb2JhbF9pbmRleCArPSAxO1xuXG4gICAgdmFyIGFyZyA9ICcnO1xuICAgIGlmIChhcmdzX2xlbmd0aCA+IGxvY2FsX2luZGV4KSB7XG4gICAgICBhcmcgPSBhcmdzW2xvY2FsX2luZGV4XTtcbiAgICB9XG5cbiAgICBpZiAoYXJnIGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICBhcmcgaW5zdGFuY2VvZiBOdW1iZXIpIHtcbiAgICAgIC8qIHRyeSBnZXR0aW5nIGEgbG9jYWxpemVkIHJlcHJlc2VudGF0aW9uIG9mIGRhdGVzIGFuZCBudW1iZXJzLCBpZiB0aGVcbiAgICAgICAqIGJyb3dzZXIgc3VwcG9ydHMgdGhpcyAqL1xuICAgICAgaWYgKHR5cGUgPT09ICdsJykge1xuICAgICAgICBhcmcgPSAoYXJnLnRvTG9jYWxlU3RyaW5nIHx8IGFyZy50b1N0cmluZykuY2FsbChhcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJnID0gYXJnLnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZztcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxuaW1wb3J0IGdldF9kYXRlX2Zyb21fd2VlayBmcm9tICcuL2dldF9kYXRlX2Zyb21fd2Vlayc7XG5cblxuLyoqXG4gKiBjYWxjdWxhdGUgYSBkYXRlIGZyb20gYSBzdHJpbmcgYWNjb3JkaW5nIHRvIEhUTUw1XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0cmluZywgZWxlbWVudF90eXBlKSB7XG4gIGxldCBkYXRlO1xuICBzd2l0Y2ggKGVsZW1lbnRfdHlwZSkge1xuICAgIGNhc2UgJ2RhdGV0aW1lJzpcbiAgICAgIGlmICghIC9eKFswLTldezR9KS0oMFsxLTldfDFbMDEyXSktKDBbMS05XXxbMTJdWzAtOV18M1swMV0pVChbMDFdWzAtOV18MlswLTNdKTooWzAtNV1bMC05XSkoPzo6KFswLTVdWzAtOV0pKD86XFwuKFswLTldezEsM30pKT8pPyQvLnRlc3Qoc3RyaW5nKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGRhdGUgPSBuZXcgRGF0ZShzdHJpbmcrJ3onKTtcbiAgICAgIHJldHVybiBpc05hTihkYXRlLnZhbHVlT2YoKSk/IG51bGwgOiBkYXRlO1xuXG4gICAgY2FzZSAnZGF0ZSc6XG4gICAgICBpZiAoISAvXihbMC05XXs0fSktKDBbMS05XXwxWzAxMl0pLSgwWzEtOV18WzEyXVswLTldfDNbMDFdKSQvLnRlc3Qoc3RyaW5nKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGRhdGUgPSBuZXcgRGF0ZShzdHJpbmcpO1xuICAgICAgcmV0dXJuIGlzTmFOKGRhdGUudmFsdWVPZigpKT8gbnVsbCA6IGRhdGU7XG5cbiAgICBjYXNlICdtb250aCc6XG4gICAgICBpZiAoISAvXihbMC05XXs0fSktKDBbMS05XXwxWzAxMl0pJC8udGVzdChzdHJpbmcpKSB7XG4gICAgICAgI
46184HJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgZGF0ZSA9IG5ldyBEYXRlKHN0cmluZyk7XG4gICAgICByZXR1cm4gaXNOYU4oZGF0ZS52YWx1ZU9mKCkpPyBudWxsIDogZGF0ZTtcblxuICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgaWYgKCEgL14oWzAtOV17NH0pLVcoMFsxLTldfFsxMjM0XVswLTldfDVbMC0zXSkkLy50ZXN0KHN0cmluZykpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0X2RhdGVfZnJvbV93ZWVrKE51bWJlcihSZWdFeHAuJDIpLCBOdW1iZXIoUmVnRXhwLiQxKSk7XG5cbiAgICBjYXNlICd0aW1lJzpcbiAgICAgIGlmICghIC9eKFswMV1bMC05XXwyWzAtM10pOihbMC01XVswLTldKSg/OjooWzAtNV1bMC05XSkoPzpcXC4oWzAtOV17MSwzfSkpPyk/JC8udGVzdChzdHJpbmcpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgZGF0ZSA9IG5ldyBEYXRlKCcxOTcwLTAxLTAxVCcrc3RyaW5nKyd6Jyk7XG4gICAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBzdHJpbmdfdG9fZGF0ZSBmcm9tICcuL3N0cmluZ190b19kYXRlJztcblxuXG4vKipcbiAqIGNhbGN1bGF0ZSBhIG51bWJlciBmcm9tIGEgc3RyaW5nIGFjY29yZGluZyB0byBIVE1MNVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdHJpbmcsIGVsZW1lbnRfdHlwZSkge1xuICAgIGNvbnN0IHJ2YWwgPSBzdHJpbmdfdG9fZGF0ZShzdHJpbmcsIGVsZW1lbnRfdHlwZSk7XG4gICAgaWYgKHJ2YWwgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiArcnZhbDtcbiAgICB9XG4gICAgLyogbm90IHBhcnNlRmxvYXQsIGJlY2F1c2Ugd2Ugd2FudCBOYU4gZm9yIGludmFsaWQgdmFsdWVzIGxpa2UgXCIxLjJ4eHlcIiAqL1xuICAgIHJldHVybiBOdW1iZXIoc3RyaW5nKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyogdGhlIGZvbGxvd2luZyBjb2RlIGlzIGJvcnJvd2VkIGZyb20gdGhlIFdlYkNvbXBvbmVudHMgcHJvamVjdCwgbGljZW5zZWRcbiAqIHVuZGVyIHRoZSBCU0QgbGljZW5zZS4gU291cmNlOlxuICogPGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJjb21wb25lbnRzL3dlYmNvbXBvbmVudHNqcy9ibG9iLzUyODNkYjE0NTlmYTIzMjNlNWJmYzhiOWI1Y2MxNzUzZWQ4NWUzZDAvc3JjL1dlYkNvbXBvbmVudHMvZG9tLmpzI0w1My1MNzg+XG4gKi9cbi8vIGRlZmF1bHRQcmV2ZW50ZWQgaXMgYnJva2VuIGluIElFLlxuLy8gaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy83OTAzODkvZXZlbnQtZGVmYXVsdHByZXZlbnRlZC1yZXR1cm5zLWZhbHNlLWFmdGVyLXByZXZlbnRkZWZhdWx0LXdhcy1jYWxsZWRcbmNvbnN0IHdvcmtpbmdEZWZhdWx0UHJldmVudGVkID0gKGZ1bmN0aW9uKCkge1xuICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gIGUuaW5pdEV2ZW50KCdmb28nLCB0cnVlLCB0cnVlKTtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICByZXR1cm4gZS5kZWZhdWx0UHJldmVudGVkO1xufSkoKTtcblxuaWYgKCF3b3JraW5nRGVmYXVsdFByZXZlbnRlZCkge1xuICBjb25zdCBvcmlnUHJldmVudERlZmF1bHQgPSB3aW5kb3cuRXZlbnQucHJvdG90eXBlLnByZXZlbnREZWZhdWx0O1xuICB3aW5kb3cuRXZlbnQucHJvdG90eXBlLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLmNhbmNlbGFibG
46184UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvcmlnUHJldmVudERlZmF1bHQuY2FsbCh0aGlzKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZGVmYXVsdFByZXZlbnRlZCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9O1xufVxuLyogZW5kIG9mIGJvcnJvd2VkIGNvZGUgKi9cblxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlX2V2ZW50KG5hbWUsIHsgYnViYmxlcz10cnVlLCBjYW5jZWxhYmxlPWZhbHNlLCB9PXt9KSB7XG4gIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gIGV2ZW50LmluaXRFdmVudChuYW1lLCBidWJibGVzLCBjYW5jZWxhYmxlKTtcbiAgcmV0dXJuIGV2ZW50O1xufVxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM9dHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsYWJsZT1mYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH09e30sIHBheWxvYWQ9e30pIHtcbiAgaWYgKCEgKGV2ZW50IGluc3RhbmNlb2Ygd2luZG93LkV2ZW50KSkge1xuICAgIGV2ZW50ID0gY3JlYXRlX2V2ZW50KGV2ZW50LCB7IGJ1YmJsZXMsIGNhbmNlbGFibGUgfSk7XG4gIH1cblxuICBmb3IgKGxldCBrZXkgaW4gcGF5bG9hZCkge1xuICAgIGlmIChwYXlsb2FkLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGV2ZW50W2tleV0gPSBwYXlsb2FkW2tleV07XG4gICAgfVxuICB9XG5cbiAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICByZXR1cm4gZXZlbnQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxuY29uc3Qgd3Nfb25fc3RhcnRfb3JfZW5kID0gL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nO1xuXG5cbi8qKlxuICogdHJpbSBhIHN0cmluZyBvZiB3aGl0ZXNwYWNlXG4gKlxuICogV2UgZG9uJ3QgdXNlIFN0cmluZy50cmltKCkgdG8gcmVtb3ZlIHRoZSBuZWVkIHRvIHBvbHlmaWxsIGl0LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKHdzX29uX3N0YXJ0X29yX2VuZCwgJycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbi8qKlxuICogcGF0Y2ggU3RyaW5nLmxlbmd0aCB0byBhY2NvdW50IGZvciBub24tQk1QIGNoYXJhY3RlcnNcbiAqXG4gKiBAc2VlIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LXVuaWNvZGVcbiAqIFdlIGRvIG5vdCB1c2UgdGhlIHNpbXBsZSBbLi4uc3RyXS5sZW5ndGgsIGJlY2F1c2UgaXQgbmVlZHMgYSB0b24gb2ZcbiAqIHBvbHlmaWxscyBpbiBvbGRlciBicm93c2Vycy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc3RyKSB7XG4gIHJldHVybiBzdHIubWF0Y2goL1tcXDAtXFx1RDdGRlxcdUUwMDAtXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXXxbXFx1RDgwMC1cXHVEQkZGXSg/IVtcXHVEQzAwLVxcdURGRkZdKXwoPzpbXlxcdUQ4MDAtXFx1REJGRl18XilbXFx1REMwMC1cXHVERkZGXS9nKS5sZW5ndGg7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogSW1wbGVtZW50IGNvbnN0cmFpbnQgY2hlY2tpbmcgZnVuY3Rpb25hbGl0eSBkZWZpbmVkIGluIHRoZSBIVE1MNSBzdGFuZGFyZFxuICpcbiAqIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNkb20tY3ZhLXZhbGlkaXR5XG4gKiBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiB0aGUgdGVzdCBmYWlscyBbIV0sIGZhbHNlIG90aGVyd2lzZVxuICovXG5cblxuaW1wb3J0IGZvcm1hdF9kYXRlIGZyb20gJy4vZm9ybWF0X2RhdGUnO1xuaW1wb3J0IGdldF9uZXh0X3ZhbGlkIGZyb20gJy4vZ2V0X25leHRfdmFsaWQnO1xuaW1wb3J0IGdldF90eXBlIGZyb20gJy4vZ2V0X3R5cGUnO1xuaW1wb3J0IHNwcmludGYgZnJvbSAnLi9zcHJpbnRmJztcbmltcG9ydCBzdHJpbmdfdG9fbnVtYmVyIGZyb20gJy4vc3RyaW5nX3RvX251bWJlcic7XG5pbXBvcnQgc3RyaW5nX3RvX2RhdGUgZnJvbSAnLi9zdHJpbmdfdG9fZGF0ZSc7XG5pbXBvcnQgdW5pY29kZV9zdHJpbmdfbGVuZ3RoIGZyb20gJy4vdW5pY29kZV9zdHJpbmdfbGVuZ3RoJztcbmltcG9ydCBjdXN0b21fbWVzc2FnZXMgZnJvbSAnLi4vY29tcG9uZW50cy9jdXN0b21fbWVzc2FnZXMnO1xuaW1wb3J0IF8gZnJvbSAnLi4vY29tcG9uZW50cy9sb2NhbGl6YXRpb24nO1xuaW1wb3J0IHsgbWVzc2FnZV9zdG9yZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvbWVzc2FnZV9zdG9yZSc7XG5pbXBvcnQgQ3VzdG9tVmFsaWRhdG9yUmVnaXN0cnkgZnJvbSAnLi4vY29tcG9uZW50cy9yZWdpc3RyeSc7XG5pbXBvcnQgeyBnZXRfd3JhcHBlciB9IGZyb20gJy4uL2NvbXBvbmVudHMvd3JhcHBlcic7XG5pbXBvcnQgdGVzdF9iYWRfaW5wdXQgZnJvbSAnLi4vdmFsaWRhdG9ycy9iYWRfaW5wdXQnO1xuaW1wb3J0IHRlc3RfbWF4IGZyb20gJy4uL3ZhbGlkYXRvcnMvbWF4JztcbmltcG9ydCB0ZXN0X21heGxlbmd0aCBmcm9tICcuLi92YWxpZGF0b3JzL21heGxlbmd0aCc7XG5pbXBvcnQgdGVzdF9taW4gZnJvbSAnLi4vdmFsaWRhdG9ycy9taW4nO1xuaW1wb3J0IHRlc3RfbWlubGVuZ3RoIGZyb20gJy4uL3ZhbGlkYXRvcnMvbWlubGVuZ3RoJztcbmltcG9ydCB0ZXN0X3BhdHRlcm4gZnJvbSAnLi4vdmFsaWRhdG9ycy9wYXR0ZXJuJztcbmltcG9ydCB0ZXN0X3JlcXVpcmVkIGZyb20gJy4uL3ZhbGlkYXRvcnMvcmVxdWlyZWQnO1xuaW1wb3J0IHRlc3Rfc3RlcCBmcm9tICcuLi92YWxpZGF0b3JzL3N0ZXAnO1xuaW1wb3J0IHRlc3RfdHlwZSBmcm9tICcuLi92YWxpZGF0b3JzL3R5cGUnO1xuXG5cbi8qKlxuICogYm9pbGVycGxhdGUgZnVuY3Rpb24gZm9yIGFsbCB0ZXN0cyBidXQgY3VzdG9tRXJyb3JcbiAqL1xuZnVuY3Rpb24gY2hlY2sodGVzdCwgcmVhY3QpIHtcbiAgcmV0dXJuIGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IGludmFsaWQgPSAhIHRlc3QoZWxlbWVudCk7XG4gICAgaWYgKGludmFsaWQpIHtcbiAgICAgIHJlYWN0KGVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gaW52YWxpZDtcbiAgfTtcbn1cblxuXG4vKipcbiAqIGNyZWF0ZSBhIGNvbW1vbiBmdW5jdGlvbiB0byBzZXQgZXJyb3IgbWVzc2FnZXNcbiAqL1xuZnVuY3Rpb24gc2V0X21zZyhlbGVtZW50LCBtc2d0eXBlLCBfZGVmYXVsdCkge1xuICBtZXNzYWdlX3N0b3JlLnNldChlbGVtZW50LCBjdXN0b21fbWVzc2FnZXMuZ2V0KGVsZW1lbnQsIG1zZ3R5cGUsIF9kZWZhdWx0KSk7XG59XG5cblxuY29uc3QgYmFkSW5wdXQgPSBjaGVjayh0ZXN0X2JhZF9pbnB1dCwgZWxlbWVudCA9PiBzZXRfbXNnKGVsZW1lbnQsICdiYWRJbnB1dCcsXG4gICAgICAgICAgICAgICAgICAgICAgIF8oJ1BsZWFzZSBtYXRjaCB0aGUgcmVxdWVzdGVkIHR5cGUuJykpKTtcblxuXG5mdW5jdGlvbiBjdXN0b21FcnJvcihlbGVtZW50KSB7XG4gIC8qIHByZXZlbnQgaW5maW5pdGUgbG9vcHMgd2hlbiB0aGUgY3VzdG9tIHZhbGlkYXRvcnMgY2FsbCBzZXRDdXN0b21WYWxpZGl0eSgpLFxuICAgKiB3aGljaCBpbiB0dXJuIGNhbGxzIHRoaXMgY29kZSBhZ2Fpbi4gV2UgY2hlY2ssIGlmIHRoZXJlIGlzIGFuIGFscmVhZHkgc2V0XG4gICAqIGN1c3RvbSB2YWxpZGl0eSBtZXNzYWdlIHRoZXJlLiAqL1xuICBpZiAoZWxlbWVudC5fX2hmX2N1c3RvbV92YWxpZGF0aW9uX3J1bm5pbmcpIHtcbiAgICBjb25zdCBtc2cgPSBtZXNzYWdlX3N0b3JlLmdldChlbGVtZW50KTtcbiAgICByZXR1cm4gKG1zZyAmJiBtc2cuaXNfY3VzdG9tKTtcbiAgfVxuXG4gIC8qIGNoZWNrLCBpZiB0aGVyZSBhcmUgY3VzdG9tIHZhbGlkYXRvcnMgaW4gdGhlIHJlZ2lzdHJ5LCBhbmQgY2FsbFxuICAgKiB0aGVtLiAqL1xuICBjb25zdCBjdXN0b21fdmFsaWRhdG9ycyA9IEN1c3RvbVZhbGlkYXRvclJlZ2lzdHJ5LmdldChlbGVtZW50KTtcbiAgY29uc3QgY3ZsID0gY3VzdG9tX3ZhbGlkYXRvcnMubGVuZ3RoO1xuICB2YXIgdmFsaWQgPSB0cnVlO1xuXG4gIGlmIChjdmwpIHtcbiAgICBlbGVtZW50Ll9faGZfY3VzdG9tX3ZhbGlkYXRpb25fcnVubmluZyA9IHRydWU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdmw7IGkrKykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gY3VzdG9tX3ZhbGlkYXRvcnNbaV0oZWxlbWVudCk7XG4gICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgISByZXN1bHQpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgLyogYnJlYWsgb24gZmlyc3QgaW52YWxpZCByZXNwb25zZSAqL1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlKGVsZW1lbnQuX19oZl9jdXN0b21fdmFsaWRhdGlvbl9ydW5uaW5nKTtcbiAgfVxuXG4gIC8qIGNoZWNrLCBpZiB0aGVyZSBhcmUgb3RoZXIgdmFsaWRpdHkgbWVzc2FnZXMgYWxyZWFkeSAqL1xuICBpZiAodmFsaWQpIHtcbiAgICBjb25zdCBtc2cgPSBtZXNzYWdlX3N0b3JlLmdldChlbGVtZW50KTtcbiAgICB2YWxpZCA9ICEgKG1zZy50b1N0cmluZygpICYmICgnaXNfY3VzdG9tJyBpbiBtc2cpKTtcbiAgfVxuXG4gIHJldHVybiAhIHZhbGlkO1xufVxuXG5cbmNvbnN0IHBhdHRlcm5NaXNtYXRjaCA9IGNoZWNrKHRlc3RfcGF0dGVybiwgZWxlbWVudCA9PiB7XG4gIHNldF9tc2coZWxlbWVudCwgJ3BhdHRlcm5NaXNtYXRjaCcsXG4gICAgZWxlbWVudC50aXRsZT9cbiAgICAgIHNwcmludGYoXygnUGF0dGVybk1pc21hdGNoV2l0aFRpdGxlJyksIGVsZW1lbnQudGl0bGUpXG4gICAgICA6XG4gICAgICBfKCdQYXR0ZXJuTWlzbWF0Y2gnKVxuICApO1xufSk7XG5cblxuLyoqXG4gKiBUT0RPOiB3aGVuIHJhbmdlT3ZlcmZsb3cgYW5kIHJhbmdlVW5kZXJmbG93IGFyZSBib3RoIGNhbGxlZCBkaXJlY3RseSBhbmRcbiAqIHN1Y2Nlc3NmdWwsIHRoZSBpblJhbmdlIGFuZCBvdXRPZlJhbmdlIGNsYXNzZXMgd29uJ3QgZ2V0IHJlbW92ZWQsIHVubGVzc1xuICogZWxlbWVudC52YWxpZGl0eVN0YXRlLnZhbGlkIGlzIHF1ZXJpZWQsIHRvby5cbiAqL1xuY29uc3QgcmFuZ2VPdmVyZmxvdyA9IGNoZWNrKHRlc3RfbWF4LCBlbGVtZW50ID0+IHtcbiAgY29uc3QgdHlwZSA9IGdldF90eXBlKGVsZW1lbnQpO1xuICBjb25zdCB3cmFwcGVyID0gZ2V0X3dyYXBwZXIoZWxlbWVudCk7XG4gIGNvbnN0IG91dE9mUmFuZ2VDbGFzcyA9IHdyYXBwZXIgJiYgd3JhcHBlci5zZXR0aW5ncy5jbGFzc2VzLm91dE9mUmFuZ2UgfHwgJ2hmLW91dC1vZi1yYW5nZSc7XG4gIGNvbnN0IGluUmFuZ2VDbGFzcyA9IHdyYXBwZXIgJiYgd3JhcHBlci5zZXR0aW5ncy5jbGFzc2VzLmluUmFuZ2UgfHwgJ2hmLWluLXJhbmdlJztcblxuICBsZXQgbXNnO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2Rh
46184dGUnOlxuICAgIGNhc2UgJ2RhdGV0aW1lJzpcbiAgICBjYXNlICdkYXRldGltZS1sb2NhbCc6XG4gICAgICBtc2cgPSBzcHJpbnRmKF8oJ0RhdGVSYW5nZU92ZXJmbG93JyksXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdF9kYXRlKHN0cmluZ190b19kYXRlKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtYXgnKSwgdHlwZSksIHR5cGUpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgbXNnID0gc3ByaW50ZihfKCdUaW1lUmFuZ2VPdmVyZmxvdycpLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXRfZGF0ZShzdHJpbmdfdG9fZGF0ZShlbGVtZW50LmdldEF0dHJpYnV0ZSgnbWF4JyksIHR5cGUpLCB0eXBlKSk7XG4gICAgICBicmVhaztcbiAgICAvLyBjYXNlICdudW1iZXInOlxuICAgIGRlZmF1bHQ6XG4gICAgICBtc2cgPSBzcHJpbnRmKF8oJ051bWJlclJhbmdlT3ZlcmZsb3cnKSxcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RvX251bWJlcihlbGVtZW50LmdldEF0dHJpYnV0ZSgnbWF4JyksIHR5cGUpKTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgc2V0X21zZyhlbGVtZW50LCAncmFuZ2VPdmVyZmxvdycsIG1zZyk7XG4gIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChvdXRPZlJhbmdlQ2xhc3MpO1xuICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoaW5SYW5nZUNsYXNzKTtcbn0pO1xuXG5cbmNvbnN0IHJhbmdlVW5kZXJmbG93ID0gY2hlY2sodGVzdF9taW4sIGVsZW1lbnQgPT4ge1xuICBjb25zdCB0eXBlID0gZ2V0X3R5cGUoZWxlbWVudCk7XG4gIGNvbnN0IHdyYXBwZXIgPSBnZXRfd3JhcHBlcihlbGVtZW50KTtcbiAgY29uc3Qgb3V0T2ZSYW5nZUNsYXNzID0gd3JhcHBlciAmJiB3cmFwcGVyLnNldHRpbmdzLmNsYXNzZXMub3V0T2ZSYW5nZSB8fCAnaGYtb3V0LW9mLXJhbmdlJztcbiAgY29uc3QgaW5SYW5nZUNsYXNzID0gd3JhcHBlciAmJiB3cmFwcGVyLnNldHRpbmdzLmNsYXNzZXMuaW5SYW5nZSB8fCAnaGYtaW4tcmFuZ2UnO1xuXG4gIGxldCBtc2c7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnZGF0ZSc6XG4gICAgY2FzZSAnZGF0ZXRpbWUnOlxuICAgIGNhc2UgJ2RhdGV0aW1lLWxvY2FsJzpcbiAgICAgIG1zZyA9IHNwcmludGYoXygnRGF0ZVJhbmdlVW5kZXJmbG93JyksXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdF9kYXRlKHN0cmluZ190b19kYXRlKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtaW4nKSwgdHlwZSksIHR5cGUpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgbXNnID0gc3ByaW50ZihfKCdUaW1lUmFuZ2VVbmRlcmZsb3cnKSxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0X2RhdGUoc3RyaW5nX3RvX2RhdGUoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ21pbicpLCB0eXBlKSwgdHlwZSkpO1xuICAgICAgYnJlYWs7XG4gICAgLy8gY2FzZSAnbnVtYmVyJzpcbiAgICBkZWZhdWx0OlxuICAgICAgbXNnID0gc3ByaW50ZihfKCdOdW1iZXJSYW5nZVVuZGVyZmxvdycpLFxuICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdG9fbnVtYmVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtaW4nKSwgdHlwZSkpO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICBzZXRfbXNnKGVsZW1lbnQsICdyYW5nZVVuZGVyZmxvdycsIG1zZyk7XG4gIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChvdXRPZlJhbmdlQ2xhc3MpO1xuICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoaW5SYW5nZUNsYXNzKTtcbn0pO1xuXG5cbmNvbnN0IHN0ZXBNaXNtYXRjaCA9IGNoZWNrKHRlc3Rfc3RlcCwgZWxlbWVudCA9PiB7XG4gIGNvbnN0IGxpc3QgPSBnZXRfbmV4dF92YWxpZChlbGVtZW50KTtcbiAgY29uc3QgbWluID0gbGlzdFswXTtcbiAgY29uc3QgbWF4ID0gbGlzdFsxXTtcbiAgbGV0IHNvbGUgPSBmYWxzZTtcbiAgbGV0IG1zZztcblxuICBpZiAobWluID09PSBudWxsKSB7XG4gICAgc29sZSA9IG1heDtcbiAgfSBlbHNlIGlmIChtYXggPT09IG51bGwpIHtcbiAgICBzb2xlID0gbWluO1xuICB9XG5cbiAgaWYgKHNvbGUgIT09IGZhbHNlKSB7XG4gICAgbXNnID0gc3ByaW50ZihfKCdTdGVwTWlzbWF0Y2hPbmVWYWx1ZScpLCBzb2xlKTtcbiAgfSBlbHNlIHtcbiAgICBtc2cgPSBzcHJpbnRmKF8oJ1N0ZXBNaXNtYXRjaCcpLCBtaW4sIG1heCk7XG4gIH1cbiAgc2V0X21zZyhlbGVtZW50LCAnc3RlcE1pc21hdGNoJywgbXNnKTtcbn0pO1xuXG5cbmNvbnN0IHRvb0xvbmcgPSBjaGVjayh0ZXN0X21heGxlbmd0aCwgZWxlbWVudCA9PiB7XG4gIHNldF9tc2coZWxlbWVudCwgJ3Rvb0xvbmcnLFxuICAgICAgICAgIHNwcmludGYoXygnVGV4dFRvb0xvbmcnKSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ21heGxlbmd0aCcpLFxuICAgICAgICAgICAgICAgICAgdW5pY29kZV9zdHJpbmdfbGVuZ3RoKGVsZW1lbnQudmFsdWUpKSk7XG59KTtcblxuXG5jb25zdCB0b29TaG9ydCA9IGNoZWNrKHRlc3RfbWlubGVuZ3RoLCBlbGVtZW50ID0+IHtcbiAgc2V0X21zZyhlbGVtZW50LCAndG9vU2hvcnQnLFxuICAgICAgICAgIHNwcmludGYoXygnUGxlYXNlIGxlbmd0aGVuIHRoaXMgdGV4dCB0byAlbCBjaGFyYWN0ZXJzIG9yIG1vcmUgKHlvdSBhcmUgY3VycmVudGx5IHVzaW5nICVsIGNoYXJhY3RlcnMpLicpLFxuICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ21pbmxlbmd0aCcpLFxuICAgICAgICAgICAgICAgICAgdW5pY29kZV9zdHJpbmdfbGVuZ3RoKGVsZW1lbnQudmFsdWUpKSk7XG59KTtcblxuXG5jb25zdCB0eXBlTWlzbWF0Y2ggPSBjaGVjayh0ZXN0X3R5cGUsIGVsZW1lbnQgPT4ge1xuICBsZXQgbXNnID0gXygnUGxlYXNlIHVzZSB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0LicpO1xuICBjb25zdCB0eXBlID0gZ2V0X3R5cGUoZWxlbWVudCk7XG5cbiAgaWYgKHR5cGUgPT09ICdlbWFpbCcpIHtcbiAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ211bHRpcGxlJykpIHtcbiAgICAgIG1zZyA9IF8oJ1BsZWFzZSBlbnRlciBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGVtYWlsIGFkZHJlc3Nlcy4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbXNnID0gXygnSW52YWxpZEVtYWlsJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICd1cmwnKSB7XG4gICAgbXNnID0gXygnSW52YWxpZFVSTCcpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdmaWxlJykge1xuICAgIG1zZyA9IF8oJ1BsZWFzZSBzZWxlY3QgYS
46184BmaWxlIG9mIHRoZSBjb3JyZWN0IHR5cGUuJyk7XG4gIH1cblxuICBzZXRfbXNnKGVsZW1lbnQsICd0eXBlTWlzbWF0Y2gnLCBtc2cpO1xufSk7XG5cblxuY29uc3QgdmFsdWVNaXNzaW5nID0gY2hlY2sodGVzdF9yZXF1aXJlZCwgZWxlbWVudCA9PiB7XG4gIGxldCBtc2cgPSBfKCdWYWx1ZU1pc3NpbmcnKTtcbiAgY29uc3QgdHlwZSA9IGdldF90eXBlKGVsZW1lbnQpO1xuXG4gIGlmICh0eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgbXNnID0gXygnQ2hlY2tib3hNaXNzaW5nJyk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3JhZGlvJykge1xuICAgIG1zZyA9IF8oJ1JhZGlvTWlzc2luZycpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdmaWxlJykge1xuICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbXVsdGlwbGUnKSkge1xuICAgICAgbXNnID0gXygnUGxlYXNlIHNlbGVjdCBvbmUgb3IgbW9yZSBmaWxlcy4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbXNnID0gXygnRmlsZU1pc3NpbmcnKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MU2VsZWN0RWxlbWVudCkge1xuICAgIG1zZyA9IF8oJ1NlbGVjdE1pc3NpbmcnKTtcbiAgfVxuXG4gIHNldF9tc2coZWxlbWVudCwgJ3ZhbHVlTWlzc2luZycsIG1zZyk7XG59KTtcblxuXG4vKipcbiAqIHRoZSBcInZhbGlkXCIgcHJvcGVydHkgY2FsbHMgYWxsIG90aGVyIHZhbGlkaXR5IGNoZWNrZXJzIGFuZCByZXR1cm5zIHRydWUsXG4gKiBpZiBhbGwgdGhvc2UgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFRoaXMgaXMgdGhlIG1ham9yIGFjY2VzcyBwb2ludCBmb3IgX2FsbF8gb3RoZXIgQVBJIG1ldGhvZHMsIG5hbWVseVxuICogKGNoZWNrfHJlcG9ydClWYWxpZGl0eSgpLlxuICovXG5jb25zdCB2YWxpZCA9IGVsZW1lbnQgPT4ge1xuICBjb25zdCB3cmFwcGVyID0gZ2V0X3dyYXBwZXIoZWxlbWVudCk7XG4gIGNvbnN0IHZhbGlkQ2xhc3MgPSB3cmFwcGVyICYmIHdyYXBwZXIuc2V0dGluZ3MuY2xhc3Nlcy52YWxpZCB8fCAnaGYtdmFsaWQnO1xuICBjb25zdCBpbnZhbGlkQ2xhc3MgPSB3cmFwcGVyICYmIHdyYXBwZXIuc2V0dGluZ3MuY2xhc3Nlcy5pbnZhbGlkIHx8ICdoZi1pbnZhbGlkJztcbiAgY29uc3QgdXNlckludmFsaWRDbGFzcyA9IHdyYXBwZXIgJiYgd3JhcHBlci5zZXR0aW5ncy5jbGFzc2VzLnVzZXJJbnZhbGlkIHx8ICdoZi11c2VyLWludmFsaWQnO1xuICBjb25zdCB1c2VyVmFsaWRDbGFzcyA9IHdyYXBwZXIgJiYgd3JhcHBlci5zZXR0aW5ncy5jbGFzc2VzLnVzZXJWYWxpZCB8fCAnaGYtdXNlci12YWxpZCc7XG4gIGNvbnN0IGluUmFuZ2VDbGFzcyA9IHdyYXBwZXIgJiYgd3JhcHBlci5zZXR0aW5ncy5jbGFzc2VzLmluUmFuZ2UgfHwgJ2hmLWluLXJhbmdlJztcbiAgY29uc3Qgb3V0T2ZSYW5nZUNsYXNzID0gd3JhcHBlciAmJiB3cmFwcGVyLnNldHRpbmdzLmNsYXNzZXMub3V0T2ZSYW5nZSB8fCAnaGYtb3V0LW9mLXJhbmdlJztcbiAgY29uc3QgdmFsaWRhdGVkQ2xhc3MgPSB3cmFwcGVyICYmIHdyYXBwZXIuc2V0dGluZ3MuY2xhc3Nlcy52YWxpZGF0ZWQgfHwgJ2hmLXZhbGlkYXRlZCc7XG5cbiAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKHZhbGlkYXRlZENsYXNzKTtcblxuICBmb3IgKGxldCBjaGVja2VyIG9mIFtiYWRJbnB1dCwgY3VzdG9tRXJyb3IsIHBhdHRlcm5NaXNtYXRjaCwgcmFuZ2VPdmVyZmxvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VVbmRlcmZsb3csIHN0ZXBNaXNtYXRjaCwgdG9vTG9uZywgdG9vU2hvcnQsXG4gICAgICAgICAgICAgICAgICAgICAgIHR5cGVNaXNtYXRjaCwgdmFsdWVNaXNzaW5nXSkge1xuICAgIGlmIChjaGVja2VyKGVsZW1lbnQpKSB7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoaW52YWxpZENsYXNzKTtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh2YWxpZENsYXNzKTtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh1c2VyVmFsaWRDbGFzcyk7XG4gICAgICBpZiAoKFxuICAgICAgICAgICAgKGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtZW50LnR5cGUgPT09ICdyYWRpbycpICYmXG4gICAgICAgICAgICBlbGVtZW50LmNoZWNrZWQgIT09IGVsZW1lbnQuZGVmYXVsdENoZWNrZWRcbiAgICAgICAgICApIHx8XG4gICAgICAgICAgLyogdGhlIGZvbGxvd2luZyB0ZXN0IGlzIHRyaXZpYWxseSBmYWxzZSBmb3IgY2hlY2tib3hlcy9yYWRpb3MgKi9cbiAgICAgICAgICBlbGVtZW50LnZhbHVlICE9PSBlbGVtZW50LmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQodXNlckludmFsaWRDbGFzcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodXNlckludmFsaWRDbGFzcyk7XG4gICAgICB9XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgJ3RydWUnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBtZXNzYWdlX3N0b3JlLmRlbGV0ZShlbGVtZW50KTtcbiAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGludmFsaWRDbGFzcyk7XG4gIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh1c2VySW52YWxpZENsYXNzKTtcbiAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKG91dE9mUmFuZ2VDbGFzcyk7XG4gIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCh2YWxpZENsYXNzKTtcbiAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGluUmFuZ2VDbGFzcyk7XG4gIGlmIChlbGVtZW50LnZhbHVlICE9PSBlbGVtZW50LmRlZmF1bHRWYWx1ZSkge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCh1c2VyVmFsaWRDbGFzcyk7XG4gIH0gZWxzZSB7XG4gICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHVzZXJWYWxpZENsYXNzKTtcbiAgfVxuICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgJ2ZhbHNlJyk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGJhZElucHV0LFxuICBjdXN0b21FcnJvcixcbiAgcGF0dGVybk1pc21hdGNoLFxuICByYW5nZU92ZXJmbG93LFxuICByYW5nZVVuZGVyZmxvdyxcbiAgc3RlcE1pc21hdGNoLFxuICB0b29Mb25nLFxuICB0b29TaG9ydCxcbiAgdHlwZU1pc21hdGNoLFxuICB2YWx1ZU1pc3NpbmcsXG4gIHZhbGlkLFxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQgZ2V0X3R5cGUgZnJvbSAnLi4vdG9vbHMvZ2V0X3R5cGUnO1xuaW1wb3J0IHN0cmluZ190b19kYXRlIGZyb20gJy4uL3Rvb2xzL3N0cmluZ190b19kYXRlJztcbmltcG9ydCB7
46184IGlucHV0X2NoZWNrZWQgfSBmcm9tICcuLi9jb21wb25lbnRzL3R5cGVzJztcblxuXG4vKipcbiAqIHRlc3Qgd2hldGhlciB0aGUgZWxlbWVudCBzdWZmZXJzIGZyb20gYmFkIGlucHV0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgY29uc3QgdHlwZSA9IGdldF90eXBlKGVsZW1lbnQpO1xuXG4gIGlmIChpbnB1dF9jaGVja2VkLmluZGV4T2YodHlwZSkgPT09IC0xKSB7XG4gICAgLyogd2UncmUgbm90IGludGVyZXN0ZWQsIHRoYW5rcyEgKi9cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qIHRoZSBicm93c2VyIGhpZGVzIHNvbWUgYmFkIGlucHV0IGZyb20gdGhlIERPTSwgZS5nLiBtYWxmb3JtZWQgbnVtYmVycyxcbiAgICogZW1haWwgYWRkcmVzc2VzIHdpdGggaW52YWxpZCBwdW55Y29kZSByZXByZXNlbnRhdGlvbiwgLi4uIFdlIHRyeSB0byByZXNvcnRcbiAgICogdG8gdGhlIG9yaWdpbmFsIG1ldGhvZCBoZXJlLiBUaGUgYXNzdW1wdGlvbiBpcywgdGhhdCBhIGJyb3dzZXIgaGlkaW5nXG4gICAqIGJhZCBpbnB1dCB3aWxsIGhvcGVmdWxseSBhbHNvIGFsd2F5cyBzdXBwb3J0IGEgcHJvcGVyXG4gICAqIFZhbGlkaXR5U3RhdGUuYmFkSW5wdXQgKi9cbiAgaWYgKCEgZWxlbWVudC52YWx1ZSkge1xuICAgIGlmICgnX29yaWdpbmFsX3ZhbGlkaXR5JyBpbiBlbGVtZW50ICYmXG4gICAgICAgICEgZWxlbWVudC5fb3JpZ2luYWxfdmFsaWRpdHkuX19oeXBlcmZvcm0pIHtcbiAgICAgIHJldHVybiAhIGVsZW1lbnQuX29yaWdpbmFsX3ZhbGlkaXR5LmJhZElucHV0O1xuICAgIH1cbiAgICAvKiBubyB2YWx1ZSBhbmQgbm8gb3JpZ2luYWwgYmFkSW5wdXQ6IEFzc3VtZSBhbGwncyByaWdodC4gKi9cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSB0cnVlO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdjb2xvcic6XG4gICAgICByZXN1bHQgPSAvXiNbYS1mMC05XXs2fSQvLnRlc3QoZWxlbWVudC52YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ3JhbmdlJzpcbiAgICAgIHJlc3VsdCA9ICEgaXNOYU4oTnVtYmVyKGVsZW1lbnQudmFsdWUpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2RhdGV0aW1lJzpcbiAgICBjYXNlICdkYXRlJzpcbiAgICBjYXNlICdtb250aCc6XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgY2FzZSAndGltZSc6XG4gICAgICByZXN1bHQgPSBzdHJpbmdfdG9fZGF0ZShlbGVtZW50LnZhbHVlLCB0eXBlKSAhPT0gbnVsbDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2RhdGV0aW1lLWxvY2FsJzpcbiAgICAgIHJlc3VsdCA9IC9eKFswLTldezQsfSktKDBbMS05XXwxWzAxMl0pLSgwWzEtOV18WzEyXVswLTldfDNbMDFdKVQoWzAxXVswLTldfDJbMC0zXSk6KFswLTVdWzAtOV0pKD86OihbMC01XVswLTldKSg/OlxcLihbMC05XXsxLDN9KSk/KT8kLy50ZXN0KGVsZW1lbnQudmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndGVsJzpcbiAgICAgIC8qIHNwZWMgc2F5cyBObyEgUGhvbmUgbnVtYmVycyBjYW4gaGF2ZSBhbGwga2luZHMgb2YgZm9ybWF0cywgc28gdGhpc1xuICAgICAgICogaXMgZXhwZWN0ZWQgdG8gYmUgYSBmcmVlLXRleHQgZmllbGQuICovXG4gICAgICAvLyBUT0RPIHdlIGNvdWxkIGFsbG93IGEgc2V0dGluZyAncGhvbmVfcmVnZXgnIHRvIGJlIGV2YWx1YXRlZCBoZXJlLlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZW1haWwnOlxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBnZXRfdHlwZSBmcm9tICcuLi90b29scy9nZXRfdHlwZSc7XG5pbXBvcnQgeyBkYXRlcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvdHlwZXMnO1xuaW1wb3J0IHN0cmluZ190b19kYXRlIGZyb20gJy4uL3Rvb2xzL3N0cmluZ190b19kYXRlJztcblxuXG4vKipcbiAqIHRlc3QgdGhlIG1heCBhdHRyaWJ1dGVcbiAqXG4gKiB3ZSB1c2UgTnVtYmVyKCkgaW5zdGVhZCBvZiBwYXJzZUZsb2F0KCksIGJlY2F1c2UgYW4gaW52YWxpZCBhdHRyaWJ1dGVcbiAqIHZhbHVlIGxpa2UgXCIxMjNhYmNcIiBzaG91bGQgcmVzdWx0IGluIGFuIGVycm9yLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbGVtZW50KSB7XG4gIGNvbnN0IHR5cGUgPSBnZXRfdHlwZShlbGVtZW50KTtcblxuICBpZiAoISBlbGVtZW50LnZhbHVlIHx8ICEgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21heCcpKSB7XG4gICAgLyogd2UncmUgbm90IHJlc3BvbnNpYmxlIGhlcmUgKi9cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxldCB2YWx1ZSwgbWF4O1xuICBpZiAoZGF0ZXMuaW5kZXhPZih0eXBlKSA+IC0xKSB7XG4gICAgdmFsdWUgPSBzdHJpbmdfdG9fZGF0ZShlbGVtZW50LnZhbHVlLCB0eXBlKTtcbiAgICB2YWx1ZSA9IHZhbHVlID09PSBudWxsPyBOYU4gOiArdmFsdWU7XG4gICAgbWF4ID0gc3RyaW5nX3RvX2RhdGUoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ21heCcpLCB0eXBlKTtcbiAgICBtYXggPSBtYXggPT09IG51bGw/IE5hTiA6ICttYXg7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBOdW1iZXIoZWxlbWVudC52YWx1ZSk7XG4gICAgbWF4ID0gTnVtYmVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtYXgnKSk7XG4gIH1cblxuICAvKiB3ZSBjYW5ub3QgdmFsaWRhdGUgaW52YWxpZCB2YWx1ZXMgYW5kIHRydXN0IG9uIGJhZElucHV0LCBpZiBpc05hTih2YWx1ZSkgKi9cbiAgcmV0dXJuIChpc05hTihtYXgpIHx8IGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA8PSBtYXgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBnZXRfdHlwZSBmcm9tICcuLi90b29scy9nZXRfdHlwZSc7XG5pbXBvcnQgdW5pY29kZV9zdHJpbmdfbGVuZ3RoIGZyb20gJy4uL3Rvb2xzL3VuaWNvZGVfc3RyaW5nX2xlbmd0aCc7XG5pbXBvcnQgeyB0ZXh0IGFzIHRleHRfdHlwZXMgfSBmcm9tICcuLi9jb21wb25lbnRzL3R5cGVzJztcblxuXG4vKipcbiAqIHRlc3QgdGhlIG1heGxlbmd0aCBhdHRyaWJ1dGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWxlbWVudCkge1xuICBpZiAoXG4gICAgICAhIGVsZW1lbnQudmFsdWVcbiAgICAgIHx8XG4gICAgICB0ZXh0X3R5cGVzLmluZGV4T2YoZ2V0X3R5cGUoZWxlbWVudCkpID09PSAtMVxuICAgICAgfHxcbiAgICAgICEgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21heGxlbmd0aCcpXG4gICAgICB8fFxuICAgICAgISBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbWF4bGVuZ3RoJykgLy8gY2F0Y2ggbWF4bGVuZ3RoPVwiXCJcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBtYXhsZW5ndGggPSBwYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZSgnbWF4bGVuZ3RoJyksIDEwKTtcblxuICAvKiBjaGVjaywgaWYgdGhlIG1heGxlbmd0aCB2YWx1ZSBpcyB1c2FibGUgYXQgYWxsLlxuICAgKiBXZSBhbGxvdyBtYXhsZW5ndGggPT09IDAgdG8gYmFzaWNhbGx5IGRpc2FibGUgaW5wdXQgKEZpcmVmb3ggZG9lcywgdG9vKS5cbiAgICovXG4gIGlmIChpc05hTihtYXhsZW5ndGgpIHx8IG1heGxlbmd0aCA8IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybi
46184B1bmljb2RlX3N0cmluZ19sZW5ndGgoZWxlbWVudC52YWx1ZSkgPD0gbWF4bGVuZ3RoO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBnZXRfdHlwZSBmcm9tICcuLi90b29scy9nZXRfdHlwZSc7XG5pbXBvcnQgeyBkYXRlcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvdHlwZXMnO1xuaW1wb3J0IHN0cmluZ190b19kYXRlIGZyb20gJy4uL3Rvb2xzL3N0cmluZ190b19kYXRlJztcblxuXG4vKipcbiAqIHRlc3QgdGhlIG1pbiBhdHRyaWJ1dGVcbiAqXG4gKiB3ZSB1c2UgTnVtYmVyKCkgaW5zdGVhZCBvZiBwYXJzZUZsb2F0KCksIGJlY2F1c2UgYW4gaW52YWxpZCBhdHRyaWJ1dGVcbiAqIHZhbHVlIGxpa2UgXCIxMjNhYmNcIiBzaG91bGQgcmVzdWx0IGluIGFuIGVycm9yLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbGVtZW50KSB7XG4gIGNvbnN0IHR5cGUgPSBnZXRfdHlwZShlbGVtZW50KTtcblxuICBpZiAoISBlbGVtZW50LnZhbHVlIHx8ICEgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21pbicpKSB7XG4gICAgLyogd2UncmUgbm90IHJlc3BvbnNpYmxlIGhlcmUgKi9cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxldCB2YWx1ZSwgbWluO1xuICBpZiAoZGF0ZXMuaW5kZXhPZih0eXBlKSA+IC0xKSB7XG4gICAgdmFsdWUgPSBzdHJpbmdfdG9fZGF0ZShlbGVtZW50LnZhbHVlLCB0eXBlKTtcbiAgICB2YWx1ZSA9IHZhbHVlID09PSBudWxsPyBOYU4gOiArdmFsdWU7XG4gICAgbWluID0gc3RyaW5nX3RvX2RhdGUoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ21pbicpLCB0eXBlKTtcbiAgICBtaW4gPSBtaW4gPT09IG51bGw/IE5hTiA6ICttaW47XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBOdW1iZXIoZWxlbWVudC52YWx1ZSk7XG4gICAgbWluID0gTnVtYmVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtaW4nKSk7XG4gIH1cblxuICAvKiB3ZSBjYW5ub3QgdmFsaWRhdGUgaW52YWxpZCB2YWx1ZXMgYW5kIHRydXN0IG9uIGJhZElucHV0LCBpZiBpc05hTih2YWx1ZSkgKi9cbiAgcmV0dXJuIChpc05hTihtaW4pIHx8IGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA+PSBtaW4pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBnZXRfdHlwZSBmcm9tICcuLi90b29scy9nZXRfdHlwZSc7XG5pbXBvcnQgdW5pY29kZV9zdHJpbmdfbGVuZ3RoIGZyb20gJy4uL3Rvb2xzL3VuaWNvZGVfc3RyaW5nX2xlbmd0aCc7XG5pbXBvcnQgeyB0ZXh0IGFzIHRleHRfdHlwZXMgfSBmcm9tICcuLi9jb21wb25lbnRzL3R5cGVzJztcblxuXG4vKipcbiAqIHRlc3QgdGhlIG1pbmxlbmd0aCBhdHRyaWJ1dGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWxlbWVudCkge1xuICBpZiAoXG4gICAgICAhIGVsZW1lbnQudmFsdWVcbiAgICAgIHx8XG4gICAgICB0ZXh0X3R5cGVzLmluZGV4T2YoZ2V0X3R5cGUoZWxlbWVudCkpID09PSAtMVxuICAgICAgfHxcbiAgICAgICEgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21pbmxlbmd0aCcpXG4gICAgICB8fFxuICAgICAgISBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbWlubGVuZ3RoJykgLy8gY2F0Y2ggbWlubGVuZ3RoPVwiXCJcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBtaW5sZW5ndGggPSBwYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZSgnbWlubGVuZ3RoJyksIDEwKTtcblxuICAvKiBjaGVjaywgaWYgdGhlIG1pbmxlbmd0aCB2YWx1ZSBpcyB1c2FibGUgYXQgYWxsLiAqL1xuICBpZiAoaXNOYU4obWlubGVuZ3RoKSB8fCBtaW5sZW5ndGggPCAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdW5pY29kZV9zdHJpbmdfbGVuZ3RoKGVsZW1lbnQudmFsdWUpID49IG1pbmxlbmd0aDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG4vKipcbiAqIHRlc3QgdGhlIHBhdHRlcm4gYXR0cmlidXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgcmV0dXJuIChcbiAgICAgICEgZWxlbWVudC52YWx1ZVxuICAgICAgfHxcbiAgICAgICEgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ3BhdHRlcm4nKVxuICAgICAgfHxcbiAgICAgIChuZXcgUmVnRXhwKCdeKD86JysgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3BhdHRlcm4nKSArJykkJykpLnRlc3QoZWxlbWVudC52YWx1ZSlcbiAgICApO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCB7IGdldF9yYWRpb2dyb3VwIH0gZnJvbSAnLi4vdG9vbHMvZ2V0X3JhZGlvZ3JvdXAnO1xuXG5cbmZ1bmN0aW9uIGhhc19zdWJtaXR0YWJsZV9vcHRpb24oc2VsZWN0KSB7XG4gIC8qIERlZmluaXRpb24gb2YgdGhlIHBsYWNlaG9sZGVyIGxhYmVsIG9wdGlvbjpcbiAgICogaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3NlYy1mb3Jtcy5odG1sI2VsZW1lbnQtYXR0cmRlZi1zZWxlY3QtcmVxdWlyZWRcbiAgICogQmVpbmcgcmVxdWlyZWQgKHRoZSBmaXJzdCBjb25zdHJhaW50IGluIHRoZSBzcGVjKSBpcyB0cml2aWFsbHkgdHJ1ZSwgc2luY2VcbiAgICogdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBmb3Igc3VjaCBzZWxlY3RzLlxuICAgKi9cbiAgY29uc3QgaGFzX3BsYWNlaG9sZG
46184VyX29wdGlvbiA9IChcbiAgICAhIHNlbGVjdC5tdWx0aXBsZSAmJlxuICAgIHNlbGVjdC5zaXplIDw9IDEgJiZcbiAgICBzZWxlY3Qub3B0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgc2VsZWN0Lm9wdGlvbnNbMF0ucGFyZW50Tm9kZSA9PSBzZWxlY3QgJiZcbiAgICBzZWxlY3Qub3B0aW9uc1swXS52YWx1ZSA9PT0gJydcbiAgKTtcbiAgcmV0dXJuIChcbiAgICAvKiBhbnl0aGluZyBzZWxlY3RlZCBhdCBhbGw/IFRoYXQncyByZWR1bmRhbnQgd2l0aCB0aGUgLnNvbWUoKSBjYWxsIGJlbG93LFxuICAgICAqIGJ1dCBtb3JlIHBlcmZvcm1hbnQgaW4gdGhlIG1vc3QgcHJvYmFibGUgZXJyb3IgY2FzZS4gKi9cbiAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA+IC0xICYmXG4gICAgQXJyYXkucHJvdG90eXBlLnNvbWUuY2FsbChcbiAgICAgIHNlbGVjdC5vcHRpb25zLFxuICAgICAgb3B0aW9uID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAvKiBpdCBpc24ndCB0aGUgcGxhY2Vob2xkZXIgb3B0aW9uICovXG4gICAgICAgICAgKCEgaGFzX3BsYWNlaG9sZGVyX29wdGlvbiB8fCBvcHRpb24uaW5kZXggIT09IDApICYmXG4gICAgICAgICAgLyogaXQgaXNuJ3QgZGlzYWJsZWQgKi9cbiAgICAgICAgICAhIG9wdGlvbi5kaXNhYmxlZCAmJlxuICAgICAgICAgIC8qIGFuZCBpdCBpcywgaW4gZmFjdCwgc2VsZWN0ZWQgKi9cbiAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQpO1xuICAgICAgfVxuICAgIClcbiAgKTtcbn1cblxuXG4vKipcbiAqIHRlc3QgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAvKiB0aGUgaGFwcHkgKGFuZCBxdWljaykgcGF0aCBmb3IgcmFkaW9zOiAqL1xuICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgncmVxdWlyZWQnKSAmJiBlbGVtZW50LmNoZWNrZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJhZGlvZ3JvdXAgPSBnZXRfcmFkaW9ncm91cChlbGVtZW50KTtcblxuICAgIC8qIGlmIGFueSByYWRpbyBpbiB0aGUgZ3JvdXAgaXMgcmVxdWlyZWQsIHdlIG5lZWQgYW55IChub3QgbmVjZXNzYXJpbHkgdGhlXG4gICAgICogc2FtZSkgcmFkaW8gdG8gYmUgY2hlY2tlZCAqL1xuICAgIGlmIChyYWRpb2dyb3VwLnNvbWUocmFkaW8gPT4gcmFkaW8uaGFzQXR0cmlidXRlKCdyZXF1aXJlZCcpKSkge1xuICAgICAgcmV0dXJuIHJhZGlvZ3JvdXAuc29tZShyYWRpbyA9PiByYWRpby5jaGVja2VkKTtcbiAgICB9XG4gICAgLyogbm90IHJlcXVpcmVkLCB2YWxpZGF0aW9uIHBhc3NlcyAqL1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCEgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ3JlcXVpcmVkJykpIHtcbiAgICAvKiBub3RoaW5nIHRvIGRvICovXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MU2VsZWN0RWxlbWVudCkge1xuICAgIHJldHVybiBoYXNfc3VibWl0dGFibGVfb3B0aW9uKGVsZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIChlbGVtZW50LnR5cGUgPT09ICdjaGVja2JveCcpPyBlbGVtZW50LmNoZWNrZWQgOiAoISEgZWxlbWVudC52YWx1ZSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxuaW1wb3J0IGdldF90eXBlIGZyb20gJy4uL3Rvb2xzL2dldF90eXBlJztcbmltcG9ydCB7IG51bWJlcnMgfSBmcm9tICcuLi9jb21wb25lbnRzL3R5cGVzJztcbmltcG9ydCB7IGRlZmF1bHRfc3RlcCwgc3RlcF9zY2FsZV9mYWN0b3IsIGRlZmF1bHRfc3RlcF9iYXNlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zdGVwX2RlZmF1bHRzJztcbmltcG9ydCBzdHJpbmdfdG9fbnVtYmVyIGZyb20gJy4uL3Rvb2xzL3N0cmluZ190b19udW1iZXInO1xuXG5cbi8qKlxuICogdGVzdCB0aGUgc3RlcCBhdHRyaWJ1dGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWxlbWVudCkge1xuICBjb25zdCB0eXBlID0gZ2V0X3R5cGUoZWxlbWVudCk7XG5cbiAgaWYgKCEgZWxlbWVudC52YWx1ZSB8fFxuICAgICAgbnVtYmVycy5pbmRleE9mKHR5cGUpID09PSAtMSB8fFxuICAgICAgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzdGVwJykgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdhbnknKSB7XG4gICAgLyogd2UncmUgbm90IHJlc3BvbnNpYmxlIGhlcmUuIE5vdGU6IElmIG5vIHN0ZXAgYXR0cmlidXRlIGlzIGdpdmVuLCB3ZVxuICAgICAqIG5lZWQgdG8gdmFsaWRhdGUgYWdhaW5zdCB0aGUgZGVmYXVsdCBzdGVwIGFzIHBlciBzcGVjLiAqL1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbGV0IHN0ZXAgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnc3RlcCcpO1xuICBpZiAoc3RlcCkge1xuICAgIHN0ZXAgPSBzdHJpbmdfdG9fbnVtYmVyKHN0ZXAsIHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHN0ZXAgPSBkZWZh
46184dWx0X3N0ZXBbdHlwZV0gfHwgMTtcbiAgfVxuXG4gIGlmIChzdGVwIDw9IDAgfHwgaXNOYU4oc3RlcCkpIHtcbiAgICAvKiBlcnJvciBpbiBzcGVjaWZpZWQgXCJzdGVwXCIuIFdlIGNhbm5vdCB2YWxpZGF0ZSBhZ2FpbnN0IGl0LCBzbyB0aGUgdmFsdWVcbiAgICAgKiBpcyB0cnVlLiAqL1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3Qgc2NhbGUgPSBzdGVwX3NjYWxlX2ZhY3Rvclt0eXBlXSB8fCAxO1xuXG4gIGxldCB2YWx1ZSA9IHN0cmluZ190b19udW1iZXIoZWxlbWVudC52YWx1ZSwgdHlwZSk7XG4gIGxldCBtaW4gPSBzdHJpbmdfdG9fbnVtYmVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtaW4nKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd2YWx1ZScpIHx8ICcnLCB0eXBlKTtcblxuICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgLyogd2UgY2Fubm90IGNvbXBhcmUgYW4gaW52YWxpZCB2YWx1ZSBhbmQgdHJ1c3QgdGhhdCB0aGUgYmFkSW5wdXQgdmFsaWRhdG9yXG4gICAgICogdGFrZXMgb3ZlciBmcm9tIGhlcmUgKi9cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChpc05hTihtaW4pKSB7XG4gICAgbWluID0gZGVmYXVsdF9zdGVwX2Jhc2VbdHlwZV0gfHwgMDtcbiAgfVxuXG4gIGlmICh0eXBlID09PSAnbW9udGgnKSB7XG4gICAgLyogdHlwZT1tb250aCBoYXMgbW9udGgtd2lkZSBzdGVwcy4gU2VlXG4gICAgICogaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNtb250aC1zdGF0ZS0lMjh0eXBlPW1vbnRoJTI5XG4gICAgICovXG4gICAgbWluID0gKG5ldyBEYXRlKG1pbikpLmdldFVUQ0Z1bGxZZWFyKCkgKiAxMiArIChuZXcgRGF0ZShtaW4pKS5nZXRVVENNb250aCgpO1xuICAgIHZhbHVlID0gKG5ldyBEYXRlKHZhbHVlKSkuZ2V0VVRDRnVsbFllYXIoKSAqIDEyICsgKG5ldyBEYXRlKHZhbHVlKSkuZ2V0VVRDTW9udGgoKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IE1hdGguYWJzKG1pbiAtIHZhbHVlKSAlIChzdGVwICogc2NhbGUpO1xuXG4gIHJldHVybiAocmVzdWx0IDwgMC4wMDAwMDAwMSB8fFxuICAgICAgICAgIC8qIGNyYXBweSBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljcyEgKi9cbiAgICAgICAgICByZXN1bHQgPiAoc3RlcCAqIHNjYWxlKSAtIDAuMDAwMDAwMDEpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCBjb21tYV9zcGxpdCBmcm9tICcuLi90b29scy9jb21tYV9zcGxpdCc7XG5pbXBvcnQgZ2V0X3R5cGUgZnJvbSAnLi4vdG9vbHMvZ2V0X3R5cGUnO1xuaW1wb3J0IHRyaW0gZnJvbSAnLi4vdG9vbHMvdHJpbSc7XG5pbXBvcnQgeyB0eXBlX2NoZWNrZWQgfSBmcm9tICcuLi9jb21wb25lbnRzL3R5cGVzJztcblxuXG4vKiB3ZSB1c2UgYSBkdW1teSA8YT4gd2hlcmUgd2Ugc2V0IHRoZSBocmVmIHRvIHRlc3QgVVJMIHZhbGlkaXR5XG4gKiBUaGUgZGVmaW5pdGlvbiBpcyBvdXQgb2YgdGhlIFwiZ2xvYmFsXCIgc2NvcGUgc28gdGhhdCBKU0RPTSBjYW4gYmUgaW5zdGFudGlhdGVkXG4gKiBhZnRlciBsb2FkaW5nIEh5cGVyZm9ybSBmb3IgdGVzdHMuXG4gKi9cbnZhciB1cmxfY2FuYXJ5O1xuXG4vKiBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCN2YWxpZC1lLW1haWwtYWRkcmVzcyAqL1xuY29uc3QgZW1haWxfcGF0dGVybiA9IC9eW2EtekEtWjAtOS4hIyQlJicqK1xcLz0/Xl9ge3x9fi1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcXC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKiQvO1xuXG4vKipcbiAqIHRlc3QgdGhlIHR5cGUtaW5oZXJlbnQgc3ludGF4XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgY29uc3QgdHlwZSA9IGdldF90eXBlKGVsZW1lbnQpO1xuXG4gIGlmICgodHlwZSAhPT0gJ2ZpbGUnICYmICEgZWxlbWVudC52YWx1ZSkgfHxcbiAgICAgICh0eXBlICE9PSAnZmlsZScgJiYgdHlwZV9jaGVja2VkLmluZGV4T2YodHlwZSkgPT09IC0xKSkge1xuICAgIC8qIHdlJ3JlIG5vdCByZXNwb25zaWJsZSBmb3IgdGhpcyBlbGVtZW50ICovXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgaXNfdmFsaWQgPSB0cnVlO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3VybCc6XG4gICAgICAgIGlmICghIHVybF9jYW5hcnkpIHtcbiAgICAgICAgICB1cmxfY2FuYXJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdHJpbShlbGVtZW50LnZhbHVlKTtcbiAgICAgICAgdXJsX2NhbmFyeS5ocmVmID0gdmFsdWU7XG4gICAgICAgIGlzX3ZhbGlkID0gKHVybF9jYW5hcnkuaHJlZiA9PT0gdmFsdWUgfHxcbiAgICAgICAgICAgICAgICAgICAgdXJsX2NhbmFyeS5ocmVmID09PSB2YWx1ZSsnLycpO1xuICAgICAgICBicmVhaztcbiAgICBjYXNlICdlbWFpbCc6XG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbXVsdGlwbGUnKSkge1xuICAgICAgICAgIGlzX3ZhbGlkID0gY29tbWFfc3BsaXQoZWxlbWVudC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgLmV2ZXJ5KHZhbHVlID0+IGVtYWlsX3BhdHRlcm4udGVzdCh2YWx1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzX3ZhbGlkID0gZW1haWxfcGF0dGVybi50ZXN0KHRyaW0oZWxlbWVudC52YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgICBpZiAoJ2ZpbGVzJyBpbiBlbGVtZW50ICYmIGVsZW1lbnQuZmlsZXMubGVuZ3RoICYmXG4gICAgICAgICAgICBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnYWNjZXB0JykpIHtcbiAgICAgICAgICBjb25zdCBwYXR0ZXJucyA9IGNvbW1hX3NwbGl0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdhY2NlcHQnKSlcbiAgICAgICAgICAgIC5tYXAocGF0dGVybiA9PiB7XG4gICAgICAgICAgICAgIGlmICgvXihhdWRpb3x2aWRlb3xpbWFnZSlcXC9cXCokLy50ZXN0KHBhdHRlcm4pKSB7XG4gICAgICAgICAgICAgICAgcGF0dGVybiA9IG5ldyBSZWdFeHAoJ14nK1JlZ0V4cC4kMSsnLy4rJCcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgI
46184HJldHVybiBwYXR0ZXJuO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoISBwYXR0ZXJucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpbGVsb29wOlxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5maWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLyogd2UgbmVlZCB0byBtYXRjaCBhIHdoaXRlbGlzdCwgc28gcHJlLXNldCB3aXRoIGZhbHNlICovXG4gICAgICAgICAgICBsZXQgZmlsZV92YWxpZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBwYXR0ZXJubG9vcDpcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcGF0dGVybnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGVsZW1lbnQuZmlsZXNbaV07XG4gICAgICAgICAgICAgIGNvbnN0IHBhdHRlcm4gPSBwYXR0ZXJuc1tqXTtcblxuICAgICAgICAgICAgICBsZXQgZmlsZXByb3AgPSBmaWxlLnR5cGU7XG5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJyAmJiBwYXR0ZXJuLnN1YnN0cigwLCAxKSA9PT0gJy4nKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpbGUubmFtZS5zZWFyY2goJy4nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgIC8qIG5vIG1hdGNoIHdpdGggYW55IGZpbGUgZW5kaW5nICovXG4gICAgICAgICAgICAgICAgICBjb250aW51ZSBwYXR0ZXJubG9vcDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmaWxlcHJvcCA9IGZpbGUubmFtZS5zdWJzdHIoZmlsZS5uYW1lLmxhc3RJbmRleE9mKCcuJykpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGZpbGVwcm9wLnNlYXJjaChwYXR0ZXJuKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8qIHdlIGZvdW5kIG9uZSBtYXRjaCBhbmQgY2FuIHF1aXQgbG9va2luZyAqL1xuICAgICAgICAgICAgICAgIGZpbGVfdmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrIHBhdHRlcm5sb29wO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCEgZmlsZV92YWxpZCkge1xuICAgICAgICAgICAgICBpc192YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICBicmVhayBmaWxlbG9vcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc192YWxpZDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbmV4cG9ydCBkZWZhdWx0ICcwLjkuMjMnO1xuIiwiLyohXG4qIGRlcGVuZGVuY3lMaWJzL2lucHV0bWFzay5kZXBlbmRlbmN5TGliLmpzXG4qIGh0dHBzOi8vZ2l0aHViLmNvbS9Sb2JpbkhlcmJvdHMvSW5wdXRtYXNrXG4qIENvcHlyaWdodCAoYykgMjAxMCAtIDIwMTkgUm9iaW4gSGVyYm90c1xuKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwKVxuKiBWZXJzaW9uOiA0LjAuNlxuKi9cblxuKGZ1bmN0aW9uKGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgZGVmaW5lKFsgXCIuLi9nbG9iYWwvd2luZG93XCIgXSwgZmFjdG9yeSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4uL2dsb2JhbC93aW5kb3dcIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kZXBlbmRlbmN5TGliID0gZmFjdG9yeSh3aW5kb3cpO1xuICAgIH1cbn0pKGZ1bmN0aW9uKHdpbmRvdykge1xuICAgIHZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcbiAgICBmdW5jdGlvbiBpbmRleE9mKGxpc3QsIGVsZW0pIHtcbiAgICAgICAgdmFyIGkgPSAwLCBsZW4gPSBsaXN0Lmxlbmd0aDtcbiAgICAgICAgZm9yICg7aSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gZWxlbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNXaW5kb3cob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzQXJyYXlsaWtlKG9iaikge1xuICAgICAgICB2Y
46184XIgbGVuZ3RoID0gXCJsZW5ndGhcIiBpbiBvYmogJiYgb2JqLmxlbmd0aCwgbHR5cGUgPSB0eXBlb2Ygb2JqO1xuICAgICAgICBpZiAobHR5cGUgPT09IFwiZnVuY3Rpb25cIiB8fCBpc1dpbmRvdyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iai5ub2RlVHlwZSA9PT0gMSAmJiBsZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgbGVuZ3RoID09PSBcIm51bWJlclwiICYmIGxlbmd0aCA+IDAgJiYgbGVuZ3RoIC0gMSBpbiBvYmo7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KGVsZW0pIHtcbiAgICAgICAgcmV0dXJuIGVsZW0gaW5zdGFuY2VvZiBFbGVtZW50O1xuICAgIH1cbiAgICBmdW5jdGlvbiBEZXBlbmRlbmN5TGliKGVsZW0pIHtcbiAgICAgICAgaWYgKGVsZW0gaW5zdGFuY2VvZiBEZXBlbmRlbmN5TGliKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRGVwZW5kZW5jeUxpYikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGVwZW5kZW5jeUxpYihlbGVtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbSAhPT0gdW5kZWZpbmVkICYmIGVsZW0gIT09IG51bGwgJiYgZWxlbSAhPT0gd2luZG93KSB7XG4gICAgICAgICAgICB0aGlzWzBdID0gZWxlbS5ub2RlTmFtZSA/IGVsZW0gOiBlbGVtWzBdICE9PSB1bmRlZmluZWQgJiYgZWxlbVswXS5ub2RlTmFtZSA/IGVsZW1bMF0gOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW0pO1xuICAgICAgICAgICAgaWYgKHRoaXNbMF0gIT09IHVuZGVmaW5lZCAmJiB0aGlzWzBdICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpc1swXS5ldmVudFJlZ2lzdHJ5ID0gdGhpc1swXS5ldmVudFJlZ2lzdHJ5IHx8IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFdpbmRvdyhlbGVtKSB7XG4gICAgICAgIHJldHVybiBpc1dpbmRvdyhlbGVtKSA/IGVsZW0gOiBlbGVtLm5vZGVUeXBlID09PSA5ID8gZWxlbS5kZWZhdWx0VmlldyB8fCBlbGVtLnBhcmVudFdpbmRvdyA6IGZhbHNlO1xuICAgIH1cbiAgICBEZXBlbmRlbmN5TGliLnByb3RvdHlwZSA9IHtcbiAgICAgICAgb246IGZ1bmN0aW9uKGV2ZW50cywgaGFuZGxlcikge1xuICAgICAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KHRoaXNbMF0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50UmVnaXN0cnkgPSB0aGlzWzBdLmV2ZW50UmVnaXN0cnksIGVsZW0gPSB0aGlzWzBdO1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFkZEV2ZW50KGV2LCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5hZGRFdmVudExpc3RlbmVyKGV2LCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbS5hdHRhY2hFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5hdHRhY2hFdmVudChcIm9uXCIgKyBldiwgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZXZlbnRSZWdpc3RyeVtldl0gPSBldmVudFJlZ2lzdHJ5W2V2XSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRSZWdpc3RyeVtldl1bbmFtZXNwYWNlXSA9IGV2ZW50UmVnaXN0cnlbZXZdW25hbWVzcGFjZV0gfHwgW107XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50UmVnaXN0cnlbZXZdW25hbWVzcGFjZV0ucHVzaChoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIF9ldmVudHMgPSBldmVudHMuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGVuZHggPSAwOyBlbmR4IDwgX2V2ZW50cy5sZW5ndGg7IGVuZHgrKykge1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgbnNFdmVudCA9IF9ldmVudHNbZW5keF0uc3BsaXQoXCIuXCIpLCBldiA9IG5zRXZlbnRbMF0sIG5hbWVzcGFjZSA9IG5zRXZlbnRbMV0gfHwgXCJnbG9iYWxcIjtcbiAgICAgICAgICAgICAgICAgICAgYWRkRXZlbnQoZXYsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIG9mZjogZnVuY3Rpb24oZXZlbnRzLCBoYW5kbGVyKSB7XG4gICAgICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQodGhpc1swXSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXZlbnRSZWdpc3RyeSA9IHRoaXNbMF0uZXZlbnRSZWdpc3RyeSwgZWxlbSA9IHRoaXNbMF07XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gcmVtb3ZlRXZlbnQoZXYsIG5hbWVzcGFjZSwgaGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXYgaW4gZXZlbnRSZWdpc3RyeSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldiwgaGFuZGxlciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtLmRldGFjaEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5kZXRhY2hFdmVudChcIm9uXCIgKyBldiwgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlID09PSBcImdsb2JhbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbm1zcCBpbiBldmVudFJlZ2lzdHJ5W2V2XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFJlZ2lzdHJ5W2V2XVtubXNwXS5zcGxpY2UoZXZlbnRSZWdpc3RyeVtldl1bbm1zcF0uaW5kZXhPZihoYW5kbGVyKSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFJlZ2lzdHJ5W2V2XVtuYW1lc3BhY2VdLnNwbGljZShldmVudFJlZ2lzdHJ5W2V2XVtuYW1lc3BhY2VdLmluZGV4T2YoaGFuZGxlciksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlc29sdmVOYW1lc3BhY2UoZXYsIG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgZXZ0cyA9IFtdLCBobmR4LCBobmRMO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXYubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaG5keCA9IDAsIGhuZEwgPSBldmVudFJlZ2lzdHJ5W2V2XVtuYW1lc3BhY2VdLmxlbmd0aDsgaG5keCA8IGhuZEw7IGhuZHgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXY6IGV2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UgJiYgbmFtZXNwYWNlLmxlbmd0aCA+IDAgPyBuYW1lc3BhY2UgOiBcImdsb2JhbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjogZXZlbnRSZWdpc3RyeVtldl1bbmFtZXNwYWNlXVtobmR4XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2OiBldixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UgJiYgbmFtZXNwYWNlLmxlbmd0aCA+IDAgPyBuYW1lc3BhY2UgOiBcImdsb2JhbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyOiBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZXNwYWNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGV2TmR4IGluIGV2ZW50UmVnaXN0cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBubXNwIGluIGV2ZW50UmVnaXN0cnlbZXZOZHhdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChubXNwID09PSBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGhuZHggPSAwLCBobmRMID0gZXZlbnRSZWdpc3RyeVtldk5keF1bbm1zcF0ubGVuZ3RoOyBobmR4IDwgaG5kTDsgaG5keCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldjogZXZOZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IG5tc3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyOiBldmVudFJlZ2lzdHJ5W2V2TmR4XVtubXNwXVtobmR4XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2OiBldk5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiBubXNwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyOiBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2dHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBfZXZlbnRzID0gZXZlbnRzLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBlbmR4ID0gMDsgZW5keCA8IF9ldmVudHMubGVuZ3RoOyBlbmR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5zRXZlbnQgPSBfZXZlbnRzW2VuZHhdLnNwbGl0KFwiLlwiKSwgb2ZmRXZlbnRzID0gcmVzb2x2ZU5hbWVzcGFjZShuc0V2ZW50WzBdLCBuc0V2ZW50WzFdKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG9mZkV2ZW50c0wgPSBvZmZFdmVudHMubGVuZ3RoOyBpIDwgb2ZmRXZlbnRzTDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVFdmVudChvZmZFdmVudHNbaV0uZXYsIG9mZkV2ZW50c1tpXS5uYW1lc3BhY2UsIG9mZkV2ZW50c1tpXS5oYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuICAgICAgICB0cmlnZ2VyOiBmdW5jdGlvbihldmVudHMpIHtcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkRWxlbWVudCh0aGlzWzBdKSkge1xuICAgICAgICAgICAgICAgIHZhciBldmVudFJlZ2lzdHJ5ID0gdGhpc1swXS5ldmVudFJlZ2lzdHJ5LCBlbGVtID0gdGhpc1swXTtcbiAgICAgICAgICAgICAgICB2Y
46184XIgX2V2ZW50cyA9IHR5cGVvZiBldmVudHMgPT09IFwic3RyaW5nXCIgPyBldmVudHMuc3BsaXQoXCIgXCIpIDogWyBldmVudHMudHlwZSBdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGVuZHggPSAwOyBlbmR4IDwgX2V2ZW50cy5sZW5ndGg7IGVuZHgrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbnNFdmVudCA9IF9ldmVudHNbZW5keF0uc3BsaXQoXCIuXCIpLCBldiA9IG5zRXZlbnRbMF0sIG5hbWVzcGFjZSA9IG5zRXZlbnRbMV0gfHwgXCJnbG9iYWxcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50ICE9PSB1bmRlZmluZWQgJiYgbmFtZXNwYWNlID09PSBcImdsb2JhbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXZudCwgaSwgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IGFyZ3VtZW50c1sxXVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5jcmVhdGVFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2bnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXYsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldm50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZudC5pbml0Q3VzdG9tRXZlbnQoZXYsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSwgcGFyYW1zLmRldGFpbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudHMudHlwZSkgRGVwZW5kZW5jeUxpYi5leHRlbmQoZXZudCwgZXZlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmRpc3BhdGNoRXZlbnQoZXZudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2bnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2bnQuZXZlbnRUeXBlID0gZXY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZudC5kZXRhaWwgPSBhcmd1bWVudHNbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50cy50eXBlKSBEZXBlbmRlbmN5TGliLmV4dGVuZChldm50LCBldmVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uZmlyZUV2ZW50KFwib25cIiArIGV2bnQuZXZlbnRUeXBlLCBldm50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudFJlZ2lzdHJ5W2V2XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNbMF0gPSBhcmd1bWVudHNbMF0udHlwZSA/IGFyZ3VtZW50c1swXSA6IERlcGVuZGVuY3lMaWIuRXZlbnQoYXJndW1lbnRzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgPT09IFwiZ2xvYmFsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBubXNwIGluIGV2ZW50UmVnaXN0cnlbZXZdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBldmVudFJlZ2lzdHJ5W2V2XVtubXNwXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRSZWdpc3RyeVtldl1bbm1zcF1baV0uYXBwbHkoZWxlbSwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGV2ZW50UmVnaXN0cnlbZXZdW25hbWVzcGFjZV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRSZWdpc3RyeVtldl1bbmFtZXNwYWNlXVtpXS5hcHBseShlbGVtLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEZXBlbmRlbmN5TGliLmlzRnVuY3Rpb24gPSBmdW5jdGlvbihvYmopIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIjtcbiAgICB9O1xuICAgIERlcGVuZGVuY3lMaWIubm9vcCA9IGZ1bmN0aW9uKCkge307XG4gICAgRGVwZW5kZW5jeUxpYi5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbiAgICBEZXBlbmRlbmN5TGliLmluQXJyYXkgPSBmdW5jdGlvbihlbGVtLCBhcnIsIGkpIHtcbiAgICAgICAgcmV0dXJuIGFyciA9PSBudWxsID8gLTEgOiBpbmRleE9mKGFyciwgZWxlbSwgaSk7XG4gICAgfTtcbiAgICBEZXBlbmRlbmN5TGliLnZhbEhvb2tzID0gdW5kZWZpbmVkO1xuICAgIERlcGVuZGVuY3lMaWIuaXNQbGFpbk9iamVjdCA9IGZ1bmN0aW9uKG9iaikge1xuICAgICAgICBpZiAodHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiB8fCBvYmoubm9kZVR5cGUgfHwgaXNXaW5kb3cob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvYmouY29uc3RydWN0b3IgJiYgIU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwiaXNQcm90b3R5cGVPZlwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgI
46184HJldHVybiB0cnVlO1xuICAgIH07XG4gICAgRGVwZW5kZW5jeUxpYi5leHRlbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lLCB0YXJnZXQgPSBhcmd1bWVudHNbMF0gfHwge30sIGkgPSAxLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLCBkZWVwID0gZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgZGVlcCA9IHRhcmdldDtcbiAgICAgICAgICAgIHRhcmdldCA9IGFyZ3VtZW50c1tpXSB8fCB7fTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAhRGVwZW5kZW5jeUxpYi5pc0Z1bmN0aW9uKHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHRoaXM7XG4gICAgICAgICAgICBpLS07XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7aSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoKG9wdGlvbnMgPSBhcmd1bWVudHNbaV0pICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmb3IgKG5hbWUgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBzcmMgPSB0YXJnZXRbbmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGNvcHkgPSBvcHRpb25zW25hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09PSBjb3B5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZGVlcCAmJi
46184Bjb3B5ICYmIChEZXBlbmRlbmN5TGliLmlzUGxhaW5PYmplY3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0gRGVwZW5kZW5jeUxpYi5pc0FycmF5KGNvcHkpKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3B5SXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlJc0FycmF5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUgPSBzcmMgJiYgRGVwZW5kZW5jeUxpYi5pc0FycmF5KHNyYykgPyBzcmMgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUgPSBzcmMgJiYgRGVwZW5kZW5jeUxpYi5pc1BsYWluT2JqZWN0KHNyYykgPyBzcmMgOiB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtuYW1lXSA9IERlcGVuZGVuY3lMaWIuZXh0ZW5kKGRlZXAsIGNsb25lLCBjb3B5KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb3B5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtuYW1lXSA9IGNvcHk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9O1xuICAgIERlcGVuZGVuY3lMaWIuZWFjaCA9IGZ1bmN0aW9uKG9iaiwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHZhbHVlLCBpID0gMDtcbiAgICAgICAgaWYgKGlzQXJyYXlsaWtlKG9iaikpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGxlbmd0aCA9IG9iai5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gY2FsbGJhY2suY2FsbChvYmpbaV0sIGksIG9ialtpXSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGkgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBjYWxsYmFjay5jYWxsKG9ialtpXSwgaSwgb2JqW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH07XG4gICAgRGVwZW5kZW5jeUxpYi5kYXRhID0gZnVuY3Rpb24ob3duZXIsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvd25lci5fX2RhdGEgPyBvd25lci5fX2RhdGFba2V5XSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvd25lci5fX2RhdGEgPSBvd25lci5fX2RhdGEgfHwge307XG4gICAgICAgICAgICBvd25lci5fX2RhdGFba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIERlcGVuZGVuY3lMaWIuRXZlbnQgPSB3aW5kb3cuQ3VzdG9tRXZlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgRGVwZW5kZW5jeUxpYi5FdmVudCA9IGZ1bmN0aW9uKGV2ZW50LCBwYXJhbXMpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7XG4gICAgICAgICAgICAgICAgYnViYmxlczogZmFsc2UsXG4gICAgICAgICAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB1bmRlZmluZWRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2Y
46184XIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKTtcbiAgICAgICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSwgcGFyYW1zLmRldGFpbCk7XG4gICAgICAgICAgICByZXR1cm4gZXZ0O1xuICAgICAgICB9O1xuICAgICAgICBEZXBlbmRlbmN5TGliLkV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gICAgfVxuICAgIHJldHVybiBEZXBlbmRlbmN5TGliO1xufSk7IiwiLyohXG4qIGdsb2JhbC93aW5kb3cuanNcbiogaHR0cHM6Ly9naXRodWIuY29tL1JvYmluSGVyYm90cy9JbnB1dG1hc2tcbiogQ29weXJpZ2h0IChjKSAyMDEwIC0gMjAxOSBSb2JpbiBIZXJib3RzXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApXG4qIFZlcnNpb246IDQuMC42XG4qL1xuXG5pZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IG5ldyAoZXZhbChcInJlcXVpcmUoJ2pzZG9tJykuSlNET01cIikpKFwiXCIpLndpbmRvdztcbn0pOyBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikgbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogbmV3IChldmFsKFwicmVxdWlyZSgnanNkb20nKS5KU0RPTVwiKSkoXCJcIikud2luZG93OyIsIi8qIVxuKiBpbnB1dG1hc2suZGF0ZS5leHRlbnNpb25zLmpzXG4qIGh0dHBzOi8vZ2l0aHViLmNvbS9Sb2JpbkhlcmJvdHMvSW5wdXRtYXNrXG4qIENvcHlyaWdodCAoYykgMjAxMCAtIDIwMTkgUm9iaW4gSGVyYm90c1xuKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwKVxuKiBWZXJzaW9uOiA0LjAuNlxuKi9cblxuKGZ1bmN0aW9uKGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgZGVmaW5lKFsgXCIuL2lucHV0bWFza1wiIF0sIGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2lucHV0bWFza1wiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmFjdG9yeSh3aW5kb3cuSW5wdXRtYXNrKTtcbiAgICB9XG59KShmdW5jdGlvbihJbnB1dG1hc2spIHtcbiAgICB2YXIgJCA9IElucHV0bWFzay5kZXBlbmRlbmN5TGliO1xuICAgIHZhciBmb3JtYXRDb2RlID0ge1xuICAgICAgICBkOiBbIFwiWzEtOV18WzEyXVswLTldfDNbMDFdXCIsIERhdGUucHJvdG90eXBlLnNldERhdGUsIFwiZGF5XCIsIERhdGUucHJvdG90eXBlLmdldERhdGUg
46184XSxcbiAgICAgICAgZGQ6IFsgXCIwWzEtOV18WzEyXVswLTldfDNbMDFdXCIsIERhdGUucHJvdG90eXBlLnNldERhdGUsIFwiZGF5XCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhZChEYXRlLnByb3RvdHlwZS5nZXREYXRlLmNhbGwodGhpcyksIDIpO1xuICAgICAgICB9IF0sXG4gICAgICAgIGRkZDogWyBcIlwiIF0sXG4gICAgICAgIGRkZGQ6IFsgXCJcIiBdLFxuICAgICAgICBtOiBbIFwiWzEtOV18MVswMTJdXCIsIERhdGUucHJvdG90eXBlLnNldE1vbnRoLCBcIm1vbnRoXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIERhdGUucHJvdG90eXBlLmdldE1vbnRoLmNhbGwodGhpcykgKyAxO1xuICAgICAgICB9IF0sXG4gICAgICAgIG1tOiBbIFwiMFsxLTldfDFbMDEyXVwiLCBEYXRlLnByb3RvdHlwZS5zZXRNb250aCwgXCJtb250aFwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBwYWQoRGF0ZS5wcm90b3R5cGUuZ2V0TW9udGguY2FsbCh0aGlzKSArIDEsIDIpO1xuICAgICAgICB9IF0sXG4gICAgICAgIG1tbTogWyBcIlwiIF0sXG4gICAgICAgIG1tbW06IFsgXCJcIiBdLFxuICAgICAgICB5eTogWyBcIlswLTldezJ9XCIsIERhdGUucHJvdG90eXBlLnNldEZ1bGxZZWFyLCBcInllYXJcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFkKERhdGUucHJvdG90eXBlLmdldEZ1bGxZZWFyLmNhbGwodGhpcyksIDIpO1xuICAgICAgICB9IF0sXG4gICAgICAgIHl5eXk6IFsgXCJbMC05XXs0fVwiLCBEYXRlLnByb3RvdHlwZS5zZXRGdWxsWWVhciwgXCJ5ZWFyXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhZChEYXRlLnByb3RvdHlwZS5nZXRGdWxsWWVhci5jYWxsKHRoaXMpLCA0KTtcbiAgICAgICAgfSBdLFxuICAgICAgICBoOiBbIFwiWzEtOV18MVswLTJdXCIsIERhdGUucHJvdG90eXBlLnNldEhvdXJzLCBcImhvdXJzXCIsIERhdGUucHJvdG90eXBlLmdldEhvdXJzIF0sXG4gICAgICAgIGhoOiBbIFwiMFsxLTldfDFbMC0yXVwiLCBEYXRlLnByb3RvdHlwZS5zZXRIb3VycywgXCJob3Vyc1wiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBwYWQoRGF0ZS5wcm90b3R5cGUuZ2V0SG91cnMuY2FsbCh0aGlzKSwgMik7XG4gICAgICAgIH0gXSxcbiAgICAgICAgaGhoOiBbIFwiWzAtOV0rXCIsIERhdGUucHJvdG90eXBlLnNldEhvdXJzLCBcImhvdXJzXCIsIERhdGUucHJvdG90eXBlLmdldEhvdXJzIF0sXG4gICAgICAgIEg6IFsgXCIxP1swLTldfDJbMC0zXVwiLCBEYXRlLnByb3RvdHlwZS5zZXRIb3VycywgXCJob3Vyc1wiLCBEYXRlLnByb3RvdHlwZS5nZXRIb3VycyBdLFxuICAgICAgICBISDogWyBcIjBbMC05XXwxWzAtOV18MlswLTNdXCIsIERhdGUucHJvdG90eXBlLnNldEhvdXJzLCBcImhvdXJzXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhZChEYXRlLnByb3RvdHlwZS5nZXRIb3Vycy5jYWxsKHRoaXMpLCAyKTtcbiAgICAgICAgfSBdLFxuICAgICAgICBISEg6IFsgXCJbMC05XStcIiwgRGF0ZS5wcm90b3R5cGUuc2V0SG91cnMsIFwiaG91cnNcIiwgRGF0ZS5wcm90b3R5cGUuZ2V0SG91cnMgXSxcbiAgICAgICAgTTogWyBcIlsxLTVdP1swLTldXCIsIERhdGUucHJvdG90eXBlLnNldE1pbnV0ZXMsIFwibWludXRlc1wiLCBEYXRlLnByb3RvdHlwZS5nZXRNaW51dGVzIF0sXG4gICAgICAgIE1NOiBbIFwiMFswLTldfDFbMC05XXwyWzAtOV18M1swLTldfDRbMC05XXw1WzAtOV1cIiwgRGF0ZS5wcm90b3R5cGUuc2V0TWludXRlcywgXCJtaW51dGVzXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhZChEYXRlLnByb3RvdHlwZS5nZXRNaW51dGVzLmNhbGwodGhpcyksIDIpO1xuICAgICAgICB9IF0sXG4gICAgICAgIHNzOiBbIFwiWzAtNV1bMC05XVwiLCBEYXRlLnByb3RvdHlwZS5zZXRTZWNvbmRzLCBcInNlY29uZHNcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFkKERhdGUucHJvdG90eXBlLmdldFNlY29uZHMuY2FsbCh0aGlzKSwgMik7XG4gICAgICAgIH0gXSxcbiAgICAgICAgbDogWyBcIlswLTldezN9XCIsIERhdGUucHJvdG90eXBlLnNldE1pbGxpc2Vjb25kcywgXCJtaWxsaXNlY29uZHNcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFkKERhdGUucHJvdG90eXBlLmdldE1pbGxpc2Vjb25kcy5jYWxsKHRoaXMpLCAzKTtcbiAgICAgICAgfSBdLFxuICAgICAgICBMOiBbIFwiWzAtOV17Mn1cIiwgRGF0ZS5wcm90b3R5cGUuc2V0TWlsbGlzZWNvbmRzLCBcIm1pbGxpc2Vjb25kc1wiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBwYWQoRGF0ZS5wcm90b3R5cGUuZ2V0TWlsbGlzZWNvbmRzLmNhbGwodGhpcyksIDIpO1xuICAgICAgICB9IF0sXG4gICAgICAgIHQ6IFsgXCJbYXBdXCIgXSxcbiAgICAgICAgdHQ6IFsgXCJbYXBdbVwiIF0sXG4gICAgICAgIFQ6IFsgXCJbQVBdXCIgXSxcbiAgICAgICAgVFQ6IFsgXCJbQVBdTVwiIF0sXG4gICAgICAgIFo6IFsgXCJcIiBdLFxuICAgICAgICBvOiBbIFwiXCIgXSxcbiAgICAgICAgUzogWyBcIlwiIF1cbiAgICB9LCBmb3JtYXRBbGlhcyA9IHtcbiAgICAgICAgaXNvRGF0ZTogXCJ5eXl5LW1tLWRkXCIsXG4gICAgICAgIGlzb1RpbWU6IFwiSEg6TU06c3NcIixcbiAgICAgICAgaXNvRGF0ZVRpbWU6IFwieXl5eS1tbS1kZCdUJ0hIOk1NOnNzXCIsXG4gICAgICAgIGlzb1V0Y0RhdGVUaW1lOiBcIlVUQzp5eXl5LW1tLWRkJ1QnSEg6TU06c3MnWidcIlxuICAgIH07XG4gICAgZnVuY3Rpb24gZ2V0VG9rZW5pemVyKG9wdHMpIHtcbiAgICAgICAgaWYgKCFvcHRzLnRva2VuaXplcikge1xuICAgICAgICAgICAgdmFyIHRva2VucyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgbmR4IGluIGZvcm1hdENvZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmluZGV4T2YobmR4WzBdKSA9PT0gLTEpIHRva2Vucy5wdXNoKG5keFswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcHRzLnRva2VuaXplciA9IFwiKFwiICsgdG9rZW5zLmpvaW4oXCIrfFwiKSArIFwiKSs/fC5cIjtcbiAgICAgICAgICAgIG9wdHMudG9rZW5pemVyID0gbmV3IFJlZ0V4cChvcHRzLnRva2VuaXplciwgXCJnXCIpO1xuICAgICAgICB9XG4gICAgICAgI
46184HJldHVybiBvcHRzLnRva2VuaXplcjtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNWYWxpZERhdGUoZGF0ZVBhcnRzLCBjdXJyZW50UmVzdWx0KSB7XG4gICAgICAgIHJldHVybiAhaXNGaW5pdGUoZGF0ZVBhcnRzLnJhd2RheSkgfHwgZGF0ZVBhcnRzLmRheSA9PSBcIjI5XCIgJiYgIWlzRmluaXRlKGRhdGVQYXJ0cy5yYXd5ZWFyKSB8fCBuZXcgRGF0ZShkYXRlUGFydHMuZGF0ZS5nZXRGdWxsWWVhcigpLCBpc0Zpbml0ZShkYXRlUGFydHMucmF3bW9udGgpID8gZGF0ZVBhcnRzLm1vbnRoIDogZGF0ZVBhcnRzLmRhdGUuZ2V0TW9udGgoKSArIDEsIDApLmdldERhdGUoKSA+PSBkYXRlUGFydHMuZGF5ID8gY3VycmVudFJlc3VsdCA6IGZhbHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0RhdGVJblJhbmdlKGRhdGVQYXJ0cywgb3B0cykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wdHMubWluKSB7XG4gICAgICAgICAgICBpZiAoZGF0ZVBhcnRzW1wicmF3eWVhclwiXSkge1xuICAgICAgICAgICAgICAgIHZhciByYXdZZWFyID0gZGF0ZVBhcnRzW1wicmF3eWVhclwiXS5yZXBsYWNlKC9bXjAtOV0vZywgXCJcIiksIG1pblllYXIgPSBvcHRzLm1pbi55ZWFyLnN1YnN0cigwLCByYXdZZWFyLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbWluWWVhciA8PSByYXdZZWFyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGVQYXJ0c1tcInllYXJcIl0gPT09IGRhdGVQYXJ0c1tcInJhd3llYXJcIl0pIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0cy5taW4uZGF0ZS5nZXRUaW1lKCkgPT09IG9wdHMubWluLmRhdGUuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9wdHMubWluLmRhdGUuZ2V0VGltZSgpIDw9IGRhdGVQYXJ0cy5kYXRlLmdldFRpbWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCAmJiBvcHRzLm1heCAmJiBvcHRzLm1heC5kYXRlLmdldFRpbWUoKSA9PT0gb3B0cy5tYXguZGF0ZS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG9wdHMubWF4LmRhdGUuZ2V0VGltZSgpID49IGRhdGVQYXJ0cy5kYXRlLmdldFRpbWUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmdW5jdGlvbiBwYXJzZShmb3JtYXQsIGRhdGVPYmpWYWx1ZSwgb3B0cywgcmF3KSB7XG4gICAgICAgIHZhciBtYXNrID0gXCJcIiwgbWF0Y2g7XG4gICAgICAgIHdoaWxlIChtYXRjaCA9IGdldFRva2VuaXplcihvcHRzKS5leGVjKGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGlmIChkYXRlT2JqVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChmb3JtYXRDb2RlW21hdGNoWzBdXSkge1xuICAgICAgICAgICAgICAgICAgICBtYXNrICs9IFwiKFwiICsgZm9ybWF0Q29kZVttYXRjaFswXV1bMF0gKyBcIilcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1hdGNoWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIltcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgKz0gXCIoXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJdXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrICs9IFwiKT9cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgKz0gSW5wdXRtYXNrLmVzY2FwZVJlZ2V4KG1hdGNoWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvcm1hdENvZGVbbWF0Y2hbMF1dKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYXcgIT09IHRydWUgJiYgZm9ybWF0Q29kZVttYXRjaFswXV1bM10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnZXRGbiA9IGZvcm1hdENvZGVbbWF0Y2hbMF1dWzNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFzayArPSBnZXRGbi5jYWxsKGRhdGVPYmpWYWx1ZS5kYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXRDb2RlW21hdGNoWzBdXVsyXSkgbWFzayArPSBkYXRlT2JqVmFsdWVbXCJyYXdcIiArIGZvcm1hdENvZGVbbWF0Y2hbMF1dWzJdXTsgZWxzZSBtYXNrICs9IG1hdGNoWzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBtYXNrICs9IG1hdGNoWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXNrO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwYWQodmFsLCBsZW4pIHtcbiAgICAgICAgdmFsID0gU3RyaW5nKHZhbCk7XG4gICAgICAgIGxlbiA9IGxlbiB8fCAyO1xuICAgICAgICB3aGlsZSAodmFsLmxlbmd0aCA8IGxlbikgdmFsID0gXCIwXCIgKyB2YWw7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFuYWx5c2VNYXNrKG1hc2tTdHJpbmcsIGZvcm1hdCwgb3B0cykge1xuICAgICAgICB2Y
46184XIgZGF0ZU9iaiA9IHtcbiAgICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKDEsIDAsIDEpXG4gICAgICAgIH0sIHRhcmdldFByb3AsIG1hc2sgPSBtYXNrU3RyaW5nLCBtYXRjaCwgZGF0ZU9wZXJhdGlvbiwgdGFyZ2V0VmFsaWRhdG9yO1xuICAgICAgICBmdW5jdGlvbiBleHRlbmRQcm9wZXJ0eSh2YWx1ZSkge1xuICAgICAgICAgICAgdmFyIGNvcnJlY3RlZFZhbHVlID0gdmFsdWUucmVwbGFjZSgvW14wLTldL2csIFwiMFwiKTtcbiAgICAgICAgICAgIGlmIChjb3JyZWN0ZWRWYWx1ZSAhPSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBlbnRlcmVkUGFydCA9IHZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCBcIlwiKSwgbWluID0gKG9wdHMubWluICYmIG9wdHMubWluW3RhcmdldFByb3BdIHx8IHZhbHVlKS50b1N0cmluZygpLCBtYXggPSAob3B0cy5tYXggJiYgb3B0cy5tYXhbdGFyZ2V0UHJvcF0gfHwgdmFsdWUpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgY29ycmVjdGVkVmFsdWUgPSBlbnRlcmVkUGFydCArIChlbnRlcmVkUGFydCA8IG1pbi5zbGljZSgwLCBlbnRlcmVkUGFydC5sZW5ndGgpID8gbWluLnNsaWNlKGVudGVyZWRQYXJ0Lmxlbmd0aCkgOiBlbnRlcmVkUGFydCA+IG1heC5zbGljZSgwLCBlbnRlcmVkUGFydC5sZW5ndGgpID8gbWF4LnNsaWNlKGVudGVyZWRQYXJ0Lmxlbmd0aCkgOiBjb3JyZWN0ZWRWYWx1ZS50b1N0cmluZygpLnNsaWNlKGVudGVyZWRQYXJ0Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvcnJlY3RlZFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNldFZhbHVlKGRhdGVPYmosIHZhbHVlLCBvcHRzKSB7XG4gICAgICAgICAgICBkYXRlT2JqW3RhcmdldFByb3BdID0gZXh0ZW5kUHJvcGVydHkodmFsdWUpO1xuICAgICAgICAgICAgZGF0ZU9ialtcInJhd1wiICsgdGFyZ2V0UHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChkYXRlT3BlcmF0aW9uICE9PSB1bmRlZmluZWQpIGRhdGVPcGVyYXRpb24uY2FsbChkYXRlT2JqLmRhdGUsIHRhcmdldFByb3AgPT0gXCJtb250aFwiID8gcGFyc2VJbnQoZGF0ZU9ialt0YXJnZXRQcm9wXSkgLSAxIDogZGF0ZU9ialt0YXJnZXRQcm9wXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBtYXNrID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB3aGlsZSAobWF0Y2ggPSBnZXRUb2tlbml6ZXIob3B0cykuZXhlYyhmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gbWFzay5zbGljZSgwLCBtYXRjaFswXS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChmb3JtYXRDb2RlLmhhc093blByb3BlcnR5KG1hdGNoWzBdKSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRWYWxpZGF0b3IgPSBmb3JtYXRDb2RlW21hdGNoWzBdXVswXTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJvcCA9IGZvcm1hdENvZGVbbWF0Y2hbMF1dWzJdO1xuICAgICAgICAgICAgICAgICAgICBkYXRlT3BlcmF0aW9uID0gZm9ybWF0Q29kZVttYXRjaFswXV1bMV07XG4gICAgICAgICAgICAgICAgICAgIHNldFZhbHVlKGRhdGVPYmosIHZhbHVlLCBvcHRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWFzayA9IG1hc2suc2xpY2UodmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkYXRlT2JqO1xuICAgICAgICB9IGVsc2UgaWYgKG1hc2sgJiYgdHlwZW9mIG1hc2sgPT09IFwib2JqZWN0XCIgJiYgbWFzay5oYXNPd25Qcm9wZXJ0eShcImRhdGVcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXNrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIElucHV0bWFzay5leHRlbmRBbGlhc2VzKHtcbiAgICAgICAgZGF0ZXRpbWU6IHtcbiAgICAgICAgICAgIG1hc2s6IGZ1bmN0aW9uKG9wdHMpIHtcbiAgICAgICAgICAgICAgICBmb3JtYXRDb2RlLlMgPSBvcHRzLmkxOG4ub3JkaW5hbFN1ZmZpeC5qb2luKFwifFwiKTtcbiAgICAgICAgICAgICAgICBvcHRzLmlucHV0Rm9ybWF0ID0gZm9ybWF0QWxpYXNbb3B0cy5pbnB1dEZvcm1hdF0gfHwgb3B0cy5pbnB1dEZvcm1hdDtcbiAgICAgICAgICAgICAgICBvcHRzLmRpc3BsYXlGb3JtYXQgPSBmb3JtYXRBbGlhc1tvcHRzLmRpc3BsYXlGb3JtYXRdIHx8IG9wdHMuZGlzcGxheUZvcm1hdCB8fCBvcHRzLmlucHV0Rm9ybWF0O1xuICAgICAgICAgICAgICAgIG9wdHMub3V0cHV0Rm9ybWF0ID0gZm9ybWF0QWxpYXNbb3B0cy5vdXRwdXRGb3JtYXRdIHx8IG9wdHMub3V0cHV0Rm9ybWF0IHx8IG9wdHMuaW5wdXRGb3JtYXQ7XG4gICAgICAgICAgICAgICAgb3B0cy5wbGFjZWhvbGRlciA9IG9wdHMucGxhY2Vob2xkZXIgIT09IFwiXCIgPyBvcHRzLnBsYWNlaG9sZGVyIDogb3B0cy5pbnB1dEZvcm1hdC5yZXBsYWNlKC9bXFxbXFxdXS8sIFwiXCIpO1xuICAgICAgICAgICAgICAgIG9wdHMucmVnZXggPSBwYXJzZShvcHRzLmlucHV0Rm9ybWF0LCB1bmRlZmluZWQsIG9wdHMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIlwiLFxuICAgICAgICAgICAgaW5wdXRGb3JtYXQ6IFwiaXNvRGF0ZVRpbWVcIixcbiAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG91dHB1dEZvcm1hdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbWluOiBudWxsLFxuICAgICAgICAgICAgbWF4OiBudWxsLFxuICAgICAgICAgICAgaTE4bjoge1xuICAgICAgICAgICAgICAgIGRheU5hbWVzOiBbIFwiTW9uXCIsIFwiVHVlXCIsIFwiV2VkXCIsIFwiVGh1XCIsIFwiRnJpXCIsIFwiU2F0XCIsIFwiU3VuXCIsIFwiTW9uZGF5XCIsIFwiVHVlc2RheVwiLCBcIldlZG5lc2RheVwiLCBcIlRodXJzZGF5XCIsIFwiRnJpZGF5XCIsIFwiU2F0dXJkYXlcIiwgXCJTdW5kYXlcIiBdLFxuICAgICAgICAgICAgICAgIG1vbnRoTmFtZXM6IFsgXCJKYW5cIiwgXCJGZWJcIiwgXCJNYXJcIiwgXCJBcHJcIiwgXCJNYXlcIiwgXCJKdW5cIiwgXCJKdWxcIiwgXCJBdWdcIiwgXCJTZXBcIiwgXCJPY3RcIiwgXCJOb3ZcIiwgXCJEZWNcIiwgXCJKYW51YXJ5XCIsIFwiRmVicnVhcnlc
46184IiwgXCJNYXJjaFwiLCBcIkFwcmlsXCIsIFwiTWF5XCIsIFwiSnVuZVwiLCBcIkp1bHlcIiwgXCJBdWd1c3RcIiwgXCJTZXB0ZW1iZXJcIiwgXCJPY3RvYmVyXCIsIFwiTm92ZW1iZXJcIiwgXCJEZWNlbWJlclwiIF0sXG4gICAgICAgICAgICAgICAgb3JkaW5hbFN1ZmZpeDogWyBcInN0XCIsIFwibmRcIiwgXCJyZFwiLCBcInRoXCIgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBvc3RWYWxpZGF0aW9uOiBmdW5jdGlvbihidWZmZXIsIHBvcywgY3VycmVudFJlc3VsdCwgb3B0cykge1xuICAgICAgICAgICAgICAgIG9wdHMubWluID0gYW5hbHlzZU1hc2sob3B0cy5taW4sIG9wdHMuaW5wdXRGb3JtYXQsIG9wdHMpO1xuICAgICAgICAgICAgICAgIG9wdHMubWF4ID0gYW5hbHlzZU1hc2sob3B0cy5tYXgsIG9wdHMuaW5wdXRGb3JtYXQsIG9wdHMpO1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBjdXJyZW50UmVzdWx0LCBkYXRlUGFydHMgPSBhbmFseXNlTWFzayhidWZmZXIuam9pbihcIlwiKSwgb3B0cy5pbnB1dEZvcm1hdCwgb3B0cyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiBkYXRlUGFydHMuZGF0ZS5nZXRUaW1lKCkgPT09IGRhdGVQYXJ0cy5kYXRlLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBpc1ZhbGlkRGF0ZShkYXRlUGFydHMsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCAmJiBpc0RhdGVJblJhbmdlKGRhdGVQYXJ0cywgb3B0cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwb3MgJiYgcmVzdWx0ICYmIGN1cnJlbnRSZXN1bHQucG9zICE9PSBwb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjogcGFyc2Uob3B0cy5pbnB1dEZvcm1hdCwgZGF0ZVBhcnRzLCBvcHRzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hGcm9tQnVmZmVyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGN1cnJlbnRSZXN1bHQucG9zXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbihlLCBidWZmZXIsIGNhcmV0UG9zLCBvcHRzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcztcbiAgICAgICAgICAgICAgICBpZiAoZS5jdHJsS2V5ICYmIGUua2V5Q29kZSA9PT0gSW5wdXRtYXNrLmtleUNvZGUuUklHSFQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRvZGF5ID0gbmV3IERhdGUoKSwgbWF0Y2gsIGRhdGUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAobWF0Y2ggPSBnZXRUb2tlbml6ZXIob3B0cykuZXhlYyhvcHRzLmlucHV0Rm9ybWF0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoWzBdLmNoYXJBdCgwKSA9PT0gXCJkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlICs9IHBhZCh0b2RheS5nZXREYXRlKCksIG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoWzBdLmNoYXJBdCgwKSA9PT0gXCJtXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlICs9IHBhZCh0b2RheS5nZXRNb250aCgpICsgMSwgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hbMF0gPT09IFwieXl5eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSArPSB0b2RheS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoWzBdLmNoYXJBdCgwKSA9PT0gXCJ5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlICs9IHBhZCh0b2RheS5nZXRZZWFyKCksIG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaW5wdXQuaW5wdXRtYXNrLl92YWx1ZVNldChkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgJChpbnB1dCkudHJpZ2dlcihcInNldHZhbHVlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblVuTWFzazogZnVuY3Rpb24obWFza2VkVmFsdWUsIHVubWFza2VkVmFsdWUsIG9wdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2Uob3B0cy5vdXRwdXRGb3JtYXQsIGFuYWx5c2VNYXNrKG1hc2tlZFZhbHVlLCBvcHRzLmlucHV0Rm9ybWF0LCBvcHRzKSwgb3B0cywgdHJ1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2FzaW5nOiBmdW5jdGlvbihlbGVtLCB0ZXN0LCBwb3MsIHZhbGlkUG9zaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRlc3QubmF0aXZlRGVmLmluZGV4T2YoXCJbYXBdXCIpID09IDApIHJldHVybiBlbGVtLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRlc3QubmF0aXZlRGVmLmluZGV4T2YoXCJbQVBdXCIpID09IDApIHJldHVybiBlbGVtLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5zZXJ0TW9kZTogZmFsc2UsXG4gICAgICAgICAgICBzaGlmdFBvc2l0aW9uczogZmFsc2VcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBJbnB1dG1hc2s7XG59KTsiLCIvKiFcbiogaW5wdXRtYXNrLmV4dGVuc2lvbnMuanNcbiogaHR0cHM6Ly9naXRodWIuY29tL1JvYmluSGVyYm90cy9JbnB1dG1hc2tcbiogQ29weXJpZ2h0IChjKSAyMDEwIC0gMjAxOSBSb2JpbiBIZXJib3RzXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApXG4qIFZlcnNpb246IDQuMC42XG4qL1xuXG4oZnVuY3Rpb24oZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICBkZWZpbmUoWyBcIi4vaW5wdXRtYXNrXCIgXSwgZmFjdG9yeSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vaW5wdXRtYXNrXCIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmYWN0b3J5KHdpbmRvdy5JbnB1dG1hc2spO1xuICAgIH1cbn0pKGZ1bmN0aW9uKElucHV0bWFzaykge1xuICAgIElucHV0bWFzay5leHRlbmREZWZpbml0aW9ucyh7XG4gICAgICAgIEE6IHtcbiAgICAgICAgICAgI
46184HZhbGlkYXRvcjogXCJbQS1aYS16XFx1MDQxMC1cXHUwNDRmXFx1MDQwMVxcdTA0NTFcXHhjMC1cXHhmZlxceGI1XVwiLFxuICAgICAgICAgICAgY2FzaW5nOiBcInVwcGVyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCImXCI6IHtcbiAgICAgICAgICAgIHZhbGlkYXRvcjogXCJbMC05QS1aYS16XFx1MDQxMC1cXHUwNDRmXFx1MDQwMVxcdTA0NTFcXHhjMC1cXHhmZlxceGI1XVwiLFxuICAgICAgICAgICAgY2FzaW5nOiBcInVwcGVyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCIjXCI6IHtcbiAgICAgICAgICAgIHZhbGlkYXRvcjogXCJbMC05QS1GYS1mXVwiLFxuICAgICAgICAgICAgY2FzaW5nOiBcInVwcGVyXCJcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIElucHV0bWFzay5leHRlbmRBbGlhc2VzKHtcbiAgICAgICAgY3NzdW5pdDoge1xuICAgICAgICAgICAgcmVnZXg6IFwiWystXT9bMC05XStcXFxcLj8oWzAtOV0rKT8ocHh8ZW18cmVtfGV4fCV8aW58Y218bW18cHR8cGMpXCJcbiAgICAgICAgfSxcbiAgICAgICAgdXJsOiB7XG4gICAgICAgICAgICByZWdleDogXCIoaHR0cHM/fGZ0cCkvLy4qXCIsXG4gICAgICAgICAgICBhdXRvVW5tYXNrOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBpcDoge1xuICAgICAgICAgICAgbWFzazogXCJpW2lbaV1dLmlbaVtpXV0uaVtpW2ldXS5pW2lbaV1dXCIsXG4gICAgICAgICAgICBkZWZpbml0aW9uczoge1xuICAgICAgICAgICAgICAgIGk6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbihjaHJzLCBtYXNrc2V0LCBwb3MsIHN0cmljdCwgb3B0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyAtIDEgPiAtMSAmJiBtYXNrc2V0LmJ1ZmZlcltwb3MgLSAxXSAhPT0gXCIuXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHJzID0gbWFza3NldC5idWZmZXJbcG9zIC0gMV0gKyBjaHJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgLSAyID4gLTEgJiYgbWFza3NldC5idWZmZXJbcG9zIC0gMl0gIT09IFwiLlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocnMgPSBtYXNrc2V0LmJ1ZmZlcltwb3MgLSAyXSArIGNocnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGNocnMgPSBcIjBcIiArIGNocnM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgY2hycyA9IFwiMDBcIiArIGNocnM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChcIjI1WzAtNV18MlswLTRdWzAtOV18WzAxXVswLTldWzAtOV1cIikudGVzdChjaHJzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblVuTWFzazogZnVuY3Rpb24obWFza2VkVmFsdWUsIHVubWFza2VkVmFsdWUsIG9wdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFza2VkVmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5wdXRtb2RlOiBcIm51bWVyaWNcIlxuICAgICAgICB9LFxuICAgICAgICBlbWFpbDoge1xuICAgICAgICAgICAgbWFzazogXCIqezEsNjR9Wy4qezEsNjR9XVsuKnsxLDY0fV1bLip7MSw2M31dQC17MSw2M30uLXsxLDYzfVsuLXsxLDYzfV1bLi17MSw2M31dXCIsXG4gICAgICAgICAgICBncmVlZHk6IGZhbHNlLFxuICAgICAgICAgICAgY2FzaW5nOiBcImxvd2VyXCIsXG4gICAgICAgICAgICBvbkJlZm9yZVBhc3RlOiBmdW5jdGlvbihwYXN0ZWRWYWx1ZSwgb3B0cykge1xuICAgICAgICAgICAgICAgIHBhc3RlZFZhbHVlID0gcGFzdGVkVmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFzdGVkVmFsdWUucmVwbGFjZShcIm1haWx0bzpcIiwgXCJcIik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVmaW5pdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBcIipcIjoge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3I6IFwiWzAtOVxcdWZmMTEtXFx1ZmYxOUEtWmEtelxcdTA0MTAtXFx1MDQ0ZlxcdTA0MDFcXHUwNDUxXFx4YzAtXFx4ZmZcXHhiNSEjJCUmJyorLz0/Xl9ge3x9fi1dXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiLVwiOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcjogXCJbMC05QS1aYS16LV1cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblVuTWFzazogZnVuY3Rpb24obWFza2VkVmFsdWUsIHVubWFza2VkVmFsdWUsIG9wdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFza2VkVmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5wdXRtb2RlOiBcImVtYWlsXCJcbiAgICAgICAgfSxcbiAgICAgICAgbWFjOiB7XG4gICAgICAgICAgICBtYXNrOiBcIiMjOiMjOiMjOiMjOiMjOiMjXCJcbiAgICAgICAgfSxcbiAgICAgICAgdmluOiB7XG4gICAgICAgICAgICBtYXNrOiBcIlZ7MTN9OXs0fVwiLFxuICAgICAgICAgICAgZGVmaW5pdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBWOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcjogXCJbQS1ISi1OUFItWmEtaGotbnByLXpcXFxcZF1cIixcbiAgICAgICAgICAgICAgICAgICAgY2FzaW5nOiBcInVwcGVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xlYXJJbmNvbXBsZXRlOiB0cnVlLFxuICAgICAgICAgICAgYXV0b1VubWFzazogdHJ1ZVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIElucHV0bWFzaztcbn0pOyIsIi8qIVxuKiBpbnB1dG1hc2suanNcbiogaHR0cHM6Ly9naXRodWIuY29tL1JvYmluSGVyYm90cy9JbnB1dG1hc2tcbiogQ29weXJpZ2h0IChjKSAyMDEwIC0gMjAxOSBSb2JpbiBIZXJib3RzXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApXG4qIFZlcnNpb246IDQuMC42XG4qL1xuXG4oZnVuY3Rpb24oZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICBkZWZpbmUoWyBcIi4vZGVwZW5kZW5jeUxpYnMvaW5wdXRtYXNrLmRlcGVuZGVuY3lMaWJcIiwgXCIuL2dsb2JhbC93aW5kb3dcIiBdLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9kZXBlbmRlbmN5TGlicy9pbnB1dG1hc2suZGVwZW5kZW5jeUxpYlwiKSwgcmVxdWlyZShcIi4vZ2xvYmFsL3dpbmRvd1wiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LklucHV0bWFzayA9IGZhY3Rvcnkod2luZG93LmRlcG
46184VuZGVuY3lMaWIgfHwgalF1ZXJ5LCB3aW5kb3cpO1xuICAgIH1cbn0pKGZ1bmN0aW9uKCQsIHdpbmRvdywgdW5kZWZpbmVkKSB7XG4gICAgdmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50LCB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQsIGllID0gdWEuaW5kZXhPZihcIk1TSUUgXCIpID4gMCB8fCB1YS5pbmRleE9mKFwiVHJpZGVudC9cIikgPiAwLCBtb2JpbGUgPSBpc0lucHV0RXZlbnRTdXBwb3J0ZWQoXCJ0b3VjaHN0YXJ0XCIpLCBpZW1vYmlsZSA9IC9pZW1vYmlsZS9pLnRlc3QodWEpLCBpcGhvbmUgPSAvaXBob25lL2kudGVzdCh1YSkgJiYgIWllbW9iaWxlO1xuICAgIGZ1bmN0aW9uIElucHV0bWFzayhhbGlhcywgb3B0aW9ucywgaW50ZXJuYWwpIHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIElucHV0bWFzaykpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRtYXNrKGFsaWFzLCBvcHRpb25zLCBpbnRlcm5hbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5ldmVudHMgPSB7fTtcbiAgICAgICAgdGhpcy5tYXNrc2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnJlZnJlc2hWYWx1ZSA9IGZhbHNlO1xuICAgICAgICBpZiAoaW50ZXJuYWwgIT09IHRydWUpIHtcbiAgICAgICAgICAgIGlmICgkLmlzUGxhaW5PYmplY3QoYWxpYXMpKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IGFsaWFzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgICAgICBpZiAoYWxpYXMpIG9wdGlvbnMuYWxpYXMgPSBhbGlhcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3B0cyA9ICQuZXh0ZW5kKHRydWUsIHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMubm9NYXNrc0NhY2hlID0gb3B0aW9ucyAmJiBvcHRpb25zLmRlZmluaXRpb25zICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnVzZXJPcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMuaXNSVEwgPSB0aGlzLm9wdHMubnVtZXJpY0lucHV0O1xuICAgICAgICAgICAgcmVzb2x2ZUFsaWFzKHRoaXMub3B0cy5hbGlhcywgb3B0aW9ucywgdGhpcy5vcHRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBJbnB1dG1hc2sucHJvdG90eXBlID0ge1xuICAgICAgICBkYXRhQXR0cmlidXRlOiBcImRhdGEtaW5wdXRtYXNrXCIsXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJfXCIsXG4gICAgICAgICAgICBvcHRpb25hbG1hcmtlcjogWyBcIltcIiwgXCJdXCIgXSxcbiAgICAgICAgICAgIHF1YW50aWZpZXJtYXJrZXI6IFsgXCJ7XCIsIFwifVwiIF0sXG4gICAgICAgICAgICBncm91cG1hcmtlcjogWyBcIihcIiwgXCIpXCIgXSxcbiAgICAgICAgICAgIGFsdGVybmF0b3JtYXJrZXI6IFwifFwiLFxuICAgICAgICAgICAgZXNjYXBlQ2hhcjogXCJcXFxcXCIsXG4gICAgICAgICAgICBtYXNrOiBudWxsLFxuICAgICAgICAgICAgcmVnZXg6IG51bGwsXG4gICAgICAgICAgICBvbmNvbXBsZXRlOiAkLm5vb3AsXG4gICAgICAgICAgICBvbmluY29tcGxldGU6ICQubm9vcCxcbiAgICAgICAgICAgIG9uY2xlYXJlZDogJC5ub29wLFxuICAgICAgICAgICAgcmVwZWF0OiAwLFxuICAgICAgICAgICAgZ3JlZWR5OiBmYWxzZSxcbiAgICAgICAgICAgIGF1dG9Vbm1hc2s6IGZhbHNlLFxuICAgICAgICAgICAgcmVtb3ZlTWFza09uU3VibWl0OiBmYWxzZSxcbiAgICAgICAgICAgIGNsZWFyTWFza09uTG9zdEZvY3VzOiB0cnVlLFxuICAgICAgICAgICAgaW5zZXJ0TW9kZTogdHJ1ZSxcbiAgICAgICAgICAgIGNsZWFySW5jb21wbGV0ZTogZmFsc2UsXG4gICAgICAgICAgICBhbGlhczogbnVsbCxcbiAgICAgICAgICAgIG9uS2V5RG93bjogJC5ub29wLFxuICAgICAgICAgICAgb25CZWZvcmVNYXNrOiBudWxsLFxuICAgICAgICAgICAgb25CZWZvcmVQYXN0ZTogZnVuY3Rpb24ocGFzdGVkVmFsdWUsIG9wdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJC5pc0Z1bmN0aW9uKG9wdHMub25CZWZvcmVNYXNrKSA/IG9wdHMub25CZWZvcmVNYXNrLmNhbGwodGhpcywgcGFzdGVkVmFsdWUsIG9wdHMpIDogcGFzdGVkVmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25CZWZvcmVXcml0ZTogbnVsbCxcbiAgICAgICAgICAgIG9uVW5NYXNrOiBudWxsLFxuICAgICAgICAgICAgc2hvd01hc2tPbkZvY3VzOiB0cnVlLFxuICAgICAgICAgICAgc2hvd01hc2tPbkhvdmVyOiB0cnVlLFxuICAgICAgICAgICAgb25LZXlWYWxpZGF0aW9uOiAkLm5vb3AsXG4gICAgICAgICAgICBza2lwT3B0aW9uYWxQYXJ0Q2hhcmFjdGVyOiBcIiBcIixcbiAgICAgICAgICAgIG51bWVyaWNJbnB1dDogZmFsc2UsXG4gICAgICAgICAgICByaWdodEFsaWduOiBmYWxzZSxcbiAgICAgICAgICAgIHVuZG9PbkVzY2FwZTogdHJ1ZSxcbiAgICAgICAgICAgIHJhZGl4UG9pbnQ6IFwiXCIsXG4gICAgICAgICAgICBfcmFkaXhEYW5jZTogZmFsc2UsXG4gICAgICAgICAgICBncm91cFNlcGFyYXRvcjogXCJcIixcbiAgICAgICAgICAgIGtlZXBTdGF0aWM6IG51bGwsXG4gICAgICAgICAgICBwb3NpdGlvbkNhcmV0T25UYWI6IHRydWUsXG4gICAgICAgICAgICB0YWJUaHJvdWdoOiBmYWxzZSxcbiAgICAgICAgICAgIHN1cHBvcnRzSW5wdXRUeXBlOiBbIFwidGV4dFwiLCBcInRlbFwiLCBcInVybFwiLCBcInBhc3N3b3JkXCIsIFwic2VhcmNoXCIgXSxcbiAgICAgICAgICAgIGlnbm9yYWJsZXM6IFsgOCwgOSwgMTMsIDE5LCAyNywgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0NSwgNDYsIDkzLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAwLCAyMjkgXSxcbiAgICAgICAgICAgIGlzQ29tcGxldGU6IG51bGwsXG4gICAgICAgICAgICBwcmVWYWxpZGF0aW9uOiBudWxsLFxuICAgICAgICAgICAgcG9zdFZhbGlkYXRpb246IG51bGwsXG4gICAgICAgICAgICBzdGF0aWNEZWZpbml0aW9uU3ltYm9sOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBqaXRNYXNraW5nOiBmYWxzZSxcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgaW5wdXRFdmVudE9ubHk6IGZhbHNlLFxuICAgICAgICAgICAgbm9WYWx1ZVBhdGNoaW5nOiBmYWxzZSxcbiAgICAgICAgICAgI
46184HBvc2l0aW9uQ2FyZXRPbkNsaWNrOiBcImx2cFwiLFxuICAgICAgICAgICAgY2FzaW5nOiBudWxsLFxuICAgICAgICAgICAgaW5wdXRtb2RlOiBcInZlcmJhdGltXCIsXG4gICAgICAgICAgICBjb2xvck1hc2s6IGZhbHNlLFxuICAgICAgICAgICAgZGlzYWJsZVByZWRpY3RpdmVUZXh0OiBmYWxzZSxcbiAgICAgICAgICAgIGltcG9ydERhdGFBdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgICAgc2hpZnRQb3NpdGlvbnM6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgZGVmaW5pdGlvbnM6IHtcbiAgICAgICAgICAgIDk6IHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3I6IFwiWzAtOVxcdWZmMTEtXFx1ZmYxOV1cIixcbiAgICAgICAgICAgICAgICBkZWZpbml0aW9uU3ltYm9sOiBcIipcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3I6IFwiW0EtWmEtelxcdTA0MTAtXFx1MDQ0ZlxcdTA0MDFcXHUwNDUxXFx4YzAtXFx4ZmZcXHhiNV1cIixcbiAgICAgICAgICAgICAgICBkZWZpbml0aW9uU3ltYm9sOiBcIipcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiKlwiOiB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yOiBcIlswLTlcXHVmZjExLVxcdWZmMTlBLVphLXpcXHUwNDEwLVxcdTA0NGZcXHUwNDAxXFx1MDQ1MVxceGMwLVxceGZmXFx4YjVdXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYWxpYXNlczoge30sXG4gICAgICAgIG1hc2tzQ2FjaGU6IHt9LFxuICAgICAgICBtYXNrOiBmdW5jdGlvbihlbGVtcykge1xuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgZnVuY3Rpb24gaW1wb3J0QXR0cmlidXRlT3B0aW9ucyhucHQsIG9wdHMsIHVzZXJPcHRpb25zLCBkYXRhQXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMuaW1wb3J0RGF0YUF0dHJpYnV0ZXMgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJPcHRpb25zID0gbnB0LmdldEF0dHJpYnV0ZShkYXRhQXR0cmlidXRlKSwgb3B0aW9uLCBkYXRhb3B0aW9ucywgb3B0aW9uRGF0YSwgcDtcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaW1wb3J0T3B0aW9uKG9wdGlvbiwgb3B0aW9uRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uRGF0YSA9IG9wdGlvbkRhdGEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbkRhdGEgOiBucHQuZ2V0QXR0cmlidXRlKGRhdGFBdHRyaWJ1dGUgKyBcIi1cIiArIG9wdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uRGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9uRGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLmluZGV4T2YoXCJvblwiKSA9PT0gMCkgb3B0aW9uRGF0YSA9IHdpbmRvd1tvcHRpb25EYXRhXTsgZWxzZSBpZiAob3B0aW9uRGF0YSA9PT0gXCJmYWxzZVwiKSBvcHRpb25EYXRhID0gZmFsc2U7IGVsc2UgaWYgKG9wdGlvbkRhdGEgPT09IFwidHJ1ZVwiKSBvcHRpb25EYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck9wdGlvbnNbb3B0aW9uXSA9IG9wdGlvbkRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJPcHRpb25zICYmIGF0dHJPcHRpb25zICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyT3B0aW9ucyA9IGF0dHJPcHRpb25zLnJlcGxhY2UoLycvZywgJ1wiJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhb3B0aW9ucyA9IEpTT04ucGFyc2UoXCJ7XCIgKyBhdHRyT3B0aW9ucyArIFwifVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YW9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHAgaW4gZGF0YW9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocC50b0xvd2VyQ2FzZSgpID09PSBcImFsaWFzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uRGF0YSA9IGRhdGFvcHRpb25zW3BdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0T3B0aW9uKFwiYWxpYXNcIiwgb3B0aW9uRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1c2VyT3B0aW9ucy5hbGlhcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFsaWFzKHVzZXJPcHRpb25zLmFsaWFzLCB1c2VyT3B0aW9ucywgb3B0cyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChvcHRpb24gaW4gb3B0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uRGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHAgaW4gZGF0YW9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAudG9Mb3dlckNhc2UoKSA9PT0gb3B0aW9uLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkRhdGEgPSBkYXRhb3B0aW9uc1twXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0T3B0aW9uKG9wdGlvbiwgb3B0aW9uRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgI
46184H1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgb3B0cywgdXNlck9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChucHQuZGlyID09PSBcInJ0bFwiIHx8IG9wdHMucmlnaHRBbGlnbikge1xuICAgICAgICAgICAgICAgICAgICBucHQuc3R5bGUudGV4dEFsaWduID0gXCJyaWdodFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobnB0LmRpciA9PT0gXCJydGxcIiB8fCBvcHRzLm51bWVyaWNJbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBucHQuZGlyID0gXCJsdHJcIjtcbiAgICAgICAgICAgICAgICAgICAgbnB0LnJlbW92ZUF0dHJpYnV0ZShcImRpclwiKTtcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5pc1JUTCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh1c2VyT3B0aW9ucykubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGVsZW1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbXMpIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZWxlbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbXMgPSBlbGVtcy5ub2RlTmFtZSA/IFsgZWxlbXMgXSA6IGVsZW1zO1xuICAgICAgICAgICAgJC5lYWNoKGVsZW1zLCBmdW5jdGlvbihuZHgsIGVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNjb3BlZE9wdHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgdGhhdC5vcHRzKTtcbiAgICAgICAgICAgICAgICBpZiAoaW1wb3J0QXR0cmlidXRlT3B0aW9ucyhlbCwgc2NvcGVkT3B0cywgJC5leHRlbmQodHJ1ZSwge30sIHRoYXQudXNlck9wdGlvbnMpLCB0aGF0LmRhdGFBdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXNrc2V0ID0gZ2VuZXJhdGVNYXNrU2V0KHNjb3BlZE9wdHMsIHRoYXQubm9NYXNrc0NhY2hlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hc2tzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsLmlucHV0bWFzayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuaW5wdXRtYXNrLm9wdHMuYXV0b1VubWFzayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuaW5wdXRtYXNrLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuaW5wdXRtYXNrID0gbmV3IElucHV0bWFzayh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5pbnB1dG1hc2sub3B0cyA9IHNjb3BlZE9wdHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5pbnB1dG1hc2subm9NYXNrc0NhY2hlID0gdGhhdC5ub01hc2tzQ2FjaGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5pbnB1dG1hc2sudXNlck9wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgdGhhdC51c2VyT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5pbnB1dG1hc2suaXNSVEwgPSBzY29wZWRPcHRzLmlzUlRMIHx8IHNjb3BlZE9wdHMubnVtZXJpY0lucHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwuaW5wdXRtYXNrLmVsID0gZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5pbnB1dG1hc2subWFza3NldCA9IG1hc2tzZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAkLmRhdGEoZWwsIFwiX2lucHV0bWFza19vcHRzXCIsIHNjb3BlZE9wdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFza1Njb3BlLmNhbGwoZWwuaW5wdXRtYXNrLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcIm1hc2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlbGVtcyAmJiBlbGVtc1swXSA/IGVsZW1zWzBdLmlucHV0bWFzayB8fCB0aGlzIDogdGhpcztcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9uOiBmdW5jdGlvbihvcHRpb25zLCBub3JlbWFzaykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0c1tvcHRpb25zXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAkLmV4dGVuZCh0aGlzLnVzZXJPcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5lbCAmJiBub3JlbWFzayAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hc2sodGhpcy5lbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB1bm1hc2tlZHZhbHVlOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5tYXNrc2V0ID0gdGhpcy5tYXNrc2V0IHx8IGdlbmVyYXRlTWFza1NldCh0aGlzLm9wdHMsIHRoaXMubm9NYXNrc0NhY2hlKTtcbiAgICAgICAgICAgIHJldHVybiBtYXNrU2NvcGUuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcInVubWFza2VkdmFsdWVcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hc2tTY29wZS5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IFwicmVtb3ZlXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBnZXRlbXB0eW1hc2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5tYXNrc2V0ID0gdGhpcy5tYXNrc2V0IHx8IGdlbmVyYXRlTWFza1NldCh0aGlzLm9wdHMsIHRoaXMubm9NYXNrc0NhY2hlKTtcbiAgICAgICAgICAgI
46184HJldHVybiBtYXNrU2NvcGUuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcImdldGVtcHR5bWFza1wiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgaGFzTWFza2VkVmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuICF0aGlzLm9wdHMuYXV0b1VubWFzaztcbiAgICAgICAgfSxcbiAgICAgICAgaXNDb21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLm1hc2tzZXQgPSB0aGlzLm1hc2tzZXQgfHwgZ2VuZXJhdGVNYXNrU2V0KHRoaXMub3B0cywgdGhpcy5ub01hc2tzQ2FjaGUpO1xuICAgICAgICAgICAgcmV0dXJuIG1hc2tTY29wZS5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IFwiaXNDb21wbGV0ZVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0bWV0YWRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5tYXNrc2V0ID0gdGhpcy5tYXNrc2V0IHx8IGdlbmVyYXRlTWFza1NldCh0aGlzLm9wdHMsIHRoaXMubm9NYXNrc0NhY2hlKTtcbiAgICAgICAgICAgIHJldHVybiBtYXNrU2NvcGUuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcImdldG1ldGFkYXRhXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBpc1ZhbGlkOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5tYXNrc2V0ID0gdGhpcy5tYXNrc2V0IHx8IGdlbmVyYXRlTWFza1NldCh0aGlzLm9wdHMsIHRoaXMubm9NYXNrc0NhY2hlKTtcbiAgICAgICAgICAgIHJldHVybiBtYXNrU2NvcGUuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcImlzVmFsaWRcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKHZhbHVlLCBtZXRhZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5tYXNrc2V0ID0gdGhpcy5tYXNrc2V0IHx8IGdlbmVyYXRlTWFza1NldCh0aGlzLm9wdHMsIHRoaXMubm9NYXNrc0NhY2hlKTtcbiAgICAgICAgICAgIHJldHVybiBtYXNrU2NvcGUuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcImZvcm1hdFwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVsKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLmVsKS50cmlnZ2VyKFwic2V0dmFsdWVcIiwgWyB2YWx1ZSBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYW5hbHlzZU1hc2s6IGZ1bmN0aW9uKG1hc2ssIHJlZ2V4TWFzaywgb3B0cykge1xuICAgICAgICAgICAgdmFyIHRva2VuaXplciA9IC8oPzpbPyorXXxcXHtbMC05XFwrXFwqXSsoPzosWzAtOVxcK1xcKl0qKT8oPzpcXHxbMC05XFwrXFwqXSopP1xcfSl8W14uPyorXiR7W10oKXxcXFxcXSt8Li9nLCByZWdleFRva2VuaXplciA9IC9cXFtcXF4/XT8oPzpbXlxcXFxcXF1dK3xcXFxcW1xcU1xcc10/KSpdP3xcXFxcKD86MCg/OlswLTNdWzAtN117MCwyfXxbNC03XVswLTddPyk/fFsxLTldWzAtOV0qfHhbMC05QS1GYS1mXXsyfXx1WzAtOUEtRmEtZl17NH18Y1tBLVphLXpdfFtcXFNcXHNdPyl8XFwoKD86XFw/Wzo9IV0/KT98KD86Wz8qK118XFx7WzAtOV0rKD86LFswLTldKik/XFx9KVxcPz98W14uPyorXiR7WygpfFxcXFxdK3wuL2csIGVzY2FwZWQgPSBmYWxzZSwgY3VycmVudFRva2VuID0gbmV3IE1hc2tUb2tlbigpLCBtYXRjaCwgbSwgb3BlbmVuaW5ncyA9IFtdLCBtYXNrVG9rZW5zID0gW10sIG9wZW5pbmdUb2tlbiwgY3VycmVudE9wZW5pbmdUb2tlbiwgYWx0ZXJuYXRvciwgbGFzdE1hdGNoLCBncm91cFRva2VuO1xuICAgICAgICAgICAgZnVuY3Rpb24gTWFza1Rva2VuKGlzR3JvdXAsIGlzT3B0aW9uYWwsIGlzUXVhbnRpZmllciwgaXNBbHRlcm5hdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuR3JvdXAgPSBpc0dyb3VwIHx8IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYWx0ZXJuYXRvckdyb3VwID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0dyb3VwID0gaXNHcm91cCB8fCBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzT3B0aW9uYWwgPSBpc09wdGlvbmFsIHx8IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNRdWFudGlmaWVyID0gaXNRdWFudGlmaWVyIHx8IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNBbHRlcm5hdG9yID0gaXNBbHRlcm5hdG9yIHx8IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMucXVhbnRpZmllciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgICAgICAgICBtYXg6IDFcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gaW5zZXJ0VGVzdERlZmluaXRpb24obXRva2VuLCBlbGVtZW50LCBwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gIT09IHVuZGVmaW5lZCA/IHBvc2l0aW9uIDogbXRva2VuLm1hdGNoZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHZhciBwcmV2TWF0Y2ggPSBtdG9rZW4ubWF0Y2hlc1twb3NpdGlvbiAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChyZWdleE1hc2spIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaW5kZXhPZihcIltcIikgPT09IDAgfHwgZXNjYXBlZCAmJiAvXFxcXGR8XFxcXHN8XFxcXHddL2kudGVzdChlbGVtZW50KSB8fCBlbGVtZW50ID09PSBcIi5cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXRva2VuLm1hdGNoZXMuc3BsaWNlKHBvc2l0aW9uKyssIDAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbjogbmV3IFJlZ0V4cChlbGVtZW50LCBvcHRzLmNhc2luZyA/IFwiaVwiIDogXCJcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxpdHk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jsb2NrTWFya2VyOiBwcmV2TWF0Y2ggPT09IHVuZGVmaW5lZCA/IFwibWFzdGVyXCIgOiBwcmV2TWF0Y2guZGVmICE9PSBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2luZzogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWY6IGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVEZWY6IGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgI
46184H0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVzY2FwZWQpIGVsZW1lbnQgPSBlbGVtZW50W2VsZW1lbnQubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goZWxlbWVudC5zcGxpdChcIlwiKSwgZnVuY3Rpb24obmR4LCBsbW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldk1hdGNoID0gbXRva2VuLm1hdGNoZXNbcG9zaXRpb24gLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdG9rZW4ubWF0Y2hlcy5zcGxpY2UocG9zaXRpb24rKywgMCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxpdHk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCbG9ja01hcmtlcjogcHJldk1hdGNoID09PSB1bmRlZmluZWQgPyBcIm1hc3RlclwiIDogcHJldk1hdGNoLmRlZiAhPT0gbG1udCAmJiBwcmV2TWF0Y2guZm4gIT09IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2luZzogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmOiBvcHRzLnN0YXRpY0RlZmluaXRpb25TeW1ib2wgfHwgbG1udCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IG9wdHMuc3RhdGljRGVmaW5pdGlvblN5bWJvbCAhPT0gdW5kZWZpbmVkID8gbG1udCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlRGVmOiAoZXNjYXBlZCA/IFwiJ1wiIDogXCJcIikgKyBsbW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hc2tkZWYgPSAob3B0cy5kZWZpbml0aW9ucyA/IG9wdHMuZGVmaW5pdGlvbnNbZWxlbWVudF0gOiB1bmRlZmluZWQpIHx8IElucHV0bWFzay5wcm90b3R5cGUuZGVmaW5pdGlvbnNbZWxlbWVudF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXNrZGVmICYmICFlc2NhcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdG9rZW4ubWF0Y2hlcy5zcGxpY2UocG9zaXRpb24rKywgMCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuOiBtYXNrZGVmLnZhbGlkYXRvciA/IHR5cGVvZiBtYXNrZGVmLnZhbGlkYXRvciA9PSBcInN0cmluZ1wiID8gbmV3IFJlZ0V4cChtYXNrZGVmLnZhbGlkYXRvciwgb3B0cy5jYXNpbmcgPyBcImlcIiA6IFwiXCIpIDogbmV3IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRlc3QgPSBtYXNrZGVmLnZhbGlkYXRvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCkgOiBuZXcgUmVnRXhwKFwiLlwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbGl0eTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QmxvY2tNYXJrZXI6IHByZXZNYXRjaCA9PT0gdW5kZWZpbmVkID8gXCJtYXN0ZXJcIiA6IHByZXZNYXRjaC5kZWYgIT09IChtYXNrZGVmLmRlZmluaXRpb25TeW1ib2wgfHwgZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzaW5nOiBtYXNrZGVmLmNhc2luZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWY6IG1hc2tkZWYuZGVmaW5pdGlvblN5bWJvbCB8fCBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBtYXNrZGVmLnBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZURlZjogZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdG9rZW4ubWF0Y2hlcy5zcGxpY2UocG9zaXRpb24rKywgMCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsaXR5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCbG9ja01hcmtlcjogcHJldk1hdGNoID09PSB1bmRlZmluZWQgPyBcIm1hc3RlclwiIDogcHJldk1hdGNoLmRlZiAhPT0gZWxlbWVudCAmJiBwcmV2TWF0Y2guZm4gIT09IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzaW5nOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZjogb3B0cy5zdGF0aWNEZWZpbml0aW9uU3ltYm9sIHx8IGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IG9wdHMuc3RhdGljRGVmaW5pdGlvblN5bWJvbCAhPT0gdW5kZWZpbmVkID8gZWxlbWVudCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVEZWY6IChlc2NhcGVkID8gXCInXCIgOiBcIlwiKSArIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gdmVyaWZ5R3JvdXBNYXJrZXIobWFza1Rva2VuKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hc2tUb2tlbiAmJiBtYXNrVG9rZW4ubWF0Y2hlcykge1xuICAgICAgICAgICAgICAgICAgICAkLmVhY2gobWFza1Rva2VuLm1hdGNoZXMsIGZ1bmN0aW9uKG5keCwgdG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0VG9rZW4gPSBtYXNrVG9rZW4ubWF0Y2hlc1tuZHggKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobmV4dFRva2VuID09PSB1bmRlZmluZWQgfHwgKG5leHRUb2tlbi5tYXRjaGVzID09PSB1bmRlZmluZWQgfHwgbmV4dFRva2VuLmlzUXVhbnRpZmllciA9PT0gZmFsc2UpKSAmJiB0b2tlbiAmJiB0b2tlbi5pc0dyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uaXNHcm91cCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnZXhNYXNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydFRlc3RE
46184ZWZpbml0aW9uKHRva2VuLCBvcHRzLmdyb3VwbWFya2VyWzBdLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLm9wZW5Hcm91cCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VGVzdERlZmluaXRpb24odG9rZW4sIG9wdHMuZ3JvdXBtYXJrZXJbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZ5R3JvdXBNYXJrZXIodG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBkZWZhdWx0Q2FzZSgpIHtcbiAgICAgICAgICAgICAgICBpZiAob3BlbmVuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRPcGVuaW5nVG9rZW4gPSBvcGVuZW5pbmdzW29wZW5lbmluZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGluc2VydFRlc3REZWZpbml0aW9uKGN1cnJlbnRPcGVuaW5nVG9rZW4sIG0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE9wZW5pbmdUb2tlbi5pc0FsdGVybmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0b3IgPSBvcGVuZW5pbmdzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbW5keCA9IDA7IG1uZHggPCBhbHRlcm5hdG9yLm1hdGNoZXMubGVuZ3RoOyBtbmR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWx0ZXJuYXRvci5tYXRjaGVzW21uZHhdLmlzR3JvdXApIGFsdGVybmF0b3IubWF0Y2hlc1ttbmR4XS5pc0dyb3VwID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BlbmVuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9wZW5pbmdUb2tlbiA9IG9wZW5lbmluZ3Nbb3BlbmVuaW5ncy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T3BlbmluZ1Rva2VuLm1hdGNoZXMucHVzaChhbHRlcm5hdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuLm1hdGNoZXMucHVzaChhbHRlcm5hdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGluc2VydFRlc3REZWZpbml0aW9uKGN1cnJlbnRUb2tlbiwgbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gcmV2ZXJzZVRva2VucyhtYXNrVG9rZW4pIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZXZlcnNlU3RhdGljKHN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdCA9PT0gb3B0cy5vcHRpb25hbG1hcmtlclswXSkgc3QgPSBvcHRzLm9wdGlvbmFsbWFya2VyWzFdOyBlbHNlIGlmIChzdCA9PT0gb3B0cy5vcHRpb25hbG1hcmtlclsxXSkgc3QgPSBvcHRzLm9wdGlvbmFsbWFya2VyWzBdOyBlbHNlIGlmIChzdCA9PT0gb3B0cy5ncm91cG1hcmtlclswXSkgc3QgPSBvcHRzLmdyb3VwbWFya2VyWzFdOyBlbHNlIGlmIChzdCA9PT0gb3B0cy5ncm91cG1hcmtlclsxXSkgc3QgPSBvcHRzLmdyb3VwbWFya2VyWzBdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hc2tUb2tlbi5tYXRjaGVzID0gbWFza1Rva2VuLm1hdGNoZXMucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG1hdGNoIGluIG1hc2tUb2tlbi5tYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXNrVG9rZW4ubWF0Y2hlcy5oYXNPd25Qcm9wZXJ0eShtYXRjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnRNYXRjaCA9IHBhcnNlSW50KG1hdGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXNrVG9rZW4ubWF0Y2hlc1ttYXRjaF0uaXNRdWFudGlmaWVyICYmIG1hc2tUb2tlbi5tYXRjaGVzW2ludE1hdGNoICsgMV0gJiYgbWFza1Rva2VuLm1hdGNoZXNbaW50TWF0Y2ggKyAxXS5pc0dyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHF0ID0gbWFza1Rva2VuLm1hdGNoZXNbbWF0Y2hdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tUb2tlbi5tYXRjaGVzLnNwbGljZShtYXRjaCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1Rva2VuLm1hdGNoZXMuc3BsaWNlKGludE1hdGNoICsgMSwgMCwgcXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hc2tUb2tlbi5tYXRjaGVzW21hdGNoXS5tYXRjaGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrVG9rZW4ubWF0Y2hlc1ttYXRjaF0gPSByZXZlcnNlVG9rZW5zKG1hc2tUb2tlbi5tYXRjaGVzW21hdGNoXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tUb2tlbi5tYXRjaGVzW21hdGNoXSA9IHJldmVyc2VTdGF0aWMobWFza1Rva2VuLm1hdGNoZXNbbWF0Y2hdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbWFza1Rva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ3JvdXBpZnkobWF0Y2hlcykge1xuICAgICAgICAgICAgICAgIHZhciBncm91cFRva2VuID0gbmV3IE1hc2tUb2tlbih0cnVlKTtcbiAgICAgICAgICAgICAgICBncm91cFRva2VuLm9wZW5Hcm91cCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGdyb3VwVG9rZW4ubWF0Y2hlcyA9IG1hdGNoZXM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwVG9rZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVnZXhNYXNrKSB7XG4gICAgICAgICAgICAgICAgb3B0cy5vcHRpb25hbG1hcmtlclswXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBvcHRzLm9wdGlvbmFsbWFya2VyWzFdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKG1hdGNoID0gcmVnZXhNYXNrID8gcmVnZXhUb2tlbml6ZXIuZXhlYyhtYXNrKSA6IHRva2VuaXplci5leGVjKG1hc2spKSB7XG4gICAgICAgICAgICAgICAgbSA9IG1hdGNoWzBdO1xuICAgICAgICAgICAgICAgIGlmIChyZWdleE1hc2spIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtLmNoYXJBdCgwKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI/XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBtID0gXCJ7MCwxfVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiK1wiOlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCIqXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBtID0gXCJ7XCIgKyBtICsgXCJ9XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgI
46184H1cbiAgICAgICAgICAgICAgICBpZiAoZXNjYXBlZCkge1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3dpdGNoIChtLmNoYXJBdCgwKSkge1xuICAgICAgICAgICAgICAgICAgY2FzZSBcIig/PVwiOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgY2FzZSBcIig/IVwiOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgY2FzZSBcIig/PD1cIjpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgXCIoPzwhXCI6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIG9wdHMuZXNjYXBlQ2hhcjpcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWdleE1hc2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2Ugb3B0cy5vcHRpb25hbG1hcmtlclsxXTpcbiAgICAgICAgICAgICAgICAgIGNhc2Ugb3B0cy5ncm91cG1hcmtlclsxXTpcbiAgICAgICAgICAgICAgICAgICAgb3BlbmluZ1Rva2VuID0gb3BlbmVuaW5ncy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgb3BlbmluZ1Rva2VuLm9wZW5Hcm91cCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3BlbmluZ1Rva2VuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGVuZW5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T3BlbmluZ1Rva2VuID0gb3BlbmVuaW5nc1tvcGVuZW5pbmdzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRPcGVuaW5nVG9rZW4ubWF0Y2hlcy5wdXNoKG9wZW5pbmdUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRPcGVuaW5nVG9rZW4uaXNBbHRlcm5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0b3IgPSBvcGVuZW5pbmdzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtbmR4ID0gMDsgbW5keCA8IGFsdGVybmF0b3IubWF0Y2hlcy5sZW5ndGg7IG1uZHgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRvci5tYXRjaGVzW21uZHhdLmlzR3JvdXAgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0b3IubWF0Y2hlc1ttbmR4XS5hbHRlcm5hdG9yR3JvdXAgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BlbmVuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T3BlbmluZ1Rva2VuID0gb3BlbmVuaW5nc1tvcGVuZW5pbmdzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9wZW5pbmdUb2tlbi5tYXRjaGVzLnB1c2goYWx0ZXJuYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4ubWF0Y2hlcy5wdXNoKGFsdGVybmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4ubWF0Y2hlcy5wdXNoKG9wZW5pbmdUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBkZWZhdWx0Q2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgY2FzZSBvcHRzLm9wdGlvbmFsbWFya2VyWzBdOlxuICAgICAgICAgICAgICAgICAgICBvcGVuZW5pbmdzLnB1c2gobmV3IE1hc2tUb2tlbihmYWxzZSwgdHJ1ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgY2FzZSBvcHRzLmdyb3VwbWFya2VyWzBdOlxuICAgICAgICAgICAgICAgICAgICBvcGVuZW5pbmdzLnB1c2gobmV3IE1hc2tUb2tlbih0cnVlKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIG9wdHMucXVhbnRpZmllcm1hcmtlclswXTpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHF1YW50aWZpZXIgPSBuZXcgTWFza1Rva2VuKGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIG0gPSBtLnJlcGxhY2UoL1t7fV0vZywgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtcWogPSBtLnNwbGl0KFwifFwiKSwgbXEgPSBtcWpbMF0uc3BsaXQoXCIsXCIpLCBtcTAgPSBpc05hTihtcVswXSkgPyBtcVswXSA6IHBhcnNlSW50KG1xWzBdKSwgbXExID0gbXEubGVuZ3RoID09PSAxID8gbXEwIDogaXNOYU4obXFbMV0pID8gbXFbMV0gOiBwYXJzZUludChtcVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtcTAgPT09IFwiKlwiIHx8IG1xMCA9PT0gXCIrXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1xMCA9IG1xMSA9PT0gXCIqXCIgPyAwIDogMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBxdWFudGlmaWVyLnF1YW50aWZpZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW46IG1xMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heDogbXExLFxuICAgICAgICAgICAgICAgICAgICAgICAgaml0OiBtcWpbMV1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBvcGVuZW5pbmdzLmxlbmd0aCA+IDAgPyBvcGVuZW5pbmdzW29wZW5lbmluZ3MubGVuZ3RoIC0gMV0ubWF0Y2hlcyA6IGN1cnJlbnRUb2tlbi5tYXRjaGVzO1xuICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoZXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaC5pc0FsdGVybmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChtYXRjaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gbWF0Y2gubWF0Y2hlcztcbiAgICAgICAgICAgICAgICAgICAgICAgI
46184HZhciBncm91cFRva2VuID0gbmV3IE1hc2tUb2tlbih0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0bXBNYXRjaCA9IG1hdGNoZXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goZ3JvdXBUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gZ3JvdXBUb2tlbi5tYXRjaGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSB0bXBNYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoLmlzR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gZ3JvdXBpZnkoWyBtYXRjaCBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2gobWF0Y2gpO1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2gocXVhbnRpZmllcik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIG9wdHMuYWx0ZXJuYXRvcm1hcmtlcjpcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ3JvdXBRdWFudGlmaWVyKG1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYXN0TWF0Y2ggPSBtYXRjaGVzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RNYXRjaC5pc1F1YW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TWF0Y2ggPSBncm91cGlmeShbIG1hdGNoZXMucG9wKCksIGxhc3RNYXRjaCBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXN0TWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wZW5lbmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9wZW5pbmdUb2tlbiA9IG9wZW5lbmluZ3Nbb3BlbmVuaW5ncy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJUb2tlbiA9IGN1cnJlbnRPcGVuaW5nVG9rZW4ubWF0Y2hlc1tjdXJyZW50T3BlbmluZ1Rva2VuLm1hdGNoZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE9wZW5pbmdUb2tlbi5vcGVuR3JvdXAgJiYgKHN1YlRva2VuLm1hdGNoZXMgPT09IHVuZGVmaW5lZCB8fCBzdWJUb2tlbi5pc0dyb3VwID09PSBmYWxzZSAmJiBzdWJUb2tlbi5pc0FsdGVybmF0b3IgPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNYXRjaCA9IG9wZW5lbmluZ3MucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNYXRjaCA9IGdyb3VwUXVhbnRpZmllcihjdXJyZW50T3BlbmluZ1Rva2VuLm1hdGNoZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1hdGNoID0gZ3JvdXBRdWFudGlmaWVyKGN1cnJlbnRUb2tlbi5tYXRjaGVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdE1hdGNoLmlzQWx0ZXJuYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmVuaW5ncy5wdXNoKGxhc3RNYXRjaCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdE1hdGNoLmFsdGVybmF0b3JHcm91cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0b3IgPSBvcGVuZW5pbmdzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNYXRjaC5hbHRlcm5hdG9yR3JvdXAgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRvciA9IG5ldyBNYXNrVG9rZW4oZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdG9yLm1hdGNoZXMucHVzaChsYXN0TWF0Y2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmVuaW5ncy5wdXNoKGFsdGVybmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RNYXRjaC5vcGVuR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TWF0Y2gub3Blbkdyb3VwID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFsdGVybmF0b3JHcm91cCA9IG5ldyBNYXNrVG9rZW4odHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRvckdyb3VwLmFsdGVybmF0b3JHcm91cCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmVuaW5ncy5wdXNoKGFsdGVybmF0b3JHcm91cCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKG9wZW5lbmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIG9wZW5pbmdUb2tlbiA9IG9wZW5lbmluZ3MucG9wKCk7XG4gICAgICAgICAgICAgICAgY3VycmVudFRva2VuLm1hdGNoZXMucHVzaChvcGVuaW5nVG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN1cnJlbnRUb2tlbi5tYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2ZXJpZnlHcm91cE1hcmtlcihjdXJyZW50VG9rZW4pO1xuICAgICAgICAgICAgICAgIG1hc2tUb2tlbnMucHVzaChjdXJyZW50VG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdHMubnVtZXJpY0lucHV0IHx8IG9wdHMuaXNSVEwpIHtcbiAgICAgICAgICAgICAgICByZXZlcnNlVG9rZW5zKG1hc2tUb2tlbnNbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1hc2tUb2tlbnM7XG4gICAgICAgI
46184H1cbiAgICB9O1xuICAgIElucHV0bWFzay5leHRlbmREZWZhdWx0cyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgJC5leHRlbmQodHJ1ZSwgSW5wdXRtYXNrLnByb3RvdHlwZS5kZWZhdWx0cywgb3B0aW9ucyk7XG4gICAgfTtcbiAgICBJbnB1dG1hc2suZXh0ZW5kRGVmaW5pdGlvbnMgPSBmdW5jdGlvbihkZWZpbml0aW9uKSB7XG4gICAgICAgICQuZXh0ZW5kKHRydWUsIElucHV0bWFzay5wcm90b3R5cGUuZGVmaW5pdGlvbnMsIGRlZmluaXRpb24pO1xuICAgIH07XG4gICAgSW5wdXRtYXNrLmV4dGVuZEFsaWFzZXMgPSBmdW5jdGlvbihhbGlhcykge1xuICAgICAgICAkLmV4dGVuZCh0cnVlLCBJbnB1dG1hc2sucHJvdG90eXBlLmFsaWFzZXMsIGFsaWFzKTtcbiAgICB9O1xuICAgIElucHV0bWFzay5mb3JtYXQgPSBmdW5jdGlvbih2YWx1ZSwgb3B0aW9ucywgbWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIElucHV0bWFzayhvcHRpb25zKS5mb3JtYXQodmFsdWUsIG1ldGFkYXRhKTtcbiAgICB9O1xuICAgIElucHV0bWFzay51bm1hc2sgPSBmdW5jdGlvbih2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gSW5wdXRtYXNrKG9wdGlvbnMpLnVubWFza2VkdmFsdWUodmFsdWUpO1xuICAgIH07XG4gICAgSW5wdXRtYXNrLmlzVmFsaWQgPSBmdW5jdGlvbih2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gSW5wdXRtYXNrKG9wdGlvbnMpLmlzVmFsaWQodmFsdWUpO1xuICAgIH07XG4gICAgSW5wdXRtYXNrLnJlbW92ZSA9IGZ1bmN0aW9uKGVsZW1zKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGVsZW1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbXMpIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZWxlbXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1zID0gZWxlbXMubm9kZU5hbWUgPyBbIGVsZW1zIF0gOiBlbGVtcztcbiAgICAgICAgJC5lYWNoKGVsZW1zLCBmdW5jdGlvbihuZHgsIGVsKSB7XG4gICAgICAgICAgICBpZiAoZWwuaW5wdXRtYXNrKSBlbC5pbnB1dG1hc2sucmVtb3ZlKCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgSW5wdXRtYXNrLnNldFZhbHVlID0gZnVuY3Rpb24oZWxlbXMsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGVsZW1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbXMpIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZWxlbXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1zID0gZWxlbXMubm9kZU5hbWUgPyBbIGVsZW1zIF0gOiBlbGVtcztcbiAgICAgICAgJC5lYWNoKGVsZW1zLCBmdW5jdGlvbihuZHgsIGVsKSB7XG4gICAgICAgICAgICBpZiAoZWwuaW5wdXRtYXNrKSBlbC5pbnB1dG1hc2suc2V0VmFsdWUodmFsdWUpOyBlbHNlICQoZWwpLnRyaWdnZXIoXCJzZXR2YWx1ZVwiLCBbIHZhbHVlIF0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIElucHV0bWFzay5lc2NhcGVSZWdleCA9IGZ1bmN0aW9uKHN0cikge1xuICAgICAgICB2Y
46184XIgc3BlY2lhbHMgPSBbIFwiL1wiLCBcIi5cIiwgXCIqXCIsIFwiK1wiLCBcIj9cIiwgXCJ8XCIsIFwiKFwiLCBcIilcIiwgXCJbXCIsIFwiXVwiLCBcIntcIiwgXCJ9XCIsIFwiXFxcXFwiLCBcIiRcIiwgXCJeXCIgXTtcbiAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKG5ldyBSZWdFeHAoXCIoXFxcXFwiICsgc3BlY2lhbHMuam9pbihcInxcXFxcXCIpICsgXCIpXCIsIFwiZ2ltXCIpLCBcIlxcXFwkMVwiKTtcbiAgICB9O1xuICAgIElucHV0bWFzay5rZXlDb2RlID0ge1xuICAgICAgICBCQUNLU1BBQ0U6IDgsXG4gICAgICAgIEJBQ0tTUEFDRV9TQUZBUkk6IDEyNyxcbiAgICAgICAgREVMRVRFOiA0NixcbiAgICAgICAgRE9XTjogNDAsXG4gICAgICAgIEVORDogMzUsXG4gICAgICAgIEVOVEVSOiAxMyxcbiAgICAgICAgRVNDQVBFOiAyNyxcbiAgICAgICAgSE9NRTogMzYsXG4gICAgICAgIElOU0VSVDogNDUsXG4gICAgICAgIExFRlQ6IDM3LFxuICAgICAgICBQQUdFX0RPV046IDM0LFxuICAgICAgICBQQUdFX1VQOiAzMyxcbiAgICAgICAgUklHSFQ6IDM5LFxuICAgICAgICBTUEFDRTogMzIsXG4gICAgICAgIFRBQjogOSxcbiAgICAgICAgVVA6IDM4LFxuICAgICAgICBYOiA4OCxcbiAgICAgICAgQ09OVFJPTDogMTdcbiAgICB9O1xuICAgIElucHV0bWFzay5kZXBlbmRlbmN5TGliID0gJDtcbiAgICBmdW5jdGlvbiByZXNvbHZlQWxpYXMoYWxpYXNTdHIsIG9wdGlvbnMsIG9wdHMpIHtcbiAgICAgICAgdmFyIGFsaWFzRGVmaW5pdGlvbiA9IElucHV0bWFzay5wcm90b3R5cGUuYWxpYXNlc1thbGlhc1N0cl07XG4gICAgICAgIGlmIChhbGlhc0RlZmluaXRpb24pIHtcbiAgICAgICAgICAgIGlmIChhbGlhc0RlZmluaXRpb24uYWxpYXMpIHJlc29sdmVBbGlhcyhhbGlhc0RlZmluaXRpb24uYWxpYXMsIHVuZGVmaW5lZCwgb3B0cyk7XG4gICAgICAgICAgICAkLmV4dGVuZCh0cnVlLCBvcHRzLCBhbGlhc0RlZmluaXRpb24pO1xuICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgb3B0cywgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChvcHRzLm1hc2sgPT09IG51bGwpIHtcbiAgICAgICAgICAgIG9wdHMubWFzayA9IGFsaWFzU3RyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVNYXNrU2V0KG9wdHMsIG5vY2FjaGUpIHtcbiAgICAgICAgZnVuY3Rpb24gZ2VuZXJhdGVNYXNrKG1hc2ssIG1ldGFkYXRhLCBvcHRzKSB7XG4gICAgICAgICAgICB2Y
46184XIgcmVnZXhNYXNrID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAobWFzayA9PT0gbnVsbCB8fCBtYXNrID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgcmVnZXhNYXNrID0gb3B0cy5yZWdleCAhPT0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAocmVnZXhNYXNrKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hc2sgPSBvcHRzLnJlZ2V4O1xuICAgICAgICAgICAgICAgICAgICBtYXNrID0gbWFzay5yZXBsYWNlKC9eKFxcXikoLiopKFxcJCkkLywgXCIkMlwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWdleE1hc2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBtYXNrID0gXCIuKlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXNrLmxlbmd0aCA9PT0gMSAmJiBvcHRzLmdyZWVkeSA9PT0gZmFsc2UgJiYgb3B0cy5yZXBlYXQgIT09IDApIHtcbiAgICAgICAgICAgICAgICBvcHRzLnBsYWNlaG9sZGVyID0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRzLnJlcGVhdCA+IDAgfHwgb3B0cy5yZXBlYXQgPT09IFwiKlwiIHx8IG9wdHMucmVwZWF0ID09PSBcIitcIikge1xuICAgICAgICAgICAgICAgIHZhciByZXBlYXRTdGFydCA9IG9wdHMucmVwZWF0ID09PSBcIipcIiA/IDAgOiBvcHRzLnJlcGVhdCA9PT0gXCIrXCIgPyAxIDogb3B0cy5yZXBlYXQ7XG4gICAgICAgICAgICAgICAgbWFzayA9IG9wdHMuZ3JvdXBtYXJrZXJbMF0gKyBtYXNrICsgb3B0cy5ncm91cG1hcmtlclsxXSArIG9wdHMucXVhbnRpZmllcm1hcmtlclswXSArIHJlcGVhdFN0YXJ0ICsgXCIsXCIgKyBvcHRzLnJlcGVhdCArIG9wdHMucXVhbnRpZmllcm1hcmtlclsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBtYXNrc2V0RGVmaW5pdGlvbiwgbWFza2RlZktleSA9IHJlZ2V4TWFzayA/IFwicmVnZXhfXCIgKyBvcHRzLnJlZ2V4IDogb3B0cy5udW1lcmljSW5wdXQgPyBtYXNrLnNwbGl0KFwiXCIpLnJldmVyc2UoKS5qb2luKFwiXCIpIDogbWFzaztcbiAgICAgICAgICAgIGlmIChJbnB1dG1hc2sucHJvdG90eXBlLm1hc2tzQ2FjaGVbbWFza2RlZktleV0gPT09IHVuZGVmaW5lZCB8fCBub2NhY2hlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgbWFza3NldERlZmluaXRpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgIG1hc2s6IG1hc2ssXG4gICAgICAgICAgICAgICAgICAgIG1hc2tUb2tlbjogSW5wdXRtYXNrLnByb3RvdHlwZS5hbmFseXNlTWFzayhtYXNrLCByZWdleE1hc2ssIG9wdHMpLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZFBvc2l0aW9uczoge30sXG4gICAgICAgICAgICAgICAgICAgIF9idWZmZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIHRlc3RzOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZXM6IHt9LFxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIG1hc2tMZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgaml0T2Zmc2V0OiB7fVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKG5vY2FjaGUgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgSW5wdXRtYXNrLnByb3RvdHlwZS5tYXNrc0NhY2hlW21hc2tkZWZLZXldID0gbWFza3NldERlZmluaXRpb247XG4gICAgICAgICAgICAgICAgICAgIG1hc2tzZXREZWZpbml0aW9uID0gJC5leHRlbmQodHJ1ZSwge30sIElucHV0bWFzay5wcm90b3R5cGUubWFza3NDYWNoZVttYXNrZGVmS2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIG1hc2tzZXREZWZpbml0aW9uID0gJC5leHRlbmQodHJ1ZSwge30sIElucHV0bWFzay5wcm90b3R5cGUubWFza3NDYWNoZVttYXNrZGVmS2V5XSk7XG4gICAgICAgICAgICByZXR1cm4gbWFza3NldERlZmluaXRpb247XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1zO1xuICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKG9wdHMubWFzaykpIHtcbiAgICAgICAgICAgIG9wdHMubWFzayA9IG9wdHMubWFzayhvcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJC5pc0FycmF
461845KG9wdHMubWFzaykpIHtcbiAgICAgICAgICAgIGlmIChvcHRzLm1hc2subGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGlmIChvcHRzLmtlZXBTdGF0aWMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5rZWVwU3RhdGljID0gXCJhdXRvXCI7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0cy5tYXNrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5tYXNrW2ldLmNoYXJBdCgwKSAhPT0gb3B0cy5tYXNrWzBdLmNoYXJBdCgwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMua2VlcFN0YXRpYyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGFsdE1hc2sgPSBvcHRzLmdyb3VwbWFya2VyWzBdO1xuICAgICAgICAgICAgICAgICQuZWFjaChvcHRzLmlzUlRMID8gb3B0cy5tYXNrLnJldmVyc2UoKSA6IG9wdHMubWFzaywgZnVuY3Rpb24obmR4LCBtc2spIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFsdE1hc2subGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWx0TWFzayArPSBvcHRzLmdyb3VwbWFya2VyWzFdICsgb3B0cy5hbHRlcm5hdG9ybWFya2VyICsgb3B0cy5ncm91cG1hcmtlclswXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobXNrLm1hc2sgIT09IHVuZGVmaW5lZCAmJiAhJC5pc0Z1bmN0aW9uKG1zay5tYXNrKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWx0TWFzayArPSBtc2subWFzaztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdE1hc2sgKz0gbXNrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYWx0TWFzayArPSBvcHRzLmdyb3VwbWFya2VyWzFdO1xuICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZU1hc2soYWx0TWFzaywgb3B0cy5tYXNrLCBvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSBvcHRzLm1hc2sgPSBvcHRzLm1hc2sucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMubWFzayAmJi
46184BvcHRzLm1hc2subWFzayAhPT0gdW5kZWZpbmVkICYmICEkLmlzRnVuY3Rpb24ob3B0cy5tYXNrLm1hc2spKSB7XG4gICAgICAgICAgICBtcyA9IGdlbmVyYXRlTWFzayhvcHRzLm1hc2subWFzaywgb3B0cy5tYXNrLCBvcHRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1zID0gZ2VuZXJhdGVNYXNrKG9wdHMubWFzaywgb3B0cy5tYXNrLCBvcHRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzSW5wdXRFdmVudFN1cHBvcnRlZChldmVudE5hbWUpIHtcbiAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpLCBldk5hbWUgPSBcIm9uXCIgKyBldmVudE5hbWUsIGlzU3VwcG9ydGVkID0gZXZOYW1lIGluIGVsO1xuICAgICAgICBpZiAoIWlzU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoZXZOYW1lLCBcInJldHVybjtcIik7XG4gICAgICAgICAgICBpc1N1cHBvcnRlZCA9IHR5cGVvZiBlbFtldk5hbWVdID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWwgPSBudWxsO1xuICAgICAgICByZXR1cm4gaXNTdXBwb3J0ZWQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1hc2tTY29wZShhY3Rpb25PYmosIG1hc2tzZXQsIG9wdHMpIHtcbiAgICAgICAgbWFza3NldCA9IG1hc2tzZXQgfHwgdGhpcy5tYXNrc2V0O1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB0aGlzLm9wdHM7XG4gICAgICAgIHZhciBpbnB1dG1hc2sgPSB0aGlzLCBlbCA9IHRoaXMuZWwsIGlzUlRMID0gdGhpcy5pc1JUTCwgdW5kb1ZhbHVlLCAkZWwsIHNraXBLZXlQcmVzc0V2ZW50ID0gZmFsc2UsIHNraXBJbnB1dEV2ZW50ID0gZmFsc2UsIGlnbm9yYWJsZSA9IGZhbHNlLCBtYXhMZW5ndGgsIG1vdXNlRW50ZXIgPSBmYWxzZSwgY29sb3JNYXNrLCBvcmlnaW5hbFBsYWNlaG9sZGVyO1xuICAgICAgICBmdW5jdGlvbiBnZXRNYXNrVGVtcGxhdGUoYmFzZU9uSW5wdXQsIG1pbmltYWxQb3MsIGluY2x1ZGVNb2RlLCBub0ppdCwgY2xlYXJPcHRpb25hbFRhaWwpIHtcbiAgICAgICAgICAgIHZhciBncmVlZHkgPSBvcHRzLmdyZWVkeTtcbiAgICAgICAgICAgIGlmIChjbGVhck9wdGlvbmFsVGFpbCkgb3B0cy5ncmVlZHkgPSBmYWxzZTtcbiAgICAgICAgICAgIG1pbmltYWxQb3MgPSBtaW5pbWFsUG9zIHx8IDA7XG4gICAgICAgICAgICB2Y
46184XIgbWFza1RlbXBsYXRlID0gW10sIG5keEludGx6ciwgcG9zID0gMCwgdGVzdCwgdGVzdFBvcywgbHZwID0gZ2V0TGFzdFZhbGlkUG9zaXRpb24oKTtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBpZiAoYmFzZU9uSW5wdXQgPT09IHRydWUgJiYgZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW3Bvc10pIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdFBvcyA9IGNsZWFyT3B0aW9uYWxUYWlsICYmIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1twb3NdLm1hdGNoLm9wdGlvbmFsaXR5ID09PSB0cnVlICYmIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1twb3MgKyAxXSA9PT0gdW5kZWZpbmVkICYmIChnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zXS5nZW5lcmF0ZWRJbnB1dCA9PT0gdHJ1ZSB8fCBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zXS5pbnB1dCA9PSBvcHRzLnNraXBPcHRpb25hbFBhcnRDaGFyYWN0ZXIgJiYgcG9zID4gMCkgPyBkZXRlcm1pbmVUZXN0VGVtcGxhdGUocG9zLCBnZXRUZXN0cyhwb3MsIG5keEludGx6ciwgcG9zIC0gMSkpIDogZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW3Bvc107XG4gICAgICAgICAgICAgICAgICAgIHRlc3QgPSB0ZXN0UG9zLm1hdGNoO1xuICAgICAgICAgICAgICAgICAgICBuZHhJbnRsenIgPSB0ZXN0UG9zLmxvY2F0b3Iuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgbWFza1RlbXBsYXRlLnB1c2goaW5jbHVkZU1vZGUgPT09IHRydWUgPyB0ZXN0UG9zLmlucHV0IDogaW5jbHVkZU1vZGUgPT09IGZhbHNlID8gdGVzdC5uYXRpdmVEZWYgOiBnZXRQbGFjZWhvbGRlcihwb3MsIHRlc3QpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0UG9zID0gZ2V0VGVzdFRlbXBsYXRlKHBvcywgbmR4SW50bHpyLCBwb3MgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGVzdCA9IHRlc3RQb3MubWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIG5keEludGx6ciA9IHRlc3RQb3MubG9jYXRvci5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgaml0TWFza2luZyA9IG5vSml0ID09PSB0cnVlID8gZmFsc2UgOiBvcHRzLmppdE1hc2tpbmcgIT09IGZhbHNlID8gb3B0cy5qaXRNYXNraW5nIDogdGVzdC5qaXQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqaXRNYXNraW5nID09PSBmYWxzZSB8fCBqaXRNYXNraW5nID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGppdE1hc2tpbmcgPT09IFwibnVtYmVyXCIgJiYgaXNGaW5pdGUoaml0TWFza2luZykgJiYgaml0TWFza2luZyA+IHBvcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFza1RlbXBsYXRlLnB1c2goaW5jbHVkZU1vZGUgPT09IGZhbHNlID8gdGVzdC5uYXRpdmVEZWYgOiBnZXRQbGFjZWhvbGRlcihwb3MsIHRlc3QpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0cy5rZWVwU3RhdGljID09PSBcImF1dG9cIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGVzdC5uZXdCbG9ja01hcmtlciAmJiB0ZXN0LmZuICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRzLmtlZXBTdGF0aWMgPSBwb3MgLSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBvcysrO1xuICAgICAgICAgICAgfSB3aGlsZSAoKG1heExlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IHBvcyA8IG1heExlbmd0aCkgJiYgKHRlc3QuZm4gIT09IG51bGwgfHwgdGVzdC5kZWYgIT09IFwiXCIpIHx8IG1pbmltYWxQb3MgPiBwb3MpO1xuICAgICAgICAgICAgaWYgKG1hc2tUZW1wbGF0ZVttYXNrVGVtcGxhdGUubGVuZ3RoIC0gMV0gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBtYXNrVGVtcGxhdGUucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5jbHVkZU1vZGUgIT09IGZhbHNlIHx8IGdldE1hc2tTZXQoKS5tYXNrTGVuZ3RoID09PSB1bmRlZmluZWQpIGdldE1hc2tTZXQoKS5tYXNrTGVuZ3RoID0gcG9zIC0gMTtcbiAgICAgICAgICAgIG9wdHMuZ3JlZWR5ID0gZ3JlZWR5O1xuICAgICAgICAgICAgcmV0dXJuIG1hc2tUZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBnZXRNYXNrU2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hc2tzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVzZXRNYXNrU2V0KHNvZnQpIHtcbiAgICAgICAgICAgIHZhciBtYXNrc2V0ID0gZ2V0TWFza1NldCgpO1xuICAgICAgICAgICAgbWFza3NldC5idWZmZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoc29mdCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIG1hc2tzZXQudmFsaWRQb3NpdGlvbnMgPSB7fTtcbiAgICAgICAgICAgICAgICBtYXNrc2V0LnAgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGdldExhc3RWYWxpZFBvc2l0aW9uKGNsb3Nlc3RUbywgc3RyaWN0LCB2YWxpZFBvc2l0aW9ucykge1xuICAgICAgICAgICAgdmFyIGJlZm9yZSA9IC0xLCBhZnRlciA9IC0xLCB2YWxpZHMgPSB2YWxpZFBvc2l0aW9ucyB8fCBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnM7XG4gICAgICAgICAgICBpZiAoY2xvc2VzdFRvID09PSB1bmRlZmluZWQpIGNsb3Nlc3RUbyA9IC0xO1xuICAgICAgICAgICAgZm9yICh2YXIgcG9zTmR4IGluIHZhbGlkcykge1xuICAgICAgICAgICAgICAgIHZhciBwc05keCA9IHBhcnNlSW50KHBvc05keCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkc1twc05keF0gJiYgKHN0cmljdCB8fCB2YWxpZHNbcHNOZHhdLmdlbmVyYXRlZElucHV0ICE9PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHNOZHggPD0gY2xvc2VzdFRvKSBiZWZvcmUgPSBwc05keDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBzTmR4ID49IGNsb3Nlc3RUbykgYWZ0ZXIgPSBwc05keDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYmVmb3JlID09PSAtMSB8fCBiZWZvcmUgPT0gY2xvc2VzdFRvID8gYWZ0ZXIgOiBhZnRlciA9PSAtMSA/IGJlZm9yZSA6IGNsb3Nlc3RUbyAtIGJlZm9yZSA8IGFmdGVyIC0gY2xvc2VzdFRvID8gYmVmb3JlIDogYWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZ2V0RGVjaXNpb25UYWtlcih0c3QpIHtcbiAgICAgICAgICAgIHZhciBkZWNpc2lvblRha2VyID0gdHN0LmxvY2F0b3JbdHN0LmFsdGVybmF0aW9uXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGVjaXNpb25UYWtlciA9PSBcInN0cmluZ1wiICYmIGRlY2lzaW9uVGFrZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGRlY2lzaW9uVGFrZXIgPSBkZWNpc2lvblRha2VyLnNwbGl0KFwiLFwiKVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZWNpc2lvblRha2VyICE9PSB1bmRlZmluZWQgPyBkZWNpc2lvblRha2VyLnRvU3RyaW5nKCkgOiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGdldExvY2F0b3IodHN0LCBhbGlnbikge1xuICAgICAgICAgICAgdmFyIGxvY2F0b3IgPSAodHN0LmFsdGVybmF0aW9uICE9IHVuZGVmaW5lZCA/IHRzdC5tbG9jW2dldERlY2lzaW9uVGFrZXIodHN0KV0gOiB0c3QubG9jYXRvcikuam9pbihcIlwiKTtcbiAgICAgICAgICAgIGlmIChsb2NhdG9yICE9PSBcIlwiKSB3aGlsZSAobG9jYXRvci5sZW5ndGggPCBhbGlnbikgbG9jYXRvciArPSBcIjBcIjtcbiAgICAgICAgICAgIHJldHVybiBsb2NhdG9yO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGRldGVybWluZVRlc3RUZW1wbGF0ZShwb3MsIHRlc3RzKSB7XG4gICAgICAgICAgICBwb3MgPSBwb3MgPiAwID8gcG9zIC0gMSA6IDA7XG4gICAgICAgICAgICB2Y
46184XIgYWx0VGVzdCA9IGdldFRlc3QocG9zKSwgdGFyZ2V0TG9jYXRvciA9IGdldExvY2F0b3IoYWx0VGVzdCksIHRzdExvY2F0b3IsIGNsb3Nlc3QsIGJlc3RNYXRjaDtcbiAgICAgICAgICAgIGZvciAodmFyIG5keCA9IDA7IG5keCA8IHRlc3RzLmxlbmd0aDsgbmR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdHN0ID0gdGVzdHNbbmR4XTtcbiAgICAgICAgICAgICAgICB0c3RMb2NhdG9yID0gZ2V0TG9jYXRvcih0c3QsIHRhcmdldExvY2F0b3IubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLmFicyh0c3RMb2NhdG9yIC0gdGFyZ2V0TG9jYXRvcik7XG4gICAgICAgICAgICAgICAgaWYgKGNsb3Nlc3QgPT09IHVuZGVmaW5lZCB8fCB0c3RMb2NhdG9yICE9PSBcIlwiICYmIGRpc3RhbmNlIDwgY2xvc2VzdCB8fCBiZXN0TWF0Y2ggJiYgIW9wdHMuZ3JlZWR5ICYmIGJlc3RNYXRjaC5tYXRjaC5vcHRpb25hbGl0eSAmJiBiZXN0TWF0Y2gubWF0Y2gubmV3QmxvY2tNYXJrZXIgPT09IFwibWFzdGVyXCIgJiYgKCF0c3QubWF0Y2gub3B0aW9uYWxpdHkgfHwgIXRzdC5tYXRjaC5uZXdCbG9ja01hcmtlcikgfHwgYmVzdE1hdGNoICYmIGJlc3RNYXRjaC5tYXRjaC5vcHRpb25hbFF1YW50aWZpZXIgJiYgIXRzdC5tYXRjaC5vcHRpb25hbFF1YW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VzdCA9IGRpc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2ggPSB0c3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGJlc3RNYXRjaDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBnZXRUZXN0VGVtcGxhdGUocG9zLCBuZHhJbnRsenIsIHRzdFBzKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW3Bvc10gfHwgZGV0ZXJtaW5lVGVzdFRlbXBsYXRlKHBvcywgZ2V0VGVzdHMocG9zLCBuZHhJbnRsenIgPyBuZHhJbnRsenIuc2xpY2UoKSA6IG5keEludGx6ciwgdHN0UHMpKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBnZXRUZXN0KHBvcywgdGVzdHMpIHtcbiAgICAgICAgICAgIGlmIChnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAodGVzdHMgfHwgZ2V0VGVzdHMocG9zKSlbMF07XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcG9zaXRpb25DYW5NYXRjaERlZmluaXRpb24ocG9zLCBkZWYpIHtcbiAgICAgICAgICAgIHZhciB2YWxpZCA9IGZhbHNlLCB0ZXN0cyA9IGdldFRlc3RzKHBvcyk7XG4gICAgICAgICAgICBmb3IgKHZhciB0bmR4ID0gMDsgdG5keCA8IHRlc3RzLmxlbmd0aDsgdG5keCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRlc3RzW3RuZHhdLm1hdGNoICYmIHRlc3RzW3RuZHhdLm1hdGNoLmRlZiA9PT0gZGVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbGlkO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGdldFRlc3RzKHBvcywgbmR4SW50bHpyLCB0c3RQcykge1xuICAgICAgICAgICAgdmFyIG1hc2tUb2tlbnMgPSBnZXRNYXNrU2V0KCkubWFza1Rva2VuLCB0ZXN0UG9zID0gbmR4SW50bHpyID8gdHN0UHMgOiAwLCBuZHhJbml0aWFsaXplciA9IG5keEludGx6ciA/IG5keEludGx6ci5zbGljZSgpIDogWyAwIF0sIG1hdGNoZXMgPSBbXSwgaW5zZXJ0U3RvcCA9IGZhbHNlLCBsYXRlc3RNYXRjaCwgY2FjaGVEZXBlbmRlbmN5ID0gbmR4SW50bHpyID8gbmR4SW50bHpyLmpvaW4oXCJcIikgOiBcIlwiO1xuICAgICAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZVRlc3RGcm9tVG9rZW4obWFza1Rva2VuLCBuZHhJbml0aWFsaXplciwgbG9vcE5keCwgcXVhbnRpZmllclJlY3Vyc2UpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVNYXRjaChtYXRjaCwgbG9vcE5keCwgcXVhbnRpZmllclJlY3Vyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaXNGaXJzdE1hdGNoKGxhdGVzdE1hdGNoLCB0b2tlbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgZmlyc3RNYXRjaCA9ICQuaW5BcnJheShsYXRlc3RNYXRjaCwgdG9rZW5Hcm91cC5tYXRjaGVzKSA9PT0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3RNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCh0b2tlbkdyb3VwLm1hdGNoZXMsIGZ1bmN0aW9uKG5keCwgbWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoLmlzUXVhbnRpZmllciA9PT0gdHJ1ZSkgZmlyc3RNYXRjaCA9IGlzRmlyc3RNYXRjaChsYXRlc3RNYXRjaCwgdG9rZW5Hcm91cC5tYXRjaGVzW25keCAtIDFdKTsgZWxzZSBpZiAobWF0Y2guaGFzT3duUHJvcGVydHkoXCJtYXRjaGVzXCIpKSBmaXJzdE1hdGNoID0gaXNGaXJzdE1hdGNoKGxhdGVzdE1hdGNoLCBtYXRjaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdE1hdGNoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3RNYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByZXNvbHZlTmR4SW5pdGlhbGl6ZXIocG9zLCBhbHRlcm5hdGVOZHgsIHRhcmdldEFsdGVybmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmVzdE1hdGNoLCBpbmRleFBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRNYXNrU2V0KCkudGVzdHNbcG9zXSB8fCBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChnZXRNYXNrU2V0KCkudGVzdHNbcG9zXSB8fCBbIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1twb3NdIF0sIGZ1bmN0aW9uKG5keCwgbG1udCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG1udC5tbG9jW2FsdGVybmF0ZU5keF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaCA9IGxtbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFsdGVybmF0aW9uID0gdGFyZ2V0QWx0ZXJuYXRpb24gIT09IHVuZGVmaW5lZCA/IHRhcmdldEFsdGVybmF0aW9uIDogbG1udC5hbHRlcm5hdGlvbiwgbmR4UG9zID0gbG1udC5sb2NhdG9yW2FsdGVybmF0aW9uXSAhPT0gdW5kZWZpbmVkID8gbG1udC5sb2NhdG9yW2FsdGVybmF0aW9uXS50b1N0cmluZygpLmluZGV4T2YoYWx0ZXJuYXRlTmR4KSA6IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGluZGV4UG9zID09PSB1bmRlZmluZWQgfHwgbmR4UG9zIDwgaW5kZXhQb3MpICYmIG5keFBvcyAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaCA9IGxtbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFBvcyA9IG5keFBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJlc3RNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiZXN0TWF0Y2hBbHRJbmRleCA9IGJlc3RNYXRjaC5sb2NhdG9yW2Jlc3RNYXRjaC5hbHRlcm5hdGlvbl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0b3IgPSBiZXN0TWF0Y2gubWxvY1thbHRlcm5hdGVOZHhdIHx8IGJlc3RNYXRjaC5tbG9jW2Jlc3RNYXRjaEFsdEluZGV4XSB8fCBiZXN0TWF0Y2gubG9jYXRvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRvci5zbGljZSgodGFyZ2V0QWx0ZXJuYXRpb24gIT09IHVuZGVmaW5lZCA/IHRhcmdldEFsdGVybmF0aW9uIDogYmVzdE1hdGNoLmFsdGVybmF0aW9uKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0QWx0ZXJuYXRpb24gIT09IHVuZGVmaW5lZCA/IHJlc29sdmVOZHhJbml0aWFsaXplcihwb3MsIGFsdGVybmF0ZU5keCkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaXNTdWJzZXRPZihzb3VyY2UsIHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZXhwYW5kKHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgZXhwYW5kZWQgPSBbXSwgc3RhcnQsIGVuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHBhdHRlcm4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmNoYXJBdChpKSA9PT0gXCItXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IHBhdHRlcm4uY2hhckNvZGVBdChpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKytzdGFydCA8IGVuZCkgZXhwYW5kZWQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHN0YXJ0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHBhdHRlcm4uY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkLnB1c2gocGF0dGVybi5jaGFyQXQoaSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHBhbmRlZC5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMucmVnZXggJiYgc291cmNlLm1hdGNoLmZuICE9PSBudWxsICYmIHRhcmdldC5tYXRjaC5mbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHBhbmQodGFyZ2V0Lm1hdGNoLmRlZi5yZXBsYWNlKC9bXFxbXFxdXS9nLCBcIlwiKSkuaW5kZXhPZihleHBhbmQoc291cmNlLm1hdGNoLmRlZi5yZXBsYWNlKC9bXFxbXFxdXS9nLCBcIlwiKSkpICE9PSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2UubWF0Y2guZGVmID09PSB0YXJnZXQubWF0Y2gubmF0aXZlRGVmO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHN0YXRpY0Nhbk1hdGNoRGVmaW5pdGlvbihzb3VyY2UsIHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNsb2MgPSBzb3VyY2UubG9jYXRvci5zbGljZShzb3VyY2UuYWx0ZXJuYXRpb24pLmpvaW4oXCJcIiksIHRsb2MgPSB0YXJnZXQubG9jYXRvci5zbGljZSh0YXJnZXQuYWx0ZXJuYXRpb24pLmpvaW4oXCJcIiksIGNhbk1hdGNoID0gc2xvYyA9PSB0bG9jO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FuTWF0Y2ggPSBjYW5NYXRjaCAmJiBzb3VyY2UubWF0Y2guZm4gPT09IG51bGwgJiYgdGFyZ2V0Lm1hdGNoLmZuICE9PSBudWxsID8gdGFyZ2V0Lm1hdGNoLmZuLnRlc3Qoc291cmNlLm1hdGNoLmRlZiwgZ2V0TWFza1NldCgpLCBwb3MsIGZhbHNlLCBvcHRzLCBmYWxzZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYW5NYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzZXRNZXJnZUxvY2F0b3JzKHRhcmdldE1hdGNoLCBhbHRNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsdE1hdGNoID09PSB1bmRlZmluZWQgfHwgdGFyZ2V0TWF0Y2guYWx0ZXJuYXRpb24gPT09IGFsdE1hdGNoLmFsdGVybmF0aW9uICYmIHRhcmdldE1hdGNoLmxvY2F0b3JbdGFyZ2V0TWF0Y2guYWx0ZXJuYXRpb25dLnRvU3RyaW5nKCkuaW5kZXhPZihhbHRNYXRjaC5sb2NhdG9yW2FsdE1hdGNoLmFsdGVybmF0aW9uXSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWF0Y2gubWxvYyA9IHRhcmdldE1hdGNoLm1sb2MgfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY05keCA9IHRhcmdldE1hdGNoLmxvY2F0b3JbdGFyZ2V0TWF0Y2guYWx0ZXJuYXRpb25dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NOZHggPT09IHVuZGVmaW5lZCkgdGFyZ2V0TWF0Y2guYWx0ZXJuYXRpb24gPSB1bmRlZmluZWQ7IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxvY05keCA9PT0gXCJzdHJpbmdcIikgbG9jTmR4ID0gbG9jTmR4LnNwbGl0KFwiLFwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldE1hdGNoLm1sb2NbbG9jTmR4XSA9PT0gdW5kZWZpbmVkKSB0YXJnZXRNYXRjaC5tbG9jW2xvY05keF0gPSB0YXJnZXRNYXRjaC5sb2NhdG9yLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHRNYXRjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuZHggaW4gYWx0TWF0Y2gubWxvYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmR4ID09PSBcInN0cmluZ1wiKSBuZHggPSBuZHguc3BsaXQoXCIsXCIpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRNYXRjaC5tbG9jW25keF0gPT09IHVuZGVmaW5lZCkgdGFyZ2V0TWF0Y2gubWxvY1tuZHhdID0gYWx0TWF0Y2gubWxvY1tuZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWF0Y2gubG9jYXRvclt0YXJnZXRNYXRjaC5hbHRlcm5hdGlvbl0gPSBPYmplY3Qua2V5cyh0YXJnZXRNYXRjaC5tbG9jKS5qb2luKFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgI
46184H1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RQb3MgPiA1MDAgJiYgcXVhbnRpZmllclJlY3Vyc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgXCJJbnB1dG1hc2s6IFRoZXJlIGlzIHByb2JhYmx5IGFuIGVycm9yIGluIHlvdXIgbWFzayBkZWZpbml0aW9uIG9yIGluIHRoZSBjb2RlLiBDcmVhdGUgYW4gaXNzdWUgb24gZ2l0aHViIHdpdGggYW4gZXhhbXBsZSBvZiB0aGUgbWFzayB5b3UgYXJlIHVzaW5nLiBcIiArIGdldE1hc2tTZXQoKS5tYXNrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0UG9zID09PSBwb3MgJiYgbWF0Y2gubWF0Y2hlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoOiBtYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdG9yOiBsb29wTmR4LnJldmVyc2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZDogY2FjaGVEZXBlbmRlbmN5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1sb2M6IHt9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoLm1hdGNoZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoLmlzR3JvdXAgJiYgcXVhbnRpZmllclJlY3Vyc2UgIT09IG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBoYW5kbGVNYXRjaChtYXNrVG9rZW4ubWF0Y2hlc1skLmluQXJyYXkobWF0Y2gsIG1hc2tUb2tlbi5tYXRjaGVzKSArIDFdLCBsb29wTmR4LCBxdWFudGlmaWVyUmVjdXJzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2guaXNPcHRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25hbFRva2VuID0gbWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSByZXNvbHZlVGVzdEZyb21Ub2tlbihtYXRjaCwgbmR4SW5pdGlhbGl6ZXIsIGxvb3BOZHgsIHF1YW50aWZpZXJSZWN1cnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG1hdGNoZXMsIGZ1bmN0aW9uKG5keCwgbXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXRjaC5tYXRjaC5vcHRpb25hbGl0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3RNYXRjaCA9IG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXS5tYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1YW50aWZpZXJSZWN1cnNlID09PSB1bmRlZmluZWQgJiYgaXNGaXJzdE1hdGNoKGxhdGVzdE1hdGNoLCBvcHRpb25hbFRva2VuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0U3RvcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UG9zID0gcG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaC5pc0FsdGVybmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgYWx0ZXJuYXRlVG9rZW4gPSBtYXRjaCwgbWFsdGVybmF0ZU1hdGNoZXMgPSBbXSwgbWFsdE1hdGNoZXMsIGN1cnJlbnRNYXRjaGVzID0gbWF0Y2hlcy5zbGljZSgpLCBsb29wTmR4Q250ID0gbG9vcE5keC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFsdEluZGV4ID0gbmR4SW5pdGlhbGl6ZXIubGVuZ3RoID4gMCA/IG5keEluaXRpYWxpemVyLnNoaWZ0KCkgOiAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWx0SW5kZXggPT09IC0xIHx8IHR5cGVvZiBhbHRJbmRleCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudFBvcyA9IHRlc3RQb3MsIG5keEluaXRpYWxpemVyQ2xvbmUgPSBuZHhJbml0aWFsaXplci5zbGljZSgpLCBhbHRJbmRleEFyciA9IFtdLCBhbW5keDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhbHRJbmRleCA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRJbmRleEFyciA9IGFsdEluZGV4LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYW1uZHggPSAwOyBhbW5keCA8IGFsdGVybmF0ZVRva2VuLm1hdGNoZXMubGVuZ3RoOyBhbW5keCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0SW5kZXhBcnIucHVzaChhbW5keC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TWFza1NldCgpLmV4Y2x1ZGVzW3Bvc10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHRJbmRleEFyckNsb25lID0gYWx0SW5kZXhBcnIuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBlbCA9IGdldE1hc2tTZXQoKS5leGNsdWRlc1twb3NdLmxlbmd0aDsgaSA8IGVsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRJbmRleEFyci5zcGxpY2UoYWx0SW5kZXhBcnIuaW5kZXhPZihnZXRNYXNrU2V0KCkuZXhjbHVkZXNbcG9zXVtpXS50b1N0cmluZygpKSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWx0SW5kZXhBcnIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWFza1NldCgpLmV4Y2x1ZGVzW3Bvc10gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0SW5kZXhBcnIgPSBhbHRJbmRleEFyckNsb25lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLmtlZXBTdGF0aWMgPT09IHRydWUgfHwgaXNGaW5pdGUocGFyc2VJbnQob3B0cy5rZWVwU3RhdGljKSkgJiYgY3VycmVudFBvcyA+PSBvcHRzLmtlZXBTdGF0aWMpIGFsdEluZGV4QXJyID0gYWx0SW5kZXhBcnIuc2xpY2UoMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bk1hdGNoZWRBbHRlcm5hdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuZHggPSAwOyBuZHggPCBhbHRJbmRleEFyci5sZW5ndGg7IG5keCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW5keCA9IHBhcnNlSW50KGFsdEluZGV4QXJyW25keF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmR4SW5pdGlhbGl6ZXIgPSB0eXBlb2YgYWx0SW5kZXggPT09IFwic3RyaW5nXCIgPyByZXNvbHZlTmR4SW5pdGlhbGl6ZXIodGVzdFBvcywgYW1uZHgsIGxvb3BOZHhDbnQpIHx8IG5keEluaXRpYWxpemVyQ2xvbmUuc2xpY2UoKSA6IG5keEluaXRpYWxpemVyQ2xvbmUuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHRlcm5hdGVUb2tlbi5tYXRjaGVzW2FtbmR4XSAmJiBoYW5kbGVNYXRjaChhbHRlcm5hdGVUb2tlbi5tYXRjaGVzW2FtbmR4XSwgWyBhbW5keCBdLmNvbmNhdChsb29wTmR4KSwgcXVhbnRpZmllclJlY3Vyc2UpKSBtYXRjaCA9IHRydWU7IGVsc2UgaWYgKG5keCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuTWF0Y2hlZEFsdGVybmF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbHRNYXRjaGVzID0gbWF0Y2hlcy5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFBvcyA9IGN1cnJlbnRQb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuZHgxID0gMDsgbmR4MSA8IG1hbHRNYXRjaGVzLmxlbmd0aDsgbmR4MSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFsdE1hdGNoID0gbWFsdE1hdGNoZXNbbmR4MV0sIGRyb3BNYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdE1hdGNoLm1hdGNoLmppdCA9IGFsdE1hdGNoLm1hdGNoLmppdCB8fCB1bk1hdGNoZWRBbHRlcm5hdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRNYXRjaC5hbHRlcm5hdGlvbiA9IGFsdE1hdGNoLmFsdGVybmF0aW9uIHx8IGxvb3BOZHhDbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TWVyZ2VMb2NhdG9ycyhhbHRNYXRjaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbmR4MiA9IDA7IG5keDIgPCBtYWx0ZXJuYXRlTWF0Y2hlcy5sZW5ndGg7IG5keDIrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgYWx0TWF0Y2gyID0gbWFsdGVybmF0ZU1hdGNoZXNbbmR4Ml07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYWx0SW5kZXggIT09IFwic3RyaW5nXCIgfHwgYWx0TWF0Y2guYWx0ZXJuYXRpb24gIT09IHVuZGVmaW5lZCAmJiAkLmluQXJyYXkoYWx0TWF0Y2gubG9jYXRvclthbHRNYXRjaC5hbHRlcm5hdGlvbl0udG9TdHJpbmcoKSwgYWx0SW5kZXhBcnIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsdE1hdGNoLm1hdGNoLm5hdGl2ZURlZiA9PT0gYWx0TWF0Y2gyLm1hdGNoLm5hdGl2ZURlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BNYXRjaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TWVyZ2VMb2NhdG9ycyhhbHRNYXRjaDIsIGFsdE1hdGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNTdWJzZXRPZihhbHRNYXRjaCwgYWx0TWF0Y2gyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXRNZXJnZUxvY2F0b3JzKGFsdE1hdGNoLCBhbHRNYXRjaDIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BNYXRjaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbHRlcm5hdGVNYXRjaGVzLnNwbGljZShtYWx0ZXJuYXRlTWF0Y2hlcy5pbmRleE9mKGFsdE1hdGNoMiksIDAsIGFsdE1hdGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzU3Vic2V0T2YoYWx0TWF0Y2gyLCBhbHRNYXRjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRNZXJnZUxvY2F0b3JzKGFsdE1hdGNoMiwgYWx0TWF0Y2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0aWNDYW5NYXRjaERlZmluaXRpb24oYWx0TWF0Y2gsIGFsdE1hdGNoMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0TWVyZ2VMb2NhdG9ycyhhbHRNYXRjaCwgYWx0TWF0Y2gyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWx0ZXJuYXRlTWF0Y2hlcy5zcGxpY2UobWFsdGVybmF0ZU1hdGNoZXMuaW5kZXhPZihhbHRNYXRjaDIpLCAwLCBhbHRNYXRjaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZHJvcE1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbHRlcm5hdGVNYXRjaGVzLnB1c2goYWx0TWF0Y2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gY3VycmVudE1hdGNoZXMuY29uY2F0KG1hbHRlcm5hdGVNYXRjaGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFBvcyA9IHBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0U3RvcCA9IG1hdGNoZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBtYWx0ZXJuYXRlTWF0Y2hlcy5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZHhJbml0aWFsaXplciA9IG5keEluaXRpYWxpemVyQ2xvbmUuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgbWF0Y2ggPSBoYW5kbGVNYXRjaChhbHRlcm5hdGVUb2tlbi5tYXRjaGVzW2FsdEluZGV4XSB8fCBtYXNrVG9rZW4ubWF0Y2hlc1thbHRJbmRleF0sIFsgYWx0SW5kZXggXS5jb25jYXQobG9vcE5keCksIHF1YW50aWZpZXJSZWN1cnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaC5pc1F1YW50aWZpZXIgJiYgcXVhbnRpZmllclJlY3Vyc2UgIT09IG1hc2tUb2tlbi5tYXRjaGVzWyQuaW5BcnJheShtYXRjaCwgbWFza1Rva2VuLm1hdGNoZXMpIC0gMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgcXQgPSBtYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBxbmR4ID0gbmR4SW5pdGlhbGl6ZXIubGVuZ3RoID4gMCA/IG5keEluaXRpYWxpemVyLnNoaWZ0KCkgOiAwOyBxbmR4IDwgKGlzTmFOKHF0LnF1YW50aWZpZXIubWF4KSA/IHFuZHggKyAxIDogcXQucXVhbnRpZmllci5tYXgpICYmIHRlc3RQb3MgPD0gcG9zOyBxbmR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuR3JvdXAgPSBtYXNrVG9rZW4ubWF0Y2hlc1skLmluQXJyYXkocXQsIG1hc2tUb2tlbi5tYXRjaGVzKSAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGhhbmRsZU1hdGNoKHRva2VuR3JvdXAsIFsgcW5keCBdLmNvbmNhdChsb29wTmR4KSwgdG9rZW5Hcm91cCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0TWF0Y2ggPSBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV0ubWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3RNYXRjaC5vcHRpb25hbFF1YW50aWZpZXIgPSBxbmR4ID49IHF0LnF1YW50aWZpZXIubWluO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0TWF0Y2guaml0ID0gKHFuZHggfHwgMSkgKiB0b2tlbkdyb3VwLm1hdGNoZXMuaW5kZXhPZihsYXRlc3RNYXRjaCkgPj0gcXQucXVhbnRpZmllci5qaXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF0ZXN0TWF0Y2gub3B0aW9uYWxRdWFudGlmaWVyICYmIGlzRmlyc3RNYXRjaChsYXRlc3RNYXRjaCwgdG9rZW5Hcm91cCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRTdG9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UG9zID0gcG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhdGVzdE1hdGNoLmppdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS5qaXRPZmZzZXRbcG9zXSA9IHRva2VuR3JvdXAubWF0Y2hlcy5pbmRleE9mKGxhdGVzdE1hdGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHJlc29sdmVUZXN0RnJvbVRva2VuKG1hdGNoLCBuZHhJbml0aWFsaXplciwgbG9vcE5keCwgcXVhbnRpZmllclJlY3Vyc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UG9zKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdG5keCA9IG5keEluaXRpYWxpemVyLmxlbmd0aCA+IDAgPyBuZHhJbml0aWFsaXplci5zaGlmdCgpIDogMDsgdG5keCA8IG1hc2tUb2tlbi5tYXRjaGVzLmxlbmd0aDsgdG5keCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXNrVG9rZW4ubWF0Y2hlc1t0bmR4XS5pc1F1YW50aWZpZXIgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IGhhbmRsZU1hdGNoKG1hc2tUb2tlbi5tYXRjaGVzW3RuZHhdLCBbIHRuZHggXS5jb25jYXQobG9vcE5keCksIHF1YW50aWZpZXJSZWN1cnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCAmJiB0ZXN0UG9zID09PSBwb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlc3RQb3MgPiBwb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIG1lcmdlTG9jYXRvcnMocG9zLCB0ZXN0cykge1xuICAgICAgICAgICAgICAgIHZhciBsb2NhdG9yID0gW107XG4gICAgICAgICAgICAgICAgaWYgKCEkLmlzQXJyYXkodGVzdHMpKSB0ZXN0cyA9IFsgdGVzdHMgXTtcbiAgICAgICAgICAgICAgICBpZiAodGVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGVzdHNbMF0uYWx0ZXJuYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRvciA9IGRldGVybWluZVRlc3RUZW1wbGF0ZShwb3MsIHRlc3RzLnNsaWNlKCkpLmxvY2F0b3Iuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdG9yLmxlbmd0aCA9PT0gMCkgbG9jYXRvciA9IHRlc3RzWzBdLmxvY2F0b3Iuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCh0ZXN0cywgZnVuY3Rpb24obmR4LCB0c3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHN0LmRlZiAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRvci5sZW5ndGggPT09IDApIGxvY2F0b3IgPSB0c3QubG9jYXRvci5zbGljZSgpOyBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9jYXRvci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0c3QubG9jYXRvcltpXSAmJiBsb2NhdG9yW2ldLnRvU3RyaW5nKCkuaW5kZXhPZih0c3QubG9jYXRvcltpXSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0b3JbaV0gKz0gXCIsXCIgKyB0c3QubG9jYXRvcltpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
46184H1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3MgPiAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChuZHhJbnRsenIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNQb3MgPSBwb3MgLSAxLCB0ZXN0O1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHRlc3QgPSBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcHJldmlvdXNQb3NdIHx8IGdldE1hc2tTZXQoKS50ZXN0c1twcmV2aW91c1Bvc10pID09PSB1bmRlZmluZWQgJiYgcHJldmlvdXNQb3MgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNQb3MtLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGVzdCAhPT0gdW5kZWZpbmVkICYmIHByZXZpb3VzUG9zID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5keEluaXRpYWxpemVyID0gbWVyZ2VMb2NhdG9ycyhwcmV2aW91c1BvcywgdGVzdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZURlcGVuZGVuY3kgPSBuZHhJbml0aWFsaXplci5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFBvcyA9IHByZXZpb3VzUG9zO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChnZXRNYXNrU2V0KCkudGVzdHNbcG9zXSAmJiBnZXRNYXNrU2V0KCkudGVzdHNbcG9zXVswXS5jZCA9PT0gY2FjaGVEZXBlbmRlbmN5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRNYXNrU2V0KCkudGVzdHNbcG9zXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbXRuZHggPSBuZHhJbml0aWFsaXplci5zaGlmdCgpOyBtdG5keCA8IG1hc2tUb2tlbnMubGVuZ3RoOyBtdG5keCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IHJlc29sdmVUZXN0RnJvbVRva2VuKG1hc2tUb2tlbnNbbXRuZHhdLCBuZHhJbml0aWFsaXplciwgWyBtdG5keCBdKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoICYmIHRlc3RQb3MgPT09IHBvcyB8fCB0ZXN0UG9zID4gcG9zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCB8fCBpbnNlcnRTdG9wKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2g6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZuOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxpdHk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzaW5nOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRvcjogW10sXG4gICAgICAgICAgICAgICAgICAgIG1sb2M6IHt9LFxuICAgICAgICAgICAgICAgICAgICBjZDogY2FjaGVEZXBlbmRlbmN5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmR4SW50bHpyICE9PSB1bmRlZmluZWQgJiYgZ2V0TWFza1NldCgpLnRlc3RzW3Bvc10pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJC5leHRlbmQodHJ1ZSwgW10sIG1hdGNoZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2V0TWFza1NldCgpLnRlc3RzW3Bvc10gPSAkLmV4dGVuZCh0cnVlLCBbXSwgbWF0Y2hlcyk7XG4gICAgICAgICAgICByZXR1cm4gZ2V0TWFza1NldCgpLnRlc3RzW3Bvc107XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZ2V0QnVmZmVyVGVtcGxhdGUoKSB7XG4gICAgICAgICAgICBpZiAoZ2V0TWFza1NldCgpLl9idWZmZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS5fYnVmZmVyID0gZ2V0TWFza1RlbXBsYXRlKGZhbHNlLCAxKTtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0TWFza1NldCgpLmJ1ZmZlciA9PT0gdW5kZWZpbmVkKSBnZXRNYXNrU2V0KCkuYnVmZmVyID0gZ2V0TWFza1NldCgpLl9idWZmZXIuc2xpY2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBnZXRNYXNrU2V0KCkuX2J1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBnZXRCdWZmZXIobm9DYWNoZSkge1xuICAgICAgICAgICAgaWYgKGdldE1hc2tTZXQoKS5idWZmZXIgPT09IHVuZGVmaW5lZCB8fCBub0NhY2hlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgZ2V0TWFza1NldCgpLmJ1ZmZlciA9IGdldE1hc2tUZW1wbGF0ZSh0cnVlLCBnZXRMYXN0VmFsaWRQb3NpdGlvbigpLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0TWFza1NldCgpLl9idWZmZXIgPT09IHVuZGVmaW5lZCkgZ2V0TWFza1NldCgpLl9idWZmZXIgPSBnZXRNYXNrU2V0KCkuYnVmZmVyLnNsaWNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZ2V0TWFza1NldCgpLmJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiByZWZyZXNoRnJvbUJ1ZmZlcihzdGFydCwgZW5kLCBidWZmZXIpIHtcbiAgICAgICAgICAgIHZhciBpLCBwO1xuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcmVzZXRNYXNrU2V0KCk7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGVuZCA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwID0gc3RhcnQ7XG4gICAgICAgICAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcmVzZXRNYXNrU2V0KHRydWUpO1xuICAgICAgICAgICAgICAgIGlmIChidWZmZXJbaV0gIT09IG9wdHMuc2tpcE9wdGlvbmFsUGFydENoYXJhY3Rlcikge1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgdmFsUmVzdWx0ID0gaXNWYWxpZChwLCBidWZmZXJbaV0sIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsUmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRNYXNrU2V0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHZhbFJlc3VsdC5jYXJldCAhPT0gdW5kZWZpbmVkID8gdmFsUmVzdWx0LmNhcmV0IDogdmFsUmVzdWx0LnBvcyArIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2FzaW5nKGVsZW0sIHRlc3QsIHBvcykge1xuICAgICAgICAgICAgc3dpdGNoIChvcHRzLmNhc2luZyB8fCB0ZXN0LmNhc2luZykge1xuICAgICAgICAgICAgICBjYXNlIFwidXBwZXJcIjpcbiAgICAgICAgICAgICAgICBlbGVtID0gZWxlbS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJsb3dlclwiOlxuICAgICAgICAgICAgICAgIGVsZW0gPSBlbGVtLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSBcInRpdGxlXCI6XG4gICAgICAgICAgICAgICAgdmFyIHBvc0JlZm9yZSA9IGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1twb3MgLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAocG9zID09PSAwIHx8IHBvc0JlZm9yZSAmJiBwb3NCZWZvcmUuaW5wdXQgPT09IFN0cmluZy5mcm9tQ2hhckNvZGUoSW5wdXRtYXNrLmtleUNvZGUuU1BBQ0UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW0gPSBlbGVtLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbSA9IGVsZW0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKG9wdHMuY2FzaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBlbGVtID0gb3B0cy5jYXNpbmcuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tBbHRlcm5hdGlvbk1hdGNoKGFsdEFycjEsIGFsdEFycjIsIG5hKSB7XG4gICAgICAgICAgICB2YXIgYWx0QXJyQyA9IG9wdHMuZ3JlZWR5ID8gYWx0QXJyMiA6IGFsdEFycjIuc2xpY2UoMCwgMSksIGlzTWF0Y2ggPSBmYWxzZSwgbmFBcnIgPSBuYSAhPT0gdW5kZWZpbmVkID8gbmEuc3BsaXQoXCIsXCIpIDogW10sIG5hTmR4O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYUFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICgobmFOZHggPSBhbHRBcnIxLmluZGV4T2YobmFBcnJbaV0pKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgYWx0QXJyMS5zcGxpY2UobmFOZHgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGFsbmR4ID0gMDsgYWxuZHggPCBhbHRBcnIxLmxlbmd0aDsgYWxuZHgrKykge1xuICAgICAgICAgICAgICAgIGlmICgkLmluQXJyYXkoYWx0QXJyMVthbG5keF0sIGFsdEFyckMpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBpc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlzTWF0Y2g7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYWx0ZXJuYXRlKHBvcywgYywgc3RyaWN0LCBmcm9tU2V0VmFsaWQsIHJBbHRQb3MpIHtcbiAgICAgICAgICAgIHZhciB2YWxpZFBzQ2xvbmUgPSAkLmV4dGVuZCh0cnVlLCB7fSwgZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zKSwgbGFzdEFsdCwgYWx0ZXJuYXRpb24sIGlzVmFsaWRSc2x0ID0gZmFsc2UsIGFsdFBvcywgcHJldkFsdFBvcywgaSwgdmFsaWRQb3MsIGRlY2lzaW9uUG9zLCBsQWx0UG9zID0gckFsdFBvcyAhPT0gdW5kZWZpbmVkID8gckFsdFBvcyA6IGdldExhc3RWYWxpZFBvc2l0aW9uKCk7XG4gICAgICAgICAgICBpZiAobEFsdFBvcyA9PT0gLTEgJiYgckFsdFBvcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbGFzdEFsdCA9IDA7XG4gICAgICAgICAgICAgICAgcHJldkFsdFBvcyA9IGdldFRlc3QobGFzdEFsdCk7XG4gICAgICAgICAgICAgICAgYWx0ZXJuYXRpb24gPSBwcmV2QWx0UG9zLmFsdGVybmF0aW9uO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKDtsQWx0UG9zID49IDA7IGxBbHRQb3MtLSkge1xuICAgICAgICAgICAgICAgICAgICBhbHRQb3MgPSBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbbEFsdFBvc107XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbHRQb3MgJiYgYWx0UG9zLmFsdGVybmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2QWx0UG9zICYmIHByZXZBbHRQb3MubG9jYXRvclthbHRQb3MuYWx0ZXJuYXRpb25dICE9PSBhbHRQb3MubG9jYXRvclthbHRQb3MuYWx0ZXJuYXRpb25dKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0QWx0ID0gbEFsdFBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0aW9uID0gZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW2xhc3RBbHRdLmFsdGVybmF0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkFsdFBvcyA9IGFsdFBvcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbHRlcm5hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGVjaXNpb25Qb3MgPSBwYXJzZUludChsYXN0QWx0KTtcbiAgICAgICAgICAgICAgICBnZXRNYXNrU2V0KCkuZXhjbHVkZXNbZGVjaXNpb25Qb3NdID0gZ2V0TWFza1NldCgpLmV4Y2x1ZGVzW2RlY2lzaW9uUG9zXSB8fCBbXTtcbiAgICAgICAgICAgICAgICBpZiAocG9zICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS5leGNsdWRlc1tkZWNpc2lvblBvc10ucHVzaChnZXREZWNpc2lvblRha2VyKHByZXZBbHRQb3MpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZhbGlkSW5wdXRzQ2xvbmUgPSBbXSwgc3RhdGljSW5wdXRzQmVmb3JlUG9zID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSBkZWNpc2lvblBvczsgaSA8IGdldExhc3RWYWxpZFBvc2l0aW9uKHVuZGVmaW5lZCwgdHJ1ZSkgKyAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRQb3MgPSBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZFBvcyAmJiB2YWxpZFBvcy5nZW5lcmF0ZWRJbnB1dCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRJbnB1dHNDbG9uZS5wdXNoKHZhbGlkUG9zLmlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgcG9zKSBzdGF0aWNJbnB1dHNCZWZvcmVQb3MrKztcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKGdldE1hc2tTZXQoKS5leGNsdWRlc1tkZWNpc2lvblBvc10gJiYgZ2V0TWFza1NldCgpLmV4Y2x1ZGVzW2RlY2lzaW9uUG9zXS5sZW5ndGggPCAxMCkge1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgcG9zT2Zmc2V0ID0gc3RhdGljSW5wdXRzQmVmb3JlUG9zICogLTEsIHZhbGlkSW5wdXRzID0gdmFsaWRJbnB1dHNDbG9uZS5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICBnZXRNYXNrU2V0KCkudGVzdHNbZGVjaXNpb25Qb3NdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICByZXNldE1hc2tTZXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlzVmFsaWRSc2x0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHZhbGlkSW5wdXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9IHZhbGlkSW5wdXRzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShpc1ZhbGlkUnNsdCA9IGlzVmFsaWQoZ2V0TGFzdFZhbGlkUG9zaXRpb24odW5kZWZpbmVkLCB0cnVlKSArIDEsIGlucHV0LCBmYWxzZSwgZnJvbVNldFZhbGlkLCB0cnVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZFJzbHQgJiYgYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0THZwID0gZ2V0TGFzdFZhbGlkUG9zaXRpb24ocG9zKSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBkZWNpc2lvblBvczsgaSA8IGdldExhc3RWYWxpZFBvc2l0aW9uKCkgKyAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFBvcyA9IGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbGlkUG9zID09PSB1bmRlZmluZWQgfHwgdmFsaWRQb3MubWF0Y2guZm4gPT0gbnVsbCkgJiYgaSA8IHBvcyArIHBvc09mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NPZmZzZXQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBwb3MgKyBwb3NPZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkUnNsdCA9IGlzVmFsaWQocG9zID4gdGFyZ2V0THZwID8gdGFyZ2V0THZwIDogcG9zLCBjLCBzdHJpY3QsIGZyb21TZXRWYWxpZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkUnNsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRNYXNrU2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2QWx0UG9zID0gZ2V0VGVzdChkZWNpc2lvblBvcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgdmFsaWRQc0Nsb25lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRNYXNrU2V0KCkuZXhjbHVkZXNbZGVjaXNpb25Qb3NdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlY2lzaW9uVGFrZXIgPSBnZXREZWNpc2lvblRha2VyKHByZXZBbHRQb3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRNYXNrU2V0KCkuZXhjbHVkZXNbZGVjaXNpb25Qb3NdLmluZGV4T2YoZGVjaXNpb25UYWtlcikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVmFsaWRSc2x0ID0gYWx0ZXJuYXRlKHBvcywgYywgc3RyaWN0LCBmcm9tU2V0VmFsaWQsIGRlY2lzaW9uUG9zIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNYXNrU2V0KCkuZXhjbHVkZXNbZGVjaXNpb25Qb3NdLnB1c2goZGVjaXNpb25UYWtlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gZGVjaXNpb25Qb3M7IGkgPCBnZXRMYXN0VmFsaWRQb3NpdGlvbih1bmRlZmluZWQsIHRydWUpICsgMTsgaSsrKSBkZWxldGUgZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkUnNsdCA9IGFsdGVybmF0ZShwb3MsIGMsIHN0cmljdCwgZnJvbVNldFZhbGlkLCBkZWNpc2lvblBvcyAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2V0TWFza1NldCgpLmV4Y2x1ZGVzW2RlY2lzaW9uUG9zXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkUnNsdDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc1ZhbGlkKHBvcywgYywgc3RyaWN0LCBmcm9tU2V0VmFsaWQsIGZyb21BbHRlcm5hdGUsIHZhbGlkYXRlT25seSkge1xuICAgICAgICAgICAgZnVuY3Rpb24gaXNTZWxlY3Rpb24ocG9zT2JqKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzUlRMID8gcG9zT2JqLmJlZ2luIC0gcG9zT2JqLmVuZCA+IDEgfHwgcG9zT2JqLmJlZ2luIC0gcG9zT2JqLmVuZCA9PT0gMSA6IHBvc09iai5lbmQgLSBwb3NPYmouYmVnaW4gPiAxIHx8IHBvc09iai5lbmQgLSBwb3NPYmouYmVnaW4gPT09IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHJpY3QgPSBzdHJpY3QgPT09IHRydWU7XG4gICAgICAgICAgICB2Y
46184XIgbWFza1BvcyA9IHBvcztcbiAgICAgICAgICAgIGlmIChwb3MuYmVnaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1hc2tQb3MgPSBpc1JUTCA/IHBvcy5lbmQgOiBwb3MuYmVnaW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBfaXNWYWxpZChwb3NpdGlvbiwgYywgc3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHJzbHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAkLmVhY2goZ2V0VGVzdHMocG9zaXRpb24pLCBmdW5jdGlvbihuZHgsIHRzdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGVzdCA9IHRzdC5tYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgZ2V0QnVmZmVyKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByc2x0ID0gdGVzdC5mbiAhPSBudWxsID8gdGVzdC5mbi50ZXN0KGMsIGdldE1hc2tTZXQoKSwgcG9zaXRpb24sIHN0cmljdCwgb3B0cywgaXNTZWxlY3Rpb24ocG9zKSkgOiAoYyA9PT0gdGVzdC5kZWYgfHwgYyA9PT0gb3B0cy5za2lwT3B0aW9uYWxQYXJ0Q2hhcmFjdGVyKSAmJiB0ZXN0LmRlZiAhPT0gXCJcIiA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGM6IGdldFBsYWNlaG9sZGVyKHBvc2l0aW9uLCB0ZXN0LCB0cnVlKSB8fCB0ZXN0LmRlZixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvczogcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgfSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocnNsdCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbGVtID0gcnNsdC5jICE9PSB1bmRlZmluZWQgPyByc2x0LmMgOiBjLCB2YWxpZGF0ZWRQb3MgPSBwb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0gPSBlbGVtID09PSBvcHRzLnNraXBPcHRpb25hbFBhcnRDaGFyYWN0ZXIgJiYgdGVzdC5mbiA9PT0gbnVsbCA/IGdldFBsYWNlaG9sZGVyKHBvc2l0aW9uLCB0ZXN0LCB0cnVlKSB8fCB0ZXN0LmRlZiA6IGVsZW07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnNsdC5yZW1vdmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJC5pc0FycmF
461845KHJzbHQucmVtb3ZlKSkgcnNsdC5yZW1vdmUgPSBbIHJzbHQucmVtb3ZlIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHJzbHQucmVtb3ZlLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYiAtIGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uKG5keCwgbG1udCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZhbGlkYXRlTWFzayh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbG1udCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbG1udCArIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnNsdC5pbnNlcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJC5pc0FycmF5KHJzbHQuaW5zZXJ0KSkgcnNsdC5pbnNlcnQgPSBbIHJzbHQuaW5zZXJ0IF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHJzbHQuaW5zZXJ0LnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSAtIGI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uKG5keCwgbG1udCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkKGxtbnQucG9zLCBsbW50LmMsIHRydWUsIGZyb21TZXRWYWxpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnNsdCAhPT0gdHJ1ZSAmJiByc2x0LnBvcyAhPT0gdW5kZWZpbmVkICYmIHJzbHQucG9zICE9PSBwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBvcyA9IHJzbHQucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJzbHQgIT09IHRydWUgJiYgcnNsdC5wb3MgPT09IHVuZGVmaW5lZCAmJiByc2x0LmMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmV2YWxpZGF0ZU1hc2socG9zLCAkLmV4dGVuZCh7fSwgdHN0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IGNhc2luZyhlbGVtLCB0ZXN0LCB2YWxpZGF0ZWRQb3MpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSwgZnJvbVNldFZhbGlkLCB2YWxpZGF0ZWRQb3MpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNsdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJzbHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2Y
46184XIgcmVzdWx0ID0gdHJ1ZSwgcG9zaXRpb25zQ2xvbmUgPSAkLmV4dGVuZCh0cnVlLCB7fSwgZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zKTtcbiAgICAgICAgICAgIGlmICgkLmlzRnVuY3Rpb24ob3B0cy5wcmVWYWxpZGF0aW9uKSAmJiAhc3RyaWN0ICYmIGZyb21TZXRWYWxpZCAhPT0gdHJ1ZSAmJiB2YWxpZGF0ZU9ubHkgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBvcHRzLnByZVZhbGlkYXRpb24oZ2V0QnVmZmVyKCksIG1hc2tQb3MsIGMsIGlzU2VsZWN0aW9uKHBvcyksIG9wdHMsIGdldE1hc2tTZXQoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdHJhY2tiYWNrUG9zaXRpb25zKHVuZGVmaW5lZCwgbWFza1BvcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKG1heExlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IG1hc2tQb3MgPCBtYXhMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2lzVmFsaWQobWFza1BvcywgYywgc3RyaWN0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCghc3RyaWN0IHx8IGZyb21TZXRWYWxpZCA9PT0gdHJ1ZSkgJiYgcmVzdWx0ID09PSBmYWxzZSAmJiB2YWxpZGF0ZU9ubHkgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50UG9zVmFsaWQgPSBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbbWFza1Bvc107XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFBvc1ZhbGlkICYmIGN1cnJlbnRQb3NWYWxpZC5tYXRjaC5mbiA9PT0gbnVsbCAmJiAoY3VycmVudFBvc1ZhbGlkLm1hdGNoLmRlZiA9PT0gYyB8fCBjID09PSBvcHRzLnNraXBPcHRpb25hbFBhcnRDaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJldDogc2Vla05leHQobWFza1BvcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG9wdHMuaW5zZXJ0TW9kZSB8fCBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbc2Vla05leHQobWFza1BvcyldID09PSB1bmRlZmluZWQpICYmICghaXNNYXNrKG1hc2tQb3MsIHRydWUpIHx8IGdldE1hc2tTZXQoKS5qaXRPZmZzZXRbbWFza1Bvc10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRNYXNrU2V0KCkuaml0T2Zmc2V0W21hc2tQb3NdICYmIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1tzZWVrTmV4dChtYXNrUG9zKV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNWYWxpZChtYXNrUG9zICsgZ2V0TWFza1NldCgpLmppdE9mZnNldFttYXNrUG9zXSwgYywgc3RyaWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IGZhbHNlKSByZXN1bHQuY2FyZXQgPSBtYXNrUG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgZm9yICh2YXIgblBvcyA9IG1hc2tQb3MgKyAxLCBzblBvcyA9IHNlZWtOZXh0KG1hc2tQb3MpOyBuUG9zIDw9IHNuUG9zOyBuUG9zKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9pc1ZhbGlkKG5Qb3MsIGMsIHN0cmljdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRyYWNrYmFja1Bvc2l0aW9ucyhtYXNrUG9zLCByZXN1bHQucG9zICE9PSB1bmRlZmluZWQgPyByZXN1bHQucG9zIDogblBvcykgfHwgcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tQb3MgPSBuUG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlICYmIG9wdHMua2VlcFN0YXRpYyAhPT0gZmFsc2UgJiYgKG9wdHMucmVnZXggPT0gbnVsbCB8fCBpc0NvbXBsZXRlKGdldEJ1ZmZlcigpKSkgJiYgIXN0cmljdCAmJiBmcm9tQWx0ZXJuYXRlICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsdGVybmF0ZShtYXNrUG9zLCBjLCBzdHJpY3QsIGZyb21TZXRWYWxpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zOiBtYXNrUG9zXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCQuaXNGdW5jdGlvbihvcHRzLnBvc3RWYWxpZGF0aW9uKSAmJiByZXN1bHQgIT09IGZhbHNlICYmICFzdHJpY3QgJiYgZnJvbVNldFZhbGlkICE9PSB0cnVlICYmIHZhbGlkYXRlT25seSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBwb3N0UmVzdWx0ID0gb3B0cy5wb3N0VmFsaWRhdGlvbihnZXRCdWZmZXIodHJ1ZSksIHBvcy5iZWdpbiAhPT0gdW5kZWZpbmVkID8gaXNSVEwgPyBwb3MuZW5kIDogcG9zLmJlZ2luIDogcG9zLCByZXN1bHQsIG9wdHMpO1xuICAgICAgICAgICAgICAgIGlmIChwb3N0UmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RSZXN1bHQucmVmcmVzaEZyb21CdWZmZXIgJiYgcG9zdFJlc3VsdC5idWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgI
46184HZhciByZWZyZXNoID0gcG9zdFJlc3VsdC5yZWZyZXNoRnJvbUJ1ZmZlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hGcm9tQnVmZmVyKHJlZnJlc2ggPT09IHRydWUgPyByZWZyZXNoIDogcmVmcmVzaC5zdGFydCwgcmVmcmVzaC5lbmQsIHBvc3RSZXN1bHQuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwb3N0UmVzdWx0ID09PSB0cnVlID8gcmVzdWx0IDogcG9zdFJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5wb3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wb3MgPSBtYXNrUG9zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UgfHwgdmFsaWRhdGVPbmx5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcmVzZXRNYXNrU2V0KHRydWUpO1xuICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBwb3NpdGlvbnNDbG9uZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHRyYWNrYmFja1Bvc2l0aW9ucyhvcmlnaW5hbFBvcywgbmV3UG9zLCBmaWxsT25seSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbFBvcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChvcmlnaW5hbFBvcyA9IG5ld1BvcyAtIDE7IG9yaWdpbmFsUG9zID4gMDsgb3JpZ2luYWxQb3MtLSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW29yaWdpbmFsUG9zXSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgcHMgPSBvcmlnaW5hbFBvczsgcHMgPCBuZXdQb3M7IHBzKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW3BzXSA9PT0gdW5kZWZpbmVkICYmICFpc01hc2socHMsIHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2cCA9IHBzID09IDAgPyBnZXRUZXN0KHBzKSA6IGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1twcyAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodnApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXN0cyA9IGdldFRlc3RzKHBzKS5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RzW3Rlc3RzLmxlbmd0aCAtIDFdLm1hdGNoLmRlZiA9PT0gXCJcIikgdGVzdHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgYmVzdE1hdGNoID0gZGV0ZXJtaW5lVGVzdFRlbXBsYXRlKHBzLCB0ZXN0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2ggPSAkLmV4dGVuZCh7fSwgYmVzdE1hdGNoLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IGdldFBsYWNlaG9sZGVyKHBzLCBiZXN0TWF0Y2gubWF0Y2gsIHRydWUpIHx8IGJlc3RNYXRjaC5tYXRjaC5kZWZcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmdlbmVyYXRlZElucHV0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldmFsaWRhdGVNYXNrKHBzLCBiZXN0TWF0Y2gsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGxPbmx5ICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN2cElucHV0ID0gZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW25ld1Bvc10uaW5wdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW25ld1Bvc10gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNWYWxpZChuZXdQb3MsIGN2cElucHV0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmV2YWxpZGF0ZU1hc2socG9zLCB2YWxpZFRlc3QsIGZyb21TZXRWYWxpZCwgdmFsaWRhdGVkUG9zKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBJc0VuY2xvc2VkU3RhdGljKHBvcywgdmFsaWRzLCBzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB2Y
46184XIgcG9zTWF0Y2ggPSB2YWxpZHNbcG9zXTtcbiAgICAgICAgICAgICAgICBpZiAocG9zTWF0Y2ggIT09IHVuZGVmaW5lZCAmJiAocG9zTWF0Y2gubWF0Y2guZm4gPT09IG51bGwgJiYgcG9zTWF0Y2gubWF0Y2gub3B0aW9uYWxpdHkgIT09IHRydWUgfHwgcG9zTWF0Y2guaW5wdXQgPT09IG9wdHMucmFkaXhQb2ludCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZNYXRjaCA9IHNlbGVjdGlvbi5iZWdpbiA8PSBwb3MgLSAxID8gdmFsaWRzW3BvcyAtIDFdICYmIHZhbGlkc1twb3MgLSAxXS5tYXRjaC5mbiA9PT0gbnVsbCAmJiB2YWxpZHNbcG9zIC0gMV0gOiB2YWxpZHNbcG9zIC0gMV0sIG5leHRNYXRjaCA9IHNlbGVjdGlvbi5lbmQgPiBwb3MgKyAxID8gdmFsaWRzW3BvcyArIDFdICYmIHZhbGlkc1twb3MgKyAxXS5tYXRjaC5mbiA9PT0gbnVsbCAmJiB2YWxpZHNbcG9zICsgMV0gOiB2YWxpZHNbcG9zICsgMV07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2TWF0Y2ggJiYgbmV4dE1hdGNoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYmVnaW4gPSBwb3MuYmVnaW4gIT09IHVuZGVmaW5lZCA/IHBvcy5iZWdpbiA6IHBvcywgZW5kID0gcG9zLmVuZCAhPT0gdW5kZWZpbmVkID8gcG9zLmVuZCA6IHBvcztcbiAgICAgICAgICAgIGlmIChwb3MuYmVnaW4gPiBwb3MuZW5kKSB7XG4gICAgICAgICAgICAgICAgYmVnaW4gPSBwb3MuZW5kO1xuICAgICAgICAgICAgICAgIGVuZCA9IHBvcy5iZWdpbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbGlkYXRlZFBvcyA9IHZhbGlkYXRlZFBvcyAhPT0gdW5kZWZpbmVkID8gdmFsaWRhdGVkUG9zIDogYmVnaW47XG4gICAgICAgICAgICBpZiAoYmVnaW4gIT09IGVuZCB8fCBvcHRzLmluc2VydE1vZGUgJiYgZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW3ZhbGlkYXRlZFBvc10gIT09IHVuZGVmaW5lZCAmJiBmcm9tU2V0VmFsaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhciBwb3NpdGlvbnNDbG9uZSA9ICQuZXh0ZW5kKHRydWUsIHt9LCBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnMpLCBsdnAgPSBnZXRMYXN0VmFsaWRQb3NpdGlvbih1bmRlZmluZWQsIHRydWUpLCBpO1xuICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS5wID0gYmVnaW47XG4gICAgICAgICAgICAgICAgZm9yIChpID0gbHZwOyBpID49IGJlZ2luOyBpLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1tpXSAmJiBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbaV0ubWF0Y2gubmF0aXZlRGVmID09PSBcIitcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5pc05lZ2F0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZSwgaiA9IHZhbGlkYXRlZFBvcywgdnBzID0gZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zLCBuZWVkc1ZhbGlkYXRpb24gPSBmYWxzZSwgcG9zTWF0Y2ggPSBqLCBpID0gajtcbiAgICAgICAgICAgICAgICBpZiAodmFsaWRUZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1t2YWxpZGF0ZWRQb3NdID0gJC5leHRlbmQodHJ1ZSwge30sIHZhbGlkVGVzdCk7XG4gICAgICAgICAgICAgICAgICAgIHBvc01hdGNoKys7XG4gICAgICAgICAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlZ2luIDwgZW5kKSBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoO2kgPD0gbHZwOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBwb3NpdGlvbnNDbG9uZVtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgIT09IHVuZGVmaW5lZCAmJiAoaSA+PSBlbmQgfHwgaSA+PSBiZWdpbiAmJiB0LmdlbmVyYXRlZElucHV0ICE9PSB0cnVlICYmIElzRW5jbG9zZWRTdGF0aWMoaSwgcG9zaXRpb25zQ2xvbmUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBiZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogZW5kXG4gICAgICAgICAgICAgICAgICAgIH0pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGdldFRlc3QocG9zTWF0Y2gpLm1hdGNoLmRlZiAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkc1ZhbGlkYXRpb24gPT09IGZhbHNlICYmIHBvc2l0aW9uc0Nsb25lW3Bvc01hdGNoXSAmJiBwb3NpdGlvbnNDbG9uZVtwb3NNYXRjaF0ubWF0Y2gubmF0aXZlRGVmID09PSB0Lm1hdGNoLm5hdGl2ZURlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zTWF0Y2hdID0gJC5leHRlbmQodHJ1ZSwge30sIHBvc2l0aW9uc0Nsb25lW3Bvc01hdGNoXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1twb3NNYXRjaF0uaW5wdXQgPSB0LmlucHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2JhY2tQb3NpdGlvbnModW5kZWZpbmVkLCBwb3NNYXRjaCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBwb3NNYXRjaCArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdHMuc2hpZnRQb3NpdGlvbnMgJiYgcG9zaXRpb25DYW5NYXRjaERlZmluaXRpb24ocG9zTWF0Y2gsIHQubWF0Y2guZGVmKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgcmVzdWx0ID0gaXNWYWxpZChwb3NNYXRjaCwgdC5pbnB1dCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gcmVzdWx0ICE9PSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IHJlc3VsdC5jYXJldCB8fCByZXN1bHQuaW5zZXJ0ID8gZ2V0TGFzdFZhbGlkUG9zaXRpb24oKSA6IHBvc01hdGNoICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHNWYWxpZGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHQuZ2VuZXJhdGVkSW5wdXQgPT09IHRydWUgfHwgdC5pbnB1dCA9PT0gb3B0cy5yYWRpeFBvaW50ICYmIG9wdHMubnVtZXJpY0lucHV0ID09PSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFsaWQgJiYgcG9zTWF0Y2ggPiBlbmQgJiYgaXNNYXNrKHBvc01hdGNoLCB0cnVlKSAmJiAodC5tYXRjaC5mbiAhPT0gbnVsbCB8fCBwb3NNYXRjaCA+IGdldE1hc2tTZXQoKS5tYXNrTGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zTWF0Y2grKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRUZXN0KHBvc01hdGNoKS5tYXRjaC5kZWYgPT0gXCJcIikgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc01hdGNoID0gajtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbGlkKSBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZCkge1xuICAgICAgICAgICAgICAgICAgICBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgcG9zaXRpb25zQ2xvbmUpO1xuICAgICAgICAgICAgICAgICAgICByZXNldE1hc2tTZXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbGlkVGVzdCkge1xuICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1t2YWxpZGF0ZWRQb3NdID0gJC5leHRlbmQodHJ1ZSwge30sIHZhbGlkVGVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNldE1hc2tTZXQodHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc01hc2socG9zLCBzdHJpY3QpIHtcbiAgICAgICAgICAgIHZhciB0ZXN0ID0gZ2V0VGVzdFRlbXBsYXRlKHBvcykubWF0Y2g7XG4gICAgICAgICAgICBpZiAodGVzdC5kZWYgPT09IFwiXCIpIHRlc3QgPSBnZXRUZXN0KHBvcykubWF0Y2g7XG4gICAgICAgICAgICBpZiAodGVzdC5mbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRlc3QuZm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RyaWN0ICE9PSB0cnVlICYmIHBvcyA+IC0xKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRlc3RzID0gZ2V0VGVzdHMocG9zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdHMubGVuZ3RoID4gMSArICh0ZXN0c1t0ZXN0cy5sZW5ndGggLSAxXS5tYXRjaC5kZWYgPT09IFwiXCIgPyAxIDogMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2Vla05leHQocG9zLCBuZXdCbG9jaykge1xuICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gcG9zICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChnZXRUZXN0KHBvc2l0aW9uKS5tYXRjaC5kZWYgIT09IFwiXCIgJiYgKG5ld0Jsb2NrID09PSB0cnVlICYmIChnZXRUZXN0KHBvc2l0aW9uKS5tYXRjaC5uZXdCbG9ja01hcmtlciAhPT0gdHJ1ZSB8fCAhaXNNYXNrKHBvc2l0aW9uKSkgfHwgbmV3QmxvY2sgIT09IHRydWUgJiYgIWlzTWFzayhwb3NpdGlvbikpKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb24rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZWVrUHJldmlvdXMocG9zLCBuZXdCbG9jaykge1xuICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gcG9zLCB0ZXN0cztcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8PSAwKSByZXR1cm4gMDtcbiAgICAgICAgICAgIHdoaWxlICgtLXBvc2l0aW9uID4gMCAmJiAobmV3QmxvY2sgPT09IHRydWUgJiYgZ2V0VGVzdChwb3NpdGlvbikubWF0Y2gubmV3QmxvY2tNYXJrZXIgIT09IHRydWUgfHwgbmV3QmxvY2sgIT09IHRydWUgJiYgIWlzTWFzayhwb3NpdGlvbikgJiYgKHRlc3RzID0gZ2V0VGVzdHMocG9zaXRpb24pLCBcbiAgICAgICAgICAgIHRlc3RzLmxlbmd0aCA8IDIgfHwgdGVzdHMubGVuZ3RoID09PSAyICYmIHRlc3RzWzFdLm1hdGNoLmRlZiA9PT0gXCJcIikpKSB7fVxuICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHdyaXRlQnVmZmVyKGlucHV0LCBidWZmZXIsIGNhcmV0UG9zLCBldmVudCwgdHJpZ2dlckV2ZW50cykge1xuICAgICAgICAgICAgaWYgKGV2ZW50ICYmICQuaXNGdW5jdGlvbihvcHRzLm9uQmVmb3JlV3JpdGUpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG9wdHMub25CZWZvcmVXcml0ZS5jYWxsKGlucHV0bWFzaywgZXZlbnQsIGJ1ZmZlciwgY2FyZXRQb3MsIG9wdHMpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZWZyZXNoRnJvbUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlZnJlc2ggPSByZXN1bHQucmVmcmVzaEZyb21CdWZmZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoRnJvbUJ1ZmZlcihyZWZyZXNoID09PSB0cnVlID8gcmVmcmVzaCA6IHJlZnJlc2guc3RhcnQsIHJlZnJlc2guZW5kLCByZXN1bHQuYnVmZmVyIHx8IGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBnZXRCdWZmZXIodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgI
46184H1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhcmV0UG9zICE9PSB1bmRlZmluZWQpIGNhcmV0UG9zID0gcmVzdWx0LmNhcmV0ICE9PSB1bmRlZmluZWQgPyByZXN1bHQuY2FyZXQgOiBjYXJldFBvcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5wdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlucHV0LmlucHV0bWFzay5fdmFsdWVTZXQoYnVmZmVyLmpvaW4oXCJcIikpO1xuICAgICAgICAgICAgICAgIGlmIChjYXJldFBvcyAhPT0gdW5kZWZpbmVkICYmIChldmVudCA9PT0gdW5kZWZpbmVkIHx8IGV2ZW50LnR5cGUgIT09IFwiYmx1clwiKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXJldChpbnB1dCwgY2FyZXRQb3MpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSByZW5kZXJDb2xvck1hc2soaW5wdXQsIGNhcmV0UG9zLCBidWZmZXIubGVuZ3RoID09PSAwKTtcbiAgICAgICAgICAgICAgICBpZiAodHJpZ2dlckV2ZW50cyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgJGlucHV0ID0gJChpbnB1dCksIG5wdFZhbCA9IGlucHV0LmlucHV0bWFzay5fdmFsdWVHZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgc2tpcElucHV0RXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAkaW5wdXQudHJpZ2dlcihcImlucHV0XCIpO1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5wdFZhbCA9PT0gZ2V0QnVmZmVyVGVtcGxhdGUoKS5qb2luKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlucHV0LnRyaWdnZXIoXCJjbGVhcmVkXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0NvbXBsZXRlKGJ1ZmZlcikgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5wdXQudHJpZ2dlcihcImNvbXBsZXRlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZ2V0UGxhY2Vob2xkZXIocG9zLCB0ZXN0LCByZXR1cm5QTCkge1xuICAgICAgICAgICAgdGVzdCA9IHRlc3QgfHwgZ2V0VGVzdChwb3MpLm1hdGNoO1xuICAgICAgICAgICAgaWYgKHRlc3QucGxhY2Vob2xkZXIgIT09IHVuZGVmaW5lZCB8fCByZXR1cm5QTCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAkLmlzRnVuY3Rpb24odGVzdC5wbGFjZWhvbGRlcikgPyB0ZXN0LnBsYWNlaG9sZGVyKG9wdHMpIDogdGVzdC5wbGFjZWhvbGRlcjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGVzdC5mbiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChwb3MgPiAtMSAmJiBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZXN0cyA9IGdldFRlc3RzKHBvcyksIHN0YXRpY0FsdGVybmF0aW9ucyA9IFtdLCBwcmV2VGVzdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RzLmxlbmd0aCA+IDEgKyAodGVzdHNbdGVzdHMubGVuZ3RoIC0gMV0ubWF0Y2guZGVmID09PSBcIlwiID8gMSA6IDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRlc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RzW2ldLm1hdGNoLm9wdGlvbmFsaXR5ICE9PSB0cnVlICYmIHRlc3RzW2ldLm1hdGNoLm9wdGlvbmFsUXVhbnRpZmllciAhPT0gdHJ1ZSAmJiAodGVzdHNbaV0ubWF0Y2guZm4gPT09IG51bGwgfHwgKHByZXZUZXN0ID09PSB1bmRlZmluZWQgfHwgdGVzdHNbaV0ubWF0Y2guZm4udGVzdChwcmV2VGVzdC5tYXRjaC5kZWYsIGdldE1hc2tTZXQoKSwgcG9zLCB0cnVlLCBvcHRzKSAhPT0gZmFsc2UpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNBbHRlcm5hdGlvbnMucHVzaCh0ZXN0c1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0c1tpXS5tYXRjaC5mbiA9PT0gbnVsbCkgcHJldlRlc3QgPSB0ZXN0c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRpY0FsdGVybmF0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoL1swLTlhLWJBLVpdLy50ZXN0KHN0YXRpY0FsdGVybmF0aW9uc1swXS5tYXRjaC5kZWYpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdHMucGxhY2Vob2xkZXIuY2hhckF0KHBvcyAlIG9wdHMucGxhY2Vob2xkZXIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdC5kZWY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3B0cy5wbGFjZWhvbGRlci5jaGFyQXQocG9zICUgb3B0cy5wbGFjZWhvbGRlci5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIEhhbmRsZU5hdGl2ZVBsYWNlaG9sZGVyKG5wdCwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChpZSkge1xuICAgICAgICAgICAgICAgIGlmIChucHQuaW5wdXRtYXNrLl92YWx1ZUdldCgpICE9PSB2YWx1ZSAmJiAobnB0LnBsYWNlaG9sZGVyICE9PSB2YWx1ZSB8fCBucHQucGxhY2Vob2xkZXIgPT09IFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBidWZmZXIgPSBnZXRCdWZmZXIoKS5zbGljZSgpLCBucHRWYWx1ZSA9IG5wdC5pbnB1dG1hc2suX3ZhbHVlR2V0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChucHRWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgI
46184HZhciBsdnAgPSBnZXRMYXN0VmFsaWRQb3NpdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGx2cCA9PT0gLTEgJiYgbnB0VmFsdWUgPT09IGdldEJ1ZmZlclRlbXBsYXRlKCkuam9pbihcIlwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsdnAgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJPcHRpb25hbFRhaWwoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQnVmZmVyKG5wdCwgYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobnB0LnBsYWNlaG9sZGVyICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIG5wdC5wbGFjZWhvbGRlciA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChucHQucGxhY2Vob2xkZXIgPT09IFwiXCIpIG5wdC5yZW1vdmVBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgRXZlbnRSdWxlciA9IHtcbiAgICAgICAgICAgIG9uOiBmdW5jdGlvbihpbnB1dCwgZXZlbnROYW1lLCBldmVudEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXYgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuaW5wdXRtYXNrID09PSB1bmRlZmluZWQgJiYgdGhpcy5ub2RlTmFtZSAhPT0gXCJGT1JNXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbU9wdHMgPSAkLmRhdGEodGhhdCwgXCJfaW5wdXRtYXNrX29wdHNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1PcHRzKSBuZXcgSW5wdXRtYXNrKGltT3B0cykubWFzayh0aGF0KTsgZWxzZSBFdmVudFJ1bGVyLm9mZih0aGF0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLnR5cGUgIT09IFwic2V0dmFsdWVcIiAmJiB0aGlzLm5vZGVOYW1lICE9PSBcIkZPUk1cIiAmJiAodGhhdC5kaXNhYmxlZCB8fCB0aGF0LnJlYWRPbmx5ICYmICEoZS50eXBlID09PSBcImtleWRvd25cIiAmJiAoZS5jdHJsS2V5ICYmIGUua2V5Q29kZSA9PT0gNjcpIHx8IG9wdHMudGFiVGhyb3VnaCA9PT0gZmFsc2UgJiYgZS5rZXlDb2RlID09PSBJbnB1dG1hc2sua2V5Q29kZS5UQUIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImlucHV0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBJbnB1dEV2ZW50ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBJbnB1dEV2ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudEhhbmRsZXIuYXBwbHkodGhhdCwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJldCh0aGF0LCB0aGF0LmlucHV0bWFzay5jYXJldFBvcywgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImtleWRvd25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwS2V5UHJlc3NFdmVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBJbnB1dEV2ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImtleXByZXNzXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBLZXlQcmVzc0V2ZW50ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBLZXlQcmVzc0V2ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiY2xpY2tcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWVtb2JpbGUgfHwgaXBob25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRIYW5kbGVyLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgI
46184HZhciByZXR1cm5WYWwgPSBldmVudEhhbmRsZXIuYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5WYWwgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpbnB1dC5pbnB1dG1hc2suZXZlbnRzW2V2ZW50TmFtZV0gPSBpbnB1dC5pbnB1dG1hc2suZXZlbnRzW2V2ZW50TmFtZV0gfHwgW107XG4gICAgICAgICAgICAgICAgaW5wdXQuaW5wdXRtYXNrLmV2ZW50c1tldmVudE5hbWVdLnB1c2goZXYpO1xuICAgICAgICAgICAgICAgIGlmICgkLmluQXJyYXkoZXZlbnROYW1lLCBbIFwic3VibWl0XCIsIFwicmVzZXRcIiBdKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmZvcm0gIT09IG51bGwpICQoaW5wdXQuZm9ybSkub24oZXZlbnROYW1lLCBldik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJChpbnB1dCkub24oZXZlbnROYW1lLCBldik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9mZjogZnVuY3Rpb24oaW5wdXQsIGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmlucHV0bWFzayAmJiBpbnB1dC5pbnB1dG1hc2suZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBldmVudHM7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNbZXZlbnRdID0gaW5wdXQuaW5wdXRtYXNrLmV2ZW50c1tldmVudF07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBpbnB1dC5pbnB1dG1hc2suZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICQuZWFjaChldmVudHMsIGZ1bmN0aW9uKGV2ZW50TmFtZSwgZXZBcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChldkFyci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2ID0gZXZBcnIucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQuaW5BcnJheShldmVudE5hbWUsIFsgXCJzdWJtaXRcIiwgXCJyZXNldFwiIF0pICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZm9ybSAhPT0gbnVsbCkgJChpbnB1dC5mb3JtKS5vZmYoZXZlbnROYW1lLCBldik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChpbnB1dCkub2ZmKGV2ZW50TmFtZSwgZXYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpbnB1dC5pbnB1dG1hc2suZXZlbnRzW2V2ZW50TmFtZV07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIEV2ZW50SGFuZGxlcnMgPSB7XG4gICAgICAgICAgICBrZXlkb3duRXZlbnQ6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICB2Y
46184XIgaW5wdXQgPSB0aGlzLCAkaW5wdXQgPSAkKGlucHV0KSwgayA9IGUua2V5Q29kZSwgcG9zID0gY2FyZXQoaW5wdXQpO1xuICAgICAgICAgICAgICAgIGlmIChrID09PSBJbnB1dG1hc2sua2V5Q29kZS5CQUNLU1BBQ0UgfHwgayA9PT0gSW5wdXRtYXNrLmtleUNvZGUuREVMRVRFIHx8IGlwaG9uZSAmJiBrID09PSBJbnB1dG1hc2sua2V5Q29kZS5CQUNLU1BBQ0VfU0FGQVJJIHx8IGUuY3RybEtleSAmJiBrID09PSBJbnB1dG1hc2sua2V5Q29kZS5YICYmICFpc0lucHV0RXZlbnRTdXBwb3J0ZWQoXCJjdXRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVSZW1vdmUoaW5wdXQsIGssIHBvcyk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlQnVmZmVyKGlucHV0LCBnZXRCdWZmZXIodHJ1ZSksIGdldE1hc2tTZXQoKS5wLCBlLCBpbnB1dC5pbnB1dG1hc2suX3ZhbHVlR2V0KCkgIT09IGdldEJ1ZmZlcigpLmpvaW4oXCJcIikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoayA9PT0gSW5wdXRtYXNrLmtleUNvZGUuRU5EIHx8IGsgPT09IElucHV0bWFzay5rZXlDb2RlLlBBR0VfRE9XTikge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjYXJldFBvcyA9IHNlZWtOZXh0KGdldExhc3RWYWxpZFBvc2l0aW9uKCkpO1xuICAgICAgICAgICAgICAgICAgICBjYXJldChpbnB1dCwgZS5zaGlmdEtleSA/IHBvcy5iZWdpbiA6IGNhcmV0UG9zLCBjYXJldFBvcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrID09PSBJbnB1dG1hc2sua2V5Q29kZS5IT01FICYmICFlLnNoaWZ0S2V5IHx8IGsgPT09IElucHV0bWFzay5rZXlDb2RlLlBBR0VfVVApIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBjYXJldChpbnB1dCwgMCwgZS5zaGlmdEtleSA/IHBvcy5iZWdpbiA6IDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKG9wdHMudW5kb09uRXNjYXBlICYmIGsgPT09IElucHV0bWFzay5rZXlDb2RlLkVTQ0FQRSB8fCBrID09PSA5MCAmJiBlLmN0cmxLZXkpICYmIGUuYWx0S2V5ICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrVmFsKGlucHV0LCB0cnVlLCBmYWxzZSwgdW5kb1ZhbHVlLnNwbGl0KFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgJGlucHV0LnRyaWdnZXIoXCJjbGlja1wiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGsgPT09IElucHV0bWFzay5rZXlDb2RlLklOU0VSVCAmJiAhKGUuc2hpZnRLZXkgfHwgZS5jdHJsS2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBvcHRzLmluc2VydE1vZGUgPSAhb3B0cy5pbnNlcnRNb2RlO1xuICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJpbS1pbnNlcnRcIiwgb3B0cy5pbnNlcnRNb2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdHMudGFiVGhyb3VnaCA9PT0gdHJ1ZSAmJiBrID09PSBJbnB1dG1hc2sua2V5Q29kZS5UQUIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRUZXN0KHBvcy5iZWdpbikubWF0Y2guZm4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MuYmVnaW4gPSBzZWVrTmV4dChwb3MuYmVnaW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zLmVuZCA9IHNlZWtQcmV2aW91cyhwb3MuYmVnaW4sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zLmJlZ2luID0gc2Vla1ByZXZpb3VzKHBvcy5lbmQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zLmJlZ2luID0gc2Vla05leHQocG9zLmJlZ2luLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcy5lbmQgPSBzZWVrTmV4dChwb3MuYmVnaW4sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcy5lbmQgPCBnZXRNYXNrU2V0KCkubWFza0xlbmd0aCkgcG9zLmVuZC0tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MuYmVnaW4gPCBnZXRNYXNrU2V0KCkubWFza0xlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQoaW5wdXQsIHBvcy5iZWdpbiwgcG9zLmVuZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3B0cy5vbktleURvd24uY2FsbCh0aGlzLCBlLCBnZXRCdWZmZXIoKSwgY2FyZXQoaW5wdXQpLmJlZ2luLCBvcHRzKTtcbiAgICAgICAgICAgICAgICBpZ25vcmFibGUgPSAkLmluQXJyYXkoaywgb3B0cy5pZ25vcmFibGVzKSAhPT0gLTE7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAga2V5cHJlc3NFdmVudDogZnVuY3Rpb24oZSwgY2hlY2t2YWwsIHdyaXRlT3V0LCBzdHJpY3QsIG5keCkge1xuICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9IHRoaXMsICRpbnB1dCA9ICQoaW5wdXQpLCBrID0gZS53aGljaCB8fCBlLmNoYXJDb2RlIHx8IGUua2V5Q29kZTtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2t2YWwgIT09IHRydWUgJiYgKCEoZS5jdHJsS2V5ICYmIGUuYWx0S2V5KSAmJiAoZS5jdHJsS2V5IHx8IGUubWV0YUtleSB8fCBpZ25vcmFibGUpKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoayA9PT0gSW5wdXRtYXNrLmtleUNvZGUuRU5URVIgJiYgdW5kb1ZhbHVlICE9PSBnZXRCdWZmZXIoKS5qb2luKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmRvVmFsdWUgPSBnZXRCdWZmZXIoKS5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5wdXQudHJpZ2dlcihcImNoYW5nZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgI
46184H0sIDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA9PT0gNDYgJiYgZS5zaGlmdEtleSA9PT0gZmFsc2UgJiYgb3B0cy5yYWRpeFBvaW50ICE9PSBcIlwiKSBrID0gb3B0cy5yYWRpeFBvaW50LmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG9zID0gY2hlY2t2YWwgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IG5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IG5keFxuICAgICAgICAgICAgICAgICAgICAgICAgfSA6IGNhcmV0KGlucHV0KSwgZm9yd2FyZFBvc2l0aW9uLCBjID0gU3RyaW5nLmZyb21DaGFyQ29kZShrKSwgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLl9yYWRpeERhbmNlICYmIG9wdHMubnVtZXJpY0lucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhcmV0UG9zID0gZ2V0QnVmZmVyKCkuaW5kZXhPZihvcHRzLnJhZGl4UG9pbnQuY2hhckF0KDApKSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcy5iZWdpbiA8PSBjYXJldFBvcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA9PT0gb3B0cy5yYWRpeFBvaW50LmNoYXJDb2RlQXQoMCkpIG9mZnNldCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcy5iZWdpbiAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MuZW5kIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWFza1NldCgpLndyaXRlT3V0QnVmZmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxSZXN1bHQgPSBpc1ZhbGlkKHBvcywgYywgc3RyaWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxSZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRNYXNrU2V0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRQb3NpdGlvbiA9IHZhbFJlc3VsdC5jYXJldCAhPT0gdW5kZWZpbmVkID8gdmFsUmVzdWx0LmNhcmV0IDogc2Vla05leHQodmFsUmVzdWx0LnBvcy5iZWdpbiA/IHZhbFJlc3VsdC5wb3MuYmVnaW4gOiB2YWxSZXN1bHQucG9zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNYXNrU2V0KCkucCA9IGZvcndhcmRQb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRQb3NpdGlvbiA9IChvcHRzLm51bWVyaWNJbnB1dCAmJiB2YWxSZXN1bHQuY2FyZXQgPT09IHVuZGVmaW5lZCA/IHNlZWtQcmV2aW91cyhmb3J3YXJkUG9zaXRpb24pIDogZm9yd2FyZFBvc2l0aW9uKSArIG9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZU91dCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLm9uS2V5VmFsaWRhdGlvbi5jYWxsKGlucHV0LCBrLCB2YWxSZXN1bHQsIG9wdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRNYXNrU2V0KCkud3JpdGVPdXRCdWZmZXIgJiYgdmFsUmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgYnVmZmVyID0gZ2V0QnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQnVmZmVyKGlucHV0LCBidWZmZXIsIGZvcndhcmRQb3NpdGlvbiwgZSwgY2hlY2t2YWwgIT09IHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja3ZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxSZXN1bHQgIT09IGZhbHNlKSB2YWxSZXN1bHQuZm9yd2FyZFBvc2l0aW9uID0gZm9yd2FyZFBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxSZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFzdGVFdmVudDogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9IHRoaXMsIGV2ID0gZS5vcmlnaW5hbEV2ZW50IHx8IGUsICRpbnB1dCA9ICQoaW5wdXQpLCBpbnB1dFZhbHVlID0gaW5wdXQuaW5wdXRtYXNrLl92YWx1ZUdldCh0cnVlKSwgY2FyZXRQb3MgPSBjYXJldChpbnB1dCksIHRlbXBWYWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoaXNSVEwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVtcFZhbHVlID0gY2FyZXRQb3MuZW5kO1xuICAgICAgICAgICAgICAgICAgICBjYXJldFBvcy5lbmQgPSBjYXJldFBvcy5iZWdpbjtcbiAgICAgICAgICAgICAgICAgICAgY2FyZXRQb3MuYmVnaW4gPSB0ZW1wVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZUJlZm9yZUNhcmV0ID0gaW5wdXRWYWx1ZS
461845zdWJzdHIoMCwgY2FyZXRQb3MuYmVnaW4pLCB2YWx1ZUFmdGVyQ2FyZXQgPSBpbnB1dFZhbHVlLnN1YnN0cihjYXJldFBvcy5lbmQsIGlucHV0VmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVCZWZvcmVDYXJldCA9PT0gKGlzUlRMID8gZ2V0QnVmZmVyVGVtcGxhdGUoKS5yZXZlcnNlKCkgOiBnZXRCdWZmZXJUZW1wbGF0ZSgpKS5zbGljZSgwLCBjYXJldFBvcy5iZWdpbikuam9pbihcIlwiKSkgdmFsdWVCZWZvcmVDYXJldCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlQWZ0ZXJDYXJldCA9PT0gKGlzUlRMID8gZ2V0QnVmZmVyVGVtcGxhdGUoKS5yZXZlcnNlKCkgOiBnZXRCdWZmZXJUZW1wbGF0ZSgpKS5zbGljZShjYXJldFBvcy5lbmQpLmpvaW4oXCJcIikpIHZhbHVlQWZ0ZXJDYXJldCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5jbGlwYm9hcmREYXRhICYmIHdpbmRvdy5jbGlwYm9hcmREYXRhLmdldERhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IHZhbHVlQmVmb3JlQ2FyZXQgKyB3aW5kb3cuY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwiVGV4dFwiKSArIHZhbHVlQWZ0ZXJDYXJldDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2LmNsaXBib2FyZERhdGEgJiYgZXYuY2xpcGJvYXJkRGF0YS5nZXREYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB2YWx1ZUJlZm9yZUNhcmV0ICsgZXYuY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwidGV4dC9wbGFpblwiKSArIHZhbHVlQWZ0ZXJDYXJldDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIHBhc3RlVmFsdWUgPSBpbnB1dFZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICgkLmlzRnVuY3Rpb24ob3B0cy5vbkJlZm9yZVBhc3RlKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXN0ZVZhbHVlID0gb3B0cy5vbkJlZm9yZVBhc3RlLmNhbGwoaW5wdXRtYXNrLCBpbnB1dFZhbHVlLCBvcHRzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFzdGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGVWYWx1ZSA9IGlucHV0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hlY2tWYWwoaW5wdXQsIGZhbHNlLCBmYWxzZSwgcGFzdGVWYWx1ZS50b1N0cmluZygpLnNwbGl0KFwiXCIpKTtcbiAgICAgICAgICAgICAgICB3cml0ZUJ1ZmZlcihpbnB1dCwgZ2V0QnVmZmVyKCksIHNlZWtOZXh0KGdldExhc3RWYWxpZFBvc2l0aW9uKCkpLCBlLCB1bmRvVmFsdWUgIT09IGdldEJ1ZmZlcigpLmpvaW4oXCJcIikpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5wdXRGYWxsQmFja0V2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gcmFkaXhQb2ludEhhbmRsZXIoaW5wdXQsIGlucHV0VmFsdWUsIGNhcmV0UG9zKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFZhbHVlLmNoYXJBdChjYXJldFBvcy5iZWdpbiAtIDEpID09PSBcIi5cIiAmJiBvcHRzLnJhZGl4UG9pbnQgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSBpbnB1dFZhbHVlLnNwbGl0KFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZVtjYXJldFBvcy5iZWdpbiAtIDFdID0gb3B0cy5yYWRpeFBvaW50LmNoYXJBdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSBpbnB1dFZhbHVlLmpvaW4oXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0VmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGllTW9iaWxlSGFuZGxlcihpbnB1dCwgaW5wdXRWYWx1ZSwgY2FyZXRQb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGllbW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgaW5wdXRDaGFyID0gaW5wdXRWYWx1ZS5yZXBsYWNlKGdldEJ1ZmZlcigpLmpvaW4oXCJcIiksIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Q2hhci5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXYgPSBpbnB1dFZhbHVlLnNwbGl0KFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2LnNwbGljZShjYXJldFBvcy5iZWdpbiwgMCwgaW5wdXRDaGFyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gaXYuam9pbihcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcywgaW5wdXRWYWx1ZSA9IGlucHV0LmlucHV0bWFzay5fdmFsdWVHZXQoKTtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0QnVmZmVyKCkuam9pbihcIlwiKSAhPT0gaW5wdXRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2FyZXRQb3MgPSBjYXJldChpbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSByYWRpeFBvaW50SGFuZGxlcihpbnB1dCwgaW5wdXRWYWx1ZSwgY2FyZXRQb3MpO1xuICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gaWVNb2JpbGVIYW5kbGVyKGlucHV0LCBpbnB1dFZhbHVlLCBjYXJldFBvcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZXRCdWZmZXIoKS5qb2luKFwiXCIpICE9PSBpbnB1dFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgYnVmZmVyID0gZ2V0QnVmZmVyKCkuam9pbihcIlwiKSwgb2Zmc2V0ID0gIW9wdHMubnVtZXJpY0lucHV0ICYmIGlucHV0VmFsdWUubGVuZ3RoID4gYnVmZmVyLmxlbmd0aCA/IC0xIDogMCwgZnJvbnRQYXJ0ID0gaW5wdXRWYWx1ZS5zdWJzdHIoMCwgY2FyZXRQb3MuYmVnaW4pLCBiYWNrUGFydCA9IGlucHV0VmFsdWUuc3Vic3RyKGNhcmV0UG9zLmJlZ2luKSwgZnJvbnRCdWZmZXJQYXJ0ID0gYnVmZmVyLnN1YnN0cigwLCBjYXJldFBvcy5iZWdpbiArIG9mZnNldCksIGJhY2tCdWZmZXJQYXJ0ID0gYnVmZmVyLnN1YnN0cihjYXJldFBvcy5iZWdpbiArIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gY2FyZXRQb3MsIGVudHJpZXMgPSBcIlwiLCBpc0VudHJ5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbnRQYXJ0ICE9PSBmcm9udEJ1ZmZlclBhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZnBsID0gKGlzRW50cnkgPSBmcm9udFBhcnQubGVuZ3RoID49IGZyb250QnVmZmVyUGFydC5sZW5ndGgpID8gZnJvbnRQYXJ0Lmxlbmd0aCA6IGZyb250QnVmZmVyUGFydC5sZW5ndGgsIGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgZnJvbnRQYXJ0LmNoYXJBdChpKSA9PT0gZnJvbnRCdWZmZXJQYXJ0LmNoYXJBdChpKSAmJiBpIDwgZnBsOyBpKyspIDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uYmVnaW4gPSBpIC0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzICs9IGZyb250UGFydC5zbGljZShpLCBzZWxlY3Rpb24uZW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja1BhcnQgIT09IGJhY2tCdWZmZXJQYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tQYXJ0Lmxlbmd0aCA+IGJhY2tCdWZmZXJQYXJ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzICs9IGJhY2tQYXJ0LnNsaWNlKDAsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrUGFydC5sZW5ndGggPCBiYWNrQnVmZmVyUGFydC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5lbmQgKz0gYmFja0J1ZmZlclBhcnQubGVuZ3RoIC0gYmFja1BhcnQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0VudHJ5ICYmIG9wdHMucmFkaXhQb2ludCAhPT0gXCJcIiAmJiBiYWNrUGFydCA9PT0gXCJcIiAmJiBmcm9udFBhcnQuY2hhckF0KHNlbGVjdGlvbi5iZWdpbiArIG9mZnNldCAtIDEpID09PSBvcHRzLnJhZGl4UG9pbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uYmVnaW4tLTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzID0gb3B0cy5yYWRpeFBvaW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVCdWZmZXIoaW5wdXQsIGdldEJ1ZmZlcigpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IHNlbGVjdGlvbi5iZWdpbiArIG9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHNlbGVjdGlvbi5lbmQgKyBvZmZzZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChlbnRyaWVzLnNwbGl0KFwiXCIpLCBmdW5jdGlvbihuZHgsIGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXlwcmVzcyA9IG5ldyAkLkV2ZW50KFwia2V5cHJlc3NcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXByZXNzLndoaWNoID0gZW50cnkuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlcnMua2V5cHJlc3NFdmVudC5jYWxsKGlucHV0LCBrZXlwcmVzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24uYmVnaW4gPT09IHNlbGVjdGlvbi5lbmQgLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5iZWdpbiA9IHNlZWtQcmV2aW91cyhzZWxlY3Rpb24uYmVnaW4gKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5iZWdpbiA9PT0gc2VsZWN0aW9uLmVuZCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmV0KGlucHV0LCBzZWxlY3Rpb24uYmVnaW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQoaW5wdXQsIHNlbGVjdGlvbi5iZWdpbiwgc2VsZWN0aW9uLmVuZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleWRvd24gPSBuZXcgJC5FdmVudChcImtleWRvd25cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ZG93bi5rZXlDb2RlID0gb3B0cy5udW1lcmljSW5wdXQgP
46184yBJbnB1dG1hc2sua2V5Q29kZS5CQUNLU1BBQ0UgOiBJbnB1dG1hc2sua2V5Q29kZS5ERUxFVEU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVycy5rZXlkb3duRXZlbnQuY2FsbChpbnB1dCwga2V5ZG93bik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmVmb3JlSW5wdXRFdmVudDogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLmlucHV0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbnNlcnRUZXh0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goZS5kYXRhLnNwbGl0KFwiXCIpLCBmdW5jdGlvbihuZHgsIGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleXByZXNzID0gbmV3ICQuRXZlbnQoXCJrZXlwcmVzc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlwcmVzcy53aGljaCA9IGVudHJ5LmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVycy5rZXlwcmVzc0V2ZW50LmNhbGwoaW5wdXQsIGtleXByZXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkZWxldGVDb250ZW50QmFja3dhcmRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXlkb3duID0gbmV3ICQuRXZlbnQoXCJrZXlkb3duXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5ZG93bi5rZXlDb2RlID0gSW5wdXRtYXNrLmtleUNvZGUuQkFDS1NQQUNFO1xuICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVycy5rZXlkb3duRXZlbnQuY2FsbChpbnB1dCwga2V5ZG93bik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZUNvbnRlbnRGb3J3YXJkXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIga2V5ZG93biA9IG5ldyAkLkV2ZW50KFwia2V5ZG93blwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleWRvd24ua2V5Q29kZSA9IElucHV0bWFzay5rZXlDb2RlLkRFTEVURTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlcnMua2V5ZG93bkV2ZW50LmNhbGwoaW5wdXQsIGtleWRvd24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXRWYWx1ZUV2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dG1hc2sucmVmcmVzaFZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcywgdmFsdWUgPSBlICYmIGUuZGV0YWlsID8gZS5kZXRhaWxbMF0gOiBhcmd1bWVudHNbMV0sIHZhbHVlID0gdmFsdWUgfHwgaW5wdXQuaW5wdXRtYXNrLl92YWx1ZUdldCh0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKG9wdHMub25CZWZvcmVNYXNrKSkgdmFsdWUgPSBvcHRzLm9uQmVmb3JlTWFzay5jYWxsKGlucHV0bWFzaywgdmFsdWUsIG9wdHMpIHx8IHZhbHVlO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3BsaXQoXCJcIik7XG4gICAgICAgICAgICAgICAgY2hlY2tWYWwoaW5wdXQsIHRydWUsIGZhbHNlLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdW5kb1ZhbHVlID0gZ2V0QnVmZmVyKCkuam9pbihcIlwiKTtcbiAgICAgICAgICAgICAgICBpZiAoKG9wdHMuY2xlYXJNYXNrT25Mb3N0Rm9jdXMgfHwgb3B0cy5jbGVhckluY29tcGxldGUpICYmIGlucHV0LmlucHV0bWFzay5fdmFsdWVHZXQoKSA9PT0gZ2V0QnVmZmVyVGVtcGxhdGUoKS5qb2luKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0LmlucHV0bWFzay5fdmFsdWVTZXQoXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvY3VzRXZlbnQ6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICB2Y
46184XIgaW5wdXQgPSB0aGlzLCBucHRWYWx1ZSA9IGlucHV0LmlucHV0bWFzay5fdmFsdWVHZXQoKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0cy5zaG93TWFza09uRm9jdXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5wdFZhbHVlICE9PSBnZXRCdWZmZXIoKS5qb2luKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUJ1ZmZlcihpbnB1dCwgZ2V0QnVmZmVyKCksIHNlZWtOZXh0KGdldExhc3RWYWxpZFBvc2l0aW9uKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtb3VzZUVudGVyID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQoaW5wdXQsIHNlZWtOZXh0KGdldExhc3RWYWxpZFBvc2l0aW9uKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0cy5wb3NpdGlvbkNhcmV0T25UYWIgPT09IHRydWUgJiYgbW91c2VFbnRlciA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVycy5jbGlja0V2ZW50LmFwcGx5KGlucHV0LCBbIGUsIHRydWUgXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVuZG9WYWx1ZSA9IGdldEJ1ZmZlcigpLmpvaW4oXCJcIik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91c2VsZWF2ZUV2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcztcbiAgICAgICAgICAgICAgICBtb3VzZUVudGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMuY2xlYXJNYXNrT25Mb3N0Rm9jdXMgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gaW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgSGFuZGxlTmF0aXZlUGxhY2Vob2xkZXIoaW5wdXQsIG9yaWdpbmFsUGxhY2Vob2xkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGlja0V2ZW50OiBmdW5jdGlvbihlLCB0YWJiZWQpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkb1JhZGl4Rm9jdXMoY2xpY2tQb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMucmFkaXhQb2ludCAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZwcyA9IGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9ucztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2cHNbY2xpY2tQb3NdID09PSB1bmRlZmluZWQgfHwgdnBzW2NsaWNrUG9zXS5pbnB1dCA9PT0gZ2V0UGxhY2Vob2xkZXIoY2xpY2tQb3MpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWNrUG9zIDwgc2Vla05leHQoLTEpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgcmFkaXhQb3MgPSAkLmluQXJyYXkob3B0cy5yYWRpeFBvaW50LCBnZXRCdWZmZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhZGl4UG9zICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB2cCBpbiB2cHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYWRpeFBvcyA8IHZwICYmIHZwc1t2cF0uaW5wdXQgIT09IGdldFBsYWNlaG9sZGVyKHZwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBpbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkQ2FyZXQgPSBjYXJldChpbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFiYmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUlRMKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2FyZXQuZW5kID0gc2VsZWN0ZWRDYXJldC5iZWdpbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENhcmV0LmJlZ2luID0gc2VsZWN0ZWRDYXJldC5lbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2FyZXQuYmVnaW4gPT09IHNlbGVjdGVkQ2FyZXQuZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcHRzLnBvc2l0aW9uQ2FyZXRPbkNsaWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibm9uZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNlbGVjdFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJldChpbnB1dCwgMCwgZ2V0QnVmZmVyKCkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpZ25vcmVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQoaW5wdXQsIHNlZWtOZXh0KGdldExhc3RWYWxpZFBvc2l0aW9uKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJyYWRpeEZvY3VzXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb1JhZGl4Rm9jdXMoc2VsZWN0ZWRDYXJldC5iZWdpbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByYWRpeFBvcyA9IGdldEJ1ZmZlcigpLmpvaW4oXCJcIikuaW5kZXhPZihvcHRzLnJhZGl4UG9pbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQoaW5wdXQsIG9wdHMubnVtZXJpY0lucHV0ID8gc2Vla05leHQocmFkaXhQb3MpIDogcmFkaXhQb3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsaWNrUG9zaXRpb24gPSBzZWxlY3RlZENhcmV0LmJlZ2luLCBsdmNsaWNrUG9zaXRpb24gPSBnZXRMYXN0VmFsaWRQb3NpdGlvbihjbGlja1Bvc2l0aW9uLCB0cnVlKSwgbGFzdFBvc2l0aW9uID0gc2Vla05leHQobHZjbGlja1Bvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWNrUG9zaXRpb24gPCBsYXN0UG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmV0KGlucHV0LCAhaXNNYXNrKGNsaWNrUG9zaXRpb24sIHRydWUpICYmICFpc01hc2soY2xpY2tQb3NpdGlvbiAtIDEsIHRydWUpID8gc2Vla05leHQoY2xpY2tQb3NpdGlvbikgOiBjbGlja1Bvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsdnAgPSBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbbHZjbGlja1Bvc2l0aW9uXSwgdHQgPSBnZXRUZXN0VGVtcGxhdGUobGFzdFBvc2l0aW9uLCBsdnAgPyBsdnAubWF0Y2gubG9jYXRvciA6IHVuZGVmaW5lZCwgbHZwKSwgcGxhY2Vob2xkZXIgPSBnZXRQbGFjZWhvbGRlcihsYXN0UG9zaXRpb24sIHR0Lm1hdGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlciAhPT0gXCJcIiAmJiBnZXRCdWZmZXIoKVtsYXN0UG9zaXRpb25dICE9PSBwbGFjZWhvbGRlciAmJiB0dC5tYXRjaC5vcHRpb25hbFF1YW50aWZpZXIgIT09IHRydWUgJiYgdHQubWF0Y2gubmV3QmxvY2tNYXJrZXIgIT09IHRydWUgfHwgIWlzTWFzayhsYXN0UG9zaXRpb24sIG9wdHMua2VlcFN0YXRpYykgJiYgdHQubWF0Y2guZGVmID09PSBwbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
46184HZhciBuZXdQb3MgPSBzZWVrTmV4dChsYXN0UG9zaXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlja1Bvc2l0aW9uID49IG5ld1BvcyB8fCBjbGlja1Bvc2l0aW9uID09PSBsYXN0UG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFBvc2l0aW9uID0gbmV3UG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmV0KGlucHV0LCBsYXN0UG9zaXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGN1dEV2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcywgJGlucHV0ID0gJChpbnB1dCksIHBvcyA9IGNhcmV0KGlucHV0KSwgZXYgPSBlLm9yaWdpbmFsRXZlbnQgfHwgZTtcbiAgICAgICAgICAgICAgICB2YXIgY2xpcGJvYXJkRGF0YSA9IHdpbmRvdy5jbGlwYm9hcmREYXRhIHx8IGV2LmNsaXBib2FyZERhdGEsIGNsaXBEYXRhID0gaXNSVEwgPyBnZXRCdWZmZXIoKS5zbGljZShwb3MuZW5kLCBwb3MuYmVnaW4pIDogZ2V0QnVmZmVyKCkuc2xpY2UocG9zLmJlZ2luLCBwb3MuZW5kKTtcbiAgICAgICAgICAgICAgICBjbGlwYm9hcmREYXRhLnNldERhdGEoXCJ0ZXh0XCIsIGlzUlRMID8gY2xpcERhdGEucmV2ZXJzZSgpLmpvaW4oXCJcIikgOiBjbGlwRGF0YS5qb2luKFwiXCIpKTtcbiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuZXhlY0NvbW1hbmQpIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiY29weVwiKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVSZW1vdmUoaW5wdXQsIElucHV0bWFzay5rZXlDb2RlLkRFTEVURSwgcG9zKTtcbiAgICAgICAgICAgICAgICB3cml0ZUJ1ZmZlcihpbnB1dCwgZ2V0QnVmZmVyKCksIGdldE1hc2tTZXQoKS5wLCBlLCB1bmRvVmFsdWUgIT09IGdldEJ1ZmZlcigpLmpvaW4oXCJcIikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsdXJFdmVudDogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHZhciAkaW5wdXQgPSAkKHRoaXMpLCBpbnB1dCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmlucHV0bWFzaykge1xuICAgICAgICAgICAgICAgICAgICBIYW5kbGVOYXRpdmVQbGFjZWhvbGRlcihpbnB1dCwgb3JpZ2luYWxQbGFjZWhvbGRlcik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBucHRWYWx1ZSA9IGlucHV0LmlucHV0bWFzay5fdmFsdWVHZXQoKSwgYnVmZmVyID0gZ2V0QnVmZmVyKCkuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5wdFZhbHVlICE9PSBcIlwiIHx8IGNvbG9yTWFzayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5jbGVhck1hc2tPbkxvc3RGb2N1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRMYXN0VmFsaWRQb3NpdGlvbigpID09PSAtMSAmJiBucHRWYWx1ZSA9PT0gZ2V0QnVmZmVyVGVtcGxhdGUoKS5qb2luKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyT3B0aW9uYWxUYWlsKGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcGxldGUoYnVmZmVyKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5wdXQudHJpZ2dlcihcImluY29tcGxldGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMuY2xlYXJJbmNvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0TWFza1NldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5jbGVhck1hc2tPbkxvc3RGb2N1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBnZXRCdWZmZXJUZW1wbGF0ZSgpLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUJ1ZmZlcihpbnB1dCwgYnVmZmVyLCB1bmRlZmluZWQsIGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bmRvVmFsdWUgIT09IGdldEJ1ZmZlcigpLmpvaW4oXCJcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuZG9WYWx1ZSA9IGJ1ZmZlci5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgJGlucHV0LnRyaWdnZXIoXCJjaGFuZ2VcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91c2VlbnRlckV2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcztcbiAgICAgICAgICAgICAgICBtb3VzZUVudGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gaW5wdXQgJiYgb3B0cy5zaG93TWFza09uSG92ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgSGFuZGxlTmF0aXZlUGxhY2Vob2xkZXIoaW5wdXQsIChpc1JUTCA/IGdldEJ1ZmZlcigpLnNsaWNlKCkucmV2ZXJzZSgpIDogZ2V0QnVmZmVyKCkpLmpvaW4oXCJcIikpO1xuICAgICAgICAgICAgICAgI
46184H1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdWJtaXRFdmVudDogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGlmICh1bmRvVmFsdWUgIT09IGdldEJ1ZmZlcigpLmpvaW4oXCJcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgJGVsLnRyaWdnZXIoXCJjaGFuZ2VcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRzLmNsZWFyTWFza09uTG9zdEZvY3VzICYmIGdldExhc3RWYWxpZFBvc2l0aW9uKCkgPT09IC0xICYmIGVsLmlucHV0bWFzay5fdmFsdWVHZXQgJiYgZWwuaW5wdXRtYXNrLl92YWx1ZUdldCgpID09PSBnZXRCdWZmZXJUZW1wbGF0ZSgpLmpvaW4oXCJcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZWwuaW5wdXRtYXNrLl92YWx1ZVNldChcIlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMuY2xlYXJJbmNvbXBsZXRlICYmIGlzQ29tcGxldGUoZ2V0QnVmZmVyKCkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBlbC5pbnB1dG1hc2suX3ZhbHVlU2V0KFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0cy5yZW1vdmVNYXNrT25TdWJtaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZWwuaW5wdXRtYXNrLl92YWx1ZVNldChlbC5pbnB1dG1hc2sudW5tYXNrZWR2YWx1ZSgpLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQnVmZmVyKGVsLCBnZXRCdWZmZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXNldEV2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgZWwuaW5wdXRtYXNrLnJlZnJlc2hWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgJGVsLnRyaWdnZXIoXCJzZXR2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZnVuY3Rpb24gY2hlY2tWYWwoaW5wdXQsIHdyaXRlT3V0LCBzdHJpY3QsIG5wdHZsLCBpbml0aWF0aW5nRXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBpbnB1dG1hc2sgPSB0aGlzIHx8IGlucHV0LmlucHV0bWFzaywgaW5wdXRWYWx1ZSA9IG5wdHZsLnNsaWNlKCksIGNoYXJDb2RlcyA9IFwiXCIsIGluaXRpYWxOZHggPSAtMSwgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgZnVuY3Rpb24gaXNUZW1wbGF0ZU1hdGNoKG5keCwgY2hhckNvZGVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoYXJDb2RlTmR4ID0gZ2V0TWFza1RlbXBsYXRlKHRydWUsIDAsIGZhbHNlKS5zbGljZShuZHgsIHNlZWtOZXh0KG5keCkpLmpvaW4oXCJcIikucmVwbGFjZSgvJy9nLCBcIlwiKS5pbmRleE9mKGNoYXJDb2Rlcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoYXJDb2RlTmR4ICE9PSAtMSAmJiAhaXNNYXNrKG5keCkgJiYgKGdldFRlc3QobmR4KS5tYXRjaC5uYXRpdmVEZWYgPT09IGNoYXJDb2Rlcy5jaGFyQXQoMCkgfHwgZ2V0VGVzdChuZHgpLm1hdGNoLmZuID09PSBudWxsICYmIGdldFRlc3QobmR4KS5tYXRjaC5uYXRpdmVEZWYgPT09IFwiJ1wiICsgY2hhckNvZGVzLmNoYXJBdCgwKSB8fCBnZXRUZXN0KG5keCkubWF0Y2gubmF0aXZlRGVmID09PSBcIiBcIiAmJiAoZ2V0VGVzdChuZHggKyAxKS5tYXRjaC5uYXRpdmVEZWYgPT09IGNoYXJDb2Rlcy5jaGFyQXQoMCkgfHwgZ2V0VGVzdChuZHggKyAxKS5tYXRjaC5mbiA9PT0gbnVsbCAmJiBnZXRUZXN0KG5keCArIDEpLm1hdGNoLm5hdGl2ZURlZiA9PT0gXCInXCIgKyBjaGFyQ29kZXMuY2hhckF0KDApKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNldE1hc2tTZXQoKTtcbiAgICAgICAgICAgIGlmICghc3RyaWN0ICYmIG9wdHMuYXV0b1VubWFzayAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBzdGF0aWNJbnB1dCA9IGdldEJ1ZmZlclRlbXBsYXRlKCkuc2xpY2UoMCwgc2Vla05leHQoLTEpKS5qb2luKFwiXCIpLCBtYXRjaGVzID0gaW5wdXRWYWx1ZS
461845qb2luKFwiXCIpLm1hdGNoKG5ldyBSZWdFeHAoXCJeXCIgKyBJbnB1dG1hc2suZXNjYXBlUmVnZXgoc3RhdGljSW5wdXQpLCBcImdcIikpO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlLnNwbGljZSgwLCBtYXRjaGVzLmxlbmd0aCAqIHN0YXRpY0lucHV0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxOZHggPSBzZWVrTmV4dChpbml0aWFsTmR4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGluaXRpYWxOZHggPSBzZWVrTmV4dChpbml0aWFsTmR4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbml0aWFsTmR4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS5wID0gc2Vla05leHQoaW5pdGlhbE5keCk7XG4gICAgICAgICAgICAgICAgaW5pdGlhbE5keCA9IDA7XG4gICAgICAgICAgICB9IGVsc2UgZ2V0TWFza1NldCgpLnAgPSBpbml0aWFsTmR4O1xuICAgICAgICAgICAgaW5wdXRtYXNrLmNhcmV0UG9zID0ge1xuICAgICAgICAgICAgICAgIGJlZ2luOiBpbml0aWFsTmR4XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgJC5lYWNoKGlucHV0VmFsdWUsIGZ1bmN0aW9uKG5keCwgY2hhckNvZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hhckNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW25keF0gPT09IHVuZGVmaW5lZCAmJiBpbnB1dFZhbHVlW25keF0gPT09IGdldFBsYWNlaG9sZGVyKG5keCkgJiYgaXNNYXNrKG5keCwgdHJ1ZSkgJiYgaXNWYWxpZChuZHgsIGlucHV0VmFsdWVbbmR4XSwgdHJ1ZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWFza1NldCgpLnArKztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXlwcmVzcyA9IG5ldyAkLkV2ZW50KFwiX2NoZWNrdmFsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5cHJlc3Mud2hpY2ggPSBjaGFyQ29kZS5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhckNvZGVzICs9IGNoYXJDb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGx2cCA9IGdldExhc3RWYWxpZFBvc2l0aW9uKHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVGVtcGxhdGVNYXRjaChpbml0aWFsTmR4LCBjaGFyQ29kZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gRXZlbnRIYW5kbGVycy5rZXlwcmVzc0V2ZW50LmNhbGwoaW5wdXQsIGtleXByZXNzLCB0cnVlLCBmYWxzZSwgc3RyaWN0LCBpbnB1dG1hc2suY2FyZXRQb3MuYmVnaW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5keCA9IGlucHV0bWFzay5jYXJldFBvcy5iZWdpbiArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJDb2RlcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBFdmVudEhhbmRsZXJzLmtleXByZXNzRXZlbnQuY2FsbChpbnB1dCwga2V5cHJlc3MsIHRydWUsIGZhbHNlLCBzdHJpY3QsIGx2cCArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQnVmZmVyKHVuZGVmaW5lZCwgZ2V0QnVmZmVyKCksIHJlc3VsdC5mb3J3YXJkUG9zaXRpb24sIGtleXByZXNzLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRtYXNrLmNhcmV0UG9zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogcmVzdWx0LmZvcndhcmRQb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiByZXN1bHQuZm9yd2FyZFBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHdyaXRlT3V0KSB3cml0ZUJ1ZmZlcihpbnB1dCwgZ2V0QnVmZmVyKCksIHJlc3VsdCA/IHJlc3VsdC5mb3J3YXJkUG9zaXRpb24gOiB1bmRlZmluZWQsIGluaXRpYXRpbmdFdmVudCB8fCBuZXcgJC5FdmVudChcImNoZWNrdmFsXCIpLCBpbml0aWF0aW5nRXZlbnQgJiYgaW5pdGlhdGluZ0V2ZW50LnR5cGUgPT09IFwiaW5wdXRcIik7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gdW5tYXNrZWR2YWx1ZShpbnB1dCkge1xuICAgICAgICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmlucHV0bWFzayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmlucHV0bWFzayAmJiBpbnB1dC5pbnB1dG1hc2sucmVmcmVzaFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlcnMuc2V0VmFsdWVFdmVudC5jYWxsKGlucHV0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2Y
46184XIgdW1WYWx1ZSA9IFtdLCB2cHMgPSBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnM7XG4gICAgICAgICAgICBmb3IgKHZhciBwbmR4IGluIHZwcykge1xuICAgICAgICAgICAgICAgIGlmICh2cHNbcG5keF0ubWF0Y2ggJiYgdnBzW3BuZHhdLm1hdGNoLmZuICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdW1WYWx1ZS5wdXNoKHZwc1twbmR4XS5pbnB1dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHVubWFza2VkVmFsdWUgPSB1bVZhbHVlLmxlbmd0aCA9PT0gMCA/IFwiXCIgOiAoaXNSVEwgPyB1bVZhbHVlLnJldmVyc2UoKSA6IHVtVmFsdWUpLmpvaW4oXCJcIik7XG4gICAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKG9wdHMub25Vbk1hc2spKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJ1ZmZlclZhbHVlID0gKGlzUlRMID8gZ2V0QnVmZmVyKCkuc2xpY2UoKS5yZXZlcnNlKCkgOiBnZXRCdWZmZXIoKSkuam9pbihcIlwiKTtcbiAgICAgICAgICAgICAgICB1bm1hc2tlZFZhbHVlID0gb3B0cy5vblVuTWFzay5jYWxsKGlucHV0bWFzaywgYnVmZmVyVmFsdWUsIHVubWFza2VkVmFsdWUsIG9wdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVubWFza2VkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2FyZXQoaW5wdXQsIGJlZ2luLCBlbmQsIG5vdHJhbnNsYXRlKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiB0cmFuc2xhdGVQb3NpdGlvbihwb3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNSVEwgJiYgdHlwZW9mIHBvcyA9PT0gXCJudW1iZXJcIiAmJiAoIW9wdHMuZ3JlZWR5IHx8IG9wdHMucGxhY2Vob2xkZXIgIT09IFwiXCIpICYmIGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IGVsLmlucHV0bWFzay5fdmFsdWVHZXQoKS5sZW5ndGggLSBwb3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2Y
46184XIgcmFuZ2U7XG4gICAgICAgICAgICBpZiAoYmVnaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmICgkLmlzQXJyYXkoYmVnaW4pKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IGlzUlRMID8gYmVnaW5bMF0gOiBiZWdpblsxXTtcbiAgICAgICAgICAgICAgICAgICAgYmVnaW4gPSBpc1JUTCA/IGJlZ2luWzFdIDogYmVnaW5bMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChiZWdpbi5iZWdpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IGlzUlRMID8gYmVnaW4uYmVnaW4gOiBiZWdpbi5lbmQ7XG4gICAgICAgICAgICAgICAgICAgIGJlZ2luID0gaXNSVEwgPyBiZWdpbi5lbmQgOiBiZWdpbi5iZWdpbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBiZWdpbiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IG5vdHJhbnNsYXRlID8gYmVnaW4gOiB0cmFuc2xhdGVQb3NpdGlvbihiZWdpbik7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IG5vdHJhbnNsYXRlID8gZW5kIDogdHJhbnNsYXRlUG9zaXRpb24oZW5kKTtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gdHlwZW9mIGVuZCA9PSBcIm51bWJlclwiID8gZW5kIDogYmVnaW47XG4gICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxDYWxjID0gcGFyc2VJbnQoKChpbnB1dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdykuZ2V0Q29tcHV0ZWRTdHlsZSA/IChpbnB1dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdykuZ2V0Q29tcHV0ZWRTdHlsZShpbnB1dCwgbnVsbCkgOiBpbnB1dC5jdXJyZW50U3R5bGUpLmZvbnRTaXplKSAqIGVuZDtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2Nyb2xsTGVmdCA9IHNjcm9sbENhbGMgPiBpbnB1dC5zY3JvbGxXaWR0aCA/IHNjcm9sbENhbGMgOiAwO1xuICAgICAgICAgICAgICAgICAgICBpbnB1dC5pbnB1dG1hc2suY2FyZXRQb3MgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGVuZFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcInNlbGVjdGlvblN0YXJ0XCIgaW4gaW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWxlY3Rpb25TdGFydCA9IGJlZ2luO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlbGVjdGlvbkVuZCA9IGVuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZmlyc3RDaGlsZCA9PT0gdW5kZWZpbmVkIHx8IGlucHV0LmZpcnN0Q2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmFwcGVuZENoaWxkKHRleHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoaW5wdXQuZmlyc3RDaGlsZCwgYmVnaW4gPCBpbnB1dC5pbnB1dG1hc2suX3ZhbHVlR2V0KCkubGVuZ3RoID8gYmVnaW4gOiBpbnB1dC5pbnB1dG1hc2suX3ZhbHVlR2V0KCkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRFbmQoaW5wdXQuZmlyc3RDaGlsZCwgZW5kIDwgaW5wdXQuaW5wdXRtYXNrLl92YWx1ZUdldCgpLmxlbmd0aCA/IGVuZCA6IGlucHV0LmlucHV0bWFzay5fdmFsdWVHZXQoKS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0LmNyZWF0ZVRleHRSYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gaW5wdXQuY3JlYXRlVGV4dFJhbmdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UubW92ZUVuZChcImNoYXJhY3RlclwiLCBlbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLm1vdmVTdGFydChcImNoYXJhY3RlclwiLCBiZWdpbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2VsZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJDb2xvck1hc2soaW5wdXQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBlbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoXCJzZWxlY3Rpb25TdGFydFwiIGluIGlucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGJlZ2luID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IGlucHV0LnNlbGVjdGlvbkVuZDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkuZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLnBhcmVudE5vZGUgPT09IGlucHV0IHx8IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyID09PSBpbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4gPSByYW5nZS5zdGFydE9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IHJhbmdlLmVuZE9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgI
46184H0gZWxzZSBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uICYmIGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICByYW5nZSA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpO1xuICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IDAgLSByYW5nZS5kdXBsaWNhdGUoKS5tb3ZlU3RhcnQoXCJjaGFyYWN0ZXJcIiwgLWlucHV0LmlucHV0bWFzay5fdmFsdWVHZXQoKS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSBiZWdpbiArIHJhbmdlLnRleHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBiZWdpbjogbm90cmFuc2xhdGUgPyBiZWdpbiA6IHRyYW5zbGF0ZVBvc2l0aW9uKGJlZ2luKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBub3RyYW5zbGF0ZSA/IGVuZCA6IHRyYW5zbGF0ZVBvc2l0aW9uKGVuZClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGRldGVybWluZUxhc3RSZXF1aXJlZFBvc2l0aW9uKHJldHVybkRlZmluaXRpb24pIHtcbiAgICAgICAgICAgIHZhciBidWZmZXIgPSBnZXRNYXNrVGVtcGxhdGUodHJ1ZSwgZ2V0TGFzdFZhbGlkUG9zaXRpb24oKSwgdHJ1ZSwgdHJ1ZSksIGJsID0gYnVmZmVyLmxlbmd0aCwgcG9zLCBsdnAgPSBnZXRMYXN0VmFsaWRQb3NpdGlvbigpLCBwb3NpdGlvbnMgPSB7fSwgbHZUZXN0ID0gZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW2x2cF0sIG5keEludGx6ciA9IGx2VGVzdCAhPT0gdW5kZWZpbmVkID8gbHZUZXN0LmxvY2F0b3Iuc2xpY2UoKSA6IHVuZGVmaW5lZCwgdGVzdFBvcztcbiAgICAgICAgICAgIGZvciAocG9zID0gbHZwICsgMTsgcG9zIDwgYnVmZmVyLmxlbmd0aDsgcG9zKyspIHtcbiAgICAgICAgICAgICAgICB0ZXN0UG9zID0gZ2V0VGVzdFRlbXBsYXRlKHBvcywgbmR4SW50bHpyLCBwb3MgLSAxKTtcbiAgICAgICAgICAgICAgICBuZHhJbnRsenIgPSB0ZXN0UG9zLmxvY2F0b3Iuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbnNbcG9zXSA9ICQuZXh0ZW5kKHRydWUsIHt9LCB0ZXN0UG9zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBsdlRlc3RBbHQgPSBsdlRlc3QgJiYgbHZUZXN0LmFsdGVybmF0aW9uICE9PSB1bmRlZmluZWQgPyBsdlRlc3QubG9jYXRvcltsdlRlc3QuYWx0ZXJuYXRpb25dIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgZm9yIChwb3MgPSBibCAtIDE7IHBvcyA+IGx2cDsgcG9zLS0pIHtcbiAgICAgICAgICAgICAgICB0ZXN0UG9zID0gcG9zaXRpb25zW3Bvc107XG4gICAgICAgICAgICAgICAgaWYgKCh0ZXN0UG9zLm1hdGNoLm9wdGlvbmFsaXR5IHx8IHRlc3RQb3MubWF0Y2gub3B0aW9uYWxRdWFudGlmaWVyICYmIHRlc3RQb3MubWF0Y2gubmV3QmxvY2tNYXJrZXIgfHwgbHZUZXN0QWx0ICYmIChsdlRlc3RBbHQgIT09IHBvc2l0aW9uc1twb3NdLmxvY2F0b3JbbHZUZXN0LmFsdGVybmF0aW9uXSAmJiB0ZXN0UG9zLm1hdGNoLmZuICE9IG51bGwgfHwgdGVzdFBvcy5tYXRjaC5mbiA9PT0gbnVsbCAmJiB0ZXN0UG9zLmxvY2F0b3JbbHZUZXN0LmFsdGVybmF0aW9uXSAmJiBjaGVja0FsdGVybmF0aW9uTWF0Y2godGVzdFBvcy5sb2NhdG9yW2x2VGVzdC5hbHRlcm5hdGlvbl0udG9TdHJpbmcoKS5zcGxpdChcIixcIiksIGx2VGVzdEFsdC50b1N0cmluZygpLnNwbGl0KFwiLFwiKSkgJiYgZ2V0VGVzdHMocG9zKVswXS5kZWYgIT09IFwiXCIpKSAmJiBidWZmZXJbcG9zXSA9PT0gZ2V0UGxhY2Vob2xkZXIocG9zLCB0ZXN0UG9zLm1hdGNoKSkge1xuICAgICAgICAgICAgICAgICAgICBibC0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXR1cm5EZWZpbml0aW9uID8ge1xuICAgICAgICAgICAgICAgIGw6IGJsLFxuICAgICAgICAgICAgICAgIGRlZjogcG9zaXRpb25zW2JsXSA/IHBvc2l0aW9uc1tibF0ubWF0Y2ggOiB1bmRlZmluZWRcbiAgICAgICAgICAgIH0gOiBibDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBjbGVhck9wdGlvbmFsVGFpbChidWZmZXIpIHtcbiAgICAgICAgICAgIGJ1ZmZlci5sZW5ndGggPSAwO1xuICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gZ2V0TWFza1RlbXBsYXRlKHRydWUsIDAsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSksIGxtbnQsIHZhbGlkUG9zO1xuICAgICAgICAgICAgd2hpbGUgKGxtbnQgPSB0ZW1wbGF0ZS5zaGlmdCgpLCBsbW50ICE9PSB1bmRlZmluZWQpIGJ1ZmZlci5wdXNoKGxtbnQpO1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc0NvbXBsZXRlKGJ1ZmZlcikge1xuICAgICAgICAgICAgaWYgKCQuaXNGdW5jdGlvbihvcHRzLmlzQ29tcGxldGUpKSByZXR1cm4gb3B0cy5pc0NvbXBsZXRlKGJ1ZmZlciwgb3B0cyk7XG4gICAgICAgICAgICBpZiAob3B0cy5yZXBlYXQgPT09IFwiKlwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdmFyIGNvbXBsZXRlID0gZmFsc2UsIGxycCA9IGRldGVybWluZUxhc3RSZXF1aXJlZFBvc2l0aW9uKHRydWUpLCBhbWwgPSBzZWVrUHJldmlvdXMobHJwLmwpO1xuICAgICAgICAgICAgaWYgKGxycC5kZWYgPT09IHVuZGVmaW5lZCB8fCBscnAuZGVmLm5ld0Jsb2NrTWFya2VyIHx8IGxycC5kZWYub3B0aW9uYWxpdHkgfHwgbHJwLmRlZi5vcHRpb25hbFF1YW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gYW1sOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRlc3QgPSBnZXRUZXN0VGVtcGxhdGUoaSkubWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0LmZuICE9PSBudWxsICYmIGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1tpXSA9PT0gdW5kZWZpbmVkICYmIHRlc3Qub3B0aW9uYWxpdHkgIT09IHRydWUgJiYgdGVzdC5vcHRpb25hbFF1YW50aWZpZXIgIT09IHRydWUgfHwgdGVzdC5mbiA9PT0gbnVsbCAmJiBidWZmZXJbaV0gIT09IGdldFBsYWNlaG9sZG
46184VyKGksIHRlc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29tcGxldGU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlUmVtb3ZlKGlucHV0LCBrLCBwb3MsIHN0cmljdCwgZnJvbUlzVmFsaWQpIHtcbiAgICAgICAgICAgIGlmIChvcHRzLm51bWVyaWNJbnB1dCB8fCBpc1JUTCkge1xuICAgICAgICAgICAgICAgIGlmIChrID09PSBJbnB1dG1hc2sua2V5Q29kZS5CQUNLU1BBQ0UpIHtcbiAgICAgICAgICAgICAgICAgICAgayA9IElucHV0bWFzay5rZXlDb2RlLkRFTEVURTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGsgPT09IElucHV0bWFzay5rZXlDb2RlLkRFTEVURSkge1xuICAgICAgICAgICAgICAgICAgICBrID0gSW5wdXRtYXNrLmtleUNvZGUuQkFDS1NQQUNFO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNSVEwpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBlbmQgPSBwb3MuZW5kO1xuICAgICAgICAgICAgICAgICAgICBwb3MuZW5kID0gcG9zLmJlZ2luO1xuICAgICAgICAgICAgICAgICAgICBwb3MuYmVnaW4gPSBwZW5kO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChrID09PSBJbnB1dG1hc2sua2V5Q29kZS5CQUNLU1BBQ0UgJiYgcG9zLmVuZCAtIHBvcy5iZWdpbiA8IDEpIHtcbiAgICAgICAgICAgICAgICBwb3MuYmVnaW4gPSBzZWVrUHJldmlvdXMocG9zLmJlZ2luKTtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW3Bvcy5iZWdpbl0gIT09IHVuZGVmaW5lZCAmJiBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zLmJlZ2luXS5pbnB1dCA9PT0gb3B0cy5ncm91cFNlcGFyYXRvcikge1xuICAgICAgICAgICAgICAgICAgICBwb3MuYmVnaW4tLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGsgPT09IElucHV0bWFzay5rZXlDb2RlLkRFTEVURSAmJiBwb3MuYmVnaW4gPT09IHBvcy5lbmQpIHtcbiAgICAgICAgICAgICAgICBwb3MuZW5kID0gaXNNYXNrKHBvcy5lbmQsIHRydWUpICYmIChnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zLmVuZF0gJiYgZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW3Bvcy5lbmRdLmlucHV0ICE9PSBvcHRzLnJhZGl4UG9pbnQpID8gcG9zLmVuZCArIDEgOiBzZWVrTmV4dChwb3MuZW5kKSArIDE7XG4gICAgICAgICAgICAgICAgaWYgKGdldE1hc2tTZXQoKS52YWxpZFBvc2l0aW9uc1twb3MuYmVnaW5dICE9PSB1bmRlZmluZWQgJiYgZ2V0TWFza1NldCgpLnZhbGlkUG9zaXRpb25zW3Bvcy5iZWdpbl0uaW5wdXQgPT09IG9wdHMuZ3JvdXBTZXBhcmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcG9zLmVuZCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldmFsaWRhdGVNYXNrKHBvcyk7XG4gICAgICAgICAgICBpZiAoc3RyaWN0ICE9PSB0cnVlICYmIG9wdHMua2VlcFN0YXRpYyAhPT0gZmFsc2UgfHwgb3B0cy5yZWdleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhbHRlcm5hdGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgbmV3UG9zID0gcmVzdWx0LmNhcmV0ICE9PSB1bmRlZmluZWQgPyByZXN1bHQuY2FyZXQgOiByZXN1bHQucG9zID8gc2Vla05leHQocmVzdWx0LnBvcy5iZWdpbiA/IHJlc3VsdC5wb3MuYmVnaW4gOiByZXN1bHQucG9zKSA6IGdldExhc3RWYWxpZFBvc2l0aW9uKC0xLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGsgIT09IElucHV0bWFzay5rZXlDb2RlLkRFTEVURSB8fCBwb3MuYmVnaW4gPiBuZXdQb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcy5iZWdpbiA9PSBuZXdQb3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbHZwID0gZ2V0TGFzdFZhbGlkUG9zaXRpb24ocG9zLmJlZ2luLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChsdnAgPCBwb3MuYmVnaW4gfHwgcG9zLmJlZ2luID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS5wID0gc2Vla05leHQobHZwKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyaWN0ICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgZ2V0TWFza1NldCgpLnAgPSBwb3MuYmVnaW47XG4gICAgICAgICAgICAgICAgaWYgKGZyb21Jc1ZhbGlkICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChnZXRNYXNrU2V0KCkucCA8IGx2cCAmJiBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbZ2V0TWFza1NldCgpLnBdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldE1hc2tTZXQoKS5wKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbG9yTWFzayhpbnB1dCkge1xuICAgICAgICAgICAgdmFyIGNvbXB1dGVkU3R5bGUgPSAoaW5wdXQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3cpLmdldENvbXB1dGVkU3R5bGUoaW5wdXQsIG51bGwpO1xuICAgICAgICAgICAgZnVuY3Rpb24gZmluZENhcmV0UG9zKGNsaWVudHgpIHtcbiAgICAgICAgICAgICAgICB2Y
46184XIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpLCBjYXJldFBvcztcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBzdHlsZSBpbiBjb21wdXRlZFN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihzdHlsZSkgJiYgc3R5bGUuaW5kZXhPZihcImZvbnRcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnN0eWxlW3N0eWxlXSA9IGNvbXB1dGVkU3R5bGVbc3R5bGVdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGUuc3R5bGUudGV4dFRyYW5zZm9ybSA9IGNvbXB1dGVkU3R5bGUudGV4dFRyYW5zZm9ybTtcbiAgICAgICAgICAgICAgICBlLnN0eWxlLmxldHRlclNwYWNpbmcgPSBjb21wdXRlZFN0eWxlLmxldHRlclNwYWNpbmc7XG4gICAgICAgICAgICAgICAgZS5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgICAgICAgICBlLnN0eWxlLmhlaWdodCA9IFwiYXV0b1wiO1xuICAgICAgICAgICAgICAgIGUuc3R5bGUud2lkdGggPSBcImF1dG9cIjtcbiAgICAgICAgICAgICAgICBlLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgICAgICAgICAgICAgIGUuc3R5bGUud2hpdGVTcGFjZSA9IFwibm93cmFwXCI7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTtcbiAgICAgICAgICAgICAgICB2YXIgaW5wdXRUZXh0ID0gaW5wdXQuaW5wdXRtYXNrLl92YWx1ZUdldCgpLCBwcmV2aW91c1dpZHRoID0gMCwgaXRsO1xuICAgICAgICAgICAgICAgIGZvciAoY2FyZXRQb3MgPSAwLCBpdGwgPSBpbnB1dFRleHQubGVuZ3RoOyBjYXJldFBvcyA8PSBpdGw7IGNhcmV0UG9zKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZS5pbm5lckhUTUwgKz0gaW5wdXRUZXh0LmNoYXJBdChjYXJldFBvcykgfHwgXCJfXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLm9mZnNldFdpZHRoID49IGNsaWVudHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvZmZzZXQxID0gY2xpZW50eCAtIHByZXZpb3VzV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgb2Zmc2V0MiA9IGUub2Zmc2V0V2lkdGggLSBjbGllbnR4O1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5pbm5lckhUTUwgPSBpbnB1dFRleHQuY2hhckF0KGNhcmV0UG9zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDEgLT0gZS5vZmZzZXRXaWR0aCAvIDM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXJldFBvcyA9IG9mZnNldDEgPCBvZmZzZXQyID8gY2FyZXRQb3MgLSAxIDogY2FyZXRQb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1dpZHRoID0gZS5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FyZXRQb3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdGVtcGxhdGUuc3R5bGUud2lkdGggPSBjb21wdXRlZFN0eWxlLndpZHRoO1xuICAgICAgICAgICAgdGVtcGxhdGUuc3R5bGUudGV4dEFsaWduID0gY29tcHV0ZWRTdHlsZS50ZXh0QWxpZ247XG4gICAgICAgICAgICBjb2xvck1hc2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgaW5wdXQuaW5wdXRtYXNrLmNvbG9yTWFzayA9IGNvbG9yTWFzaztcbiAgICAgICAgICAgIGNvbG9yTWFzay5jbGFzc05hbWUgPSBcImltLWNvbG9ybWFza1wiO1xuICAgICAgICAgICAgaW5wdXQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY29sb3JNYXNrLCBpbnB1dCk7XG4gICAgICAgICAgICBpbnB1dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGlucHV0KTtcbiAgICAgICAgICAgIGNvbG9yTWFzay5hcHBlbmRDaGlsZChpbnB1dCk7XG4gICAgICAgICAgICBjb2xvck1hc2suYXBwZW5kQ2hpbGQodGVtcGxhdGUpO1xuICAgICAgICAgICAgaW5wdXQuc3R5bGUubGVmdCA9IHRlbXBsYXRlLm9mZnNldExlZnQgKyBcInB4XCI7XG4gICAgICAgICAgICAkKGNvbG9yTWFzaykub24oXCJtb3VzZWxlYXZlXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRXZlbnRIYW5kbGVycy5tb3VzZWxlYXZlRXZlbnQuY2FsbChpbnB1dCwgWyBlIF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAkKGNvbG9yTWFzaykub24oXCJtb3VzZWVudGVyXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRXZlbnRIYW5kbGVycy5tb3VzZWVudGVyRXZlbnQuY2FsbChpbnB1dCwgWyBlIF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAkKGNvbG9yTWFzaykub24oXCJjbGlja1wiLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgY2FyZXQoaW5wdXQsIGZpbmRDYXJldFBvcyhlLmNsaWVudFgpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gRXZlbnRIYW5kbGVycy5jbGlja0V2ZW50LmNhbGwoaW5wdXQsIFsgZSBdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIElucHV0bWFzay5wcm90b3R5cGUucG9zaXRpb25Db2xvck1hc2sgPSBmdW5jdGlvbihpbnB1dCwgdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIGlucHV0LnN0eWxlLmxlZnQgPSB0ZW1wbGF0ZS5vZmZzZXRMZWZ0ICsgXCJweFwiO1xuICAgICAgICB9O1xuICAgICAgICBmdW5jdGlvbiByZW5kZXJDb2xvck1hc2soaW5wdXQsIGNhcmV0UG9zLCBjbGVhcikge1xuICAgICAgICAgICAgdmFyIG1hc2tUZW1wbGF0ZSA9IFtdLCBpc1N0YXRpYyA9IGZhbHNlLCB0ZXN0LCB0ZXN0UG9zLCBuZHhJbnRsenIsIHBvcyA9IDA7XG4gICAgICAgICAgICBmdW5jdGlvbiBzZXRFbnRyeShlbnRyeSkge1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeSA9PT0gdW5kZWZpbmVkKSBlbnRyeSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1N0YXRpYyAmJiAodGVzdC5mbiA9PT0gbnVsbCB8fCB0ZXN0UG9zLmlucHV0ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzU3RhdGljID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbWFza1RlbXBsYXRlLnB1c2goXCI8c3BhbiBjbGFzcz0naW0tc3RhdGljJz5cIiArIGVudHJ5KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RhdGljICYmICh0ZXN0LmZuICE9PSBudWxsICYmIHRlc3RQb3MuaW5wdXQgIT09IHVuZGVmaW5lZCB8fCB0ZXN0LmRlZiA9PT0gXCJcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNTdGF0aWMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG10bCA9IG1hc2tUZW1wbGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIG1hc2tUZW1wbGF0ZVttdGwgLSAxXSA9IG1hc2tUZW1wbGF0ZVttdGwgLSAxXSArIFwiPC9zcGFuPlwiO1xuICAgICAgICAgICAgICAgICAgICBtYXNrVGVtcGxhdGUucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIG1hc2tUZW1wbGF0ZS5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIHNldENhcmV0KCkge1xuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBpbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBtYXNrVGVtcGxhdGUuc3BsaWNlKGNhcmV0UG9zLmJlZ2luLCAwLCBjYXJldFBvcy5iZWdpbiA9PT0gY2FyZXRQb3MuZW5kIHx8IGNhcmV0UG9zLmVuZCA+IGdldE1hc2tTZXQoKS5tYXNrTGVuZ3RoID8gJzxtYXJrIGNsYXNzPVwiaW0tY2FyZXRcIiBzdHlsZT1cImJvcmRlci1yaWdodC13aWR0aDogMXB4O2JvcmRlci1yaWdodC1zdHlsZTogc29saWQ7XCI+JyA6ICc8bWFyayBjbGFzcz1cImltLWNhcmV0LXNlbGVjdFwiPicpO1xuICAgICAgICAgICAgICAgICAgICBtYXNrVGVtcGxhdGUuc3BsaWNlKGNhcmV0UG9zLmVuZCArIDEsIDAsIFwiPC9tYXJrPlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29sb3JNYXNrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB2Y
46184XIgYnVmZmVyID0gZ2V0QnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgaWYgKGNhcmV0UG9zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FyZXRQb3MgPSBjYXJldChpbnB1dCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYXJldFBvcy5iZWdpbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhcmV0UG9zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IGNhcmV0UG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBjYXJldFBvc1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2xlYXIgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGx2cCA9IGdldExhc3RWYWxpZFBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RQb3MgPSBnZXRNYXNrU2V0KCkudmFsaWRQb3NpdGlvbnNbcG9zXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ID0gdGVzdFBvcy5tYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZHhJbnRsenIgPSB0ZXN0UG9zLmxvY2F0b3Iuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFbnRyeShidWZmZXJbcG9zXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RQb3MgPSBnZXRUZXN0VGVtcGxhdGUocG9zLCBuZHhJbnRsenIsIHBvcyAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QgPSB0ZXN0UG9zLm1hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5keEludGx6ciA9IHRlc3RQb3MubG9jYXRvci5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLmppdE1hc2tpbmcgPT09IGZhbHNlIHx8IHBvcyA8IGx2cCB8fCB0eXBlb2Ygb3B0cy5qaXRNYXNraW5nID09PSBcIm51bWJlclwiICYmIGlzRmluaXRlKG9wdHMuaml0TWFza2luZykgJiYgb3B0cy5qaXRNYXNraW5nID4gcG9zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVudHJ5KGdldFBsYWNlaG9sZGVyKHBvcywgdGVzdCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpc1N0YXRpYyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zKys7XG4gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKChtYXhMZW5ndGggPT09IHVuZGVmaW5lZCB8fCBwb3MgPCBtYXhMZW5ndGgpICYmICh0ZXN0LmZuICE9PSBudWxsIHx8IHRlc3QuZGVmICE9PSBcIlwiKSB8fCBsdnAgPiBwb3MgfHwgaXNTdGF0aWMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdGF0aWMpIHNldEVudHJ5KCk7XG4gICAgICAgICAgICAgICAgICAgIHNldENhcmV0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IGNvbG9yTWFzay5nZXRFbGVtZW50c0J5VGFnTmFtZShcImRpdlwiKVswXTtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBtYXNrVGVtcGxhdGUuam9pbihcIlwiKTtcbiAgICAgICAgICAgICAgICBpbnB1dC5pbnB1dG1hc2sucG9zaXRpb25Db2xvck1hc2soaW5wdXQsIHRlbXBsYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBtYXNrKGVsZW0pIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIGlzRWxlbWVudFR5cGVTdXBwb3J0ZWQoaW5wdXQsIG9wdHMpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwYXRjaFZhbHVlUHJvcGVydHkobnB0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZUdldDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlU2V0O1xuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwYXRjaFZhbGhvb2sodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQudmFsSG9va3MgJiYgKCQudmFsSG9va3NbdHlwZV0gPT09IHVuZGVmaW5lZCB8fCAkLnZhbEhvb2tzW3R5cGVdLmlucHV0bWFza3BhdGNoICE9PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxob29rR2V0ID0gJC52YWxIb29rc1t0eXBlXSAmJiAkLnZhbEhvb2tzW3R5cGVdLmdldCA/ICQudmFsSG9va3NbdHlwZV0uZ2V0IDogZnVuY3Rpb24oZWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxob29rU2V0ID0gJC52YWxIb29rc1t0eXBlXSAmJiAkLnZhbEhvb2tzW3R5cGVdLnNldCA/ICQudmFsSG9va3NbdHlwZV0uc2V0IDogZnVuY3Rpb24oZWxlbSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQudmFsSG9va3NbdHlwZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24oZWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaW5wdXRtYXNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaW5wdXRtYXNrLm9wdHMuYXV0b1VubWFzaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS5pbnB1dG1hc2sudW5tYXNrZWR2YWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
46184HZhciByZXN1bHQgPSB2YWxob29rR2V0KGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TGFzdFZhbGlkUG9zaXRpb24odW5kZWZpbmVkLCB1bmRlZmluZWQsIGVsZW0uaW5wdXRtYXNrLm1hc2tzZXQudmFsaWRQb3NpdGlvbnMpICE9PSAtMSB8fCBvcHRzLm51bGxhYmxlICE9PSB0cnVlID8gcmVzdWx0IDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgcmV0dXJuIHZhbGhvb2tHZXQoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24oZWxlbSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkZWxlbSA9ICQoZWxlbSksIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbGhvb2tTZXQoZWxlbSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaW5wdXRtYXNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVsZW0udHJpZ2dlcihcInNldHZhbHVlXCIsIFsgdmFsdWUgXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dG1hc2twYXRjaDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2V0dGVyKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXRtYXNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRtYXNrLm9wdHMuYXV0b1VubWFzayA/IHRoaXMuaW5wdXRtYXNrLnVubWFza2VkdmFsdWUoKSA6IGdldExhc3RWYWxpZFBvc2l0aW9uKCkgIT09IC0xIHx8IG9wdHMubnVsbGFibGUgIT09IHRydWUgPyBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzICYmIG9wdHMuY2xlYXJNYXNrT25Mb3N0Rm9jdXMgPyAoaXNSVEwgPyBjbGVhck9wdGlvbmFsVGFpbChnZXRCdWZmZXIoKS5zbGljZSgpKS5yZXZlcnNlKCkgOiBjbGVhck9wdGlvbmFsVGFpbChnZXRCdWZmZXIoKS5zbGljZSgpKSkuam9pbihcIlwiKSA6IHZhbHVlR2V0LmNhbGwodGhpcykgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHJldHVybiB2YWx1ZUdldC5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNldHRlcih2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnB1dG1hc2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnRyaWdnZXIoXCJzZXR2YWx1ZVwiLCBbIHZhbHVlIF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluc3RhbGxOYXRpdmVWYWx1ZVNldEZhbGxiYWNrKG5wdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRSdWxlci5vbihucHQsIFwibW91c2VlbnRlclwiLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkaW5wdXQgPSAkKHRoaXMpLCBpbnB1dCA9IHRoaXMsIHZhbHVlID0gaW5wdXQuaW5wdXRtYXNrLl92YWx1ZUdldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gZ2V0QnVmZmVyKCkuam9pbihcIlwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5wdXQudHJpZ2dlcihcInNldHZhbHVlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghbnB0LmlucHV0bWFzay5fX3ZhbHVlR2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5ub1ZhbHVlUGF0Y2hpbmcgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE9iamVjdC5nZXRQcm90b3R5cGVPZiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YgPSB0eXBlb2YgXCJ0ZXN0XCIuX19wcm90b19fID09PSBcIm9iamVjdFwiID8gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5fX3Byb3RvX187XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZVByb3BlcnR5ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QuZ2V0UHJvdG90eXBlT2YobnB0KSwgXCJ2YWx1ZVwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlUHJvcGVydHkgJiYgdmFsdWVQcm9wZXJ0eS5nZXQgJiYgdmFsdWVQcm9wZXJ0eS5zZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
46184HZhbHVlR2V0ID0gdmFsdWVQcm9wZXJ0eS5nZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVNldCA9IHZhbHVlUHJvcGVydHkuc2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5wdCwgXCJ2YWx1ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBnZXR0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBzZXR0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChucHQudGFnTmFtZSAhPT0gXCJJTlBVVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUdldCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU2V0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5wdCwgXCJ2YWx1ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBnZXR0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBzZXR0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuX19sb29rdXBHZXR0ZXJfXyAmJiBucHQuX19sb29rdXBHZXR0ZXJfXyhcInZhbHVlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlR2V0ID0gbnB0Ll9fbG9va3VwR2V0dGVyX18oXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXQgPSBucHQuX19sb29rdXBTZXR0ZXJfXyhcInZhbHVlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucHQuX19kZWZpbmVHZXR0ZXJfXyhcInZhbHVlXCIsIGdldHRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5wdC5fX2RlZmluZVNldHRlcl9fKFwidmFsdWVcIiwgc2V0dGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnB0LmlucHV0bWFzay5fX3ZhbHVlR2V0ID0gdmFsdWVHZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnB0LmlucHV0bWFzay5fX3ZhbHVlU2V0ID0gdmFsdWVTZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBucHQuaW5wdXRtYXNrLl92YWx1ZUdldCA9IGZ1bmN0aW9uKG92ZXJydWxlUlRMKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzUlRMICYmIG92ZXJydWxlUlRMICE9PSB0cnVlID8gdmFsdWVHZXQuY2FsbCh0aGlzLmVsKS5zcGxpdChcIlwiKS5yZXZlcnNlKCkuam9pbihcIlwiKSA6IHZhbHVlR2V0LmNhbGwodGhpcy5lbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgbnB0LmlucHV0bWFzay5fdmFsdWVTZXQgPSBmdW5jdGlvbih2YWx1ZSwgb3ZlcnJ1bGVSVEwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVNldC5jYWxsKHRoaXMuZWwsIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgPyBcIlwiIDogb3ZlcnJ1bGVSVEwgIT09IHRydWUgJiYgaXNSVEwgPyB2YWx1ZS5zcGxpdChcIlwiKS5yZXZlcnNlKCkuam9pbihcIlwiKSA6IHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVHZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlR2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFZhbGhvb2sobnB0LnR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxOYXRpdmVWYWx1ZVNldEZhbGxiYWNrKG5wdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRUeXBlID0gaW5wdXQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKTtcbiAgICAgICAgICAgICAgICB2Y
46184XIgaXNTdXBwb3J0ZWQgPSBpbnB1dC50YWdOYW1lID09PSBcIklOUFVUXCIgJiYgJC5pbkFycmF5KGVsZW1lbnRUeXBlLCBvcHRzLnN1cHBvcnRzSW5wdXRUeXBlKSAhPT0gLTEgfHwgaW5wdXQuaXNDb250ZW50RWRpdGFibGUgfHwgaW5wdXQudGFnTmFtZSA9PT0gXCJURVhUQVJFQVwiO1xuICAgICAgICAgICAgICAgIGlmICghaXNTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LnRhZ05hbWUgPT09IFwiSU5QVVRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKFwidHlwZVwiLCBlbGVtZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1N1cHBvcnRlZCA9IGVsLnR5cGUgPT09IFwidGV4dFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaXNTdXBwb3J0ZWQgPSBcInBhcnRpYWxcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzU3VwcG9ydGVkICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXRjaFZhbHVlUHJvcGVydHkoaW5wdXQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpbnB1dC5pbnB1dG1hc2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzU3VwcG9ydGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgRXZlbnRSdWxlci5vZmYoZWxlbSk7XG4gICAgICAgICAgICB2Y
46184XIgaXNTdXBwb3J0ZWQgPSBpc0VsZW1lbnRUeXBlU3VwcG9ydGVkKGVsZW0sIG9wdHMpO1xuICAgICAgICAgICAgaWYgKGlzU3VwcG9ydGVkICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGVsID0gZWxlbTtcbiAgICAgICAgICAgICAgICAkZWwgPSAkKGVsKTtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFBsYWNlaG9sZGVyID0gZWwucGxhY2Vob2xkZXI7XG4gICAgICAgICAgICAgICAgbWF4TGVuZ3RoID0gZWwgIT09IHVuZGVmaW5lZCA/IGVsLm1heExlbmd0aCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAobWF4TGVuZ3RoID09PSAtMSkgbWF4TGVuZ3RoID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmIChvcHRzLmNvbG9yTWFzayA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplQ29sb3JNYXNrKGVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXCJpbnB1dG1vZGVcIiBpbiBlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwuaW5wdXRtb2RlID0gb3B0cy5pbnB1dG1vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJpbnB1dG1vZGVcIiwgb3B0cy5pbnB1dG1vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLmRpc2FibGVQcmVkaWN0aXZlVGV4dCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwiYXV0b2NvcnJlY3RcIiBpbiBlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmF1dG9jb3JyZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLmNvbG9yTWFzayAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplQ29sb3JNYXNrKGVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwudHlwZSA9IFwicGFzc3dvcmRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNTdXBwb3J0ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKFwiaW0taW5zZXJ0XCIsIG9wdHMuaW5zZXJ0TW9kZSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50UnVsZXIub24oZWwsIFwic3VibWl0XCIsIEV2ZW50SGFuZGxlcnMuc3VibWl0RXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBFdmVudFJ1bGVyLm9uKGVsLCBcInJlc2V0XCIsIEV2ZW50SGFuZGxlcnMucmVzZXRFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50UnVsZXIub24oZWwsIFwiYmx1clwiLCBFdmVudEhhbmRsZXJzLmJsdXJFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50UnVsZXIub24oZWwsIFwiZm9jdXNcIiwgRXZlbnRIYW5kbGVycy5mb2N1c0V2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMuY29sb3JNYXNrICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJ1bGVyLm9uKGVsLCBcImNsaWNrXCIsIEV2ZW50SGFuZGxlcnMuY2xpY2tFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJ1bGVyLm9uKGVsLCBcIm1vdXNlbGVhdmVcIiwgRXZlbnRIYW5kbGVycy5tb3VzZWxlYXZlRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRSdWxlci5vbihlbCwgXCJtb3VzZWVudGVyXCIsIEV2ZW50SGFuZGxlcnMubW91c2VlbnRlckV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBFdmVudFJ1bGVyLm9uKGVsLCBcInBhc3RlXCIsIEV2ZW50SGFuZGxlcnMucGFzdGVFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50UnVsZXIub24oZWwsIFwiY3V0XCIsIEV2ZW50SGFuZGxlcnMuY3V0RXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBFdmVudFJ1bGVyLm9uKGVsLCBcImNvbXBsZXRlXCIsIG9wdHMub25jb21wbGV0ZSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50UnVsZXIub24oZWwsIFwiaW5jb21wbGV0ZVwiLCBvcHRzLm9uaW5jb21wbGV0ZSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50UnVsZXIub24oZWwsIFwiY2xlYXJlZFwiLCBvcHRzLm9uY2xlYXJlZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbW9iaWxlICYmIG9wdHMuaW5wdXRFdmVudE9ubHkgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UnVsZXIub24oZWwsIFwia2V5ZG93blwiLCBFdmVudEhhbmRsZXJzLmtleWRvd25FdmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJ1bGVyLm9uKGVsLCBcImtleXByZXNzXCIsIEV2ZW50SGFuZGxlcnMua2V5cHJlc3NFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoXCJtYXhMZW5ndGhcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgRXZlbnRSdWxlci5vbihlbCwgXCJpbnB1dFwiLCBFdmVudEhhbmRsZXJzLmlucHV0RmFsbEJhY2tFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50UnVsZXIub24oZWwsIFwiYmVmb3JlaW5wdXRcIiwgRXZlbnRIYW5kbGVycy5iZWZvcmVJbnB1dEV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgRXZlbnRSdWxlci5vbihlbCwgXCJzZXR2YWx1ZVwiLCBFdmVudEhhbmRsZXJzLnNldFZhbHVlRXZlbnQpO1xuICAgICAgICAgICAgICAgIHVuZG9WYWx1ZSA9IGdldEJ1ZmZlclRlbXBsYXRlKCkuam9pbihcIlwiKTtcbiAgICAgICAgICAgICAgICBpZiAoZWwuaW5wdXRtYXNrLl92YWx1ZUdldCh0cnVlKSAhPT0gXCJcIiB8fCBvcHRzLmNsZWFyTWFza09uTG9zdEZvY3VzID09PSBmYWxzZSB8fCBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBlbCkge1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgaW5pdGlhbFZhbHVlID0gJC5pc0Z1bmN0aW9uKG9wdHMub25CZWZvcmVNYXNrKSA/IG9wdHMub25CZWZvcmVNYXNrLmNhbGwoaW5wdXRtYXNrLCBlbC5pbnB1dG1hc2suX3ZhbHVlR2V0KHRydWUpLCBvcHRzKSB8fCBlbC5pbnB1dG1hc2suX3ZhbHVlR2V0KHRydWUpIDogZWwuaW5wdXRtYXNrLl92YWx1ZUdldCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSAhPT0gXCJcIikgY2hlY2tWYWwoZWwsIHRydWUsIGZhbHNlLCBpbml0aWFsVmFsdWUuc3BsaXQoXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gZ2V0QnVmZmVyKCkuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgdW5kb1ZhbHVlID0gYnVmZmVyLmpvaW4oXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbXBsZXRlKGJ1ZmZlcikgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5jbGVhckluY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldE1hc2tTZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5jbGVhck1hc2tPbkxvc3RGb2N1cyAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSBlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldExhc3RWYWxpZFBvc2l0aW9uKCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyT3B0aW9uYWxUYWlsKGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMuY2xlYXJNYXNrT25Mb3N0Rm9jdXMgPT09IGZhbHNlIHx8IG9wdHMuc2hvd01hc2tPbkZvY3VzICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGVsIHx8IGVsLmlucHV0bWFzay5fdmFsdWVHZXQodHJ1ZSkgIT09IFwiXCIpIHdyaXRlQnVmZmVyKGVsLCBidWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmV0KGVsLCBzZWVrTmV4dChnZXRMYXN0VmFsaWRQb3NpdGlvbigpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlQnVmZmVyO1xuICAgICAgICBpZiAoYWN0aW9uT2JqICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uT2JqLmFjdGlvbikge1xuICAgICAgICAgICAgICBjYXNlIFwiaXNDb21wbGV0ZVwiOlxuICAgICAgICAgICAgICAgIGVsID0gYWN0aW9uT2JqLmVsO1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0NvbXBsZXRlKGdldEJ1ZmZlcigpKTtcblxuICAgICAgICAgICAgICBjYXNlIFwidW5tYXNrZWR2YWx1ZVwiOlxuICAgICAgICAgICAgICAgIGlmIChlbCA9PT0gdW5kZWZpbmVkIHx8IGFjdGlvbk9iai52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlQnVmZmVyID0gYWN0aW9uT2JqLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZUJ1ZmZlciA9ICgkLmlzRnVuY3Rpb24ob3B0cy5vbkJlZm9yZU1hc2spID8gb3B0cy5vbkJlZm9yZU1hc2suY2FsbChpbnB1dG1hc2ssIHZhbHVlQnVmZmVyLCBvcHRzKSB8fCB2YWx1ZUJ1ZmZlciA6IHZhbHVlQnVmZmVyKS5zcGxpdChcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tWYWwuY2FsbCh0aGlzLCB1bmRlZmluZWQsIGZhbHNlLCBmYWxzZSwgdmFsdWVCdWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKG9wdHMub25CZWZvcmVXcml0ZSkpIG9wdHMub25CZWZvcmVXcml0ZS5jYWxsKGlucHV0bWFzaywgdW5kZWZpbmVkLCBnZXRCdWZmZXIoKSwgMCwgb3B0cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB1bm1hc2tlZHZhbHVlKGVsKTtcblxuICAgICAgICAgICAgICBjYXNlIFwibWFza1wiOlxuICAgICAgICAgICAgICAgIG1hc2soZWwpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJmb3JtYXRcIjpcbiAgICAgICAgICAgICAgICB2YWx1ZUJ1ZmZlciA9ICgkLmlzRnVuY3Rpb24ob3B0cy5vbkJlZm9yZU1hc2spID8gb3B0cy5vbkJlZm9yZU1hc2suY2FsbChpbnB1dG1hc2ssIGFjdGlvbk9iai52YWx1ZSwgb3B0cykgfHwgYWN0aW9uT2JqLnZhbHVlIDogYWN0aW9uT2JqLnZhbHVlKS5zcGxpdChcIlwiKTtcbiAgICAgICAgICAgICAgICBjaGVja1ZhbC5jYWxsKHRoaXMsIHVuZGVmaW5lZCwgdHJ1ZSwgZmFsc2UsIHZhbHVlQnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uT2JqLm1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXNSVEwgPyBnZXRCdWZmZXIoKS5zbGljZSgpLnJldmVyc2UoKS5qb2luKFwiXCIpIDogZ2V0QnVmZmVyKCkuam9pbihcIlwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOi
46184BtYXNrU2NvcGUuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcImdldG1ldGFkYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG1hc2tzZXQsIG9wdHMpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpc1JUTCA/IGdldEJ1ZmZlcigpLnNsaWNlKCkucmV2ZXJzZSgpLmpvaW4oXCJcIikgOiBnZXRCdWZmZXIoKS5qb2luKFwiXCIpO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJpc1ZhbGlkXCI6XG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbk9iai52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZUJ1ZmZlciA9IGFjdGlvbk9iai52YWx1ZS5zcGxpdChcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tWYWwuY2FsbCh0aGlzLCB1bmRlZmluZWQsIHRydWUsIHRydWUsIHZhbHVlQnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb25PYmoudmFsdWUgPSBnZXRCdWZmZXIoKS5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gZ2V0QnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgdmFyIHJsID0gZGV0ZXJtaW5lTGFzdFJlcXVpcmVkUG9zaXRpb24oKSwgbG1pYiA9IGJ1ZmZlci5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIGZvciAoO2xtaWIgPiBybDsgbG1pYi0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc01hc2sobG1pYikpIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWZmZXIuc3BsaWNlKHJsLCBsbWliICsgMSAtIHJsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNDb21wbGV0ZShidWZmZXIpICYmIGFjdGlvbk9iai52YWx1ZSA9PT0gZ2V0QnVmZmVyKCkuam9pbihcIlwiKTtcblxuICAgICAgICAgICAgICBjYXNlIFwiZ2V0ZW1wdHltYXNrXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldEJ1ZmZlclRlbXBsYXRlKCkuam9pbihcIlwiKTtcblxuICAgICAgICAgICAgICBjYXNlIFwicmVtb3ZlXCI6XG4gICAgICAgICAgICAgICAgaWYgKGVsICYmIGVsLmlucHV0bWFzaykge1xuICAgICAgICAgICAgICAgICAgICAkLmRhdGEoZWwsIFwiX2lucHV0bWFza19vcHRzXCIsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAkZWwgPSAkKGVsKTtcbiAgICAgICAgICAgICAgICAgICAgZWwuaW5wdXRtYXNrLl92YWx1ZVNldChvcHRzLmF1dG9Vbm1hc2sgPyB1bm1hc2tlZHZhbHVlKGVsKSA6IGVsLmlucHV0bWFzay5fdmFsdWVHZXQodHJ1ZSkpO1xuICAgICAgICAgICAgICAgICAgICBFdmVudFJ1bGVyLm9mZihlbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5pbnB1dG1hc2suY29sb3JNYXNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvck1hc2sgPSBlbC5pbnB1dG1hc2suY29sb3JNYXNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JNYXNrLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTWFzay5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbCwgY29sb3JNYXNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTWFzay5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNvbG9yTWFzayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlUHJvcGVydHk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVQcm9wZXJ0eSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmdldFByb3RvdHlwZU9mKGVsKSwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsLmlucHV0bWFzay5fX3ZhbHVlR2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbCwgXCJ2YWx1ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGVsLmlucHV0bWFzay5fX3ZhbHVlR2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBlbC5pbnB1dG1hc2suX192YWx1ZVNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuX19sb29rdXBHZXR0ZXJfXyAmJiBlbC5fX2xvb2t1cEdldHRlcl9fKFwidmFsdWVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbC5pbnB1dG1hc2suX192YWx1ZUdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLl9fZGVmaW5lR2V0dGVyX18oXCJ2YWx1ZVwiLCBlbC5pbnB1dG1hc2suX192YWx1ZUdldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuX19kZWZpbmVTZXR0ZXJfXyhcInZhbHVlXCIsIGVsLmlucHV0bWFzay5fX3ZhbHVlU2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbC5pbnB1dG1hc2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIFwiZ2V0bWV0YWRhdGFcIjpcbiAgICAgICAgICAgICAgICBpZiAoJC5pc0FycmF
461845KG1hc2tzZXQubWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXNrVGFyZ2V0ID0gZ2V0TWFza1RlbXBsYXRlKHRydWUsIDAsIGZhbHNlKS5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAkLmVhY2gobWFza3NldC5tZXRhZGF0YSwgZnVuY3Rpb24obmR4LCBtdGR0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXRkdC5tYXNrID09PSBtYXNrVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1RhcmdldCA9IG10ZHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hc2tUYXJnZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBtYXNrc2V0Lm1ldGFkYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBJbnB1dG1hc2s7XG59KTsiLCIvKiFcbiogaW5wdXRtYXNrLm51bWVyaWMuZXh0ZW5zaW9ucy5qc1xuKiBodHRwczovL2dpdGh1Yi5jb20vUm9iaW5IZXJib3RzL0lucHV0bWFza1xuKiBDb3B5cmlnaHQgKGMpIDIwMTAgLSAyMDE5IFJvYmluIEhlcmJvdHNcbiogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocClcbiogVmVyc2lvbjogNC4wLjZcbiovXG5cbihmdW5jdGlvbihmYWN0b3J5KSB7XG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShbIFwiLi9pbnB1dG1hc2tcIiBdLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9pbnB1dG1hc2tcIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZhY3Rvcnkod2luZG93LklucHV0bWFzayk7XG4gICAgfVxufSkoZnVuY3Rpb24oSW5wdXRtYXNrKSB7XG4gICAgdmFyICQgPSBJbnB1dG1hc2suZGVwZW5kZW5jeUxpYjtcbiAgICBmdW5jdGlvbiBhdXRvRXNjYXBlKHR4dCwgb3B0cykge1xuICAgICAgICB2Y
46184XIgZXNjYXBlZFR4dCA9IFwiXCI7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoSW5wdXRtYXNrLnByb3RvdHlwZS5kZWZpbml0aW9uc1t0eHQuY2hhckF0KGkpXSB8fCBvcHRzLmRlZmluaXRpb25zW3R4dC5jaGFyQXQoaSldIHx8IG9wdHMub3B0aW9uYWxtYXJrZXIuc3RhcnQgPT09IHR4dC5jaGFyQXQoaSkgfHwgb3B0cy5vcHRpb25hbG1hcmtlci5lbmQgPT09IHR4dC5jaGFyQXQoaSkgfHwgb3B0cy5xdWFudGlmaWVybWFya2VyLnN0YXJ0ID09PSB0eHQuY2hhckF0KGkpIHx8IG9wdHMucXVhbnRpZmllcm1hcmtlci5lbmQgPT09IHR4dC5jaGFyQXQoaSkgfHwgb3B0cy5ncm91cG1hcmtlci5zdGFydCA9PT0gdHh0LmNoYXJBdChpKSB8fCBvcHRzLmdyb3VwbWFya2VyLmVuZCA9PT0gdHh0LmNoYXJBdChpKSB8fCBvcHRzLmFsdGVybmF0b3JtYXJrZXIgPT09IHR4dC5jaGFyQXQoaSkpIHtcbiAgICAgICAgICAgICAgICBlc2NhcGVkVHh0ICs9IFwiXFxcXFwiICsgdHh0LmNoYXJBdChpKTtcbiAgICAgICAgICAgIH0gZWxzZSBlc2NhcGVkVHh0ICs9IHR4dC5jaGFyQXQoaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVzY2FwZWRUeHQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFsaWduRGlnaXRzKGJ1ZmZlciwgZGlnaXRzLCBvcHRzKSB7XG4gICAgICAgIGlmIChkaWdpdHMgPiAwKSB7XG4gICAgICAgICAgICB2YXIgcmFkaXhQb3NpdGlvbiA9ICQuaW5BcnJheShvcHRzLnJhZGl4UG9pbnQsIGJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAocmFkaXhQb3NpdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBidWZmZXIucHVzaChvcHRzLnJhZGl4UG9pbnQpO1xuICAgICAgICAgICAgICAgIHJhZGl4UG9zaXRpb24gPSBidWZmZXIubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IGRpZ2l0czsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW3JhZGl4UG9zaXRpb24gKyBpXSA9IGJ1ZmZlcltyYWRpeFBvc2l0aW9uICsgaV0gfHwgXCIwXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9XG4gICAgSW5wdXRtYXNrLmV4dGVuZEFsaWFzZXMoe1xuICAgICAgICBudW1lcmljOiB7XG4gICAgICAgICAgICBtYXNrOiBmdW5jdGlvbihvcHRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMucmVwZWF0ICE9PSAwICYmIGlzTmFOKG9wdHMuaW50ZWdlckRpZ2l0cykpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5pbnRlZ2VyRGlnaXRzID0gb3B0cy5yZXBlYXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9wdHMucmVwZWF0ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAob3B0cy5ncm91cFNlcGFyYXRvciA9PT0gb3B0cy5yYWRpeFBvaW50ICYmIG9wdHMuZGlnaXRzICYmIG9wdHMuZGlnaXRzICE9PSBcIjBcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5yYWRpeFBvaW50ID09PSBcIi5cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5ncm91cFNlcGFyYXRvciA9IFwiLFwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdHMucmFkaXhQb2ludCA9PT0gXCIsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuZ3JvdXBTZXBhcmF0b3IgPSBcIi5cIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIG9wdHMuZ3JvdXBTZXBhcmF0b3IgPSBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0cy5ncm91cFNlcGFyYXRvciA9PT0gXCIgXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5za2lwT3B0aW9uYWxQYXJ0Q2hhcmFjdGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvcHRzLmF1dG9Hcm91cCA9IG9wdHMuYXV0b0dyb3VwICYmIG9wdHMuZ3JvdXBTZXBhcmF0b3IgIT09IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMuYXV0b0dyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0cy5ncm91cFNpemUgPT0gXCJzdHJpbmdcIiAmJiBpc0Zpbml0ZShvcHRzLmdyb3VwU2l6ZSkpIG9wdHMuZ3JvdXBTaXplID0gcGFyc2VJbnQob3B0cy5ncm91cFNpemUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNGaW5pdGUob3B0cy5pbnRlZ2VyRGlnaXRzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlcHMgPSBNYXRoLmZsb29yKG9wdHMuaW50ZWdlckRpZ2l0cyAvIG9wdHMuZ3JvdXBTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2QgPSBvcHRzLmludGVnZXJEaWdpdHMgJSBvcHRzLmdyb3VwU2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuaW50ZWdlckRpZ2l0cyA9IHBhcnNlSW50KG9wdHMuaW50ZWdlckRpZ2l0cykgKyAobW9kID09PSAwID8gc2VwcyAtIDEgOiBzZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLmludGVnZXJEaWdpdHMgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5pbnRlZ2VyRGlnaXRzID0gXCIqXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMucGxhY2Vob2xkZXIubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBvcHRzLnBsYWNlaG9sZGVyID0gb3B0cy5wbGFjZWhvbGRlci5jaGFyQXQoMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRzLnBvc2l0aW9uQ2FyZXRPbkNsaWNrID09PSBcInJhZGl4Rm9jdXNcIiAmJiAob3B0cy5wbGFjZWhvbGRlciA9PT0gXCJcIiAmJiBvcHRzLmludGVnZXJPcHRpb25hbCA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdHMucG9zaXRpb25DYXJldE9uQ2xpY2sgP
46184SBcImx2cFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvcHRzLmRlZmluaXRpb25zW1wiO1wiXSA9IG9wdHMuZGVmaW5pdGlvbnNbXCJ+XCJdO1xuICAgICAgICAgICAgICAgIG9wdHMuZGVmaW5pdGlvbnNbXCI7XCJdLmRlZmluaXRpb25TeW1ib2wgPSBcIn5cIjtcbiAgICAgICAgICAgICAgICBpZiAob3B0cy5udW1lcmljSW5wdXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5wb3NpdGlvbkNhcmV0T25DbGljayA9IG9wdHMucG9zaXRpb25DYXJldE9uQ2xpY2sgPT09IFwicmFkaXhGb2N1c1wiID8gXCJsdnBcIiA6IG9wdHMucG9zaXRpb25DYXJldE9uQ2xpY2s7XG4gICAgICAgICAgICAgICAgICAgIG9wdHMuZGlnaXRzT3B0aW9uYWwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKG9wdHMuZGlnaXRzKSkgb3B0cy5kaWdpdHMgPSAyO1xuICAgICAgICAgICAgICAgICAgICBvcHRzLmRlY2ltYWxQcm90ZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBtYXNrID0gXCJbK11cIjtcbiAgICAgICAgICAgICAgICBtYXNrICs9IGF1dG9Fc2NhcGUob3B0cy5wcmVmaXgsIG9wdHMpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRzLmludGVnZXJPcHRpb25hbCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBtYXNrICs9IFwifnsxLFwiICsgb3B0cy5pbnRlZ2VyRGlnaXRzICsgXCJ9XCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIG1hc2sgKz0gXCJ+e1wiICsgb3B0cy5pbnRlZ2VyRGlnaXRzICsgXCJ9XCI7XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMuZGlnaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJhZGl4RGVmID0gb3B0cy5kZWNpbWFsUHJvdGVjdCA/IFwiOlwiIDogb3B0cy5yYWRpeFBvaW50O1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgZHEgPSBvcHRzLmRpZ2l0cy50b1N0cmluZygpLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmluaXRlKGRxWzBdKSAmJiBkcVsxXSAmJiBpc0Zpbml0ZShkcVsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgKz0gcmFkaXhEZWYgKyBcIjt7XCIgKyBvcHRzLmRpZ2l0cyArIFwifVwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTmFOKG9wdHMuZGlnaXRzKSB8fCBwYXJzZUludChvcHRzLmRpZ2l0cykgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5kaWdpdHNPcHRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgKz0gXCJbXCIgKyByYWRpeERlZiArIFwiO3sxLFwiICsgb3B0cy5kaWdpdHMgKyBcIn1dXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgbWFzayArPSByYWRpeERlZiArIFwiO3tcIiArIG9wdHMuZGlnaXRzICsgXCJ9XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWFzayArPSBhdXRvRXNjYXBlKG9wdHMuc3VmZml4LCBvcHRzKTtcbiAgICAgICAgICAgICAgICBtYXNrICs9IFwiWy1dXCI7XG4gICAgICAgICAgICAgICAgb3B0cy5ncmVlZHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFzaztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJcIixcbiAgICAgICAgICAgIGdyZWVkeTogZmFsc2UsXG4gICAgICAgICAgICBkaWdpdHM6IFwiKlwiLFxuICAgICAgICAgICAgZGlnaXRzT3B0aW9uYWw6IHRydWUsXG4gICAgICAgICAgICBlbmZvcmNlRGlnaXRzT25CbHVyOiBmYWxzZSxcbiAgICAgICAgICAgIHJhZGl4UG9pbnQ6IFwiLlwiLFxuICAgICAgICAgICAgcG9zaXRpb25DYXJldE9uQ2xpY2s6IFwicmFkaXhGb2N1c1wiLFxuICAgICAgICAgICAgZ3JvdXBTaXplOiAzLFxuICAgICAgICAgICAgZ3JvdXBTZXBhcmF0b3I6IFwiXCIsXG4gICAgICAgICAgICBhdXRvR3JvdXA6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dNaW51czogdHJ1ZSxcbiAgICAgICAgICAgIG5lZ2F0aW9uU3ltYm9sOiB7XG4gICAgICAgICAgICAgICAgZnJvbnQ6IFwiLVwiLFxuICAgICAgICAgICAgICAgIGJhY2s6IFwiXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnRlZ2VyRGlnaXRzOiBcIitcIixcbiAgICAgICAgICAgIGludGVnZXJPcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgICAgIHByZWZpeDogXCJcIixcbiAgICAgICAgICAgIHN1ZmZpeDogXCJcIixcbiAgICAgICAgICAgIHJpZ2h0QWxpZ246IHRydWUsXG4gICAgICAgICAgICBkZWNpbWFsUHJvdGVjdDogdHJ1ZSxcbiAgICAgICAgICAgIG1pbjogbnVsbCxcbiAgICAgICAgICAgIG1heDogbnVsbCxcbiAgICAgICAgICAgIHN0ZXA6IDEsXG4gICAgICAgICAgICBpbnNlcnRNb2RlOiB0cnVlLFxuICAgICAgICAgICAgYXV0b1VubWFzazogZmFsc2UsXG4gICAgICAgICAgICB1bm1hc2tBc051bWJlcjogZmFsc2UsXG4gICAgICAgICAgICBpbnB1dFR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgaW5wdXRtb2RlOiBcIm51bWVyaWNcIixcbiAgICAgICAgICAgIHByZVZhbGlkYXRpb246IGZ1bmN0aW9uKGJ1ZmZlciwgcG9zLCBjLCBpc1NlbGVjdGlvbiwgb3B0cywgbWFza3NldCkge1xuICAgICAgICAgICAgICAgIGlmIChjID09PSBcIi1cIiB8fCBjID09PSBvcHRzLm5lZ2F0aW9uU3ltYm9sLmZyb250KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLmFsbG93TWludXMgIT09IHRydWUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5pc05lZ2F0aXZlID0gb3B0cy5pc05lZ2F0aXZlID09PSB1bmRlZmluZWQgPyB0cnVlIDogIW9wdHMuaXNOZWdhdGl2ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci5qb2luKFwiXCIpID09PSBcIlwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmV0OiBtYXNrc2V0LnZhbGlkUG9zaXRpb25zW3Bvc10gPyBwb3MgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb3Bvc3Q6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzU2VsZWN0aW9uID09PSBmYWxzZSAmJiBjID09PSBvcHRzLnJhZGl4UG9pbnQgJiYgKG9wdHMuZGlnaXRzICE9PSB1bmRlZmluZWQgJiYgKGlzTmFOKG9wdHMuZGlnaXRzKSB8fCBwYXJzZUludChvcHRzLmRpZ2l0cykgPiAwKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJhZGl4UG9zID0gJC5pbkFycmF5KG9wdHMucmFkaXhQb2ludCwgYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhZGl4UG9zICE9PSAtMSAmJiBtYXNrc2V0LnZhbGlkUG9zaXRpb25zW3JhZGl4UG9zXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5udW1lcmljSW5wdXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zID09PSByYWRpeFBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQ6IHJhZGl4UG9zICsgMVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwb3N0VmFsaWRhdGlvbjogZnVuY3Rpb24oYnVmZmVyLCBwb3MsIGN1cnJlbnRSZXN1bHQsIG9wdHMpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBidWlsZFBvc3RNYXNrKGJ1ZmZlciwgb3B0cykge1xuICAgICAgICAgICAgICAgICAgICB2Y
46184XIgcG9zdE1hc2sgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBwb3N0TWFzayArPSBcIihcIiArIG9wdHMuZ3JvdXBTZXBhcmF0b3IgKyBcIip7XCIgKyBvcHRzLmdyb3VwU2l6ZSArIFwifSl7Kn1cIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMucmFkaXhQb2ludCAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJhZGl4U3BsaXQgPSBidWZmZXIuam9pbihcIlwiKS5zcGxpdChvcHRzLnJhZGl4UG9pbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhZGl4U3BsaXRbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0TWFzayArPSBvcHRzLnJhZGl4UG9pbnQgKyBcIip7XCIgKyByYWRpeFNwbGl0WzFdLm1hdGNoKC9eXFxkKlxcPz9cXGQqLylbMF0ubGVuZ3RoICsgXCJ9XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc3RNYXNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgc3VmZml4ID0gb3B0cy5zdWZmaXguc3BsaXQoXCJcIiksIHByZWZpeCA9IG9wdHMucHJlZml4LnNwbGl0KFwiXCIpO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UmVzdWx0LnBvcyA9PT0gdW5kZWZpbmVkICYmIGN1cnJlbnRSZXN1bHQuY2FyZXQgIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50UmVzdWx0LmRvcG9zdCAhPT0gdHJ1ZSkgcmV0dXJuIGN1cnJlbnRSZXN1bHQ7XG4gICAgICAgICAgICAgICAgdmFyIGNhcmV0UG9zID0gY3VycmVudFJlc3VsdC5jYXJldCAhPT0gdW5kZWZpbmVkID8gY3VycmVudFJlc3VsdC5jYXJldCA6IGN1cnJlbnRSZXN1bHQucG9zO1xuICAgICAgICAgICAgICAgIHZhciBtYXNrZWRWYWx1ZSA9IGJ1ZmZlci5zbGljZSgpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRzLm51bWVyaWNJbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBjYXJldFBvcyA9IG1hc2tlZFZhbHVlLmxlbmd0aCAtIGNhcmV0UG9zIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgbWFza2VkVmFsdWUgPSBtYXNrZWRWYWx1ZS5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBjaGFyQXRQb3MgPSBtYXNrZWRWYWx1ZVtjYXJldFBvc107XG4gICAgICAgICAgICAgICAgaWYgKGNoYXJBdFBvcyA9PT0gb3B0cy5ncm91cFNlcGFyYXRvcikge1xuICAgICAgICAgICAgICAgICAgICBjYXJldFBvcyArPSAxO1xuICAgICAgICAgICAgICAgICAgICBjaGFyQXRQb3MgPSBtYXNrZWRWYWx1ZVtjYXJldFBvc107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjYXJldFBvcyA9PT0gbWFza2VkVmFsdWUubGVuZ3RoIC0gb3B0cy5zdWZmaXgubGVuZ3RoIC0gMSAmJiBjaGFyQXRQb3MgPT09IG9wdHMucmFkaXhQb2ludCkgcmV0dXJuIGN1cnJlbnRSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKGNoYXJBdFBvcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyQXRQb3MgIT09IG9wdHMucmFkaXhQb2ludCAmJiBjaGFyQXRQb3MgIT09IG9wdHMubmVnYXRpb25TeW1ib2wuZnJvbnQgJiYgY2hhckF0UG9zICE9PSBvcHRzLm5lZ2F0aW9uU3ltYm9sLmJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tlZFZhbHVlW2NhcmV0UG9zXSA9IFwiP1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMucHJlZml4Lmxlbmd0aCA+IDAgJiYgY2FyZXRQb3MgPj0gKG9wdHMuaXNOZWdhdGl2ZSA9PT0gZmFsc2UgPyAxIDogMCkgJiYgY2FyZXRQb3MgPCBvcHRzLnByZWZpeC5sZW5ndGggLSAxICsgKG9wdHMuaXNOZWdhdGl2ZSA9PT0gZmFsc2UgPyAxIDogMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhbY2FyZXRQb3MgLSAob3B0cy5pc05lZ2F0aXZlID09PSBmYWxzZSA/IDEgOiAwKV0gPSBcIj9cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0cy5zdWZmaXgubGVuZ3RoID4gMCAmJiBjYXJldFBvcyA+PSBtYXNrZWRWYWx1ZS5sZW5ndGggLSBvcHRzLnN1ZmZpeC5sZW5ndGggLSAob3B0cy5pc05lZ2F0aXZlID09PSBmYWxzZSA/IDEgOiAwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeFtjYXJldFBvcyAtIChtYXNrZWRWYWx1ZS5sZW5ndGggLSBvcHRzLnN1ZmZpeC5sZW5ndGggLSAob3B0cy5pc05lZ2F0aXZlID09PSBmYWxzZSA/IDEgOiAwKSldID0gXCI/XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4LmpvaW4oXCJcIik7XG4gICAgICAgICAgICAgICAgc3VmZml4ID0gc3VmZml4LmpvaW4oXCJcIik7XG4gICAgICAgICAgICAgICAgdmFyIHByb2Nlc3NWYWx1ZSA9IG1hc2tlZFZhbHVlLmpvaW4oXCJcIikucmVwbGFjZShwcmVmaXgsIFwiXCIpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3NWYWx1ZSA9IHByb2Nlc3NWYWx1ZS5yZXBsYWNlKHN1ZmZpeCwgXCJcIik7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc1ZhbHVlID0gcHJvY2Vzc1ZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChJbnB1dG1hc2suZXNjYXBlUmVnZXgob3B0cy5ncm91cFNlcGFyYXRvciksIFwiZ1wiKSwgXCJcIik7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc1ZhbHVlID0gcHJvY2Vzc1ZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChcIlstXCIgKyBJbnB1dG1hc2suZXNjYXBlUmVnZXgob3B0cy5uZWdhdGlvblN5bWJvbC5mcm9udCkgKyBcIl1cIiwgXCJnXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKElucHV0bWFzay5lc2NhcGVSZWdleChvcHRzLm5lZ2F0aW9uU3ltYm9sLmJhY2spICsgXCIkXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4ob3B0cy5wbGFjZWhvbGRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1ZhbHVlID0gcHJvY2Vzc1ZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChJbnB1dG1hc2suZXNjYXBlUmVnZXgob3B0cy5wbGFjZWhvbGRlciksIFwiZ1wiKSwgXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzVmFsdWUubGVuZ3RoID4gMSAmJiBwcm9jZXNzVmFsdWUuaW5kZXhPZihvcHRzLnJhZGl4UG9pbnQpICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyQXRQb3MgPT09IFwiMFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUucmVwbGFjZSgvXlxcPy9nLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUucmVwbGFjZSgvXjAvZywgXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzVmFsdWUuY2hhckF0KDApID09PSBvcHRzLnJhZGl4UG9pbnQgJiYgb3B0cy5yYWRpeFBvaW50ICE9PSBcIlwiICYmIG9wdHMubnVtZXJpY0lucHV0ICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgI
46184HByb2Nlc3NWYWx1ZSA9IFwiMFwiICsgcHJvY2Vzc1ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc1ZhbHVlICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NWYWx1ZSA9IHByb2Nlc3NWYWx1ZS5zcGxpdChcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCghb3B0cy5kaWdpdHNPcHRpb25hbCB8fCBvcHRzLmVuZm9yY2VEaWdpdHNPbkJsdXIgJiYgY3VycmVudFJlc3VsdC5ldmVudCA9PT0gXCJibHVyXCIpICYmIGlzRmluaXRlKG9wdHMuZGlnaXRzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJhZGl4UG9zaXRpb24gPSAkLmluQXJyYXkob3B0cy5yYWRpeFBvaW50LCBwcm9jZXNzVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJwYiA9ICQuaW5BcnJheShvcHRzLnJhZGl4UG9pbnQsIG1hc2tlZFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYWRpeFBvc2l0aW9uID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NWYWx1ZS5wdXNoKG9wdHMucmFkaXhQb2ludCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXhQb3NpdGlvbiA9IHByb2Nlc3NWYWx1ZS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gb3B0cy5kaWdpdHM7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIW9wdHMuZGlnaXRzT3B0aW9uYWwgfHwgb3B0cy5lbmZvcmNlRGlnaXRzT25CbHVyICYmIGN1cnJlbnRSZXN1bHQuZXZlbnQgPT09IFwiYmx1clwiKSAmJiAocHJvY2Vzc1ZhbHVlW3JhZGl4UG9zaXRpb24gKyBpXSA9PT0gdW5kZWZpbmVkIHx8IHByb2Nlc3NWYWx1ZVtyYWRpeFBvc2l0aW9uICsgaV0gPT09IG9wdHMucGxhY2Vob2xkZXIuY2hhckF0KDApKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWVbcmFkaXhQb3NpdGlvbiArIGldID0gY3VycmVudFJlc3VsdC5wbGFjZWhvbGRlciB8fCBvcHRzLnBsYWNlaG9sZGVyLmNoYXJBdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwYiAhPT0gLTEgJiYgbWFza2VkVmFsdWVbcnBiICsgaV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWVbcmFkaXhQb3NpdGlvbiArIGldID0gcHJvY2Vzc1ZhbHVlW3JhZGl4UG9zaXRpb24gKyBpXSB8fCBtYXNrZWRWYWx1ZVtycGIgKyBpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMuYXV0b0dyb3VwID09PSB0cnVlICYmIG9wdHMuZ3JvdXBTZXBhcmF0b3IgIT09IFwiXCIgJiYgKGNoYXJBdFBvcyAhPT0gb3B0cy5yYWRpeFBvaW50IHx8IGN1cnJlbnRSZXN1bHQucG9zICE9PSB1bmRlZmluZWQgfHwgY3VycmVudFJlc3VsdC5kb3Bvc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgYWRkUmFkaXggPSBwcm9jZXNzVmFsdWVbcHJvY2Vzc1ZhbHVlLmxlbmd0aCAtIDFdID09PSBvcHRzLnJhZGl4UG9pbnQgJiYgY3VycmVudFJlc3VsdC5jID09PSBvcHRzLnJhZGl4UG9pbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBJbnB1dG1hc2soYnVpbGRQb3N0TWFzayhwcm9jZXNzVmFsdWUsIG9wdHMpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJpY0lucHV0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdE1hc2tpbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIqXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcjogXCJbMC05P11cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5mb3JtYXQocHJvY2Vzc1ZhbHVlLmpvaW4oXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZFJhZGl4KSBwcm9jZXNzVmFsdWUgKz0gb3B0cy5yYWRpeFBvaW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NWYWx1ZS5jaGFyQXQoMCkgPT09IG9wdHMuZ3JvdXBTZXBhcmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUuc3Vic3RyKDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgcHJvY2Vzc1ZhbHVlID0gcHJvY2Vzc1ZhbHVlLmpvaW4oXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRzLmlzTmVnYXRpdmUgJiYgY3VycmVudFJlc3VsdC5ldmVudCA9PT0gXCJibHVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5pc05lZ2F0aXZlID0gcHJvY2Vzc1ZhbHVlICE9PSBcIjBcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvY2Vzc1ZhbHVlID0gcHJlZml4ICsgcHJvY2Vzc1ZhbHVlO1xuICAgICAgICAgICAgICAgIHByb2Nlc3NWYWx1ZSArPSBzdWZmaXg7XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMuaXNOZWdhdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBvcHRzLm5lZ2F0aW9uU3ltYm9sLmZyb250ICsgcHJvY2Vzc1ZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgKz0gb3B0cy5uZWdhdGlvblN5bWJvbC5iYWNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUuc3BsaXQoXCJcIik7XG4gICAgICAgICAgICAgICAgaWYgKGNoYXJBdFBvcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyQXRQb3MgIT09IG9wdHMucmFkaXhQb2ludCAmJiBjaGFyQXRQb3MgIT09IG9wdHMubmVnYXRpb25TeW1ib2wuZnJvbnQgJiYgY2hhckF0UG9zICE9PSBvcHRzLm5lZ2F0aW9uU3ltYm9sLmJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmV0UG9zID0gJC5pbkFycmF5KFwiP1wiLCBwcm9jZXNzVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhcmV0UG9zID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWVbY2FyZXRQb3NdID0gY2hhckF0UG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGNhcmV0UG9zID0gY3VycmVudFJlc3VsdC5jYXJldCB8fCAwO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXJBdFBvcyA9PT0gb3B0cy5yYWRpeFBvaW50IHx8IGNoYXJBdFBvcyA9PT0gb3B0cy5uZWdhdGlvblN5bWJvbC5mcm9udCB8fCBjaGFyQXRQb3MgPT09IG9wdHMubmVnYXRpb25TeW1ib2wuYmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NhcmV0UG9zID0gJC5pbkFycmF5KGNoYXJBdFBvcywgcHJvY2Vzc1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDYXJldFBvcyAhPT0gLTEpIGNhcmV0UG9zID0gbmV3Q2FyZXRQb3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMubnVtZXJpY0lucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhcmV0UG9zID0gcHJvY2Vzc1ZhbHVlLmxlbmd0aCAtIGNhcmV0UG9zIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1ZhbHVlID0gcHJvY2Vzc1ZhbHVlLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHJzbHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNhcmV0OiAoY2hhckF0UG9zID09PSB1bmRlZmluZWQgfHwgY3VycmVudFJlc3VsdC5wb3MgIT09IHVuZGVmaW5lZCkgJiYgY2FyZXRQb3MgIT09IHVuZGVmaW5lZCA/IGNhcmV0UG9zICsgKG9wdHMubnVtZXJpY0lucHV0ID8gLTEgOiAxKSA6IGNhcmV0UG9zLFxuICAgICAgICAgICAgICAgICAgICBidWZmZXI6IHByb2Nlc3NWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaEZyb21CdWZmZXI6IGN1cnJlbnRSZXN1bHQuZG9wb3N0IHx8IGJ1ZmZlci5qb2luKFwiXCIpICE9PSBwcm9jZXNzVmFsdWUuam9pbihcIlwiKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJzbHQucmVmcmVzaEZyb21CdWZmZXIgPyByc2x0IDogY3VycmVudFJlc3VsdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkJlZm9yZVdyaXRlOiBmdW5jdGlvbihlLCBidWZmZXIsIGNhcmV0UG9zLCBvcHRzKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gcGFyc2VNaW5NYXhPcHRpb25zKG9wdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMucGFyc2VNaW5NYXhPcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLm1pbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMubWluID0gb3B0cy5taW4udG9TdHJpbmc
46184oKS5yZXBsYWNlKG5ldyBSZWdFeHAoSW5wdXRtYXNrLmVzY2FwZVJlZ2V4KG9wdHMuZ3JvdXBTZXBhcmF0b3IpLCBcImdcIiksIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLnJhZGl4UG9pbnQgPT09IFwiLFwiKSBvcHRzLm1pbiA9IG9wdHMubWluLnJlcGxhY2Uob3B0cy5yYWRpeFBvaW50LCBcIi5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5taW4gPSBpc0Zpbml0ZShvcHRzLm1pbikgPyBwYXJzZUZsb2F0KG9wdHMubWluKSA6IE5hTjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4ob3B0cy5taW4pKSBvcHRzLm1pbiA9IE51bWJlci5NSU5fVkFMVUU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5tYXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLm1heCA9IG9wdHMubWF4LnRvU3RyaW5nKCkucmVwbGFjZShuZXcgUmVnRXhwKElucHV0bWFzay5lc2NhcGVSZWdleChvcHRzLmdyb3VwU2VwYXJhdG9yKSwgXCJnXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5yYWRpeFBvaW50ID09PSBcIixcIikgb3B0cy5tYXggPSBvcHRzLm1heC5yZXBsYWNlKG9wdHMucmFkaXhQb2ludCwgXCIuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMubWF4ID0gaXNGaW5pdGUob3B0cy5tYXgpID8gcGFyc2VGbG9hdChvcHRzLm1heCkgOiBOYU47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKG9wdHMubWF4KSkgb3B0cy5tYXggPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5wYXJzZU1pbk1heE9wdGlvbnMgPSBcImRvbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJrZXlkb3duXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0cy5wb3N0VmFsaWRhdGlvbihidWZmZXIsIGNhcmV0UG9zLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQ6IGNhcmV0UG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvcG9zdDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb3B0cyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYmx1clwiOlxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjaGVja3ZhbFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVubWFza2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VNaW5NYXhPcHRpb25zKG9wdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMubWluICE9PSBudWxsIHx8IG9wdHMubWF4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5tYXNrZWQgPSBvcHRzLm9uVW5NYXNrKGJ1ZmZlci5qb2luKFwiXCIpLCB1bmRlZmluZWQsICQuZXh0ZW5kKHt9LCBvcHRzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubWFza0FzTnVtYmVyOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLm1pbiAhPT0gbnVsbCAmJiB1bm1hc2tlZCA8IG9wdHMubWluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuaXNOZWdhdGl2ZSA9IG9wdHMubWluIDwgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdHMucG9zdFZhbGlkYXRpb24ob3B0cy5taW4udG9TdHJpbmcoKS5yZXBsYWNlKFwiLlwiLCBvcHRzLnJhZGl4UG9pbnQpLnNwbGl0KFwiXCIpLCBjYXJldFBvcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQ6IGNhcmV0UG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9wb3N0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9wdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0cy5tYXggIT09IG51bGwgJiYgdW5tYXNrZWQgPiBvcHRzLm1heCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLmlzTmVnYXRpdmUgPSBvcHRzLm1heCA8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRzLnBvc3RWYWxpZGF0aW9uKG9wdHMubWF4LnRvU3RyaW5nKCkucmVwbGFjZShcIi5cIiwgb3B0cy5yYWRpeFBvaW50KS5zcGxpdChcIlwiKSwgY2FyZXRQb3MsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmV0OiBjYXJldFBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvcG9zdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBvcHRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0cy5wb3N0VmFsaWRhdGlvbihidWZmZXIsIGNhcmV0UG9zLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQ6IGNhcmV0UG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIjBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogXCJibHVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9wdHMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIl9jaGVja3ZhbFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJldDogY2FyZXRQb3NcbiAgICAgICAgICAgICAgICAgICAgICAgI
46184H07XG5cbiAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVnZXg6IHtcbiAgICAgICAgICAgICAgICBpbnRlZ2VyUGFydDogZnVuY3Rpb24ob3B0cywgZW1wdHlDaGVjaykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1wdHlDaGVjayA/IG5ldyBSZWdFeHAoXCJbXCIgKyBJbnB1dG1hc2suZXNjYXBlUmVnZXgob3B0cy5uZWdhdGlvblN5bWJvbC5mcm9udCkgKyBcIitdP1wiKSA6IG5ldyBSZWdFeHAoXCJbXCIgKyBJbnB1dG1hc2suZXNjYXBlUmVnZXgob3B0cy5uZWdhdGlvblN5bWJvbC5mcm9udCkgKyBcIitdP1xcXFxkK1wiKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGludGVnZXJOUGFydDogZnVuY3Rpb24ob3B0cykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChcIltcXFxcZFwiICsgSW5wdXRtYXNrLmVzY2FwZVJlZ2V4KG9wdHMuZ3JvdXBTZXBhcmF0b3IpICsgSW5wdXRtYXNrLmVzY2FwZVJlZ2V4KG9wdHMucGxhY2Vob2xkZXIuY2hhckF0KDApKSArIFwiXStcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlZmluaXRpb25zOiB7XG4gICAgICAgICAgICAgICAgXCJ+XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbihjaHJzLCBtYXNrc2V0LCBwb3MsIHN0cmljdCwgb3B0cywgaXNTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc1ZhbGlkLCBsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocnMgPT09IFwia1wiIHx8IGNocnMgPT09IFwibVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0OiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaHJzID09PSBcImtcIiA/IDIgOiA1OyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVmFsaWQuaW5zZXJ0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zOiBwb3MgKyBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZC5wb3MgPSBwb3MgKyBsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHN0cmljdCA/IG5ldyBSZWdFeHAoXCJbMC05XCIgKyBJbnB1dG1hc2suZXNjYXBlUmVnZXgob3B0cy5ncm91cFNlcGFyYXRvcikgKyBcIl1cIikudGVzdChjaHJzKSA6IG5ldyBSZWdFeHAoXCJbMC05XVwiKS50ZXN0KGNocnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5udW1lcmljSW5wdXQgIT09IHRydWUgJiYgbWFza3NldC52YWxpZFBvc2l0aW9uc1twb3NdICE9PSB1bmRlZmluZWQgJiYgbWFza3NldC52YWxpZFBvc2l0aW9uc1twb3NdLm1hdGNoLmRlZiA9PT0gXCJ+XCIgJiYgIWlzU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9jZXNzVmFsdWUgPSBtYXNrc2V0LmJ1ZmZlci5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKFwiWy1cIiArIElucHV0bWFzay5lc2NhcGVSZWdleChvcHRzLm5lZ2F0aW9uU3ltYm9sLmZyb250KSArIFwiXVwiLCBcImdcIiksIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKElucHV0bWFzay5lc2NhcGVSZWdleChvcHRzLm5lZ2F0aW9uU3ltYm9sLmJhY2spICsgXCIkXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHB2UmFkaXhTcGxpdCA9IHByb2Nlc3NWYWx1ZS5zcGxpdChvcHRzLnJhZGl4UG9pbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHZSYWRpeFNwbGl0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2UmFkaXhTcGxpdFsxXSA9IHB2UmFkaXhTcGxpdFsxXS5yZXBsYWNlKC8wL2csIG9wdHMucGxhY2Vob2xkZXIuY2hhckF0KDApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHZSYWRpeFNwbGl0WzBdID09PSBcIjBcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZSYWRpeFNwbGl0WzBdID0gcHZSYWRpeFNwbGl0WzBdLnJlcGxhY2UoLzAvZywgb3B0cy5wbGFjZWhvbGRlci5jaGFyQXQoMCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NWYWx1ZSA9IHB2UmFkaXhTcGxpdFswXSArIG9wdHMucmFkaXhQb2ludCArIHB2UmFkaXhTcGxpdFsxXSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgYnVmZmVyVGVtcGxhdGUgPSBtYXNrc2V0Ll9idWZmZXIuam9pbihcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NWYWx1ZSA9PT0gb3B0cy5yYWRpeFBvaW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBidWZmZXJUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocHJvY2Vzc1ZhbHVlLm1hdGNoKElucHV0bWFzay5lc2NhcGVSZWdleChidWZmZXJUZW1wbGF0ZSkgKyBcIiRcIikgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclRlbXBsYXRlID0gYnVmZmVyVGVtcGxhdGUuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1ZhbHVlID0gcHJvY2Vzc1ZhbHVlLnJlcGxhY2UoYnVmZmVyVGVtcGxhdGUsIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUuc3BsaXQoXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzVmFsdWVbcG9zXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvczogcG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZTogcG9zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3M6IHBvc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmljdCAmJiBjaHJzID09PSBvcHRzLnJhZGl4UG9pbnQgJiYgbWFza3NldC52YWxpZFBvc2l0aW9uc1twb3MgLSAxXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3M6IHBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zOiBwb3MgKyAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCIrXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbihjaHJzLCBtYXNrc2V0LCBwb3MsIHN0cmljdCwgb3B0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdHMuYWxsb3dNaW51cyAmJiAoY2hycyA9PT0gXCItXCIgfHwgY2hycyA9PT0gb3B0cy5uZWdhdGlvblN5bWJvbC5mcm9udCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCItXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbihjaHJzLCBtYXNrc2V0LCBwb3MsIHN0cmljdCwgb3B0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdHMuYWxsb3dNaW51cyAmJiBjaHJzID09PSBvcHRzLm5lZ2F0aW9uU3ltYm9sLmJhY2s7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCI6XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbihjaHJzLCBtYXNrc2V0LCBwb3MsIHN0cmljdCwgb3B0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJhZGl4ID0gXCJbXCIgKyBJbnB1dG1hc2suZXNjYXBlUmVnZXgob3B0cy5yYWRpeFBvaW50KSArIFwiXVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzVmFsaWQgPSBuZXcgUmVnRXhwKHJhZGl4KS50ZXN0KGNocnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQgJiYgbWFza3NldC52YWxpZFBvc2l0aW9uc1twb3NdICYmIG1hc2tzZXQudmFsaWRQb3NpdGlvbnNbcG9zXS5tYXRjaC5wbGFjZWhvbGRlciA9PT0gb3B0cy5yYWRpeFBvaW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXQ6IHBvcyArIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogZnVuY3Rpb24ob3B0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdHMucmFkaXhQb2ludDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgI
46184H1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblVuTWFzazogZnVuY3Rpb24obWFza2VkVmFsdWUsIHVubWFza2VkVmFsdWUsIG9wdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodW5tYXNrZWRWYWx1ZSA9PT0gXCJcIiAmJiBvcHRzLm51bGxhYmxlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bm1hc2tlZFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcHJvY2Vzc1ZhbHVlID0gbWFza2VkVmFsdWUucmVwbGFjZShvcHRzLnByZWZpeCwgXCJcIik7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc1ZhbHVlID0gcHJvY2Vzc1ZhbHVlLnJlcGxhY2Uob3B0cy5zdWZmaXgsIFwiXCIpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3NWYWx1ZSA9IHByb2Nlc3NWYWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoSW5wdXRtYXNrLmVzY2FwZVJlZ2V4KG9wdHMuZ3JvdXBTZXBhcmF0b3IpLCBcImdcIiksIFwiXCIpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRzLnBsYWNlaG9sZGVyLmNoYXJBdCgwKSAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKG9wdHMucGxhY2Vob2xkZXIuY2hhckF0KDApLCBcImdcIiksIFwiMFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMudW5tYXNrQXNOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMucmFkaXhQb2ludCAhPT0gXCJcIiAmJiBwcm9jZXNzVmFsdWUuaW5kZXhPZihvcHRzLnJhZGl4UG9pbnQpICE9PSAtMSkgcHJvY2Vzc1ZhbHVlID0gcHJvY2Vzc1ZhbHVlLnJlcGxhY2UoSW5wdXRtYXNrLmVzY2FwZVJlZ2V4LmNhbGwodGhpcywgb3B0cy5yYWRpeFBvaW50KSwgXCIuXCIpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKFwiXlwiICsgSW5wdXRtYXNrLmVzY2FwZVJlZ2V4KG9wdHMubmVnYXRpb25TeW1ib2wuZnJvbnQpKSwgXCItXCIpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsdWUgPSBwcm9jZXNzVmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKElucHV0bWFzay5lc2NhcGVSZWdleChvcHRzLm5lZ2F0aW9uU3ltYm9sLmJhY2spICsgXCIkXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcihwcm9jZXNzVmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1ZhbHVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzQ29tcGxldGU6IGZ1bmN0aW9uKGJ1ZmZlciwgb3B0cykge1xuICAgICAgICAgICAgICAgIHZhciBtYXNrZWRWYWx1ZSA9IChvcHRzLm51bWVyaWNJbnB1dCA/IGJ1ZmZlci5zbGljZSgpLnJldmVyc2UoKSA6IGJ1ZmZlcikuam9pbihcIlwiKTtcbiAgICAgICAgICAgICAgICBtYXNrZWRWYWx1ZSA9IG1hc2tlZFZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChcIl5cIiArIElucHV0bWFzay5lc2NhcGVSZWdleChvcHRzLm5lZ2F0aW9uU3ltYm9sLmZyb250KSksIFwiLVwiKTtcbiAgICAgICAgICAgICAgICBtYXNrZWRWYWx1ZSA9IG1hc2tlZFZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChJbnB1dG1hc2suZXNjYXBlUmVnZXgob3B0cy5uZWdhdGlvblN5bWJvbC5iYWNrKSArIFwiJFwiKSwgXCJcIik7XG4gICAgICAgICAgICAgICAgbWFza2VkVmFsdWUgPSBtYXNrZWRWYWx1ZS5yZXBsYWNlKG9wdHMucHJlZml4LCBcIlwiKTtcbiAgICAgICAgICAgICAgICBtYXNrZWRWYWx1ZSA9IG1hc2tlZFZhbHVlLnJlcGxhY2Uob3B0cy5zdWZmaXgsIFwiXCIpO1xuICAgICAgICAgICAgICAgIG1hc2tlZFZhbHVlID0gbWFza2VkVmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKElucHV0bWFzay5lc2NhcGVSZWdleChvcHRzLmdyb3VwU2VwYXJhdG9yKSArIFwiKFswLTldezN9KVwiLCBcImdcIiksIFwiJDFcIik7XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMucmFkaXhQb2ludCA9PT0gXCIsXCIpIG1hc2tlZFZhbHVlID0gbWFza2VkVmFsdWUucmVwbGFjZShJbnB1dG1hc2suZXNjYXBlUmVnZXgob3B0cy5yYWRpeFBvaW50KSwgXCIuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0Zpbml0ZShtYXNrZWRWYWx1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25CZWZvcmVNYXNrOiBmdW5jdGlvbihpbml0aWFsVmFsdWUsIG9wdHMpIHtcbiAgICAgICAgICAgICAgICBvcHRzLmlzTmVnYXRpdmUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdmFyIHJhZGl4UG9pbnQgPSBvcHRzLnJhZGl4UG9pbnQgfHwgXCIsXCI7XG4gICAgICAgICAgICAgICAgaWYgKCh0eXBlb2YgaW5pdGlhbFZhbHVlID09IFwibnVtYmVyXCIgfHwgb3B0cy5pbnB1dFR5cGUgPT09IFwibnVtYmVyXCIpICYmIHJhZGl4UG9pbnQgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gaW5pdGlhbFZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZShcIi5cIiwgcmFkaXhQb2ludCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZVBhcnRzID0gaW5pdGlhbFZhbHVlLnNwbGl0KHJhZGl4UG9pbnQpLCBpbnRlZ2VyUGFydCA9IHZhbHVlUGFydHNbMF0ucmVwbGFjZSgvW15cXC0wLTldL2csIFwiXCIpLCBkZWNpbWFsUGFydCA9IHZhbHVlUGFydHMubGVuZ3RoID4gMSA/IHZhbHVlUGFydHNbMV0ucmVwbGFjZSgvW14wLTldL2csIFwiXCIpIDogXCJcIjtcbiAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBpbnRlZ2VyUGFydCArIChkZWNpbWFsUGFydCAhPT0gXCJcIiA/IHJhZGl4UG9pbnQgKyBkZWNpbWFsUGFydCA6IGRlY2ltYWxQYXJ0KTtcbiAgICAgICAgICAgICAgICB2Y
46184XIgZGlnaXRzID0gMDtcbiAgICAgICAgICAgICAgICBpZiAocmFkaXhQb2ludCAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSBkZWNpbWFsUGFydC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWNpbWFsUGFydCAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpZ2l0c0ZhY3RvciA9IE1hdGgucG93KDEwLCBkaWdpdHMgfHwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGaW5pdGUob3B0cy5kaWdpdHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gcGFyc2VJbnQob3B0cy5kaWdpdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0c0ZhY3RvciA9IE1hdGgucG93KDEwLCBkaWdpdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gaW5pdGlhbFZhbHVlLnJlcGxhY2UoSW5wdXRtYXNrLmVzY2FwZVJlZ2V4KHJhZGl4UG9pbnQpLCBcIi5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGaW5pdGUoaW5pdGlhbFZhbHVlKSkgaW5pdGlhbFZhbHVlID0gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGluaXRpYWxWYWx1ZSkgKiBkaWdpdHNGYWN0b3IpIC8gZGlnaXRzRmFjdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gaW5pdGlhbFZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZShcIi5cIiwgcmFkaXhQb2ludCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMuZGlnaXRzID09PSAwICYmIGluaXRpYWxWYWx1ZS5pbmRleE9mKElucHV0bWFzay5lc2NhcGVSZWdleChyYWRpeFBvaW50KSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IGluaXRpYWxWYWx1ZS5zdWJzdHJpbmcoMCwgaW5pdGlhbFZhbHVlLmluZGV4T2YoSW5wdXRtYXNrLmVzY2FwZVJlZ2V4KHJhZGl4UG9pbnQpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbGlnbkRpZ2l0cyhpbml0aWFsVmFsdWUudG9TdHJpbmcoKS5zcGxpdChcIlwiKSwgZGlnaXRzLCBvcHRzKS5qb2luKFwiXCIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24oZSwgYnVmZmVyLCBjYXJldFBvcywgb3B0cykge1xuICAgICAgICAgICAgICAgIHZhciAkaW5wdXQgPSAkKHRoaXMpO1xuICAgICAgICAgICAgICAgIGlmIChlLmN0cmxLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLmtleUNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIElucHV0bWFzay5rZXlDb2RlLlVQOlxuICAgICAgICAgICAgICAgICAgICAgICAgJGlucHV0LnZhbChwYXJzZUZsb2F0KHRoaXMuaW5wdXRtYXNrLnVubWFza2VkdmFsdWUoKSkgKyBwYXJzZUludChvcHRzLnN0ZXApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICRpbnB1dC50cmlnZ2VyKFwic2V0dmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5wdXRtYXNrLmtleUNvZGUuRE9XTjpcbiAgICAgICAgICAgICAgICAgICAgICAgICRpbnB1dC52YWwocGFyc2VGbG9hdCh0aGlzLmlucHV0bWFzay51bm1hc2tlZHZhbHVlKCkpIC0gcGFyc2VJbnQob3B0cy5zdGVwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkaW5wdXQudHJpZ2dlcihcInNldHZhbHVlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGN1cnJlbmN5OiB7XG4gICAgICAgICAgICBwcmVmaXg6IFwiJCBcIixcbiAgICAgICAgICAgIGdyb3VwU2VwYXJhdG9yOiBcIixcIixcbiAgICAgICAgICAgIGFsaWFzOiBcIm51bWVyaWNcIixcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIjBcIixcbiAgICAgICAgICAgIGF1dG9Hcm91cDogdHJ1ZSxcbiAgICAgICAgICAgIGRpZ2l0czogMixcbiAgICAgICAgICAgIGRpZ2l0c09wdGlvbmFsOiBmYWxzZSxcbiAgICAgICAgICAgIGNsZWFyTWFza09uTG9zdEZvY3VzOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBkZWNpbWFsOiB7XG4gICAgICAgICAgICBhbGlhczogXCJudW1lcmljXCJcbiAgICAgICAgfSxcbiAgICAgICAgaW50ZWdlcjoge1xuICAgICAgICAgICAgYWxpYXM6IFwibnVtZXJpY1wiLFxuICAgICAgICAgICAgZGlnaXRzOiAwLFxuICAgICAgICAgICAgcmFkaXhQb2ludDogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBwZXJjZW50YWdlOiB7XG4gICAgICAgICAgICBhbGlhczogXCJudW1lcmljXCIsXG4gICAgICAgICAgICBkaWdpdHM6IDIsXG4gICAgICAgICAgICBkaWdpdHNPcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgICAgIHJhZGl4UG9pbnQ6IFwiLlwiLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiMFwiLFxuICAgICAgICAgICAgYXV0b0dyb3VwOiBmYWxzZSxcbiAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgIG1heDogMTAwLFxuICAgICAgICAgICAgc3VmZml4OiBcIiAlXCIsXG4gICAgICAgICAgICBhbGxvd01pbnVzOiBmYWxzZVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIElucHV0bWFzaztcbn0pOyIsInJlcXVpcmUoXCIuL2Rpc3QvaW5wdXRtYXNrL2lucHV0bWFzay5leHRlbnNpb25zXCIpO1xyXG5yZXF1aXJlKFwiLi9kaXN0L2lucHV0bWFzay9pbnB1dG1hc2suZGF0ZS5leHRlbnNpb25zXCIpO1xyXG5yZXF1aXJlKFwiLi9kaXN0L2lucHV0bWFzay9pbnB1dG1hc2subnVtZXJpYy5leHRlbnNpb25zXCIpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9kaXN0L2lucHV0bWFzay9pbnB1dG1hc2suanNcIik7XHJcbiIsIi8qIVxuICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My4zLjFcbiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS9cbiAqXG4gKiBJbmNsdWRlcyBTaXp6bGUuanNcbiAqIGh0dHBzOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WlxuICovXG4oIGZ1bmN0aW9uKCBnbG9iYWwsIGZhY3RvcnkgKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0aWYgKCB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVud
46184HMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2Bcblx0XHQvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LlxuXHRcdC8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgXG5cdFx0Ly8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuXG5cdFx0Ly8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC5cblx0XHQvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKFwianF1ZXJ5XCIpKHdpbmRvdyk7XG5cdFx0Ly8gU2VlIHRpY2tldCAjMTQ1NDkgZm9yIG1vcmUgaW5mby5cblx0XHRtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5kb2N1bWVudCA/XG5cdFx0XHRmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6XG5cdFx0XHRmdW5jdGlvbiggdyApIHtcblx0XHRcdFx0aWYgKCAhdy5kb2N1bWVudCApIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIFwialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhY3RvcnkoIHcgKTtcblx0XHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0ZmFjdG9yeSggZ2xvYmFsICk7XG5cdH1cblxuLy8gUGFzcyB0aGlzIGlmIHdpbmRvdyBpcyBub3QgZGVmaW5lZCB5ZXRcbn0gKSggdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCB3aW5kb3csIG5vR2xvYmFsICkge1xuXG4vLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjFcbi8vIHRocm93IGV4Y2VwdGlvbnMgd2hlbiBub24tc3RyaWN0IGNvZGUgKGUuZy4sIEFTUC5ORVQgNC41KSBhY2Nlc3NlcyBzdHJpY3QgbW9kZVxuLy8gYXJndW1lbnRzLmNhbGxlZS5jYWxsZXIgKHRyYWMtMTMzMzUpLiBCdXQgYXMgb2YgalF1ZXJ5IDMuMCAoMjAxNiksIHN0cmljdCBtb2RlIHNob3VsZCBiZSBjb21tb25cbi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLlxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnIgPSBbXTtcblxudmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuXG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5cbnZhciBzbGljZSA9IGFyci5zbGljZTtcblxudmFyIGNvbmNhdCA9IGFyci5jb25jYXQ7XG5cbnZhciBwdXNoID0gYXJyLnB1c2g7XG5cbnZhciBpbmRleE9mID0gYXJyLmluZGV4T2Y7XG5cbnZhciBjbGFzczJ0eXBlID0ge307XG5cbnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7XG5cbnZhciBoYXNPd24gPSBjbGFzczJ0eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgZm5Ub1N0cmluZyA9IGhhc093bi50b1N0cmluZztcblxudmFyIE9iamVjdEZ1bmN0aW9uU3RyaW5nID0gZm5Ub1N0cmluZy5jYWxsKCBPYmplY3QgKTtcblxudmFyIHN1cHBvcnQgPSB7fTtcblxudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiBpc0Z1bmN0aW9uKCBvYmogKSB7XG5cbiAgICAgIC8vIFN1cHBvcnQ6IENocm9tZSA8PTU3LCBGaXJlZm94IDw9NTJcbiAgICAgIC8vIEluIHNvbWUgYnJvd3NlcnMsIHR5cGVvZiByZXR1cm5zIFwiZnVuY3Rpb25cIiBmb3IgSFRNTCA8b2JqZWN0PiBlbGVtZW50c1xuICAgICAgLy8gKGkuZS4sIGB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvYmplY3RcIiApID09PSBcImZ1bmN0aW9uXCJgKS5cbiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gY2xhc3NpZnkgKmFueSogRE9NIG5vZGUgYXMgYSBmdW5jdGlvbi5cbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSAhPT0gXCJudW1iZXJcIjtcbiAgfTtcblxuXG52YXIgaXNXaW5kb3cgPSBmdW5jdGlvbiBpc1dpbmRvdyggb2JqICkge1xuXHRcdHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7XG5cdH07XG5cblxuXG5cblx0dmFyIHByZXNlcnZlZFNjcmlwdEF0dHJpYnV0ZXMgPSB7XG5cdFx0dHlwZTogdHJ1ZSxcblx0XHRzcmM6IHRydWUsXG5cdFx0bm9Nb2R1bGU6IHRydWVcblx0fTtcblxuXHRmdW5jdGlvbiBET01FdmFsKCBjb2RlLCBkb2MsIG5vZGUgKSB7XG5cdFx0ZG9jID0gZG9jIHx8IGRvY3VtZW50O1xuXG5cdFx0dmFyIGksXG5cdFx0XHRzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggXCJzY3JpcHRcIiApO1xuXG5cdFx0c2NyaXB0LnRleHQgPSBjb2RlO1xuXHRcdGlmICggbm9kZSApIHtcblx0XHRcdGZvciAoIGkgaW4gcHJlc2VydmVkU2NyaXB0QXR0cmlidXRlcyApIHtcblx0XHRcdFx0aWYgKCBub2RlWyBpIF0gKSB7XG5cdFx0XHRcdFx0c2NyaXB0WyBpIF0gPSBub2RlWyBpIF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZG9jLmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApO1xuXHR9XG5cblxuZnVuY3Rpb24gdG9UeXBlKCBvYmogKSB7XG5cdGlmICggb2JqID09IG51bGwgKSB7XG5cdFx0cmV0dXJuIG9iaiArIFwiXCI7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkgKGZ1bmN0aW9uaXNoIFJlZ0V4cClcblx0cmV0dXJuIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiID9cblx0XHRjbGFzczJ0eXBlWyB0b1N0cmluZy5jYWxsKCBvYmogKSBdIHx8IFwib2JqZWN0XCIgOlxuXHRcdHR5cGVvZiBvYmo7XG59XG4vKiBnbG9iYWwgU3ltYm9sICovXG4vLyBEZWZpbmluZyB0aGlzIGdsb2JhbCBpbiAuZXNsaW50cmMuanNvbiB3b3VsZCBjcmVhdGUgYSBkYW5nZXIgb2YgdXNpbmcgdGhlIGdsb2JhbFxuLy8gdW5ndWFyZGVkIGluIGFub3RoZXIgcGxhY2UsIGl0IHNlZW1zIHNhZmVyIHRvIGRlZmluZSBnbG9iYWwgb25seSBmb3IgdGhpcyBtb2R1bGVcblxuXG5cbnZhclxuXHR2ZXJzaW9uID0gXCIzLjMuMVwiLFxuXG5cdC8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5XG5cdGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblxuXHRcdC8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJ1xuXHRcdC8vIE5lZWQgaW5pdCBpZiBqUXVlcnkgaXMgY2FsbGVkIChqdXN0IGFsbG93IGVycm9yIHRvIGJlIHRocm93biBpZiBub3QgaW5jbHVkZWQpXG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2
46184VsZWN0b3IsIGNvbnRleHQgKTtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHlcblx0Ly8gTWFrZSBzdXJlIHdlIHRyaW0gQk9NIGFuZCBOQlNQXG5cdHJ0cmltID0gL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nO1xuXG5qUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0ge1xuXG5cdC8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWRcblx0anF1ZXJ5OiB2ZXJzaW9uLFxuXG5cdGNvbnN0cnVjdG9yOiBqUXVlcnksXG5cblx0Ly8gVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwXG5cdGxlbmd0aDogMCxcblxuXHR0b0FycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1Jcblx0Ly8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXlcblx0Z2V0OiBmdW5jdGlvbiggbnVtICkge1xuXG5cdFx0Ly8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgaW4gYSBjbGVhbiBhcnJheVxuXHRcdGlmICggbnVtID09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiBqdXN0IHRoZSBvbmUgZWxlbWVudCBmcm9tIHRoZSBzZXRcblx0XHRyZXR1cm4gbnVtIDwgMCA/IHRoaXNbIG51bSArIHRoaXMubGVuZ3RoIF0gOiB0aGlzWyBudW0gXTtcblx0fSxcblxuXHQvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrXG5cdC8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KVxuXHRwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblxuXHRcdC8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0XG5cdFx0dmFyIHJldCA9IGpRdWVyeS5tZXJnZSggdGhpcy5jb25zdHJ1Y3RvcigpLCBlbGVtcyApO1xuXG5cdFx0Ly8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSlcblx0XHRyZXQucHJldk9iamVjdCA9IHRoaXM7XG5cblx0XHQvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldFxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0Ly8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC5cblx0ZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2sgKTtcblx0fSxcblxuXHRtYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTtcblx0XHR9ICkgKTtcblx0fSxcblxuXHRzbGljZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTtcblx0fSxcblxuXHRmaXJzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIDAgKTtcblx0fSxcblxuXHRsYXN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggLTEgKTtcblx0fSxcblxuXHRlcTogZnVuY3Rpb24oIGkgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0aiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGogPj0gMCAmJiBqIDwgbGVuID8gWyB0aGlzWyBqIF0gXSA6IFtdICk7XG5cdH0sXG5cblx0ZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IHRoaXMuY29uc3RydWN0b3IoKTtcblx0fSxcblxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG5cdC8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLlxuXHRwdXNoOiBwdXNoLFxuXHRzb3J0OiBhcnIuc29ydCxcblx0c3BsaWNlOiBhcnIuc3BsaWNlXG59O1xuXG5qUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsXG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyAwIF0gfHwge30sXG5cdFx0aSA9IDEsXG5cdFx0bGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcblx0XHRkZWVwID0gZmFsc2U7XG5cblx0Ly8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvblxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cblx0XHQvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307XG5cdFx0aSsrO1xuXHR9XG5cblx0Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXG5cdGlmICggdHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAhaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7XG5cdFx0dGFyZ2V0ID0ge307XG5cdH1cblxuXHQvLyBFeHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWRcblx0aWYgKCBpID09PSBsZW5ndGggKSB7XG5cdFx0dGFyZ2V0ID0gdGhpcztcblx0XHRpLS07XG5cdH1cblxuXHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblxuXHRcdC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXNcblx0XHRpZiAoICggb3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdICkgIT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxuXHRcdFx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdFx0XHRzcmMgPSB0YXJnZXRbIG5hbWUgXTtcblx0XHRcdFx0Y29weSA9IG9wdGlvbnNbIG5hbWUgXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG5cdFx0XHRcdGlmICggdGFyZ2V0ID09PSBjb3B5ICkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzXG5cdFx0XHRcdGlmICggZGVlcCAmJi
46184Bjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvcHkgKSB8fFxuXHRcdFx0XHRcdCggY29weUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KCBjb3B5ICkgKSApICkge1xuXG5cdFx0XHRcdFx0aWYgKCBjb3B5SXNBcnJheSApIHtcblx0XHRcdFx0XHRcdGNvcHlJc0FycmF5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBBcnJheS5pc0FycmF5KCBzcmMgKSA/IHNyYyA6IFtdO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBzcmMgKSA/IHNyYyA6IHt9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcblxuXHRcdFx0XHQvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGNvcHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZVxuXHRleHBhbmRvOiBcImpRdWVyeVwiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cXEQvZywgXCJcIiApLFxuXG5cdC8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlXG5cdGlzUmVhZHk6IHRydWUsXG5cblx0ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblx0fSxcblxuXHRub29wOiBmdW5jdGlvbigpIHt9LFxuXG5cdGlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0dmFyIHByb3RvLCBDdG9yO1xuXG5cdFx0Ly8gRGV0ZWN0IG9idmlvdXMgbmVnYXRpdmVzXG5cdFx0Ly8gVXNlIHRvU3RyaW5nIGluc3RlYWQgb2YgalF1ZXJ5LnR5cGUgdG8gY2F0Y2ggaG9zdCBvYmplY3RzXG5cdFx0aWYgKCAhb2JqIHx8IHRvU3RyaW5nLmNhbGwoIG9iaiApICE9PSBcIltvYmplY3QgT2JqZWN0XVwiICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHByb3RvID0gZ2V0UHJvdG8oIG9iaiApO1xuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIG5vI
46184HByb3RvdHlwZSAoZS5nLiwgYE9iamVjdC5jcmVhdGUoIG51bGwgKWApIGFyZSBwbGFpblxuXHRcdGlmICggIXByb3RvICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb25cblx0XHRDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCBcImNvbnN0cnVjdG9yXCIgKSAmJiBwcm90by5jb25zdHJ1Y3Rvcjtcblx0XHRyZXR1cm4gdHlwZW9mIEN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBmblRvU3RyaW5nLmNhbGwoIEN0b3IgKSA9PT0gT2JqZWN0RnVuY3Rpb25TdHJpbmc7XG5cdH0sXG5cblx0aXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblxuXHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5cdFx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy82MTI1XG5cdFx0dmFyIG5hbWU7XG5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0Ly8gRXZhbHVhdGVzIGEgc2NyaXB0IGluIGEgZ2xvYmFsIGNvbnRleHRcblx0Z2xvYmFsRXZhbDogZnVuY3Rpb24oIGNvZGUgKSB7XG5cdFx0RE9NRXZhbCggY29kZSApO1xuXHR9LFxuXG5cdGVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkge1xuXHRcdHZhciBsZW5ndGgsIGkgPSAwO1xuXG5cdFx0aWYgKCBpc0FycmF
461845TGlrZSggb2JqICkgKSB7XG5cdFx0XHRsZW5ndGggPSBvYmoubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gb2JqICkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvYmo7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5XG5cdHRyaW06IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdHJldHVybiB0ZXh0ID09IG51bGwgP1xuXHRcdFx0XCJcIiA6XG5cdFx0XHQoIHRleHQgKyBcIlwiICkucmVwbGFjZSggcnRyaW0sIFwiXCIgKTtcblx0fSxcblxuXHQvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHtcblx0XHR2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTtcblxuXHRcdGlmICggYXJyICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggcmV0LFxuXHRcdFx0XHRcdHR5cGVvZiBhcnIgPT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFsgYXJyIF0gOiBhcnJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guY2FsbCggcmV0LCBhcnIgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdGluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnIsIGkgKSB7XG5cdFx0cmV0dXJuIGFyciA9PSBudWxsID8gLTEgOiBpbmRleE9mLmNhbGwoIGFyciwgZWxlbSwgaSApO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdG1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHtcblx0XHR2YXIgbGVuID0gK3NlY29uZC5sZW5ndGgsXG5cdFx0XHRqID0gMCxcblx0XHRcdGkgPSBmaXJzdC5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdGZpcnN0WyBpKysgXSA9IHNlY29uZFsgaiBdO1xuXHRcdH1cblxuXHRcdGZpcnN0Lmxlbmd0aCA9IGk7XG5cblx0XHRyZXR1cm4gZmlyc3Q7XG5cdH0sXG5cblx0Z3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkge1xuXHRcdHZhciBjYWxsYmFja0ludmVyc2UsXG5cdFx0XHRtYXRjaGVzID0gW10sXG5cdFx0XHRpID0gMCxcblx0XHRcdGxlbmd0aCA9IGVsZW1zLmxlbmd0aCxcblx0XHRcdGNhbGxiYWNrRXhwZWN0ID0gIWludmVydDtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXNcblx0XHQvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvblxuXHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0Y2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7XG5cdFx0XHRpZiAoIGNhbGxiYWNrSW52ZXJzZSAhPT0gY2FsbGJhY2tFeHBlY3QgKSB7XG5cdFx0XHRcdG1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRjaGVzO1xuXHR9LFxuXG5cdC8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHtcblx0XHR2YXIgbGVuZ3RoLCB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0cmV0ID0gW107XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlc1xuXHRcdGlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7XG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBHbyB0aHJvdWdoIGV2ZXJ5IGtleSBvbiB0aGUgb2JqZWN0LFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKCBpIGluIGVsZW1zICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdFx0cmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApO1xuXHR9LFxuXG5cdC8vIEEgZ2xvYmFsIEdVSUQgY291bnRlciBmb3Igb2JqZWN0c1xuXHRndWlkOiAxLFxuXG5cdC8vIGpRdWVyeS5zdXBwb3J0IGlzIG5vdCB1c2VkIGluIENvcmUgYnV0IG90aGVyIHByb2plY3RzIGF0dGFjaCB0aGVpclxuXHQvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LlxuXHRzdXBwb3J0OiBzdXBwb3J0XG59ICk7XG5cbmlmICggdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICkge1xuXHRqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTtcbn1cblxuLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwXG5qUXVlcnkuZWFjaCggXCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbFwiLnNwbGl0KCBcIiBcIiApLFxuZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdGNsYXNzMnR5cGVbIFwiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xufSApO1xuXG5mdW5jdGlvbiBpc0FycmF
461845TGlrZSggb2JqICkge1xuXG5cdC8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcilcblx0Ly8gYGluYCBjaGVjayB1c2VkIHRvIHByZXZlbnQgSklUIGVycm9yIChnaC0yMTQ1KVxuXHQvLyBoYXNPd24gaXNuJ3QgdXNlZCBoZXJlIGR1ZSB0byBmYWxzZSBuZWdhdGl2ZXNcblx0Ly8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRVxuXHR2YXIgbGVuZ3RoID0gISFvYmogJiYgXCJsZW5ndGhcIiBpbiBvYmogJiYgb2JqLmxlbmd0aCxcblx0XHR0eXBlID0gdG9UeXBlKCBvYmogKTtcblxuXHRpZiAoIGlzRnVuY3Rpb24oIG9iaiApIHx8IGlzV2luZG93KCBvYmogKSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4gdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fFxuXHRcdHR5cGVvZiBsZW5ndGggPT09IFwibnVtYmVyXCIgJiYgbGVuZ3RoID4gMCAmJiAoIGxlbmd0aCAtIDEgKSBpbiBvYmo7XG59XG52YXIgU2l6emxlID1cbi8qIVxuICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMy4zXG4gKiBodHRwczovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAxNi0wOC0wOFxuICovXG4oZnVuY3Rpb24oIHdpbmRvdyApIHtcblxudmFyIGksXG5cdHN1cHBvcnQsXG5cdEV4cHIsXG5cdGdldFRleHQsXG5cdGlzWE1MLFxuXHR0b2tlbml6ZSxcblx0Y29tcGlsZSxcblx0c2VsZWN0LFxuXHRvdXRlcm1vc3RDb250ZXh0LFxuXHRzb3J0SW5wdXQsXG5cdGhhc0R1cGxpY2F0ZSxcblxuXHQvLyBMb2NhbCBkb2N1bWVudCB2YXJzXG5cdHNldERvY3VtZW50LFxuXHRkb2N1bWVudCxcblx0ZG9jRWxlbSxcblx0ZG9jdW1lbnRJc0hUTUwsXG5cdHJidWdneVFTQSxcblx0cmJ1Z2d5TWF0Y2hlcyxcblx0bWF0Y2hlcyxcblx0Y29udGFpbnMsXG5cblx0Ly8gSW5zdGFuY2Utc3BlY2lmaWMgZGF0YVxuXHRleHBhbmRvID0gXCJzaXp6bGVcIiArIDEgKiBuZXcgRGF0ZSgpLFxuXHRwcmVmZXJyZWREb2MgPSB3aW5kb3cuZG9jdW1lbnQsXG5cdGRpcnJ1bnMgPSAwLFxuXHRkb25lID0gMCxcblx0Y2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRjb21waWxlckNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0c29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIDA7XG5cdH0sXG5cblx0Ly8gSW5zdGFuY2UgbWV0aG9kc1xuXHRoYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LFxuXHRhcnIgPSBbXSxcblx0cG9wID0gYXJyLnBvcCxcblx0cHVzaF9uYXRpdmUgPSBhcnIucHVzaCxcblx0cHVzaCA9IGFyci5wdXNoLFxuXHRzbGljZSA9IGFyci5zbGljZSxcblx0Ly8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlXG5cdC8vIGh0dHBzOi8vanNwZXJmLmNvbS90aG9yLWluZGV4b2YtdnMtZm9yLzVcblx0aW5kZXhPZiA9IGZ1bmN0aW9uKCBsaXN0LCBlbGVtICkge1xuXHRcdHZhciBpID0gMCxcblx0XHRcdGxlbiA9IGxpc3QubGVuZ3RoO1xuXHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0aWYgKCBsaXN0W2ldID09PSBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIC0xO1xuXHR9LFxuXG5cdGJvb2xlYW5zID0gXCJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZFwiLFxuXG5cdC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnNcblxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZVxuXHR3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFxuXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllclxuXHRpZGVudGlmaWVyID0gXCIoPzpcXFxcXFxcXC58W1xcXFx3LV18W15cXDAtXFxcXHhhMF0pK1wiLFxuXG5cdC8vIEF0dHJpYnV0ZSBzZWxlY3RvcnM6IGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9yc1xuXHRhdHRyaWJ1dGVzID0gXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIE9wZXJhdG9yIChjYXB0dXJlIDIpXG5cdFx0XCIqKFsqXiR8IX5dPz0pXCIgKyB3aGl0ZXNwYWNlICtcblx0XHQvLyBcIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV0gb3Igc3RyaW5ncyBbY2FwdHVyZSAzIG9yIGNhcHR1cmUgNF1cIlxuXHRcdFwiKig/OicoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcInwoXCIgKyBpZGVudGlmaWVyICsgXCIpKXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIipcXFxcXVwiLFxuXG5cdHBzZXVkb3MgPSBcIjooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XFxcXCgoXCIgK1xuXHRcdC8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6XG5cdFx0Ly8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpXG5cdFx0XCIoJygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwiKXxcIiArXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXHRcdC8vIDMuIGFueXRoaW5nIGVsc2UgKGNhcHR1cmUgMilcblx0XHRcIi4qXCIgK1xuXHRcdFwiKVxcXFwpfClcIixcblxuXHQvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyXG5cdHJ3aGl0ZXNwYWNlID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwiK1wiLCBcImdcIiApLFxuXHRydHJpbSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiK3woKD86XnxbXlxcXFxcXFxcXSkoPzpcXFxcXFxcXC4pKilcIiArIH
46184doaXRlc3BhY2UgKyBcIiskXCIsIFwiZ1wiICksXG5cblx0cmNvbW1hID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqLFwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJjb21iaW5hdG9ycyA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKihbPit+XXxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXG5cdHJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCBcIj1cIiArIHdoaXRlc3BhY2UgKyBcIiooW15cXFxcXSdcXFwiXSo/KVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsIFwiZ1wiICksXG5cblx0cnBzZXVkbyA9IG5ldyBSZWdFeHAoIHBzZXVkb3MgKSxcblx0cmlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKCBcIl5cIiArIGlkZW50aWZpZXIgKyBcIiRcIiApLFxuXG5cdG1hdGNoRXhwciA9IHtcblx0XHRcIklEXCI6IG5ldyBSZWdFeHAoIFwiXiMoXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRcIkNMQVNTXCI6IG5ldyBSZWdFeHAoIFwiXlxcXFwuKFwiICsgaWRlbnRpZmllciArIFwiKVwiICksXG5cdFx0XCJUQUdcIjogbmV3IFJlZ0V4cCggXCJeKFwiICsgaWRlbnRpZmllciArIFwifFsqXSlcIiApLFxuXHRcdFwiQVRUUlwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIGF0dHJpYnV0ZXMgKSxcblx0XHRcIlBTRVVET1wiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHBzZXVkb3MgKSxcblx0XHRcIkNISUxEXCI6IG5ldyBSZWdFeHAoIFwiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFxcXChcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKGV2ZW58b2RkfCgoWystXXwpKFxcXFxkKilufClcIiArIHdoaXRlc3BhY2UgKyBcIiooPzooWystXXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKihcXFxcZCspfCkpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KVwiLCBcImlcIiApLFxuXHRcdFwiYm9vbFwiOiBuZXcgUmVnRXhwKCBcIl4oPzpcIiArIGJvb2xlYW5zICsgXCIpJFwiLCBcImlcIiApLFxuXHRcdC8vIEZvciB1c2UgaW4gbGlicmFyaWVzIGltcGxlbWVudGluZyAuaXMoKVxuXHRcdC8vIFdlIHVzZSB0aGlzIGZvciBQT1MgbWF0Y2hpbmcgaW4gYHNlbGVjdGBcblx0XHRcIm5lZWRzQ29udGV4dFwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcXFwoXCIgK1xuXHRcdFx0d2hpdGVzcGFjZSArIFwiKigoPzotXFxcXGQpP1xcXFxkKilcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpKD89W14tXXwkKVwiLCBcImlcIiApXG5cdH0sXG5cblx0cmlucHV0cyA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJoZWFkZXIgPSAvXmhcXGQkL2ksXG5cblx0cm5hdGl2ZSA9IC9eW157XStcXHtcXHMqXFxbbmF0aXZlIFxcdy8sXG5cblx0Ly8gRWFzaWx5LXBhcnNlYWJsZS9yZXRyaWV2YWJsZSBJRCBvciBUQUcgb3IgQ0xBU1Mgc2VsZWN0b3JzXG5cdHJxdWlja0V4cHIgPSAvXig/OiMoW1xcdy1dKyl8KFxcdyspfFxcLihbXFx3LV0rKSkkLyxcblxuXHRyc2libGluZyA9IC9bK35dLyxcblxuXHQvLyBDU1MgZXNjYXBlc1xuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjZXNjYXBlZC1jaGFyYWN0ZXJzXG5cdHJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoIFwiXFxcXFxcXFwoW1xcXFxkYS1mXXsxLDZ9XCIgKyB3aGl0ZXNwYWNlICsgXCI/fChcIiArIHdoaXRlc3BhY2UgKyBcIil8LilcIiwgXCJpZ1wiICksXG5cdGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBfLCBlc2NhcGVkLCBlc2NhcGVkV2hpdGVzcGFjZSApIHtcblx0XHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZWQgLSAweDEwMDAwO1xuXHRcdC8vIE5hTiBtZWFucyBub24tY29kZXBvaW50XG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveDwyNFxuXHRcdC8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgK1wiMHhcIlxuXHRcdHJldHVybiBoaWdoICE9PSBoaWdoIHx8IGVzY2FwZWRXaGl0ZXNwYWNlID9cblx0XHRcdGVzY2FwZWQgOlxuXHRcdFx0aGlnaCA8IDAgP1xuXHRcdFx0XHQvLyBCTVAgY29kZXBvaW50XG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOlxuXHRcdFx0XHQvLyBTdXBwbGVtZW50YWwgUGxhbmUgY29kZXBvaW50IChzdXJyb2dhdGUgcGFpcilcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7XG5cdH0sXG5cblx0Ly8gQ1NTIHN0cmluZy9pZGVudGlmaWVyIHNlcmlhbGl6YXRpb25cblx0Ly8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNjb21tb24tc2VyaWFsaXppbmctaWRpb21zXG5cdHJjc3Nlc2NhcGUgPSAvKFtcXDAtXFx4MWZcXHg3Zl18Xi0/XFxkKXxeLSR8W15cXDAtXFx4MWZcXHg3Zi1cXHVGRkZGXFx3LV0vZyxcblx0ZmNzc2VzY2FwZSA9IGZ1bmN0aW9uKCBjaCwgYXNDb2RlUG9pbnQgKSB7XG5cdFx0aWYgKCBhc0NvZGVQb2ludCApIHtcblxuXHRcdFx0Ly8gVSswMDAwIE5VTEwgYmVjb21lcyBVK0ZGRkQgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSXG5cdFx0XHRpZiAoIGNoID09PSBcIlxcMFwiICkge1xuXHRcdFx0XHRyZXR1cm4gXCJcXHVGRkZEXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnRyb2wgY2hhcmFjdGVycyBhbmQgKGRlcGVuZGVudCB1cG9uIHBvc2l0aW9uKSBudW1iZXJzIGdldCBlc2NhcGVkIGFzIGNvZGUgcG9pbnRzXG5cdFx0XHRyZXR1cm4gY2guc2xpY2UoIDAsIC0xICkgKyBcIlxcXFxcIiArIGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArIFwiIFwiO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyIHBvdGVudGlhbGx5LXNwZWNpYWwgQVNDSUkgY2hhcmFjdGVycyBnZXQgYmFja3NsYXNoLWVzY2FwZWRcblx0XHRyZXR1cm4gXCJcXFxcXCIgKyBjaDtcblx0fSxcblxuXHQvLyBVc2VkIGZvciBpZnJhbWVzXG5cdC8vIFNlZSBzZXREb2N1bWVudCgpXG5cdC8vIFJlbW92aW5nIHRoZSBmdW5jdGlvbiB3cmFwcGVyIGNhdXNlcyBhIFwiUGVybWlzc2lvbiBEZW5pZWRcIlxuXHQvLyBlcnJvciBpbiBJRVxuXHR1bmxvYWRIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG5cdFx0c2V0RG9jdW1lbnQoKTtcblx0fSxcblxuXHRkaXNhYmxlZEFuY2VzdG9yID0gYWRkQ29tYmluYXRvcihcblx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybi
46184BlbGVtLmRpc2FibGVkID09PSB0cnVlICYmIChcImZvcm1cIiBpbiBlbGVtIHx8IFwibGFiZWxcIiBpbiBlbGVtKTtcblx0XHR9LFxuXHRcdHsgZGlyOiBcInBhcmVudE5vZGVcIiwgbmV4dDogXCJsZWdlbmRcIiB9XG5cdCk7XG5cbi8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApXG50cnkge1xuXHRwdXNoLmFwcGx5KFxuXHRcdChhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApKSxcblx0XHRwcmVmZXJyZWREb2MuY2hpbGROb2Rlc1xuXHQpO1xuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMFxuXHQvLyBEZXRlY3Qgc2lsZW50bHkgZmFpbGluZyBwdXNoLmFwcGx5XG5cdGFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7XG59IGNhdGNoICggZSApIHtcblx0cHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggP1xuXG5cdFx0Ly8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGVcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHRwdXNoX25hdGl2ZS5hcHBseSggdGFyZ2V0LCBzbGljZS5jYWxsKGVscykgKTtcblx0XHR9IDpcblxuXHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHQvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5XG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0dmFyIGogPSB0YXJnZXQubGVuZ3RoLFxuXHRcdFx0XHRpID0gMDtcblx0XHRcdC8vIENhbid0IHRydXN0IE5vZGVMaXN0Lmxlbmd0aFxuXHRcdFx0d2hpbGUgKCAodGFyZ2V0W2orK10gPSBlbHNbaSsrXSkgKSB7fVxuXHRcdFx0dGFyZ2V0Lmxlbmd0aCA9IGogLSAxO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG0sIGksIGVsZW0sIG5pZCwgbWF0Y2gsIGdyb3VwcywgbmV3U2VsZWN0b3IsXG5cdFx0bmV3Q29udGV4dCA9IGNvbnRleHQgJiYgY29udGV4dC5vd25lckRvY3VtZW50LFxuXG5cdFx0Ly8gbm9kZVR5cGUgZGVmYXVsdHMgdG8gOSwgc2luY2UgY29udGV4dCBkZWZhdWx0cyB0byBkb2N1bWVudFxuXHRcdG5vZGVUeXBlID0gY29udGV4dCA/IGNvbnRleHQubm9kZVR5cGUgOiA5O1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFJldHVybiBlYXJseSBmcm9tIGNhbGxzIHdpdGggaW52YWxpZCBzZWxlY3RvciBvciBjb250ZXh0XG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0Ly8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50c1xuXHRpZiAoICFzZWVkICkge1xuXG5cdFx0aWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHtcblx0XHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdFx0fVxuXHRcdGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50O1xuXG5cdFx0aWYgKCBkb2N1bWVudElzSFRNTCApIHtcblxuXHRcdFx0Ly8gSWYgdGhlIHNlbGVjdG9yIGlzIHN1ZmZpY2llbnRseSBzaW1wbGUsIHRyeSB1c2luZyBhIFwiZ2V0KkJ5KlwiIERPTSBtZXRob2Rcblx0XHRcdC8vIChleGNlcHRpbmcgRG9jdW1lbnRGcmFnbWVudCBjb250ZXh0LCB3aGVyZSB0aGUgbWV0aG9kcyBkb24ndCBleGlzdClcblx0XHRcdGlmICggbm9kZVR5cGUgIT09IDExICYmIChtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSkgKSB7XG5cblx0XHRcdFx0Ly8gSUQgc2VsZWN0b3Jcblx0XHRcdFx0aWYgKCAobSA9IG1hdGNoWzFdKSApIHtcblxuXHRcdFx0XHRcdC8vIERvY3VtZW50IGNvbnRleHRcblx0XHRcdFx0XHRpZiAoIG5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnNcblx0XHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0XHRpZiAoIGVsZW0uaWQgPT09IG0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRWxlbWVudCBjb250ZXh0XG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHQvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElEXG5cdFx0XHRcdFx0XHRpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmXG5cdFx0XHRcdFx0XHRcdGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbS5pZCA9PT0gbSApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFR5cGUgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7XG5cdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHRcdC8vIENsYXNzIHNlbGVjdG9yXG5cdFx0XHRcdH0gZWxzZSBpZiAoIChtID0gbWF0Y2hbM10pICYmIHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJlxuXHRcdFx0XHRcdGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHtcblxuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGFrZSBhZHZhbnRhZ2Ugb2YgcXVlcnlTZWxlY3RvckFsbFxuXHRcdFx0aWYgKCBzdXBwb3J0LnFzYSAmJlxuXHRcdFx0XHQhY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdICYmXG5cdFx0XHRcdCghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7XG5cblx0XHRcdFx0aWYgKCBub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gY29udGV4dDtcblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IHNlbGVjdG9yO1xuXG5cdFx0XHRcdC8vIHFTQSBsb29rcyBvdXRzaWRlIEVsZW1lbnQgY29udGV4dCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudFxuXHRcdFx0XHQvLyBUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhpcyB3b3JrYXJvdW5kIHRlY2huaXF1ZVxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PThcblx0XHRcdFx0Ly8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHNcblx0XHRcdFx0fSBlbHNlIGlmICggY29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHRcdFx0Ly8gQ2FwdHVyZSB0aGUgY29udGV4dCBJRCwgc2V0dGluZyBpdCBmaXJzdCBpZiBuZWNlc3Nhcnlcblx0XHRcdFx0XHRpZiAoIChuaWQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZSggXCJpZFwiICkpICkge1xuXHRcdFx0XHRcdFx0bmlkID0gbmlkLnJlcGxhY2UoIHJjc3Nlc2NhcGUsIGZjc3Nlc2NhcGUgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRBdHRyaWJ1dGUoIFwiaWRcIiwgKG5pZCA9IGV4cGFuZG8pICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0XG5cdFx0XHRcdFx0Z3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7XG5cdFx0XHRcdFx0aSA9IGdyb3Vwcy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRncm91cHNbaV0gPSBcIiNcIiArIG5pZCArIFwiIFwiICsgdG9TZWxlY3RvciggZ3JvdXBzW2ldICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oIFwiLFwiICk7XG5cblx0XHRcdFx0XHQvLyBFeHBhbmQgY29udGV4dCBmb3Igc2libGluZyBzZWxlY3RvcnNcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHxcblx0XHRcdFx0XHRcdGNvbnRleHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIG5ld1NlbGVjdG9yICkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLFxuXHRcdFx0XHRcdFx0XHRuZXdDb250ZXh0LnF1
46184ZXJ5U2VsZWN0b3JBbGwoIG5ld1NlbGVjdG9yIClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9IGNhdGNoICggcXNhRXJyb3IgKSB7XG5cdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdGlmICggbmlkID09PSBleHBhbmRvICkge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWxsIG90aGVyc1xuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUga2V5LXZhbHVlIGNhY2hlcyBvZiBsaW1pdGVkIHNpemVcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGhcbiAqXHRwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKVxuICpcdGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG5cdHZhciBrZXlzID0gW107XG5cblx0ZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7XG5cdFx0Ly8gVXNlIChrZXkgKyBcIiBcIikgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggbmF0aXZlIHByb3RvdHlwZSBwcm9wZXJ0aWVzIChzZWUgSXNzdWUgIzE1Nylcblx0XHRpZiAoIGtleXMucHVzaCgga2V5ICsgXCIgXCIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7XG5cdFx0XHQvLyBPbmx5IGtlZXAgdGhlIG1vc3QgcmVjZW50IGVudHJpZXNcblx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07XG5cdFx0fVxuXHRcdHJldHVybiAoY2FjaGVbIGtleSArIFwiIFwiIF0gPSB2YWx1ZSk7XG5cdH1cblx0cmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFya1xuICovXG5mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkge1xuXHRmblsgZXhwYW5kbyBdID0gdHJ1ZTtcblx0cmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydCggZm4gKSB7XG5cdHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmaWVsZHNldFwiKTtcblxuXHR0cnkge1xuXHRcdHJldHVybiAhIWZuKCBlbCApO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9IGZpbmFsbHkge1xuXHRcdC8vIFJlbW92ZSBmcm9tIGl0cyBwYXJlbnQgYnkgZGVmYXVsdFxuXHRcdGlmICggZWwucGFyZW50Tm9kZSApIHtcblx0XHRcdGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsICk7XG5cdFx0fVxuXHRcdC8vIHJlbGVhc2UgbWVtb3J5IGluIElFXG5cdFx0ZWwgPSBudWxsO1xuXHR9XG59XG5cbi8qKlxuICogQWRkcyB0aGUgc2FtZSBoYW5kbGVyIGZvciBhbGwgb2YgdGhlIHNwZWNpZmllZCBhdHRyc1xuICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBUaGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBhcHBsaWVkXG4gKi9cbmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7XG5cdHZhciBhcnIgPSBhdHRycy5zcGxpdChcInxcIiksXG5cdFx0aSA9IGFyci5sZW5ndGg7XG5cblx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0RXhwci5hdHRySGFuZGxlWyBhcnJbaV0gXSA9IGhhbmRsZXI7XG5cdH1cbn1cblxuLyoqXG4gKiBDaGVja3MgZG9jdW1lbnQgb3JkZXIgb2YgdHdvIHNpYmxpbmdzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGFcbiAqIEBwYXJhbSB7RWxlbWVudH0gYlxuICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBsZXNzIHRoYW4gMCBpZiBhIHByZWNlZGVzIGIsIGdyZWF0ZXIgdGhhbiAwIGlmIGEgZm9sbG93cyBiXG4gKi9cbmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHtcblx0dmFyIGN1ciA9IGIgJiYgYSxcblx0XHRkaWZmID0gY3VyICYmIGEubm9kZVR5cGUgPT09IDEgJiYgYi5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0YS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7XG5cblx0Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzXG5cdGlmICggZGlmZiApIHtcblx0XHRyZXR1cm4gZGlmZjtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGIgZm9sbG93cyBhXG5cdGlmICggY3VyICkge1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7XG5cdFx0XHRpZiAoIGN1ciA9PT0gYiApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhID8gMSA6IC0xO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgaW5wdXQgdHlwZXNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUlucHV0UHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBidXR0b25zXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gKG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcImJ1dHRvblwiKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1
46184ZG9zIGZvciA6ZW5hYmxlZC86ZGlzYWJsZWRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgdHJ1ZSBmb3IgOmRpc2FibGVkOyBmYWxzZSBmb3IgOmVuYWJsZWRcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGRpc2FibGVkICkge1xuXG5cdC8vIEtub3duIDpkaXNhYmxlZCBmYWxzZSBwb3NpdGl2ZXM6IGZpZWxkc2V0W2Rpc2FibGVkXSA+IGxlZ2VuZDpudGgtb2YtdHlwZShuKzIpIDpjYW4tZGlzYWJsZVxuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBPbmx5IGNlcnRhaW4gZWxlbWVudHMgY2FuIG1hdGNoIDplbmFibGVkIG9yIDpkaXNhYmxlZFxuXHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NjcmlwdGluZy5odG1sI3NlbGVjdG9yLWVuYWJsZWRcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1kaXNhYmxlZFxuXHRcdGlmICggXCJmb3JtXCIgaW4gZWxlbSApIHtcblxuXHRcdFx0Ly8gQ2hlY2sgZm9yIGluaGVyaXRlZCBkaXNhYmxlZG5lc3Mgb24gcmVsZXZhbnQgbm9uLWRpc2FibGVkIGVsZW1lbnRzOlxuXHRcdFx0Ly8gKiBsaXN0ZWQgZm9ybS1hc3NvY2lhdGVkIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgZmllbGRzZXRcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjYXRlZ29yeS1saXN0ZWRcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LWZlLWRpc2FibGVkXG5cdFx0XHQvLyAqIG9wdGlvbiBlbGVtZW50cyBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY29uY2VwdC1vcHRpb24tZGlzYWJsZWRcblx0XHRcdC8vIEFsbCBzdWNoIGVsZW1lbnRzIGhhdmUgYSBcImZvcm1cIiBwcm9wZXJ0eS5cblx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdC8vIE9wdGlvbiBlbGVtZW50cyBkZWZlciB0byBhIHBhcmVudCBvcHRncm91cCBpZiBwcmVzZW50XG5cdFx0XHRcdGlmICggXCJsYWJlbFwiIGluIGVsZW0gKSB7XG5cdFx0XHRcdFx0aWYgKCBcImxhYmVsXCIgaW4gZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0ucGFyZW50Tm9kZS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA2IC0gMTFcblx0XHRcdFx0Ly8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnNcblx0XHRcdFx0cmV0dXJuIGVsZW0uaXNEaXNhYmxlZCA9PT0gZGlzYWJsZWQgfHxcblxuXHRcdFx0XHRcdC8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5XG5cdFx0XHRcdFx0LyoganNoaW50IC1XMDE4ICovXG5cdFx0XHRcdFx0ZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiZcblx0XHRcdFx0XHRcdGRpc2FibGVkQW5jZXN0b3IoIGVsZW0gKSA9PT0gZGlzYWJsZWQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblxuXHRcdC8vIFRyeSB0byB3aW5ub3cgb3V0IGVsZW1lbnRzIHRoYXQgY2FuJ3QgYmUgZGlzYWJsZWQgYmVmb3JlIHRydXN0aW5nIHRoZSBkaXNhYmxlZCBwcm9wZXJ0eS5cblx0XHQvLyBTb21lIHZpY3RpbXMgZ2V0IGNhdWdodCBpbiBvdXIgbmV0IChsYWJlbCwgbGVnZW5kLCBtZW51LCB0cmFjayksIGJ1dCBpdCBzaG91bGRuJ3Rcblx0XHQvLyBldmVuIGV4aXN0IG9uIHRoZW0sIGxldCBhbG9uZSBoYXZlIGEgYm9vbGVhbiB2YWx1ZS5cblx0XHR9IGVsc2UgaWYgKCBcImxhYmVsXCIgaW4gZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHR9XG5cblx0XHQvLyBSZW1haW5pbmcgZWxlbWVudHMgYXJlIG5laXRoZXIgOmVuYWJsZWQgbm9yIDpkaXNhYmxlZFxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5mdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHtcblx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggYXJndW1lbnQgKSB7XG5cdFx0YXJndW1lbnQgPSArYXJndW1lbnQ7XG5cdFx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHtcblx0XHRcdFx0XHRzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHRcbiAqIEByZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZVxuICovXG5mdW5jdGlvbiB0ZXN0Q29udGV4dCggY29udGV4dCApIHtcblx0cmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgY29udGV4dDtcbn1cblxuLy8gRXhwb3NlIHN1cHBvcnQgdmFycyBmb3IgY29udmVuaWVuY2VcbnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9O1xuXG4vKipcbiAqIERldGVjdHMgWE1MIG5vZGVzXG4gKiBAcGFyYW0ge0Vs
46184ZW1lbnR8T2JqZWN0fSBlbGVtIEFuIGVsZW1lbnQgb3IgYSBkb2N1bWVudFxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWZmIGVsZW0gaXMgYSBub24tSFRNTCBYTUwgbm9kZVxuICovXG5pc1hNTCA9IFNpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHQvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0XG5cdC8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKVxuXHR2YXIgZG9jdW1lbnRFbGVtZW50ID0gZWxlbSAmJiAoZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0pLmRvY3VtZW50RWxlbWVudDtcblx0cmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gXCJIVE1MXCIgOiBmYWxzZTtcbn07XG5cbi8qKlxuICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBbZG9jXSBBbiBlbGVtZW50IG9yIGRvY3VtZW50IG9iamVjdCB0byB1c2UgdG8gc2V0IHRoZSBkb2N1bWVudFxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudFxuICovXG5zZXREb2N1bWVudCA9IFNpenpsZS5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKCBub2RlICkge1xuXHR2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZFxuXHRpZiAoIGRvYyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuXHRcdHJldHVybiBkb2N1bWVudDtcblx0fVxuXG5cdC8vIFVwZGF0ZSBnbG9iYWwgdmFyaWFibGVzXG5cdGRvY3VtZW50ID0gZG9jO1xuXHRkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXHRkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jdW1lbnQgKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5LTExLCBFZGdlXG5cdC8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgXCJwZXJtaXNzaW9uIGRlbmllZFwiIGVycm9ycyAoalF1ZXJ5ICMxMzkzNilcblx0aWYgKCBwcmVmZXJyZWREb2MgIT09IGRvY3VtZW50ICYmXG5cdFx0KHN1YldpbmRvdyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3KSAmJiBzdWJXaW5kb3cudG9wICE9PSBzdWJXaW5kb3cgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSAxMSwgRWRnZVxuXHRcdGlmICggc3ViV2luZG93LmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciwgZmFsc2UgKTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5XG5cdFx0fSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkge1xuXHRcdFx0c3ViV2luZG93LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIgKTtcblx0XHR9XG5cdH1cblxuXHQvKiBBdHRyaWJ1dGVzXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBTdXBwb3J0OiBJRTw4XG5cdC8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllc1xuXHQvLyAoZXhjZXB0aW5nIElFOCBib29sZWFucylcblx0c3VwcG9ydC5hdHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5jbGFzc05hbWUgPSBcImlcIjtcblx0XHRyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZShcImNsYXNzTmFtZVwiKTtcblx0fSk7XG5cblx0LyogZ2V0RWxlbWVudChzKUJ5KlxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpIHJldHVybnMgb25seSBlbGVtZW50c1xuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIlwiKSApO1xuXHRcdHJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTtcblxuXHQvLyBTdXBwb3J0OiBJRTwxMFxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWVcblx0Ly8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbW1hdGljYWxseS1zZXQgbmFtZXMsXG5cdC8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdFxuXHRzdXBwb3J0LmdldEJ5SWQgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaWQgPSBleHBhbmRvO1xuXHRcdHJldHVybiAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUgfHwgIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoO1xuXHR9KTtcblxuXHQvLyBJRCBmaWx0ZXIgYW5kIGZpbmRcblx0aWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7XG5cdFx0RXhwci5maWx0ZXJbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXHRcdEV4cHIuZmluZFtcIklEXCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHRyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRFeHByLmZpbHRlcltcIklEXCJdID0gIGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDcgb25seVxuXHRcdC8vIGdldEVsZW1lbnRCeUlkIGlzIG5vdCByZWxpYWJsZSBhcyBhIGZpbmQgc2hvcnRjdXRcblx0XHRFeHByLmZpbmRbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRcdHZhciBub2RlLCBpLCBlbGVtcyxcblx0XHRcdFx0XHRlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0gKSB7XG5cblx0XHRcdFx0XHQvLyBWZXJpZnkgdGhlIGl
46184kIGF0dHJpYnV0ZVxuXHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0XHRpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gWyBlbGVtIF07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRmFsbCBiYWNrIG9uIGdldEVsZW1lbnRzQnlOYW1lXG5cdFx0XHRcdFx0ZWxlbXMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lKCBpZCApO1xuXHRcdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtc1tpKytdKSApIHtcblx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0XHRcdGlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFsgZWxlbSBdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0Ly8gVGFnXG5cdEV4cHIuZmluZFtcIlRBR1wiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgP1xuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHRcdC8vIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgZG9uJ3QgaGF2ZSBnRUJUTlxuXHRcdFx0fSBlbHNlIGlmICggc3VwcG9ydC5xc2EgKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LnF1
46184ZXJ5U2VsZWN0b3JBbGwoIHRhZyApO1xuXHRcdFx0fVxuXHRcdH0gOlxuXG5cdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHR0bXAgPSBbXSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdC8vIEJ5IGhhcHB5IGNvaW5jaWRlbmNlLCBhIChicm9rZW4pIGdFQlROIGFwcGVhcnMgb24gRG9jdW1lbnRGcmFnbWVudCBub2RlcyB0b29cblx0XHRcdFx0cmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzXG5cdFx0XHRpZiAoIHRhZyA9PT0gXCIqXCIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdHRtcC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRtcDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdH07XG5cblx0Ly8gQ2xhc3Ncblx0RXhwci5maW5kW1wiQ0xBU1NcIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFtZSwgY29udGV4dCApIHtcblx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTtcblx0XHR9XG5cdH07XG5cblx0LyogUVNBL21hdGNoZXNTZWxlY3RvclxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gUVNBIGFuZCBtYXRjaGVzU2VsZWN0b3Igc3VwcG9ydFxuXG5cdC8vIG1hdGNoZXNTZWxlY3Rvcig6YWN0aXZlKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoSUU5L09wZXJhIDExLjUpXG5cdHJidWdneU1hdGNoZXMgPSBbXTtcblxuXHQvLyBxU2EoOmZvY3VzKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoQ2hyb21lIDIxKVxuXHQvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3Jcblx0Ly8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZVxuXHQvLyBTbywgd2UgYWxsb3cgOmZvY3VzIHRvIHBhc3MgdGhyb3VnaCBRU0EgYWxsIHRoZSB0aW1lIHRvIGF2b2lkIHRoZSBJRSBlcnJvclxuXHQvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4XG5cdHJidWdneVFTQSA9IFtdO1xuXG5cdGlmICggKHN1cHBvcnQucXNhID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkpICkge1xuXHRcdC8vIEJ1aWxkIFFTQSByZWdleFxuXHRcdC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmlcblx0XHRhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0Ly8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZVxuXHRcdFx0Ly8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5XG5cdFx0XHQvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSxcblx0XHRcdC8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoXG5cdFx0XHQvLyBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTlcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaW5uZXJIVE1MID0gXCI8YSBpZD0nXCIgKyBleHBhbmRvICsgXCInPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBpZD0nXCIgKyBleHBhbmRvICsgXCItXFxyXFxcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+XCIgK1xuXHRcdFx0XHRcIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+XCI7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTZcblx0XHRcdC8vIE5vdGhpbmcgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gZW1wdHkgc3RyaW5ncyBmb2xsb3cgXj0gb3IgJD0gb3IgKj1cblx0XHRcdC8vIFRoZSB0ZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHVua25vd24gaW4gT3BlcmEgYnV0IFwic2FmZVwiIGZvciBXaW5SVFxuXHRcdFx0Ly8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9oaDQ2NTM4OC5hc3B4I2F0dHJpYnV0ZV9zZWN0aW9uXG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbXNhbGxvd2NhcHR1cmVePScnXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlsqXiRdPVwiICsgd2hpdGVzcGFjZSArIFwiKig/OicnfFxcXCJcXFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCBcInZhbHVlXCIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseVxuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbChcIltzZWxlY3RlZF1cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKig/OnZhbHVlfFwiICsgYm9vbGVhbnMgKyBcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWU8MjksIEFuZHJvaWQ8NC40LCBTYWZhcmk8Ny4wKywgaU9TPDcuMCssIFBoYW50b21KUzwxLjkuOCtcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW2lkfj1cIiArIGV4cGFuZG8gKyBcIi1dXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwifj1cIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6Y2hlY2tlZFwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwiOmNoZWNrZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA4KywgaU9TIDgrXG5cdFx0XHQvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM2ODUxXG5cdFx0XHQvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzXG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcImEjXCIgKyBleHBhbmRvICsgXCIrKlwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIi4jLitbK35dXCIpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdGVsLmlubmVySFRNTCA9IFwiPGEgaHJlZj0nJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBXaW5kb3dzIDggTmF0aXZlIEFwcHNcblx0XHRcdC8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudFxuXHRcdFx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJoaWRkZW5cIiApO1xuXHRcdFx0ZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJEXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgbmFtZSBhdHRyaWJ1dGVcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIltuYW1lPWRdXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwibmFtZVwiICsgd2hpdGVzcGFjZSArIFwiKlsqXiR8IX5dPz1cIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKVxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIjplbmFibGVkXCIpLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdFx0XHQvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHNcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0aWYgKCBlbC5xdWVyeVNlbGVjdG9yQWxsKFwiOmRpc2FibGVkXCIpLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPcGVyYSAxMC0xMSBkb2VzIG5vdCB0aHJvdyBvbiBwb3N0LWNvbW1hIGludmFsaWQgcHNldWRvc1xuXHRcdFx0ZWwucXVlcnlTZWxlY3RvckFsbChcIiosOnhcIik7XG5cdFx0XHRyYnVnZ3lRU0EucHVzaChcIiwuKjpcIik7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHxcblx0XHRkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7XG5cblx0XHRhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yXG5cdFx0XHQvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KVxuXHRcdFx0c3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCA9IG1hdGNoZXMuY2FsbCggZWwsIFwiKlwiICk7XG5cblx0XHRcdC8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb25cblx0XHRcdC8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWRcblx0XHRcdG1hdGNoZXMuY2FsbCggZWwsIFwiW3MhPScnXTp4XCIgKTtcblx0XHRcdHJidWdneU1hdGNoZXMucHVzaCggXCIhPVwiLCBwc2V1ZG9zICk7XG5cdFx0fSk7XG5cdH1cblxuXHRyYnVnZ3lRU0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKFwifFwiKSApO1xuXHRyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKFwifFwiKSApO1xuXG5cdC8qIENvbnRhaW5zXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblx0aGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApO1xuXG5cdC8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlclxuXHQvLyBQdXJwb3NlZnVsbHkgc2VsZi1leGNsdXNpdmVcblx0Ly8gQXMgaW4sIGFuIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbiBpdHNlbGZcblx0Y29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID9cblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdHZhciBhZG93biA9IGEubm9kZVR5cGUgPT09IDkgPyBhLmRvY3VtZW50RWxlbWVudCA6IGEsXG5cdFx0XHRcdGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlO1xuXHRcdFx0cmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAmJiAoXG5cdFx0XHRcdGFkb3duLmNvbnRhaW5zID9cblx0XHRcdFx0XHRhZG93bi5jb250YWlucyggYnVwICkgOlxuXHRcdFx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNlxuXHRcdFx0KSk7XG5cdFx0fSA6XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHRpZiAoIGIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGIgPSBiLnBhcmVudE5vZGUpICkge1xuXHRcdFx0XHRcdGlmICggYiA9PT0gYSApIHtcblx0XHRcdFx0XHRcdHJldHVybi
46184B0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0LyogU29ydGluZ1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gRG9jdW1lbnQgb3JkZXIgc29ydGluZ1xuXHRzb3J0T3JkZXIgPSBoYXNDb21wYXJlID9cblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cblx0XHQvLyBGbGFnIGZvciBkdXBsaWNhdGUgcmVtb3ZhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHQvLyBTb3J0IG9uIG1ldGhvZCBleGlzdGVuY2UgaWYgb25seSBvbmUgaW5wdXQgaGFzIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uXG5cdFx0dmFyIGNvbXBhcmUgPSAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAtICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO1xuXHRcdGlmICggY29tcGFyZSApIHtcblx0XHRcdHJldHVybiBjb21wYXJlO1xuXHRcdH1cblxuXHRcdC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnRcblx0XHRjb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgP1xuXHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkXG5cdFx0XHQxO1xuXG5cdFx0Ly8gRGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0aWYgKCBjb21wYXJlICYgMSB8fFxuXHRcdFx0KCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkge1xuXG5cdFx0XHQvLyBDaG9vc2UgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyByZWxhdGVkIHRvIG91ciBwcmVmZXJyZWQgZG9jdW1lbnRcblx0XHRcdGlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBiID09PSBkb2N1bWVudCB8fCBiLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGIpICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXJcblx0XHRcdHJldHVybiBzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxO1xuXHR9IDpcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0Ly8gRXhpdCBlYXJseSBpZiB0aGUgbm9kZXMgYXJlIGlkZW50aWNhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdXAgPSBhLnBhcmVudE5vZGUsXG5cdFx0XHRidXAgPSBiLnBhcmVudE5vZGUsXG5cdFx0XHRhcCA9IFsgYSBdLFxuXHRcdFx0YnAgPSBbIGIgXTtcblxuXHRcdC8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkXG5cdFx0aWYgKCAhYXVwIHx8ICFidXAgKSB7XG5cdFx0XHRyZXR1cm4gYSA9PT0gZG9jdW1lbnQgPyAtMSA6XG5cdFx0XHRcdGIgPT09IGRvY3VtZW50ID8gMSA6XG5cdFx0XHRcdGF1cCA/IC0xIDpcblx0XHRcdFx0YnVwID8gMSA6XG5cdFx0XHRcdHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblxuXHRcdC8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrXG5cdFx0fSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgZnVsbCBsaXN0cyBvZiB0aGVpciBhbmNlc3RvcnMgZm9yIGNvbXBhcmlzb25cblx0XHRjdXIgPSBhO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGFwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblx0XHRjdXIgPSBiO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGJwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblxuXHRcdC8vIFdhbGsgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5XG5cdFx0d2hpbGUgKCBhcFtpXSA9PT0gYnBbaV0gKSB7XG5cdFx0XHRpKys7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGkgP1xuXHRcdFx0Ly8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yXG5cdFx0XHRzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBzb3J0IGZpcnN0XG5cdFx0XHRhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOlxuXHRcdFx0YnBbaV0gPT09IHByZWZlcnJlZERvYyA/IDEgOlxuXHRcdFx0MDtcblx0fTtcblxuXHRyZXR1cm4gZG9jdW1lbnQ7XG59O1xuXG5TaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHtcblx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTtcbn07XG5cblNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHR9XG5cblx0Ly8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkXG5cdGV4cHIgPSBleHByLnJlcGxhY2UoIHJhdHRyaWJ1dGVRdW90ZXMsIFwiPSckMSddXCIgKTtcblxuXHRpZiAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0IWNvbXBpbGVyQ2FjaGVbIGV4cHIgKyBcIiBcIiBdICYmXG5cdFx0KCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJlxuXHRcdCggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHtcblxuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7XG5cblx0XHRcdC8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRcdGlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHxcblx0XHRcdFx0XHQvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudFxuXHRcdFx0XHRcdC8vIGZyYWdtZW50IGluIElFIDlcblx0XHRcdFx0XHRlbGVtLmRvY3VtZW50ICYmIGVsZW0uZG9jdW1lbnQubm9kZVR5cGUgIT09IDExICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHt9XG5cdH1cblxuXHRyZXR1cm4gU2l6emxlKCBleHByLCBkb2
46184N1bWVudCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xufTtcblxuU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0fVxuXHRyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTtcbn07XG5cblNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sXG5cdFx0Ly8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpXG5cdFx0dmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0Zm4oIGVsZW0sIG5hbWUsICFkb2N1bWVudElzSFRNTCApIDpcblx0XHRcdHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgP1xuXHRcdHZhbCA6XG5cdFx0c3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDpcblx0XHRcdCh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkpICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xufTtcblxuU2l6emxlLmVzY2FwZSA9IGZ1bmN0aW9uKCBzZWwgKSB7XG5cdHJldHVybiAoc2VsICsgXCJcIikucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApO1xufTtcblxuU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHtcblx0dGhyb3cgbmV3IEVycm9yKCBcIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246IFwiICsgbXNnICk7XG59O1xuXG4vKipcbiAqIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXNcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzXG4gKi9cblNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7XG5cdHZhciBlbGVtLFxuXHRcdGR1cGxpY2F0ZXMgPSBbXSxcblx0XHRqID0gMCxcblx0XHRpID0gMDtcblxuXHQvLyBVbmxlc3Mgd2UgKmtub3cqIHdlIGNhbiBkZXRlY3QgZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlXG5cdGhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7XG5cdHNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFibGUgJiYgcmVzdWx0cy5zbGljZSggMCApO1xuXHRyZXN1bHRzLnNvcnQoIHNvcnRPcmRlciApO1xuXG5cdGlmICggaGFzRHVwbGljYXRlICkge1xuXHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0aWYgKCBlbGVtID09PSByZXN1bHRzWyBpIF0gKSB7XG5cdFx0XHRcdGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2xlYXIgaW5wdXQgYWZ0ZXIgc29ydGluZyB0byByZWxlYXNlIG9iamVjdHNcblx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL3B1bGwvMjI1XG5cdHNvcnRJbnB1dCA9IG51bGw7XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzXG4gKiBAcGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW1cbiAqL1xuZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHZhciBub2RlLFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0aSA9IDAsXG5cdFx0bm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdGlmICggIW5vZGVUeXBlICkge1xuXHRcdC8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5XG5cdFx0d2hpbGUgKCAobm9kZSA9IGVsZW1baSsrXSkgKSB7XG5cdFx0XHQvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2Rlc1xuXHRcdFx0cmV0ICs9IGdldFRleHQoIG5vZGUgKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHtcblx0XHQvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzXG5cdFx0Ly8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1Mylcblx0XHRpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdHJldCArPSBnZXRUZXh0KCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMyB8fCBub2RlVHlwZSA9PT0gNCApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVmFsdWU7XG5cdH1cblx0Ly8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vZGVzXG5cblx0cmV0dXJuIHJldDtcbn07XG5cbkV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0ge1xuXG5cdC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlclxuXHRjYWNoZUxlbmd0aDogNTAsXG5cblx0Y3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sXG5cblx0bWF0Y2g6IG1hdGNoRXhwcixcblxuXHRhdHRySGFuZGxlOiB7fSxcblxuXHRmaW5kOiB7fSxcblxuXHRyZWxhdGl2ZToge1xuXHRcdFwiPlwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCIgXCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiB9LFxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIn5cIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIgfVxuXHR9LFxuXG5cdHByZUZpbHRlcjoge1xuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXG5cdFx0XHRtYXRjaFszXSA9ICggbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgXCJcIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdGlmICggbWF0Y2hbMl0gPT09IFwifj1cIiApIHtcblx0XHRcdFx0bWF0Y2hbM10gPSBcIiBcIiArIG1hdGNoWzNdICsgXCIgXCI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybi
46184BtYXRjaC5zbGljZSggMCwgNCApO1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdC8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHJbXCJDSElMRFwiXVxuXHRcdFx0XHQxIHR5cGUgKG9ubHl8bnRofC4uLilcblx0XHRcdFx0MiB3aGF0IChjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHQzIGFyZ3VtZW50IChldmVufG9kZHxcXGQqfFxcZCpuKFsrLV1cXGQrKT98Li4uKVxuXHRcdFx0XHQ0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xcZCpufClcblx0XHRcdFx0NSBzaWduIG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ2IHggb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDcgc2lnbiBvZiB5LWNvbXBvbmVudFxuXHRcdFx0XHQ4IHkgb2YgeS1jb21wb25lbnRcblx0XHRcdCovXG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdGlmICggbWF0Y2hbMV0uc2xpY2UoIDAsIDMgKSA9PT0gXCJudGhcIiApIHtcblx0XHRcdFx0Ly8gbnRoLSogcmVxdWlyZXMgYXJndW1lbnRcblx0XHRcdFx0aWYgKCAhbWF0Y2hbM10gKSB7XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxEXG5cdFx0XHRcdC8vIHJlbWVtYmVyIHRoYXQgZmFsc2UvdHJ1ZSBjYXN0IHJlc3BlY3RpdmVseSB0byAwLzFcblx0XHRcdFx0bWF0Y2hbNF0gPSArKCBtYXRjaFs0XSA/IG1hdGNoWzVdICsgKG1hdGNoWzZdIHx8IDEpIDogMiAqICggbWF0Y2hbM10gPT09IFwiZXZlblwiIHx8IG1hdGNoWzNdID09PSBcIm9kZFwiICkgKTtcblx0XHRcdFx0bWF0Y2hbNV0gPSArKCAoIG1hdGNoWzddICsgbWF0Y2hbOF0gKSB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApO1xuXG5cdFx0XHQvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaDtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0dmFyIGV4Y2Vzcyxcblx0XHRcdFx0dW5xdW90ZWQgPSAhbWF0Y2hbNl0gJiYgbWF0Y2hbMl07XG5cblx0XHRcdGlmICggbWF0Y2hFeHByW1wiQ0hJTERcIl0udGVzdCggbWF0Y2hbMF0gKSApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzXG5cdFx0XHRpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRtYXRjaFsyXSA9IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCI7XG5cblx0XHRcdC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiZcblx0XHRcdFx0Ly8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSlcblx0XHRcdFx0KGV4Y2VzcyA9IHRva2VuaXplKCB1bnF1b3RlZCwgdHJ1ZSApKSAmJlxuXHRcdFx0XHQvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXNcblx0XHRcdFx0KGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7XG5cblx0XHRcdFx0Ly8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXhcblx0XHRcdFx0bWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHRcdG1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudClcblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgMyApO1xuXHRcdH1cblx0fSxcblxuXHRmaWx0ZXI6IHtcblxuXHRcdFwiVEFHXCI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkge1xuXHRcdFx0dmFyIG5vZGVOYW1lID0gbm9kZU5hbWVTZWxlY3Rvci5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWVTZWxlY3RvciA9PT0gXCIqXCIgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lO1xuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNMQVNTXCI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7XG5cdFx0XHR2YXIgcGF0dGVybiA9IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSArIFwiIFwiIF07XG5cblx0XHRcdHJldHVybiBwYXR0ZXJuIHx8XG5cdFx0XHRcdChwYXR0ZXJuID0gbmV3IFJlZ0V4cCggXCIoXnxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIGNsYXNzTmFtZSArIFwiKFwiICsgd2hpdGVzcGFjZSArIFwifCQpXCIgKSkgJiZcblx0XHRcdFx0Y2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbS5jbGFzc05hbWUgfHwgdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBcInVuZGVmaW5lZFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIiApO1xuXHRcdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBTaXp6bGUuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0XHRcdGlmICggcmVzdWx0ID09IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIiE9XCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCAhb3BlcmF0b3IgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHQgKz0gXCJcIjtcblxuXHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiPVwiID8gcmVzdWx0ID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiIT1cIiA/IHJlc3VsdCAhPT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIl49XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9PT0gMCA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiKj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiQ9XCIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIn49XCIgPyAoIFwiIFwiICsgcmVzdWx0LnJlcGxhY2UoIHJ3aGl0ZXNwYWNlLCBcIiBcIiApICsgXCIgXCIgKS5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcInw9XCIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiIDpcblx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIHR5cGUsIHdoYXQsIGFyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHtcblx0XHRcdHZhciBzaW1wbGUgPSB0eXBlLnNsaWNlKCAwLCAzICkgIT09IFwibnRoXCIsXG5cdFx0XHRcdGZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSBcImxhc3RcIixcblx0XHRcdFx0b2ZUeXBlID0gd2hhdCA9PT0gXCJvZi10eXBlXCI7XG5cblx0XHRcdHJldHVybi
46184BmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID9cblxuXHRcdFx0XHQvLyBTaG9ydGN1dCBmb3IgOm50aC0qKG4pXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiAhIWVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0fSA6XG5cblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LFxuXHRcdFx0XHRcdFx0ZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gXCJuZXh0U2libGluZ1wiIDogXCJwcmV2aW91c1NpYmxpbmdcIixcblx0XHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSxcblx0XHRcdFx0XHRcdG5hbWUgPSBvZlR5cGUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0XHRcdFx0dXNlQ2FjaGUgPSAheG1sICYmICFvZlR5cGUsXG5cdFx0XHRcdFx0XHRkaWZmID0gZmFsc2U7XG5cblx0XHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHRcdFx0aWYgKCBzaW1wbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggZGlyICkge1xuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbylcblx0XHRcdFx0XHRcdFx0XHRzdGFydCA9IGRpciA9IHR5cGUgPT09IFwib25seVwiICYmICFzdGFydCAmJiBcIm5leHRTaWJsaW5nXCI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBwYXJlbnQubGFzdENoaWxkIF07XG5cblx0XHRcdFx0XHRcdC8vIG5vbi14bWwgOm50aC1jaGlsZCguLi4pIHN0b3JlcyBjYWNoZSBkYXRhIG9uIGBwYXJlbnRgXG5cdFx0XHRcdFx0XHRpZiAoIGZvcndhcmQgJiYgdXNlQ2FjaGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU2VlayBgZWxlbWAgZnJvbSBhIHByZXZpb3VzbHktY2FjaGVkIGluZGV4XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uaW4gYSBnemlwLWZyaWVuZGx5IHdheVxuXHRcdFx0XHRcdFx0XHRub2RlID0gcGFyZW50O1xuXHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4ICYmIGNhY2hlWyAyIF07XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBub2RlSW5kZXgsIGRpZmYgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBVc2UgcHJldmlvdXNseS1jYWNoZWQgZWxlbWVudCBpbmRleCBpZiBhdmFpbGFibGVcblx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyAuLi5pbiBhIGd6aXAtZnJpZW5kbHkgd2F5XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Y2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTtcblx0XHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4O1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8geG1sIDpudGgtY2hpbGQoLi4uKVxuXHRcdFx0XHRcdFx0XHQvLyBvciA6bnRoLWxhc3QtY2hpbGQoLi4uKSBvciA6bnRoKC1sYXN0KT8tb2YtdHlwZSguLi4pXG5cdFx0XHRcdFx0XHRcdGlmICggZGlmZiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBzYW1lIGxvb3AgYXMgYWJvdmUgdG8gc2VlayBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICggKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0KytkaWZmICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCwgdGhlbiBjaGVjayBhZ2FpbnN0IGN5Y2xlIHNpemVcblx0XHRcdFx0XHRcdGRpZmYgLT0gbGFzdDtcblx0XHRcdFx0XHRcdHJldHVybi
46184BkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIHBzZXVkbywgYXJndW1lbnQgKSB7XG5cdFx0XHQvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmVcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jcHNldWRvLWNsYXNzZXNcblx0XHRcdC8vIFByaW9yaXRpemUgYnkgY2FzZSBzZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXJzXG5cdFx0XHQvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zXG5cdFx0XHR2YXIgYXJncyxcblx0XHRcdFx0Zm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fFxuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBwc2V1ZG86IFwiICsgcHNldWRvICk7XG5cblx0XHRcdC8vIFRoZSB1c2VyIG1heSB1c2UgY3JlYXRlUHNldWRvIHRvIGluZGljYXRlIHRoYXRcblx0XHRcdC8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uXG5cdFx0XHQvLyBqdXN0IGFzIFNpenpsZSBkb2VzXG5cdFx0XHRpZiAoIGZuWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHJldHVybiBmbiggYXJndW1lbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzXG5cdFx0XHRpZiAoIGZuLmxlbmd0aCA+IDEgKSB7XG5cdFx0XHRcdGFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCBcIlwiLCBhcmd1bWVudCBdO1xuXHRcdFx0XHRyZXR1cm4gRXhwci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KCBwc2V1ZG8udG9Mb3dlckNhc2UoKSApID9cblx0XHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHRcdFx0XHR2YXIgaWR4LFxuXHRcdFx0XHRcdFx0XHRtYXRjaGVkID0gZm4oIHNlZWQsIGFyZ3VtZW50ICksXG5cdFx0XHRcdFx0XHRcdGkgPSBtYXRjaGVkLmxlbmd0aDtcblx0XHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0XHRpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHRcdHNlZWRbIGlkeCBdID0gISggbWF0Y2hlc1sgaWR4IF0gPSBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSkgOlxuXHRcdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuKCBlbGVtLCAwLCBhcmdzICk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZuO1xuXHRcdH1cblx0fSxcblxuXHRwc2V1ZG9zOiB7XG5cdFx0Ly8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zXG5cdFx0XCJub3RcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdC8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlXG5cdFx0XHQvLyB0byBhdm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuXHRcdFx0Ly8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzXG5cdFx0XHR2YXIgaW5wdXQgPSBbXSxcblx0XHRcdFx0cmVzdWx0cyA9IFtdLFxuXHRcdFx0XHRtYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApICk7XG5cblx0XHRcdHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gP1xuXHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMsIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0XHRcdHVubWF0Y2hlZCA9IG1hdGNoZXIoIHNlZWQsIG51bGwsIHhtbCwgW10gKSxcblx0XHRcdFx0XHRcdGkgPSBzZWVkLmxlbmd0aDtcblxuXHRcdFx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIHVubWF0Y2hlZCBieSBgbWF0Y2hlcmBcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0XHRcdFx0XHRzZWVkW2ldID0gIShtYXRjaGVzW2ldID0gZWxlbSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0aW5wdXRbMF0gPSBlbGVtO1xuXHRcdFx0XHRcdG1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTtcblx0XHRcdFx0XHQvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0XHRcdGlucHV0WzBdID0gbnVsbDtcblx0XHRcdFx0XHRyZXR1cm4gIXJlc3VsdHMucG9wKCk7XG5cdFx0XHRcdH07XG5cdFx0fSksXG5cblx0XHRcImhhc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gU2l6emxlKCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0XCJjb250YWluc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8IGdldFRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIFwiV2hldGhlciBhbiBlbGVtZW50IGlzIHJlcHJlc2VudGVkIGJ5IGEgOmxhbmcoKSBzZWxlY3RvclxuXHRcdC8vIGlzIGJhc2VkIHNvbGVseSBvbiB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlXG5cdFx0Ly8gYmVpbmcgZXF1YWwgdG8gdGhlIGlkZW50aWZpZXIgQyxcblx0XHQvLyBvciBiZWdpbm5pbmcgd2l0aCB0aGUgaWRlbnRpZmllciBDIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IFwiLVwiLlxuXHRcdC8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuXHRcdC8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuXCJcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2xhbmctcHNldWRvXG5cdFx0XCJsYW5nXCI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7XG5cdFx0XHQvLyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyXG5cdFx0XHRpZiAoICFyaWRlbnRpZmllci50ZXN0KGxhbmcgfHwgXCJcIikgKSB7XG5cdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBsYW5nOiBcIiArIGxhbmcgKTtcblx0XHRcdH1cblx0XHRcdGxhbmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybi
46184BmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIGVsZW1MYW5nO1xuXHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0aWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRcdFx0XHRlbGVtLmxhbmcgOlxuXHRcdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoXCJ4bWw6bGFuZ1wiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImxhbmdcIikpICkge1xuXG5cdFx0XHRcdFx0XHRlbGVtTGFuZyA9IGVsZW1MYW5nLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArIFwiLVwiICkgPT09IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IHdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIE1pc2NlbGxhbmVvdXNcblx0XHRcInRhcmdldFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xuXHRcdFx0cmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkO1xuXHRcdH0sXG5cblx0XHRcInJvb3RcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jRWxlbTtcblx0XHR9LFxuXG5cdFx0XCJmb2N1c1wiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmICghZG9jdW1lbnQuaGFzRm9jdXMgfHwgZG9jdW1lbnQuaGFzRm9jdXMoKSkgJiYgISEoZWxlbS50eXBlIHx8IGVsZW0uaHJlZiB8fCB+ZWxlbS50YWJJbmRleCk7XG5cdFx0fSxcblxuXHRcdC8vIEJvb2xlYW4gcHJvcGVydGllc1xuXHRcdFwiZW5hYmxlZFwiOiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggZmFsc2UgKSxcblx0XHRcImRpc2FibGVkXCI6IGNyZWF0ZURpc2FibGVkUHNldWRvKCB0cnVlICksXG5cblx0XHRcImNoZWNrZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBJbiBDU1MzLCA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHNcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaG
46184Vja2VkXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gKG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgISFlbGVtLmNoZWNrZWQpIHx8IChub2RlTmFtZSA9PT0gXCJvcHRpb25cIiAmJiAhIWVsZW0uc2VsZWN0ZWQpO1xuXHRcdH0sXG5cblx0XHRcInNlbGVjdGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdFxuXHRcdFx0Ly8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseVxuXHRcdFx0aWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0Ly8gQ29udGVudHNcblx0XHRcImVtcHR5XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG9cblx0XHRcdC8vIDplbXB0eSBpcyBuZWdhdGVkIGJ5IGVsZW1lbnQgKDEpIG9yIGNvbnRlbnQgbm9kZXMgKHRleHQ6IDM7IGNkYXRhOiA0OyBlbnRpdHkgcmVmOiA1KSxcblx0XHRcdC8vICAgYnV0IG5vdCBieSBvdGhlcnMgKGNvbW1lbnQ6IDg7IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246IDc7IGV0Yy4pXG5cdFx0XHQvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHRcInBhcmVudFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAhRXhwci5wc2V1ZG9zW1wiZW1wdHlcIl0oIGVsZW0gKTtcblx0XHR9LFxuXG5cdFx0Ly8gRWxlbWVudC9pbnB1dCB0eXBlc1xuXHRcdFwiaGVhZGVyXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImlucHV0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImJ1dHRvblwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IFwiYnV0dG9uXCIgfHwgbmFtZSA9PT0gXCJidXR0b25cIjtcblx0XHR9LFxuXG5cdFx0XCJ0ZXh0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGF0dHI7XG5cdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiZcblx0XHRcdFx0ZWxlbS50eXBlID09PSBcInRleHRcIiAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFPDhcblx0XHRcdFx0Ly8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sIFwic2VhcmNoXCIpIGFwcGVhciB3aXRoIGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCJcblx0XHRcdFx0KCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkgPT0gbnVsbCB8fCBhdHRyLnRvTG93ZXJDYXNlKCkgPT09IFwidGV4dFwiICk7XG5cdFx0fSxcblxuXHRcdC8vIFBvc2l0aW9uLWluLWNvbGxlY3Rpb25cblx0XHRcImZpcnN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gWyAwIF07XG5cdFx0fSksXG5cblx0XHRcImxhc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gWyBsZW5ndGggLSAxIF07XG5cdFx0fSksXG5cblx0XHRcImVxXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTtcblx0XHR9KSxcblxuXHRcdFwiZXZlblwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwib2RkXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAxO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJsdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7IC0taSA+PSAwOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcImd0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybi
46184BtYXRjaEluZGV4ZXM7XG5cdFx0fSlcblx0fVxufTtcblxuRXhwci5wc2V1ZG9zW1wibnRoXCJdID0gRXhwci5wc2V1ZG9zW1wiZXFcIl07XG5cbi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zXG5mb3IgKCBpIGluIHsgcmFkaW86IHRydWUsIGNoZWNrYm94OiB0cnVlLCBmaWxlOiB0cnVlLCBwYXNzd29yZDogdHJ1ZSwgaW1hZ2U6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApO1xufVxuZm9yICggaSBpbiB7IHN1Ym1pdDogdHJ1ZSwgcmVzZXQ6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVCdXR0b25Qc2V1ZG8oIGkgKTtcbn1cblxuLy8gRWFzeSBBUEkgZm9yIGNyZWF0aW5nIG5ldyBzZXRGaWx0ZXJzXG5mdW5jdGlvbiBzZXRGaWx0ZXJzKCkge31cbnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zO1xuRXhwci5zZXRGaWx0ZXJzID0gbmV3IHNldEZpbHRlcnMoKTtcblxudG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHtcblx0dmFyIG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsXG5cdFx0c29GYXIsIGdyb3VwcywgcHJlRmlsdGVycyxcblx0XHRjYWNoZWQgPSB0b2tlbkNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCBjYWNoZWQgKSB7XG5cdFx0cmV0dXJuIHBhcnNlT25seSA/IDAgOiBjYWNoZWQuc2xpY2UoIDAgKTtcblx0fVxuXG5cdHNvRmFyID0gc2VsZWN0b3I7XG5cdGdyb3VwcyA9IFtdO1xuXHRwcmVGaWx0ZXJzID0gRXhwci5wcmVGaWx0ZXI7XG5cblx0d2hpbGUgKCBzb0ZhciApIHtcblxuXHRcdC8vIENvbW1hIGFuZCBmaXJzdCBydW5cblx0XHRpZiAoICFtYXRjaGVkIHx8IChtYXRjaCA9IHJjb21tYS5leGVjKCBzb0ZhciApKSApIHtcblx0XHRcdGlmICggbWF0Y2ggKSB7XG5cdFx0XHRcdC8vIERvbid0IGNvbnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkXG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApIHx8IHNvRmFyO1xuXHRcdFx0fVxuXHRcdFx0Z3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTtcblx0XHR9XG5cblx0XHRtYXRjaGVkID0gZmFsc2U7XG5cblx0XHQvLyBDb21iaW5hdG9yc1xuXHRcdGlmICggKG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkpICkge1xuXHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHQvLyBDYXN0IGRlc2NlbmRhbnQgY29tYmluYXRvcnMgdG8gc3BhY2Vcblx0XHRcdFx0dHlwZTogbWF0Y2hbMF0ucmVwbGFjZSggcnRyaW0sIFwiIFwiIClcblx0XHRcdH0pO1xuXHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGaWx0ZXJzXG5cdFx0Zm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHtcblx0XHRcdGlmICggKG1hdGNoID0gbWF0Y2hFeHByWyB0eXBlIF0uZXhlYyggc29GYXIgKSkgJiYgKCFwcmVGaWx0ZXJzWyB0eXBlIF0gfHxcblx0XHRcdFx0KG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cdFx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0XHRtYXRjaGVzOiBtYXRjaFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoICFtYXRjaGVkICkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQgZXhjZXNzXG5cdC8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZ1xuXHQvLyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9yIG9yIHJldHVybiB0b2tlbnNcblx0cmV0dXJuIHBhcnNlT25seSA/XG5cdFx0c29GYXIubGVuZ3RoIDpcblx0XHRzb0ZhciA/XG5cdFx0XHRTaXp6bGUuZXJyb3IoIHNlbGVjdG9yICkgOlxuXHRcdFx0Ly8gQ2FjaGUgdGhlIHRva2Vuc1xuXHRcdFx0dG9rZW5DYWNoZSggc2VsZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7XG59O1xuXG5mdW5jdGlvbiB0b1NlbGVjdG9yKCB0b2tlbnMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdHNlbGVjdG9yID0gXCJcIjtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0c2VsZWN0b3IgKz0gdG9rZW5zW2ldLnZhbHVlO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gYWRkQ29tYmluYXRvciggbWF0Y2hlciwgY29tYmluYXRvciwgYmFzZSApIHtcblx0dmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLFxuXHRcdHNraXAgPSBjb21iaW5hdG9yLm5leHQsXG5cdFx0a2V5ID0gc2tpcCB8fCBkaXIsXG5cdFx0Y2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYga2V5ID09PSBcInBhcmVudE5vZGVcIixcblx0XHRkb25lTmFtZSA9IGRvbmUrKztcblxuXHRyZXR1cm4gY29tYmluYXRvci5maXJzdCA/XG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gOlxuXG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsXG5cdFx0XHRcdG5ld0NhY2hlID0gWyBkaXJydW5zLCBkb25lTmFtZSBdO1xuXG5cdFx0XHQvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBjb21iaW5
46184hdG9yIGNhY2hpbmdcblx0XHRcdGlmICggeG1sICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdGlmICggc2tpcCAmJiBza2lwID09PSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdGVsZW0gPSBlbGVtWyBkaXIgXSB8fCBlbGVtO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggKG9sZENhY2hlID0gdW5pcXVlQ2FjaGVbIGtleSBdKSAmJlxuXHRcdFx0XHRcdFx0XHRvbGRDYWNoZVsgMCBdID09PSBkaXJydW5zICYmIG9sZENhY2hlWyAxIF0gPT09IGRvbmVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFzc2lnbiB0byBuZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsga2V5IF0gPSBuZXdDYWNoZTtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmdcblx0XHRcdFx0XHRcdFx0aWYgKCAobmV3Q2FjaGVbIDIgXSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG59XG5cbmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHtcblx0cmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgP1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICFtYXRjaGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IDpcblx0XHRtYXRjaGVyc1swXTtcbn1cblxuZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0c1tpXSwgcmVzdWx0cyApO1xuXHR9XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkge1xuXHR2YXIgZWxlbSxcblx0XHRuZXdVbm1hdGNoZWQgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsZW4gPSB1bm1hdGNoZWQubGVuZ3RoLFxuXHRcdG1hcHBlZCA9IG1hcCAhPSBudWxsO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0aWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdG5ld1VubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdGlmICggbWFwcGVkICkge1xuXHRcdFx0XHRcdG1hcC5wdXNoKCBpICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbmV3VW5tYXRjaGVkO1xufVxuXG5mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7XG5cdGlmICggcG9zdEZpbHRlciAmJiAhcG9zdEZpbHRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7XG5cdH1cblx0aWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbmRlciA9IHNldE1hdGNoZXIoIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApO1xuXHR9XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHtcblx0XHR2YXIgdGVtcCwgaSwgZWxlbSxcblx0XHRcdHByZU1hcCA9IFtdLFxuXHRcdFx0cG9zdE1hcCA9IFtdLFxuXHRcdFx0cHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHRcblx0XHRcdGVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCBcIipcIiwgY29udGV4dC5ub2RlVHlwZSA/IFsgY29udGV4dCBdIDogY29udGV4dCwgW10gKSxcblxuXHRcdFx0Ly8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uXG5cdFx0XHRtYXRjaGVySW4gPSBwcmVGaWx0ZXIgJiYgKCBzZWVkIHx8ICFzZWxlY3RvciApID9cblx0XHRcdFx0Y29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRlbGVtcyxcblxuXHRcdFx0bWF0Y2hlck91dCA9IG1hdGNoZXIgP1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZpbHRlciBvciBwcmVleGlzdGluZyByZXN1bHRzLFxuXHRcdFx0XHRwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/XG5cblx0XHRcdFx0XHQvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3Nhcnlcblx0XHRcdFx0XHRbXSA6XG5cblx0XHRcdFx0XHQvLyAuLi5vdGhlcndpc2UgdXNlI
46184HJlc3VsdHMgZGlyZWN0bHlcblx0XHRcdFx0XHRyZXN1bHRzIDpcblx0XHRcdFx0bWF0Y2hlckluO1xuXG5cdFx0Ly8gRmluZCBwcmltYXJ5IG1hdGNoZXNcblx0XHRpZiAoIG1hdGNoZXIgKSB7XG5cdFx0XHRtYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHBvc3RGaWx0ZXJcblx0XHRpZiAoIHBvc3RGaWx0ZXIgKSB7XG5cdFx0XHR0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTtcblx0XHRcdHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTtcblxuXHRcdFx0Ly8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJblxuXHRcdFx0aSA9IHRlbXAubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkge1xuXHRcdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzXG5cdFx0XHRcdFx0dGVtcCA9IFtdO1xuXHRcdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0Y2hcblx0XHRcdFx0XHRcdFx0dGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWRcblx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgJiZcblx0XHRcdFx0XHRcdCh0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHtcblxuXHRcdFx0XHRcdFx0c2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gQWRkIGVsZW1lbnRzIHRvIHJlc3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXJPdXQgPSBjb25kZW5zZShcblx0XHRcdFx0bWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/XG5cdFx0XHRcdFx0bWF0Y2hlck91dC5zcGxpY2UoIHByZWV4aXN0aW5nLCBtYXRjaGVyT3V0Lmxlbmd0aCApIDpcblx0XHRcdFx0XHRtYXRjaGVyT3V0XG5cdFx0XHQpO1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkge1xuXHR2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0bGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzBdLnR5cGUgXSxcblx0XHRpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbXCIgXCJdLFxuXHRcdGkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCxcblxuXHRcdC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpXG5cdFx0bWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0O1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBpbmRleE9mKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xO1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciByZXQgPSAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKFxuXHRcdFx0XHQoY2hlY2tDb250ZXh0ID0gY29udGV4dCkubm9kZVR5cGUgP1xuXHRcdFx0XHRcdG1hdGNoQ29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRcdG1hdGNoQW55Q29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgKTtcblx0XHRcdC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0Y2hlY2tDb250ZXh0ID0gbnVsbDtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBdO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbaV0udHlwZSBdKSApIHtcblx0XHRcdG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLCBtYXRjaGVyKSBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7XG5cblx0XHRcdC8vIFJldHVybi
46184BzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyXG5cdFx0XHRpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0Ly8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nXG5cdFx0XHRcdGogPSArK2k7XG5cdFx0XHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc2V0TWF0Y2hlcihcblx0XHRcdFx0XHRpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSxcblx0XHRcdFx0XHRpID4gMSAmJiB0b1NlbGVjdG9yKFxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmBcblx0XHRcdFx0XHRcdHRva2Vucy5zbGljZSggMCwgaSAtIDEgKS5jb25jYXQoeyB2YWx1ZTogdG9rZW5zWyBpIC0gMiBdLnR5cGUgPT09IFwiIFwiID8gXCIqXCIgOiBcIlwiIH0pXG5cdFx0XHRcdFx0KS5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksXG5cdFx0XHRcdFx0bWF0Y2hlcixcblx0XHRcdFx0XHRpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlcnMucHVzaCggbWF0Y2hlciApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkge1xuXHR2YXIgYnlTZXQgPSBzZXRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdHN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHtcblx0XHRcdHZhciBlbGVtLCBqLCBtYXRjaGVyLFxuXHRcdFx0XHRtYXRjaGVkQ291bnQgPSAwLFxuXHRcdFx0XHRpID0gXCIwXCIsXG5cdFx0XHRcdHVubWF0Y2hlZCA9IHNlZWQgJiYgW10sXG5cdFx0XHRcdHNldE1hdGNoZWQgPSBbXSxcblx0XHRcdFx0Y29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsXG5cdFx0XHRcdC8vIFdlIG11c3QgYWx3YXlzIGhhdmUgZWl0aGVyIHNlZWQgZWxlbWVudHMgb3Igb3V0ZXJtb3N0IGNvbnRleHRcblx0XHRcdFx0ZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAmJiBFeHByLmZpbmRbXCJUQUdcIl0oIFwiKlwiLCBvdXRlcm1vc3QgKSxcblx0XHRcdFx0Ly8gVXNlIGludGVnZXIgZGlycnVucyBpZmYgdGhpcyBpcyB0aGUgb3V0ZXJtb3N0IG1hdGNoZXJcblx0XHRcdFx0ZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksXG5cdFx0XHRcdGxlbiA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHNcblx0XHRcdC8vIFN1cHBvcnQ6IElFPDksIFNhZmFyaVxuXHRcdFx0Ly8gVG9sZXJhdGUgTm9kZUxpc3QgcHJvcGVydGllcyAoSUU6IFwibGVuZ3RoXCI7IFNhZmFyaTogPG51bWJlcj4pIG1hdGNoaW5nIGVsZW1lbnRzIGJ5IGlkXG5cdFx0XHRmb3IgKCA7IGkgIT09IGxlbiAmJiAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggYnlFbGVtZW50ICYmIGVsZW0gKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0aWYgKCAhY29udGV4dCAmJiBlbGVtLm93bmVyRG9jdW1lbnQgIT09IGRvY3VtZW50ICkge1xuXHRcdFx0XHRcdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0XHRcdFx0XHRcdHhtbCA9ICFkb2N1bWVudElzSFRNTDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0d2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCB8fCBkb2N1bWVudCwgeG1sKSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnNcblx0XHRcdFx0aWYgKCBieVNldCApIHtcblx0XHRcdFx0XHQvLyBUaGV5IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzXG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0pICkge1xuXHRcdFx0XHRcdFx0bWF0Y2hlZENvdW50LS07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9yIG5vdFxuXHRcdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHRcdHVubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGBpYCBpcyBub3cgdGhlIGNvdW50IG9mIGVsZW1lbnRzIHZpc2l0ZWQgYWJvdmUsIGFuZCBhZGRpbmcgaXQgdG8gYG1hdGNoZWRDb3VudGBcblx0XHRcdC8vIG1ha2VzIHRoZSBsYXR0ZXIgbm9ubmVnYXRpdmUuXG5cdFx0XHRtYXRjaGVkQ291bnQgKz0gaTtcblxuXHRcdFx0Ly8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5tYXRjaGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBlcXVhbHMgYGlgKSwgdW5sZXNzIHdlIGRpZG4ndCB2aXNpdCBfYW55XyBlbGVtZW50cyBpbiB0aGUgYWJvdmUgbG9vcCBiZWNhdXNlIHdlIGhhdmVcblx0XHRcdC8vIG5vIGVsZW1lbnQgbWF0Y2hlcnMgYW5kIG5vIHNlZWQuXG5cdFx0XHQvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyBcIjBcIiBgaWAgYWxsb3dzIGBpYCB0byByZW1haW4gYSBzdHJpbmcgb25seSBpbiB0aGF0XG5cdFx0XHQvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIFwiMDBcIiBgbWF0Y2hlZENvdW50YCB0aGF0IGRpZmZlcnMgZnJvbSBgaWAgYnV0IGlzIGFsc29cblx0XHRcdC8vIG51bWVyaWNhbGx5IHplcm8uXG5cdFx0XHRpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRDb3VudCApIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBzZXRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdC8vIFJlaW50ZWdyYXRlIGVsZW1lbnQgbWF0Y2hlcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHNvcnRpbmdcblx0XHRcdFx0XHRpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCAhKHVubWF0Y2hlZFtpXSB8fCBzZXRNYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0XHRzZXRNYXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3VsdHMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzXG5cdFx0XHRcdFx0c2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTtcblxuXHRcdFx0XHQvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmdcblx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0KCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7XG5cblx0XHRcdFx0XHRTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVyc1xuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdGRpcnJ1bnMgP
46184SBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVubWF0Y2hlZDtcblx0XHR9O1xuXG5cdHJldHVybiBieVNldCA/XG5cdFx0bWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6XG5cdFx0c3VwZXJNYXRjaGVyO1xufVxuXG5jb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIG1hdGNoIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHR2YXIgaSxcblx0XHRzZXRNYXRjaGVycyA9IFtdLFxuXHRcdGVsZW1lbnRNYXRjaGVycyA9IFtdLFxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoICFjYWNoZWQgKSB7XG5cdFx0Ly8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50XG5cdFx0aWYgKCAhbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdH1cblx0XHRpID0gbWF0Y2gubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0Y2FjaGVkID0gbWF0Y2hlckZyb21Ub2tlbnMoIG1hdGNoW2ldICk7XG5cdFx0XHRpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTtcblxuXHRcdC8vIFNhdmUgc2VsZWN0b3IgYW5kIHRva2VuaXphdGlvblxuXHRcdGNhY2hlZC5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHR9XG5cdHJldHVybiBjYWNoZWQ7XG59O1xuXG4vKipcbiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZVxuICogQHBhcmFtIHtFbGVtZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c11cbiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0XG4gKi9cbnNlbGVjdCA9IFNpenpsZS5zZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLFxuXHRcdGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgc2VsZWN0b3IsXG5cdFx0bWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWRcblx0Ly8gKHRoZSBsYXR0ZXIgb2Ygd2hpY2ggZ3VhcmFudGVlcyB1cyBjb250ZXh0KVxuXHRpZiAoIG1hdGNoLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdC8vIFJlZHVjZSBjb250ZXh0IGlmIHRoZSBsZWFkaW5nIGNvbXBvdW5kIHNlbGVjdG9yIGlzIGFuIElEXG5cdFx0dG9rZW5zID0gbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCApO1xuXHRcdGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKHRva2VuID0gdG9rZW5zWzBdKS50eXBlID09PSBcIklEXCIgJiZcblx0XHRcdFx0Y29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkge1xuXG5cdFx0XHRjb250ZXh0ID0gKCBFeHByLmZpbmRbXCJJRFwiXSggdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKHJ1bmVzY2FwZSwgZnVuZXNjYXBlKSwgY29udGV4dCApIHx8IFtdIClbMF07XG5cdFx0XHRpZiAoICFjb250ZXh0ICkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0Ly8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbFxuXHRcdFx0fSBlbHNlIGlmICggY29tcGlsZWQgKSB7XG5cdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZldGNoIGEgc2VlZCBzZXQgZm9yIHJpZ2h0LXRvLWxlZnQgbWF0Y2hpbmdcblx0XHRpID0gbWF0Y2hFeHByW1wibmVlZHNDb250ZXh0XCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHRva2VuID0gdG9rZW5zW2ldO1xuXG5cdFx0XHQvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yXG5cdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbICh0eXBlID0gdG9rZW4udHlwZSkgXSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIChmaW5kID0gRXhwci5maW5kWyB0eXBlIF0pICkge1xuXHRcdFx0XHQvLyBTZWFyY2gsIGV4cGFuZGluZyBjb250ZXh0IGZvciBsZWFkaW5nIHNpYmxpbmcgY29tYmluYXRvcnNcblx0XHRcdFx0aWYgKCAoc2VlZCA9IGZpbmQoXG5cdFx0XHRcdFx0dG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLFxuXHRcdFx0XHRcdHJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHRcblx0XHRcdFx0KSkgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHlcblx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlKCBpLCAxICk7XG5cdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJi
46184B0b1NlbGVjdG9yKCB0b2tlbnMgKTtcblx0XHRcdFx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNlZWQgKTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbiBpZiBvbmUgaXMgbm90IHByb3ZpZGVkXG5cdC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmVcblx0KCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKFxuXHRcdHNlZWQsXG5cdFx0Y29udGV4dCxcblx0XHQhZG9jdW1lbnRJc0hUTUwsXG5cdFx0cmVzdWx0cyxcblx0XHQhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdCk7XG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLy8gT25lLXRpbWUgYXNzaWdubWVudHNcblxuLy8gU29ydCBzdGFiaWxpdHlcbnN1cHBvcnQuc29ydFN0YWJsZSA9IGV4cGFuZG8uc3BsaXQoXCJcIikuc29ydCggc29ydE9yZGVyICkuam9pbihcIlwiKSA9PT0gZXhwYW5kbztcblxuLy8gU3VwcG9ydDogQ2hyb21lIDE0LTM1K1xuLy8gQWx3YXlzIGFzc3VtZSBkdXBsaWNhdGVzIGlmIHRoZXkgYXJlbid0IHBhc3NlZCB0byB0aGUgY29tcGFyaXNvbiBmdW5jdGlvblxuc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7XG5cbi8vIEluaXRpYWxpemUgYWdhaW5zdCB0aGUgZGVmYXVsdCBkb2N1bWVudFxuc2V0RG9jdW1lbnQoKTtcblxuLy8gU3VwcG9ydDogV2Via2l0PDUzNy4zMiAtIFNhZmFyaSA2LjAuMy9DaHJvbWUgMjUgKGZpeGVkIGluIENocm9tZSAyNylcbi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKlxuc3VwcG9ydC5zb3J0RGV0YWNoZWQgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHQvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZylcblx0cmV0dXJuIGVsLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZmllbGRzZXRcIikgKSAmIDE7XG59KTtcblxuLy8gU3VwcG9ydDogSUU8OFxuLy8gUHJldmVudCBhdHRyaWJ1dGUvcHJvcGVydHkgXCJpbnRlcnBvbGF0aW9uXCJcbi8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzY0MjklMjhWUy44NSUyOS5hc3B4XG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxhIGhyZWY9JyMnPjwvYT5cIjtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIgO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggXCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInR5cGVcIiA/IDEgOiAyICk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8gU3VwcG9ydDogSUU8OVxuLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxpbnB1dC8+XCI7XG5cdGVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCBcInZhbHVlXCIsIFwiXCIgKTtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gXCJcIjtcbn0pICkge1xuXHRhZGRIYW5kbGUoIFwidmFsdWVcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXNcbmlmICggIWFzc2VydChmdW5jdGlvbiggZWwgKSB7XG5cdHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA9PSBudWxsO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgdmFsO1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdFx0KHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xuXHRcdH1cblx0fSk7XG59XG5cbnJldHVybiBTaXp6bGU7XG5cbn0pKCB3aW5kb3cgKTtcblxuXG5cbmpRdWVyeS5maW5kID0gU2l6emxlO1xualF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzO1xuXG4vLyBEZXByZWNhdGVkXG5qUXVlcnkuZXhwclsgXCI6XCIgXSA9IGpRdWVyeS5leHByLnBzZXVkb3M7XG5qUXVlcnkudW5pcXVlU29ydCA9IGpRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDtcbmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7XG5qUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7XG5qUXVlcnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7XG5qUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlO1xuXG5cblxuXG52YXIgZGlyID0gZnVuY3Rpb24oIGVsZW0sIGRpciwgdW50aWwgKSB7XG5cdHZhciBtYXRjaGVkID0gW10sXG5cdFx0dHJ1bmNhdGUgPSB1bnRpbCAhPT0gdW5kZWZpbmVkO1xuXG5cdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSAmJiBlbGVtLm5vZGVUeXBlICE9PSA5ICkge1xuXHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGlmICggdHJ1bmNhdGUgJiYgalF1ZXJ5KCBlbGVtICkuaXMoIHVudGlsICkgKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0fVxuXHR9XG5cdHJldHVybi
46184BtYXRjaGVkO1xufTtcblxuXG52YXIgc2libGluZ3MgPSBmdW5jdGlvbiggbiwgZWxlbSApIHtcblx0dmFyIG1hdGNoZWQgPSBbXTtcblxuXHRmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkge1xuXHRcdGlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkge1xuXHRcdFx0bWF0Y2hlZC5wdXNoKCBuICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG1hdGNoZWQ7XG59O1xuXG5cbnZhciBybmVlZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O1xuXG5cblxuZnVuY3Rpb24gbm9kZU5hbWUoIGVsZW0sIG5hbWUgKSB7XG5cbiAgcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbn07XG52YXIgcnNpbmdsZVRhZyA9ICggL148KFthLXpdW15cXC9cXDA+OlxceDIwXFx0XFxyXFxuXFxmXSopW1xceDIwXFx0XFxyXFxuXFxmXSpcXC8/Pig/OjxcXC9cXDE+fCkkL2kgKTtcblxuXG5cbi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90XG5mdW5jdGlvbiB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZpZXIsIG5vdCApIHtcblx0aWYgKCBpc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcblx0XHRcdHJldHVybiAhIXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICkgIT09IG5vdDtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBTaW5nbGUgZWxlbWVudFxuXHRpZiAoIHF1YWxpZmllci5ub2RlVHlwZSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gQXJyYXlsaWtlIG9mIGVsZW1lbnRzIChqUXVlcnksIGFyZ3VtZW50cywgQXJyYXkpXG5cdGlmICggdHlwZW9mIHF1YWxpZmllciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGluZGV4T2YuY2FsbCggcXVhbGlmaWVyLCBlbGVtICkgPiAtMSApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gRmlsdGVyZWQgZGlyZWN0bHkgZm9yIGJvdGggc2ltcGxlIGFuZCBjb21wbGV4IHNlbGVjdG9yc1xuXHRyZXR1cm4galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cywgbm90ICk7XG59XG5cbmpRdWVyeS5maWx0ZXIgPSBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHtcblx0dmFyIGVsZW0gPSBlbGVtc1sgMCBdO1xuXG5cdGlmICggbm90ICkge1xuXHRcdGV4cHIgPSBcIjpub3QoXCIgKyBleHByICsgXCIpXCI7XG5cdH1cblxuXHRpZiAoIGVsZW1zLmxlbmd0aCA9PT0gMSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdHJldHVybiBqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGVsZW0sIGV4cHIgKSA/IFsgZWxlbSBdIDogW107XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTtcblx0fSApICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgaSwgcmV0LFxuXHRcdFx0bGVuID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRzZWxmID0gdGhpcztcblxuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkoIHNlbGVjdG9yICkuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKSApO1xuXHRcdH1cblxuXHRcdHJldCA9IHRoaXMucHVzaFN0YWNrKCBbXSApO1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGpRdWVyeS5maW5kKCBzZWxlY3Rvciwgc2VsZlsgaSBdLCByZXQgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbGVuID4gMSA/IGpRdWVyeS51bmlxdWVTb3J0KCByZXQgKSA6IHJldDtcblx0fSxcblx0ZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7XG5cdH0sXG5cdG5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgdHJ1ZSApICk7XG5cdH0sXG5cdGlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuICEhd2lubm93KFxuXHRcdFx0dGhpcyxcblxuXHRcdFx0Ly8gSWYgdGhpcyBpcyBhIHBvc2l0aW9uYWwvcmVsYXRpdmUgc2VsZWN0b3IsIGNoZWNrIG1lbWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNldFxuXHRcdFx0Ly8gc28gJChcInA6Zmlyc3RcIikuaXMoXCJwOmxhc3RcIikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdpdGggdHdvIFwicFwiLlxuXHRcdFx0dHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGpRdWVyeSggc2VsZWN0b3IgKSA6XG5cdFx0XHRcdHNlbGVjdG9yIHx8IFtdLFxuXHRcdFx0ZmFsc2Vcblx0XHQpLmxlbmd0aDtcblx0fVxufSApO1xuXG5cbi8vIEluaXRpYWxpemUgYSBqUXVlcnkgb2JqZWN0XG5cblxuLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpXG52YXIgcm9vdGpRdWVyeSxcblxuXHQvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5nc1xuXHQvLyBQcmlvcml0aXplICNpZCBvdmVyIDx0YWc+IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAoIzk1MjEpXG5cdC8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KVxuXHQvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkXG5cdHJxdWlja0V4cHIgP
46184SAvXig/OlxccyooPFtcXHdcXFddKz4pW14+XSp8IyhbXFx3LV0rKSkkLyxcblxuXHRpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7XG5cdFx0dmFyIG1hdGNoLCBlbGVtO1xuXG5cdFx0Ly8gSEFORExFOiAkKFwiXCIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpXG5cdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHQvLyBNZXRob2QgaW5pdCgpIGFjY2VwdHMgYW4gYWx0ZXJuYXRlIHJvb3RqUXVlcnlcblx0XHQvLyBzbyBtaWdyYXRlIGNhbiBzdXBwb3J0IGpRdWVyeS5zdWIgKGdoLTIxMDEpXG5cdFx0cm9vdCA9IHJvb3QgfHwgcm9vdGpRdWVyeTtcblxuXHRcdC8vIEhhbmRsZSBIVE1MIHN0cmluZ3Ncblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGlmICggc2VsZWN0b3JbIDAgXSA9PT0gXCI8XCIgJiZcblx0XHRcdFx0c2VsZWN0b3JbIHNlbGVjdG9yLmxlbmd0aCAtIDEgXSA9PT0gXCI+XCIgJiZcblx0XHRcdFx0c2VsZWN0b3IubGVuZ3RoID49IDMgKSB7XG5cblx0XHRcdFx0Ly8gQXNzdW1lIHRoYXQgc3RyaW5ncyB0aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCA8PiBhcmUgSFRNTCBhbmQgc2tpcCB0aGUgcmVnZXggY2hlY2tcblx0XHRcdFx0bWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYXRjaCBodG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkXG5cdFx0XHRpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkge1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KVxuXHRcdFx0XHRpZiAoIG1hdGNoWyAxIF0gKSB7XG5cdFx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZXh0WyAwIF0gOiBjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoXG5cdFx0XHRcdFx0XHRtYXRjaFsgMSBdLFxuXHRcdFx0XHRcdFx0Y29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpICk7XG5cblx0XHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpXG5cdFx0XHRcdFx0aWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWyAxIF0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICkge1xuXHRcdFx0XHRcdFx0Zm9yICggbWF0Y2ggaW4gY29udGV4dCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXNbIG1hdGNoIF0oIGNvbnRleHRbIG1hdGNoIF0gKTtcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKCNpZClcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTtcblxuXHRcdFx0XHRcdGlmICggZWxlbSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3Rcblx0XHRcdFx0XHRcdHRoaXNbIDAgXSA9IGVsZW07XG5cdFx0XHRcdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcblx0XHRcdFx0cmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTtcblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXG5cdFx0XHQvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcilcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdC8vIEhBTkRMRTogJChET01FbGVtZW50KVxuXHRcdH0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xuXHRcdFx0dGhpc1sgMCBdID0gc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcblx0XHQvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHlcblx0XHR9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkge1xuXHRcdFx0cmV0dXJuIHJvb3QucmVhZHkgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHJvb3QucmVhZHkoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0c2VsZWN0b3IoIGpRdWVyeSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApO1xuXHR9O1xuXG4vLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uXG5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjtcblxuLy8gSW5pdGlhbGl6ZSBjZW50cmFsIHJlZmVyZW5jZVxucm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTtcblxuXG52YXIgcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sXG5cblx0Ly8gTWV0aG9kcyBndWFyYW50ZWVkIHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3RhcnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXRcblx0Z3VhcmFudGVlZFVuaXF1ZSA9IHtcblx0XHRjaGlsZHJlbjogdHJ1ZSxcblx0XHRjb250ZW50czogdHJ1ZSxcblx0XHRuZXh0OiB0cnVlLFxuXHRcdHByZXY6IHRydWVcblx0fTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRoYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdFx0dmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCwgdGhpcyApLFxuXHRcdFx0bCA9IHRhcmdldHMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHRoaXMsIHRhcmdldHNbIGkgXSApICkge1xuXHRcdFx0XHRcdHJldHVybi
46184B0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7XG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0bWF0Y2hlZCA9IFtdLFxuXHRcdFx0dGFyZ2V0cyA9IHR5cGVvZiBzZWxlY3RvcnMgIT09IFwic3RyaW5nXCIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTtcblxuXHRcdC8vIFBvc2l0aW9uYWwgc2VsZWN0b3JzIG5ldmVyIG1hdGNoLCBzaW5jZSB0aGVyZSdzIG5vIF9zZWxlY3Rpb25fIGNvbnRleHRcblx0XHRpZiAoICFybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9ycyApICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRmb3IgKCBjdXIgPSB0aGlzWyBpIF07IGN1ciAmJiBjdXIgIT09IGNvbnRleHQ7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXG5cdFx0XHRcdFx0Ly8gQWx3YXlzIHNraXAgZG9jdW1lbnQgZnJhZ21lbnRzXG5cdFx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPCAxMSAmJiAoIHRhcmdldHMgP1xuXHRcdFx0XHRcdFx0dGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IHBhc3Mgbm9uLWVsZW1lbnRzIHRvIFNpenpsZVxuXHRcdFx0XHRcdFx0Y3VyLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggY3VyLCBzZWxlY3RvcnMgKSApICkge1xuXG5cdFx0XHRcdFx0XHRtYXRjaGVkLnB1c2goIGN1ciApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApO1xuXHR9LFxuXG5cdC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4gdGhlIHNldFxuXHRpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudFxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7XG5cdFx0fVxuXG5cdFx0Ly8gSW5kZXggaW4gc2VsZWN0b3Jcblx0XHRpZiAoIHR5cGVvZiBlbGVtID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggalF1ZXJ5KCBlbGVtICksIHRoaXNbIDAgXSApO1xuXHRcdH1cblxuXHRcdC8vIExvY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudFxuXHRcdHJldHVybiBpbmRleE9mLmNhbGwoIHRoaXMsXG5cblx0XHRcdC8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZFxuXHRcdFx0ZWxlbS5qcXVlcnkgPyBlbGVtWyAwIF0gOiBlbGVtXG5cdFx0KTtcblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soXG5cdFx0XHRqUXVlcnkudW5pcXVlU29ydChcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCB0aGlzLmdldCgpLCBqUXVlcnkoIHNlbGVjdG9yLCBjb250ZXh0ICkgKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0sXG5cblx0YWRkQmFjazogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLmFkZCggc2VsZWN0b3IgPT0gbnVsbCA/XG5cdFx0XHR0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZPYmplY3QuZmlsdGVyKCBzZWxlY3RvciApXG5cdFx0KTtcblx0fVxufSApO1xuXG5mdW5jdGlvbiBzaWJsaW5nKCBjdXIsIGRpciApIHtcblx0d2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fVxuXHRyZXR1cm4gY3VyO1xufVxuXG5qUXVlcnkuZWFjaCgge1xuXHRwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0cmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDtcblx0fSxcblx0cGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIgKTtcblx0fSxcblx0cGFyZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIsIHVudGlsICk7XG5cdH0sXG5cdG5leHQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZX
46184Zpb3VzU2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRzaWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmdzKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTtcblx0fSxcblx0Y2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7XG5cdH0sXG5cdGNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcbiAgICAgICAgaWYgKCBub2RlTmFtZSggZWxlbSwgXCJpZnJhbWVcIiApICkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW0uY29udGVudERvY3VtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHksIGlPUyA3IG9ubHksIEFuZHJvaWQgQnJvd3NlciA8PTQuMyBvbmx5XG4gICAgICAgIC8vIFRyZWF0IHRoZSB0ZW1wbGF0ZSBlbGVtZW50IGFzIGEgcmVndWxhciBvbmUgaW4gYnJvd3NlcnMgdGhhdFxuICAgICAgICAvLyBkb24ndCBzdXBwb3J0IGl0LlxuICAgICAgICBpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRlbXBsYXRlXCIgKSApIHtcbiAgICAgICAgICAgIGVsZW0gPSBlbGVtLmNvbnRlbnQgfHwgZWxlbTtcbiAgICAgICAgfVxuXG4gICAgICAgI
vendor: 12,571 bytes, line 46184
46184HJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBlbGVtLmNoaWxkTm9kZXMgKTtcblx0fVxufSwgZnVuY3Rpb24oIG5hbWUsIGZuICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7XG5cdFx0dmFyIG1hdGNoZWQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTtcblxuXHRcdGlmICggbmFtZS5zbGljZSggLTUgKSAhPT0gXCJVbnRpbFwiICkge1xuXHRcdFx0c2VsZWN0b3IgPSB1bnRpbDtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdG1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgZHVwbGljYXRlc1xuXHRcdFx0aWYgKCAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdICkge1xuXHRcdFx0XHRqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlc1xuXHRcdFx0aWYgKCBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkge1xuXHRcdFx0XHRtYXRjaGVkLnJldmVyc2UoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQgKTtcblx0fTtcbn0gKTtcbnZhciBybm90aHRtbHdoaXRlID0gKCAvW15cXHgyMFxcdFxcclxcblxcZl0rL2cgKTtcblxuXG5cbi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzXG5mdW5jdGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkge1xuXHR2YXIgb2JqZWN0ID0ge307XG5cdGpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10sIGZ1bmN0aW9uKCBfLCBmbGFnICkge1xuXHRcdG9iamVjdFsgZmxhZyBdID0gdHJ1ZTtcblx0fSApO1xuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG4vKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6XG4gKlxuICpcdG9wdGlvbnM6IGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlvbnMgdGhhdCB3aWxsIGNoYW5nZSBob3dcbiAqXHRcdFx0dGhlIGNhbGxiYWNrIGxpc3QgYmVoYXZlcyBvciBhIG1vcmUgdHJhZGl0aW9uYWwgb3B0aW9uIG9iamVjdFxuICpcbiAqIEJ5IGRlZmF1bHQgYSBjYWxsYmFjayBsaXN0IHdpbGwgYWN0IGxpa2UgYW4gZXZlbnQgY2FsbGJhY2sgbGlzdCBhbmQgY2FuIGJlXG4gKiBcImZpcmVkXCIgbXVsdGlwbGUgdGltZXMuXG4gKlxuICogUG9zc2libGUgb3B0aW9uczpcbiAqXG4gKlx0b25jZTpcdFx0XHR3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdG1lbW9yeTpcdFx0XHR3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkXG4gKlx0XHRcdFx0XHRhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCBcIm1lbW9yaXplZFwiXG4gKlx0XHRcdFx0XHR2YWx1ZXMgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0dW5pcXVlOlx0XHRcdHdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0KVxuICpcbiAqXHRzdG9wT25GYWxzZTpcdGludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZVxuICpcbiAqL1xualF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG5cdC8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWRcblx0Ly8gKHdlIGNoZWNrIGluIGNhY2hlIGZpcnN0KVxuXHRvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgP1xuXHRcdGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6XG5cdFx0alF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTtcblxuXHR2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZ1xuXHRcdGZpcmluZyxcblxuXHRcdC8vIExhc3QgZmlyZSB2YWx1ZSBmb3Igbm9uLWZvcmdldHRhYmxlIGxpc3RzXG5cdFx0bWVtb3J5LFxuXG5cdFx0Ly8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWRcblx0XHRmaXJlZCxcblxuXHRcdC8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmdcblx0XHRsb2NrZWQsXG5cblx0XHQvLyBBY3R1YWwgY2FsbGJhY2sgbGlzdFxuXHRcdGxpc3QgPSBbXSxcblxuXHRcdC8vIFF1ZXVlIG9mIGV4ZWN1dGlvbiBkYXRhIGZvciByZXBlYXRhYmxlIGxpc3RzXG5cdFx0cXVldWUgPSBbXSxcblxuXHRcdC8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKVxuXHRcdGZpcmluZ0luZGV4ID0gLTEsXG5cblx0XHQvLyBGaXJlIGNhbGxiYWNrc1xuXHRcdGZpcmUgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nXG5cdFx0XHRsb2NrZWQgPSBsb2NrZWQgfHwgb3B0aW9ucy5vbmNlO1xuXG5cdFx0XHQvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucyxcblx0XHRcdC8vIHJlc3BlY3RpbmcgZmlyaW5nSW5kZXggb3ZlcnJpZGVzIGFuZCBydW50aW1lIGNoYW5nZXNcblx0XHRcdGZpcmVkID0gZmlyaW5nID0gdHJ1ZTtcblx0XHRcdGZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkge1xuXHRcdFx0XHRtZW1vcnkgPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0XHR3aGlsZSAoICsrZmlyaW5nSW5kZXggPCBsaXN0Lmxlbmd0aCApIHtcblxuXHRcdFx0XHRcdC8vIFJ1biBjYWxsYmFjayBhbmQgY2hlY2sgZm9yIGVhcmx5IHRlcm1pbmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBtZW1vcnlbIDAgXSwgbWVtb3J5WyAxIF0gKSA9PT0gZmFsc2UgJiZcblx0XHRcdFx0XHRcdG9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEp1bXAgdG8gZW5kIGFuZCBmb3JnZXQgdGhlIGRhdGEgc28gLmFkZCBkb2Vzbid0IHJlLWZpcmVcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdFxuXHRcdFx0aWYgKCAhb3B0aW9ucy5tZW1vcnkgKSB7XG5cdFx0XHRcdG1lbW9yeSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRmaXJpbmcgPSBmYWxzZTtcblxuXHRcdFx0Ly8gQ2xlYW4gdXAgaWYgd2UncmUgZG9uZSBmaXJpbmcgZm9yIGdvb2Rcblx0XHRcdGlmICggbG9ja2VkICkge1xuXG5cdFx0XHRcdC8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHNcblx0XHRcdFx0aWYgKCBtZW1vcnkgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgdGhpcyBvYmplY3QgaXMgc3BlbnRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsaXN0ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdFxuXHRcdHNlbGYgPSB7XG5cblx0XHRcdC8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3Rcblx0XHRcdGFkZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblxuXHRcdFx0XHRcdC8vIElmIHdlIGhhdmUgbWVtb3J5IGZyb20gYSBwYXN0IHJ1biwgd2Ugc2hvdWxkIGZpcmUgYWZ0ZXIgYWRkaW5nXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0cXVldWUucHVzaCggbWVtb3J5ICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0KCBmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggYXJncywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoICFvcHRpb25zLnVuaXF1ZSB8fCAhc2VsZi5oYXMoIGFyZyApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0bGlzdC5wdXNoKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGFyZyAmJiBhcmcubGVuZ3RoICYmIHRvVHlwZSggYXJnICkgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5XG5cdFx0XHRcdFx0XHRcdFx0YWRkKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdH0gKSggYXJndW1lbnRzICk7XG5cblx0XHRcdFx0XHRpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhlIGxpc3Rcblx0XHRcdHJlbW92ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0dmFyIGluZGV4O1xuXHRcdFx0XHRcdHdoaWxlICggKCBpbmRleCA9IGpRdWVyeS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0bGlzdC5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHRcdFx0XHRcdC8vIEhhbmRsZSBmaXJpbmcgaW5kZXhlc1xuXHRcdFx0XHRcdFx0aWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHtcblx0XHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXgtLTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LlxuXHRcdFx0Ly8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuXG5cdFx0XHRoYXM6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0cmV0dXJuIGZuID9cblx0XHRcdFx0XHRqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDpcblx0XHRcdFx0XHRsaXN0Lmxlbmd0aCA+IDA7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0XG5cdFx0XHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblx0XHRcdFx0XHRsaXN0ID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlIGFuZCAuYWRkXG5cdFx0XHQvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnNcblx0XHRcdC8vIENsZWFyIGFsbCBjYWxsYmFja3MgYW5kIHZhbHVlc1xuXHRcdFx0ZGlzYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHRkaXNhYmxlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhbGlzdDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIERpc2FibGUgLmZpcmVcblx0XHRcdC8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpXG5cdFx0XHQvLyBBYm9ydCBhbnkgcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHRsb2NrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bG9ja2VkID0gcXVldWUgPSBbXTtcblx0XHRcdFx0aWYgKCAhbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IG1lbW9yeSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0bG9ja2VkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhbG9ja2VkO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkge1xuXHRcdFx0XHRpZiAoICFsb2NrZWQgKSB7XG5cdFx0XHRcdFx0YXJncyA9IGFyZ3MgfHwgW107XG5cdFx0XHRcdFx0YXJncyA9IFsgY29udGV4dCwgYXJncy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFyZ3MgXTtcblx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBhcmdzICk7XG5cdFx0XHRcdFx0aWYgKCAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzXG5cdFx0XHRmaXJlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0c2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gVG8ga25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlXG5cdFx0XHRmaXJlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWZpcmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0cmV0dXJuIHNlbGY7XG59O1xuXG5cbmZ1bmN0aW9uIElkZW50aXR5KCB2ICkge1xuXHRyZXR1cm4gdjtcbn1cbmZ1bmN0aW9uIFRocm93ZXIoIGV4ICkge1xuXHR0aHJvdyBleDtcbn1cblxuZnVuY3Rpb24gYWRvcHRWYWx1ZSggdmFsdWUsIHJlc29sdmUsIHJlamVjdCwgbm9WYWx1ZSApIHtcblx0dmFyIG1ldGhvZDtcblxuXHR0cnkge1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIHByb21pc2UgYXNwZWN0IGZpcnN0IHRvIHByaXZpbGVnZSBzeW5jaHJvbm91cyBiZWhhdmlvclxuXHRcdGlmICggdmFsdWUgJiYgaXNGdW5jdGlvbiggKCBtZXRob2QgPSB2YWx1ZS5wcm9taXNlICkgKSApIHtcblx0XHRcdG1ldGhvZC5jYWxsKCB2YWx1ZSApLmRvbmUoIHJlc29sdmUgKS5mYWlsKCByZWplY3QgKTtcblxuXHRcdC8vIE90aGVyIHRoZW5hYmxlc1xuXHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7XG5cdFx0XHRtZXRob2QuY2FsbCggdmFsdWUsIHJlc29sdmUsIHJlamVjdCApO1xuXG5cdFx0Ly8gT3RoZXIgbm9uLXRoZW5hYmxlc1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIENvbnRyb2wgYHJlc29sdmVgIGFyZ3VtZW50cyBieSBsZXR0aW5nIEFycmF5I3NsaWNlIGNhc3QgYm9vbGVhbiBgbm9WYWx1ZWAgdG8gaW50ZWdlcjpcblx0XHRcdC8vICogZmFsc2U6IFsgdmFsdWUgXS5zbGljZSggMCApID0+IHJlc29sdmUoIHZhbHVlIClcblx0XHRcdC8vICogdHJ1ZTogWyB2YWx1ZSBdLnNsaWNlKCAxICkgPT4gcmVzb2x2ZSgpXG5cdFx0XHRyZXNvbHZlLmFwcGx5KCB1bmRlZmluZWQsIFsgdmFsdWUgXS5zbGljZSggbm9WYWx1ZSApICk7XG5cdFx0fVxuXG5cdC8vIEZvciBQcm9taXNlcy9BKywgY29udmVydCBleGNlcHRpb25zIGludG8gcmVqZWN0aW9uc1xuXHQvLyBTaW5jZSBqUXVlcnkud2hlbiBkb2Vzbid0IHVud3JhcCB0aGVuYWJsZXMsIHdlIGNhbiBza2lwIHRoZSBleHRyYSBjaGVja3MgYXBwZWFyaW5nIGluXG5cdC8vIERlZmVycmVkI3RoZW4gdG8gY29uZGl0aW9uYWxseSBzdXBwcmVzcyByZWplY3Rpb24uXG5cdH0gY2F0Y2ggKCB2YWx1ZSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIG9ubHlcblx0XHQvLyBTdHJpY3QgbW9kZSBmdW5jdGlvbnMgaW52b2tlZCB3aXRob3V0IC5jYWxsLy5hcHBseSBnZXQgZ2xvYmFsLW9iamVjdCBjb250ZXh0XG5cdFx0cmVqZWN0LmFwcGx5KCB1bmRlZmluZWQsIFsgdmFsdWUgXSApO1xuXHR9XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHREZWZlcnJlZDogZnVuY3Rpb24oIGZ1bmMgKSB7XG5cdFx0dmFyIHR1cGxlcyA9IFtcblxuXHRcdFx0XHQvLyBhY3Rpb24sIGFkZCBsaXN0ZW5lciwgY2FsbGJhY2tzLFxuXHRcdFx0XHQvLyAuLi4gLnRoZW4gaGFuZGxlcnMsIGFyZ3VtZW50IGluZGV4LCBbZmluYWwgc3RhdGVdXG5cdFx0XHRcdFsgXCJub3RpZnlcIiwgXCJwcm9ncmVzc1wiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJtZW1vcnlcIiApLCAyIF0sXG5cdFx0XHRcdFsgXCJyZXNvbHZlXCIsIFwiZG9uZVwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgMCwgXCJyZXNvbHZlZFwiIF0sXG5cdFx0XHRcdFsgXCJyZWplY3RcIiwgXCJmYWlsXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLCAxLCBcInJlamVjdGVkXCIgXVxuXHRcdFx0XSxcblx0XHRcdHN0YXRlID0gXCJwZW5kaW5nXCIsXG5cdFx0XHRwcm9taXNlID0ge1xuXHRcdFx0XHRzdGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHN0YXRlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRhbHdheXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRcImNhdGNoXCI6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvbWlzZS50aGVuKCBudWxsLCBmbiApO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIEtlZXAgcGlwZSBmb3IgYmFjay1jb21wYXRcblx0XHRcdFx0cGlwZTogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkge1xuXHRcdFx0XHRcdHZhciBmbnMgPSBhcmd1bWVudHM7XG5cblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCBmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbigg
46184aSwgdHVwbGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gTWFwIHR1cGxlcyAocHJvZ3Jlc3MsIGRvbmUsIGZhaWwpIHRvIGFyZ3VtZW50cyAoZG9uZSwgZmFpbCwgcHJvZ3Jlc3MpXG5cdFx0XHRcdFx0XHRcdHZhciBmbiA9IGlzRnVuY3Rpb24oIGZuc1sgdHVwbGVbIDQgXSBdICkgJiYgZm5zWyB0dXBsZVsgNCBdIF07XG5cblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQucHJvZ3Jlc3MoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIubm90aWZ5IH0pXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLmRvbmUoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIucmVzb2x2ZSB9KVxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KVxuXHRcdFx0XHRcdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDEgXSBdKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQgPSBmbiAmJiBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCByZXR1cm5lZCAmJiBpc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC5wcm9taXNlKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXJbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmbiA/IFsgcmV0dXJuZWQgXSA6IGFyZ3VtZW50c1xuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdGZucyA9IG51bGw7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhlbjogZnVuY3Rpb24oIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBvblByb2dyZXNzICkge1xuXHRcdFx0XHRcdHZhciBtYXhEZXB0aCA9IDA7XG5cdFx0XHRcdFx0ZnVuY3Rpb24gcmVzb2x2ZSggZGVwdGgsIGRlZmVycmVkLCBoYW5kbGVyLCBzcGVjaWFsICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdGhhdCA9IHRoaXMsXG5cdFx0XHRcdFx0XHRcdFx0YXJncyA9IGFyZ3VtZW50cyxcblx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQsIHRoZW47XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy4zXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01OVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoIDwgbWF4RGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjFcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkID09PSBkZWZlcnJlZC5wcm9taXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoIFwiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uXCIgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbnMgMi4zLjMuMSwgMy41XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNzVcblx0XHRcdFx0XHRcdFx0XHRcdC8vIFJldHJpZXZlIGB0aGVuYCBvbmx5IG9uY2Vcblx0XHRcdFx0XHRcdFx0XHRcdHRoZW4gPSByZXR1cm5lZCAmJlxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBjaGVjayBvYmplY3RzIGFuZCBmdW5jdGlvbnMgZm9yIHRoZW5hYmlsaXR5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCggdHlwZW9mIHJldHVybmVkID09PSBcIm9iamVjdFwiIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dHlwZW9mIHJldHVybmVkID09PSBcImZ1bmN0aW9uXCIgKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC50aGVuO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgYSByZXR1cm5lZCB0aGVuYWJsZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCB0aGVuICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3BlY2lhbCBwcm9jZXNzb3JzIChub3RpZnkpIGp1c3Qgd2FpdCBmb3IgcmVzb2x1dGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHNwZWNpYWwgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhlbi5jYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIFRocm93ZXIsIHNwZWNpYWwgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gTm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGFsc28gaG9vayBpbnRvIHByb2dyZXNzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgZGlzcmVnYXJkIG9sZGVyIHJlc29sdXRpb24gdmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWF4RGVwdGgrKztcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoZW4uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtY
46184XhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBhbGwgb3RoZXIgcmV0dXJuZWQgdmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgc3Vic3RpdHV0ZSBoYW5kbGVycyBwYXNzIG9uIGNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggaGFuZGxlciAhPT0gSWRlbnRpdHkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhhdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gWyByZXR1cm5lZCBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gUHJvY2VzcyB0aGUgdmFsdWUocylcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmYXVsdCBwcm9jZXNzIGlzIHJlc29sdmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0KCBzcGVjaWFsIHx8IGRlZmVycmVkLnJlc29sdmVXaXRoICkoIHRoYXQsIGFyZ3MgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBub3JtYWwgcHJvY2Vzc29ycyAocmVzb2x2ZSkgY2F0Y2ggYW5kIHJlamVjdCBleGNlcHRpb25zXG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcyA9IHNwZWNpYWwgP1xuXHRcdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdyA6XG5cdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rKCBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzLnN0YWNrVHJhY2UgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuNC4xXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjFcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBJZ25vcmUgcG9zdC1yZXNvbHV0aW9uIGV4Y2VwdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoICsgMSA+PSBtYXhEZXB0aCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGhhbmRsZXIgIT09IFRocm93ZXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBbIGUgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMVxuXHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01N1xuXHRcdFx0XHRcdFx0XHQvLyBSZS1yZXNvbHZlIHByb21pc2VzIGltbWVkaWF0ZWx5IHRvIGRvZGdlIGZhbHNlIHJlamVjdGlvbiBmcm9tXG5cdFx0XHRcdFx0XHRcdC8vIHN1YnNlcXVlbnQgZXJyb3JzXG5cdFx0XHRcdFx0XHRcdGlmICggZGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcygpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ2FsbCBhbiBvcHRpb25hbCBob29rIHRvIHJlY29yZCB0aGUgc3RhY2ssIGluIGNhc2Ugb2YgZXhjZXB0aW9uXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc2luY2UgaXQncyBvdGhlcndpc2UgbG9zdCB3aGVuIGV4ZWN1dGlvbiBnb2VzIGFzeW5jXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZ2V0U3RhY2tIb29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5zdGFja1RyYWNl
vendor: 4,913 bytes, line 46184
46184ID0galF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggcHJvY2VzcyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoIGZ1bmN0aW9uKCBuZXdEZWZlciApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAwIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25Qcm9ncmVzcyA6XG5cdFx0XHRcdFx0XHRcdFx0XHRJZGVudGl0eSxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlci5ub3RpZnlXaXRoXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5hZGQoIC4uLiApXG5cdFx0XHRcdFx0XHR0dXBsZXNbIDEgXVsgMyBdLmFkZChcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShcblx0XHRcdFx0XHRcdFx0XHQwLFxuXHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyLFxuXHRcdFx0XHRcdFx0XHRcdGlzRnVuY3Rpb24oIG9uRnVsZmlsbGVkICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25GdWxmaWxsZWQgOlxuXHRcdFx0XHRcdFx0XHRcdFx0SWRlbnRpdHlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAyIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvblJlamVjdGVkICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25SZWplY3RlZCA6XG5cdFx0XHRcdFx0XHRcdFx0XHRUaHJvd2VyXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkXG5cdFx0XHRcdC8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3Rcblx0XHRcdFx0cHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqICE9IG51bGwgPyBqUXVlcnkuZXh0ZW5kKCBvYmosIHByb21pc2UgKSA6IHByb21pc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWZlcnJlZCA9IHt9O1xuXG5cdFx0Ly8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kc1xuXHRcdGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHtcblx0XHRcdHZhciBsaXN0ID0gdHVwbGVbIDIgXSxcblx0XHRcdFx0c3RhdGVTdHJpbmcgPSB0dXBsZVsgNSBdO1xuXG5cdFx0XHQvLyBwcm9taXNlLnByb2dyZXNzID0gbGlzdC5hZGRcblx0XHRcdC8vIHByb21pc2UuZG9uZSA9IGxpc3QuYWRkXG5cdFx0XHQvLyBwcm9taXNlLmZhaWwgPSBsaXN0LmFkZFxuXHRcdFx0cHJvbWlzZVsgdHVwbGVbIDEgXSBdID0gbGlzdC5hZGQ7XG5cblx0XHRcdC8vIEhhbmRsZSBzdGF0ZVxuXHRcdFx0aWYgKCBzdGF0ZVN0cmluZyApIHtcblx0XHRcdFx0bGlzdC5hZGQoXG5cdFx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHRcdC8vIHN0YXRlID0gXCJyZXNvbHZlZFwiIChpLmUuLCBmdWxmaWxsZWQpXG5cdFx0XHRcdFx0XHQvLyBzdGF0ZSA9IFwicmVqZWN0ZWRcIlxuXHRcdFx0XHRcdFx0c3RhdGUgPSBzdGF0ZVN0cmluZztcblx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfY2FsbGJhY2tzLmRpc2FibGVcblx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfY2FsbGJhY2tzLmRpc2FibGVcblx0XHRcdFx0XHR0dXBsZXNbIDMgLSBpIF1bIDIgXS5kaXNhYmxlLFxuXG5cdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuZGlzYWJsZVxuXHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5kaXNhYmxlXG5cdFx0XHRcdFx0dHVwbGVzWyAzIC0gaSBdWyAzIF0uZGlzYWJsZSxcblxuXHRcdFx0XHRcdC8vIHByb2dyZXNzX2NhbGxiYWNrcy5sb2NrXG5cdFx0XHRcdFx0dHVwbGVzWyAwIF1bIDIgXS5sb2NrLFxuXG5cdFx0XHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMubG9ja1xuXHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAzIF0ubG9ja1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlXG5cdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0bGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApO1xuXG5cdFx0XHQvLyBkZWZlcnJlZC5ub3RpZnkgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQubm90aWZ5V2l0aCguLi4pIH1cblx0XHRcdC8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9XG5cdFx0XHQvLyBkZWZlcnJlZC5yZWplY3QgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVqZWN0V2l0aCguLi4pIH1cblx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH07XG5cblx0XHRcdC8vIGRlZmVycmVkLm5vdGlmeVdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHQvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGhcblx0XHRcdC8vIGRlZmVycmVkLnJlamVjdFdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0gPSBsaXN0LmZpcmVXaXRoO1xuXHRcdH0gKTtcblxuXHRcdC8vIE1ha2UgdGhlIGRlZmVycmVkIGEgcHJvbWlzZVxuXHRcdHByb21pc2UucHJvbWlzZSggZGVmZXJyZWQgKTtcblxuXHRcdC8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnlcblx0XHRpZiAoIGZ1bmMgKSB7XG5cdFx0XHRmdW5jLmNhbGwoIGRlZmVycmVkLCBkZWZlcnJlZCApO1xuXHRcdH1cblxuXHRcdC8vIEFsbCBkb25lIVxuXHRcdHJldHVybiBkZWZlcnJlZDtcblx0fSxcblxuXHQvLyBEZWZlcnJlZCBoZWxwZXJcblx0d2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkge1xuXHRcdHZhclxuXG5cdFx0XHQvLyBjb3VudCBvZiB1bmNvbXBsZXRlZCBzdWJvcmRpbmF0ZXNcblx0XHRcdHJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cblx0XHRcdC8vIGNvdW50IG9mIHVucHJvY2Vzc2VkIGFyZ3VtZW50c1xuXHRcdFx0aSA9IHJlbWFpbmluZyxcblxuXHRcdFx0Ly8gc3Vib3JkaW5hdGUgZnVsZmlsbG1lbnQgZGF0YVxuXHRcdFx0cmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSxcblx0XHRcdHJlc29sdmVWYWx1ZXMgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSxcblxuXHRcdFx0Ly8gdGhlI
46184G1hc3RlciBEZWZlcnJlZFxuXHRcdFx0bWFzdGVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3Rvcnlcblx0XHRcdHVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7XG5cdFx0XHRcdFx0cmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlO1xuXHRcdFx0XHRcdGlmICggISggLS1yZW1haW5pbmcgKSApIHtcblx0XHRcdFx0XHRcdG1hc3Rlci5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdC8vIFNpbmdsZS0gYW5kIGVtcHR5IGFyZ3VtZW50cyBhcmUgYWRvcHRlZCBsaWtlIFByb21pc2UucmVzb2x2ZVxuXHRcdGlmICggcmVtYWluaW5nIDw9IDEgKSB7XG5cdFx0XHRhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgbWFzdGVyLmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIG1hc3Rlci5yZWplY3QsXG5cdFx0XHRcdCFyZW1haW5pbmcgKTtcblxuXHRcdFx0Ly8gVXNlIC50aGVuKCkgdG8gdW53cmFwIHNlY29uZGFyeSB0aGVuYWJsZXMgKGNmLiBnaC0zMDAwKVxuXHRcdFx0aWYgKCBtYXN0ZXIuc3RhdGUoKSA9PT0gXCJwZW5kaW5nXCIgfHxcblx0XHRcdFx0aXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIHJlc29sdmVWYWx1ZXNbIGkgXS50aGVuICkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG1hc3Rlci50aGVuKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gTXVsdGlwbGUgYXJndW1lbnRzIGFyZSBhZ2dyZWdhdGVkIGxpa2UgUHJvbWlzZS5hbGwgYXJyYXkgZWxlbWVudHNcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBtYXN0ZXIucmVqZWN0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hc3Rlci5wcm9taXNlKCk7XG5cdH1cbn0gKTtcblxuXG4vLyBUaGVzZSB1c3VhbGx5IGluZGljYXRlIGEgcHJvZ3JhbW1lciBtaXN0YWtlIGR1cmluZyBkZXZlbG9wbWVudCxcbi8vIHdhcm4gYWJvdXQgdGhlbSBBU0FQIHJhdGhlciB0aGFuIHN3YWxsb3dpbmcgdGhlbSBieSBkZWZhdWx0LlxudmFyIHJlcnJvck5hbWVzID0gL14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87XG5cbmpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rID0gZnVuY3Rpb24oIGVycm9yLCBzdGFjayApIHtcblxuXHQvLyBTdXBwb3J0OiBJRSA4IC0gOSBvbmx5XG5cdC8vIENvbnNvbGUgZXhpc3RzIHdoZW4gZGV2IHRvb2xzIGFyZSBvcGVuLCB3aGljaCBjYW4gaGFwcGVuIGF0IGFueSB0aW1lXG5cdGlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7XG5cdFx0d2luZG93LmNvbnNvbGUud2FybiggXCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiBcIiArIGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrLCBzdGFjayApO1xuXHR9XG59O1xuXG5cblxuXG5qUXVlcnkucmVhZHlFeGNlcHRpb24gPSBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHR0aHJvdyBlcnJvcjtcblx0fSApO1xufTtcblxuXG5cblxuLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5XG52YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cbmpRdWVyeS5mbi5yZWFkeSA9IGZ1bmN0aW9uKCBmbiApIHtcblxuXHRyZWFkeUxpc3Rcblx0XHQudGhlbiggZm4gKVxuXG5cdFx0Ly8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXBcblx0XHQvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2tcblx0XHQvLyByZWdpc3RyYXRpb24uXG5cdFx0LmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdFx0XHRqUXVlcnkucmVhZHlFeGNlcHRpb24oIGVycm9yICk7XG5cdFx0fSApO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuXG5cdGlzUmVhZHk6IGZhbHNlLFxuXG5cdC8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmVcblx0Ly8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODFcblx0cmVhZHlXYWl0OiAxLFxuXG5cdC8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHlcblx0cmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkge1xuXG5cdFx0Ly8gQWJvcnQgaWYgdGhlcmUgYXJlIHBlbmRpbmcgaG9sZHMgb3Igd2UncmUgYWxyZWFkeSByZWFkeVxuXHRcdGlmICggd2FpdCA9PT0gdHJ1ZSA/IC0talF1ZXJ5LnJlYWR5V2FpdCA6IGpRdWVyeS5pc1JlYWR5ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeVxuXHRcdGpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTtcblxuXHRcdC8vIElmIGEgbm9ybWFsIERPTSBSZWFkeSBldmVudCBmaXJlZCwgZGVjcmVtZW50LCBhbmQgd2FpdCBpZiBuZWVkIGJlXG5cdFx0aWYgKCB3YWl0ICE9PSB0cnVlICYmIC0talF1ZXJ5LnJlYWR5V2FpdCA+IDAgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZVxuXHRcdHJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkucmVhZHkudGhlbiA9IHJlYWR5TGlzdC50aGVuO1xuXG4vLyBUaGUgcmVhZHkgZXZlbnQgaGFuZGxlciBhbmQgc2VsZiBjbGVhbnVwIG1ldGhvZFxuZnVuY3Rpb24gY29tcGxldGVkKCkge1xuXHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG5cdGpRdWVyeS5yZWFkeSgpO1xufVxuXG4vLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZFxuLy8gYWZ0ZXIgdGhlIGJyb3dzZXIgZXZlbnQgaGFzIGFscmVhZHkgb2NjdXJyZWQuXG4vLyBTdXBwb3J0OiBJRSA8PTkgLSAxMCBvbmx5XG4vLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyBcImludGVyYWN0aXZlXCIgdG9vIHNvb25cbmlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiIHx8XG5cdCggZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gXCJsb2FkaW5nXCIgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCApICkge1xuXG5cdC8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeVxuXHR3aW5kb3cuc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5ICk7XG5cbn0gZWxzZSB7XG5cblx0Ly8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFja1xuXHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cblx0Ly8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmtcblx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIFwibG9h
46184ZFwiLCBjb21wbGV0ZWQgKTtcbn1cblxuXG5cblxuLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uXG4vLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb25cbnZhciBhY2Nlc3MgPSBmdW5jdGlvbiggZWxlbXMsIGZuLCBrZXksIHZhbHVlLCBjaGFpbmFibGUsIGVtcHR5R2V0LCByYXcgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSBlbGVtcy5sZW5ndGgsXG5cdFx0YnVsayA9IGtleSA9PSBudWxsO1xuXG5cdC8vIFNldHMgbWFueSB2YWx1ZXNcblx0aWYgKCB0b1R5cGUoIGtleSApID09PSBcIm9iamVjdFwiICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cdFx0Zm9yICggaSBpbiBrZXkgKSB7XG5cdFx0XHRhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTtcblx0XHR9XG5cblx0Ly8gU2V0cyBvbmUgdmFsdWVcblx0fSBlbHNlIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXG5cdFx0aWYgKCAhaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJhdyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCBidWxrICkge1xuXG5cdFx0XHQvLyBCdWxrIG9wZXJhdGlvbnMgcnVuIGFnYWluc3QgdGhlIGVudGlyZSBzZXRcblx0XHRcdGlmICggcmF3ICkge1xuXHRcdFx0XHRmbi5jYWxsKCBlbGVtcywgdmFsdWUgKTtcblx0XHRcdFx0Zm4gPSBudWxsO1xuXG5cdFx0XHQvLyAuLi5leGNlcHQgd2hlbiBleGVjdXRpbmcgZnVuY3Rpb24gdmFsdWVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidWxrID0gZm47XG5cdFx0XHRcdGZuID0gZnVuY3Rpb24oIGVsZW0sIGtleSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRmbihcblx0XHRcdFx0XHRlbGVtc1sgaSBdLCBrZXksIHJhdyA/XG5cdFx0XHRcdFx0dmFsdWUgOlxuXHRcdFx0XHRcdHZhbHVlLmNhbGwoIGVsZW1zWyBpIF0sIGksIGZuKCBlbGVtc1sgaSBdLCBrZXkgKSApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKCBjaGFpbmFibGUgKSB7XG5cdFx0cmV0dXJuIGVsZW1zO1xuXHR9XG5cblx0Ly8gR2V0c1xuXHRpZiAoIGJ1bGsgKSB7XG5cdFx0cmV0dXJuIGZuLmNhbGwoIGVsZW1zICk7XG5cdH1cblxuXHRyZXR1cm4gbGVuID8gZm4oIGVsZW1zWyAwIF0sIGtleSApIDogZW1wdHlHZXQ7XG59O1xuXG5cbi8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZ1xudmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sXG5cdHJkYXNoQWxwaGEgPSAvLShbYS16XSkvZztcblxuLy8gVXNlZCBieSBjYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXG5mdW5jdGlvbiBmY2FtZWxDYXNlKCBhbGwsIGxldHRlciApIHtcblx0cmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xufVxuXG4vLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzXG4vLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSwgRWRnZSAxMiAtIDE1XG4vLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpXG5mdW5jdGlvbiBjYW1lbENhc2UoIHN0cmluZyApIHtcblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsIFwibXMtXCIgKS5yZXBsYWNlKCByZGFzaEFscGhhLCBmY2FtZWxDYXNlICk7XG59XG52YXIgYWNjZXB0RGF0YSA9IGZ1bmN0aW9uKCBvd25lciApIHtcblxuXHQvLyBBY2NlcHRzIG9ubHk6XG5cdC8vICAtIE5vZGVcblx0Ly8gICAgLSBOb2RlLkVMRU1FTlRfTk9ERVxuXHQvLyAgICAtIE5vZGUuRE9DVU1FTlRfTk9ERVxuXHQvLyAgLSBPYmplY3Rcblx0Ly8gICAgLSBBbnlcblx0cmV0dXJuIG93bmVyLm5vZGVUeXBlID09PSAxIHx8IG93bmVyLm5vZGVUeXBlID09PSA5IHx8ICEoICtvd25lci5ub2RlVHlwZSApO1xufTtcblxuXG5cblxuZnVuY3Rpb24gRGF0YSgpIHtcblx0dGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrO1xufVxuXG5EYXRhLnVpZCA9IDE7XG5cbkRhdGEucHJvdG90eXBlID0ge1xuXG5cdGNhY2hlOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cblx0XHQvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGVcblx0XHR2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHQvLyBJZiBub3QsIGNyZWF0ZSBvbmVcblx0XHRpZiAoICF2YWx1ZSApIHtcblx0XHRcdHZhbHVlID0ge307XG5cblx0XHRcdC8vIFdlIGNhbiBhY2NlcHQgZGF0YSBmb3Igbm9uLWVsZW1lbnQgbm9kZXMgaW4gbW9kZXJuIGJyb3dzZXJzLFxuXHRcdFx0Ly8gYnV0IHdlIHNob3VsZCBub3QsIHNlZSAjODMzNS5cblx0XHRcdC8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LlxuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBvd25lciApICkge1xuXG5cdFx0XHRcdC8vIElmIGl0IGlzIGEgbm9kZSB1bmxpa2VseSB0byBiZSBzdHJpbmdpZnktZWQgb3IgbG9vcGVkIG92ZXJcblx0XHRcdFx0Ly8gdXNlIHBsYWluIGFzc2lnbm1lbnRcblx0XHRcdFx0aWYgKCBvd25lci5ub2RlVHlwZSApIHtcblx0XHRcdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB2YWx1ZTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2Ugc2VjdXJlIGl0IGluIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHlcblx0XHRcdFx0Ly8gY29uZmlndXJhYmxlIG11c3QgYmUgdHJ1ZSB0byBhbGxvdyB0aGUgcHJvcGVydHkgdG8gYmVcblx0XHRcdFx0Ly8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggb3duZXIsIHRoaXMuZXhwYW5kbywge1xuXHRcdFx0XHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7XG5cdFx0dmFyIHByb3AsXG5cdFx0XHRjYWNoZSA9IHRoaXMuY2FjaGUoIG93bmVyICk7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIGtleSwgdmFsdWUg
46184XSBhcmdzXG5cdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBkYXRhICkgXSA9IHZhbHVlO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3Ncblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb3B5IHRoZSBwcm9wZXJ0aWVzIG9uZS1ieS1vbmUgdG8gdGhlIGNhY2hlIG9iamVjdFxuXHRcdFx0Zm9yICggcHJvcCBpbiBkYXRhICkge1xuXHRcdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBwcm9wICkgXSA9IGRhdGFbIHByb3AgXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGNhY2hlO1xuXHR9LFxuXHRnZXQ6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzLmNhY2hlKCBvd25lciApIDpcblxuXHRcdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdICYmIG93bmVyWyB0aGlzLmV4cGFuZG8gXVsgY2FtZWxDYXNlKCBrZXkgKSBdO1xuXHR9LFxuXHRhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHtcblxuXHRcdC8vIEluIGNhc2VzIHdoZXJlIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gTm8ga2V5IHdhcyBzcGVjaWZpZWRcblx0XHQvLyAgIDIuIEEgc3RyaW5nIGtleSB3YXMgc3BlY2lmaWVkLCBidXQgbm8gdmFsdWUgcHJvdmlkZWRcblx0XHQvL1xuXHRcdC8vIFRha2UgdGhlIFwicmVhZFwiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZVxuXHRcdC8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3Rcblx0XHQvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5XG5cdFx0Ly9cblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdCggKCBrZXkgJiYgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiApICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2hlbiB0aGUga2V5IGlzIG5vdCBhIHN0cmluZywgb3IgYm90aCBhIGtleSBhbmQgdmFsdWVcblx0XHQvLyBhcmUgc3BlY2lmaWVkLCBzZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3RzKSB3aXRoIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gQW4gb2JqZWN0IG9mIHByb3BlcnRpZXNcblx0XHQvLyAgIDIuIEEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vXG5cdFx0dGhpcy5zZXQoIG93bmVyLCBrZXksIHZhbHVlICk7XG5cblx0XHQvLyBTaW5jZSB0aGUgXCJzZXRcIiBwYXRoIGNhbiBoYXZlIHR3byBwb3NzaWJsZSBlbnRyeSBwb2ludHNcblx0XHQvLyByZXR1cm4gdGhlIGV4cGVjdGVkIGRhdGEgYmFzZWQgb24gd2hpY2ggcGF0aCB3YXMgdGFrZW5bKl1cblx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5O1xuXHR9LFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHZhciBpLFxuXHRcdFx0Y2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHRpZiAoIGNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydCBhcnJheSBvciBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGtleXNcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHNldCBjYW1lbENhc2Uga2V5cywgc28gcmVtb3ZlIHRoYXQuXG5cdFx0XHRcdGtleSA9IGtleS5tYXAoIGNhbWVsQ2FzZSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0a2V5ID0gY2FtZWxDYXNlKCBrZXkgKTtcblxuXHRcdFx0XHQvLyBJZiBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzLCB1c2UgaXQuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlXG5cdFx0XHRcdGtleSA9IGtleSBpbiBjYWNoZSA/XG5cdFx0XHRcdFx0WyBrZXkgXSA6XG5cdFx0XHRcdFx0KCBrZXkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpID0ga2V5Lmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgdGhlcmUncyBubyBtb3JlIGRhdGFcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1XG5cdFx0XHQvLyBXZWJraXQgJiBCbGluayBwZXJmb3JtYW5jZSBzdWZmZXJzIHdoZW4gZGVsZXRpbmcgcHJvcGVydGllc1xuXHRcdFx0Ly8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZFxuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzc4NjA3IChidWcgcmVzdHJpY3RlZClcblx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRoYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cdFx0dmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdHJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTtcblx0fVxufTtcbnZhciBkYXRhUHJpdiA9IG5ldyBEYXRhKCk7XG5cbnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7XG5cblxuXG4vL1x0SW1wbGVtZW50YXRpb24gU3VtbWFyeVxuLy9cbi8vXHQxLiBFbmZvcmNlIEFQSSBzdXJmYWNlIGFuZCBzZW1hbnRpYyBjb21wYXRpYmlsaXR5IHdpdGggMS45LnggYnJhbmNoXG4vL1x0Mi4gSW1wcm92ZSB0aGUgbW9kdWxlJ3MgbWFpbnRhaW5hYmlsaXR5IGJ5IHJlZHVjaW5nIHRoZSBzdG9yYWdlXG4vL1x0XHRwYXRocyB0byBhIHNpbmdsZSBtZWNoYW5pc20uXG4vL1x0My4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBcInByaXZhdGVcIiBhbmQgXCJ1c2VyXCIgZGF0YS5cbi8vXHQ0LiBfTmV2ZXJfIGV4cG9zZSBcInByaXZhdGVcIiBkYXRhIHRvIHVzZXIgY29kZSAoVE9ETzogRHJvcCBfZGF0YSwgX3JlbW92ZURhdGEpXG4vL1x0NS4gQXZvaWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvb
46184iB1c2VyIG9iamVjdHMgKGVnLiBleHBhbmRvIHByb3BlcnRpZXMpXG4vL1x0Ni4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0XG5cbnZhciByYnJhY2UgPSAvXig/Olxce1tcXHdcXFddKlxcfXxcXFtbXFx3XFxXXSpcXF0pJC8sXG5cdHJtdWx0aURhc2ggPSAvW0EtWl0vZztcblxuZnVuY3Rpb24gZ2V0RGF0YSggZGF0YSApIHtcblx0aWYgKCBkYXRhID09PSBcInRydWVcIiApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJmYWxzZVwiICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJudWxsXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBPbmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHN0cmluZ1xuXHRpZiAoIGRhdGEgPT09ICtkYXRhICsgXCJcIiApIHtcblx0XHRyZXR1cm4gK2RhdGE7XG5cdH1cblxuXHRpZiAoIHJicmFjZS50ZXN0KCBkYXRhICkgKSB7XG5cdFx0cmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKTtcblx0fVxuXG5cdHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkge1xuXHR2YXIgbmFtZTtcblxuXHQvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55XG5cdC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZVxuXHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdG5hbWUgPSBcImRhdGEtXCIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJCZcIiApLnRvTG93ZXJDYXNlKCk7XG5cdFx0ZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGF0YSA9IGdldERhdGEoIGRhdGEgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge31cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyXG5cdFx0XHRkYXRhVXNlci5zZXQoIGVsZW0sIGtleSwgZGF0YSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZGF0YTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTtcblx0fSxcblxuXHRkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YVVzZXIucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH0sXG5cblx0Ly8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWRcblx0Ly8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YVByaXYgbWV0aG9kcywgdGhlc2UgY2FuIGJlIGRlcHJlY2F0ZWQuXG5cdF9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0X3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZGF0YTogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyIGksIG5hbWUsIGRhdGEsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0YXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlcztcblxuXHRcdC8vIEdldHMgYWxsIHZhbHVlc1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHRoaXMubGVuZ3RoICkge1xuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhUHJpdi5nZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIgKSApIHtcblx0XHRcdFx0XHRpID0gYXR0cnMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NClcblx0XHRcdFx0XHRcdGlmICggYXR0cnNbIGkgXSApIHtcblx0XHRcdFx0XHRcdFx0bmFtZSA9IGF0dHJzWyBpIF0ubmFtZTtcblx0XHRcdFx0XHRcdFx0aWYgKCBuYW1lLmluZGV4T2YoIFwiZGF0YS1cIiApID09PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdG5hbWUgPSBjYW1lbENhc2UoIG5hbWUuc2xpY2UoIDUgKSApO1xuXHRcdFx0XHRcdFx0XHRcdGRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9XG5cblx0XHQvLyBTZXRzIG11bHRpcGxlIHZhbHVlc1xuXHRcdGlmICggdHlwZW9mIGtleSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBkYXRhO1xuXG5cdFx0XHQvLyBUaGUgY2FsbGluZyBqUXVlcnkgb2JqZWN0IChlbGVtZW50IG1hdGNoZXMpIGlzIG5vdCBlbXB0eVxuXHRcdFx0Ly8gKGFuZCB0aGVyZWZvcmUgaGFzIGFuIGVsZW1lbnQgYXBwZWFycyBhdCB0aGlzWyAwIF0pIGFuZCB0aGVcblx0XHRcdC8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0XG5cdFx0XHQvLyB3aWxsIHJlc3VsdCBpbiBgdW5kZWZpbmVkYCBmb3IgZWxlbSA9IHRoaXNbIDAgXSB3aGljaCB3aWxsXG5cdFx0XHQvLyB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW4gYXR0ZW1wdCB0byByZWFkIGEgZGF0YSBjYWNoZSBpcyBtYWRlLlxuXHRcdFx0aWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZVxuXHRcdFx0XHQvLyBUaGUga2V5IHdpbGwgYWx3YXlzIGJlIGNhbWVsQ2FzZWQgaW4gRGF0YVxuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtLCBrZXkgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIFwiZGlzY292ZXJcIiB0aGUgZGF0YSBpblxuXHRcdFx0XHQvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzXG5cdFx0XHRcdGRhdGEgPSBkYXRhQXR0ciggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybi
46184BkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LlxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCB0aGUgZGF0YS4uLlxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBXZSBhbHdheXMgc3RvcmUgdGhlIGNhbWVsQ2FzZWQga2V5XG5cdFx0XHRcdGRhdGFVc2VyLnNldCggdGhpcywga2V5LCB2YWx1ZSApO1xuXHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApO1xuXHR9LFxuXG5cdHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBxdWV1ZTtcblxuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHR5cGUgPSAoIHR5cGUgfHwgXCJmeFwiICkgKyBcInF1ZXVlXCI7XG5cdFx0XHRxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHQvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwXG5cdFx0XHRpZiAoIGRhdGEgKSB7XG5cdFx0XHRcdGlmICggIXF1ZXVlIHx8IEFycmF5LmlzQXJyYXkoIGRhdGEgKSApIHtcblx0XHRcdFx0XHRxdWV1ZSA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSApICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cXVldWUucHVzaCggZGF0YSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcXVldWUgfHwgW107XG5cdFx0fVxuXHR9LFxuXG5cdGRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLFxuXHRcdFx0c3RhcnRMZW5ndGggPSBxdWV1ZS5sZW5ndGgsXG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCksXG5cdFx0XHRob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgdHlwZSApLFxuXHRcdFx0bmV4dCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApO1xuXHRcdFx0fTtcblxuXHRcdC8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWxcblx0XHRpZiAoIGZuID09PSBcImlucHJvZ3Jlc3NcIiApIHtcblx0XHRcdGZuID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdHN0YXJ0TGVuZ3RoLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblxuXHRcdFx0Ly8gQWRkIGEgcHJvZ3Jlc3Mgc2VudGluZWwgdG8gcHJldmVudCB0aGUgZnggcXVldWUgZnJvbSBiZWluZ1xuXHRcdFx0Ly8gYXV0b21hdGljYWxseSBkZXF1ZXVlZFxuXHRcdFx0aWYgKCB0eXBlID09PSBcImZ4XCIgKSB7XG5cdFx0XHRcdHF1ZXVlLnVuc2hpZnQoIFwiaW5wcm9ncmVzc1wiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb25cblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0Zm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTtcblx0XHR9XG5cblx0XHRpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHtcblx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmVcblx0X3F1ZXVlSG9va3M6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHZhciBrZXkgPSB0eXBlICsgXCJxdWV1ZUhvb2tzXCI7XG5cdFx0cmV0dXJuIGRhdGFQcml2LmdldCggZWxlbSwga2V5ICkgfHwgZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBrZXksIHtcblx0XHRcdGVtcHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKS5hZGQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArIFwicXVldWVcIiwga2V5IF0gKTtcblx0XHRcdH0gKVxuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHF1ZXVlOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgc2V0dGVyID0gMjtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRkYXRhID0gdHlwZTtcblx0XHRcdHR5cGUgPSBcImZ4XCI7XG5cdFx0XHRzZXR0ZXItLTtcblx0XHR9XG5cblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPCBzZXR0ZXIgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnF1ZXVlKCB0aGlzWyAwIF0sIHR5cGUgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdHRoaXMgOlxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBkYXRhICk7XG5cblx0XHRcdFx0Ly8gRW5zdXJlIGEgaG9va3MgZm9yIHRoaXMgcXVldWVcblx0XHRcdFx0alF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7XG5cblx0XHRcdFx0aWYgKCB0eXBlID09PSBcImZ4XCIgJiYgcXVldWVbIDAgXSAhPT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHR9LFxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0fSApO1xuXHR9LFxuXHRjbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSB8fCBcImZ4XCIsIFtdICk7XG5cdH0sXG5cblx0Ly8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZVxuXHQvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5cGUgYnkgZGVmYXVsdClcblx0cHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHtcblx0XHR2YXIgdG1wLFxuXHRcdFx0Y291bnQgPSAxLFxuXHRcdFx0ZGVmZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGVsZW1lbnRzID0gdGhpcyxcblx0XHRcdGkgPSB0aGlzLmxlbmd0aCxcblx0XHRcdHJlc29sdmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAhKCAtLWNvdW50ICkgKSB7XG5cdFx0XHRcdFx0ZGVmZXIucmVzb2x2ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRvYmogPSB0eXBlO1xuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0bXAgPSBkYXRhUHJpdi5nZXQoIGVsZW1lbnRzWyBpIF0sIHR5cGUgKyBcInF1ZXVlSG9va3NcIiApO1xuXHRcdFx0aWYgKCB0bXAgJiYgdG1wLmVtcHR5ICkge1xuXHRcdFx0XHRjb3VudCsrO1xuXHRcdFx0XHR0bXAuZW1wdHkuYWRkKCByZXNvbHZlICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJlc29sdmUoKTtcblx0XHRyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7XG5cdH1cbn0gKTtcbnZhciBwbnVtID0gKCAvWystXT8oPzpcXGQqXFwufClcXGQrKD86W2VFXVsrLV0/XFxkK3wpLyApLnNvdXJjZTtcblxudmFyIHJjc3NOdW0gPSBuZXcgUmVnRXhwKCBcIl4oPzooWystXSk9fCkoXCIgKyBwbnVtICsgXCIpKFthLXolXSopJFwiLCBcImlcIiApO1xuXG5cbnZhciBjc3NFeHBhbmQgPSBbIFwiVG9wXCIsIFwiUmlnaHRcIiwgXCJCb3R0b21cIiwgXCJMZWZ0XCIgXTtcblxudmFyIGlzSGlkZGVuV2l0aGluVHJlZSA9IGZ1bmN0aW9uKCBlbGVtLCBlbCApIHtcblxuXHRcdC8vIGlzSGlkZGVuV2l0aGluVHJlZSBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uO1xuXHRcdC8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudFxuXHRcdGVsZW0gPSBlbCB8fCBlbGVtO1xuXG5cdFx0Ly8gSW5saW5lIHN0eWxlIHRydW1wcyBhbGxcblx0XHRyZXR1cm4gZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIiB8fFxuXHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmXG5cblx0XHRcdC8vIE90aGVyd2lzZSwgY2hlY2sgY29tcHV0ZWQgc3R5bGVcblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MyAtIDQ1XG5cdFx0XHQvLyBEaXNjb25uZWN0ZWQgZWxlbWVudHMgY2FuIGhhdmUgY29tcHV0ZWQgZGlzcGxheTogbm9uZSwgc28gZmlyc3QgY29uZmlybSB0aGF0IGVsZW0gaXNcblx0XHRcdC8vIGluIHRoZSBkb2N1bWVudC5cblx0XHRcdGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgJiZcblxuXHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSA9PT0gXCJub25lXCI7XG5cdH07XG5cbnZhciBzd2FwID0gZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrLCBhcmdzICkge1xuXHR2YXIgcmV0LCBuYW1lLFxuXHRcdG9sZCA9IHt9O1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0b2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF0
461847XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdO1xuXHR9XG5cblx0cmV0ID0gY2FsbGJhY2suYXBwbHkoIGVsZW0sIGFyZ3MgfHwgW10gKTtcblxuXHQvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdO1xuXHR9XG5cblx0cmV0dXJuIHJldDtcbn07XG5cblxuXG5cbmZ1bmN0aW9uIGFkanVzdENTUyggZWxlbSwgcHJvcCwgdmFsdWVQYXJ0cywgdHdlZW4gKSB7XG5cdHZhciBhZGp1c3RlZCwgc2NhbGUsXG5cdFx0bWF4SXRlcmF0aW9ucyA9IDIwLFxuXHRcdGN1cnJlbnRWYWx1ZSA9IHR3ZWVuID9cblx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gdHdlZW4uY3VyKCk7XG5cdFx0XHR9IDpcblx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5LmNzcyggZWxlbSwgcHJvcCwgXCJcIiApO1xuXHRcdFx0fSxcblx0XHRpbml0aWFsID0gY3VycmVudFZhbHVlKCksXG5cdFx0dW5pdCA9IHZhbHVlUGFydHMgJiYgdmFsdWVQYXJ0c1sgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApLFxuXG5cdFx0Ly8gU3RhcnRpbmcgdmFsdWUgY29tcHV0YXRpb24gaXMgcmVxdWlyZWQgZm9yIHBvdGVudGlhbCB1bml0IG1pc21hdGNoZXNcblx0XHRpbml0aWFsSW5Vbml0ID0gKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gfHwgdW5pdCAhPT0gXCJweFwiICYmICtpbml0aWFsICkgJiZcblx0XHRcdHJjc3NOdW0uZXhlYyggalF1ZXJ5LmNzcyggZWxlbSwgcHJvcCApICk7XG5cblx0aWYgKCBpbml0aWFsSW5Vbml0ICYmIGluaXRpYWxJblVuaXRbIDMgXSAhPT0gdW5pdCApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD01NFxuXHRcdC8vIEhhbHZlIHRoZSBpdGVyYXRpb24gdGFyZ2V0IHZhbHVlIHRvIHByZXZlbnQgaW50ZXJmZXJlbmNlIGZyb20gQ1NTIHVwcGVyIGJvdW5kcyAoZ2gtMjE0NClcblx0XHRpbml0aWFsID0gaW5pdGlhbCAvIDI7XG5cblx0XHQvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzXG5cdFx0dW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdO1xuXG5cdFx0Ly8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnRcblx0XHRpbml0aWFsSW5Vbml0ID0gK2luaXRpYWwgfHwgMTtcblxuXHRcdHdoaWxlICggbWF4SXRlcmF0aW9ucy0tICkge1xuXG5cdFx0XHQvLyBFdmFsdWF0ZSBhbmQgdXBkYXRlIG91ciBiZXN0IGd1ZXNzIChkb3VibGluZyBndWVzc2VzIHRoYXQgemVybyBvdXQpLlxuXHRcdFx0Ly8gRmluaXNoIGlmIHRoZSBzY2FsZSBlcXVhbHMgb3IgY3Jvc3NlcyAxIChtYWtpbmcgdGhlIG9sZCpuZXcgcHJvZHVjdCBub24tcG9zaXRpdmUpLlxuXHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApO1xuXHRcdFx0aWYgKCAoIDEgLSBzY2FsZSApICogKCAxIC0gKCBzY2FsZSA9IGN1cnJlbnRWYWx1ZSgpIC8gaW5pdGlhbCB8fCAwLjUgKSApIDw9IDAgKSB7XG5cdFx0XHRcdG1heEl0ZXJhdGlvbnMgPSAwO1xuXHRcdFx0fVxuXHRcdFx0aW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgLyBzY2FsZTtcblxuXHRcdH1cblxuXHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0ICogMjtcblx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIGluaXRpYWxJblVuaXQgKyB1bml0ICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgd2UgdXBkYXRlIHRoZSB0d2VlbiBwcm9wZXJ0aWVzIGxhdGVyIG9uXG5cdFx0dmFsdWVQYXJ0cyA9IHZhbHVlUGFydHMgfHwgW107XG5cdH1cblxuXHRpZiAoIHZhbHVlUGFydHMgKSB7XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsSW5Vbml0IHx8ICtpbml0aWFsIHx8IDA7XG5cblx0XHQvLyBBcHBseSByZWxhdGl2ZSBvZmZzZXQgKCs9Ly09KSBpZiBzcGVjaWZpZWRcblx0XHRhZGp1c3RlZCA9IHZhbHVlUGFydHNbIDEgXSA/XG5cdFx0XHRpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOlxuXHRcdFx0K3ZhbHVlUGFydHNbIDIgXTtcblx0XHRpZiAoIHR3ZWVuICkge1xuXHRcdFx0dHdlZW4udW5pdCA9IHVuaXQ7XG5cdFx0XHR0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7XG5cdFx0XHR0d2Vlbi5lbmQgPSBhZGp1c3RlZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFkanVzdGVkO1xufVxuXG5cbnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApIHtcblx0dmFyIHRlbXAsXG5cdFx0ZG9jID0gZWxlbS5vd25lckRvY3VtZW50LFxuXHRcdG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSxcblx0XHRkaXNwbGF5ID0gZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF07XG5cblx0aWYgKCBkaXNwbGF5ICkge1xuXHRcdHJldHVybiBkaXNwbGF5O1xuXHR9XG5cblx0dGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApO1xuXHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggdGVtcCwgXCJkaXNwbGF5XCIgKTtcblxuXHR0ZW1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRlbXAgKTtcblxuXHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdGRpc3BsYXkgPSBcImJsb2NrXCI7XG5cdH1cblx0ZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5O1xuXG5cdHJldHVybiBkaXNwbGF5O1xufVxuXG5mdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7XG5cdHZhciBkaXNwbGF5LCBlbGVtLFxuXHRcdHZhbHVlcyA9IFtdLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cblx0Ly8gRGV0ZXJtaW5lIG5ldyBkaXNwbGF5IHZhbHVlIGZvciBlbGVtZW50cyB0aGF0IG5lZWQgdG8gY2hhbmdlXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdO1xuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5O1xuXHRcdGlmICggc2hvdyApIHtcblxuXHRcdFx0Ly8gU2luY2Ugd2UgZm9yY2UgdmlzaWJpbGl0eSB1cG9uIGNhc2NhZGUtaGlkZGVuIGVsZW1lbnRzLCBhbiBpbW1lZGlhdGUgKGFuZCBzbG93KVxuXHRcdFx0Ly8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyXG5cdFx0XHQvLyBpbmxpbmUgb3IgYWJvdXQtdG8tYmUtcmVzdG9yZWQpXG5cdFx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4I
46184F0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sIFwiZGlzcGxheVwiICkgfHwgbnVsbDtcblx0XHRcdFx0aWYgKCAhdmFsdWVzWyBpbmRleCBdICkge1xuXHRcdFx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICggZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIGRpc3BsYXkgIT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBcIm5vbmVcIjtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB3aGF0IHdlJ3JlIG92ZXJ3cml0aW5nXG5cdFx0XHRcdGRhdGFQcml2LnNldCggZWxlbSwgXCJkaXNwbGF5XCIsIGRpc3BsYXkgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AgdG8gYXZvaWQgY29uc3RhbnQgcmVmbG93XG5cdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCB2YWx1ZXNbIGluZGV4IF0gIT0gbnVsbCApIHtcblx0XHRcdGVsZW1lbnRzWyBpbmRleCBdLnN0eWxlLmRpc3BsYXkgPSB2YWx1ZXNbIGluZGV4IF07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRzO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApO1xuXHR9LFxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMgKTtcblx0fSxcblx0dG9nZ2xlOiBmdW5jdGlvbiggc3RhdGUgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggaXNIaWRkZW5XaXRoaW5UcmVlKCB0aGlzICkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnNob3coKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcbnZhciByY2hlY2thYmxlVHlwZSA9ICggL14oPzpjaGVja2JveHxyYWRpbykkL2kgKTtcblxudmFyIHJ0YWdOYW1lID0gKCAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSspL2kgKTtcblxudmFyIHJzY3JpcHRUeXBlID0gKCAvXiR8Xm1vZHVsZSR8XFwvKD86amF2YXxlY21hKXNjcmlwdC9pICk7XG5cblxuXG4vLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKVxudmFyIHdyYXBNYXAgPSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0b3B0aW9uOiBbIDEsIFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLCBcIjwvc2VsZWN0PlwiIF0sXG5cblx0Ly8gWEhUTUwgcGFyc2VycyBkbyBub3QgbWFnaWNhbGx5IGluc2VydCBlbGVtZW50cyBpbiB0aGVcblx0Ly8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlblxuXHQvLyB0aGlzIGJ5IG9taXR0aW5nIDx0Ym9keT4gb3Igb3RoZXIgcmVxdWlyZWQgZWxlbWVudHMuXG5cdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxud3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cblxuZnVuY3Rpb24gZ2V0QWxsKCBjb250ZXh0LCB0YWcgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHQvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpXG5cdHZhciByZXQ7XG5cblx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRyZXQgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgfHwgXCIqXCIgKTtcblxuXHR9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdHJldCA9IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnIHx8IFwiKlwiICk7XG5cblx0fSBlbHNlIHtcblx0XHRyZXQgPSBbXTtcblx0fVxuXG5cdGlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufVxuXG5cbi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZFxuZnVuY3Rpb24gc2V0R2xvYmFsRXZhbCggZWxlbXMsIHJlZkVsZW1lbnRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZGF0YVByaXYuc2V0KFxuXHRcdFx0ZWxlbXNbIGkgXSxcblx0XHRcdFwiZ2xvYmFsRXZhbFwiLFxuXHRcdFx0IXJlZkVsZW1lbnRzIHx8IGRhdGFQcml2LmdldCggcmVmRWxlbWVudHNbIGkgXSwgXCJnbG9iYWxFdmFsXCIgKVxuXHRcdCk7XG5cdH1cbn1cblxuXG52YXIgcmh0bWwgPSAvPHwmIz9cXHcrOy87XG5cbmZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoIGVsZW1zLCBjb250ZXh0LCBzY3JpcHRzLCBzZWxlY3Rpb24sIGlnbm9yZWQgKSB7XG5cdHZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgY29udGFpbnMsIGosXG5cdFx0ZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRub2RlcyA9IFtdLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGVsZW0gPSBlbGVtc1sgaSBdO1xuXG5cdFx0aWYgKCBlbGVtIHx8IGVsZW0gPT09IDAgKSB7XG5cblx0XHRcdC8vIEFkZCBub2RlcyBkaXJlY3RseVxuXHRcdFx0aWYgKCB0b1R5cGUoIGVsZW0gKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0gOiBlbGVtICk7XG5cblx0XHRcdC8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZVxuXHRcdFx0fSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHtcblx0XHRcdFx0bm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7XG5cblx0XHRcdC8vIENvbnZlcnQgaHRtbCBpbnRvIERPTSBub2Rlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dG1wID0gdG1wIHx8IGZyYWdtZW50LmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXG5cdFx0XHRcdC8vIERlc2VyaWFsaXplIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb25cblx0XHRcdFx0dGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0O
461841xuXHRcdFx0XHR0bXAuaW5uZXJIVE1MID0gd3JhcFsgMSBdICsgalF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIGVsZW0gKSArIHdyYXBbIDIgXTtcblxuXHRcdFx0XHQvLyBEZXNjZW5kIHRocm91Z2ggd3JhcHBlcnMgdG8gdGhlIHJpZ2h0IGNvbnRlbnRcblx0XHRcdFx0aiA9IHdyYXBbIDAgXTtcblx0XHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdFx0dG1wID0gdG1wLmxhc3RDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXJcblx0XHRcdFx0dG1wID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdFx0XHQvLyBFbnN1cmUgdGhlIGNyZWF0ZWQgbm9kZXMgYXJlIG9ycGhhbmVkICgjMTIzOTIpXG5cdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudFxuXHRmcmFnbWVudC50ZXh0Q29udGVudCA9IFwiXCI7XG5cblx0aSA9IDA7XG5cdHdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7XG5cblx0XHQvLyBTa2lwIGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgY29sbGVjdGlvbiAodHJhYy00MDg3KVxuXHRcdGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBzZWxlY3Rpb24gKSA+IC0xICkge1xuXHRcdFx0aWYgKCBpZ25vcmVkICkge1xuXHRcdFx0XHRpZ25vcmVkLnB1c2goIGVsZW0gKTtcblx0XHRcdH1cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnRhaW5zID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdC8vIEFwcGVuZCB0byBmcmFnbWVudFxuXHRcdHRtcCA9IGdldEFsbCggZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgXCJzY3JpcHRcIiApO1xuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGlmICggY29udGFpbnMgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCB0bXAgKTtcblx0XHR9XG5cblx0XHQvLyBDYXB0dXJlIGV4ZWN1dGFibGVzXG5cdFx0aWYgKCBzY3JpcHRzICkge1xuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHtcblx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgfHwgXCJcIiApICkge1xuXHRcdFx0XHRcdHNjcmlwdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZyYWdtZW50O1xufVxuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICksXG5cdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5XG5cdC8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICgjMTQ5MDEpXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwicmFkaW9cIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwiY2hlY2tlZFwiLCBcImNoZWNrZWRcIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcInRcIiApO1xuXG5cdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4xIG9ubHlcblx0Ly8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzXG5cdHN1cHBvcnQuY2hlY2tDbG9uZSA9IGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTWFrZSBzdXJlIHRleHRhcmVhIChhbmQgY2hlY2tib3gpIGRlZmF1bHRWYWx1ZSBpcyBwcm9wZXJseSBjbG9uZWRcblx0ZGl2LmlubmVySFRNTCA9IFwiPHRleHRhcmVhPng8L3RleHRhcmVhPlwiO1xuXHRzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTtcbn0gKSgpO1xudmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuXG5cbnZhclxuXHRya2V5RXZlbnQgPSAvXmtleS8sXG5cdHJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxwb2ludGVyfGNvbn
46184RleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLFxuXHRydHlwZW5hbWVzcGFjZSA9IC9eKFteLl0qKSg/OlxcLiguKyl8KS87XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcblx0cmV0dXJuIGZhbHNlO1xufVxuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gU2VlICMxMzM5MyBmb3IgbW9yZSBpbmZvXG5mdW5jdGlvbiBzYWZlQWN0aXZlRWxlbWVudCgpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblx0fSBjYXRjaCAoIGVyciApIHsgfVxufVxuXG5mdW5jdGlvbiBvbiggZWxlbSwgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgb25lICkge1xuXHR2YXIgb3JpZ0ZuLCB0eXBlO1xuXG5cdC8vIFR5cGVzIGNhbiBiZSBhIG1hcCBvZiB0eXBlcy9oYW5kbGVyc1xuXHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMtT2JqZWN0LCBkYXRhIClcblx0XHRcdGRhdGEgPSBkYXRhIHx8IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRvbiggZWxlbSwgdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7XG5cblx0XHQvLyAoIHR5cGVzLCBmbiApXG5cdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRkYXRhID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMsIHNlbGVjdG9yLCBmbiApXG5cdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vICggdHlwZXMsIGRhdGEsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHR9IGVsc2UgaWYgKCAhZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW07XG5cdH1cblxuXHRpZiAoIG9uZSA9PT0gMSApIHtcblx0XHRvcmlnRm4gPSBmbjtcblx0XHRmbiA9IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0Ly8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvXG5cdFx0XHRqUXVlcnkoKS5vZmYoIGV2ZW50ICk7XG5cdFx0XHRyZXR1cm4gb3JpZ0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9O1xuXG5cdFx0Ly8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm5cblx0XHRmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTtcblx0fVxuXHRyZXR1cm4gZWxlbS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7XG5cdH0gKTtcbn1cblxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGV2ZW50cyAtLSBub3QgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS5cbiAqIFByb3BzIHRvIERlYW4gRWR3YXJkcycgYWRkRXZlbnQgbGlicmFyeSBmb3IgbWFueSBvZiB0aGUgaWRlYXMuXG4gKi9cbmpRdWVyeS5ldmVudCA9IHtcblxuXHRnbG9iYWw6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhLCBzZWxlY3RvciApIHtcblxuXHRcdHZhciBoYW5kbGVPYmpJbiwgZXZlbnRIYW5kbGUsIHRtcCxcblx0XHRcdGV2ZW50cywgdCwgaGFuZGxlT2JqLFxuXHRcdFx0c3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdC8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpXG5cdFx0aWYgKCAhZWxlbURhdGEgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyXG5cdFx0aWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7XG5cdFx0XHRoYW5kbGVPYmpJbiA9IGhhbmRsZXI7XG5cdFx0XHRoYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFuZGxlcjtcblx0XHRcdHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7XG5cdFx0fVxuXG5cdFx0Ly8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZVxuXHRcdC8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KVxuXHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGRvY3VtZW50RWxlbWVudCwgc2VsZWN0b3IgKTtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXJcblx0XHRpZiAoICFoYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRoYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrO1xuXHRcdH1cblxuXHRcdC8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUgYW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3Rcblx0XHRpZiAoICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0ZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzID0ge307XG5cdFx0fVxuXHRcdGlmICggISggZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgKSApIHtcblx0XHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XG5cblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcblx0XHRcdFx0Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgP1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2Vcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx
461845IGhhbmRsZXJzXG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlXG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cblx0XHRcdC8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVyc1xuXHRcdFx0aGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRvcmlnVHlwZTogb3JpZ1R5cGUsXG5cdFx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRcdGhhbmRsZXI6IGhhbmRsZXIsXG5cdFx0XHRcdGd1aWQ6IGhhbmRsZXIuZ3VpZCxcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxuXHRcdFx0XHRuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLFxuXHRcdFx0XHRuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKVxuXHRcdFx0fSwgaGFuZGxlT2JqSW4gKTtcblxuXHRcdFx0Ly8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3Rcblx0XHRcdGlmICggISggaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSApICkge1xuXHRcdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdID0gW107XG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xuXG5cdFx0XHRcdC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZVxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8XG5cdFx0XHRcdFx0c3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBldmVudEhhbmRsZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNwZWNpYWwuYWRkICkge1xuXHRcdFx0XHRzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblxuXHRcdFx0XHRpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkge1xuXHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnRcblx0XHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uXG5cdFx0XHRqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlO1xuXHRcdH1cblxuXHR9LFxuXG5cdC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZF
46184R5cGVzICkge1xuXG5cdFx0dmFyIGosIG9yaWdDb3VudCwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKSAmJiBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdGlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWRcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50XG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdO1xuXHRcdFx0dG1wID0gdG1wWyAyIF0gJiZcblx0XHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICk7XG5cblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcblx0XHRcdG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTtcblxuXHRcdFx0XHRpZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmXG5cdFx0XHRcdFx0KCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiZcblx0XHRcdFx0XHQoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmXG5cdFx0XHRcdFx0KCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fFxuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcblx0XHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGosIDEgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNwZWNpYWwucmVtb3ZlICkge1xuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3Rcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxuXHRcdFx0aWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fFxuXHRcdFx0XHRcdHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlbGV0ZSBldmVudHNbIHR5cGUgXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgZGF0YSBhbmQgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZFxuXHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkge1xuXHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBcImhhbmRsZSBldmVudHNcIiApO1xuXHRcdH1cblx0fSxcblxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkge1xuXG5cdFx0Ly8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0XG5cdFx0dmFyIGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggbmF0aXZlRXZlbnQgKTtcblxuXHRcdHZhciBpLCBqLCByZXQsIG1hdGNoZWQsIGhhbmRsZU9iaiwgaGFuZGxlclF1ZXVlLFxuXHRcdFx0YXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLFxuXHRcdFx0aGFuZGxlcnMgPSAoIGRhdGFQcml2LmdldCggdGhpcywgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9O1xuXG5cdFx0Ly8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnRcblx0XHRhcmdzWyAwIF0gPSBldmVudDtcblxuXHRcdGZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0YXJnc1sgaSBdID0gYXJndW1lbnRzWyBpIF07XG5cdFx0fVxuXG5cdFx0ZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzO1xuXG5cdFx0Ly8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZFxuXHRcdGlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJi
46184BzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBoYW5kbGVyc1xuXHRcdGhhbmRsZXJRdWV1ZSA9IGpRdWVyeS5ldmVudC5oYW5kbGVycy5jYWxsKCB0aGlzLCBldmVudCwgaGFuZGxlcnMgKTtcblxuXHRcdC8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2hlZC5lbGVtO1xuXG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBoYW5kbGVPYmogPSBtYXRjaGVkLmhhbmRsZXJzWyBqKysgXSApICYmXG5cdFx0XHRcdCFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXG5cdFx0XHRcdC8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2Uocylcblx0XHRcdFx0Ly8gYSBzdWJzZXQgb3IgZXF1YWwgdG8gdGhvc2UgaW4gdGhlIGJvdW5kIGV2ZW50IChib3RoIGNhbiBoYXZlIG5vIG5hbWVzcGFjZSkuXG5cdFx0XHRcdGlmICggIWV2ZW50LnJuYW1lc3BhY2UgfHwgZXZlbnQucm5hbWVzcGFjZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7XG5cblx0XHRcdFx0XHRldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7XG5cdFx0XHRcdFx0ZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhO1xuXG5cdFx0XHRcdFx0cmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fFxuXHRcdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIgKS5hcHBseSggbWF0Y2hlZC5lbGVtLCBhcmdzICk7XG5cblx0XHRcdFx0XHRpZiAoIHJldCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZVxuXHRcdGlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7XG5cdFx0XHRzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0aGFuZGxlcnM6IGZ1bmN0aW9uKCBldmVudCwgaGFuZGxlcnMgKSB7XG5cdFx0dmFyIGksIGhhbmRsZU9iaiwgc2VsLCBtYXRjaGVkSGFuZGxlcnMsIG1hdGNoZWRTZWxlY3RvcnMsXG5cdFx0XHRoYW5kbGVyUXVldWUgPSBbXSxcblx0XHRcdGRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LFxuXHRcdFx0Y3VyID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0Ly8gRmluZCBkZWxlZ2F0ZSBoYW5kbGVyc1xuXHRcdGlmICggZGVsZWdhdGVDb3VudCAmJlxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTlcblx0XHRcdC8vIEJsYWNrLWhvbGUgU1ZHIDx1c2U+IGluc3RhbmNlIHRyZWVzICh0cmFjLTEzMTgwKVxuXHRcdFx0Y3VyLm5vZGVUeXBlICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MlxuXHRcdFx0Ly8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKVxuXHRcdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnQtdHlwZS1jbGlja1xuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTEgb25seVxuXHRcdFx0Ly8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgXCJjbGlja3NcIiBvZiByYWRpbyBpbnB1dHMsIHdoaWNoIGNhbiBoYXZlIGBidXR0b25gIC0xIChnaC0yMzQzKVxuXHRcdFx0ISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGV2ZW50LmJ1dHRvbiA+PSAxICkgKSB7XG5cblx0XHRcdGZvciAoIDsgY3VyICE9PSB0aGlzOyBjdXIgPSBjdXIucGFyZW50Tm9kZSB8fCB0aGlzICkge1xuXG5cdFx0XHRcdC8vIERvbid0IGNoZWNrIG5vbi1lbGVtZW50cyAoIzEzMjA4KVxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NClcblx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPT09IDEgJiYgISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGN1ci5kaXNhYmxlZCA9PT0gdHJ1ZSApICkge1xuXHRcdFx0XHRcdG1hdGNoZWRIYW5kbGVycyA9IFtdO1xuXHRcdFx0XHRcdG1hdGNoZWRTZWxlY3RvcnMgPSB7fTtcblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHtcblx0XHRcdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzICgjMTMyMDMpXG5cdFx0XHRcdFx0XHRzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyBcIiBcIjtcblxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgP1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID4gLTEgOlxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggbWF0Y2hlZEhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKCB7IGVsZW06IGN1ciwgaGFuZGxlcnM6IG1hdGNoZWRIYW5kbGVycyB9ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVyc1xuXHRcdGN1ciA9IHRoaXM7XG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhhbmRsZXJRdWV1ZTtcblx0fSxcblxuXHRhZGRQcm9wOiBmdW5jdGlvbiggbmFtZSwgaG9vayApIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIGpRdWVyeS5FdmVudC5wcm90b3R5cGUsIG5hbW
46184UsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cblx0XHRcdGdldDogaXNGdW5jdGlvbiggaG9vayApID9cblx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gOlxuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFsgbmFtZSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0c2V0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgbmFtZSwge1xuXHRcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHdyaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGZpeDogZnVuY3Rpb24oIG9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0cmV0dXJuIG9yaWdpbmFsRXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gP1xuXHRcdFx0b3JpZ2luYWxFdmVudCA6XG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7XG5cdH0sXG5cblx0c3BlY2lhbDoge1xuXHRcdGxvYWQ6IHtcblxuXHRcdFx0Ly8gUHJldmVudCB0cmlnZ2VyZWQgaW1hZ2UubG9hZCBldmVudHMgZnJvbSBidWJibGluZyB0byB3aW5kb3cubG9hZFxuXHRcdFx0bm9CdWJibGU6IHRydWVcblx0XHR9LFxuXHRcdGZvY3VzOiB7XG5cblx0XHRcdC8vIEZpcmUgbmF0aXZlIGV2ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdFxuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggdGhpcyAhPT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmZvY3VzICkge1xuXHRcdFx0XHRcdHRoaXMuZm9jdXMoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNpblwiXG5cdFx0fSxcblx0XHRibHVyOiB7XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzID09PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuYmx1ciApIHtcblx0XHRcdFx0XHR0aGlzLmJsdXIoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNvdXRcIlxuXHRcdH0sXG5cdFx0Y2xpY2s6IHtcblxuXHRcdFx0Ly8gRm9yIGNoZWNrYm94LCBmaXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHRcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMudHlwZSA9PT0gXCJjaGVja2JveFwiICYmIHRoaXMuY2xpY2sgJiYgbm9kZU5hbWUoIHRoaXMsIFwiaW5wdXRcIiApICkge1xuXHRcdFx0XHRcdHRoaXMuY2xpY2soKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdC8vIEZvciBjcm9zcy1icm93c2VyIGNvbnNpc3RlbmN5LCBkb24ndCBmaXJlIG5hdGl2ZSAuY2xpY2soKSBvbiBsaW5rc1xuXHRcdFx0X2RlZmF1bHQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0cmV0dXJuIG5vZGVOYW1lKCBldmVudC50YXJnZXQsIFwiYVwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGJlZm9yZXVubG9hZDoge1xuXHRcdFx0cG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCAyMCtcblx0XHRcdFx0Ly8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LlxuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHtcblxuXHQvLyBUaGlzIFwiaWZcIiBpcyBuZWVkZWQgZm9yIHBsYWluIG9iamVjdHNcblx0aWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0ZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUgKTtcblx0fVxufTtcblxualF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7XG5cblx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkXG5cdGlmICggISggdGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVudCApICkge1xuXHRcdHJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBFdmVudCBvYmplY3Rcblx0aWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7XG5cdFx0dGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjO1xuXHRcdHRoaXMudHlwZSA9IHNyYy50eXBlO1xuXG5cdFx0Ly8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWRcblx0XHQvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8XG5cdFx0XHRcdHNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHlcblx0XHRcdFx0c3JjLnJldHVyblZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRyZXR1cm5UcnVlIDpcblx0XHRcdHJldHVybkZhbHNlO1xuXG5cdFx0Ly8gQ3JlYXRlIHRhcmdldCBwcm9wZXJ0aWVzXG5cdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDw9NiAtIDcgb25seVxuXHRcdC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpXG5cdFx0dGhpcy50YXJnZXQgPSAoIHNyYy50YXJnZXQgJiYgc3JjLnRhcmdldC5ub2RlVHlwZSA9PT0gMyApID9cblx0XHRcdHNyYy50YXJnZXQucGFyZW50Tm9kZSA6XG5cdFx0XHRzcmMudGFyZ2V0O1xuXG5cdFx0dGhpcy5jdXJyZW50VGFyZ2V0ID0gc3JjLmN1cnJlbnRUYXJnZXQ7XG5cdFx0dGhpcy5yZWxhdGVkVGFyZ2V0ID0gc3JjLnJlbGF0ZWRUYXJnZXQ7XG5cblx0Ly8gRXZlbnQgdHlwZVxuXHR9IGVsc2Uge1xuXHRcdHRoaXMudHlwZSA9IHNyYztcblx0fVxuXG5cdC8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0XG5cdGlmICggcHJvcHMgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTtcblx0fVxuXG5cdC8vIENyZWF0ZSBhIHRpbWVzdGFtcCBpZiBpbmNvbWluZyBldmVudCBkb2Vzbid0IGhhdmUgb25lXG5cdHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1l
46184U3RhbXAgfHwgRGF0ZS5ub3coKTtcblxuXHQvLyBNYXJrIGl0IGFzIGZpeGVkXG5cdHRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlO1xufTtcblxuLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sXG5qUXVlcnkuRXZlbnQucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LFxuXHRpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNlLFxuXHRpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNTaW11bGF0ZWQ6IGZhbHNlLFxuXG5cdHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdH1cblxuXHRcdHRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH1cbn07XG5cbi8vIEluY2x1ZGVzIGFsbCBjb21tb24gZXZlbnQgcHJvcHMgaW5jbHVkaW5nIEtleUV2ZW50IGFuZCBNb3VzZUV2ZW50IHNwZWNpZmljIHByb3BzXG5qUXVlcnkuZWFjaCgge1xuXHRhbHRLZXk6IHRydWUsXG5cdGJ1YmJsZXM6IHRydWUsXG5cdGNhbmNlbGFibG
46184U6IHRydWUsXG5cdGNoYW5nZWRUb3VjaGVzOiB0cnVlLFxuXHRjdHJsS2V5OiB0cnVlLFxuXHRkZXRhaWw6IHRydWUsXG5cdGV2ZW50UGhhc2U6IHRydWUsXG5cdG1ldGFLZXk6IHRydWUsXG5cdHBhZ2VYOiB0cnVlLFxuXHRwYWdlWTogdHJ1ZSxcblx0c2hpZnRLZXk6IHRydWUsXG5cdHZpZXc6IHRydWUsXG5cdFwiY2hhclwiOiB0cnVlLFxuXHRjaGFyQ29kZTogdHJ1ZSxcblx0a2V5OiB0cnVlLFxuXHRrZXlDb2RlOiB0cnVlLFxuXHRidXR0b246IHRydWUsXG5cdGJ1dHRvbnM6IHRydWUsXG5cdGNsaWVudFg6IHRydWUsXG5cdGNsaWVudFk6IHRydWUsXG5cdG9mZnNldFg6IHRydWUsXG5cdG9mZnNldFk6IHRydWUsXG5cdHBvaW50ZXJJZDogdHJ1ZSxcblx0cG9pbnRlclR5cGU6IHRydWUsXG5cdHNjcmVlblg6IHRydWUsXG5cdHNjcmVlblk6IHRydWUsXG5cdHRhcmdldFRvdWNoZXM6IHRydWUsXG5cdHRvRWxlbWVudDogdHJ1ZSxcblx0dG91Y2hlczogdHJ1ZSxcblxuXHR3aGljaDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciBidXR0b24gPSBldmVudC5idXR0b247XG5cblx0XHQvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHNcblx0XHRpZiAoIGV2ZW50LndoaWNoID09IG51bGwgJiYgcmtleUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHtcblx0XHRcdHJldHVybiBldmVudC5jaGFyQ29kZSAhPSBudWxsID8gZXZlbnQuY2hhckNvZGUgOiBldmVudC5rZXlDb2RlO1xuXHRcdH1cblxuXHRcdC8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHRcblx0XHRpZiAoICFldmVudC53aGljaCAmJiBidXR0b24gIT09IHVuZGVmaW5lZCAmJiBybW91c2VFdmVudC50ZXN0KCBldmVudC50eXBlICkgKSB7XG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDEgKSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDIgKSB7XG5cdFx0XHRcdHJldHVybiAzO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDQgKSB7XG5cdFx0XHRcdHJldHVybiAyO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZXZlbnQud2hpY2g7XG5cdH1cbn0sIGpRdWVyeS5ldmVudC5hZGRQcm9wICk7XG5cbi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrc1xuLy8gc28gdGhhdCBldmVudCBkZWxlZ2F0aW9uIHdvcmtzIGluIGpRdWVyeS5cbi8vIERvIHRoZSBzYW1lIGZvciBwb2ludGVyZW50ZXIvcG9pbnRlcmxlYXZlIGFuZCBwb2ludGVyb3Zlci9wb2ludGVyb3V0XG4vL1xuLy8gU3VwcG9ydDogU2FmYXJpIDcgb25seVxuLy8gU2FmYXJpIHNlbmRzIG1vdXNlZW50ZXIgdG9vIG9mdGVuOyBzZWU6XG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNThcbi8vIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGJ1ZyAoaXQgZXhpc3RlZCBpbiBvbGRlciBDaHJvbWUgdmVyc2lvbnMgYXMgd2VsbCkuXG5qUXVlcnkuZWFjaCgge1xuXHRtb3VzZWVudGVyOiBcIm1vdXNlb3ZlclwiLFxuXHRtb3VzZWxlYXZlOiBcIm1vdXNlb3V0XCIsXG5cdHBvaW50ZXJlbnRlcjogXCJwb2ludGVyb3ZlclwiLFxuXHRwb2ludGVybGVhdmU6IFwicG9pbnRlcm91dFwiXG59LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0ge1xuXHRcdGRlbGVnYXRlVHlwZTogZml4LFxuXHRcdGJpbmRUeXBlOiBmaXgsXG5cblx0XHRoYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciByZXQsXG5cdFx0XHRcdHRhcmdldCA9IHRoaXMsXG5cdFx0XHRcdHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LFxuXHRcdFx0XHRoYW5kbGVPYmogPSBldmVudC5oYW5kbGVPYmo7XG5cblx0XHRcdC8vIEZvciBtb3VzZWVudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYgcmVsYXRlZCBpcyBvdXRzaWRlIHRoZSB0YXJnZXQuXG5cdFx0XHQvLyBOQjogTm8gcmVsYXRlZFRhcmdldCBpZiB0aGUgbW91c2UgbGVmdC9lbnRlcmVkIHRoZSBicm93c2VyIHdpbmRvd1xuXHRcdFx0aWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkge1xuXHRcdFx0XHRldmVudC50eXBlID0gaGFuZGxlT2JqLm9yaWdUeXBlO1xuXHRcdFx0XHRyZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBmaXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0fTtcbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0b25lOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTtcblx0fSxcblx0b2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHtcblx0XHR2YXIgaGFuZGxlT2JqLCB0eXBlO1xuXHRcdGlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkge1xuXG5cdFx0XHQvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50XG5cdFx0XHRoYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7XG5cdFx0XHRqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKFxuXHRcdFx0XHRoYW5kbGVPYmoubmFtZXNwYWNlID9cblx0XHRcdFx0XHRoYW5kbGVPYmoub3JpZ1R5cGUgKyBcIi5cIiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOlxuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSxcblx0XHRcdFx0aGFuZGxlT2JqLnNlbGVjdG9yLFxuXHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdHJldHVybi
46184B0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdIClcblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRcdHRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzIFssIGZuXSApXG5cdFx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cblxudmFyXG5cblx0LyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuXG5cdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9pc3N1ZXMvMzIyOVxuXHRyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopW14+XSopXFwvPi9naSxcblxuXHQvKiBlc2xpbnQtZW5hYmxlICovXG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMCAtIDExLCBFZGdlIDEyIC0gMTMgb25seVxuXHQvLyBJbiBJRS9FZGdlIHVzaW5nIHJlZ2V4IGdyb3VwcyBoZXJlIGNhdXNlcyBzZXZlcmUgc2xvd2Rvd25zLlxuXHQvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyL1xuXHRybm9Jbm5lcmh0bWwgPSAvPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxcblxuXHQvLyBjaGVja2VkPVwiY2hlY2tlZFwiIG9yIGNoZWNrZWRcblx0cmNoZWNrZWQgPSAvY2hlY2tlZFxccyooPzpbXj1dfD1cXHMqLmNoZWNrZWQuKS9pLFxuXHRyY2xlYW5TY3JpcHQgPSAvXlxccyo8ISg/OlxcW0NEQVRBXFxbfC0tKXwoPzpcXF1cXF18LS0pPlxccyokL2c7XG5cbi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93c1xuZnVuY3Rpb24gbWFuaXB1bGF0aW9uVGFyZ2V0KCBlbGVtLCBjb250ZW50ICkge1xuXHRpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRhYmxlXCIgKSAmJlxuXHRcdG5vZGVOYW1lKCBjb250ZW50Lm5vZGVUeXBlICE9PSAxMSA/IGNvbnRlbnQgOiBjb250ZW50LmZpcnN0Q2hpbGQsIFwidHJcIiApICkge1xuXG5cdFx0cmV0dXJuIGpRdWVyeSggZWxlbSApLmNoaWxkcmVuKCBcInRib2R5XCIgKVsgMCBdIHx8IGVsZW07XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxuLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvblxuZnVuY3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSApIHtcblx0ZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggXCJ0eXBlXCIgKSAhPT0gbnVsbCApICsgXCIvXCIgKyBlbGVtLnR5cGU7XG5cdHJldHVybiBlbGVtO1xufVxuZnVuY3Rpb24gcmVzdG9yZVNjcmlwdCggZWxlbSApIHtcblx0aWYgKCAoIGVsZW0udHlwZSB8fCBcIlwiICkuc2xpY2UoIDAsIDUgKSA9PT0gXCJ0cnVlL1wiICkge1xuXHRcdGVsZW0udHlwZSA9IGVsZW0udHlwZS5zbGljZSggNSApO1xuXHR9IGVsc2Uge1xuXHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBcInR5cGVcIiApO1xuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmZ1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBpLCBsLCB0eXBlLCBwZGF0YU9sZCwgcGRhdGFDdXIsIHVkYXRhT2xkLCB1ZGF0YUN1ciwgZXZlbnRzO1xuXG5cdGlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLlxuXHRpZiAoIGRhdGFQcml2Lmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHBkYXRhT2xkID0gZGF0YVByaXYuYWNjZXNzKCBzcmMgKTtcblx0XHRwZGF0YUN1ciA9IGRhdGFQcml2LnNldCggZGVzdCwgcGRhdGFPbGQgKTtcblx0XHRldmVudHMgPSBwZGF0YU9sZC5ldmVudHM7XG5cblx0XHRpZiAoIGV2ZW50cyApIHtcblx0XHRcdGRlbGV0ZSBwZGF0YUN1ci5oYW5kbGU7XG5cdFx0XHRwZGF0YUN1ci5ldmVudHMgPSB7fTtcblxuXHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIDIuIENvcHkgdXNlciBkYXRhXG5cdGlmICggZGF0YVVzZXIuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0dWRhdGFPbGQgPSBkYXRhVXNlci5hY2Nlc3MoIHNyYyApO1xuXHRcdHVkYXRhQ3VyID0galF1ZXJ5LmV4dGVuZCgge30sIHVkYXRhT2xkICk7XG5cblx0XHRkYXRhVXNlci5zZXQoIGRlc3QsIHVkYXRhQ3VyICk7XG5cdH1cbn1cblxuLy8gRml4IElFIGJ1Z3MsIHNlZSBzdXBwb3J0IHRlc3RzXG5mdW5jdGlvbiBmaXhJbnB1dCggc3JjLCBkZXN0ICkge1xuXHR2YXIgbm9kZU5hbWUgPSBkZXN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0Ly8gRmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveCBvciByYWRpbyBidXR0b24uXG5cdGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiByY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkge1xuXHRcdGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkO1xuXG5cdC8vIEZhaWxzIHRvIHJldHVybi
46184B0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zXG5cdH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgfHwgbm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIiApIHtcblx0XHRkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7XG5cdH1cbn1cblxuZnVuY3Rpb24gZG9tTWFuaXAoIGNvbGxlY3Rpb24sIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICkge1xuXG5cdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0YXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTtcblxuXHR2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuXHRcdGlOb0Nsb25lID0gbCAtIDEsXG5cdFx0dmFsdWUgPSBhcmdzWyAwIF0sXG5cdFx0dmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHQvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXRcblx0aWYgKCB2YWx1ZUlzRnVuY3Rpb24gfHxcblx0XHRcdCggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzdXBwb3J0LmNoZWNrQ2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkge1xuXHRcdHJldHVybiBjb2xsZWN0aW9uLmVhY2goIGZ1bmN0aW9uKCBpbmRleCApIHtcblx0XHRcdHZhciBzZWxmID0gY29sbGVjdGlvbi5lcSggaW5kZXggKTtcblx0XHRcdGlmICggdmFsdWVJc0Z1bmN0aW9uICkge1xuXHRcdFx0XHRhcmdzWyAwIF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgc2VsZi5odG1sKCkgKTtcblx0XHRcdH1cblx0XHRcdGRvbU1hbmlwKCBzZWxmLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApO1xuXHRcdH0gKTtcblx0fVxuXG5cdGlmICggbCApIHtcblx0XHRmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApO1xuXHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRmcmFnbWVudCA9IGZpcnN0O1xuXHRcdH1cblxuXHRcdC8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFja1xuXHRcdGlmICggZmlyc3QgfHwgaWdub3JlZCApIHtcblx0XHRcdHNjcmlwdHMgPSBqUXVlcnkubWFwKCBnZXRBbGwoIGZyYWdtZW50LCBcInNjcmlwdFwiICksIGRpc2FibGVTY3JpcHQgKTtcblx0XHRcdGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDtcblxuXHRcdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbVxuXHRcdFx0Ly8gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwXG5cdFx0XHQvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAoIzgwNzApLlxuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRub2RlID0gZnJhZ21lbnQ7XG5cblx0XHRcdFx0aWYgKCBpICE9PSBpTm9DbG9uZSApIHtcblx0XHRcdFx0XHRub2RlID0galF1ZXJ5LmNsb25lKCBub2RlLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHQvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggc2NyaXB0cywgZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjYWxsYmFjay5jYWxsKCBjb2xsZWN0aW9uWyBpIF0sIG5vZGUsIGkgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXHRcdFx0XHRkb2MgPSBzY3JpcHRzWyBzY3JpcHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50O1xuXG5cdFx0XHRcdC8vIFJlZW5hYmxlIHNjcmlwdHNcblx0XHRcdFx0alF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApO1xuXG5cdFx0XHRcdC8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb25cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IHNjcmlwdHNbIGkgXTtcblx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCBcIlwiICkgJiZcblx0XHRcdFx0XHRcdCFkYXRhUHJpdi5hY2Nlc3MoIG5vZGUsIFwiZ2xvYmFsRXZhbFwiICkgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5jb250YWlucyggZG9jLCBub2RlICkgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggbm9kZS5zcmMgJiYgKCBub2RlLnR5cGUgfHwgXCJcIiApLnRvTG93ZXJDYXNlKCkgICE9PSBcIm1vZHVsZVwiICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5Ll9ldmFsVXJsICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5fZXZhbFVybCggbm9kZS5zcmMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0RE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsIFwiXCIgKSwgZG9jLCBub2RlICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSggZWxlbSwgc2VsZWN0b3IsIGtlZXBEYXRhICkge1xuXHR2YXIgbm9kZSxcblx0XHRub2RlcyA9IHNlbGVjdG9yID8galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIGVsZW0gKSA6IGVsZW0sXG5cdFx0aSA9IDA7XG5cblx0Zm9yICggOyAoIG5vZGUgPSBub2Rlc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdGlmICggIWtlZXBEYXRhICYmIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIG5vZGUgKSApO1xuXHRcdH1cblxuXHRcdGlmICggbm9kZS5wYXJlbnROb2RlICkge1xuXHRcdFx0aWYgKCBrZWVwRGF0YSAmJiBqUXVlcnkuY29udGFpbnMoIG5vZGUub3duZXJEb2N1bWVudCwgbm9kZSApICkge1xuXHRcdFx0XHRzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0fVxuXHRcdFx0bm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBub2RlICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0aHRtbFByZWZpbHRlcjogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0cmV0dXJuIGh0bWwucmVwbGFjZSggcnhodG1sVGFnLCBcIjwkMT48LyQyPlwiICk7XG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHR2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cyxcblx0XHRcdGNsb25lID0gZWxlbS5jbG9uZU5vZGUoIHRydWUgKSxcblx0XHRcdGluUGFnZSA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cblx0XHQvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXNcblx0XHRpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmXG5cdFx0XHRcdCFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gV2UgZXNjaGV3IFNpenpsZSBoZXJlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOiBodHRwczovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yXG5cdFx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7XG5cdFx0XHRzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zml4SW5wdXQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZVxuXHRcdGlmICggZGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRcdHNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7XG5cdFx0XHRcdGRlc3RFbGVtZW50cyA9IGRlc3RFbGVtZW50cyB8fCBnZXRBbGwoIGNsb25lICk7XG5cblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCBcInNjcmlwdFwiICk7XG5cdFx0aWYgKCBkZXN0RWxlbWVudHMubGVuZ3RoID4gMCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sIFwic2NyaXB0XCIgKSApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybi
46184B0aGUgY2xvbmVkIHNldFxuXHRcdHJldHVybiBjbG9uZTtcblx0fSxcblxuXHRjbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblx0XHR2YXIgZGF0YSwgZWxlbSwgdHlwZSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT09IHVuZGVmaW5lZDsgaSsrICkge1xuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0XHRcdGlmICggKCBkYXRhID0gZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdGZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggc3BlY2lhbFsgdHlwZSBdICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJoZWFkXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NStcblx0XHRcdFx0XHQvLyBBc3NpZ24gdW5kZWZpbmVkIGluc3RlYWQgb2YgdXNpbmcgZGVsZXRlLCBzZWUgRGF0YSNyZW1vdmVcblx0XHRcdFx0XHRlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IgKTtcblx0fSxcblxuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkudGV4dCggdGhpcyApIDpcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0YXBwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0cHJlcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YmVmb3JlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IHRoaXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2Rlc1xuXHRcdFx0XHRlbGVtLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7XG5cdFx0ZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6
46184IGRlZXBEYXRhQW5kRXZlbnRzO1xuXG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdGh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmlubmVySFRNTDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYmXG5cdFx0XHRcdCF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCkgXSApIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5odG1sUHJlZmlsdGVyKCB2YWx1ZSApO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXHRcdFx0XHRcdFx0XHRlbGVtLmlubmVySFRNTCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGVsZW0gPSAwO1xuXG5cdFx0XHRcdC8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZFxuXHRcdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTtcblx0XHRcdH1cblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaWdub3JlZCA9IFtdO1xuXG5cdFx0Ly8gTWFrZSB0aGUgY2hhbmdlcywgcmVwbGFjaW5nIGVhY2ggbm9uLWlnbm9yZWQgY29udGV4dCBlbGVtZW50IHdpdGggdGhlIG5ldyBjb250ZW50XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcblxuXHRcdFx0aWYgKCBqUXVlcnkuaW5BcnJheSggdGhpcywgaWdub3JlZCApIDwgMCApIHtcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTtcblx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnJlcGxhY2VDaGlsZCggZWxlbSwgdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uXG5cdFx0fSwgaWdub3JlZCApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCB7XG5cdGFwcGVuZFRvOiBcImFwcGVuZFwiLFxuXHRwcmVwZW5kVG86IFwicHJlcGVuZFwiLFxuXHRpbnNlcnRCZWZvcmU6IFwiYmVmb3JlXCIsXG5cdGluc2VydEFmdGVyOiBcImFmdGVyXCIsXG5cdHJlcGxhY2VBbGw6IFwicmVwbGFjZVdpdGhcIlxufSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgZWxlbXMsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSxcblx0XHRcdGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHtcblx0XHRcdGVsZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7XG5cdFx0XHRqUXVlcnkoIGluc2VydFsgaSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0Ly8gLmdldCgpIGJlY2F1c2UgcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0cHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7XG5cdH07XG59ICk7XG52YXIgcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggXCJeKFwiICsgcG51bSArIFwiKSg/IXB4KVthLXolXSskXCIsIFwiaVwiICk7XG5cbnZhciBnZXRTdHlsZXMgPSBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seSwgRmlyZWZveCA8PTMwICgjMTUwOTgsICMxNDE1MClcblx0XHQvLyBJRSB0aHJvd3Mgb24gZWxlbWVudHMgY3JlYXRlZCBpbiBwb3B1cHNcblx0XHQvLyBGRiBtZWFud2hpbGUgdGhyb3dzIG9uIGZyYW1lIGVsZW1lbnRzIHRocm91Z2ggXCJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlXCJcblx0XHR2YXIgdmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcblxuXHRcdGlmICggIXZpZXcgfHwgIXZpZXcub3BlbmVyICkge1xuXHRcdFx0dmlldyA9IHdpbmRvdztcblx0XHR9XG5cblx0XHRyZXR1cm4gdmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtICk7XG5cdH07XG5cbnZhciByYm94U3R5bGUgPSBuZXcgUmVnRXhwKCBjc3NFeHBhbmQuam9pbiggXCJ8XCIgKSwgXCJpXCIgKTtcblxuXG5cbiggZnVuY3Rpb24oKSB7XG5cblx0Ly8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0XG5cdC8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uXG5cdGZ1bmN0aW9uIGNvbXB1dGVTdHlsZVRlc3RzKCkge1xuXG5cdFx0Ly8gVGhpcyBpcyBh
46184IHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZVxuXHRcdGlmICggIWRpdiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O1wiICtcblx0XHRcdFwibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowXCI7XG5cdFx0ZGl2LnN0eWxlLmNzc1RleHQgPVxuXHRcdFx0XCJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7XCIgK1xuXHRcdFx0XCJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O1wiICtcblx0XHRcdFwid2lkdGg6NjAlO3RvcDoxJVwiO1xuXHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggY29udGFpbmVyICkuYXBwZW5kQ2hpbGQoIGRpdiApO1xuXG5cdFx0dmFyIGRpdlN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiApO1xuXHRcdHBpeGVsUG9zaXRpb25WYWwgPSBkaXZTdHlsZS50b3AgIT09IFwiMSVcIjtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHksIEZpcmVmb3ggPD0zIC0gNDRcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnRWYWwgPSByb3VuZFBpeGVsTWVhc3VyZXMoIGRpdlN0eWxlLm1hcmdpbkxlZnQgKSA9PT0gMTI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjNcblx0XHQvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3Rcblx0XHRkaXYuc3R5bGUucmlnaHQgPSBcIjYwJVwiO1xuXHRcdHBpeGVsQm94U3R5bGVzVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5yaWdodCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdFx0Ly8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50c1xuXHRcdGJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgb25seVxuXHRcdC8vIERldGVjdCBvdmVyZmxvdzpzY3JvbGwgc2NyZXdpbmVzcyAoZ2gtMzY5OSlcblx0XHRkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0c2Nyb2xsYm94U2l6ZVZhbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMzYgfHwgXCJhYnNvbHV0ZVwiO1xuXG5cdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdC8vIE51bGxpZnkgdGhlIGRpdiBzbyBpdCB3b3VsZG4ndCBiZSBzdG9yZWQgaW4gdGhlIG1lbW9yeSBhbmRcblx0XHQvLyBpdCB3aWxsIGFsc28gYmUgYSBzaWduIHRoYXQgY2hlY2tzIGFscmVhZHkgcGVyZm9ybWVkXG5cdFx0ZGl2ID0gbnVsbDtcblx0fVxuXG5cdGZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHtcblx0XHRyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7XG5cdH1cblxuXHR2YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsIHNjcm9sbGJveFNpemVWYWwsIHBpeGVsQm94U3R5bGVzVmFsLFxuXHRcdHJlbGlhYmxlTWFyZ2luTGVmdFZhbCxcblx0XHRjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICksXG5cdFx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXG5cdC8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzXG5cdGlmICggIWRpdi5zdHlsZSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdC8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOClcblx0ZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID0gXCJjb250ZW50LWJveFwiO1xuXHRkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcIlwiO1xuXHRzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSA9IGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9PT0gXCJjb250ZW50LWJveFwiO1xuXG5cdGpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHtcblx0XHRib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIGJveFNpemluZ1JlbGlhYmxlVmFsO1xuXHRcdH0sXG5cdFx0cGl4ZWxCb3hTdHlsZXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbEJveFN0eWxlc1ZhbDtcblx0XHR9LFxuXHRcdHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbFBvc2l0aW9uVmFsO1xuXHRcdH0sXG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcmVsaWFibGVNYXJnaW5MZWZ0VmFsO1xuXHRcdH0sXG5cdFx0c2Nyb2xsYm94U2l6ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHNjcm9sbGJveFNpemVWYWw7XG5cdFx0fVxuXHR9ICk7XG59ICkoKTtcblxuXG5mdW5jdGlvbiBjdXJDU1MoIGVsZW0sIG5hbWUsIGNvbXB1dGVkICkge1xuXHR2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LFxuXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA1MStcblx0XHQvLyBSZXRyaWV2aW5nIHN0eWxlIGJlZm9yZSBjb21wdXRlZCBzb21laG93XG5cdFx0Ly8gZml4ZXMgYW4gaXNzdWUgd2l0aCBnZXR0aW5nIHdyb25nIHZhbHVlc1xuXHRcdC8vIG9uIGRldGFjaGVkIGVsZW1lbnRzXG5cdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdGNvbXB1dGVkID0gY29tcHV0ZWQgfHwgZ2V0U3R5bGVzKCBlbGVtICk7XG5cblx0Ly8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBuZWVkZWQgZm9yOlxuXHQvLyAgIC5jc3MoJ2ZpbHRlcicpIChJRSA5IG9ubHksICMxMjUzNylcblx0Ly8gICAuY3NzKCctLWN1c3RvbVByb3BlcnR5KSAoIzMxNDQpXG5cdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0cmV0ID0gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApIHx8IGNvbXB1dGVkWyBuYW1lIF0
461847XG5cblx0XHRpZiAoIHJldCA9PT0gXCJcIiAmJiAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKSApIHtcblx0XHRcdHJldCA9IGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSApO1xuXHRcdH1cblxuXHRcdC8vIEEgdHJpYnV0ZSB0byB0aGUgXCJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXCJcblx0XHQvLyBBbmRyb2lkIEJyb3dzZXIgcmV0dXJucyBwZXJjZW50YWdlIGZvciBzb21lIHZhbHVlcyxcblx0XHQvLyBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkgcGl4ZWxzLlxuXHRcdC8vIFRoaXMgaXMgYWdhaW5zdCB0aGUgQ1NTT00gZHJhZnQgc3BlYzpcblx0XHQvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI3Jlc29sdmVkLXZhbHVlc1xuXHRcdGlmICggIXN1cHBvcnQucGl4ZWxCb3hTdHlsZXMoKSAmJiBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcmJveFN0eWxlLnRlc3QoIG5hbWUgKSApIHtcblxuXHRcdFx0Ly8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlc1xuXHRcdFx0d2lkdGggPSBzdHlsZS53aWR0aDtcblx0XHRcdG1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7XG5cdFx0XHRtYXhXaWR0aCA9IHN0eWxlLm1heFdpZHRoO1xuXG5cdFx0XHQvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IHN0eWxlLm1heFdpZHRoID0gc3R5bGUud2lkdGggPSByZXQ7XG5cdFx0XHRyZXQgPSBjb21wdXRlZC53aWR0aDtcblxuXHRcdFx0Ly8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlc1xuXHRcdFx0c3R5bGUud2lkdGggPSB3aWR0aDtcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7XG5cdFx0XHRzdHlsZS5tYXhXaWR0aCA9IG1heFdpZHRoO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdFx0Ly8gSUUgcmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50ZWdlci5cblx0XHRyZXQgKyBcIlwiIDpcblx0XHRyZXQ7XG59XG5cblxuZnVuY3Rpb24gYWRkR2V0SG9va0lmKCBjb25kaXRpb25GbiwgaG9va0ZuICkge1xuXG5cdC8vIERlZmluZSB0aGUgaG9vaywgd2UnbGwgY2hlY2sgb24gdGhlIGZpcnN0IHJ1biBpZiBpdCdzIHJlYWxseSBuZWVkZWQuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggY29uZGl0aW9uRm4oKSApIHtcblxuXHRcdFx0XHQvLyBIb29rIG5vdCBuZWVkZWQgKG9yIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBpdCBkdWVcblx0XHRcdFx0Ly8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LlxuXHRcdFx0XHRkZWxldGUgdGhpcy5nZXQ7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSG9vayBuZWVkZWQ7IHJlZGVmaW5lIGl0IHNvIHRoYXQgdGhlIHN1cHBvcnQgdGVzdCBpcyBub3QgZXhlY3V0ZWQgYWdhaW4uXG5cdFx0XHRyZXR1cm4gKCB0aGlzLmdldCA9IGhvb2tGbiApLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9XG5cdH07XG59XG5cblxudmFyXG5cblx0Ly8gU3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZVxuXHQvLyBleGNlcHQgXCJ0YWJsZVwiLCBcInRhYmxlLWNlbGxcIiwgb3IgXCJ0YWJsZS1jYXB0aW9uXCJcblx0Ly8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5XG5cdHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxcblx0cmN1c3RvbVByb3AgPSAvXi0tLyxcblx0Y3NzU2hvdyA9IHsgcG9zaXRpb246IFwiYWJzb2x1dGVcIiwgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiwgZGlzcGxheTogXCJibG9ja1wiIH0sXG5cdGNzc05vcm1hbFRyYW5zZm9ybSA9IHtcblx0XHRsZXR0ZXJTcGFjaW5nOiBcIjBcIixcblx0XHRmb250V2VpZ2h0OiBcIjQwMFwiXG5cdH0sXG5cblx0Y3NzUHJlZml4ZXMgPSBbIFwiV2Via2l0XCIsIFwiTW96XCIsIFwibXNcIiBdLFxuXHRlbXB0eVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLnN0eWxlO1xuXG4vLyBSZXR1cm4gYSBjc3MgcHJvcGVydHkgbWFwcGVkIHRvIGEgcG90ZW50aWFsbHkgdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5XG5mdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHtcblxuXHQvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZFxuXHRpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHtcblx0XHRyZXR1cm4gbmFtZTtcblx0fVxuXG5cdC8vIENoZWNrIGZvciB2ZW5kb3IgcHJlZml4ZWQgbmFtZXNcblx0dmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSxcblx0XHRpID0gY3NzUHJlZml4ZXMubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdG5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTtcblx0XHRpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHtcblx0XHRcdHJldHVybiBuYW1lO1xuXHRcdH1cblx0fVxufVxuXG4vLyBSZXR1cm4gYSBwcm9wZXJ0eSBtYXBwZWQgYWxvbmcgd2hhdCBqUXVlcnkuY3NzUHJvcHMgc3VnZ2VzdHMgb3IgdG9cbi8vIGEgdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5LlxuZnVuY3Rpb24gZmluYWxQcm9wTmFtZSggbmFtZSApIHtcblx0dmFyIHJldCA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdO1xuXHRpZiAoICFyZXQgKSB7XG5cdFx0cmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7XG5cdH1cblx0cmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCApIHtcblxuXHQvLyBBbnkgcmVsYXRpdmUgKCsvLSkgdmFsdWVzIGhhdmUgYWxyZWFkeSBiZWVuXG5cdC8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludFxuXHR2YXIgbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKTtcblx0cmV0dXJuIG1hdGNoZXMgP1xuXG5cdFx0Ly8gR3VhcmQgYWdhaW5zdCB1bmRlZmluZWQgXCJzdWJ0cmFjdFwiLCBlLmcuLCB3aGVuIHVzZWQgYXMgaW4gY3NzSG9va3Ncblx0XHRNYXRoLm1heCggMCwgbWF0Y2hlc1sgMiBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sgMyBdIHx8IFwicHhcIiApIDpcblx0XHR2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYm94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIGJveCwgaXNCb3JkZXJCb3gsIHN0eWxlcywgY29tcHV0ZWRWYWwgKSB7XG5cdHZhciBpID0gZGltZW5zaW9uID09PSBcIndpZHRoXCIgPyAxIDogMCxcblx0XHRleHRyYSA9IDAsXG5cdFx0ZGVsdGEgPSAwO1xuXG5cdC8vIEFkanVzdG1lbnQgbWF5IG5vdCBiZSBuZWNlc3Nhcnlcblx0aWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGZvciAoIDsgaSA8IDQ7IGkgKz
461840gMiApIHtcblxuXHRcdC8vIEJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpblxuXHRcdGlmICggYm94ID09PSBcIm1hcmdpblwiICkge1xuXHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgYm94ICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdC8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBjb250ZW50LWJveCwgd2UncmUgc2Vla2luZyBcInBhZGRpbmdcIiBvciBcImJvcmRlclwiIG9yIFwibWFyZ2luXCJcblx0XHRpZiAoICFpc0JvcmRlckJveCApIHtcblxuXHRcdFx0Ly8gQWRkIHBhZGRpbmdcblx0XHRcdGRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXG5cdFx0XHQvLyBGb3IgXCJib3JkZXJcIiBvciBcIm1hcmdpblwiLCBhZGQgYm9yZGVyXG5cdFx0XHRpZiAoIGJveCAhPT0gXCJwYWRkaW5nXCIgKSB7XG5cdFx0XHRcdGRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cblx0XHRcdC8vIEJ1dCBzdGlsbCBrZWVwIHRyYWNrIG9mIGl0IG90aGVyd2lzZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZXh0cmEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblxuXHRcdC8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBib3JkZXItYm94IChjb250ZW50ICsgcGFkZGluZyArIGJvcmRlciksIHdlJ3JlIHNlZWtpbmcgXCJjb250ZW50XCIgb3Jcblx0XHQvLyBcInBhZGRpbmdcIiBvciBcIm1hcmdpblwiXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gRm9yIFwiY29udGVudFwiLCBzdWJ0cmFjdCBwYWRkaW5nXG5cdFx0XHRpZiAoIGJveCA9PT0gXCJjb250ZW50XCIgKSB7XG5cdFx0XHRcdGRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGb3IgXCJjb250ZW50XCIgb3IgXCJwYWRkaW5nXCIsIHN1YnRyYWN0IGJvcmRlclxuXHRcdFx0aWYgKCBib3ggIT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRcdGRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWNjb3VudCBmb3IgcG9zaXRpdmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlciB3aGVuIHJlcXVlc3RlZCBieSBwcm92aWRpbmcgY29tcHV0ZWRWYWxcblx0aWYgKCAhaXNCb3JkZXJCb3ggJiYgY29tcHV0ZWRWYWwgPj0gMCApIHtcblxuXHRcdC8vIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyBhIHJvdW5kZWQgc3VtIG9mIGNvbnRlbnQsIHBhZGRpbmcsIHNjcm9sbCBndXR0ZXIsIGFuZCBib3JkZXJcblx0XHQvLyBBc3N1bWluZyBpbnRlZ2VyIHNjcm9sbCBndXR0ZXIsIHN1YnRyYWN0IHRoZSByZXN0IGFuZCByb3VuZCBkb3duXG5cdFx0ZGVsdGEgKz0gTWF0aC5tYXgoIDAsIE1hdGguY2VpbChcblx0XHRcdGVsZW1bIFwib2Zmc2V0XCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtXG5cdFx0XHRjb21wdXRlZFZhbCAtXG5cdFx0XHRkZWx0YSAtXG5cdFx0XHRleHRyYSAtXG5cdFx0XHQwLjVcblx0XHQpICk7XG5cdH1cblxuXHRyZXR1cm4gZGVsdGE7XG59XG5cbmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7XG5cblx0Ly8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZVxuXHR2YXIgc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBkaW1lbnNpb24sIHN0eWxlcyApLFxuXHRcdGlzQm9yZGVyQm94ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHR2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3g7XG5cblx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTU0XG5cdC8vIFJldHVybiBhIGNvbmZvdW5kaW5nIG5vbi1waXhlbCB2YWx1ZSBvciBmZWlnbiBpZ25vcmFuY2UsIGFzIGFwcHJvcHJpYXRlLlxuXHRpZiAoIHJudW1ub25weC50ZXN0KCB2YWwgKSApIHtcblx0XHRpZiAoICFleHRyYSApIHtcblx0XHRcdHJldHVybiB2YWw7XG5cdFx0fVxuXHRcdHZhbCA9IFwiYXV0b1wiO1xuXHR9XG5cblx0Ly8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXNcblx0Ly8gZm9yIGdldENvbXB1dGVkU3R5bGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHlsZVxuXHR2YWx1ZUlzQm9yZGVyQm94ID0gdmFsdWVJc0JvcmRlckJveCAmJlxuXHRcdCggc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSgpIHx8IHZhbCA9PT0gZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gKTtcblxuXHQvLyBGYWxsIGJhY2sgdG8gb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IHdoZW4gdmFsdWUgaXMgXCJhdXRvXCJcblx0Ly8gVGhpcyBoYXBwZW5zIGZvciBpbmxpbmUgZWxlbWVudHMgd2l0aCBubyBleHBsaWNpdCBzZXR0aW5nIChnaC0zNTcxKVxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4xIC0gNC4zIG9ubHlcblx0Ly8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMilcblx0aWYgKCB2YWwgPT09IFwiYXV0b1wiIHx8XG5cdFx0IXBhcnNlRmxvYXQoIHZhbCApICYmIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiaW5saW5lXCIgKSB7XG5cblx0XHR2YWwgPSBlbGVtWyBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApIF07XG5cblx0XHQvLyBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgcHJvdmlkZSBib3JkZXItYm94IHZhbHVlc1xuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlO1xuXHR9XG5cblx0Ly8gTm9ybWFsaXplIFwiXCIgYW5kIGF1dG9cblx0dmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDtcblxuXHQvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsXG5cdHJldHVybiAoIHZhbCArXG5cdFx0Ym94TW9kZWxBZGp1c3RtZW50KFxuXHRcdFx0ZWxlbSxcblx0XHRcdGRpbWVuc2lvbixcblx0XHRcdGV4dHJhIHx8ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSxcblx0XHRcdHZhbHVlSXNCb3JkZXJCb3gsXG5cdFx0XHRzdHlsZXMsXG5cblx0XHRcdC8vIFByb3ZpZGUgdGhlIGN1cnJlbnQgY29tcHV0ZWQgc2l6ZSB0byByZXF1
46184ZXN0IHNjcm9sbCBndXR0ZXIgY2FsY3VsYXRpb24gKGdoLTM1ODkpXG5cdFx0XHR2YWxcblx0XHQpXG5cdCkgKyBcInB4XCI7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHRcblx0Ly8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5XG5cdGNzc0hvb2tzOiB7XG5cdFx0b3BhY2l0eToge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eVxuXHRcdFx0XHRcdHZhciByZXQgPSBjdXJDU1MoIGVsZW0sIFwib3BhY2l0eVwiICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiMVwiIDogcmV0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIERvbid0IGF1dG9tYXRpY2FsbHkgYWRkIFwicHhcIiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzXG5cdGNzc051bWJlcjoge1xuXHRcdFwiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnRcIjogdHJ1ZSxcblx0XHRcImNvbHVtbkNvdW50XCI6IHRydWUsXG5cdFx0XCJmaWxsT3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwiZmxleEdyb3dcIjogdHJ1ZSxcblx0XHRcImZsZXhTaHJpbmtcIjogdHJ1ZSxcblx0XHRcImZvbnRXZWlnaHRcIjogdHJ1ZSxcblx0XHRcImxpbmVIZWlnaHRcIjogdHJ1ZSxcblx0XHRcIm9wYWNpdHlcIjogdHJ1ZSxcblx0XHRcIm9yZGVyXCI6IHRydWUsXG5cdFx0XCJvcnBoYW5zXCI6IHRydWUsXG5cdFx0XCJ3aWRvd3NcIjogdHJ1ZSxcblx0XHRcInpJbmRleFwiOiB0cnVlLFxuXHRcdFwiem9vbVwiOiB0cnVlXG5cdH0sXG5cblx0Ly8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZVxuXHQvLyBzZXR0aW5nIG9yIGdldHRpbmcgdGhlIHZhbHVlXG5cdGNzc1Byb3BzOiB7fSxcblxuXHQvLyBHZXQgYW5kIHNldCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZVxuXHRzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHtcblxuXHRcdC8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2Rlc1xuXHRcdGlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4IHx8ICFlbGVtLnN0eWxlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZVxuXHRcdHZhciByZXQsIHR5cGUsIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBjYW1lbENhc2UoIG5hbWUgKSxcblx0XHRcdGlzQ3VzdG9tUHJvcCA9IHJjdXN0b21Qcm9wLnRlc3QoIG5hbWUgKSxcblx0XHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZS4gV2UgZG9uJ3Rcblx0XHQvLyB3YW50IHRvIHF1ZXJ5IHRoZSB2YWx1ZSBpZiBpdCBpcyBhIENTUyBjdXN0b20gcHJvcGVydHlcblx0XHQvLyBzaW5jZSB0aGV5IGFyZSB1c2VyLWRlZmluZWQuXG5cdFx0aWYgKCAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0bmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb25cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcblxuXHRcdC8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZVxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cblx0XHRcdC8vIENvbnZlcnQgXCIrPVwiIG9yIFwiLT1cIiB0byByZWxhdGl2ZSBudW1iZXJzICgjNzM0NSlcblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAoIHJldCA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmIHJldFsgMSBdICkge1xuXHRcdFx0XHR2YWx1ZSA9IGFkanVzdENTUyggZWxlbSwgbmFtZSwgcmV0ICk7XG5cblx0XHRcdFx0Ly8gRml4ZXMgYnVnICM5MjM3XG5cdFx0XHRcdHR5cGUgPSBcIm51bWJlclwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBudWxsIGFuZCBOYU4gdmFsdWVzIGFyZW4ndCBzZXQgKCM3MTE2KVxuXHRcdFx0aWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIG51bWJlciB3YXMgcGFzc2VkIGluLCBhZGQgdGhlIHVuaXQgKGV4Y2VwdCBmb3IgY2VydGFpbiBDU1MgcHJvcGVydGllcylcblx0XHRcdGlmICggdHlwZSA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0dmFsdWUgKz0gcmV0ICYmIHJldFsgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgb3JpZ05hbWUgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gYmFja2dyb3VuZC0qIHByb3BzIGFmZmVjdCBvcmlnaW5hbCBjbG9uZSdzIHZhbHVlc1xuXHRcdFx0aWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09IFwiXCIgJiYgbmFtZS5pbmRleE9mKCBcImJhY2tncm91bmRcIiApID09PSAwICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gXCJpbmhlcml0XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNpZmllZCB2YWx1ZVxuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8XG5cdFx0XHRcdCggdmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdFx0XHRzdHlsZS5zZXRQcm9wZXJ0eSggbmFtZSwgdmFsdWUgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBmYWxzZSwgZXh0cmEgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3Rcblx0XHRcdHJldHVybi
46184BzdHlsZVsgbmFtZSBdO1xuXHRcdH1cblx0fSxcblxuXHRjc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBleHRyYSwgc3R5bGVzICkge1xuXHRcdHZhciB2YWwsIG51bSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0aXNDdXN0b21Qcm9wID0gcmN1c3RvbVByb3AudGVzdCggbmFtZSApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndFxuXHRcdC8vIHdhbnQgdG8gbW9kaWZ5IHRoZSB2YWx1ZSBpZiBpdCBpcyBhIENTUyBjdXN0b20gcHJvcGVydHlcblx0XHQvLyBzaW5jZSB0aGV5IGFyZSB1c2VyLWRlZmluZWQuXG5cdFx0aWYgKCAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0bmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gVHJ5IHByZWZpeGVkIG5hbWUgZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgbmFtZVxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXRcblx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IFwibm9ybWFsXCIgdG8gY29tcHV0ZWQgdmFsdWVcblx0XHRpZiAoIHZhbCA9PT0gXCJub3JtYWxcIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHtcblx0XHRcdHZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsgbmFtZSBdO1xuXHRcdH1cblxuXHRcdC8vIE1ha2UgbnVtZXJpYyBpZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIgd2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJpY1xuXHRcdGlmICggZXh0cmEgPT09IFwiXCIgfHwgZXh0cmEgKSB7XG5cdFx0XHRudW0gPSBwYXJzZUZsb2F0KCB2YWwgKTtcblx0XHRcdHJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiaGVpZ2h0XCIsIFwid2lkdGhcIiBdLCBmdW5jdGlvbiggaSwgZGltZW5zaW9uICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0Ly8gQ2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtXG5cdFx0XHRcdC8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0XG5cdFx0XHRcdHJldHVybiByZGlzcGxheXN3YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSApICYmXG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCtcblx0XHRcdFx0XHQvLyBUYWJsZSBjb2x1bW5zIGluIFNhZmFyaSBoYXZlIG5vbi16ZXJvIG9mZnNldFdpZHRoICYgemVyb1xuXHRcdFx0XHRcdC8vIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIHVubGVzcyBkaXNwbGF5IGlzIGNoYW5nZWQuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0XHRcdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYSBkaXNjb25uZWN0ZWQgbm9kZVxuXHRcdFx0XHRcdC8vIGluIElFIHRocm93cyBhbiBlcnJvci5cblx0XHRcdFx0XHQoICFlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoIHx8ICFlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICkgP1xuXHRcdFx0XHRcdFx0c3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7XG5cdFx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdFx0Z2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7XG5cdFx0XHR2YXIgbWF0Y2hlcyxcblx0XHRcdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cdFx0XHRcdGlzQm9yZGVyQm94ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHRcdFx0c3VidHJhY3QgPSBleHRyYSAmJiBib3hNb2RlbEFkanVzdG1lbnQoXG5cdFx0XHRcdFx0ZWxlbSxcblx0XHRcdFx0XHRkaW1lbnNpb24sXG5cdFx0XHRcdFx0ZXh0cmEsXG5cdFx0XHRcdFx0aXNCb3JkZXJCb3gsXG5cdFx0XHRcdFx0c3R5bGVzXG5cdFx0XHRcdCk7XG5cblx0XHRcdC8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZFxuXHRcdFx0Ly8gZmFraW5nIGEgY29udGVudC1ib3ggdG8gZ2V0IGJvcmRlciBhbmQgcGFkZGluZyAoZ2gtMzY5OSlcblx0XHRcdGlmICggaXNCb3JkZXJCb3ggJiYgc3VwcG9ydC5zY3JvbGxib3hTaXplKCkgPT09IHN0eWxlcy5wb3NpdGlvbiApIHtcblx0XHRcdFx0c3VidHJhY3QgLT0gTWF0aC5jZWlsKFxuXHRcdFx0XHRcdGVsZW1bIFwib2Zmc2V0XCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtXG5cdFx0XHRcdFx0cGFyc2VGbG9hdCggc3R5bGVzWyBkaW1lbnNpb24gXSApIC1cblx0XHRcdFx0XHRib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgXCJib3JkZXJcIiwgZmFsc2UsIHN0eWxlcyApIC1cblx0XHRcdFx0XHQwLjVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCB0byBwaXhlbHMgaWYgdmFsdWUgYWRqdXN0bWVudCBpcyBuZWVkZWRcblx0XHRcdGlmICggc3VidHJhY3QgJiYgKCBtYXRjaGVzID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiZcblx0XHRcdFx0KCBtYXRjaGVzWyAzIF0gfHwgXCJweFwiICkgIT09IFwicHhcIiApIHtcblxuXHRcdFx0XHRlbGVtLnN0eWxlWyBkaW1lbnNpb24gXSA9IHZhbHVlO1xuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5jc3MoIGVsZW0sIGRpbWVuc2lvbiApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCApO1xuXHRcdH1cblx0fTtcbn0gKTtcblxualF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LFxuXHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRcdHJldHVybiAoIHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgXCJtYXJnaW5MZWZ0XCIgKSApIHx8XG5cdFx0XHRcdGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtXG5cdFx0XHRcdFx0c3dhcCggZWxlbSwgeyBtYXJnaW5MZWZ0OiAwIH0sIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcblx0XHRcdFx0XHR9IClcblx0XHRcdFx0KSArIFwicHhcIjtcblx0XHR9XG5cdH1cbik7XG5cbi8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUgdG8gZXhwYW5kIHByb3BlcnRpZXNcbmpRdWVyeS5lYWNoKCB7XG5cdG1hcmdpbjogXCJcIixcblx0cGFkZGluZzogXCJcIixcblx0Ym9yZGVyOiBcIldpZHRoXCJcbn0sIGZ1bmN0aW9uKCBwcmVmaXgsIHN1ZmZpeCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHtcblx0XHRleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBpID0gMCxcblx0XHRcdFx0ZXhwYW5kZWQgPSB7fSxcblxuXHRcdFx0XHQvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmdcblx0XHRcdFx0cGFydHMgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZS
461845zcGxpdCggXCIgXCIgKSA6IFsgdmFsdWUgXTtcblxuXHRcdFx0Zm9yICggOyBpIDwgNDsgaSsrICkge1xuXHRcdFx0XHRleHBhbmRlZFsgcHJlZml4ICsgY3NzRXhwYW5kWyBpIF0gKyBzdWZmaXggXSA9XG5cdFx0XHRcdFx0cGFydHNbIGkgXSB8fCBwYXJ0c1sgaSAtIDIgXSB8fCBwYXJ0c1sgMCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXhwYW5kZWQ7XG5cdFx0fVxuXHR9O1xuXG5cdGlmICggcHJlZml4ICE9PSBcIm1hcmdpblwiICkge1xuXHRcdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgc3R5bGVzLCBsZW4sXG5cdFx0XHRcdG1hcCA9IHt9LFxuXHRcdFx0XHRpID0gMDtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7XG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0XHRsZW4gPSBuYW1lLmxlbmd0aDtcblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbWFwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6XG5cdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHR9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fVxufSApO1xuXG5cbmZ1bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHtcblx0cmV0dXJuIG5ldyBUd2Vlbi5wcm90b3R5cGUuaW5pdCggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKTtcbn1cbmpRdWVyeS5Ud2VlbiA9IFR3ZWVuO1xuXG5Ud2Vlbi5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBUd2Vlbixcblx0aW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkge1xuXHRcdHRoaXMuZWxlbSA9IGVsZW07XG5cdFx0dGhpcy5wcm9wID0gcHJvcDtcblx0XHR0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0O1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdFx0dGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTtcblx0XHR0aGlzLmVuZCA9IGVuZDtcblx0XHR0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApO1xuXHR9LFxuXHRjdXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID9cblx0XHRcdGhvb2tzLmdldCggdGhpcyApIDpcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTtcblx0fSxcblx0cnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHtcblx0XHR2YXIgZWFzZWQsXG5cdFx0XHRob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKFxuXHRcdFx0XHRwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50O1xuXHRcdH1cblx0XHR0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkge1xuXHRcdFx0aG9va3Muc2V0KCB0aGlzICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn07XG5cblR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTtcblxuVHdlZW4ucHJvcEhvb2tzID0ge1xuXHRfZGVmYXVsdDoge1xuXHRcdGdldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0dmFyIHJlc3VsdDtcblxuXHRcdFx0Ly8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCxcblx0XHRcdC8vIG9yIHdoZW4gdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc3R5bGUgcHJvcGVydHkgdGhhdCBleGlzdHMuXG5cdFx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgIT09IDEgfHxcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07XG5cdFx0XHR9XG5cblx0XHRcdC8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseVxuXHRcdFx0Ly8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlscy5cblx0XHRcdC8vIFNpbXBsZSB2YWx1ZXMgc3VjaCBhcyBcIjEwcHhcIiBhcmUgcGFyc2VkIHRvIEZsb2F0O1xuXHRcdFx0Ly8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyBcInJvdGF0ZSgxcmFkKVwiIGFyZSByZXR1cm5lZCBhcy1pcy5cblx0XHRcdHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIFwiXCIgKTtcblxuXHRcdFx0Ly8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCBcImF1dG9cIiBhcmUgY29udmVydGVkIHRvIDAuXG5cdFx0XHRyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09IFwiYXV0b1wiID8gMCA6IHJlc3VsdDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXG5cdFx0XHQvLyBVc2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdC5cblx0XHRcdC8vIFVzZSBjc3NIb29rIGlmIGl0cyB0aGVyZS5cblx0XHRcdC8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuXG5cdFx0XHRpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7XG5cdFx0XHR9IGVsc2UgaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHtcblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCB0d2Vlbi5ub3cgKyB0d2Vlbi51bml0ICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzXG5Ud2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJv
46184cEhvb2tzLnNjcm9sbExlZnQgPSB7XG5cdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZWFzaW5nID0ge1xuXHRsaW5lYXI6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiBwO1xuXHR9LFxuXHRzd2luZzogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjtcblx0fSxcblx0X2RlZmF1bHQ6IFwic3dpbmdcIlxufTtcblxualF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7XG5cbi8vIEJhY2sgY29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50XG5qUXVlcnkuZnguc3RlcCA9IHt9O1xuXG5cblxuXG52YXJcblx0ZnhOb3csIGluUHJvZ3Jlc3MsXG5cdHJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFxuXHRycnVuID0gL3F1ZXVlSG9va3MkLztcblxuZnVuY3Rpb24gc2NoZWR1bGUoKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHtcblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIHNjaGVkdWxlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBzY2hlZHVsZSwgalF1ZXJ5LmZ4LmludGVydmFsICk7XG5cdFx0fVxuXG5cdFx0alF1ZXJ5LmZ4LnRpY2soKTtcblx0fVxufVxuXG4vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5XG5mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHtcblx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xuXHR9ICk7XG5cdHJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApO1xufVxuXG4vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvblxuZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHtcblx0dmFyIHdoaWNoLFxuXHRcdGkgPSAwLFxuXHRcdGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTtcblxuXHQvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsXG5cdC8vIG90aGVyd2lzZSBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0XG5cdGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aCA/IDEgOiAwO1xuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7XG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcblx0XHRhdHRyc1sgXCJtYXJnaW5cIiArIHdoaWNoIF0gPSBhdHRyc1sgXCJwYWRkaW5nXCIgKyB3aGljaCBdID0gdHlwZTtcblx0fVxuXG5cdGlmICggaW5jbHVkZVdpZHRoICkge1xuXHRcdGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7XG5cdH1cblxuXHRyZXR1cm4gYXR0cnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkge1xuXHR2YXIgdHdlZW4sXG5cdFx0Y29sbGVjdGlvbiA9ICggQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW10gKS5jb25jYXQoIEFuaW1hdGlvbi50d2VlbmVyc1sgXCIqXCIgXSApLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoICggdHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSApICkge1xuXG5cdFx0XHQvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eVxuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywgb3B0cyApIHtcblx0dmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LFxuXHRcdGlzQm94ID0gXCJ3aWR0aFwiIGluIHByb3BzIHx8IFwiaGVpZ2h0XCIgaW4gcHJvcHMsXG5cdFx0YW5pbSA9IHRoaXMsXG5cdFx0b3JpZyA9IHt9LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZSxcblx0XHRoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApLFxuXHRcdGRhdGFTaG93ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cblx0Ly8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzXG5cdGlmICggIW9wdHMucXVldWUgKSB7XG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xuXHRcdGlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHtcblx0XHRcdGhvb2tzLnVucXVldWVkID0gMDtcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICFob29rcy51bnF1ZXVlZCApIHtcblx0XHRcdFx0XHRvbGRmaXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdGhvb2tzLnVucXVldWVkKys7XG5cblx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGhvb2tzLnVucXVldWVkLS07XG5cdFx0XHRcdGlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgXCJmeFwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRmb3IgKCBwcm9wIGluIHByb3BzICkge1xuXHRcdHZhbHVlID0gcHJvcHNbIHByb3AgXTtcblx0XHRpZiAoIHJmeHR5cGVzLnRlc3QoIHZhbHVlICkgKSB7XG5cdFx0XHRkZWxldGUgcHJvcHNbIHByb3AgXTtcblx0XHRcdHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gXCJ0b2dnbGVcIjtcblx0XHRcdGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gXCJoaWRlXCIgOiBcInNob3dcIiApICkge1xuXG5cdFx0XHRcdC8vIFByZXRlbmQgdG8gYmUgaGlkZGVuIGlmIHRoaXMgaXMgYSBcInNob3dcIiBhbmRcblx0XHRcdFx0Ly8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGVcblx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gXCJzaG93XCIgJiYgZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGhpZGRlbiA9IHRydWU7XG5cblx0XHRcdFx0Ly8gSWdub3JlIGFsbCBvdGhlciBuby1vcCBzaG93L2hpZGUgZGF0YVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpXG5cdHByb3BUd2VlbiA9ICFqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcHMgKTtcblx0aWYgKCAhcHJvcFR3ZWVuICYmIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUmVzdHJpY3QgXCJvdmVyZmxvd1wiIGFuZCBcImRpc3BsYXlcIiBzdHlsZXMgZHVyaW5nIGJveCBhbmltYXRpb25zXG5cdGlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExLCBFZGdlIDEyIC0gMTVcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90IGluZmVyIHRoZSBzaG9ydGhhbmRcblx0XHQvLyBmcm9tIGlkZW50aWNhbGx5LXZhbHVlZCBvdmVyZmxvd1ggYW5kIG92ZXJmbG93WSBhbmQgRWRnZSBqdXN0IG1pcnJvcnNcblx0XHQvLyB0aGUgb3ZlcmZsb3dYIHZhbHVlIHRoZXJlLlxuXHRcdG9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdO1xuXG5cdFx0Ly8gSWRlbnRpZnkgYSBkaXNwbGF5IHR5cGUsIHByZWZlcnJpbmcgb2xkIHNob3cvaGlkZSBkYXRhIG92ZXIgdGhlIENTUyBjYXNjYWRlXG5cdFx0cmVzdG9yZURpc3BsYXkgPSBkYXRhU2hvdyAmJiBkYXRhU2hvdy5kaXNwbGF5O1xuXHRcdGlmICggcmVzdG9yZURpc3BsYXkgPT0gbnVsbCApIHtcblx0XHRcdHJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdH1cblx0XHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSApIHtcblx0XHRcdFx0ZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5O1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBHZXQgbm9uZW1wdHkgdmFsdWUocykgYnkgdGVtcG9yYXJpbHkgZm9yY2luZyB2aXNpYmlsaXR5XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApO1xuXHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheSB8fCByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFuaW1hdGUgaW5saW5lIGVsZW1lbnRzIGFzIGlubGluZS1ibG9ja1xuXHRcdGlmICggZGlzcGxheSA9PT0gXCJpbmxpbmVcIiB8fCBkaXNwbGF5ID09PSBcImlubGluZS1ibG9ja1wiICYmIHJlc3RvcmVEaXNwbGF5ICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZmxvYXRcIiApID09PSBcIm5vbmVcIiApIHtcblxuXHRcdFx0XHQvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBkaXNwbGF5IHZhbHVlIGF0IHRoZSBlbmQgb2YgcHVyZSBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRcdFx0XHRpZiAoICFwcm9wVHdlZW4gKSB7XG5cdFx0XHRcdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheSA9IHN0eWxlLmRpc3BsYXk7XG5cdFx0XHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09IFwibm9uZVwiID8gXCJcIiA6IGRpc3BsYXk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggb3B0cy5vdmVyZmxvdyApIHtcblx0XHRzdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gSW1wbGVtZW50IHNob3cvaGlkZSBhbmltYXRpb25zXG5cdHByb3BUd2VlbiA9IGZ
46184hbHNlO1xuXHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cblx0XHQvLyBHZW5lcmFsIHNob3cvaGlkZSBzZXR1cCBmb3IgdGhpcyBlbGVtZW50IGFuaW1hdGlvblxuXHRcdGlmICggIXByb3BUd2VlbiApIHtcblx0XHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRcdGlmICggXCJoaWRkZW5cIiBpbiBkYXRhU2hvdyApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGFTaG93ID0gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBcImZ4c2hvd1wiLCB7IGRpc3BsYXk6IHJlc3RvcmVEaXNwbGF5IH0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RvcmUgaGlkZGVuL3Zpc2libGUgZm9yIHRvZ2dsZSBzbyBgLnN0b3AoKS50b2dnbGUoKWAgXCJyZXZlcnNlc1wiXG5cdFx0XHRpZiAoIHRvZ2dsZSApIHtcblx0XHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW1cblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdFx0Ly8gVGhlIGZpbmFsIHN0ZXAgb2YgYSBcImhpZGVcIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50XG5cdFx0XHRcdGlmICggIWhpZGRlbiApIHtcblx0XHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFwiZnhzaG93XCIgKTtcblx0XHRcdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvLyBQZXItcHJvcGVydHkgc2V0dXBcblx0XHRwcm9wVHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTtcblx0XHRpZiAoICEoIHByb3AgaW4gZGF0YVNob3cgKSApIHtcblx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7XG5cdFx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdFx0cHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDtcblx0XHRcdFx0cHJvcFR3ZWVuLnN0YXJ0ID0gMDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7XG5cdHZhciBpbmRleCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7XG5cblx0Ly8gY2FtZWxDYXNlLCBzcGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzXG5cdGZvciAoIGluZGV4IGluIHByb3BzICkge1xuXHRcdG5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7XG5cdFx0ZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdO1xuXHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF07XG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0ZWFzaW5nID0gdmFsdWVbIDEgXTtcblx0XHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdO1xuXHRcdH1cblxuXHRcdGlmICggaW5kZXggIT09IG5hbWUgKSB7XG5cdFx0XHRwcm9wc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRkZWxldGUgcHJvcHNbIGluZGV4IF07XG5cdFx0fVxuXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTtcblx0XHRpZiAoIGhvb2tzICYmIFwiZXhwYW5kXCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgbmFtZSBdO1xuXG5cdFx0XHQvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuXG5cdFx0XHQvLyBSZXVzaW5nICdpbmRleCcgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IFwibmFtZVwiXG5cdFx0XHRmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkge1xuXHRcdFx0XHRcdHByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07XG5cdFx0XHRcdFx0c3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzcGVjaWFsRWFzaW5nWyBuYW1lIF0gPSBlYXNpbmc7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHtcblx0dmFyIHJlc3VsdCxcblx0XHRzdG9wcGVkLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBBbmltYXRpb24ucHJlZmlsdGVycy5sZW5ndGgsXG5cdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBEb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3Jcblx0XHRcdGRlbGV0ZSB0aWNrLmVsZW07XG5cdFx0fSApLFxuXHRcdHRpY2sgPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGN1cnJlbnRUaW1lID0gZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdFx0cmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLFxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHlcblx0XHRcdFx0Ly8gQXJjaGFpYyBjcmFzaCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIGAxIC0gKCAwLjUgfHwgMCApYCAoIzEyNDk3KVxuXHRcdFx0XHR0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsXG5cdFx0XHRcdHBlcmNlbnQgPSAxIC0gdGVtcCxcblx0XHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0XHRsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNlbnQsIHJlbWFpbmluZyBdICk7XG5cblx0XHRcdC8vIElmIHRoZXJlJ3MgbW9yZSB0byBkbywgeWllbGRcblx0XHRcdGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkge1xuXHRcdFx0XHRyZXR1cm4gcmVtYWluaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGlzIHdhcyBhbiBlbXB0eSBhbmltYXRpb24sIHN5bnRoZXNpemUgYSBmaW5hbCBwcm9ncmVzcyBub3RpZmljYXRpb25cblx0XHRcdGlmICggIWxlbmd0aCApIHtcblx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO
461841xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXNvbHZlIHRoZSBhbmltYXRpb24gYW5kIHJlcG9ydCBpdHMgY29uY2x1c2lvblxuXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSxcblx0XHRcdG9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHtcblx0XHRcdFx0c3BlY2lhbEVhc2luZzoge30sXG5cdFx0XHRcdGVhc2luZzogalF1ZXJ5LmVhc2luZy5fZGVmYXVsdFxuXHRcdFx0fSwgb3B0aW9ucyApLFxuXHRcdFx0b3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxuXHRcdFx0b3JpZ2luYWxPcHRpb25zOiBvcHRpb25zLFxuXHRcdFx0c3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0ZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sXG5cdFx0XHR0d2VlbnM6IFtdLFxuXHRcdFx0Y3JlYXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQgKSB7XG5cdFx0XHRcdHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCxcblx0XHRcdFx0XHRcdGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmdbIHByb3AgXSB8fCBhbmltYXRpb24ub3B0cy5lYXNpbmcgKTtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVucy5wdXNoKCB0d2VlbiApO1xuXHRcdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0XHR9LFxuXHRcdFx0c3RvcDogZnVuY3Rpb24oIGdvdG9FbmQgKSB7XG5cdFx0XHRcdHZhciBpbmRleCA9IDAsXG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVuZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnNcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2Ugc2tpcCB0aGlzIHBhcnRcblx0XHRcdFx0XHRsZW5ndGggPSBnb3RvRW5kID8gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGggOiAwO1xuXHRcdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RvcHBlZCA9IHRydWU7XG5cdFx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0XG5cdFx0XHRcdGlmICggZ290b0VuZCApIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0fSApLFxuXHRcdHByb3BzID0gYW5pbWF0aW9uLnByb3BzO1xuXG5cdHByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7XG5cblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApO1xuXHRcdGlmICggcmVzdWx0ICkge1xuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCByZXN1bHQuc3RvcCApICkge1xuXHRcdFx0XHRqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPVxuXHRcdFx0XHRcdHJlc3VsdC5zdG9wLmJpbmQoIHJlc3VsdCApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cdH1cblxuXHRqUXVlcnkubWFwKCBwcm9wcywgY3JlYXRlVHdlZW4sIGFuaW1hdGlvbiApO1xuXG5cdGlmICggaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHtcblx0XHRhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTtcblx0fVxuXG5cdC8vIEF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zXG5cdGFuaW1hdGlvblxuXHRcdC5wcm9ncmVzcyggYW5pbWF0aW9uLm9wdHMucHJvZ3Jlc3MgKVxuXHRcdC5kb25lKCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmltYXRpb24ub3B0cy5jb21wbGV0ZSApXG5cdFx0LmZhaWwoIGFuaW1hdGlvbi5vcHRzLmZhaWwgKVxuXHRcdC5hbHdheXMoIGFuaW1hdGlvbi5vcHRzLmFsd2F5cyApO1xuXG5cdGpRdWVyeS5meC50aW1lcihcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0YW5pbTogYW5pbWF0aW9uLFxuXHRcdFx0cXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlXG5cdFx0fSApXG5cdCk7XG5cblx0cmV0dXJuIGFuaW1hdGlvbjtcbn1cblxualF1ZXJ5LkFuaW1hdGlvbiA9IGpRdWVyeS5leHRlbmQoIEFuaW1hdGlvbiwge1xuXG5cdHR3ZWVuZXJzOiB7XG5cdFx0XCIqXCI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkge1xuXHRcdFx0dmFyIHR3ZWVuID0gdGhpcy5jcmVhdGVUd2VlbiggcHJvcCwgdmFsdWUgKTtcblx0XHRcdGFkanVzdENTUyggdHdlZW4uZWxlbSwgcHJvcCwgcmNzc051bS5leGVjKCB2YWx1ZSApLCB0d2VlbiApO1xuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH0gXVxuXHR9LFxuXG5cdHR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7XG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBwcm9wcyApICkge1xuXHRcdFx0Y2FsbGJhY2sgPSBwcm9wcztcblx0XHRcdHByb3BzID0gWyBcIipcIiBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wcyA9IHByb3BzLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cdFx0fVxuXG5cdFx0dmFyIHByb3AsXG5cdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0cHJvcCA9IHByb3BzWyBpbmRleCBdO1xuXHRcdFx0QW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gPSBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9LFxuXG5cdHByZWZpbHRlcnM6IFsgZGVmYXVsdFByZWZpbHRlciBdLFxuXG5cdHByZWZpbHRlcjogZnVuY3Rpb24oIGNhbGxiYWNrLCBwcmVwZW5kICkge1xuXHRcdGlmICggcHJlcGVuZCApIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cbmpRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHtcblx0dmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gXCJvYmplY3RcIiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDoge1xuXHRcdGNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8XG5cdFx0XHRpc0Z1bmN0aW9uKCBzcGVlZCApICYmIHNwZWVkLFxuXHRcdGR1cmF0aW9uOiBzcGVlZCxcblx0XHRlYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZ1xuXHR9O1xuXG5cdC8vIEdvIHRvIHRoZSBlbmQgc3RhdGUgaWYgZnggYXJlIG9mZlxuXHRpZiAoIGpRdWVyeS5meC5vZmYgKSB7XG5cdFx0b3B0LmR1cmF0aW9uID0gMDtcblxuXHR9IGVsc2Uge1xuXHRcdGlmICggdHlwZW9mIG9wdC5kdXJhdGlvbiAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdGlmICggb3B0LmR1cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgKSB7XG5cdFx0XHRcdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0O
461841xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIE5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+IFwiZnhcIlxuXHRpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHtcblx0XHRvcHQucXVldWUgPSBcImZ4XCI7XG5cdH1cblxuXHQvLyBRdWV1ZWluZ1xuXHRvcHQub2xkID0gb3B0LmNvbXBsZXRlO1xuXG5cdG9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggb3B0Lm9sZCApICkge1xuXHRcdFx0b3B0Lm9sZC5jYWxsKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHQucXVldWUgKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiBvcHQ7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZhZGVUbzogZnVuY3Rpb24oIHNwZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHtcblxuXHRcdC8vIFNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMFxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggaXNIaWRkZW5XaXRoaW5UcmVlICkuY3NzKCBcIm9wYWNpdHlcIiwgMCApLnNob3coKVxuXG5cdFx0XHQvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWRcblx0XHRcdC5lbmQoKS5hbmltYXRlKCB7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH0sXG5cdGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHR2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLFxuXHRcdFx0b3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLFxuXHRcdFx0ZG9BbmltYXRpb24gPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBPcGVyYXRlIG9uIGEgY29weSBvZiBwcm9wIHNvIHBlci1wcm9wZXJ0eSBlYXNpbmcgd29uJ3QgYmUgbG9zdFxuXHRcdFx0XHR2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7XG5cblx0XHRcdFx0Ly8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5XG5cdFx0XHRcdGlmICggZW1wdHkgfHwgZGF0YVByaXYuZ2V0KCB0aGlzLCBcImZpbmlzaFwiICkgKSB7XG5cdFx0XHRcdFx0YW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRkb0FuaW1hdGlvbi5maW5pc2ggPSBkb0FuaW1hdGlvbjtcblxuXHRcdHJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID9cblx0XHRcdHRoaXMuZWFjaCggZG9BbmltYXRpb24gKSA6XG5cdFx0XHR0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7XG5cdH0sXG5cdHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkge1xuXHRcdHZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7XG5cdFx0XHR2YXIgc3RvcCA9IGhvb2tzLnN0b3A7XG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdHN0b3AoIGdvdG9FbmQgKTtcblx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGdvdG9FbmQgPSBjbGVhclF1ZXVlO1xuXHRcdFx0Y2xlYXJRdWV1ZSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBkZXF1ZXVlID0gdHJ1ZSxcblx0XHRcdFx0aW5kZXggPSB0eXBlICE9IG51bGwgJiYgdHlwZSArIFwicXVldWVIb29rc1wiLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICk7XG5cblx0XHRcdGlmICggaW5kZXggKSB7XG5cdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7XG5cdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoIGluZGV4IGluIGRhdGEgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7XG5cdFx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJlxuXHRcdFx0XHRcdCggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkge1xuXG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApO1xuXHRcdFx0XHRcdGRlcXVldWUgPSBmYWxzZTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuXG5cdFx0XHQvLyBUaW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoXG5cdFx0XHQvLyB3aWxsIGRlcXVldWUgYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQuXG5cdFx0XHRpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXHRmaW5pc2g6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdGlmICggdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGluZGV4LFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICksXG5cdFx0XHRcdHF1ZXVlID0gZGF0YVsgdHlwZSArIFwicXVldWVcIiBdLFxuXHRcdFx0XHRob29rcyA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlSG9va3NcIiBdLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRsZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7XG5cblx0XHRcdC8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGFcblx0XHRcdGRhdGEuZmluaXNoID0gdHJ1ZTtcblxuXHRcdFx0Ly8gRW1wdHkgdGhlI
46184HF1ZXVlIGZpcnN0XG5cdFx0XHRqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIFtdICk7XG5cblx0XHRcdGlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHtcblx0XHRcdFx0aG9va3Muc3RvcC5jYWxsKCB0aGlzLCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhY3RpdmUgYW5pbWF0aW9ucywgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmIHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApIHtcblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYW5pbWF0aW9ucyBpbiB0aGUgb2xkIHF1ZXVlIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0aWYgKCBxdWV1ZVsgaW5kZXggXSAmJiBxdWV1ZVsgaW5kZXggXS5maW5pc2ggKSB7XG5cdFx0XHRcdFx0cXVldWVbIGluZGV4IF0uZmluaXNoLmNhbGwoIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZ1xuXHRcdFx0ZGVsZXRlIGRhdGEuZmluaXNoO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcInRvZ2dsZVwiLCBcInNob3dcIiwgXCJoaWRlXCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdO1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09IFwiYm9vbGVhblwiID9cblx0XHRcdGNzc0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6XG5cdFx0XHR0aGlzLmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnNcbmpRdWVyeS5lYWNoKCB7XG5cdHNsaWRlRG93bjogZ2VuRngoIFwic2hvd1wiICksXG5cdHNsaWRlVXA6IGdlbkZ4KCBcImhpZGVcIiApLFxuXHRzbGlkZVRvZ2dsZTogZ2VuRngoIFwidG9nZ2xlXCIgKSxcblx0ZmFkZUluOiB7IG9wYWNpdHk6IFwic2hvd1wiIH0sXG5cdGZhZGVPdXQ6IHsgb3BhY2l0eTogXCJoaWRlXCIgfSxcblx0ZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiBcInRvZ2dsZVwiIH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbmpRdWVyeS50aW1lcnMgPSBbXTtcbmpRdWVyeS5meC50aWNrID0gZnVuY3Rpb24oKSB7XG5cdHZhciB0aW1lcixcblx0XHRpID0gMCxcblx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzO1xuXG5cdGZ4Tm93ID0gRGF0ZS5ub3coKTtcblxuXHRmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7XG5cdFx0dGltZXIgPSB0aW1lcnNbIGkgXTtcblxuXHRcdC8vIFJ1biB0aGUgdGltZXIgYW5kIHNhZmVseSByZW1vdmUgaXQgd2hlbiBkb25lIChhbGxvd2luZyBmb3IgZXh0ZXJuYWwgcmVtb3ZhbClcblx0XHRpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHtcblx0XHRcdHRpbWVycy5zcGxpY2UoIGktLSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIXRpbWVycy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0b3AoKTtcblx0fVxuXHRmeE5vdyA9IHVuZGVmaW5lZDtcbn07XG5cbmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHtcblx0alF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApO1xuXHRqUXVlcnkuZnguc3RhcnQoKTtcbn07XG5cbmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzO1xualF1ZXJ5LmZ4LnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpblByb2dyZXNzID0gdHJ1ZTtcblx0c2NoZWR1bGUoKTtcbn07XG5cbmpRdWVyeS5meC5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdGluUHJvZ3Jlc3MgPSBudWxsO1xufTtcblxualF1ZXJ5LmZ4LnNwZWVkcyA9IHtcblx0c2xvdzogNjAwLFxuXHRmYXN0OiAyMDAsXG5cblx0Ly8gRGVmYXVsdCBzcGVlZFxuXHRfZGVmYXVsdDogNDAwXG59O1xuXG5cbi8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi5cbi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvXG5qUXVlcnkuZm4uZGVsYXkgPSBmdW5jdGlvbiggdGltZSwgdHlwZSApIHtcblx0dGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTtcblx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwgaG9va3MgKSB7XG5cdFx0dmFyIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCggbmV4dCwgdGltZSApO1xuXHRcdGhvb2tzLnN0b3AgPSBmdW5jdGlvbigpIHtcblx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXQgKTtcblx0XHR9O1xuXHR9ICk7XG59O1xuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApLFxuXHRcdHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwic2VsZWN0XCIgKSxcblx0XHRvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwib3B0aW9uXCIgKSApO1xuXG5cdGlucHV0LnR5cGUgPSBcImNoZWNrYm94XCI7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5XG5cdC8vIERlZmF1bHQgdmFsdWUgZm9yIGEgY2hlY2tib3ggc2hvdWxkIGJlIFwib25cIlxuXHRzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gXCJcIjtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTXVzdCBhY2Nlc3Mgc2VsZWN0ZWRJbmRleCB0byBtYWtlIGRlZmF1bHQgb3B0aW9ucyBzZWxlY3Rcblx0c3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gQW4gaW5wdXQgbG9zZXMgaXRzIHZhbHVlIGFmdGVyIGJlY29taW5nIGEgcmFkaW9cblx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0aW5wdXQudmFsdWUgPSBcInRcIjtcblx0aW5wdXQudHlwZSA9IFwicmFkaW9cIjtcblx0c3VwcG9ydC5yYWRpb1ZhbHVlID0gaW5wdXQudmFsdWUgPT09IFwidFwiO1xufSApKCk7XG5cblxudmFyIGJvb2xIb29rLF
46184xuXHRhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZFxuXHRcdGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdC8vIEF0dHJpYnV0ZSBob29rcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbG93ZXJjYXNlIHZlcnNpb25cblx0XHQvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC50ZXN0KCBuYW1lICkgPyBib29sSG9vayA6IHVuZGVmaW5lZCApO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdmFsdWUgPT09IG51bGwgKSB7XG5cdFx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICsgXCJcIiApO1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdC8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkXG5cdFx0cmV0dXJuIHJldCA9PSBudWxsID8gdW5kZWZpbmVkIDogcmV0O1xuXHR9LFxuXG5cdGF0dHJIb29rczoge1xuXHRcdHR5cGU6IHtcblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09IFwicmFkaW9cIiAmJlxuXHRcdFx0XHRcdG5vZGVOYW1lKCBlbGVtLCBcImlucHV0XCIgKSApIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gZWxlbS52YWx1ZTtcblx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIHZhbHVlICk7XG5cdFx0XHRcdFx0aWYgKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnZhbHVlID0gdmFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdHZhciBuYW1lLFxuXHRcdFx0aSA9IDAsXG5cblx0XHRcdC8vIEF0dHJpYnV0ZSBuYW1lcyBjYW4gY29udGFpbiBub24tSFRNTCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnNcblx0XHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2F0dHJpYnV0ZXMtMlxuXHRcdFx0YXR0ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKTtcblxuXHRcdGlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHR3aGlsZSAoICggbmFtZSA9IGF0dHJOYW1lc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlc1xuYm9vbEhvb2sgPSB7XG5cdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkge1xuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlXG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gbmFtZTtcblx0fVxufTtcblxualF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXFx3Ky9nICksIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHR2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7XG5cblx0YXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciByZXQsIGhhbmRsZSxcblx0XHRcdGxvd2VyY2FzZU5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRpZiAoICFpc1hNTCApIHtcblxuXHRcdFx0Ly8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcCBieSB0ZW1wb3JhcmlseSByZW1vdmluZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGdldHRlclxuXHRcdFx0aGFuZGxlID0gYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdO1xuXHRcdFx0YXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0O1xuXHRcdFx0cmV0ID0gZ2V0dGVyKCBlbGVtLCBuYW1lLCBpc1hNTCApICE9IG51bGwgP1xuXHRcdFx0XHRsb3dlcmNhc2VOYW1lIDpcblx0XHRcdFx0bnVsbDtcblx0XHRcdGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcbn0gKTtcblxuXG5cblxudmFyIHJmb2N1c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyY2xpY2thYmxlID0gL14oPzphfGFyZWEpJC9pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkZWxldGUgdGhpc1sgalF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lIF0
461847XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3Ncblx0XHRcdG5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldHVybiBlbGVtWyBuYW1lIF07XG5cdH0sXG5cblx0cHJvcEhvb2tzOiB7XG5cdFx0dGFiSW5kZXg6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHRcdFx0XHQvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGVcblx0XHRcdFx0Ly8gY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0XG5cdFx0XHRcdC8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE0MTExNjIzMzM0Ny9odHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0L1xuXHRcdFx0XHQvLyBVc2UgcHJvcGVyIGF0dHJpYnV0ZSByZXRyaWV2YWwoIzEyMDcyKVxuXHRcdFx0XHR2YXIgdGFiaW5kZXggPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInRhYmluZGV4XCIgKTtcblxuXHRcdFx0XHRpZiAoIHRhYmluZGV4ICkge1xuXHRcdFx0XHRcdHJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHxcblx0XHRcdFx0XHRyY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJlxuXHRcdFx0XHRcdGVsZW0uaHJlZlxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cHJvcEZpeDoge1xuXHRcdFwiZm9yXCI6IFwiaHRtbEZvclwiLFxuXHRcdFwiY2xhc3NcIjogXCJjbGFzc05hbWVcIlxuXHR9XG59ICk7XG5cbi8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuLy8gQWNjZXNzaW5nIHRoZSBzZWxlY3RlZEluZGV4IHByb3BlcnR5XG4vLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkXG4vLyBvbiB0aGUgb3B0aW9uXG4vLyBUaGUgZ2V0dGVyIGVuc3VyZXMgYSBkZWZhdWx0IG9wdGlvbiBpcyBzZWxlY3RlZFxuLy8gd2hlbiBpbiBhbiBvcHRncm91cFxuLy8gZXNsaW50IHJ1bGUgXCJuby11bnVzZWQtZXhwcmVzc2lvbnNcIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlXG4vLyBzaW5jZSBpdCBjb25zaWRlcnMgc3VjaCBhY2Nlc3Npb25zIG5vb3BcbmlmICggIXN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7XG5cdGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0LyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogXCJvZmZcIiAqL1xuXG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgJiYgcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8qIGVzbGludCBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFwib2ZmXCIgKi9cblxuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRwYXJlbnQuc2VsZWN0ZWRJbmRleDtcblxuXHRcdFx0XHRpZiAoIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmpRdWVyeS5lYWNoKCBbXG5cdFwidGFiSW5kZXhcIixcblx0XCJyZWFkT25seVwiLFxuXHRcIm1heExlbmd0aFwiLFxuXHRcImNlbGxTcGFjaW5nXCIsXG5cdFwiY2VsbFBhZGRpbmdcIixcblx0XCJyb3dTcGFuXCIsXG5cdFwiY29sU3BhblwiLFxuXHRcInVzZU1hcFwiLFxuXHRcImZyYW1lQm9yZGVyXCIsXG5cdFwiY29udGVudEVkaXRhYmxlXCJcbl0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzO1xufSApO1xuXG5cblxuXG5cdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlIGFjY29yZGluZyB0byBIVE1MIHNwZWNcblx0Ly8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlXG5cdGZ1bmN0aW9uIHN0cmlwQW5kQ29sbGFwc2UoIHZhbHVlICkge1xuXHRcdHZhciB0b2tlbnMgPSB2YWx1ZS
461845tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXHRcdHJldHVybiB0b2tlbnMuam9pbiggXCIgXCIgKTtcblx0fVxuXG5cbmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkge1xuXHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHtcblx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblx0fVxuXHRyZXR1cm4gW107XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjdXJWYWx1ZSwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRpID0gMDtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0Y2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCBjbGFzc2VzLmxlbmd0aCApIHtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0Y3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApO1xuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBjdXJWYWx1ZSApICsgXCIgXCIgKTtcblxuXHRcdFx0XHRpZiAoIGN1ciApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggY2xhenogPSBjbGFzc2VzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPCAwICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgKz0gY2xhenogKyBcIiBcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIGdldENsYXNzKCB0aGlzICkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hdHRyKCBcImNsYXNzXCIsIFwiXCIgKTtcblx0XHR9XG5cblx0XHRjbGFzc2VzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRpZiAoIGNsYXNzZXMubGVuZ3RoICkge1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cblx0XHRcdFx0Ly8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcylcblx0XHRcdFx0Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGNsYXp6ID0gY2xhc3Nlc1sgaisrIF0gKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlICphbGwqIGluc3RhbmNlc1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdFx0Y3VyID0gY3VyLnJlcGxhY2UoIFwiIFwiICsgY2xhenogKyBcIiBcIiwgXCIgXCIgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUsIHN0YXRlVmFsICkge1xuXHRcdHZhciB0eXBlID0gdHlwZW9mIHZhbHVlLFxuXHRcdFx0aXNWYWxpZFZhbHVlID0gdHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBBcnJheS5pc0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGVWYWwgPT09IFwiYm9vbGVhblwiICYmIGlzVmFsaWRWYWx1ZSApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyhcblx0XHRcdFx0XHR2YWx1ZS
461845jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLFxuXHRcdFx0XHRcdHN0YXRlVmFsXG5cdFx0XHRcdCk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgY2xhc3NOYW1lLCBpLCBzZWxmLCBjbGFzc05hbWVzO1xuXG5cdFx0XHRpZiAoIGlzVmFsaWRWYWx1ZSApIHtcblxuXHRcdFx0XHQvLyBUb2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lc1xuXHRcdFx0XHRpID0gMDtcblx0XHRcdFx0c2VsZiA9IGpRdWVyeSggdGhpcyApO1xuXHRcdFx0XHRjbGFzc05hbWVzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRcdFx0d2hpbGUgKCAoIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkrKyBdICkgKSB7XG5cblx0XHRcdFx0XHQvLyBDaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3Rcblx0XHRcdFx0XHRpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNlbGYuYWRkQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBUb2dnbGUgd2hvbGUgY2xhc3MgbmFtZVxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdFx0Y2xhc3NOYW1lID0gZ2V0Q2xhc3MoIHRoaXMgKTtcblx0XHRcdFx0aWYgKCBjbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBjbGFzc05hbWUgaWYgc2V0XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiwgY2xhc3NOYW1lICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCBgZmFsc2VgLFxuXHRcdFx0XHQvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLlxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLFxuXHRcdFx0XHQvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG5cdFx0XHRcdGlmICggdGhpcy5zZXRBdHRyaWJ1dGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIixcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0XHRcdFx0XCJcIiA6XG5cdFx0XHRcdFx0XHRkYXRhUHJpdi5nZXQoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiICkgfHwgXCJcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0aGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgY2xhc3NOYW1lLCBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRjbGFzc05hbWUgPSBcIiBcIiArIHNlbGVjdG9yICsgXCIgXCI7XG5cdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBnZXRDbGFzcyggZWxlbSApICkgKyBcIiBcIiApLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBycmV0dXJuID0gL1xcci9nO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHZhbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0XHRpZiAoIGhvb2tzICYmXG5cdFx0XHRcdFx0XCJnZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBcInZhbHVlXCIgKSApICE9PSB1bmRlZmluZWRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldCA9IGVsZW0udmFsdWU7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlc1xuXHRcdFx0XHRpZiAoIHR5cGVvZiByZXQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldC5yZXBsYWNlKCBycmV0dXJuLCBcIlwiICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXJcblx0XHRcdFx0cmV0dXJuIHJldCA9PSBudWxsID8gXCJcIiA6IHJldDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhbHVlSXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdHZhciB2YWw7XG5cblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHZhbHVlSXNGdW5jdGlvbiApIHtcblx0XHRcdFx0dmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgalF1ZXJ5KCB0aGlzICkudmFsKCkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyBcIlwiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR2YWwgPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWwgKz
461840gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHZhbCA9IGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIjtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmdcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoIFwic2V0XCIgaW4gaG9va3MgKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgXCJ2YWx1ZVwiICkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbDtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHR2YWxIb29rczoge1xuXHRcdG9wdGlvbjoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHR2YXIgdmFsID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ2YWx1ZVwiICk7XG5cdFx0XHRcdHJldHVybiB2YWwgIT0gbnVsbCA/XG5cdFx0XHRcdFx0dmFsIDpcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSBvbmx5XG5cdFx0XHRcdFx0Ly8gb3B0aW9uLnRleHQgdGhyb3dzIGV4Y2VwdGlvbnMgKCMxNDY4NiwgIzE0ODU4KVxuXHRcdFx0XHRcdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlXG5cdFx0XHRcdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jc3RyaXAtYW5kLWNvbGxhcHNlLXdoaXRlc3BhY2Vcblx0XHRcdFx0XHRzdHJpcEFuZENvbGxhcHNlKCBqUXVlcnkudGV4dCggZWxlbSApICk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRzZWxlY3Q6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciB2YWx1ZSwgb3B0aW9uLCBpLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0aW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsXG5cdFx0XHRcdFx0b25lID0gZWxlbS50eXBlID09PSBcInNlbGVjdC1vbmVcIixcblx0XHRcdFx0XHR2YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sXG5cdFx0XHRcdFx0bWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0aWYgKCBpbmRleCA8IDAgKSB7XG5cdFx0XHRcdFx0aSA9IG1heDtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGkgPSBvbmUgPyBpbmRleCA6IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zXG5cdFx0XHRcdGZvciAoIDsgaSA8IG1heDsgaSsrICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0Ly8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpXG5cdFx0XHRcdFx0aWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmXG5cblx0XHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0XHRcdFx0XHQhb3B0aW9uLmRpc2FibGVkICYmXG5cdFx0XHRcdFx0XHRcdCggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8XG5cdFx0XHRcdFx0XHRcdFx0IW5vZGVOYW1lKCBvcHRpb24ucGFyZW50Tm9kZSwgXCJvcHRncm91cFwiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvblxuXHRcdFx0XHRcdFx0dmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpO1xuXG5cdFx0XHRcdFx0XHQvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0c1xuXHRcdFx0XHRcdFx0aWYgKCBvbmUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXlcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIG9wdGlvblNldCwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0dmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSggdmFsdWUgKSxcblx0XHRcdFx0XHRpID0gb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXG5cdFx0XHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tY29uZC1hc3NpZ24gKi9cblxuXHRcdFx0XHRcdGlmICggb3B0aW9uLnNlbGVjdGVkID1cblx0XHRcdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBqUXVlcnkudmFsSG9va3Mub3B0aW9uLmdldCggb3B0aW9uICksIHZhbHVlcyApID4gLTFcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9wdGlvblNldCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRm9yY2UgYnJvd3NlcnMgdG8gYmVoYXZlIGNvbnNpc3RlbnRseSB3aGVuIG5vbi1tYXRjaGluZyB2YWx1ZSBpcyBzZXRcblx0XHRcdFx0aWYgKCAhb3B0aW9uU2V0ICkge1xuXHRcdFx0XHRcdGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyXG5qUXVlcnkuZWFjaCggWyBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiBdLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRpZiAoIEFycmF
461845LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRpZiAoICFzdXBwb3J0LmNoZWNrT24gKSB7XG5cdFx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0uZ2V0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiApID09PSBudWxsID8gXCJvblwiIDogZWxlbS52YWx1ZTtcblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb25cblxuXG5zdXBwb3J0LmZvY3VzaW4gPSBcIm9uZm9jdXNpblwiIGluIHdpbmRvdztcblxuXG52YXIgcmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sXG5cdHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24oIGUgKSB7XG5cdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0fTtcblxualF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmV2ZW50LCB7XG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7XG5cblx0XHR2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCxcblx0XHRcdGV2ZW50UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLFxuXHRcdFx0dHlwZSA9IGhhc093bi5jYWxsKCBldmVudCwgXCJ0eXBlXCIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCxcblx0XHRcdG5hbWVzcGFjZXMgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwibmFtZXNwYWNlXCIgKSA/IGV2ZW50Lm5hbWVzcGFjZS5zcGxpdCggXCIuXCIgKSA6IFtdO1xuXG5cdFx0Y3VyID0gbGFzdEVsZW1lbnQgPSB0bXAgPSBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDtcblxuXHRcdC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93XG5cdFx0aWYgKCByZm9jdXNNb3JwaC50ZXN0KCB0eXBlICsgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZS5pbmRleE9mKCBcIi5cIiApID4gLTEgKSB7XG5cblx0XHRcdC8vIE5hbWVzcGFjZWQgdHJpZ2dlcjsgY3JlYXRlIGEgcmVnZXhwIHRvIG1hdGNoIGV2ZW50IHR5cGUgaW4gaGFuZGxlKClcblx0XHRcdG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCBcIi5cIiApO1xuXHRcdFx0dHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTtcblx0XHRcdG5hbWVzcGFjZXMuc29ydCgpO1xuXHRcdH1cblx0XHRvbnR5cGUgPSB0eXBlLmluZGV4T2YoIFwiOlwiICkgPCAwICYmIFwib25cIiArIHR5cGU7XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmdcblx0XHRldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdGV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gXCJvYmplY3RcIiAmJiBldmVudCApO1xuXG5cdFx0Ly8gVHJpZ2dlciBiaXRtYXNrOiAmIDEgZm9yIG5hdGl2ZSBoYW5kbGVyczsgJiAyIGZvciBqUXVlcnkgKGFsd2F5cyB0cnVlKVxuXHRcdGV2ZW50LmlzVHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKTtcblx0XHRldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID9cblx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApIDpcblx0XHRcdG51bGw7XG5cblx0XHQvLyBDbGVhbiB1cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWRcblx0XHRldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7XG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZWxlbTtcblx0XHR9XG5cblx0XHQvLyBDbG9uZSBhbnkgaW5jb21pbmcgZGF0YSBhbmQgcHJlcGVuZCB0aGUgZXZlbnQsIGNyZWF0aW5nIHRoZSBoYW5kbGVyIGFyZyBsaXN0XG5cdFx0ZGF0YSA9IGRhdGEgPT0gbnVsbCA/XG5cdFx0XHRbIGV2ZW50IF0gOlxuXHRcdFx0alF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7XG5cblx0XHQvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVzXG5cdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAmJiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpXG5cdFx0Ly8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNClcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdGJ1YmJsZVR5cGUgPSBzcGVjaWFsLmRlbGVnYXRlVHlwZSB8fCB0eXBlO1xuXHRcdFx0aWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHtcblx0XHRcdFx0Y3VyID0gY3VyLnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKCA7IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0dG1wID0gY3VyO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPbmx5IGFkZCB3aW5kb3cgaWYgd2UgZ290IHRvIGRvY3VtZW50IChlLmcuLCBub3QgcGxhaW4gb2JqIG9yIGRldGFjaGVkIERPTSlcblx0XHRcdGlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggdG1wLmRlZmF1bHRWaWV3IHx8IHRtcC5wYXJlbnRXaW5kb3cgfHwgd2luZG93ICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQgcGF0aFxuXHRcdGkgPSAwO1xuXHRcdHd
46184oaWxlICggKCBjdXIgPSBldmVudFBhdGhbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRsYXN0RWxlbWVudCA9IGN1cjtcblx0XHRcdGV2ZW50LnR5cGUgPSBpID4gMSA/XG5cdFx0XHRcdGJ1YmJsZVR5cGUgOlxuXHRcdFx0XHRzcGVjaWFsLmJpbmRUeXBlIHx8IHR5cGU7XG5cblx0XHRcdC8vIGpRdWVyeSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSAoIGRhdGFQcml2LmdldCggY3VyLCBcImV2ZW50c1wiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmXG5cdFx0XHRcdGRhdGFQcml2LmdldCggY3VyLCBcImhhbmRsZVwiICk7XG5cdFx0XHRpZiAoIGhhbmRsZSApIHtcblx0XHRcdFx0aGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTmF0aXZlIGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdO1xuXHRcdFx0aWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkge1xuXHRcdFx0XHRldmVudC5yZXN1bHQgPSBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRldmVudC50eXBlID0gdHlwZTtcblxuXHRcdC8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3dcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXG5cdFx0XHRpZiAoICggIXNwZWNpYWwuX2RlZmF1bHQgfHxcblx0XHRcdFx0c3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiZcblx0XHRcdFx0YWNjZXB0RGF0YSggZWxlbSApICkge1xuXG5cdFx0XHRcdC8vIENhbGwgYSBuYXRpdmUgRE9NIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgZXZlbnQuXG5cdFx0XHRcdC8vIERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgjNjE3MClcblx0XHRcdFx0aWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXG5cdFx0XHRcdFx0dG1wID0gZWxlbVsgb250eXBlIF07XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlO1xuXG5cdFx0XHRcdFx0aWYgKCBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0XHRcdFx0bGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtWyB0eXBlIF0oKTtcblxuXHRcdFx0XHRcdGlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdFx0XHRcdGxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSB0bXA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHQvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmVcblx0Ly8gVXNlZCBvbmx5IGZvciBgZm9jdXMoaW4gfCBvdXQpYCBldmVudHNcblx0c2ltdWxhdGU6IGZ1bmN0aW9uKCB0eXBlLCBlbGVtLCBldmVudCApIHtcblx0XHR2YXIgZSA9IGpRdWVyeS5leHRlbmQoXG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCksXG5cdFx0XHRldmVudCxcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0aXNTaW11bGF0ZWQ6IHRydWVcblx0XHRcdH1cblx0XHQpO1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTtcblx0fVxuXG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7XG5cdFx0fSApO1xuXHR9LFxuXHR0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF07XG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCBlbGVtLCB0cnVlICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cblxuLy8gU3VwcG9ydDogRmlyZWZveCA8PTQ0XG4vLyBGaXJlZm94IGRvZXNuJ3QgaGF2ZSBmb2N1cyhpbiB8IG91dCkgZXZlbnRzXG4vLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96
46184aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4N1xuLy9cbi8vIFN1cHBvcnQ6IENocm9tZSA8PTQ4IC0gNDksIFNhZmFyaSA8PTkuMCAtIDkuMVxuLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsXG4vLyB3aGljaCBpcyBzcGVjIHZpb2xhdGlvbiAtIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWZvY3VzZXZlbnQtZXZlbnQtb3JkZXJcbi8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ5ODU3XG5pZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7XG5cdGpRdWVyeS5lYWNoKCB7IGZvY3VzOiBcImZvY3VzaW5cIiwgYmx1cjogXCJmb2N1c291dFwiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cblx0XHQvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRvY3VtZW50IHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dFxuXHRcdHZhciBoYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKSApO1xuXHRcdH07XG5cblx0XHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7XG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsICggYXR0YWNoZXMgfHwgMCApICsgMSApO1xuXHRcdFx0fSxcblx0XHRcdHRlYXJkb3duOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRcdGF0dGFjaGVzID0gZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCApIC0gMTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZG9jLCBmaXggKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsIGF0dGFjaGVzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9ICk7XG59XG52YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247XG5cbnZhciBub25jZSA9IERhdGUubm93KCk7XG5cbnZhciBycXVlcnkgPSAoIC9cXD8vICk7XG5cblxuXG4vLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nXG5qUXVlcnkucGFyc2VYTUwgPSBmdW5jdGlvbiggZGF0YSApIHtcblx0dmFyIHhtbDtcblx0aWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdC8vIElFIHRocm93cyBvbiBwYXJzZUZyb21TdHJpbmcgd2l0aCBpbnZhbGlkIGlucHV0LlxuXHR0cnkge1xuXHRcdHhtbCA9ICggbmV3IHdpbmRvdy5ET01QYXJzZXIoKSApLnBhcnNlRnJvbVN0cmluZyggZGF0YSwgXCJ0ZXh0L3htbFwiICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHhtbCA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdGlmICggIXhtbCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwicGFyc2VyZXJyb3JcIiApLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgZGF0YSApO1xuXHR9XG5cdHJldHVybiB4bWw7XG59O1xuXG5cbnZhclxuXHRyYnJhY2tldCA9IC9cXFtcXF0kLyxcblx0ckNSTEYgPSAvXFxyP1xcbi9nLFxuXHRyc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksXG5cdHJzdWJtaXR0YWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtcblxuZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkge1xuXHR2YXIgbmFtZTtcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIG9iaiApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIGFycmF5IGl0ZW0uXG5cdFx0alF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7XG5cdFx0XHRpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkge1xuXG5cdFx0XHRcdC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci5cblx0XHRcdFx0YWRkKCBwcmVmaXgsIHYgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBJdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVtZXJpYyBpbmRleC5cblx0XHRcdFx0YnVpbGRQYXJhbXMoXG5cdFx0XHRcdFx0cHJlZml4ICsgXCJbXCIgKyAoIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT0gbnVsbCA/IGkgOiBcIlwiICkgKyBcIl1cIixcblx0XHRcdFx0XHR2LFxuXHRcdFx0XHRcdHRyYWRpdGlvbmFsLFxuXHRcdFx0XHRcdGFkZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblxuXHR9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArIG5hbWUgKyBcIl1cIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS5cblx0XHRhZGQoIHByZWZpeCwgb2JqICk7XG5cdH1cbn1cblxuLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2Zcbi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZ1xualF1ZXJ5LnBhcmFtID0gZnVuY3Rpb24oIGEsIHRyYWRpdGlvbmFsICkge1xuXHR2YXIgcHJlZml4LFxuXHRcdHMgPSBbXSxcblx0XHRhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7XG5cblx0XHRcdC8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgdXNlIGl0cyByZXR1cm4gdmFsdWVcblx0XHRcdHZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID9cblx0XHRcdFx0dmFsdWVPckZ1bmN0aW9uKCkgOlxuXHRcdFx0XHR2YWx1ZU9yRnVuY3Rpb247XG5cblx0XHRcdHNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgXCI9XCIgK1xuXHRcdFx0XHRlbmNvZGVVUklDb21wb25lbnQoIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKTtcblx0XHR9O1xuXG5cdC8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuXG5cdGlmICggQXJyYXkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50c1xuXHRcdGpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHtcblx0XHRcdGFkZCggdGhpcy5uYW1lLCB0aGlzLnZhbHVlICk7XG5cdFx0fSApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSBcIm9sZFwiIHdheSAodGhlIHdheSAxLjMuMiBvciBvbGRlclxuXHRcdC8vIGRpZCBpdCksIG90aGVyd2lzZSBlbmNvZGUgcGFyYW1zIHJlY3Vyc2l2ZWx5LlxuXHRcdGZvciAoIHByZWZpeCBpbiBhICkge1xuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCwgYVsgcHJlZml4IF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uXG5cdHJldHVybi
46184BzLmpvaW4oIFwiJlwiICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxpemVBcnJheSgpICk7XG5cdH0sXG5cdHNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBDYW4gYWRkIHByb3BIb29rIGZvciBcImVsZW1lbnRzXCIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzXG5cdFx0XHR2YXIgZWxlbWVudHMgPSBqUXVlcnkucHJvcCggdGhpcywgXCJlbGVtZW50c1wiICk7XG5cdFx0XHRyZXR1cm4gZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KCBlbGVtZW50cyApIDogdGhpcztcblx0XHR9IClcblx0XHQuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0XHQvLyBVc2UgLmlzKCBcIjpkaXNhYmxlZFwiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3Ncblx0XHRcdHJldHVybiB0aGlzLm5hbWUgJiYgIWpRdWVyeSggdGhpcyApLmlzKCBcIjpkaXNhYmxlZFwiICkgJiZcblx0XHRcdFx0cnN1Ym1pdHRhYmxlLnRlc3QoIHRoaXMubm9kZU5hbWUgKSAmJiAhcnN1Ym1pdHRlclR5cGVzLnRlc3QoIHR5cGUgKSAmJlxuXHRcdFx0XHQoIHRoaXMuY2hlY2tlZCB8fCAhcmNoZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7XG5cdFx0fSApXG5cdFx0Lm1hcCggZnVuY3Rpb24oIGksIGVsZW0gKSB7XG5cdFx0XHR2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7XG5cblx0XHRcdGlmICggdmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHR9ICkuZ2V0KCk7XG5cdH1cbn0gKTtcblxuXG52YXJcblx0cjIwID0gLyUyMC9nLFxuXHRyaGFzaCA9IC8jLiokLyxcblx0cmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLyxcblx0cmhlYWRlcnMgPSAvXiguKj8pOlsgXFx0XSooW15cXHJcXG5dKikkL21nLFxuXG5cdC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvblxuXHRybG9jYWxQcm90b2NvbCA9IC9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFxuXHRybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLyxcblx0cnByb3RvY29sID0gL15cXC9cXC8vLFxuXG5cdC8qIFByZWZpbHRlcnNcblx0ICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSlcblx0ICogMikgVGhlc2UgYXJlIGNhbGxlZDpcblx0ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydFxuXHQgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpXG5cdCAqIDMpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0cHJlZmlsdGVycyA9IHt9LFxuXG5cdC8qIFRyYW5zcG9ydHMgYmluZGluZ3Ncblx0ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0dHJhbnNwb3J0cyA9IHt9LFxuXG5cdC8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gQW5jaG9yIHRhZyBmb3IgcGFyc2luZyB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cdG9yaWdpbkFuY2hvci5ocmVmID0gbG9jYXRpb24uaHJlZjtcblxuLy8gQmFzZSBcImNvbnN0cnVjdG9yXCIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydFxuZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7XG5cblx0Ly8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcIipcIlxuXHRyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHtcblxuXHRcdGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247XG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcblx0XHR9XG5cblx0XHR2YXIgZGF0YVR5cGUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHtcblxuXHRcdFx0Ly8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvblxuXHRcdFx0d2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkXG5cdFx0XHRcdGlmICggZGF0YVR5cGVbIDAgXSA9PT0gXCIrXCIgKSB7XG5cdFx0XHRcdFx0ZGF0YVR5cGUgPSBkYXRhV
46184HlwZS5zbGljZSggMSApIHx8IFwiKlwiO1xuXHRcdFx0XHRcdCggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBhcHBlbmRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnB1c2goIGZ1bmMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXG5mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkge1xuXG5cdHZhciBpbnNwZWN0ZWQgPSB7fSxcblx0XHRzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTtcblxuXHRmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHtcblx0XHR2YXIgc2VsZWN0ZWQ7XG5cdFx0aW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTtcblx0XHRqUXVlcnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJlZmlsdGVyT3JGYWN0b3J5ICkge1xuXHRcdFx0dmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcblx0XHRcdGlmICggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBdICkge1xuXG5cdFx0XHRcdG9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0aW5zcGVjdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKCBzZWVraW5nVHJhbnNwb3J0ICkge1xuXHRcdFx0XHRyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgXCIqXCIgXSAmJiBpbnNwZWN0KCBcIipcIiApO1xufVxuXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcbi8vIHRoYXQgdGFrZXMgXCJmbGF0XCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpXG4vLyBGaXhlcyAjOTg4N1xuZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7XG5cdHZhciBrZXksIGRlZXAsXG5cdFx0ZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zIHx8IHt9O1xuXG5cdGZvciAoIGtleSBpbiBzcmMgKSB7XG5cdFx0aWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHQoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdO1xuXHRcdH1cblx0fVxuXHRpZiAoIGRlZXAgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdHJ1ZSwgdGFyZ2V0LCBkZWVwICk7XG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6XG4gKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKVxuICogLSByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7XG5cblx0dmFyIGN0LCB0eXBlLCBmaW5hbERhdGFUeXBlLCBmaXJzdERhdGFUeXBlLFxuXHRcdGNvbnRlbnRzID0gcy5jb250ZW50cyxcblx0XHRkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcztcblxuXHQvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2Vzc1xuXHR3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSBcIipcIiApIHtcblx0XHRkYXRhVHlwZXMuc2hpZnQoKTtcblx0XHRpZiAoIGN0ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRjdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGVcblx0aWYgKCBjdCApIHtcblx0XHRmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkge1xuXHRcdFx0aWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSApIHtcblx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlXG5cdGlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkge1xuXHRcdGZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTtcblx0fSBlbHNlIHtcblxuXHRcdC8vIFRyeSBjb252ZXJ0aWJsZSBkYXRhVHlwZXNcblx0XHRmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHtcblx0XHRcdGlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArIFwiIFwiICsgZGF0YVR5cGVzWyAwIF0gXSApIHtcblx0XHRcdFx0ZmluYWxEYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAhZmlyc3REYXRhVHlwZSApIHtcblx0XHRcdFx0Zmlyc3REYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gT3IganVzdCB1c2UgZmlyc3Qgb25lXG5cdFx0ZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTtcblx0fVxuXG5cdC8vIElmIHdlIGZvdW5kIGEgZGF0YVR5cGVcblx0Ly8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWRcblx0Ly8gYW5kIHJldHVybi
46184B0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuXHRpZiAoIGZpbmFsRGF0YVR5cGUgKSB7XG5cdFx0aWYgKCBmaW5hbERhdGFUeXBlICE9PSBkYXRhVHlwZXNbIDAgXSApIHtcblx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7XG5cdFx0fVxuXHRcdHJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTtcblx0fVxufVxuXG4vKiBDaGFpbiBjb252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlXG4gKiBBbHNvIHNldHMgdGhlIHJlc3BvbnNlWFhYIGZpZWxkcyBvbiB0aGUganFYSFIgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICkge1xuXHR2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldixcblx0XHRjb252ZXJ0ZXJzID0ge30sXG5cblx0XHQvLyBXb3JrIHdpdGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBjb252ZXJzaW9uXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKTtcblxuXHQvLyBDcmVhdGUgY29udmVydGVycyBtYXAgd2l0aCBsb3dlcmNhc2VkIGtleXNcblx0aWYgKCBkYXRhVHlwZXNbIDEgXSApIHtcblx0XHRmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHtcblx0XHRcdGNvbnZlcnRlcnNbIGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252ZXJ0ZXJzWyBjb252IF07XG5cdFx0fVxuXHR9XG5cblx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdC8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlXG5cdHdoaWxlICggY3VycmVudCApIHtcblxuXHRcdGlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkge1xuXHRcdFx0anFYSFJbIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSBdID0gcmVzcG9uc2U7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWRcblx0XHRpZiAoICFwcmV2ICYmIGlzU3VjY2VzcyAmJiBzLmRhdGFGaWx0ZXIgKSB7XG5cdFx0XHRyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTtcblx0XHR9XG5cblx0XHRwcmV2ID0gY3VycmVudDtcblx0XHRjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7XG5cblx0XHRpZiAoIGN1cnJlbnQgKSB7XG5cblx0XHRcdC8vIFRoZXJlJ3Mgb25seSB3b3JrIHRvIGRvIGlmIGN1cnJlbnQgZGF0YVR5cGUgaXMgbm9uLWF1dG9cblx0XHRcdGlmICggY3VycmVudCA9PT0gXCIqXCIgKSB7XG5cblx0XHRcdFx0Y3VycmVudCA9IHByZXY7XG5cblx0XHRcdC8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnRcblx0XHRcdH0gZWxzZSBpZiAoIHByZXYgIT09IFwiKlwiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXJcblx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIGN1cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyBcIiogXCIgKyBjdXJyZW50IF07XG5cblx0XHRcdFx0Ly8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXJcblx0XHRcdFx0aWYgKCAhY29udiApIHtcblx0XHRcdFx0XHRmb3IgKCBjb252MiBpbiBjb252ZXJ0ZXJzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBJZiBjb252MiBvdXRwdXRzIGN1cnJlbnRcblx0XHRcdFx0XHRcdHRtcCA9IGNvbnYyLnNwbGl0KCBcIiBcIiApO1xuXHRcdFx0XHRcdFx0aWYgKCB0bXBbIDEgXSA9PT0gY3VycmVudCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBJZiBwcmV2IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYWNjZXB0ZWQgaW5wdXRcblx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIHRtcFsgMCBdIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJzWyBcIiogXCIgKyB0bXBbIDAgXSBdO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJzXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjb252ID09PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIGluc2VydCB0aGUgaW50ZXJtZWRpYXRlIGRhdGFUeXBlXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggY29udmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnQgPSB0bXBbIDAgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFwcGx5IGNvbnZlcnRlciAoaWYgbm90IGFuIGVxdWl2YWxlbmNlKVxuXHRcdFx0XHRpZiAoIGNvbnYgIT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHQvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1YmJsZSwgY2F0Y2ggYW5kIHJldHVybiB0aGVtXG5cdFx0XHRcdFx0aWYgKCBjb252ICYmIHMudGhyb3dzICkge1xuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZTogXCJwYXJzZXJlcnJvclwiLFxuXHRcdFx0XHRcdFx0XHRcdGVycm9yOiBjb252ID8gZSA6IFwiTm8gY29udmVyc2lvbiBmcm9tIFwiICsgcHJldiArIFwiIHRvIFwiICsgY3VycmVudFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybi
46184B7IHN0YXRlOiBcInN1Y2Nlc3NcIiwgZGF0YTogcmVzcG9uc2UgfTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIENvdW50ZXIgZm9yIGhvbGRpbmcgdGhlIG51bWJlciBvZiBhY3RpdmUgcXVlcmllc1xuXHRhY3RpdmU6IDAsXG5cblx0Ly8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdFxuXHRsYXN0TW9kaWZpZWQ6IHt9LFxuXHRldGFnOiB7fSxcblxuXHRhamF4U2V0dGluZ3M6IHtcblx0XHR1cmw6IGxvY2F0aW9uLmhyZWYsXG5cdFx0dHlwZTogXCJHRVRcIixcblx0XHRpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBsb2NhdGlvbi5wcm90b2NvbCApLFxuXHRcdGdsb2JhbDogdHJ1ZSxcblx0XHRwcm9jZXNzRGF0YTogdHJ1ZSxcblx0XHRhc3luYzogdHJ1ZSxcblx0XHRjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLThcIixcblxuXHRcdC8qXG5cdFx0dGltZW91dDogMCxcblx0XHRkYXRhOiBudWxsLFxuXHRcdGRhdGFUeXBlOiBudWxsLFxuXHRcdHVzZXJuYW1lOiBudWxsLFxuXHRcdHBhc3N3b3JkOiBudWxsLFxuXHRcdGNhY2hlOiBudWxsLFxuXHRcdHRocm93czogZmFsc2UsXG5cdFx0dHJhZGl0aW9uYWw6IGZhbHNlLFxuXHRcdGhlYWRlcnM6IHt9LFxuXHRcdCovXG5cblx0XHRhY2NlcHRzOiB7XG5cdFx0XHRcIipcIjogYWxsVHlwZXMsXG5cdFx0XHR0ZXh0OiBcInRleHQvcGxhaW5cIixcblx0XHRcdGh0bWw6IFwidGV4dC9odG1sXCIsXG5cdFx0XHR4bWw6IFwiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbFwiLFxuXHRcdFx0anNvbjogXCJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHRcIlxuXHRcdH0sXG5cblx0XHRjb250ZW50czoge1xuXHRcdFx0eG1sOiAvXFxieG1sXFxiLyxcblx0XHRcdGh0bWw6IC9cXGJodG1sLyxcblx0XHRcdGpzb246IC9cXGJqc29uXFxiL1xuXHRcdH0sXG5cblx0XHRyZXNwb25zZUZpZWxkczoge1xuXHRcdFx0eG1sOiBcInJlc3BvbnNlWE1MXCIsXG5cdFx0XHR0ZXh0OiBcInJlc3BvbnNlVGV4dFwiLFxuXHRcdFx0anNvbjogXCJyZXNwb25zZUpTT05cIlxuXHRcdH0sXG5cblx0XHQvLyBEYXRhIGNvbnZlcnRlcnNcblx0XHQvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgXCIqXCIpIGFuZCBkZXN0aW5hdGlvbiB0eXBlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXG5cdFx0Y29udmVydGVyczoge1xuXG5cdFx0XHQvLyBDb252ZXJ0IGFueXRoaW5nIHRvIHRleHRcblx0XHRcdFwiKiB0ZXh0XCI6IFN0cmluZyxcblxuXHRcdFx0Ly8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pXG5cdFx0XHRcInRleHQgaHRtbFwiOiB0cnVlLFxuXG5cdFx0XHQvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uXG5cdFx0XHRcInRleHQganNvblwiOiBKU09OLnBhcnNlLFxuXG5cdFx0XHQvLyBQYXJzZSB0ZXh0IGFzIHhtbFxuXHRcdFx0XCJ0ZXh0IHhtbFwiOiBqUXVlcnkucGFyc2VYTUxcblx0XHR9LFxuXG5cdFx0Ly8gRm9yIG9wdGlvbnMgdGhhdCBzaG91bGRuJ3QgYmUgZGVlcCBleHRlbmRlZDpcblx0XHQvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmXG5cdFx0Ly8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmVcblx0XHQvLyBkZWVwIGV4dGVuZGVkIChzZWUgYWpheEV4dGVuZClcblx0XHRmbGF0T3B0aW9uczoge1xuXHRcdFx0dXJsOiB0cnVlLFxuXHRcdFx0Y29udGV4dDogdHJ1ZVxuXHRcdH1cblx0fSxcblxuXHQvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldFxuXHQvLyB3aXRoIGJvdGggYWpheFNldHRpbmdzIGFuZCBzZXR0aW5ncyBmaWVsZHMuXG5cdC8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuXG5cdGFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzID9cblxuXHRcdFx0Ly8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmplY3Rcblx0XHRcdGFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDpcblxuXHRcdFx0Ly8gRXh0ZW5kaW5nIGFqYXhTZXR0aW5nc1xuXHRcdFx0YWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7XG5cdH0sXG5cblx0YWpheFByZWZpbHRlcjogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzICksXG5cdGFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cyApLFxuXG5cdC8vIE1haW4gbWV0aG9kXG5cdGFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBJZiB1cmwgaXMgYW4gb2JqZWN0LCBzaW11bGF0ZSBwcmUtMS41IHNpZ25hdHVyZVxuXHRcdGlmICggdHlwZW9mIHVybCA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdG9wdGlvbnMgPSB1cmw7XG5cdFx0XHR1cmwgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3Rcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdHZhciB0cmFuc3BvcnQsXG5cblx0XHRcdC8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW1cblx0XHRcdGNhY2hlVVJMLFxuXG5cdFx0XHQvLyBSZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcsXG5cdFx0XHRyZXNwb25zZUhlYWRlcnMsXG5cblx0XHRcdC8vIHRpbWVvdXQgaGFuZGxlXG5cdFx0XHR0aW1lb3V0VGltZXIsXG5cblx0XHRcdC8vIFVybCBjbGVhbnVwIHZhclxuXHRcdFx0dXJsQW5jaG9yLFxuXG5cdFx0XHQvLyBSZXF1ZXN0IHN0YXRlIChiZWNvbWVzIGZhbHNlIHVwb24gc2VuZCBhbmQgdHJ1ZSB1cG9uIGNvbXBsZXRpb24pXG5cdFx0XHRjb21wbGV0ZWQsXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZFxuXHRcdFx0ZmlyZUdsb2JhbHMsXG5cblx0XHRcdC8vIExvb3AgdmFyaWFibGVcblx0XHRcdGksXG5cblx0XHRcdC8vIHVuY2FjaGVkIHBhcnQgb2YgdGhlIHVybFxuXHRcdFx0dW5jYWNoZWQsXG5cblx0XHRcdC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3Rcblx0XHRcdHMgPSBqUXVlcnkuYWpheFNldHVwKCB7fSwgb3B0aW9ucyApLFxuXG5cdFx0XHQvLyBDYWxsYmFja3MgY29udGV4dFxuXHRcdFx0Y2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsXG5cblx0XHRcdC8vIENvbnRleHQgZm9yIGdsb2JhbCBldmVudHMgaXMgY2FsbGJhY2tDb250ZXh0IGlmIGl0IGlzIGEgRE9NIG5vZGUgb3IgalF1ZXJ5IGNvbGxlY3Rpb25cblx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dCA9IHMuY29udGV4dCAmJlxuXHRcdFx0XHQoIGNhbGxiYWNrQ29udGV4dC5ub2RlVHlwZSB8fCBjYWxsYmFja0NvbnRleHQuanF1ZXJ5ICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggY2FsbGJhY2tDb250ZXh0ICkgOlxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudCxcblxuXHRcdFx0Ly8gRGVmZXJyZWRzXG5cdFx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcblxuXHRcdFx0Ly8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSlcblx0XHRcdHJlcXVlc3RIZWFkZXJzID0ge30sXG5cdFx0XHRyZXF1
46184ZXN0SGVhZGVyc05hbWVzID0ge30sXG5cblx0XHRcdC8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZVxuXHRcdFx0c3RyQWJvcnQgPSBcImNhbmNlbGVkXCIsXG5cblx0XHRcdC8vIEZha2UgeGhyXG5cdFx0XHRqcVhIUiA9IHtcblx0XHRcdFx0cmVhZHlTdGF0ZTogMCxcblxuXHRcdFx0XHQvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkXG5cdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdFx0XHRcdHZhciBtYXRjaDtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0XHRcdGlmICggIXJlc3BvbnNlSGVhZGVycyApIHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzID0ge307XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgXSA9IG1hdGNoWyAyIF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXG5cdFx0XHRcdGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FjaGVzIHRoZSBoZWFkZXJcblx0XHRcdFx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkID09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRuYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gPVxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fCBuYW1lO1xuXHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlclxuXHRcdFx0XHRvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0cy5taW1lVHlwZSA9IHR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRcdHN0YXR1c0NvZGU6IGZ1bmN0aW9uKCBtYXAgKSB7XG5cdFx0XHRcdFx0dmFyIGNvZGU7XG5cdFx0XHRcdFx0aWYgKCBtYXAgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3Ncblx0XHRcdFx0XHRcdFx0anFYSFIuYWx3YXlzKCBtYXBbIGpxWEhSLnN0YXR1cyBdICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzXG5cdFx0XHRcdFx0XHRcdGZvciAoIGNvZGUgaW4gbWFwICkge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXR1c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhbmNlbCB0aGUgcmVxdWVzdFxuXHRcdFx0XHRhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0dmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7XG5cdFx0XHRcdFx0aWYgKCB0cmFuc3BvcnQgKSB7XG5cdFx0XHRcdFx0XHR0cmFuc3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkb25lKCAwLCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdC8vIEF0dGFjaCBkZWZlcnJlZHNcblx0XHRkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApO1xuXG5cdFx0Ly8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpXG5cdFx0Ly8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSlcblx0XHQvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGVcblx0XHRzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgbG9jYXRpb24uaHJlZiApICsgXCJcIiApXG5cdFx0XHQucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiApO1xuXG5cdFx0Ly8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0XG5cdFx0cy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTtcblxuXHRcdC8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3Rcblx0XHRzLmRhdGFUeXBlcyA9ICggcy5kYXRhV
46184HlwZSB8fCBcIipcIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbIFwiXCIgXTtcblxuXHRcdC8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUgb3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLlxuXHRcdGlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkge1xuXHRcdFx0dXJsQW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJhXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IC0gMTEsIEVkZ2UgMTIgLSAxNVxuXHRcdFx0Ly8gSUUgdGhyb3dzIGV4Y2VwdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIGhyZWYgcHJvcGVydHkgaWYgdXJsIGlzIG1hbGZvcm1lZCxcblx0XHRcdC8vIGUuZy4gaHR0cDovL2V4YW1wbGUuY29tOjgweC9cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gcy51cmw7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IC0gMTEgb25seVxuXHRcdFx0XHQvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZVxuXHRcdFx0XHR1cmxBbmNob3IuaHJlZiA9IHVybEFuY2hvci5ocmVmO1xuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gb3JpZ2luQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09XG5cdFx0XHRcdFx0dXJsQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgdXJsQW5jaG9yLmhvc3Q7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbixcblx0XHRcdFx0Ly8gaXQgY2FuIGJlIHJlamVjdGVkIGJ5IHRoZSB0cmFuc3BvcnQgaWYgaXQgaXMgaW52YWxpZFxuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmdcblx0XHRpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHByZWZpbHRlcnNcblx0XHRpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBzdG9wIHRoZXJlXG5cdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0fVxuXG5cdFx0Ly8gV2UgY2FuIGZpcmUgZ2xvYmFsIGV2ZW50cyBhcyBvZiBub3cgaWYgYXNrZWQgdG9cblx0XHQvLyBEb24ndCBmaXJlIGV2ZW50cyBpZiBqUXVlcnkuZXZlbnQgaXMgdW5kZWZpbmVkIGluIGFuIEFNRC11c2FnZSBzY2VuYXJpbyAoIzE1MTE4KVxuXHRcdGZpcmVHbG9iYWxzID0galF1ZXJ5LmV2ZW50ICYmIHMuZ2xvYmFsO1xuXG5cdFx0Ly8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0c1xuXHRcdGlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0YXJ0XCIgKTtcblx0XHR9XG5cblx0XHQvLyBVcHBlcmNhc2UgdGhlIHR5cGVcblx0XHRzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTtcblxuXHRcdC8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50XG5cdFx0cy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7XG5cblx0XHQvLyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQtU2luY2Vcblx0XHQvLyBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIgbGF0ZXIgb25cblx0XHQvLyBSZW1vdmUgaGFzaCB0byBzaW1wbGlmeSB1cmwgbWFuaXB1bGF0aW9uXG5cdFx0Y2FjaGVVUkwgPSBzLnVybC5yZXBsYWNlKCByaGFzaCwgXCJcIiApO1xuXG5cdFx0Ly8gTW9yZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1ZXN0cyB3aXRoIG5vIGNvbnRlbnRcblx0XHRpZiAoICFzLmhhc0NvbnRlbnQgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBoYXNoIHNvIHdlIGNhbiBwdXQgaXQgYmFja1xuXHRcdFx0dW5jYWNoZWQgPSBzLnVybC5zbGljZSggY2FjaGVVUkwubGVuZ3RoICk7XG5cblx0XHRcdC8vIElmIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCBzaG91bGQgYmUgcHJvY2Vzc2VkLCBhcHBlbmQgZGF0YSB0byB1cmxcblx0XHRcdGlmICggcy5kYXRhICYmICggcy5wcm9jZXNzRGF0YSB8fCB0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICkgKSB7XG5cdFx0XHRcdGNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGE7XG5cblx0XHRcdFx0Ly8gIzk2ODI6IHJlbW92ZSBkYXRhIHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeVxuXHRcdFx0XHRkZWxldGUgcy5kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgb3IgdXBkYXRlIGFudGktY2FjaGUgcGFyYW0gaWYgbmVlZGVkXG5cdFx0XHRpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRjYWNoZVVSTCA9IGNhY2hlVVJMLnJlcGxhY2UoIHJhbnRpQ2FjaGUsIFwiJDFcIiApO1xuXHRcdFx0XHR1bmNhY2hlZCA9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBcIl89XCIgKyAoIG5vbmNlKysgKSArIHVuY2FjaGVkO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQdXQgaGFzaCBhbmQgYW50aS1jYWNoZSBvbiB0aGUgVVJMIHRoYXQgd2lsbCBiZSByZXF1ZXN0ZWQgKGdoLTE3MzIpXG5cdFx0XHRzLnVybCA9IGNhY2hlVVJMICsgdW5jYWNoZWQ7XG5cblx0XHQvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OClcblx0XHR9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJlxuXHRcdFx0KCBzLmNvbnRlbn
46184RUeXBlIHx8IFwiXCIgKS5pbmRleE9mKCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiICkgPT09IDAgKSB7XG5cdFx0XHRzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCBcIitcIiApO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTW9kaWZpZWQtU2luY2VcIiwgalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Ob25lLU1hdGNoXCIsIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50XG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiLCBzLmNvbnRlbnRUeXBlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZVxuXHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoXG5cdFx0XHRcIkFjY2VwdFwiLFxuXHRcdFx0cy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/XG5cdFx0XHRcdHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdICtcblx0XHRcdFx0XHQoIHMuZGF0YVR5cGVzWyAwIF0gIT09IFwiKlwiID8gXCIsIFwiICsgYWxsVHlwZXMgKyBcIjsgcT0wLjAxXCIgOiBcIlwiICkgOlxuXHRcdFx0XHRzLmFjY2VwdHNbIFwiKlwiIF1cblx0XHQpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uXG5cdFx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnRcblx0XHRpZiAoIHMuYmVmb3JlU2VuZCAmJlxuXHRcdFx0KCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuXG5cdFx0XHRyZXR1cm4ganFYSFIuYWJvcnQoKTtcblx0XHR9XG5cblx0XHQvLyBBYm9ydGluZyBpcyBubyBsb25nZXIgYSBjYW5jZWxsYXRpb25cblx0XHRzdHJBYm9ydCA9IFwiYWJvcnRcIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tzIG9uIGRlZmVycmVkc1xuXHRcdGNvbXBsZXRlRGVmZXJyZWQuYWRkKCBzLmNvbXBsZXRlICk7XG5cdFx0anFYSFIuZG9uZSggcy5zdWNjZXNzICk7XG5cdFx0anFYSFIuZmFpbCggcy5lcnJvciApO1xuXG5cdFx0Ly8gR2V0IHRyYW5zcG9ydFxuXHRcdHRyYW5zcG9ydCA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0XG5cdFx0aWYgKCAhdHJhbnNwb3J0ICkge1xuXHRcdFx0ZG9uZSggLTEsIFwiTm8gVHJhbnNwb3J0XCIgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IDE7XG5cblx0XHRcdC8vIFNlbmQgZ2xvYmFsIGV2ZW50XG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4U2VuZFwiLCBbIGpxWEhSLCBzIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYWpheFNlbmQsIHN0b3AgdGhlcmVcblx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRpbWVvdXRcblx0XHRcdGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkge1xuXHRcdFx0XHR0aW1lb3V0VGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0anFYSFIuYWJvcnQoIFwidGltZW91dFwiICk7XG5cdFx0XHRcdH0sIHMudGltZW91dCApO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb21wbGV0ZWQgPSBmYWxzZTtcblx0XHRcdFx0dHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBSZXRocm93IHBvc3QtY29tcGxldGlvbiBleGNlcHRpb25zXG5cdFx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHNcblx0XHRcdFx0ZG9uZSggLTEsIGUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmVcblx0XHRmdW5jdGlvbiBkb25lKCBzdGF0dXMsIG5hdGl2ZVN0YXR1c1RleHQsIHJlc3BvbnNlcywgaGVhZGVycyApIHtcblx0XHRcdHZhciBpc1N1Y2Nlc3MsIHN1Y2Nlc3MsIGVycm9yLCByZXNwb25zZSwgbW9kaWZpZWQsXG5cdFx0XHRcdHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0O1xuXG5cdFx0XHQvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zXG5cdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb21wbGV0ZWQgPSB0cnVlO1xuXG5cdFx0XHQvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0c1xuXHRcdFx0aWYgKCB0aW1lb3V0VGltZXIgKSB7XG5cdFx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXRUaW
461841lciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvblxuXHRcdFx0Ly8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZClcblx0XHRcdHRyYW5zcG9ydCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0Ly8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTZXQgcmVhZHlTdGF0ZVxuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDtcblxuXHRcdFx0Ly8gRGV0ZXJtaW5lIGlmIHN1Y2Nlc3NmdWxcblx0XHRcdGlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0O1xuXG5cdFx0XHQvLyBHZXQgcmVzcG9uc2UgZGF0YVxuXHRcdFx0aWYgKCByZXNwb25zZXMgKSB7XG5cdFx0XHRcdHJlc3BvbnNlID0gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb252ZXJ0IG5vIG1hdHRlciB3aGF0ICh0aGF0IHdheSByZXNwb25zZVhYWCBmaWVsZHMgYXJlIGFsd2F5cyBzZXQpXG5cdFx0XHRyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApO1xuXG5cdFx0XHQvLyBJZiBzdWNjZXNzZnVsLCBoYW5kbGUgdHlwZSBjaGFpbmluZ1xuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cblx0XHRcdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRcdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJMYXN0LU1vZGlmaWVkXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcImV0YWdcIiApO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGlmIG5vIGNvbnRlbnRcblx0XHRcdFx0aWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09IFwiSEVBRFwiICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vY29udGVudFwiO1xuXG5cdFx0XHRcdC8vIGlmIG5vdCBtb2RpZmllZFxuXHRcdFx0XHR9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub3Rtb2RpZmllZFwiO1xuXG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0ZTtcblx0XHRcdFx0XHRzdWNjZXNzID0gcmVzcG9uc2UuZGF0YTtcblx0XHRcdFx0XHRlcnJvciA9IHJlc3BvbnNlLmVycm9yO1xuXHRcdFx0XHRcdGlzU3VjY2VzcyA9ICFlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBFeHRyYWN0IGVycm9yIGZyb20gc3RhdHVzVGV4dCBhbmQgbm9ybWFsaXplIGZvciBub24tYWJvcnRzXG5cdFx0XHRcdGVycm9yID0gc3RhdHVzVGV4dDtcblx0XHRcdFx0aWYgKCBzdGF0dXMgfHwgIXN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwiZXJyb3JcIjtcblx0XHRcdFx0XHRpZiAoIHN0YXR1cyA8IDAgKSB7XG5cdFx0XHRcdFx0XHRzdGF0dXMgPSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdFxuXHRcdFx0anFYSFIuc3RhdHVzID0gc3RhdHVzO1xuXHRcdFx0anFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyBcIlwiO1xuXG5cdFx0XHQvLyBTdWNjZXNzL0Vycm9yXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdGpxWEhSLnN0YXR1c0NvZGUoIHN0YXR1c0NvZGUgKTtcblx0XHRcdHN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBpc1N1Y2Nlc3MgPyBcImFqYXhTdWNjZXNzXCIgOiBcImFqYXhFcnJvclwiLFxuXHRcdFx0XHRcdFsganFYSFIsIHMsIGlzU3VjY2VzcyA/IHN1Y2Nlc3MgOiBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbXBsZXRlXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4Q29tcGxldGVcIiwgWyBqcVhIUiwgcyBdICk7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyXG5cdFx0XHRcdGlmICggISggLS1qUXVlcnkuYWN0aXZlICkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0b3BcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpxWEhSO1xuXHR9LFxuXG5cdGdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybi
46184BqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCBcImpzb25cIiApO1xuXHR9LFxuXG5cdGdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgdW5kZWZpbmVkLCBjYWxsYmFjaywgXCJzY3JpcHRcIiApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiZ2V0XCIsIFwicG9zdFwiIF0sIGZ1bmN0aW9uKCBpLCBtZXRob2QgKSB7XG5cdGpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHtcblxuXHRcdC8vIFNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBkYXRhICkgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBjYWxsYmFjaztcblx0XHRcdGNhbGxiYWNrID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlIHVybCBjYW4gYmUgYW4gb3B0aW9ucyBvYmplY3QgKHdoaWNoIHRoZW4gbXVzdCBoYXZlIC51cmwpXG5cdFx0cmV0dXJuIGpRdWVyeS5hamF4KCBqUXVlcnkuZXh0ZW5kKCB7XG5cdFx0XHR1cmw6IHVybCxcblx0XHRcdHR5cGU6IG1ldGhvZCxcblx0XHRcdGRhdGFUeXBlOiB0eXBlLFxuXHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdHN1Y2Nlc3M6IGNhbGxiYWNrXG5cdFx0fSwgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHVybCApICYmIHVybCApICk7XG5cdH07XG59ICk7XG5cblxualF1ZXJ5Ll9ldmFsVXJsID0gZnVuY3Rpb24oIHVybCApIHtcblx0cmV0dXJuIGpRdWVyeS5hamF4KCB7XG5cdFx0dXJsOiB1cmwsXG5cblx0XHQvLyBNYWtlIHRoaXMgZXhwbGljaXQsIHNpbmNlIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgdGhyb3VnaCBhamF4U2V0dXAgKCMxMTI2NClcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGRhdGFUeXBlOiBcInNjcmlwdFwiLFxuXHRcdGNhY2hlOiB0cnVlLFxuXHRcdGFzeW5jOiBmYWxzZSxcblx0XHRnbG9iYWw6IGZhbHNlLFxuXHRcdFwidGhyb3dzXCI6IHRydWVcblx0fSApO1xufTtcblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciB3cmFwO1xuXG5cdFx0aWYgKCB0aGlzWyAwIF0gKSB7XG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdFx0aHRtbCA9IGh0bWwuY2FsbCggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kXG5cdFx0XHR3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCApLmVxKCAwICkuY2xvbmUoIHRydWUgKTtcblxuXHRcdFx0aWYgKCB0aGlzWyAwIF0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0d3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHR3cmFwLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBlbGVtID0gdGhpcztcblxuXHRcdFx0XHR3aGlsZSAoIGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQgKSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZWxlbTtcblx0XHRcdH0gKS5hcHBlbmQoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBJbm5lciggaHRtbC5jYWxsKCB0aGlzLCBpICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xuXG5cdFx0XHRpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHR3cmFwOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWxJc0Z1bmN0aW9uID8gaHRtbC5jYWxsKCB0aGlzLCBpICkgOiBodG1sICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdHVud3JhcDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHRoaXMucGFyZW50KCBzZWxlY3RvciApLm5vdCggXCJib2R5XCIgKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTtcblx0XHR9ICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApO1xufTtcbmpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gISEoIGVsZW0ub2Zmc2V0V2lkdGggfHwgZWxlbS5vZmZzZXRIZWlnaHQgfHwgZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApO1xufTtcblxuXG5cblxualF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXHR9IGNhdGNoICggZSApIHt9XG59O1xuXG52YXIgeGhyU3VjY2Vzc1N0YXR1cyA9IHtcblxuXHRcdC8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwXG5cdFx0MDogMjAwLFxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHQvLyAjMTQ1MDogc29tZXRpbWVzIElFIHJldHVybnMgMTIyMyB3aGVuIGl0IHNob3VsZCBiZSAyMDRcblx0XHQxMjIzOiAyMDRcblx0fSxcblx0eGhyU3VwcG9ydGVkID0galF1ZXJ5LmFqYXhTZXR0aW5ncy54aHI
46184oKTtcblxuc3VwcG9ydC5jb3JzID0gISF4aHJTdXBwb3J0ZWQgJiYgKCBcIndpdGhDcmVkZW50aWFsc1wiIGluIHhoclN1cHBvcnRlZCApO1xuc3VwcG9ydC5hamF4ID0geGhyU3VwcG9ydGVkID0gISF4aHJTdXBwb3J0ZWQ7XG5cbmpRdWVyeS5hamF4VHJhbnNwb3J0KCBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0dmFyIGNhbGxiYWNrLCBlcnJvckNhbGxiYWNrO1xuXG5cdC8vIENyb3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRocm91Z2ggWE1MSHR0cFJlcXVlc3Rcblx0aWYgKCBzdXBwb3J0LmNvcnMgfHwgeGhyU3VwcG9ydGVkICYmICFvcHRpb25zLmNyb3NzRG9tYWluICkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggaGVhZGVycywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHZhciBpLFxuXHRcdFx0XHRcdHhociA9IG9wdGlvbnMueGhyKCk7XG5cblx0XHRcdFx0eGhyLm9wZW4oXG5cdFx0XHRcdFx0b3B0aW9ucy50eXBlLFxuXHRcdFx0XHRcdG9wdGlvbnMudXJsLFxuXHRcdFx0XHRcdG9wdGlvbnMuYXN5bmMsXG5cdFx0XHRcdFx0b3B0aW9ucy51c2VybmFtZSxcblx0XHRcdFx0XHRvcHRpb25zLnBhc3N3b3JkXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdGZvciAoIGkgaW4gb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0XHR4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gT3ZlcnJpZGUgbWltZSB0eXBlIGlmIG5lZWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7XG5cdFx0XHRcdFx0eGhyLm92ZXJyaWRlTWltZVR5cGUoIG9wdGlvbnMubWltZVR5cGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyXG5cdFx0XHRcdC8vIEZvciBjcm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmVcblx0XHRcdFx0Ly8gYWtpbiB0byBhIGppZ3NhdyBwdXp6bGUsIHdlIHNpbXBseSBuZXZlciBzZXQgaXQgdG8gYmUgc3VyZS5cblx0XHRcdFx0Ly8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApXG5cdFx0XHRcdC8vIEZvciBzYW1lLWRvbWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLlxuXHRcdFx0XHRpZiAoICFvcHRpb25zLmNyb3NzRG9tYWluICYmICFoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdICkge1xuXHRcdFx0XHRcdGhlYWRlcnNbIFwiWC1SZXF1ZXN0ZWQtV2l0aFwiIF0gPSBcIlhNTEh0dHBSZXF1
46184ZXN0XCI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTZXQgaGVhZGVyc1xuXHRcdFx0XHRmb3IgKCBpIGluIGhlYWRlcnMgKSB7XG5cdFx0XHRcdFx0eGhyLnNldFJlcXVlc3RIZWFkZXIoIGksIGhlYWRlcnNbIGkgXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ2FsbGJhY2tcblx0XHRcdFx0Y2FsbGJhY2sgPSBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRjYWxsYmFjayA9IGVycm9yQ2FsbGJhY2sgPSB4aHIub25sb2FkID1cblx0XHRcdFx0XHRcdFx0XHR4aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9udGltZW91dCA9XG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiYWJvcnRcIiApIHtcblx0XHRcdFx0XHRcdFx0XHR4aHIuYWJvcnQoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gXCJlcnJvclwiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHQvLyBPbiBhIG1hbnVhbCBuYXRpdmUgYWJvcnQsIElFOSB0aHJvd3Ncblx0XHRcdFx0XHRcdFx0XHQvLyBlcnJvcnMgb24gYW55IHByb3BlcnR5IGFjY2VzcyB0aGF0IGlzIG5vdCByZWFkeVN0YXRlXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlb2YgeGhyLnN0YXR1cyAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCAwLCBcImVycm9yXCIgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRmlsZTogcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgMDsgc2VlICM4NjA1LCAjMTQyMDdcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHRcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyU3VjY2Vzc1N0YXR1c1sgeGhyLnN0YXR1cyBdIHx8IHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dCxcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElFOSBoYXMgbm8gWEhSMiBidXQgdGhyb3dzIG9uIGJpbmFyeSAodHJhYy0xMTQyNilcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpXG5cdFx0XHRcdFx0XHRcdFx0XHQoIHhoci5yZXNwb25zZVR5cGUgfHwgXCJ0ZXh0XCIgKSAhPT0gXCJ0ZXh0XCIgIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgYmluYXJ5OiB4aHIucmVzcG9uc2UgfSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gTGlzdGVuIHRvIGV2ZW50c1xuXHRcdFx0XHR4aHIub25sb2FkID0gY2FsbGJhY2soKTtcblx0XHRcdFx0ZXJyb3JDYWxsYmFjayA9IHhoci5vbmVycm9yID0geGhyLm9udGltZW91dCA9IGNhbGxiYWNrKCBcImVycm9yXCIgKTtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHRcdFx0Ly8gVXNlIG9ucmVhZHlzdGF0ZWNoYW5nZSB0byByZXBsYWNlIG9uYWJvcnRcblx0XHRcdFx0Ly8gdG8gaGFuZGxlIHVuY2F1Z2h0IGFib3J0c1xuXHRcdFx0XHRpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0eGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgcmVhZHlTdGF0ZSBiZWZvcmUgdGltZW91dCBhcyBpdCBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRpZiAoIHhoci5yZWFkeVN0YXRlID09PSA0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFsbG93IG9uZXJyb3IgdG8gYmUgY2FsbGVkIGZpcnN0LFxuXHRcdFx0XHRcdFx0XHQvLyBidXQgdGhhdCB3aWxsIG5vdCBoYW5kbGUgYSBuYXRpdmUgYWJvcnRcblx0XHRcdFx0XHRcdFx0Ly8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGVcblx0XHRcdFx0XHRcdFx0Ly8gYXMgeGhyLm9uZXJyb3IgY2Fubm90IGJlIGFjY2Vzc2VkXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JDYWxsYmFjaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIGFib3J0IGNhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2soIFwiYWJvcnRcIiApO1xuXG5cdFx0XHRcdHRyeSB7XG5cblx0XHRcdFx0XHQvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pXG5cdFx0XHRcdFx0eGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApO1xuXHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdC8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gUHJldmVudCBhdXRvLWV4ZWN1dGlvbiBvZiBzY3JpcHRzIHdoZW4gbm8gZXhwbGljaXQgZGF0YVR5cGUgd2FzIHByb3ZpZGVkIChTZWUgZ2gtMjQzMilcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMuY29udGVudHMuc2NyaXB0ID0gZmFsc2U7XG5cdH1cbn0gKTtcblxuLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGVcbmpRdWVyeS5hamF4U2V0dXAoIHtcblx0YWNjZXB0czoge1xuXHRcdHNjcmlwdDogXCJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIFwiICtcblx0XHRcdFwiYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0XCJcblx0fSxcblx0Y29udGVudHM6IHtcblx0XHRzY3JpcHQ6IC9cXGIoPzpqYXZhfGVjbWEpc2NyaXB0XFxiL1xuXHR9LFxuXHRjb252ZXJ0ZXJzOiB7XG5cdFx0XCJ0ZXh0IHNjcmlwdFwiOiBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdGpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7XG5cdFx0XHRyZXR1cm4gdGV4dDtcblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpblxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXHRpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRzLmNhY2hlID0gZmFsc2U7XG5cdH1cblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMudHlwZSA9IFwiR0VUXCI7XG5cdH1cbn0gKTtcblxuLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0XG5qUXVlcnkuYWpheFRyYW5zcG9ydCggXCJzY3JpcHRcIiwgZnVuY3Rpb24oIHMgKSB7XG5cblx0Ly8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiByZXF1
46184ZXN0c1xuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0dmFyIHNjcmlwdCwgY2FsbGJhY2s7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBfLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0c2NyaXB0ID0galF1ZXJ5KCBcIjxzY3JpcHQ+XCIgKS5wcm9wKCB7XG5cdFx0XHRcdFx0Y2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LFxuXHRcdFx0XHRcdHNyYzogcy51cmxcblx0XHRcdFx0fSApLm9uKFxuXHRcdFx0XHRcdFwibG9hZCBlcnJvclwiLFxuXHRcdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHtcblx0XHRcdFx0XHRcdHNjcmlwdC5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gbnVsbDtcblx0XHRcdFx0XHRcdGlmICggZXZ0ICkge1xuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggZXZ0LnR5cGUgPT09IFwiZXJyb3JcIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gVXNlIG5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIHRvIGF2b2lkIG91ciBkb21NYW5pcCBBSkFYIHRyaWNrZXJ5XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7XG5cdFx0XHR9LFxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBvbGRDYWxsYmFja3MgPSBbXSxcblx0cmpzb25wID0gLyg9KVxcPyg/PSZ8JCl8XFw/XFw/LztcblxuLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5nc1xualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRqc29ucDogXCJjYWxsYmFja1wiLFxuXHRqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArIFwiX1wiICsgKCBub25jZSsrICkgKTtcblx0XHR0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTtcblx0XHRyZXR1cm4gY2FsbGJhY2s7XG5cdH1cbn0gKTtcblxuLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJqc29uIGpzb25wXCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHtcblxuXHR2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsXG5cdFx0anNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID9cblx0XHRcdFwidXJsXCIgOlxuXHRcdFx0dHlwZW9mIHMuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApXG5cdFx0XHRcdFx0LmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCAmJlxuXHRcdFx0XHRyanNvbnAudGVzdCggcy5kYXRhICkgJiYgXCJkYXRhXCJcblx0XHQpO1xuXG5cdC8vIEhhbmRsZSBpZmYgdGhlIGV4cGVjdGVkIGRhdGEgdHlwZSBpcyBcImpzb25wXCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXRcblx0aWYgKCBqc29uUHJvcCB8fCBzLmRhdGFUeXBlc1sgMCBdID09PSBcImpzb25wXCIgKSB7XG5cblx0XHQvLyBHZXQgY2FsbGJhY2sgbmFtZSwgcmVtZW1iZXJpbmcgcHJlZXhpc3RpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0XG5cdFx0Y2FsbGJhY2tOYW1lID0gcy5qc29ucENhbGxiYWNrID0gaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgP1xuXHRcdFx0cy5qc29ucENhbGxiYWNrKCkgOlxuXHRcdFx0cy5qc29ucENhbGxiYWNrO1xuXG5cdFx0Ly8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YVxuXHRcdGlmICgganNvblByb3AgKSB7XG5cdFx0XHRzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsIFwiJDFcIiArIGNhbGxiYWNrTmFtZSApO1xuXHRcdH0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkge1xuXHRcdFx0cy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuanNvbnAgKyBcIj1cIiArIGNhbGxiYWNrTmFtZTtcblx0XHR9XG5cblx0XHQvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uXG5cdFx0cy5jb252ZXJ0ZXJzWyBcInNjcmlwdCBqc29uXCIgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhcmVzcG9uc2VDb250YWluZXIgKSB7XG5cdFx0XHRcdGpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgXCIgd2FzIG5vdCBjYWxsZWRcIiApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07XG5cdFx0fTtcblxuXHRcdC8vIEZvcmNlIGpzb24gZGF0YVR5cGVcblx0XHRzLmRhdGFUeXBlc1sgMCBdID0gXCJqc29uXCI7XG5cblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrXG5cdFx0b3ZlcndyaXR0ZW4gPSB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdO1xuXHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzO1xuXHRcdH07XG5cblx0XHQvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29udmVydGVycylcblx0XHRqcVhIUi5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXRcblx0XHRcdGlmICggb3ZlcndyaXR0ZW4gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0alF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTtcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHJlc3RvcmUgcHJlZXhpc3RpbmcgdmFsdWVcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBvdmVyd3JpdHRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2F2ZSBiYWNrIGFzIGZyZWVcblx0XHRcdGlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7XG5cblx0XHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kXG5cdFx0XHRcdHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjaztcblxuXHRcdFx0XHQvLyBTYXZlIHRoZSBjYWxsYmFjayBuYW1lIGZvciBmdXR1cmUgdXNlXG5cdFx0XHRcdG9sZENhbGxiYWNrcy5wdXNoKCBjYWxsYmFja05hbWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlXG5cdFx0XHRpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGlzRnVuY3Rpb24oIG92ZXJ3cml0dGVuICkgKSB7XG5cdFx0XHRcdG92ZXJ3cml0dGVuKCByZXNwb25zZUNvbnRhaW5lclsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gb3ZlcndyaXR0ZW4gPSB1bmRlZmluZWQ7XG5cdFx0fSApO1xuXG5cdFx0Ly8gRGVsZWdhdGUgdG8gc2NyaXB0XG5cdFx0cmV0dXJuIFwic2NyaXB0XCI7XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gU3VwcG9ydDogU2FmYXJpIDggb25seVxuLy8gSW4gU2FmYXJpIDggZG9jdW1lbnRzIGNyZWF0ZWQgdmlhIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLm
46184NyZWF0ZUhUTUxEb2N1bWVudFxuLy8gY29sbGFwc2Ugc2libGluZyBmb3JtczogdGhlIHNlY29uZCBvbmUgYmVjb21lcyBhIGNoaWxkIG9mIHRoZSBmaXJzdCBvbmUuXG4vLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguXG4vLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MzM3XG5zdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCA9ICggZnVuY3Rpb24oKSB7XG5cdHZhciBib2R5ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCBcIlwiICkuYm9keTtcblx0Ym9keS5pbm5lckhUTUwgPSBcIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+XCI7XG5cdHJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyO1xufSApKCk7XG5cblxuLy8gQXJndW1lbnQgXCJkYXRhXCIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sXG4vLyBjb250ZXh0IChvcHRpb25hbCk6IElmIHNwZWNpZmllZCwgdGhlIGZyYWdtZW50IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGlzIGNvbnRleHQsXG4vLyBkZWZhdWx0cyB0byBkb2N1bWVudFxuLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZ1xualF1ZXJ5LnBhcnNlSFRNTCA9IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBrZWVwU2NyaXB0cyApIHtcblx0aWYgKCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0a2VlcFNjcmlwdHMgPSBjb250ZXh0O1xuXHRcdGNvbnRleHQgPSBmYWxzZTtcblx0fVxuXG5cdHZhciBiYXNlLCBwYXJzZWQsIHNjcmlwdHM7XG5cblx0aWYgKCAhY29udGV4dCApIHtcblxuXHRcdC8vIFN0b3Agc2NyaXB0cyBvciBpbmxpbmUgZXZlbnQgaGFuZGxlcnMgZnJvbSBiZWluZyBleGVjdXRlZCBpbW1lZGlhdGVseVxuXHRcdC8vIGJ5IHVzaW5nIGRvY3VtZW50LmltcGxlbWVudGF0aW9uXG5cdFx0aWYgKCBzdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCApIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIFwiXCIgKTtcblxuXHRcdFx0Ly8gU2V0IHRoZSBiYXNlIGhyZWYgZm9yIHRoZSBjcmVhdGVkIGRvY3VtZW50XG5cdFx0XHQvLyBzbyBhbnkgcGFyc2VkIGVsZW1lbnRzIHdpdGggVVJMc1xuXHRcdFx0Ly8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSlcblx0XHRcdGJhc2UgPSBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiYmFzZVwiICk7XG5cdFx0XHRiYXNlLmhyZWYgPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmO1xuXHRcdFx0Y29udGV4dC5oZWFkLmFwcGVuZENoaWxkKCBiYXNlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudDtcblx0XHR9XG5cdH1cblxuXHRwYXJzZWQgPSByc2luZ2xlVGFnLmV4ZWMoIGRhdGEgKTtcblx0c2NyaXB0cyA9ICFrZWVwU2NyaXB0cyAmJiBbXTtcblxuXHQvLyBTaW5nbGUgdGFnXG5cdGlmICggcGFyc2VkICkge1xuXHRcdHJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdO1xuXHR9XG5cblx0cGFyc2VkID0gYnVpbGRGcmFnbWVudCggWyBkYXRhIF0sIGNvbnRleHQsIHNjcmlwdHMgKTtcblxuXHRpZiAoIHNjcmlwdHMgJiYgc2NyaXB0cy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5KCBzY3JpcHRzICkucmVtb3ZlKCk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMgKTtcbn07XG5cblxuLyoqXG4gKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlXG4gKi9cbmpRdWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHtcblx0dmFyIHNlbGVjdG9yLCB0eXBlLCByZXNwb25zZSxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRvZmYgPSB1cmwuaW5kZXhPZiggXCIgXCIgKTtcblxuXHRpZiAoIG9mZiA+IC0xICkge1xuXHRcdHNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApO1xuXHRcdHVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7XG5cdH1cblxuXHQvLyBJZiBpdCdzIGEgZnVuY3Rpb25cblx0aWYgKCBpc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHtcblxuXHRcdC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrXG5cdFx0Y2FsbGJhY2sgPSBwYXJhbXM7XG5cdFx0cGFyYW1zID0gdW5kZWZpbmVkO1xuXG5cdC8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmdcblx0fSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0dHlwZSA9IFwiUE9TVFwiO1xuXHR9XG5cblx0Ly8gSWYgd2UgaGF2ZSBlbGVtZW50cyB0byBtb2RpZnksIG1ha2UgdGhlIHJlcXVlc3Rcblx0aWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7XG5cdFx0alF1ZXJ5LmFqYXgoIHtcblx0XHRcdHVybDogdXJsLFxuXG5cdFx0XHQvLyBJZiBcInR5cGVcIiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZW4gXCJHRVRcIiBtZXRob2Qgd2lsbCBiZSB1c2VkLlxuXHRcdFx0Ly8gTWFrZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGV4cGxpY2l0IHNpbmNlXG5cdFx0XHQvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2Rcblx0XHRcdHR5cGU6IHR5cGUgfHwgXCJHRVRcIixcblx0XHRcdGRhdGFUeXBlOiBcImh0bWxcIixcblx0XHRcdGRhdGE6IHBhcmFtc1xuXHRcdH0gKS5kb25lKCBmdW5jdGlvbiggcmVzcG9uc2VUZXh0ICkge1xuXG5cdFx0XHQvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2tcblx0XHRcdHJlc3BvbnNlID0gYXJndW1lbnRzO1xuXG5cdFx0XHRzZWxmLmh0bWwoIHNlbGVjdG9yID9cblxuXHRcdFx0XHQvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXZcblx0XHRcdFx0Ly8gRXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lkIElFICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzXG5cdFx0XHRcdGpRdWVyeSggXCI8ZGl2PlwiICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0XG5cdFx0XHRcdHJlc3BvbnNlVGV4dCApO1xuXG5cdFx0Ly8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImRhdGFcIiwgXCJzdGF0dXNcIiwgXCJqcVhIUlwiXG5cdFx0Ly8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLlxuXHRcdC8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgXCJqcVhIUlwiLCBcInN0YXR1c1wiLCBcImVycm9yXCJcblx0XHR9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSF
46184IsIHN0YXR1cyApIHtcblx0XHRcdHNlbGYuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5cblxuXG4vLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50c1xualF1ZXJ5LmVhY2goIFtcblx0XCJhamF4U3RhcnRcIixcblx0XCJhamF4U3RvcFwiLFxuXHRcImFqYXhDb21wbGV0ZVwiLFxuXHRcImFqYXhFcnJvclwiLFxuXHRcImFqYXhTdWNjZXNzXCIsXG5cdFwiYWpheFNlbmRcIlxuXSwgZnVuY3Rpb24oIGksIHR5cGUgKSB7XG5cdGpRdWVyeS5mblsgdHlwZSBdID0gZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlLCBmbiApO1xuXHR9O1xufSApO1xuXG5cblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHJldHVybiBqUXVlcnkuZ3JlcCggalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiBlbGVtID09PSBmbi5lbGVtO1xuXHR9ICkubGVuZ3RoO1xufTtcblxuXG5cblxualF1ZXJ5Lm9mZnNldCA9IHtcblx0c2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHtcblx0XHR2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLFxuXHRcdFx0cG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSxcblx0XHRcdGN1ckVsZW0gP
46184SBqUXVlcnkoIGVsZW0gKSxcblx0XHRcdHByb3BzID0ge307XG5cblx0XHQvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtXG5cdFx0aWYgKCBwb3NpdGlvbiA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG5cdFx0fVxuXG5cdFx0Y3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTtcblx0XHRjdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCBcInRvcFwiICk7XG5cdFx0Y3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwibGVmdFwiICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSBcImFic29sdXRlXCIgfHwgcG9zaXRpb24gPT09IFwiZml4ZWRcIiApICYmXG5cdFx0XHQoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCBcImF1dG9cIiApID4gLTE7XG5cblx0XHQvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlclxuXHRcdC8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZFxuXHRcdGlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7XG5cdFx0XHRjdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTtcblx0XHRcdGN1clRvcCA9IGN1clBvc2l0aW9uLnRvcDtcblx0XHRcdGN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1clRvcCA9IHBhcnNlRmxvYXQoIGN1ckNTU1RvcCApIHx8IDA7XG5cdFx0XHRjdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7XG5cdFx0fVxuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7XG5cblx0XHRcdC8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KVxuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgalF1ZXJ5LmV4dGVuZCgge30sIGN1ck9mZnNldCApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0ICkgKyBjdXJMZWZ0O1xuXHRcdH1cblxuXHRcdGlmICggXCJ1c2luZ1wiIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyRWxlbS5jc3MoIHByb3BzICk7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0Ly8gb2Zmc2V0KCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgYm9yZGVyIGJveCB0byB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9mZnNldDogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHRoaXMgOlxuXHRcdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRcdGpRdWVyeS5vZmZzZXQuc2V0T2Zmc2V0KCB0aGlzLCBvcHRpb25zLCBpICk7XG5cdFx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHR2YXIgcmVjdCwgd2luLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXTtcblxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiAoZGlzcGxheTogbm9uZSkgZWxlbWVudHMgKGdoLTIzMTApXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYVxuXHRcdC8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvclxuXHRcdGlmICggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblx0XHR9XG5cblx0XHQvLyBHZXQgZG9jdW1lbnQtcmVsYXRpdmUgcG9zaXRpb24gYnkgYWRkaW5nIHZpZXdwb3J0IHNjcm9sbCB0byB2aWV3cG9ydC1yZWxhdGl2ZSBnQkNSXG5cdFx0cmVjdCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0d2luID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LFxuXHRcdFx0bGVmdDogcmVjdC5sZWZ0ICsgd2luLnBhZ2VYT2Zmc2V0XG5cdFx0fTtcblx0fSxcblxuXHQvLyBwb3NpdGlvbigpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIG1hcmdpbiBib3ggdG8gaXRzIG9mZnNldCBwYXJlbnQncyBwYWRkaW5nIGJveFxuXHQvLyBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBiZWhhdmlvciBvZiBDU1MgYWJzb2x1dGUgcG9zaXRpb25pbmdcblx0cG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggIXRoaXNbIDAgXSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsIGRvYyxcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRwYXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9O1xuXG5cdFx0Ly8gcG9zaXRpb246Zml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHRoZSB2aWV3cG9ydCwgd2hpY2ggaXRzZWxmIGFsd2F5cyBoYXMgemVybyBvZmZzZXRcblx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApID09PSBcImZpeGVkXCIgKSB7XG5cblx0XHRcdC8vIEFzc3VtZSBwb3NpdGlvbjpmaXhlZCBpbXBsaWVzIGF2YWlsYWJpbGl0eSBvZiBnZXRCb3VuZGluZ0NsaWVudFJlY3Rcblx0XHRcdG9mZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0b2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTtcblxuXHRcdFx0Ly8gQWNjb3VudCBmb3IgdGhlICpyZWFsKiBvZmZzZXQgcGFyZW50LCB3aGljaCBjYW4gYmUgdGhlIGRvY3VtZW50IG9yIGl0cyByb290IGVsZW1lbnRcblx0XHRcdC8vIHdoZW4gYSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudCBpcyBpZGVudGlmaWVkXG5cdFx0XHRkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQ7XG5cdFx0XHRvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudCB8fCBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXHRcdFx0d2hpbGUgKCBvZmZzZXRQYXJlbnQgJiZcblx0XHRcdFx0KCBvZmZzZXRQYXJlbnQgPT09IGRvYy5ib2R5IHx8IG9mZnNldFBhcmVudCA9PT0gZG9jLmRvY3VtZW50RWxlbWVudCApICYmXG5cdFx0XHRcdGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSB7XG5cblx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIG9mZnNldFBhcmVudCAmJiBvZmZzZXRQYXJlbnQgIT09IGVsZW0gJiYgb2Zmc2V0UGFyZW50Lm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdC8vIEluY29ycG9yYXRlIGJvcmRlcnMgaW50byBpdHMgb2Zmc2V0LCBzaW5jZSB0aGV5IGFyZSBvdXRzaWRlIGl0cyBjb250ZW50IG9yaWdpblxuXHRcdFx0XHRwYXJlbnRPZmZzZXQgPSBqUXVlcnkoIG9mZnNldFBhcmVudCApLm9mZnNldCgpO1xuXHRcdFx0XHRwYXJlbnRPZmZzZXQudG9wICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJib3JkZXJUb3BXaWR0aFwiLCB0cnVlICk7XG5cdFx0XHRcdHBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJib3JkZXJMZWZ0V2lkdGhcIiwgdHJ1ZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFN1YnRyYWN0IHBhcmVudCBvZmZzZXRzIGFuZCBlbGVtZW50IG1hcmdpbnNcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBvZmZzZXQudG9wIC0gcGFyZW50T2Zmc2V0LnRvcCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luVG9wXCIsIHRydWUgKSxcblx0XHRcdGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiwgdHJ1ZSApXG5cdFx0fTtcblx0fSxcblxuXHQvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybi
46184Bkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcblx0Ly8gMSkgRm9yIHRoZSBlbGVtZW50IGluc2lkZSB0aGUgaWZyYW1lIHdpdGhvdXQgb2Zmc2V0UGFyZW50LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVyblxuXHQvLyAgICBkb2N1bWVudEVsZW1lbnQgb2YgdGhlIHBhcmVudCB3aW5kb3dcblx0Ly8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudFxuXHQvLyAzKSBGb3IgYm9keSBvciBodG1sIGVsZW1lbnQsIGkuZS4gaW4gY2FzZSBvZiB0aGUgaHRtbCBub2RlIC0gaXQgd2lsbCByZXR1cm4gaXRzZWxmXG5cdC8vXG5cdC8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlc1xuXHQvLyBhbmQgbWlnaHQgYmUgY29uc2lkZXJlZCBhcyBtb3JlIHByZWZlcmFibGUgcmVzdWx0cy5cblx0Ly9cblx0Ly8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmVcblx0b2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50O1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJiBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwicG9zaXRpb25cIiApID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50RWxlbWVudDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBzY3JvbGxMZWZ0OiBcInBhZ2VYT2Zmc2V0XCIsIHNjcm9sbFRvcDogXCJwYWdlWU9mZnNldFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7XG5cdHZhciB0b3AgPSBcInBhZ2VZT2Zmc2V0XCIgPT09IHByb3A7XG5cblx0alF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkge1xuXG5cdFx0XHQvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3Ncblx0XHRcdHZhciB3aW47XG5cdFx0XHRpZiAoIGlzV2luZG93KCBlbGVtICkgKSB7XG5cdFx0XHRcdHdpbiA9IGVsZW07XG5cdFx0XHR9IGVsc2UgaWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR3aW4gPSBlbGVtLmRlZmF1bHRWaWV3O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB3aW4gKSB7XG5cdFx0XHRcdHdpbi5zY3JvbGxUbyhcblx0XHRcdFx0XHQhdG9wID8gdmFsIDogd2luLnBhZ2VYT2Zmc2V0LFxuXHRcdFx0XHRcdHRvcCA/IHZhbCA6IHdpbi5wYWdlWU9mZnNldFxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtWyBtZXRob2QgXSA9IHZhbDtcblx0XHRcdH1cblx0XHR9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9O1xufSApO1xuXG4vLyBTdXBwb3J0OiBTYWZhcmkgPD03IC0gOS4xLCBDaHJvbWUgPD0zNyAtIDQ5XG4vLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvblxuLy8gV2Via2l0IGJ1ZzogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDg0XG4vLyBCbGluayBidWc6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTU4OTM0N1xuLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDtcbi8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCBqdXN0IGNoZWNrIGZvciBpdCBoZXJlXG5qUXVlcnkuZWFjaCggWyBcInRvcFwiLCBcImxlZnRcIiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSApO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiBcImlubmVyXCIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCBcIlwiOiBcIm91dGVyXCIgKyBuYW1lIH0sXG5cdFx0ZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7XG5cblx0XHQvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGhcblx0XHRqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHtcblx0XHRcdHZhciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVvZiBtYXJnaW4gIT09IFwiYm9vbGVhblwiICksXG5cdFx0XHRcdGV4dHJhID0gZGVmYXVsdEV4dHJhIHx8ICggbWFyZ2luID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gXCJtYXJnaW5cIiA6IFwiYm9yZGVyXCIgKTtcblxuXHRcdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgZG9jO1xuXG5cdFx0XHRcdGlmICggaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0XHRcdC8vICQoIHdpbmRvdyApLm91dGVyV2lkdGgvSGVpZ2h0IHJldHVybi
46184B3L2ggaW5jbHVkaW5nIHNjcm9sbGJhcnMgKGdoLTE3MjkpXG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmNOYW1lLmluZGV4T2YoIFwib3V0ZXJcIiApID09PSAwID9cblx0XHRcdFx0XHRcdGVsZW1bIFwiaW5uZXJcIiArIG5hbWUgXSA6XG5cdFx0XHRcdFx0XHRlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgXCJjbGllbnRcIiArIG5hbWUgXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHRcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdGRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0XHRcdFx0Ly8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLFxuXHRcdFx0XHRcdC8vIHdoaWNoZXZlciBpcyBncmVhdGVzdFxuXHRcdFx0XHRcdHJldHVybiBNYXRoLm1heChcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJzY3JvbGxcIiArIG5hbWUgXSwgZG9jWyBcInNjcm9sbFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcIm9mZnNldFwiICsgbmFtZSBdLCBkb2NbIFwib2Zmc2V0XCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRkb2NbIFwiY2xpZW50XCIgKyBuYW1lIF1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXG5cdFx0XHRcdFx0Ly8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwgcmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdFxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOlxuXG5cdFx0XHRcdFx0Ly8gU2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudFxuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICk7XG5cdFx0XHR9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSApO1xuXHRcdH07XG5cdH0gKTtcbn0gKTtcblxuXG5qUXVlcnkuZWFjaCggKCBcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIFwiICtcblx0XCJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBcIiArXG5cdFwiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudVwiICkuc3BsaXQoIFwiIFwiICksXG5cdGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXG5cdC8vIEhhbmRsZSBldmVudCBiaW5kaW5nXG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/XG5cdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcblx0XHRcdHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHR9O1xufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHtcblx0XHRyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTtcblx0fVxufSApO1xuXG5cblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0YmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7XG5cdH0sXG5cdHVuYmluZDogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vZmYoIHR5cGVzLCBudWxsLCBmbiApO1xuXHR9LFxuXG5cdGRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiApIHtcblxuXHRcdC8vICggbmFtZXNwYWNlICkgb3IgKCBzZWxlY3RvciwgdHlwZXMgWywgZm5dIClcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/XG5cdFx0XHR0aGlzLm9mZiggc2VsZWN0b3IsIFwiKipcIiApIDpcblx0XHRcdHRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgXCIqKlwiLCBmbiApO1xuXHR9XG59ICk7XG5cbi8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueVxuLy8gYXJndW1lbnRzLlxuLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKVxuLy8gSG93ZXZlciwgaXQgaXMgbm90IHNsYXRlZCBmb3IgcmVtb3ZhbCBhbnkgdGltZSBzb29uXG5qUXVlcnkucHJveHkgPSBmdW5jdGlvbiggZm4sIGNvbnRleHQgKSB7XG5cdHZhciB0bXAsIGFyZ3MsIHByb3h5O1xuXG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0dG1wID0gZm5bIGNvbnRleHQgXTtcblx0XHRjb250ZXh0ID0gZm47XG5cdFx0Zm4gPSB0bXA7XG5cdH1cblxuXHQvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlY1xuXHQvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLlxuXHRpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBTaW11bGF0ZWQgYmluZFxuXHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAyICk7XG5cdHByb3h5ID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7XG5cdH07XG5cblx0Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkXG5cdHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xuXG5cdHJldHVybi
46184Bwcm94eTtcbn07XG5cbmpRdWVyeS5ob2xkUmVhZHkgPSBmdW5jdGlvbiggaG9sZCApIHtcblx0aWYgKCBob2xkICkge1xuXHRcdGpRdWVyeS5yZWFkeVdhaXQrKztcblx0fSBlbHNlIHtcblx0XHRqUXVlcnkucmVhZHkoIHRydWUgKTtcblx0fVxufTtcbmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbmpRdWVyeS5wYXJzZUpTT04gPSBKU09OLnBhcnNlO1xualF1ZXJ5Lm5vZGVOYW1lID0gbm9kZU5hbWU7XG5qUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5qUXVlcnkuaXNXaW5kb3cgPSBpc1dpbmRvdztcbmpRdWVyeS5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG5qUXVlcnkudHlwZSA9IHRvVHlwZTtcblxualF1ZXJ5Lm5vdyA9IERhdGUubm93O1xuXG5qUXVlcnkuaXNOdW1lcmljID0gZnVuY3Rpb24oIG9iaiApIHtcblxuXHQvLyBBcyBvZiBqUXVlcnkgMy4wLCBpc051bWVyaWMgaXMgbGltaXRlZCB0b1xuXHQvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpXG5cdC8vIHRoYXQgY2FuIGJlIGNvZXJjZWQgdG8gZmluaXRlIG51bWJlcnMgKGdoLTI2NjIpXG5cdHZhciB0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiApO1xuXHRyZXR1cm4gKCB0eXBlID09PSBcIm51bWJlclwiIHx8IHR5cGUgPT09IFwic3RyaW5nXCIgKSAmJlxuXG5cdFx0Ly8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKFwiXCIpXG5cdFx0Ly8gLi4uYnV0IG1pc2ludGVycHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5ncywgcGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAoXCIweC4uLlwiKVxuXHRcdC8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTlxuXHRcdCFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTtcbn07XG5cblxuXG5cbi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlclxuLy8gZmlsZXMgdGhhdCBtYXkgdXNlIGRlZmluZSwgYnV0IG5vdCB2aWEgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdFxuLy8gdW5kZXJzdGFuZHMgYW5vbnltb3VzIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0XG4vLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlXG4vLyBkZXJpdmVkIGZyb20gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2Vcbi8vIGZpbGUgbmFtZS4gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50c1xuLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLlxuXG4vLyBOb3RlIHRoYXQgZm9yIG1heGltdW0gcG9ydGFiaWxpdHksIGxpYnJhcmllcyB0aGF0IGFyZSBub3QgalF1ZXJ5IHNob3VsZFxuLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhblxuLy8gQU1EIGxvYWRlciBpcyBwcmVzZW50LiBqUXVlcnkgaXMgYSBzcGVjaWFsIGNhc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcy93aWtpL1VwZGF0aW5nLWV4aXN0aW5nLWxpYnJhcmllcyN3aWtpLWFub25cblxuaWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblx0ZGVmaW5lKCBcImpxdWVyeVwiLCBbXSwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeTtcblx0fSApO1xufVxuXG5cblxuXG52YXJcblxuXHQvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0X2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksXG5cblx0Ly8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0XyQgPSB3aW5kb3cuJDtcblxualF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHtcblx0aWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy4kID0gXyQ7XG5cdH1cblxuXHRpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5O1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeTtcbn07XG5cbi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1EXG4vLyAoIzcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC81NTcpXG4vLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICgjMTM1NjYpXG5pZiAoICFub0dsb2JhbCApIHtcblx0d2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5O1xufVxuXG5cblxuXG5yZXR1cm4galF1ZXJ5O1xufSApO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhF
46184IFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIHJlc29sdmVzIC4gYW5kIC4uIGVsZW1lbnRzIGluIGEgcGF0aCBhcnJheSB3aXRoIGRpcmVjdG9yeSBuYW1lcyB0aGVyZVxuLy8gbXVzdCBiZSBubyBzbGFzaGVzLCBlbXB0eSBlbGVtZW50cywgb3IgZGV2aWNlIG5hbWVzIChjOlxcKSBpbiB0aGUgYXJyYXlcbi8vIChzbyBhbHNvIG5vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoZXMgLSBpdCBkb2VzIG5vdCBkaXN0aW5ndWlzaFxuLy8gcmVsYXRpdmUgYW5kIGFic29sdXRlIHBhdGhzKVxuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXkocGFydHMsIGFsbG93QWJvdmVSb290KSB7XG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlI
46184HRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBsYXN0ID0gcGFydHNbaV07XG4gICAgaWYgKGxhc3QgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cC0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBwYXRoIGlzIGFsbG93ZWQgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIHJlc3RvcmUgbGVhZGluZyAuLnNcbiAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgZm9yICg7IHVwLS07IHVwKSB7XG4gICAgICBwYXJ0cy51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJ0cztcbn1cblxuLy8gU3BsaXQgYSBmaWxlbmFtZSBpbnRvIFtyb290LCBkaXIsIGJhc2VuYW1lLCBleHRdLCB1bml4IHZlcnNpb25cbi8vICdyb290JyBpcyBqdXN0IGEgc2xhc2gsIG9yIG5vdGhpbmcuXG52YXIgc3BsaXRQYXRoUmUgPVxuICAgIC9eKFxcLz98KShbXFxzXFxTXSo/KSgoPzpcXC57MSwyfXxbXlxcL10rP3wpKFxcLlteLlxcL10qfCkpKD86W1xcL10qKSQvO1xudmFyIHNwbGl0UGF0aCA9IGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gIHJldHVybiBzcGxpdFBhdGhSZS5leGVjKGZpbGVuYW1lKS5zbGljZSgxKTtcbn07XG5cbi8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzb2x2ZWRQYXRoID0gJycsXG4gICAgICByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHtcbiAgICB2YXIgcGF0aCA9IChpID49IDApID8gYXJndW1lbnRzW2ldIDogcHJvY2Vzcy5jd2QoKTtcblxuICAgIC8vIFNraXAgZW1wdHkgYW5kIGludmFsaWQgZW50cmllc1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfSBlbHNlIGlmICghcGF0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmVzb2x2ZWRQYXRoID0gcGF0aCArICcvJyArIHJlc29sdmVkUGF0aDtcbiAgICByZXNvbHZlZEFic29sdXRlID0gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbiAgfVxuXG4gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLCBidXRcbiAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihyZXNvbHZlZFBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhcmVzb2x2ZWRBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIHJldHVybiAoKHJlc29sdmVkQWJzb2x1dGUgPyAnLycgOiAnJykgKyByZXNvbHZlZFBhdGgpIHx8ICcuJztcbn07XG5cbi8vIHBhdGgubm9ybWFsaXplKHBhdGgpXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIGlzQWJzb2x1dGUgPSBleHBvcnRzLmlzQWJzb2x1dGUocGF0aCksXG4gICAgICB0cmFpbGluZ1NsYXNoID0gc3Vic3RyKHBhdGgsIC0xKSA9PT0gJy8nO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICBwYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhaXNBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIGlmICghcGF0aCAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHBhdGggPSAnLic7XG4gIH1cbiAgaWYgKHBhdGggJiYgdHJhaWxpbmdTbGFzaCkge1xuICAgIHBhdGggKz0gJy8nO1xuICB9XG5cbiAgcmV0dXJuIChpc0Fic29sdXRlID8gJy8nIDogJycpICsgcGF0aDtcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmpvaW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHBhdGhzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgcmV0dXJuIGV4cG9ydHMubm9ybWFsaXplKGZpbHRlcihwYXRocywgZnVuY3Rpb24ocCwgaW5kZXgpIHtcbiAgICBpZiAodHlwZW9mIHAgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5qb2luIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSkuam9pbignLycpKTtcbn07XG5cblxuLy8gcGF0aC5yZWxhdGl2ZShmcm9tLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVsYXRpdmUgPSBmdW5jdGlvbihmcm9tLCB0bykge1xuICBmcm9tID0gZXhwb3J0cy5yZXNvbHZlKGZyb20pLnN1YnN0cigxKTtcbiAgdG8gPSBleHBvcnRzLnJlc29sdmUodG8pLnN1YnN0cigxKTtcblxuICBmdW5jdGlvbiB0cmltKGFycikge1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgZm9yICg7IHN0YXJ0IDwgYXJyLmxlbmd0aDsgc3RhcnQrKykge1xuICAgICAgaWYgKGFycltzdGFydF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZW5kID0gYXJyLmxlbmd0aCAtIDE7XG4gICAgZm9yICg7IGVuZCA+PSAwOyBlbmQtLSkge1xuICAgICAgaWYgKGFycltlbmRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGFyci5zbGljZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTtcbiAgfVxuXG4gIHZhciBmcm9tUGFydHMgPSB0cmltKGZyb20uc3BsaXQoJy8nKSk7XG4gIHZhciB0b1BhcnRzID0gdHJpbSh0by5zcGxpdCgnLycpKTtcblxuICB2Y
46184XIgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpO1xuICB2YXIgc2FtZVBhcnRzTGVuZ3RoID0gbGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZyb21QYXJ0c1tpXSAhPT0gdG9QYXJ0c1tpXSkge1xuICAgICAgc2FtZVBhcnRzTGVuZ3RoID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBvdXRwdXRQYXJ0cyA9IFtdO1xuICBmb3IgKHZhciBpID0gc2FtZVBhcnRzTGVuZ3RoOyBpIDwgZnJvbVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0UGFydHMucHVzaCgnLi4nKTtcbiAgfVxuXG4gIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7XG5cbiAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJy8nKTtcbn07XG5cbmV4cG9ydHMuc2VwID0gJy8nO1xuZXhwb3J0cy5kZWxpbWl0ZXIgPSAnOic7XG5cbmV4cG9ydHMuZGlybmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIHJlc3VsdCA9IHNwbGl0UGF0aChwYXRoKSxcbiAgICAgIHJvb3QgPSByZXN1bHRbMF0sXG4gICAgICBkaXIgPSByZXN1bHRbMV07XG5cbiAgaWYgKCFyb290ICYmICFkaXIpIHtcbiAgICAvLyBObyBkaXJuYW1lIHdoYXRzb2V2ZXJcbiAgICByZXR1cm4gJy4nO1xuICB9XG5cbiAgaWYgKGRpcikge1xuICAgIC8vIEl0IGhhcyBhIGRpcm5hbWUsIHN0cmlwIHRyYWlsaW5nIHNsYXNoXG4gICAgZGlyID0gZGlyLnN1YnN0cigwLCBkaXIubGVuZ3RoIC0gMSk7XG4gIH1cblxuICByZXR1cm4gcm9vdCArIGRpcjtcbn07XG5cblxuZXhwb3J0cy5iYXNlbmFtZSA9IGZ1bmN0aW9uKHBhdGgsIGV4dCkge1xuICB2YXIgZiA9IHNwbGl0UGF0aChwYXRoKVsyXTtcbiAgLy8gVE9ETzogbWFrZSB0aGlzIGNvbXBhcmlzb24gY2FzZS1pbnNlbnNpdGl2ZSBvbiB3aW5kb3dzP1xuICBpZiAoZXh0ICYmIGYuc3Vic3RyKC0xICogZXh0Lmxlbmd0aCkgPT09IGV4dCkge1xuICAgIGYgPSBmLnN1YnN0cigwLCBmLmxlbmd0aCAtIGV4dC5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBmO1xufTtcblxuXG5leHBvcnRzLmV4dG5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHJldHVybiBzcGxpdFBhdGgocGF0aClbM107XG59O1xuXG5mdW5jdGlvbiBmaWx0ZXIgKHhzLCBmKSB7XG4gICAgaWYgKHhzLmZpbHRlcikgcmV0dXJuIHhzLmZpbHRlcihmKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZih4c1tpXSwgaSwgeHMpKSByZXMucHVzaCh4c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbi8vIFN0cmluZy5wcm90b3R5cGUuc3Vic3RyIC0gbmVnYXRpdmUgaW5kZXggZG9uJ3Qgd29yayBpbiBJRThcbnZhciBzdWJzdHIgPSAnYWInLnN1YnN0cigtMSkgPT09ICdiJ1xuICAgID8gZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikgeyByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKSB9XG4gICAgOiBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7XG4gICAgICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gc3RyLmxlbmd0aCArIHN0YXJ0O1xuICAgICAgICByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKTtcbiAgICB9XG4
vendor: 7,481 bytes, line 46184
461847XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwi
46184LyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9tYXN0ZXIvTElDRU5TRSBmaWxlLiBBblxuICogYWRkaXRpb25hbCBncmFudCBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluXG4gKiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuIShmdW5jdGlvbihnbG9iYWwpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICB2YXIgaW5Nb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiO1xuICB2YXIgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWU7XG4gIGlmIChydW50aW1lKSB7XG4gICAgaWYgKGluTW9kdWxlKSB7XG4gICAgICAvLyBJZiByZWdlbmVyYXRvclJ1bnRpbWUgaXMgZGVmaW5lZCBnbG9iYWxseSBhbmQgd2UncmUgaW4gYSBtb2R1bGUsXG4gICAgICAvLyBtYWtlIHRoZSBleHBvcnRzIG9iamVjdCBpZGVudGljYWwgdG8gcmVnZW5lcmF0b3JSdW50aW1lLlxuICAgICAgbW9kdWxlLmV4cG9ydHMgPSBydW50aW1lO1xuICAgIH1cbiAgICAvLyBEb24ndCBib3RoZXIgZXZhbHVhdGluZyB0aGUgcmVzdCBvZiB0aGlzIGZpbGUgaWYgdGhlIHJ1bnRpbWUgd2FzXG4gICAgLy8gYWxyZWFkeSBkZWZpbmVkIGdsb2JhbGx5LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERlZmluZSB0aGUgcnVudGltZSBnbG9iYWxseSAoYXMgZXhwZWN0ZWQgYnkgZ2VuZXJhdGVkIGNvZGUpIGFzIGVpdGhlclxuICAvLyBtb2R1bGUuZXhwb3J0cyAoaWYgd2UncmUgaW4gYSBtb2R1bGUpIG9yIGEgbmV3LCBlbXB0eSBvYmplY3QuXG4gIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lID0gaW5Nb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA6IHt9O1xuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIHJ1bnRpbWUud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW
461841teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlW3RvU3RyaW5nVGFnU3ltYm9sXSA9XG4gICAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgcHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgcnVudGltZS5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBpZiAoISh0b1N0cmluZ1RhZ1N5bWJvbCBpbiBnZW5GdW4pKSB7XG4gICAgICAgIGdlbkZ1blt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuXG4gIHJ1bnRpbWUuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2Y
46184XIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLiBJZiB0aGUgUHJvbWlzZSBpcyByZWplY3RlZCwgaG93ZXZlciwgdGhlXG4gICAgICAgICAgLy8gcmVzdWx0IGZvciB0aGlzIGl0ZXJhdGlvbiB3aWxsIGJlIHJlamVjdGVkIHdpdGggdGhlIHNhbWVcbiAgICAgICAgICAvLyByZWFzb24uIE5vdGUgdGhhdCByZWplY3Rpb25zIG9mIHlpZWxkZWQgUHJvbWlzZXMgYXJlIG5vdFxuICAgICAgICAgIC8vIHRocm93biBiYWNrIGludG8gdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgYXMgaXMgdGhlIGNhc2VcbiAgICAgICAgICAvLyB3aGVuIGFuIGF3YWl0ZWQgUHJvbWlzZSBpcyByZWplY3RlZC4gVGhpcyBkaWZmZXJlbmNlIGluXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYmV0d2VlbiB5aWVsZCBhbmQgYXdhaXQgaXMgaW1wb3J0YW50LCBiZWNhdXNlIGl0XG4gICAgICAgICAgLy8gYWxsb3dzIHRoZSBjb25zdW1lciB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIHRoZSB5aWVsZGVkXG4gICAgICAgICAgLy8gcmVqZWN0aW9uIChzd2FsbG93IGl0IGFuZCBjb250aW51ZSwgbWFudWFsbHkgLnRocm93IGl0IGJhY2tcbiAgICAgICAgICAvLyBpbnRvIHRoZSBnZW5lcmF0b3IsIGFiYW5kb24gaXRlcmF0aW9uLCB3aGF0ZXZlcikuIFdpdGhcbiAgICAgICAgICAvLyBhd2FpdCwgYnkgY29udHJhc3QsIHRoZXJlIGlzIG5vIG9wcG9ydHVuaXR5IHRvIGV4YW1pbmUgdGhlXG4gICAgICAgICAgLy8gcmVqZWN0aW9uIHJlYXNvbiBvdXRzaWRlIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIHNvIHRoZVxuICAgICAgICAgIC8vIG9ubHkgb3B0aW9uIGlzIHRvIHRocm93IGl0IGZyb20gdGhlIGF3YWl0IGV4cHJlc3Npb24sIGFuZFxuICAgICAgICAgIC8vIGxldCB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhbmRsZSB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBnbG9iYWwucHJvY2VzcyA9PT0gXCJvYmplY3RcIiAmJiBnbG9iYWwucHJvY2Vzcy5kb21haW4pIHtcbiAgICAgIGludm9rZSA9IGdsb2JhbC5wcm9jZXNzLmRvbWFpbi5iaW5kKGludm9rZSk7XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuICBBc3luY0l0ZXJhdG9yLnByb3RvdHlwZVthc3luY0l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgcnVudGltZS5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjtcblxuICAvLyBOb3RlIHRoYXQgc2ltcGxlIGFzeW5jIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mXG4gIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybi
46184BhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZlxuICAvLyB0aGUgZmluYWwgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpdGVyYXRvci5cbiAgcnVudGltZS5hc3luYyA9IGZ1bmN0aW9uKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpXG4gICAgKTtcblxuICAgIHJldHVybiBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGNvbnRleHQuYXJnID0gYXJnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2Y
46184XIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbCBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF0oY29udGV4dC5hcmcpIGFuZCBoYW5kbGUgdGhlXG4gIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGVcbiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gIC8vIHNldHRpbmcgY29udGV4dC5kZWxlZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuaW5nIHRoZSBDb250aW51ZVNlbnRpbmVsLlxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3IucmV0dXJuKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBhIHJldHVybiBtZXRob2QsIGdpdmUgaXQgYVxuICAgICAgICAgIC8vIGNoYW5jZSB0byBjbGVhbiB1cC5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgLy8gSWYgbWF5YmVJbnZva2VEZWxlZ2F0ZShjb250ZXh0KSBjaGFuZ2VkIGNvbnRleHQubWV0aG9kIGZyb21cbiAgICAgICAgICAgIC8vIFwicmV0dXJuXCIgdG8gXCJ0aHJvd1wiLCBsZXQgdGhhdCBvdmVycmlkZSB0aGUgVHlwZUVycm9yIGJlbG93LlxuICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBcIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2RcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybi
46184BDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7XG5cbiAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcblxuICAgIGlmICghIGluZm8pIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgIC8vIEFzc2lnbiB0aGUgcmVzdWx0IG9mIHRoZSBmaW5pc2hlZCBkZWxlZ2F0ZSB0byB0aGUgdGVtcG9yYXJ5XG4gICAgICAvLyB2YXJpYWJsZSBzcGVjaWZpZWQgYnkgZGVsZWdhdGUucmVzdWx0TmFtZSAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7XG5cbiAgICAgIC8vIFJlc3VtZSBleGVjdXRpb24gYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7XG5cbiAgICAgIC8vIElmIGNvbnRleHQubWV0aG9kIHdhcyBcInRocm93XCIgYnV0IHRoZSBkZWxlZ2F0ZSBoYW5kbGVkIHRoZVxuICAgICAgLy8gZXhjZXB0aW9uLCBsZXQgdGhlIG91dGVyIGdlbmVyYXRvciBwcm9jZWVkIG5vcm1hbGx5LiBJZlxuICAgICAgLy8gY29udGV4dC5tZXRob2Qgd2FzIFwibmV4dFwiLCBmb3JnZXQgY29udGV4dC5hcmcgc2luY2UgaXQgaGFzIGJlZW5cbiAgICAgIC8vIFwiY29uc3VtZWRcIiBieSB0aGUgZGVsZWdhdGUgaXRlcmF0b3IuIElmIGNvbnRleHQubWV0aG9kIHdhc1xuICAgICAgLy8gXCJyZXR1cm5cIiwgYWxsb3cgdGhlIG9yaWdpbmFsIC5yZXR1cm4gY2FsbCB0byBjb250aW51ZSBpbiB0aGVcbiAgICAgIC8vIG91dGVyIGdlbmVyYXRvci5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gXCJyZXR1cm5cIikge1xuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZS15aWVsZCB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBkZWxlZ2F0ZSBtZXRob2QuXG4gICAgICByZXR1cm4gaW5mbztcbiAgICB9XG5cbiAgICAvLyBUaGUgZGVsZWdhdGUgaXRlcmF0b3IgaXMgZmluaXNoZWQsIHNvIGZvcmdldCBpdCBhbmQgY29udGludWUgd2l0aFxuICAgIC8vIHRoZSBvdXRlciBnZW5lcmF0b3IuXG4gICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gIH1cblxuICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZVxuICAvLyB1bmlmaWVkIC5faW52b2tlIGhlbHBlciBtZXRob2QuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7XG5cbiAgR3BbdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JcIjtcblxuICAvLyBBIEdlbmVyYXRvciBzaG91bGQgYWx3YXlzIHJldHVybiBpdHNlbGYgYXMgdGhlIGl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZVxuICAvLyBAQGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBpdC4gU29tZSBicm93c2VycycgaW1wbGVtZW50YXRpb25zIG9mIHRoZVxuICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAvLyBvYmplY3QgdG8gbm90IGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLiBUaGlzIGVuc3VyZXMgdGhhdCBkb2Vzbid0IGhhcHBlbi5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9pc3N1ZXMvMjc0IGZvciBtb3JlIGRldGFpbHMuXG4gIEdwW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEdwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH07XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBydW50aW1lLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2Y
46184XIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vI
46184HZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgcnVudGltZS52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2Y
46184XIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2Y
46184XIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2Y
46184XIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2Y
46184XIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcbn0pKFxuICAvLyBBbW9uZyB0aGUgdmFyaW91cyB0cmlja3MgZm9yIG9idGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsXG4gIC8vIG9iamVjdCwgdGhpcyBzZWVtcyB0byBiZSB0aGUgbW9zdCByZWxpYWJsZSB0ZWNobmlxdWUgdGhhdCBkb2VzIG5vdFxuICAvLyB1c2UgaW5kaXJlY3QgZXZhbCAod2hpY2ggdmlvbGF0ZXMgQ29udGVudCBTZWN1cml0eSBQb2xpY3kpLlxuICB0eXBlb2YgZ2xvYmFsID09PSBcIm9iamVjdFwiID8gZ2xvYmFsIDpcbiAgdHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiA/IHdpbmRvdyA6XG4gIHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiID8gc2VsZiA6IHRoaXNcbik7XG4iLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KChmdW5jdGlvbiB3ZWJwYWNrTG9hZE9wdGlvbmFsRXh0ZXJuYWxNb2R1bGUoKSB7IHRyeSB7IHJldHVybiByZXF1aXJlKFwiZnNcIik7IH0gY2F0Y2goZSkge30gfSgpKSwgcmVxdWlyZShcInBhdGhcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW1wiZnNcIiwgXCJwYXRoXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlR3aWdcIl0gPSBmYWN0b3J5KChmdW5jdGlvbiB3ZWJwYWNrTG9hZE9wdGlvbmFsRXh0ZXJuYWxNb2R1bGUoKSB7IHRyeSB7IHJldHVybiByZXF1aXJlKFwiZnNcIik7IH0gY2F0Y2goZSkge30gfSgpKSwgcmVxdWlyZShcInBhdGhcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlR3aWdcIl0gPSBmYWN0b3J5KHJvb3RbXCJmc1wiXSwgcm9vdFtcInBhdGhcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8xOV9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzIwX18pIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fSxcbi8qKioqKiovIFx0XHRcdGlkOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGxvYWRlZDogZmFsc2Vcbi8qKioqKiovIFx0XHR9O1xuXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybi
46184Btb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuXG5cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0LyoqXG5cdCAqIFR3aWcuanNcblx0ICpcblx0ICogQGNvcHlyaWdodCAyMDExLTIwMTYgSm9obiBSb2Vwa2UgYW5kIHRoZSBUd2lnLmpzIENvbnRyaWJ1dG9yc1xuXHQgKiBAbGljZW5zZSAgIEF2YWlsYWJsZSB1bmRlciB0aGUgQlNEIDItQ2xhdXNlIExpY2Vuc2Vcblx0ICogQGxpbmsgICAgICBodHRwczovL2dpdGh1Yi5jb20vdHdpZ2pzL3R3aWcuanNcblx0ICovXG5cblx0dmFyIFR3aWcgPSB7XG5cdCAgICBWRVJTSU9OOiAnMC4xMC4yJ1xuXHR9O1xuXG5cdF9fd2VicGFja19yZXF1aXJlX18oMSkoVHdpZyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oMikoVHdpZyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oMykoVHdpZyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oNSkoVHdpZyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oNikoVHdpZyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oNykoVHdpZyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oMTcpKFR3aWcpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE4KShUd2lnKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXygyMSkoVHdpZyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oMjIpKFR3aWcpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDIzKShUd2lnKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXygyNCkoVHdpZyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oMjUpKFR3aWcpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDI2KShUd2lnKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXygyNykoVHdpZyk7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBUd2lnLmV4cG9ydHM7XG5cblxuLyoqKi8gfSxcbi8qIDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vICMjIHR3aWcuY29yZS5qc1xuXHQvL1xuXHQvLyBUaGlzIGZpbGUgaGFuZGxlcyB0ZW1wbGF0ZSBsZXZlbCB0b2tlbml6aW5nLCBjb21waWxpbmcgYW5kIHBhcnNpbmcuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFR3aWcpIHtcblx0ICAgIFwidXNlIHN0cmljdFwiO1xuXG5cdCAgICBUd2lnLnRyYWNlID0gZmFsc2U7XG5cdCAgICBUd2lnLmRlYnVnID0gZmFsc2U7XG5cblx0ICAgIC8vIERlZmF1bHQgY2FjaGluZyB0byB0cnVlIGZvciB0aGUgaW1wcm92ZWQgcGVyZm9ybWFuY2UgaXQgb2ZmZXJzXG5cdCAgICBUd2lnLmNhY2hlID0gdHJ1ZTtcblxuXHQgICAgVHdpZy5ub29wID0gZnVuY3Rpb24oKSB7fTtcblxuXHQgICAgVHdpZy5wbGFjZWhvbGRlcnMgPSB7XG5cdCAgICAgICAgcGFyZW50OiBcInt7fFBBUkVOVHx9fVwiXG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEZhbGxiYWNrIGZvciBBcnJheS5pbmRleE9mIGZvciBJRTggZXQgYWxcblx0ICAgICAqL1xuXHQgICAgVHdpZy5pbmRleE9mID0gZnVuY3Rpb24gKGFyciwgc2VhcmNoRWxlbWVudCAvKiwgZnJvbUluZGV4ICovICkge1xuXHQgICAgICAgIGlmIChBcnJheS5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoXCJpbmRleE9mXCIpKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBhcnIuaW5kZXhPZihzZWFyY2hFbGVtZW50KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGFyciA9PT0gdm9pZCAwIHx8IGFyciA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciB0ID0gT2JqZWN0KGFycik7XG5cdCAgICAgICAgdmFyIGxlbiA9IHQubGVuZ3RoID4+PiAwO1xuXHQgICAgICAgIGlmIChsZW4gPT09IDApIHtcblx0ICAgICAgICAgICAgcmV0dXJuIC0xO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2Y
46184XIgbiA9IDA7XG5cdCAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgIG4gPSBOdW1iZXIoYXJndW1lbnRzWzFdKTtcblx0ICAgICAgICAgICAgaWYgKG4gIT09IG4pIHsgLy8gc2hvcnRjdXQgZm9yIHZlcmlmeWluZyBpZiBpdCdzIE5hTlxuXHQgICAgICAgICAgICAgICAgbiA9IDA7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAobiAhPT0gMCAmJiBuICE9PSBJbmZpbml0eSAmJiBuICE9PSAtSW5maW5pdHkpIHtcblx0ICAgICAgICAgICAgICAgIG4gPSAobiA+IDAgfHwgLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKG4gPj0gbGVuKSB7XG5cdCAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaW5kZXhPZiBub3QgZm91bmQxIFwiLCBKU09OLnN0cmluZ2lmeShzZWFyY2hFbGVtZW50KSwgSlNPTi5zdHJpbmdpZnkoYXJyKSk7XG5cdCAgICAgICAgICAgIHJldHVybiAtMTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIGsgPSBuID49IDAgPyBuIDogTWF0aC5tYXgobGVuIC0gTWF0aC5hYnMobiksIDApO1xuXHQgICAgICAgIGZvciAoOyBrIDwgbGVuOyBrKyspIHtcblx0ICAgICAgICAgICAgaWYgKGsgaW4gdCAmJiB0W2tdID09PSBzZWFyY2hFbGVtZW50KSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoYXJyID09IHNlYXJjaEVsZW1lbnQpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIDA7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaW5kZXhPZiBub3QgZm91bmQyIFwiLCBKU09OLnN0cmluZ2lmeShzZWFyY2hFbGVtZW50KSwgSlNPTi5zdHJpbmdpZnkoYXJyKSk7XG5cblx0ICAgICAgICByZXR1cm4gLTE7XG5cdCAgICB9XG5cblx0ICAgIFR3aWcuZm9yRWFjaCA9IGZ1bmN0aW9uIChhcnIsIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG5cdCAgICAgICAgaWYgKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoICkge1xuXHQgICAgICAgICAgICByZXR1cm4gYXJyLmZvckVhY2goY2FsbGJhY2ssIHRoaXNBcmcpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHZhciBULCBrO1xuXG5cdCAgICAgICAgaWYgKCBhcnIgPT0gbnVsbCApIHtcblx0ICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIFwiIHRoaXMgaXMgbnVsbCBvciBub3QgZGVmaW5lZFwiICk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8gMS4gTGV0IE8gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIFRvT2JqZWN0IHBhc3NpbmcgdGhlIHx0aGlzfCB2YWx1ZSBhcyB0aGUgYXJndW1lbnQuXG5cdCAgICAgICAgdmFyIE8gPSBPYmplY3QoYXJyKTtcblxuXHQgICAgICAgIC8vIDIuIExldCBsZW5WYWx1ZSBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIEdldCBpbnRlcm5hbCBtZXRob2Qgb2YgTyB3aXRoIHRoZSBhcmd1bWVudCBcImxlbmd0aFwiLlxuXHQgICAgICAgIC8vIDMuIExldCBsZW4gYmUgVG9VaW50MzIobGVuVmFsdWUpLlxuXHQgICAgICAgIHZhciBsZW4gPSBPLmxlbmd0aCA+Pj4gMDsgLy8gSGFjayB0byBjb252ZXJ0IE8ubGVuZ3RoIHRvIGEgVUludDMyXG5cblx0ICAgICAgICAvLyA0LiBJZiBJc0NhbGxhYmxlKGNhbGxiYWNrKSBpcyBmYWxzZSwgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLlxuXHQgICAgICAgIC8vIFNlZTogaHR0cDovL2VzNS5naXRodWIuY29tLyN4OS4xMVxuXHQgICAgICAgIGlmICgge30udG9TdHJpbmcuY2FsbChjYWxsYmFjaykgIT0gXCJbb2JqZWN0IEZ1bmN0aW9uXVwiICkge1xuXHQgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvciggY2FsbGJhY2sgKyBcIiBpcyBub3QgYSBmdW5jdGlvblwiICk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8gNS4gSWYgdGhpc0FyZyB3YXMgc3VwcGxpZWQsIGxldCBUIGJlIHRoaXNBcmc7IGVsc2UgbGV0IFQgYmUgdW5kZWZpbmVkLlxuXHQgICAgICAgIGlmICggdGhpc0FyZyApIHtcblx0ICAgICAgICAgIFQgPSB0aGlzQXJnO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIC8vIDYuIExldCBrIGJlIDBcblx0ICAgICAgICBrID0gMDtcblxuXHQgICAgICAgIC8vIDcuIFJlcGVhdCwgd2hpbGUgayA8IGxlblxuXHQgICAgICAgIHdoaWxlKCBrIDwgbGVuICkge1xuXG5cdCAgICAgICAgICB2Y
46184XIga1ZhbHVlO1xuXG5cdCAgICAgICAgICAvLyBhLiBMZXQgUGsgYmUgVG9TdHJpbmcoaykuXG5cdCAgICAgICAgICAvLyAgIFRoaXMgaXMgaW1wbGljaXQgZm9yIExIUyBvcGVyYW5kcyBvZiB0aGUgaW4gb3BlcmF0b3Jcblx0ICAgICAgICAgIC8vIGIuIExldCBrUHJlc2VudCBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIEhhc1Byb3BlcnR5IGludGVybmFsIG1ldGhvZCBvZiBPIHdpdGggYXJndW1lbnQgUGsuXG5cdCAgICAgICAgICAvLyAgIFRoaXMgc3RlcCBjYW4gYmUgY29tYmluZWQgd2l0aCBjXG5cdCAgICAgICAgICAvLyBjLiBJZiBrUHJlc2VudCBpcyB0cnVlLCB0aGVuXG5cdCAgICAgICAgICBpZiAoIGsgaW4gTyApIHtcblxuXHQgICAgICAgICAgICAvLyBpLiBMZXQga1ZhbHVlIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgR2V0IGludGVybmFsIG1ldGhvZCBvZiBPIHdpdGggYXJndW1lbnQgUGsuXG5cdCAgICAgICAgICAgIGtWYWx1ZSA9IE9bIGsgXTtcblxuXHQgICAgICAgICAgICAvLyBpaS4gQ2FsbCB0aGUgQ2FsbCBpbnRlcm5hbCBtZXRob2Qgb2YgY2FsbGJhY2sgd2l0aCBUIGFzIHRoZSB0aGlzIHZhbHVlIGFuZFxuXHQgICAgICAgICAgICAvLyBhcmd1bWVudCBsaXN0IGNvbnRhaW5pbmcga1ZhbHVlLCBrLCBhbmQgTy5cblx0ICAgICAgICAgICAgY2FsbGJhY2suY2FsbCggVCwga1ZhbHVlLCBrLCBPICk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICAvLyBkLiBJbmNyZWFzZSBrIGJ5IDEuXG5cdCAgICAgICAgICBrKys7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIDguIHJldHVybiB1bmRlZmluZWRcblx0ICAgIH07XG5cblx0ICAgIFR3aWcubWVyZ2UgPSBmdW5jdGlvbih0YXJnZXQsIHNvdXJjZSwgb25seUNoYW5nZWQpIHtcblx0ICAgICAgICBUd2lnLmZvckVhY2goT2JqZWN0LmtleXMoc291cmNlKSwgZnVuY3Rpb24gKGtleSkge1xuXHQgICAgICAgICAgICBpZiAob25seUNoYW5nZWQgJiYgIShrZXkgaW4gdGFyZ2V0KSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XVxuXHQgICAgICAgIH0pO1xuXG5cdCAgICAgICAgcmV0dXJuIHRhcmdldDtcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogRXhjZXB0aW9uIHRocm93biBieSB0d2lnLmpzLlxuXHQgICAgICovXG5cdCAgICBUd2lnLkVycm9yID0gZnVuY3Rpb24obWVzc2FnZSwgZmlsZSkge1xuXHQgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcblx0ICAgICAgIHRoaXMubmFtZSA9IFwiVHdpZ0V4Y2VwdGlvblwiO1xuXHQgICAgICAgdGhpcy50eXBlID0gXCJUd2lnRXhjZXB0aW9uXCI7XG5cdCAgICAgICB0aGlzLmZpbGUgPSBmaWxlO1xuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBHZXQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIFR3aWcgZXJyb3IuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcuRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMubmFtZSArIFwiOiBcIiArIHRoaXMubWVzc2FnZTtcblxuXHQgICAgICAgIHJldHVybiBvdXRwdXQ7XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIFdyYXBwZXIgZm9yIGxvZ2dpbmcgdG8gdGhlIGNvbnNvbGUuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcubG9nID0ge1xuXHQgICAgICAgIHRyYWNlOiBmdW5jdGlvbigpIHtpZiAoVHdpZy50cmFjZSAmJiBjb25zb2xlKSB7Y29uc29sZS5sb2coQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7fX0sXG5cdCAgICAgICAgZGVidWc6IGZ1bmN0aW9uKCkge2lmIChUd2lnLmRlYnVnICYmIGNvbnNvbGUpIHtjb25zb2xlLmxvZyhBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKTt9fVxuXHQgICAgfTtcblxuXG5cdCAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIpIHtcblx0ICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUuZXJyb3IgIT09IFwidW5kZWZpbmVkXCIpIHtcblx0ICAgICAgICAgICAgVHdpZy5sb2cuZXJyb3IgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnNvbGUubG9nICE9PSBcInVuZGVmaW5lZFwiKSB7XG5cdCAgICAgICAgICAgIFR3aWcubG9nLmVycm9yID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgICBUd2lnLmxvZy5lcnJvciA9IGZ1bmN0aW9uKCl7fTtcblx0ICAgIH1cblxuXHQgICAgLyoqXG5cdCAgICAgKiBXcmFwcGVyIGZvciBjaGlsZCBjb250ZXh0IG9iamVjdHMgaW4gVHdpZy5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCBWYWx1ZXMgdG8gaW5pdGlhbGl6ZSB0aGUgY29udGV4dCB3aXRoLlxuXHQgICAgICovXG5cdCAgICBUd2lnLkNoaWxkQ29udGV4dCA9IGZ1bmN0aW9uKGNvbnRleHQpIHtcblx0ICAgICAgICB2Y
46184XIgQ2hpbGRDb250ZXh0ID0gZnVuY3Rpb24gQ2hpbGRDb250ZXh0KCkge307XG5cdCAgICAgICAgQ2hpbGRDb250ZXh0LnByb3RvdHlwZSA9IGNvbnRleHQ7XG5cdCAgICAgICAgcmV0dXJuIG5ldyBDaGlsZENvbnRleHQoKTtcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogQ29udGFpbmVyIGZvciBtZXRob2RzIHJlbGF0ZWQgdG8gaGFuZGxpbmcgaGlnaCBsZXZlbCB0ZW1wbGF0ZSB0b2tlbnNcblx0ICAgICAqICAgICAgKGZvciBleGFtcGxlOiB7eyBleHByZXNzaW9uIH19LCB7JSBsb2dpYyAlfSwgeyMgY29tbWVudCAjfSwgcmF3IGRhdGEpXG5cdCAgICAgKi9cblx0ICAgIFR3aWcudG9rZW4gPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBUb2tlbiB0eXBlcy5cblx0ICAgICAqL1xuXHQgICAgVHdpZy50b2tlbi50eXBlID0ge1xuXHQgICAgICAgIG91dHB1dDogICAgICAgICAgICAgICAgICdvdXRwdXQnLFxuXHQgICAgICAgIGxvZ2ljOiAgICAgICAgICAgICAgICAgICdsb2dpYycsXG5cdCAgICAgICAgY29tbWVudDogICAgICAgICAgICAgICAgJ2NvbW1lbnQnLFxuXHQgICAgICAgIHJhdzogICAgICAgICAgICAgICAgICAgICdyYXcnLFxuXHQgICAgICAgIG91dHB1dF93aGl0ZXNwYWNlX3ByZTogICdvdXRwdXRfd2hpdGVzcGFjZV9wcmUnLFxuXHQgICAgICAgIG91dHB1dF93aGl0ZXNwYWNlX3Bvc3Q6ICdvdXRwdXRfd2hpdGVzcGFjZV9wb3N0Jyxcblx0ICAgICAgICBvdXRwdXRfd2hpdGVzcGFjZV9ib3RoOiAnb3V0cHV0X3doaXRlc3BhY2VfYm90aCcsXG5cdCAgICAgICAgbG9naWNfd2hpdGVzcGFjZV9wcmU6ICAgJ2xvZ2ljX3doaXRlc3BhY2VfcHJlJyxcblx0ICAgICAgICBsb2dpY193aGl0ZXNwYWNlX3Bvc3Q6ICAnbG9naWNfd2hpdGVzcGFjZV9wb3N0Jyxcblx0ICAgICAgICBsb2dpY193aGl0ZXNwYWNlX2JvdGg6ICAnbG9naWNfd2hpdGVzcGFjZV9ib3RoJ1xuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBUb2tlbiBzeW50YXggZGVmaW5pdGlvbnMuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcudG9rZW4uZGVmaW5pdGlvbnMgPSBbXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLnRva2VuLnR5cGUucmF3LFxuXHQgICAgICAgICAgICBvcGVuOiAneyUgcmF3ICV9Jyxcblx0ICAgICAgICAgICAgY2xvc2U6ICd7JSBlbmRyYXcgJX0nXG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcudG9rZW4udHlwZS5yYXcsXG5cdCAgICAgICAgICAgIG9wZW46ICd7JSB2ZXJiYXRpbSAlfScsXG5cdCAgICAgICAgICAgIGNsb3NlOiAneyUgZW5kdmVyYmF0aW0gJX0nXG5cdCAgICAgICAgfSxcblx0ICAgICAgICAvLyAqV2hpdGVzcGFjZSB0eXBlIHRva2Vucypcblx0ICAgICAgICAvL1xuXHQgICAgICAgIC8vIFRoZXNlIHR5cGljYWxseSB0YWtlIHRoZSBmb3JtIGB7ey0gZXhwcmVzc2lvbiAtfX1gIG9yIGB7ey0gZXhwcmVzc2lvbiB9fWAgb3IgYHt7IGV4cHJlc3Npb24gLX19YC5cblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcudG9rZW4udHlwZS5vdXRwdXRfd2hpdGVzcGFjZV9wcmUsXG5cdCAgICAgICAgICAgIG9wZW46ICd7ey0nLFxuXHQgICAgICAgICAgICBjbG9zZTogJ319J1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLnRva2VuLnR5cGUub3V0cHV0X3doaXRlc3BhY2VfcG9zdCxcblx0ICAgICAgICAgICAgb3BlbjogJ3t7Jyxcblx0ICAgICAgICAgICAgY2xvc2U6ICctfX0nXG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcudG9rZW4udHlwZS5vdXRwdXRfd2hpdGVzcGFjZV9ib3RoLFxuXHQgICAgICAgICAgICBvcGVuOiAne3stJyxcblx0ICAgICAgICAgICAgY2xvc2U6ICctfX0nXG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcudG9rZW4udHlwZS5sb2dpY193aGl0ZXNwYWNlX3ByZSxcblx0ICAgICAgICAgICAgb3BlbjogJ3slLScsXG5cdCAgICAgICAgICAgIGNsb3NlOiAnJX0nXG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcudG9rZW4udHlwZS5sb2dpY193aGl0ZXNwYWNlX3Bvc3QsXG5cdCAgICAgICAgICAgIG9wZW46ICd7JScsXG5cdCAgICAgICAgICAgIGNsb3NlOiAnLSV9J1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLnRva2VuLnR5cGUubG9naWNfd2hpdGVzcGFjZV9ib3RoLFxuXHQgICAgICAgICAgICBvcGVuOiAneyUtJyxcblx0ICAgICAgICAgICAgY2xvc2U6ICctJX0nXG5cdCAgICAgICAgfSxcblx0ICAgICAgICAvLyAqT3V0cHV0IHR5cGUgdG9rZW5zKlxuXHQgICAgICAgIC8vXG5cdCAgICAgICAgLy8gVGhlc2UgdHlwaWNhbGx5IHRha2UgdGhlIGZvcm0gYHt7IGV4cHJlc3Npb24gfX1gLlxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgdHlwZTogVHdpZy50b2tlbi50eXBlLm91dHB1dCxcblx0ICAgICAgICAgICAgb3BlbjogJ3t7Jyxcblx0ICAgICAgICAgICAgY2xvc2U6ICd9fSdcblx0ICAgICAgICB9LFxuXHQgICAgICAgIC8vICpMb2dpYyB0eXBlIHRva2Vucypcblx0ICAgICAgICAvL1xuXHQgICAgICAgIC8vIFRoZXNlIHR5cGljYWxseSB0YWtlIGEgZm9ybSBsaWtlIGB7JSBpZiBleHByZXNzaW9uICV9YCBvciBgeyUgZW5kaWYgJX1gXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLnRva2VuLnR5cGUubG9naWMsXG5cdCAgICAgICAgICAgIG9wZW46ICd7JScsXG5cdCAgICAgICAgICAgIGNsb3NlOiAnJX0nXG5cdCAgICAgICAgfSxcblx0ICAgICAgICAvLyAqQ29tbWVudCB0eXBlIHRva2Vucypcblx0ICAgICAgICAvL1xuXHQgICAgICAgIC8vIFRoZXNlIHRha2UgdGhlIGZvcm0gYHsjIGFueXRoaW5nICN9YFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgdHlwZTogVHdpZy50b2tlbi50eXBlLmNvbW1lbnQsXG5cdCAgICAgICAgICAgIG9wZW46ICd7IycsXG5cdCAgICAgICAgICAgIGNsb3NlOiAnI30nXG5cdCAgICAgICAgfVxuXHQgICAgXTtcblxuXG5cdCAgICAvKipcblx0ICAgICAqIFdoYXQgY2hhcmFjdGVycyBzdGFydCBcInN0cmluZ3NcIiBpbiB0b2tlbiBkZWZpbml0aW9ucy4gV2UgbmVlZCB0aGlzIHRvIGlnbm9yZSB0b2tlbiBjbG9zZVxuXHQgICAgICogc3RyaW5ncyBpbnNpZGUgYW4gZXhwcmVzc2lvbi5cblx0ICAgICAqL1xuXHQgICAgVHdpZy50b2tlbi5zdHJpbmdzID0gW
46184ydcIicsIFwiJ1wiXTtcblxuXHQgICAgVHdpZy50b2tlbi5maW5kU3RhcnQgPSBmdW5jdGlvbiAodGVtcGxhdGUpIHtcblx0ICAgICAgICB2YXIgb3V0cHV0ID0ge1xuXHQgICAgICAgICAgICAgICAgcG9zaXRpb246IG51bGwsXG5cdCAgICAgICAgICAgICAgICBjbG9zZV9wb3NpdGlvbjogbnVsbCxcblx0ICAgICAgICAgICAgICAgIGRlZjogbnVsbFxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBpLFxuXHQgICAgICAgICAgICB0b2tlbl90ZW1wbGF0ZSxcblx0ICAgICAgICAgICAgZmlyc3Rfa2V5X3Bvc2l0aW9uLFxuXHQgICAgICAgICAgICBjbG9zZV9rZXlfcG9zaXRpb247XG5cblx0ICAgICAgICBmb3IgKGk9MDtpPFR3aWcudG9rZW4uZGVmaW5pdGlvbnMubGVuZ3RoO2krKykge1xuXHQgICAgICAgICAgICB0b2tlbl90ZW1wbGF0ZSA9IFR3aWcudG9rZW4uZGVmaW5pdGlvbnNbaV07XG5cdCAgICAgICAgICAgIGZpcnN0X2tleV9wb3NpdGlvbiA9IHRlbXBsYXRlLmluZGV4T2YodG9rZW5fdGVtcGxhdGUub3Blbik7XG5cdCAgICAgICAgICAgIGNsb3NlX2tleV9wb3NpdGlvbiA9IHRlbXBsYXRlLmluZGV4T2YodG9rZW5fdGVtcGxhdGUuY2xvc2UpO1xuXG5cdCAgICAgICAgICAgIFR3aWcubG9nLnRyYWNlKFwiVHdpZy50b2tlbi5maW5kU3RhcnQ6IFwiLCBcIlNlYXJjaGluZyBmb3IgXCIsIHRva2VuX3RlbXBsYXRlLm9wZW4sIFwiIGZvdW5kIGF0IFwiLCBmaXJzdF9rZXlfcG9zaXRpb24pO1xuXG5cdCAgICAgICAgICAgIC8vU3BlY2lhbCBoYW5kbGluZyBmb3IgbWlzbWF0Y2hlZCB0b2tlbnNcblx0ICAgICAgICAgICAgaWYgKGZpcnN0X2tleV9wb3NpdGlvbiA+PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAvL1RoaXMgdG9rZW4gbWF0Y2hlcyB0aGUgdGVtcGxhdGVcblx0ICAgICAgICAgICAgICAgIGlmICh0b2tlbl90ZW1wbGF0ZS5vcGVuLmxlbmd0aCAhPT0gdG9rZW5fdGVtcGxhdGUuY2xvc2UubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy9UaGlzIHRva2VuIGhhcyBtaXNtYXRjaGVkIGNsb3NpbmcgYW5kIG9wZW5pbmcgdGFnc1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChjbG9zZV9rZXlfcG9zaXRpb24gPCAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhpcyB0b2tlbidzIGNsb3NpbmcgdGFnIGRvZXMgbm90IG1hdGNoIHRoZSB0ZW1wbGF0ZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgLy8gRG9lcyB0aGlzIHRva2VuIG9jY3VyIGJlZm9yZSBhbnkgb3RoZXIgdHlwZXM/XG5cdCAgICAgICAgICAgIGlmIChmaXJzdF9rZXlfcG9zaXRpb24gPj0gMCAmJiAob3V0cHV0LnBvc2l0aW9uID09PSBudWxsIHx8IGZpcnN0X2tleV9wb3NpdGlvbiA8IG91dHB1dC5wb3NpdGlvbikpIHtcblx0ICAgICAgICAgICAgICAgIG91dHB1dC5wb3NpdGlvbiA9IGZpcnN0X2tleV9wb3NpdGlvbjtcblx0ICAgICAgICAgICAgICAgIG91dHB1dC5kZWYgPSB0b2tlbl90ZW1wbGF0ZTtcblx0ICAgICAgICAgICAgICAgIG91dHB1dC5jbG9zZV9wb3NpdGlvbiA9IGNsb3NlX2tleV9wb3NpdGlvbjtcblx0ICAgICAgICAgICAgfSBlbHNlIGlmIChmaXJzdF9rZXlfcG9zaXRpb24gPj0gMCAmJiBvdXRwdXQucG9zaXRpb24gIT09IG51bGwgJiYgZmlyc3Rfa2V5X3Bvc2l0aW9uID09PSBvdXRwdXQucG9zaXRpb24pIHtcblx0ICAgICAgICAgICAgICAgIC8qVGhpcyB0b2tlbiBleGFjdGx5IG1hdGNoZXMgYW5vdGhlciB0b2tlbixcblx0ICAgICAgICAgICAgICAgIGdyZWVkaWx5IG1hdGNoIHRvIGNoZWNrIGlmIHRoaXMgdG9rZW4gaGFzIGEgZ3JlYXRlciBzcGVjaWZpY2l0eSovXG5cdCAgICAgICAgICAgICAgICBpZiAodG9rZW5fdGVtcGxhdGUub3Blbi5sZW5ndGggPiBvdXRwdXQuZGVmLm9wZW4ubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy9UaGlzIHRva2VuJ3Mgb3BlbmluZyB0YWcgaXMgbW9yZSBzcGVjaWZpYyB0aGFuIHRoZSBwcmV2aW91cyBtYXRjaFxuXHQgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wb3NpdGlvbiA9IGZpcnN0X2tleV9wb3NpdGlvbjtcblx0ICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZGVmID0gdG9rZW5fdGVtcGxhdGU7XG5cdCAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNsb3NlX3Bvc2l0aW9uID0gY2xvc2Vfa2V5X3Bvc2l0aW9uO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbl90ZW1wbGF0ZS5vcGVuLmxlbmd0aCA9PT0gb3V0cHV0LmRlZi5vcGVuLmxlbmd0aCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbl90ZW1wbGF0ZS5jbG9zZS5sZW5ndGggPiBvdXRwdXQuZGVmLmNsb3NlLmxlbmd0aCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvL1RoaXMgdG9rZW4ncyBvcGVuaW5nIHRhZyBpcyBhcyBzcGVjaWZpYyBhcyB0aGUgcHJldmlvdXMgbWF0Y2gsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vYnV0IHRoZSBjbG9zaW5nIHRhZyBoYXMgZ3JlYXRlciBzcGVjaWZpY2l0eVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xvc2Vfa2V5X3Bvc2l0aW9uID49IDAgJiYgY2xvc2Vfa2V5X3Bvc2l0aW9uIDwgb3V0cHV0LmNsb3NlX3Bvc2l0aW9uKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RoaXMgdG9rZW4ncyBjbG9zaW5nIHRhZyBleGlzdHMgaW4gdGhlIHRlbXBsYXRlLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hbmQgaXQgb2NjdXJzIHNvb25lciB0aGFuIHRoZSBwcmV2aW91cyBtYXRjaFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnBvc2l0aW9uID0gZmlyc3Rfa2V5X3Bvc2l0aW9uO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmRlZiA9IHRva2VuX3RlbXBsYXRlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNsb3NlX3Bvc2l0aW9uID0gY2xvc2Vfa2V5X3Bvc2l0aW9uO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbG9zZV9rZXlfcG9zaXRpb24gPj0gMCAmJiBjbG9zZV9rZXlfcG9zaXRpb24gPCBvdXRwdXQuY2xvc2VfcG9zaXRpb24pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGlzIHRva2VuJ3MgY2xvc2luZyB0YWcgaXMgbm90IG1vcmUgc3BlY2lmaWMgdGhhbiB0aGUgcHJldmlvdXMgbWF0Y2gsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vYnV0IGl0IG9jY3VycyBzb29uZXIgdGhhbiB0aGUgcHJldmlvdXMgbWF0Y2hcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnBvc2l0aW9uID0gZmlyc3Rfa2V5X3Bvc2l0aW9uO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZGVmID0gdG9rZW5fdGVtcGxhdGU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91
46184dHB1dC5jbG9zZV9wb3NpdGlvbiA9IGNsb3NlX2tleV9wb3NpdGlvbjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICBkZWxldGUgb3V0cHV0WydjbG9zZV9wb3NpdGlvbiddO1xuXG5cdCAgICAgICAgcmV0dXJuIG91dHB1dDtcblx0ICAgIH07XG5cblx0ICAgIFR3aWcudG9rZW4uZmluZEVuZCA9IGZ1bmN0aW9uICh0ZW1wbGF0ZSwgdG9rZW5fZGVmLCBzdGFydCkge1xuXHQgICAgICAgIHZhciBlbmQgPSBudWxsLFxuXHQgICAgICAgICAgICBmb3VuZCA9IGZhbHNlLFxuXHQgICAgICAgICAgICBvZmZzZXQgPSAwLFxuXG5cdCAgICAgICAgICAgIC8vIFN0cmluZyBwb3NpdGlvbiB2YXJpYWJsZXNcblx0ICAgICAgICAgICAgc3RyX3BvcyA9IG51bGwsXG5cdCAgICAgICAgICAgIHN0cl9mb3VuZCA9IG51bGwsXG5cdCAgICAgICAgICAgIHBvcyA9IG51bGwsXG5cdCAgICAgICAgICAgIGVuZF9vZmZzZXQgPSBudWxsLFxuXHQgICAgICAgICAgICB0aGlzX3N0cl9wb3MgPSBudWxsLFxuXHQgICAgICAgICAgICBlbmRfc3RyX3BvcyA9IG51bGwsXG5cblx0ICAgICAgICAgICAgLy8gRm9yIGxvb3AgdmFyaWFibGVzXG5cdCAgICAgICAgICAgIGksXG5cdCAgICAgICAgICAgIGw7XG5cblx0ICAgICAgICB3aGlsZSAoIWZvdW5kKSB7XG5cdCAgICAgICAgICAgIHN0cl9wb3MgPSBudWxsO1xuXHQgICAgICAgICAgICBzdHJfZm91bmQgPSBudWxsO1xuXHQgICAgICAgICAgICBwb3MgPSB0ZW1wbGF0ZS5pbmRleE9mKHRva2VuX2RlZi5jbG9zZSwgb2Zmc2V0KTtcblxuXHQgICAgICAgICAgICBpZiAocG9zID49IDApIHtcblx0ICAgICAgICAgICAgICAgIGVuZCA9IHBvcztcblx0ICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIC8vIHRocm93IGFuIGV4Y2VwdGlvblxuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJVbmFibGUgdG8gZmluZCBjbG9zaW5nIGJyYWNrZXQgJ1wiICsgdG9rZW5fZGVmLmNsb3NlICtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIidcIiArIFwiIG9wZW5lZCBuZWFyIHRlbXBsYXRlIHBvc2l0aW9uIFwiICsgc3RhcnQpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gSWdub3JlIHF1b3RlcyB3aXRoaW4gY29tbWVudHM7IGp1c3QgbG9vayBmb3IgdGhlIG5leHQgY29tbWVudCBjbG9zZSBzZXF1ZW5jZSxcblx0ICAgICAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB3aGF0IGNvbWVzIGJlZm9yZSBpdC4gaHR0cHM6Ly9naXRodWIuY29tL2p1c3Rqb2huL3R3aWcuanMvaXNzdWVzLzk1XG5cdCAgICAgICAgICAgIGlmICh0b2tlbl9kZWYudHlwZSA9PT0gVHdpZy50b2tlbi50eXBlLmNvbW1lbnQpIHtcblx0ICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyBJZ25vcmUgcXVvdGVzIHdpdGhpbiByYXcgdGFnXG5cdCAgICAgICAgICAgIC8vIEZpeGVzICMyODNcblx0ICAgICAgICAgICAgaWYgKHRva2VuX2RlZi50eXBlID09PSBUd2lnLnRva2VuLnR5cGUucmF3KSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIGwgPSBUd2lnLnRva2VuLnN0cmluZ3MubGVuZ3RoO1xuXHQgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSArPSAxKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzX3N0cl9wb3MgPSB0ZW1wbGF0ZS5pbmRleE9mKFR3aWcudG9rZW4uc3RyaW5nc1tpXSwgb2Zmc2V0KTtcblxuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXNfc3RyX3BvcyA+IDAgJiYgdGhpc19zdHJfcG9zIDwgcG9zICYmXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIChzdHJfcG9zID09PSBudWxsIHx8IHRoaXNfc3RyX3BvcyA8IHN0cl9wb3MpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RyX3BvcyA9IHRoaXNfc3RyX3Bvcztcblx0ICAgICAgICAgICAgICAgICAgICBzdHJfZm91bmQgPSBUd2lnLnRva2VuLnN0cmluZ3NbaV07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBXZSBmb3VuZCBhIHN0cmluZyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgdG9rZW4sIG5vdyBmaW5kIHRoZSBzdHJpbmcncyBlbmQgYW5kIHNldCB0aGUgc2VhcmNoIG9mZnNldCB0byBpdFxuXHQgICAgICAgICAgICBpZiAoc3RyX3BvcyAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgZW5kX29mZnNldCA9IHN0cl9wb3MgKyAxO1xuXHQgICAgICAgICAgICAgICAgZW5kID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGVuZF9zdHJfcG9zID0gdGVtcGxhdGUuaW5kZXhPZihzdHJfZm91bmQsIGVuZF9vZmZzZXQpO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChlbmRfc3RyX3BvcyA8IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgXCJVbmNsb3NlZCBzdHJpbmcgaW4gdGVtcGxhdGVcIjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGVzY2FwZWQgcXVvdGVzXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlLnN1YnN0cihlbmRfc3RyX3BvcyAtIDEsIDEpICE9PSBcIlxcXFxcIikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBlbmRfc3RyX3BvcyArIDE7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9vZmZzZXQgPSBlbmRfc3RyX3BvcyArIDE7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBlbmQ7XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIENvbnZlcnQgYSB0ZW1wbGF0ZSBpbnRvIGhpZ2gtbGV2ZWwgdG9rZW5zLlxuXHQgICAgICovXG5cdCAgICBUd2lnLnRva2VuaXplID0gZnVuY3Rpb24gKHRlbXBsYXRlKSB7XG5cdCAgICAgICAgdmFyIHRva2VucyA9IFtdLFxuXHQgICAgICAgICAgICAvLyBBbiBvZmZzZXQgZm9yIHJlcG9ydGluZyBlcnJvcnMgbG9jYXRpb25zIGluIHRoZSB0ZW1wbGF0ZS5cblx0ICAgICAgICAgICAgZXJyb3Jfb2Zmc2V0ID0gMCxcblxuXHQgICAgICAgICAgICAvLyBUaGUgc3RhcnQgYW5kIHR5cGUgb2YgdGhlIGZpcnN0IHRva2VuIGZvdW5kIGluIHRoZSB0ZW1wbGF0ZS5cblx0ICAgICAgICAgICAgZm91bmRfdG9rZW4gPSBudWxsLFxuXHQgICAgICAgICAgICAvLyBUaGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBtYXRjaGVkIHRva2VuLlxuXHQgICAgICAgICAgICBlbmQgPSBudWxsO1xuXG5cdCAgICAgICAgd2hpbGUgKHRlbXBsYXRlLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgLy8gRmluZCB0aGUgZmlyc3Qgb2NjdXJhbmNlIG9mIGFueSB0b2tlbiB0eXBlIGluIHRoZSB0ZW1wbGF0ZVxuXHQgICAgICAgICAgICBmb3VuZF90b2tlbiA9IFR3aWcudG9rZW4uZmluZFN0YXJ0KHRlbXBsYXRlKTtcblxuXHQgICAgICAgICAgICBUd2lnLmxvZy50cmFjZShcIlR3aWcudG9rZW5pemU6IFwiLCBcIkZvdW5kIHRva2VuOiBcIiwgZm91bmRfdG9rZW4pO1xuXG5cdCAgICAgICAgICAgIGlmIChmb3VuZF90b2tlbi5wb3NpdGlvbiAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgLy8gQWRkIGEgcmF3IHR5cGUgdG9rZW4gZm9yIGFueXRoaW5nIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIHRva2VuXG5cdCAgICAgICAgICAgICAgICBpZiAoZm91bmRfdG9rZW4ucG9zaXRpb24gPiAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goe1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0eX
46184BlOiBUd2lnLnRva2VuLnR5cGUucmF3LFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGVtcGxhdGUuc3Vic3RyaW5nKDAsIGZvdW5kX3Rva2VuLnBvc2l0aW9uKVxuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5zdWJzdHIoZm91bmRfdG9rZW4ucG9zaXRpb24gKyBmb3VuZF90b2tlbi5kZWYub3Blbi5sZW5ndGgpO1xuXHQgICAgICAgICAgICAgICAgZXJyb3Jfb2Zmc2V0ICs9IGZvdW5kX3Rva2VuLnBvc2l0aW9uICsgZm91bmRfdG9rZW4uZGVmLm9wZW4ubGVuZ3RoO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBlbmQgb2YgdGhlIHRva2VuXG5cdCAgICAgICAgICAgICAgICBlbmQgPSBUd2lnLnRva2VuLmZpbmRFbmQodGVtcGxhdGUsIGZvdW5kX3Rva2VuLmRlZiwgZXJyb3Jfb2Zmc2V0KTtcblxuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2cudHJhY2UoXCJUd2lnLnRva2VuaXplOiBcIiwgXCJUb2tlbiBlbmRzIGF0IFwiLCBlbmQpO1xuXG5cdCAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh7XG5cdCAgICAgICAgICAgICAgICAgICAgdHlwZTogIGZvdW5kX3Rva2VuLmRlZi50eXBlLFxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0ZW1wbGF0ZS5zdWJzdHJpbmcoMCwgZW5kKS50cmltKClcblx0ICAgICAgICAgICAgICAgIH0pO1xuXG5cdCAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUuc3Vic3RyKCBlbmQgKyBmb3VuZF90b2tlbi5kZWYuY2xvc2UubGVuZ3RoLCAxICkgPT09IFwiXFxuXCIpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvdW5kX3Rva2VuLmRlZi50eXBlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsb2dpY193aGl0ZXNwYWNlX3ByZVwiOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibG9naWNfd2hpdGVzcGFjZV9wb3N0XCI6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsb2dpY193aGl0ZXNwYWNlX2JvdGhcIjpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxvZ2ljXCI6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXdsaW5lcyBkaXJlY3RseSBhZnRlciBsb2dpYyB0b2tlbnMgYXJlIGlnbm9yZWRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCArPSAxO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnN1YnN0cihlbmQgKyBmb3VuZF90b2tlbi5kZWYuY2xvc2UubGVuZ3RoKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IHRoZSBwb3NpdGlvbiBpbiB0aGUgdGVtcGxhdGVcblx0ICAgICAgICAgICAgICAgIGVycm9yX29mZnNldCArPSBlbmQgKyBmb3VuZF90b2tlbi5kZWYuY2xvc2UubGVuZ3RoO1xuXG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAvLyBObyBtb3JlIHRva2VucyAtPiBhZGQgdGhlIHJlc3Qgb2YgdGhlIHRlbXBsYXRlIGFzIGEgcmF3LXR5cGUgdG9rZW5cblx0ICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHtcblx0ICAgICAgICAgICAgICAgICAgICB0eXBlOiBUd2lnLnRva2VuLnR5cGUucmF3LFxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0ZW1wbGF0ZVxuXHQgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9ICcnO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcmV0dXJuIHRva2Vucztcblx0ICAgIH07XG5cblxuXHQgICAgVHdpZy5jb21waWxlID0gZnVuY3Rpb24gKHRva2Vucykge1xuXHQgICAgICAgIHRyeSB7XG5cblx0ICAgICAgICAgICAgLy8gT3V0cHV0IGFuZCBpbnRlcm1lZGlhdGUgc3RhY2tzXG5cdCAgICAgICAgICAgIHZhciBvdXRwdXQgPSBbXSxcblx0ICAgICAgICAgICAgICAgIHN0YWNrID0gW10sXG5cdCAgICAgICAgICAgICAgICAvLyBUaGUgdG9rZW5zIGJldHdlZW4gb3BlbiBhbmQgY2xvc2UgdGFnc1xuXHQgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX291dHB1dCA9IFtdLFxuXG5cdCAgICAgICAgICAgICAgICB0b2tlbiA9IG51bGwsXG5cdCAgICAgICAgICAgICAgICBsb2dpY190b2tlbiA9IG51bGwsXG5cdCAgICAgICAgICAgICAgICB1bmNsb3NlZF90b2tlbiA9IG51bGwsXG5cdCAgICAgICAgICAgICAgICAvLyBUZW1wb3JhcnkgcHJldmlvdXMgdG9rZW4uXG5cdCAgICAgICAgICAgICAgICBwcmV2X3Rva2VuID0gbnVsbCxcblx0ICAgICAgICAgICAgICAgIC8vIFRlbXBvcmFyeSBwcmV2aW91cyBvdXRwdXQuXG5cdCAgICAgICAgICAgICAgICBwcmV2X291dHB1dCA9IG51bGwsXG5cdCAgICAgICAgICAgICAgICAvLyBUZW1wb3JhcnkgcHJldmlvdXMgaW50ZXJtZWRpYXRlIG91dHB1dC5cblx0ICAgICAgICAgICAgICAgIHByZXZfaW50ZXJtZWRpYXRlX291dHB1dCA9IG51bGwsXG5cdCAgICAgICAgICAgICAgICAvLyBUaGUgcHJldmlvdXMgdG9rZW4ncyB0ZW1wbGF0ZVxuXHQgICAgICAgICAgICAgICAgcHJldl90ZW1wbGF0ZSA9IG51bGwsXG5cdCAgICAgICAgICAgICAgICAvLyBUb2tlbiBsb29rYWhlYWRcblx0ICAgICAgICAgICAgICAgIG5leHRfdG9rZW4gPSBudWxsLFxuXHQgICAgICAgICAgICAgICAgLy8gVGhlIG91dHB1dCB0b2tlblxuXHQgICAgICAgICAgICAgICAgdG9rX291dHB1dCA9IG51bGwsXG5cblx0ICAgICAgICAgICAgICAgIC8vIExvZ2ljIFRva2VuIHZhbHVlc1xuXHQgICAgICAgICAgICAgICAgdHlwZSA9IG51bGwsXG5cdCAgICAgICAgICAgICAgICBvcGVuID0gbnVsbCxcblx0ICAgICAgICAgICAgICAgIG5leHQgPSBudWxsO1xuXG5cdCAgICAgICAgICAgIHZhciBjb21waWxlX291dHB1dCA9IGZ1bmN0aW9uKHRva2VuKSB7XG5cdCAgICAgICAgICAgICAgICBUd2lnLmV4cHJlc3Npb24uY29tcGlsZS5hcHBseSh0aGlzLCBbdG9rZW5dKTtcblx0ICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX291dHB1dC5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgICAgI
46184H0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9O1xuXG5cdCAgICAgICAgICAgIHZhciBjb21waWxlX2xvZ2ljID0gZnVuY3Rpb24odG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgIC8vIENvbXBpbGUgdGhlIGxvZ2ljIHRva2VuXG5cdCAgICAgICAgICAgICAgICBsb2dpY190b2tlbiA9IFR3aWcubG9naWMuY29tcGlsZS5hcHBseSh0aGlzLCBbdG9rZW5dKTtcblxuXHQgICAgICAgICAgICAgICAgdHlwZSA9IGxvZ2ljX3Rva2VuLnR5cGU7XG5cdCAgICAgICAgICAgICAgICBvcGVuID0gVHdpZy5sb2dpYy5oYW5kbGVyW3R5cGVdLm9wZW47XG5cdCAgICAgICAgICAgICAgICBuZXh0ID0gVHdpZy5sb2dpYy5oYW5kbGVyW3R5cGVdLm5leHQ7XG5cblx0ICAgICAgICAgICAgICAgIFR3aWcubG9nLnRyYWNlKFwiVHdpZy5jb21waWxlOiBcIiwgXCJDb21waWxlZCBsb2dpYyB0b2tlbiB0byBcIiwgbG9naWNfdG9rZW4sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBuZXh0IGlzOiBcIiwgbmV4dCwgXCIgb3BlbiBpcyA6IFwiLCBvcGVuKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gTm90IGEgc3RhbmRhbG9uZSB0b2tlbiwgY2hlY2sgbG9naWMgc3RhY2sgdG8gc2VlIGlmIHRoaXMgaXMgZXhwZWN0ZWRcblx0ICAgICAgICAgICAgICAgIGlmIChvcGVuICE9PSB1bmRlZmluZWQgJiYgIW9wZW4pIHtcblx0ICAgICAgICAgICAgICAgICAgICBwcmV2X3Rva2VuID0gc3RhY2sucG9wKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgcHJldl90ZW1wbGF0ZSA9IFR3aWcubG9naWMuaGFuZGxlcltwcmV2X3Rva2VuLnR5cGVdO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKFR3aWcuaW5kZXhPZihwcmV2X3RlbXBsYXRlLm5leHQsIHR5cGUpIDwgMCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZSArIFwiIG5vdCBleHBlY3RlZCBhZnRlciBhIFwiICsgcHJldl90b2tlbi50eXBlKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICBwcmV2X3Rva2VuLm91dHB1dCA9IHByZXZfdG9rZW4ub3V0cHV0IHx8IFtdO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgcHJldl90b2tlbi5vdXRwdXQgPSBwcmV2X3Rva2VuLm91dHB1dC5jb25jYXQoaW50ZXJtZWRpYXRlX291dHB1dCk7XG5cdCAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX291dHB1dCA9IFtdO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgdG9rX291dHB1dCA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogVHdpZy50b2tlbi50eXBlLmxvZ2ljLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogcHJldl90b2tlblxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX291dHB1dC5wdXNoKHRva19vdXRwdXQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHRva19vdXRwdXQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gVGhpcyB0b2tlbiByZXF1aXJlcyBhZGRpdGlvbmFsIHRva2VucyB0byBjb21wbGV0ZSB0aGUgbG9naWMgc3RydWN0dXJlLlxuXHQgICAgICAgICAgICAgICAgaWYgKG5leHQgIT09IHVuZGVmaW5lZCAmJiBuZXh0Lmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICBUd2lnLmxvZy50cmFjZShcIlR3aWcuY29tcGlsZTogXCIsIFwiUHVzaGluZyBcIiwgbG9naWNfdG9rZW4sIFwiIHRvIGxvZ2ljIHN0YWNrLlwiKTtcblxuXHQgICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFB1dCBhbnkgY3VycmVudGx5IGhlbGQgb3V0cHV0IGludG8gdGhlIG91dHB1dCBsaXN0IG9mIHRoZSBsb2dpYyBvcGVyYXRvclxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgYXQgdGhlIGhlYWQgb2YgdGhlIHN0YWNrIGJlZm9yZSB3ZSBwdXNoIGEgbmV3IG9uZSBvbi5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgcHJldl90b2tlbiA9IHN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3Rva2VuLm91dHB1dCA9IHByZXZfdG9rZW4ub3V0cHV0IHx8IFtdO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3Rva2VuLm91dHB1dCA9IHByZXZfdG9rZW4ub3V0cHV0LmNvbmNhdChpbnRlcm1lZGlhdGVfb3V0cHV0KTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChwcmV2X3Rva2VuKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX291dHB1dCA9IFtdO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIC8vIFB1c2ggdGhlIG5ldyBsb2dpYyB0b2tlbiBvbnRvIHRoZSBsb2dpYyBzdGFja1xuXHQgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2gobG9naWNfdG9rZW4pO1xuXG5cdCAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wZW4gIT09IHVuZGVmaW5lZCAmJiBvcGVuKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdG9rX291dHB1dCA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogVHdpZy50b2tlbi50eXBlLmxvZ2ljLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogbG9naWNfdG9rZW5cblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIFN0YW5kYWxvbmUgdG9rZW4gKGxpa2UgeyUgc2V0IC4uLiAlfVxuXHQgICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZV9vdXRwdXQucHVzaCh0b2tfb3V0cHV0KTtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tfb3V0cHV0KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgI
46184H07XG5cblx0ICAgICAgICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2Vucy5zaGlmdCgpO1xuXHQgICAgICAgICAgICAgICAgcHJldl9vdXRwdXQgPSBvdXRwdXRbb3V0cHV0Lmxlbmd0aCAtIDFdO1xuXHQgICAgICAgICAgICAgICAgcHJldl9pbnRlcm1lZGlhdGVfb3V0cHV0ID0gaW50ZXJtZWRpYXRlX291dHB1dFtpbnRlcm1lZGlhdGVfb3V0cHV0Lmxlbmd0aCAtIDFdO1xuXHQgICAgICAgICAgICAgICAgbmV4dF90b2tlbiA9IHRva2Vuc1swXTtcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9nLnRyYWNlKFwiQ29tcGlsaW5nIHRva2VuIFwiLCB0b2tlbik7XG5cdCAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlIFR3aWcudG9rZW4udHlwZS5yYXc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGVfb3V0cHV0LnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSBUd2lnLnRva2VuLnR5cGUubG9naWM6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVfbG9naWMuY2FsbCh0aGlzLCB0b2tlbik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZywgY29tbWVudHMgc2hvdWxkIGJlIGlnbm9yZWRcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlIFR3aWcudG9rZW4udHlwZS5jb21tZW50OlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgVHdpZy50b2tlbi50eXBlLm91dHB1dDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZV9vdXRwdXQuY2FsbCh0aGlzLCB0b2tlbik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgLy9LaWxsIHdoaXRlc3BhY2UgYWhlYWQgYW5kIGJlaGluZCB0aGlzIHRva2VuXG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSBUd2lnLnRva2VuLnR5cGUubG9naWNfd2hpdGVzcGFjZV9wcmU6XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSBUd2lnLnRva2VuLnR5cGUubG9naWNfd2hpdGVzcGFjZV9wb3N0OlxuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgVHdpZy50b2tlbi50eXBlLmxvZ2ljX3doaXRlc3BhY2VfYm90aDpcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlIFR3aWcudG9rZW4udHlwZS5vdXRwdXRfd2hpdGVzcGFjZV9wcmU6XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSBUd2lnLnRva2VuLnR5cGUub3V0cHV0X3doaXRlc3BhY2VfcG9zdDpcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlIFR3aWcudG9rZW4udHlwZS5vdXRwdXRfd2hpdGVzcGFjZV9ib3RoOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gVHdpZy50b2tlbi50eXBlLm91dHB1dF93aGl0ZXNwYWNlX3Bvc3QgJiYgdG9rZW4udHlwZSAhPT0gVHdpZy50b2tlbi50eXBlLmxvZ2ljX3doaXRlc3BhY2VfcG9zdCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZfb3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiB0aGUgcHJldmlvdXMgb3V0cHV0IGlzIHJhdywgcG9wIGl0IG9mZlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2X291dHB1dC50eXBlID09PSBUd2lnLnRva2VuLnR5cGUucmF3KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wb3AoKTtcblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBwcmV2aW91cyBvdXRwdXQgaXMgbm90IGp1c3Qgd2hpdGVzcGFjZSwgdHJpbSBpdFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldl9vdXRwdXQudmFsdWUubWF0Y2goL15cXHMqJC8pID09PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X291dHB1dC52YWx1ZSA9IHByZXZfb3V0cHV0LnZhbHVlLnRyaW0oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVwdXNoIHRoZSBwcmV2aW91cyBvdXRwdXRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHByZXZfb3V0cHV0KTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZfaW50ZXJtZWRpYXRlX291dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgdGhlIHByZXZpb3VzIGludGVybWVkaWF0ZSBvdXRwdXQgaXMgcmF3LCBwb3AgaXQgb2ZmXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZfaW50ZXJtZWRpYXRlX291dHB1dC50eXBlID09PSBUd2lnLnRva2VuLnR5cGUucmF3KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZV9vdXRwdXQucG9wKCk7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiB0aGUgcHJldmlvdXMgb3V0cHV0IGlzIG5vdCBqdXN0IHdoaXRlc3BhY2UsIHRyaW0gaXRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZfaW50ZXJtZWRpYXRlX291dHB1dC52YWx1ZS5tYXRjaCgvXlxccyokLykgPT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
46184HByZXZfaW50ZXJtZWRpYXRlX291dHB1dC52YWx1ZSA9IHByZXZfaW50ZXJtZWRpYXRlX291dHB1dC52YWx1ZS50cmltKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1JlcHVzaCB0aGUgcHJldmlvdXMgaW50ZXJtZWRpYXRlIG91dHB1dFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX291dHB1dC5wdXNoKHByZXZfaW50ZXJtZWRpYXRlX291dHB1dCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvL0NvbXBpbGUgdGhpcyB0b2tlblxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVHdpZy50b2tlbi50eXBlLm91dHB1dF93aGl0ZXNwYWNlX3ByZTpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVHdpZy50b2tlbi50eXBlLm91dHB1dF93aGl0ZXNwYWNlX3Bvc3Q6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFR3aWcudG9rZW4udHlwZS5vdXRwdXRfd2hpdGVzcGFjZV9ib3RoOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVfb3V0cHV0LmNhbGwodGhpcywgdG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUd2lnLnRva2VuLnR5cGUubG9naWNfd2hpdGVzcGFjZV9wcmU6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFR3aWcudG9rZW4udHlwZS5sb2dpY193aGl0ZXNwYWNlX3Bvc3Q6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFR3aWcudG9rZW4udHlwZS5sb2dpY193aGl0ZXNwYWNlX2JvdGg6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZV9sb2dpYy5jYWxsKHRoaXMsIHRva2VuKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlICE9PSBUd2lnLnRva2VuLnR5cGUub3V0cHV0X3doaXRlc3BhY2VfcHJlICYmIHRva2VuLnR5cGUgIT09IFR3aWcudG9rZW4udHlwZS5sb2dpY193aGl0ZXNwYWNlX3ByZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRfdG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBuZXh0IHRva2VuIGlzIHJhdywgc2hpZnQgaXQgb3V0XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRfdG9rZW4udHlwZSA9PT0gVHdpZy50b2tlbi50eXBlLnJhdykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKTtcblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBuZXh0IHRva2VuIGlzIG5vdCBqdXN0IHdoaXRlc3BhY2UsIHRyaW0gaXRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRfdG9rZW4udmFsdWUubWF0Y2goL15cXHMqJC8pID09PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3Rva2VuLnZhbHVlID0gbmV4dF90b2tlbi52YWx1ZS50cmltKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Vuc2hpZnQgdGhlIG5leHQgdG9rZW5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vucy51bnNoaWZ0KG5leHRfdG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIFR3aWcubG9nLnRyYWNlKFwiVHdpZy5jb21waWxlOiBcIiwgXCIgT3V0cHV0OiBcIiwgb3V0cHV0LFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgTG9naWMgU3RhY2s6IFwiLCBzdGFjayxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIFBlbmRpbmcgT3V0cHV0OiBcIiwgaW50ZXJtZWRpYXRlX291dHB1dCApO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlcmUgYXJlIG5vIGxvZ2ljIHRva2VucyBsZWZ0IGluIHRoZSBzdGFjay5cblx0ICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgIHVuY2xvc2VkX3Rva2VuID0gc3RhY2sucG9wKCk7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gZmluZCBhbiBlbmQgdGFnIGZvciBcIiArIHVuY2xvc2VkX3Rva2VuLnR5cGUgK1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLCBleHBlY3Rpbmcgb25lIG9mIFwiICsgdW5jbG9zZWRfdG9rZW4ubmV4dCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcblx0ICAgICAgICB9IGNhdGNoIChleCkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJldGhyb3cpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChleC50eXBlID09ICdUd2lnRXhjZXB0aW9uJyAmJiAhZXguZmlsZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGV4LmZpbGUgPSB0aGlzLmlkO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICB0aHJvdyBleFxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2cuZXJyb3IoXCJFcnJvciBjb21waWxpbmcgdHdpZyB0ZW1wbGF0ZSBcIiArIHRoaXMuaWQgKyBcIjogXCIpO1xuXHQgICAgICAgICAgICAgICAgaWYgKGV4LnN0YWNrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgVHdpZy5sb2cuZXJyb3IoZXguc3RhY2spO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBUd2lnLmxvZy5lcnJvcihleC50b1N0cmluZygpKTtcblx0ICAgICAgICAgICAgICAgI
46184H1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogUGFyc2UgYSBjb21waWxlZCB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge0FycmF5fSB0b2tlbnMgVGhlIGNvbXBpbGVkIHRva2Vucy5cblx0ICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0IFRoZSByZW5kZXIgY29udGV4dC5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwYXJzZWQgdGVtcGxhdGUuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcucGFyc2UgPSBmdW5jdGlvbiAodG9rZW5zLCBjb250ZXh0LCBhbGxvd19hc3luYykge1xuXHQgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcblx0ICAgICAgICAgICAgb3V0cHV0ID0gW10sXG5cblx0ICAgICAgICAgICAgLy8gU3RvcmUgYW55IGVycm9yIHRoYXQgbWlnaHQgYmUgdGhyb3duIGJ5IHRoZSBwcm9taXNlIGNoYWluLlxuXHQgICAgICAgICAgICBlcnIgPSBudWxsLFxuXG5cdCAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBiZSBzZXQgdG8gaXNfYXN5bmMgaWYgdGVtcGxhdGUgcmVuZGVycyBzeW5jaHJvbm91c2x5XG5cdCAgICAgICAgICAgIGlzX2FzeW5jID0gdHJ1ZSxcblx0ICAgICAgICAgICAgcHJvbWlzZSA9IG51bGwsXG5cblx0ICAgICAgICAgICAgLy8gVHJhY2sgbG9naWMgY2hhaW5zXG5cdCAgICAgICAgICAgIGNoYWluID0gdHJ1ZTtcblxuXG5cdCAgICAgICAgZnVuY3Rpb24gaGFuZGxlRXhjZXB0aW9uKGV4KSB7XG5cdCAgICAgICAgICAgIGlmICh0aGF0Lm9wdGlvbnMucmV0aHJvdykge1xuXHQgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleCA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgICAgICBleCA9IG5ldyBUd2lnLkVycm9yKGV4KVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBpZiAoZXgudHlwZSA9PSAnVHdpZ0V4Y2VwdGlvbicgJiYgIWV4LmZpbGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBleC5maWxlID0gdGhhdC5pZDtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgdGhyb3cgZXg7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBUd2lnLmxvZy5lcnJvcihcIkVycm9yIHBhcnNpbmcgdHdpZyB0ZW1wbGF0ZSBcIiArIHRoYXQuaWQgKyBcIjogXCIpO1xuXHQgICAgICAgICAgICAgICAgaWYgKGV4LnN0YWNrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgVHdpZy5sb2cuZXJyb3IoZXguc3RhY2spO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBUd2lnLmxvZy5lcnJvcihleC50b1N0cmluZygpKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgaWYgKFR3aWcuZGVidWcpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXgudG9TdHJpbmcoKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHByb21pc2UgPSBUd2lnLmFzeW5jLmZvckVhY2godG9rZW5zLCBmdW5jdGlvbiBwYXJzZVRva2VuKHRva2VuKSB7XG5cdCAgICAgICAgICAgIFR3aWcubG9nLmRlYnVnKFwiVHdpZy5wYXJzZTogXCIsIFwiUGFyc2luZyB0b2tlbjogXCIsIHRva2VuKTtcblxuXHQgICAgICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcblx0ICAgICAgICAgICAgICAgIGNhc2UgVHdpZy50b2tlbi50eXBlLnJhdzpcblx0ICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChUd2lnLmZpbHRlcnMucmF3KHRva2VuLnZhbHVlKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgICAgIGNhc2UgVHdpZy50b2tlbi50eXBlLmxvZ2ljOlxuXHQgICAgICAgICAgICAgICAgICAgIHZhciBsb2dpY190b2tlbiA9IHRva2VuLnRva2VuO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcubG9naWMucGFyc2VBc3luYy5hcHBseSh0aGF0LCBbbG9naWNfdG9rZW4sIGNvbnRleHQsIGNoYWluXSlcblx0ICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihsb2dpYykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9naWMuY2hhaW4gIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW4gPSBsb2dpYy5jaGFpbjtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9naWMuY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gbG9naWMuY29udGV4dDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9naWMub3V0cHV0ICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGxvZ2ljLm91dHB1dCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICAgICAgY2FzZSBUd2lnLnRva2VuLnR5cGUuY29tbWVudDpcblx0ICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nLCBjb21tZW50cyBzaG91bGQgYmUgaWdub3JlZFxuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgICAgICAvL0ZhbGwgdGhyb3VnaCB3aGl0ZXNwYWNlIHRvIG91dHB1dFxuXHQgICAgICAgICAgICAgICAgY2FzZSBUd2lnLnRva2VuLnR5cGUub3V0cHV0X3doaXRlc3BhY2VfcHJlOlxuXHQgICAgICAgICAgICAgICAgY2FzZSBUd2lnLnRva2VuLnR5cGUub3V0cHV0X3doaXRlc3BhY2VfcG9zdDpcblx0ICAgICAgICAgICAgICAgIGNhc2UgVHdpZy50b2tlbi50eXBlLm91dHB1dF93aGl0ZXNwYWNlX2JvdGg6XG5cdCAgICAgICAgICAgICAgICBjYXNlIFR3aWcudG9rZW4udHlwZS5vdXRwdXQ6XG5cdCAgICAgICAgICAgICAgICAgICAgVHdpZy5sb2cuZGVidWcoXCJUd2lnLnBhcnNlOiBcIiwgXCJPdXRwdXQgdG9rZW46IFwiLCB0b2tlbi5zdGFjayk7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGdpdmVuIGV4cHJlc3Npb24gaW4gdGhlIGdpdmVuIGNvbnRleHRcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5leHByZXNzaW9uLnBhcnNlQXN5bmMuYXBwbHkodGhhdCwgW3Rva2VuLnN0YWNrLCBjb250ZXh0XSlcblx0ICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihvKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91
46184dHB1dC5wdXNoKG8pO1xuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSlcblx0ICAgICAgICAudGhlbihmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgb3V0cHV0ID0gVHdpZy5vdXRwdXQuYXBwbHkodGhhdCwgW291dHB1dF0pO1xuXHQgICAgICAgICAgICBpc19hc3luYyA9IGZhbHNlO1xuXHQgICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuXHQgICAgICAgIH0pXG5cdCAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGUpIHtcblx0ICAgICAgICAgICAgaWYgKGFsbG93X2FzeW5jKVxuXHQgICAgICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGUpO1xuXG5cdCAgICAgICAgICAgIGVyciA9IGU7XG5cdCAgICAgICAgfSk7XG5cblx0ICAgICAgICAvLyBJZiBgYWxsb3dfYXN5bmNgIHdlIHdpbGwgYWx3YXlzIHJldHVybiBhIHByb21pc2Ugc2luY2Ugd2UgZG8gbm90XG5cdCAgICAgICAgLy8ga25vdyBpbiBhZHZhbmNlIGlmIHdlIGFyZSBnb2luZyB0byBydW4gYXN5bmNocm9ub3VzbHkgb3Igbm90LlxuXHQgICAgICAgIGlmIChhbGxvd19hc3luYylcblx0ICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XG5cblx0ICAgICAgICAvLyBIYW5kbGUgZXJyb3JzIGhlcmUgaWYgd2UgZmFpbCBzeW5jaHJvbm91c2x5LlxuXHQgICAgICAgIGlmIChlcnIgIT09IG51bGwpXG5cdCAgICAgICAgICAgIHJldHVybiBoYW5kbGVFeGNlcHRpb24oZXJyKTtcblxuXHQgICAgICAgIC8vIElmIGBhbGxvd19hc3luY2AgaXMgbm90IHRydWUgd2Ugc2hvdWxkIG5vdCBhbGxvdyB0aGUgdXNlclxuXHQgICAgICAgIC8vIHRvIHVzZSBhc3luY2hyb25vdXMgZnVuY3Rpb25zIG9yIGZpbHRlcnMuXG5cdCAgICAgICAgaWYgKGlzX2FzeW5jKVxuXHQgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcignWW91IGFyZSB1c2luZyBUd2lnLmpzIGluIHN5bmMgbW9kZSBpbiBjb21iaW5hdGlvbiB3aXRoIGFzeW5jIGV4dGVuc2lvbnMuJyk7XG5cblx0ICAgICAgICByZXR1cm4gb3V0cHV0O1xuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBUb2tlbml6ZSBhbmQgY29tcGlsZSBhIHN0cmluZyB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YSBUaGUgdGVtcGxhdGUuXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7QXJyYXl9IFRoZSBjb21waWxlZCB0b2tlbnMuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcucHJlcGFyZSA9IGZ1bmN0aW9uKGRhdGEpIHtcblx0ICAgICAgICB2Y
46184XIgdG9rZW5zLCByYXdfdG9rZW5zO1xuXG5cdCAgICAgICAgLy8gVG9rZW5pemVcblx0ICAgICAgICBUd2lnLmxvZy5kZWJ1ZyhcIlR3aWcucHJlcGFyZTogXCIsIFwiVG9rZW5pemluZyBcIiwgZGF0YSk7XG5cdCAgICAgICAgcmF3X3Rva2VucyA9IFR3aWcudG9rZW5pemUuYXBwbHkodGhpcywgW2RhdGFdKTtcblxuXHQgICAgICAgIC8vIENvbXBpbGVcblx0ICAgICAgICBUd2lnLmxvZy5kZWJ1ZyhcIlR3aWcucHJlcGFyZTogXCIsIFwiQ29tcGlsaW5nIFwiLCByYXdfdG9rZW5zKTtcblx0ICAgICAgICB0b2tlbnMgPSBUd2lnLmNvbXBpbGUuYXBwbHkodGhpcywgW3Jhd190b2tlbnNdKTtcblxuXHQgICAgICAgIFR3aWcubG9nLmRlYnVnKFwiVHdpZy5wcmVwYXJlOiBcIiwgXCJDb21waWxlZCBcIiwgdG9rZW5zKTtcblxuXHQgICAgICAgIHJldHVybiB0b2tlbnM7XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEpvaW4gdGhlIG91dHB1dCB0b2tlbidzIHN0YWNrIGFuZCBlc2NhcGUgaXQgaWYgbmVlZGVkXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtBcnJheX0gT3V0cHV0IHRva2VuJ3Mgc3RhY2tcblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtzdHJpbmd8U3RyaW5nfSBBdXRvZXNjYXBlZCBvdXRwdXRcblx0ICAgICAqL1xuXHQgICAgVHdpZy5vdXRwdXQgPSBmdW5jdGlvbihvdXRwdXQpIHtcblx0ICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hdXRvZXNjYXBlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBvdXRwdXQuam9pbihcIlwiKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB2Y
46184XIgc3RyYXRlZ3kgPSAnaHRtbCc7XG5cdCAgICAgICAgaWYodHlwZW9mIHRoaXMub3B0aW9ucy5hdXRvZXNjYXBlID09ICdzdHJpbmcnKVxuXHQgICAgICAgICAgICBzdHJhdGVneSA9IHRoaXMub3B0aW9ucy5hdXRvZXNjYXBlO1xuXG5cdCAgICAgICAgLy8gW10ubWFwIHdvdWxkIGJlIGJldHRlciBidXQgaXQncyBub3Qgc3VwcG9ydGVkIGJ5IElFOC1cblx0ICAgICAgICB2YXIgZXNjYXBlZF9vdXRwdXQgPSBbXTtcblx0ICAgICAgICBUd2lnLmZvckVhY2gob3V0cHV0LCBmdW5jdGlvbiAoc3RyKSB7XG5cdCAgICAgICAgICAgIGlmIChzdHIgJiYgKHN0ci50d2lnX21hcmt1cCAhPT0gdHJ1ZSAmJiBzdHIudHdpZ19tYXJrdXAgIT0gc3RyYXRlZ3kpKSB7XG5cdCAgICAgICAgICAgICAgICBzdHIgPSBUd2lnLmZpbHRlcnMuZXNjYXBlKHN0ciwgWyBzdHJhdGVneSBdKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlc2NhcGVkX291dHB1dC5wdXNoKHN0cik7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgcmV0dXJuIFR3aWcuTWFya3VwKGVzY2FwZWRfb3V0cHV0LmpvaW4oXCJcIikpO1xuXHQgICAgfVxuXG5cdCAgICAvLyBOYW1lc3BhY2UgZm9yIHRlbXBsYXRlIHN0b3JhZ2UgYW5kIHJldHJpZXZhbFxuXHQgICAgVHdpZy5UZW1wbGF0ZXMgPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUmVnaXN0ZXJlZCB0ZW1wbGF0ZSBsb2FkZXJzIC0gdXNlIFR3aWcuVGVtcGxhdGVzLnJlZ2lzdGVyTG9hZGVyIHRvIGFkZCBzdXBwb3J0ZWQgbG9hZGVyc1xuXHQgICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgbG9hZGVyczoge30sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBSZWdpc3RlcmVkIHRlbXBsYXRlIHBhcnNlcnMgLSB1c2UgVHdpZy5UZW1wbGF0ZXMucmVnaXN0ZXJQYXJzZXIgdG8gYWRkIHN1cHBvcnRlZCBwYXJzZXJzXG5cdCAgICAgICAgICogQHR5cGUge09iamVjdH1cblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZXJzOiB7fSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENhY2hlZCAvIGxvYWRlZCB0ZW1wbGF0ZXNcblx0ICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHJlZ2lzdHJ5OiB7fVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBJcyB0aGlzIGlkIHZhbGlkIGZvciBhIHR3aWcgdGVtcGxhdGU/XG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCB0byBjaGVjay5cblx0ICAgICAqXG5cdCAgICAgKiBAdGhyb3dzIHtUd2lnLkVycm9yfSBJZiB0aGUgSUQgaXMgaW52YWxpZCBvciB1c2VkLlxuXHQgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgSUQgaXMgdmFsaWQuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcudmFsaWRhdGVJZCA9IGZ1bmN0aW9uKGlkKSB7XG5cdCAgICAgICAgaWYgKGlkID09PSBcInByb3RvdHlwZVwiKSB7XG5cdCAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKGlkICsgXCIgaXMgbm90IGEgdmFsaWQgdHdpZyBpZGVudGlmaWVyXCIpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoVHdpZy5jYWNoZSAmJiBUd2lnLlRlbXBsYXRlcy5yZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcblx0ICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJUaGVyZSBpcyBhbHJlYWR5IGEgdGVtcGxhdGUgd2l0aCB0aGUgSUQgXCIgKyBpZCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfVxuXG5cdCAgICAvKipcblx0ICAgICAqIFJlZ2lzdGVyIGEgdGVtcGxhdGUgbG9hZGVyXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqIFR3aWcuZXh0ZW5kKGZ1bmN0aW9uKFR3aWcpIHtcblx0ICAgICAqICAgIFR3aWcuVGVtcGxhdGVzLnJlZ2lzdGVyTG9hZGVyKCdjdXN0b21fbG9hZGVyJywgZnVuY3Rpb24obG9jYXRpb24sIHBhcmFtcywgY2FsbGJhY2ssIGVycm9yX2NhbGxiYWNrKSB7XG5cdCAgICAgKiAgICAgICAgLy8gLi4uIGxvYWQgdGhlIHRlbXBsYXRlIC4uLlxuXHQgICAgICogICAgICAgIHBhcmFtcy5kYXRhID0gbG9hZGVkVGVtcGxhdGVEYXRhO1xuXHQgICAgICogICAgICAgIC8vIGNyZWF0ZSBhbmQgcmV0dXJuIHRoZSB0ZW1wbGF0ZVxuXHQgICAgICogICAgICAgIHZhciB0ZW1wbGF0ZSA9IG5ldyBUd2lnLlRlbXBsYXRlKHBhcmFtcyk7XG5cdCAgICAgKiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICogICAgICAgICAgICBjYWxsYmFjayh0ZW1wbGF0ZSk7XG5cdCAgICAgKiAgICAgICAgfVxuXHQgICAgICogICAgICAgIHJldHVybiB0ZW1wbGF0ZTtcblx0ICAgICAqICAgIH0pO1xuXHQgICAgICogfSk7XG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZF9uYW1lIFRoZSBtZXRob2QgdGhpcyBsb2FkZXIgaXMgaW50ZW5kZWQgZm9yIChhamF4LCBmcylcblx0ICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiBsb2FkaW5nIHRoZSB0ZW1wbGF0ZVxuXHQgICAgICogQHBhcmFtIHtPYmplY3R8dW5kZWZpbmVkfSBzY29wZSBPcHRpb25hbCBzY29wZSBwYXJhbWV0ZXIgdG8gYmluZCBmdW5jIHRvXG5cdCAgICAgKlxuXHQgICAgICogQHRocm93cyBUd2lnLkVycm9yXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7dm9pZH1cblx0ICAgICAqL1xuXHQgICAgVHdpZy5UZW1wbGF0ZXMucmVnaXN0ZXJMb2FkZXIgPSBmdW5jdGlvbihtZXRob2RfbmFtZSwgZnVuYywgc2NvcGUpIHtcblx0ICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoJ1VuYWJsZSB0byBhZGQgbG9hZGVyIGZvciAnICsgbWV0aG9kX25hbWUgKyAnOiBJbnZhbGlkIGZ1bmN0aW9uIHJlZmVyZW5jZSBnaXZlbi4nKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHNjb3BlKSB7XG5cdCAgICAgICAgICAgIGZ1bmMgPSBmdW5jLmJpbmQoc2NvcGUpO1xuXHQgICAgICAgI
46184H1cblx0ICAgICAgICB0aGlzLmxvYWRlcnNbbWV0aG9kX25hbWVdID0gZnVuYztcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogUmVtb3ZlIGEgcmVnaXN0ZXJlZCBsb2FkZXJcblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kX25hbWUgVGhlIG1ldGhvZCBuYW1lIGZvciB0aGUgbG9hZGVyIHlvdSB3aXNoIHRvIHJlbW92ZVxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge3ZvaWR9XG5cdCAgICAgKi9cblx0ICAgIFR3aWcuVGVtcGxhdGVzLnVuUmVnaXN0ZXJMb2FkZXIgPSBmdW5jdGlvbihtZXRob2RfbmFtZSkge1xuXHQgICAgICAgIGlmICh0aGlzLmlzUmVnaXN0ZXJlZExvYWRlcihtZXRob2RfbmFtZSkpIHtcblx0ICAgICAgICAgICAgZGVsZXRlIHRoaXMubG9hZGVyc1ttZXRob2RfbmFtZV07XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTZWUgaWYgYSBsb2FkZXIgaXMgcmVnaXN0ZXJlZCBieSBpdHMgbWV0aG9kIG5hbWVcblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kX25hbWUgVGhlIG5hbWUgb2YgdGhlIGxvYWRlciB5b3UgYXJlIGxvb2tpbmcgZm9yXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICAgICAqL1xuXHQgICAgVHdpZy5UZW1wbGF0ZXMuaXNSZWdpc3RlcmVkTG9hZGVyID0gZnVuY3Rpb24obWV0aG9kX25hbWUpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXJzLmhhc093blByb3BlcnR5KG1ldGhvZF9uYW1lKTtcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogUmVnaXN0ZXIgYSB0ZW1wbGF0ZSBwYXJzZXJcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICogVHdpZy5leHRlbmQoZnVuY3Rpb24oVHdpZykge1xuXHQgICAgICogICAgVHdpZy5UZW1wbGF0ZXMucmVnaXN0ZXJQYXJzZXIoJ2N1c3RvbV9wYXJzZXInLCBmdW5jdGlvbihwYXJhbXMpIHtcblx0ICAgICAqICAgICAgICAvLyB0aGlzIHRlbXBsYXRlIHNvdXJjZSBjYW4gYmUgYWNjZXNzZWQgaW4gcGFyYW1zLmRhdGFcblx0ICAgICAqICAgICAgICB2Y
46184XIgdGVtcGxhdGUgPSBwYXJhbXMuZGF0YVxuXHQgICAgICpcblx0ICAgICAqICAgICAgICAvLyAuLi4gY3VzdG9tIHByb2Nlc3MgdGhhdCBtb2RpZmllcyB0aGUgdGVtcGxhdGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgICAgLy8gcmV0dXJuIHRoZSBwYXJzZWQgdGVtcGxhdGVcblx0ICAgICAqICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG5cdCAgICAgKiAgICB9KTtcblx0ICAgICAqIH0pO1xuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2RfbmFtZSBUaGUgbWV0aG9kIHRoaXMgcGFyc2VyIGlzIGludGVuZGVkIGZvciAodHdpZywgc291cmNlKVxuXHQgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHBhcnNpbmcgdGhlIHRlbXBsYXRlXG5cdCAgICAgKiBAcGFyYW0ge09iamVjdHx1bmRlZmluZWR9IHNjb3BlIE9wdGlvbmFsIHNjb3BlIHBhcmFtZXRlciB0byBiaW5kIGZ1bmMgdG9cblx0ICAgICAqXG5cdCAgICAgKiBAdGhyb3dzIFR3aWcuRXJyb3Jcblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHt2b2lkfVxuXHQgICAgICovXG5cdCAgICBUd2lnLlRlbXBsYXRlcy5yZWdpc3RlclBhcnNlciA9IGZ1bmN0aW9uKG1ldGhvZF9uYW1lLCBmdW5jLCBzY29wZSkge1xuXHQgICAgICAgIGlmICh0eXBlb2YgZnVuYyAhPT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcignVW5hYmxlIHRvIGFkZCBwYXJzZXIgZm9yICcgKyBtZXRob2RfbmFtZSArICc6IEludmFsaWQgZnVuY3Rpb24gcmVnZXJlbmNlIGdpdmVuLicpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGlmIChzY29wZSkge1xuXHQgICAgICAgICAgICBmdW5jID0gZnVuYy5iaW5kKHNjb3BlKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB0aGlzLnBhcnNlcnNbbWV0aG9kX25hbWVdID0gZnVuYztcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogUmVtb3ZlIGEgcmVnaXN0ZXJlZCBwYXJzZXJcblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kX25hbWUgVGhlIG1ldGhvZCBuYW1lIGZvciB0aGUgcGFyc2VyIHlvdSB3aXNoIHRvIHJlbW92ZVxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge3ZvaWR9XG5cdCAgICAgKi9cblx0ICAgIFR3aWcuVGVtcGxhdGVzLnVuUmVnaXN0ZXJQYXJzZXIgPSBmdW5jdGlvbihtZXRob2RfbmFtZSkge1xuXHQgICAgICAgIGlmICh0aGlzLmlzUmVnaXN0ZXJlZFBhcnNlcihtZXRob2RfbmFtZSkpIHtcblx0ICAgICAgICAgICAgZGVsZXRlIHRoaXMucGFyc2Vyc1ttZXRob2RfbmFtZV07XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTZWUgaWYgYSBwYXJzZXIgaXMgcmVnaXN0ZXJlZCBieSBpdHMgbWV0aG9kIG5hbWVcblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kX25hbWUgVGhlIG5hbWUgb2YgdGhlIHBhcnNlciB5b3UgYXJlIGxvb2tpbmcgZm9yXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICAgICAqL1xuXHQgICAgVHdpZy5UZW1wbGF0ZXMuaXNSZWdpc3RlcmVkUGFyc2VyID0gZnVuY3Rpb24obWV0aG9kX25hbWUpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5wYXJzZXJzLmhhc093blByb3BlcnR5KG1ldGhvZF9uYW1lKTtcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2F2ZSBhIHRlbXBsYXRlIG9iamVjdCB0byB0aGUgc3RvcmUuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtUd2lnLlRlbXBsYXRlfSB0ZW1wbGF0ZSAgIFRoZSB0d2lnLmpzIHRlbXBsYXRlIHRvIHN0b3JlLlxuXHQgICAgICovXG5cdCAgICBUd2lnLlRlbXBsYXRlcy5zYXZlID0gZnVuY3Rpb24odGVtcGxhdGUpIHtcblx0ICAgICAgICBpZiAodGVtcGxhdGUuaWQgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcihcIlVuYWJsZSB0byBzYXZlIHRlbXBsYXRlIHdpdGggbm8gaWRcIik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIFR3aWcuVGVtcGxhdGVzLnJlZ2lzdHJ5W3RlbXBsYXRlLmlkXSA9IHRlbXBsYXRlO1xuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBMb2FkIGEgcHJldmlvdXNseSBzYXZlZCB0ZW1wbGF0ZSBmcm9tIHRoZSBzdG9yZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgICBUaGUgSUQgb2YgdGhlIHRlbXBsYXRlIHRvIGxvYWQuXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7VHdpZy5UZW1wbGF0ZX0gQSB0d2lnLmpzIHRlbXBsYXRlIHN0b3JlZCB3aXRoIHRoZSBwcm92aWRlZCBJRC5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5UZW1wbGF0ZXMubG9hZCA9IGZ1bmN0aW9uKGlkKSB7XG5cdCAgICAgICAgaWYgKCFUd2lnLlRlbXBsYXRlcy5yZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBUd2lnLlRlbXBsYXRlcy5yZWdpc3RyeVtpZF07XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIExvYWQgYSB0ZW1wbGF0ZSBmcm9tIGEgcmVtb3RlIGxvY2F0aW9uIHVzaW5nIEFKQVggYW5kIHNhdmVzIGluIHdpdGggdGhlIGdpdmVuIElELlxuXHQgICAgICpcblx0ICAgICAqIEF2YWlsYWJsZSBwYXJhbWV0ZXJzOlxuXHQgICAgICpcblx0ICAgICAqICAgICAgYXN5bmM6ICAgICAgIFNob3VsZCB0aGUgSFRUUCByZXF1ZXN0IGJlIHBlcmZvcm1lZCBhc3luY2hyb25vdXNseS5cblx0ICAgICAqICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIHRydWUuXG5cdCAgICAgKiAgICAgIG1ldGhvZDogICAgICBXaGF0IG1ldGhvZCBzaG91bGQgYmUgdXNlZCB0byBsb2FkIHRoZSB0ZW1wbGF0ZVxuXHQgICAgICogICAgICAgICAgICAgICAgICAgICAgKGZzIG9yIGFqYXgpXG5cdCAgICAgKiAgICAgIHBhcnNlcjogICAgICBXaGF0IG1ldGhvZCBzaG91bGQgYmUgdXNlZCB0byBwYXJzZSB0aGUgdGVtcGxhdGVcblx0ICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0d2lnIG9yIHNvdXJjZSlcblx0ICAgICAqICAgICAgcHJlY29tcGlsZWQ6IEhhcyB0aGUgdGVtcGxhdGUgYWxyZWFkeSBiZWVuIGNvbXBpbGVkLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiAgVGhlIHJlbW90ZSBVUkwgdG8gbG9hZCBhcyBh
46184IHRlbXBsYXRlLlxuXHQgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgdGVtcGxhdGUgcGFyYW1ldGVycy5cblx0ICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrICBBIGNhbGxiYWNrIHRyaWdnZXJlZCB3aGVuIHRoZSB0ZW1wbGF0ZSBmaW5pc2hlcyBsb2FkaW5nLlxuXHQgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gZXJyb3JfY2FsbGJhY2sgIEEgY2FsbGJhY2sgdHJpZ2dlcmVkIGlmIGFuIGVycm9yIG9jY3VycyBsb2FkaW5nIHRoZSB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKlxuXHQgICAgICovXG5cdCAgICBUd2lnLlRlbXBsYXRlcy5sb2FkUmVtb3RlID0gZnVuY3Rpb24obG9jYXRpb24sIHBhcmFtcywgY2FsbGJhY2ssIGVycm9yX2NhbGxiYWNrKSB7XG5cdCAgICAgICAgdmFyIGxvYWRlcjtcblxuXHQgICAgICAgIC8vIERlZmF1bHQgdG8gYXN5bmNcblx0ICAgICAgICBpZiAocGFyYW1zLmFzeW5jID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgcGFyYW1zLmFzeW5jID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyBEZWZhdWx0IHRvIHRoZSBVUkwgc28gdGhlIHRlbXBsYXRlIGlzIGNhY2hlZC5cblx0ICAgICAgICBpZiAocGFyYW1zLmlkID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgcGFyYW1zLmlkID0gbG9jYXRpb247XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8gQ2hlY2sgZm9yIGV4aXN0aW5nIHRlbXBsYXRlXG5cdCAgICAgICAgaWYgKFR3aWcuY2FjaGUgJiYgVHdpZy5UZW1wbGF0ZXMucmVnaXN0cnkuaGFzT3duUHJvcGVydHkocGFyYW1zLmlkKSkge1xuXHQgICAgICAgICAgICAvLyBBIHRlbXBsYXRlIGlzIGFscmVhZHkgc2F2ZWQgd2l0aCB0aGUgZ2l2ZW4gaWQuXG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgIGNhbGxiYWNrKFR3aWcuVGVtcGxhdGVzLnJlZ2lzdHJ5W3BhcmFtcy5pZF0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIC8vIFRPRE86IGlmIGFzeW5jLCByZXR1cm4gZGVmZXJyZWQgcHJvbWlzZVxuXHQgICAgICAgICAgICByZXR1cm4gVHdpZy5UZW1wbGF0ZXMucmVnaXN0cnlbcGFyYW1zLmlkXTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvL2lmIHRoZSBwYXJzZXIgbmFtZSBoYXNuJ3QgYmVlbiBzZXQsIGRlZmF1bHQgaXQgdG8gdHdpZ1xuXHQgICAgICAgIHBhcmFtcy5wYXJzZXIgPSBwYXJhbXMucGFyc2VyIHx8ICd0d2lnJztcblxuXHQgICAgICAgIC8vIEFzc3VtZSAnZnMnIGlmIHRoZSBsb2FkZXIgaXMgbm90IGRlZmluZWRcblx0ICAgICAgICBsb2FkZXIgPSB0aGlzLmxvYWRlcnNbcGFyYW1zLm1ldGhvZF0gfHwgdGhpcy5sb2FkZXJzLmZzO1xuXHQgICAgICAgIHJldHVybiBsb2FkZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgIH07XG5cblx0ICAgIC8vIERldGVybWluZSBvYmplY3QgdHlwZVxuXHQgICAgZnVuY3Rpb24gaXModHlwZSwgb2JqKSB7XG5cdCAgICAgICAgdmFyIGNsYXMgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKS5zbGljZSg4LCAtMSk7XG5cdCAgICAgICAgcmV0dXJuIG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCAmJiBjbGFzID09PSB0eXBlO1xuXHQgICAgfVxuXG5cdCAgICAvKipcblx0ICAgICAqIENyZWF0ZSBhIG5ldyB0d2lnLmpzIHRlbXBsYXRlLlxuXHQgICAgICpcblx0ICAgICAqIFBhcmFtZXRlcnM6IHtcblx0ICAgICAqICAgICAgZGF0YTogICBUaGUgdGVtcGxhdGUsIGVpdGhlciBwcmUtY29tcGlsZWQgdG9rZW5zIG9yIGEgc3RyaW5nIHRlbXBsYXRlXG5cdCAgICAgKiAgICAgIGlkOiAgICAgVGhlIG5hbWUgb2YgdGhpcyB0ZW1wbGF0ZVxuXHQgICAgICogICAgICBibG9ja3M6IEFueSBwcmUtZXhpc3RpbmcgYmxvY2sgZnJvbSBhIGNoaWxkIHRlbXBsYXRlXG5cdCAgICAgKiB9XG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgdGVtcGxhdGUgcGFyYW1ldGVycy5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5UZW1wbGF0ZSA9IGZ1bmN0aW9uICggcGFyYW1zICkge1xuXHQgICAgICAgIHZhciBkYXRhID0gcGFyYW1zLmRhdGEsXG5cdCAgICAgICAgICAgIGlkID0gcGFyYW1zLmlkLFxuXHQgICAgICAgICAgICBibG9ja3MgPSBwYXJhbXMuYmxvY2tzLFxuXHQgICAgICAgICAgICBtYWNyb3MgPSBwYXJhbXMubWFjcm9zIHx8IHt9LFxuXHQgICAgICAgICAgICBiYXNlID0gcGFyYW1zLmJhc2UsXG5cdCAgICAgICAgICAgIHBhdGggPSBwYXJhbXMucGF0aCxcblx0ICAgICAgICAgICAgdXJsID0gcGFyYW1zLnVybCxcblx0ICAgICAgICAgICAgbmFtZSA9IHBhcmFtcy5uYW1lLFxuXHQgICAgICAgICAgICBtZXRob2QgPSBwYXJhbXMubWV0aG9kLFxuXHQgICAgICAgICAgICAvLyBwYXJzZXIgb3B0aW9uc1xuXHQgICAgICAgICAgICBvcHRpb25zID0gcGFyYW1zLm9wdGlvbnM7XG5cblx0ICAgICAgICAvLyAjIFdoYXQgaXMgc3RvcmVkIGluIGEgVHdpZy5UZW1wbGF0ZVxuXHQgICAgICAgIC8vXG5cdCAgICAgICAgLy8gVGhlIFR3aWcgVGVtcGxhdGUgaG9sZCBzZXZlcmFsIGNodWNrcyBvZiBkYXRhLlxuXHQgICAgICAgIC8vXG5cdCAgICAgICAgLy8gICAgIHtcblx0ICAgICAgICAvLyAgICAgICAgICBpZDogICAgIFRoZSB0b2tlbiBJRCAoaWYgYW55KVxuXHQgICAgICAgIC8vICAgICAgICAgIHRva2VuczogVGhlIGxpc3Qgb2YgdG9rZW5zIHRoYXQgbWFrZXMgdXAgdGhpcyB0ZW1wbGF0ZS5cblx0ICAgICAgICAvLyAgICAgICAgICBibG9ja3M6IFRoZSBsaXN0IG9mIGJsb2NrIHRoaXMgdGVtcGxhdGUgY29udGFpbnMuXG5cdCAgICAgICAgLy8gICAgICAgICAgYmFzZTogICBUaGUgYmFzZSB0ZW1wbGF0ZSAoaWYgYW55KVxuXHQgICAgICAgIC8vICAgICAgICAgICAgb3B0aW9uczogIHtcblx0ICAgICAgICAvLyAgICAgICAgICAgICAgICBDb21waWxlci9wYXJzZXIgb3B0aW9uc1xuXHQgICAgICAgIC8vXG5cdCAgICAgICAgLy8gICAgICAgICAgICAgICAgc3RyaWN0X3ZhcmlhYmxlczogdHJ1ZS9mYWxzZVxuXHQgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBTaG91bGQgbWlzc2luZyB2YXJpYWJsZS9rZXlzIGVtaXQgYW4gZXJyb3IgbWVzc2FnZS4gSWYgZmFsc2UsIHRoZXkgZGVmYXVsdCB0byBudWxsLlxuXHQgICAgICAgIC8vICAgICAgICAgICAgfVxuXHQgICAgICAgIC8vICAgICB9XG5cdCAgICAgICAgLy9cblxuXHQgICAgICAgI
46184HRoaXMuaWQgICAgID0gaWQ7XG5cdCAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG5cdCAgICAgICAgdGhpcy5iYXNlICAgPSBiYXNlO1xuXHQgICAgICAgIHRoaXMucGF0aCAgID0gcGF0aDtcblx0ICAgICAgICB0aGlzLnVybCAgICA9IHVybDtcblx0ICAgICAgICB0aGlzLm5hbWUgICA9IG5hbWU7XG5cdCAgICAgICAgdGhpcy5tYWNyb3MgPSBtYWNyb3M7XG5cdCAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuXHQgICAgICAgIHRoaXMucmVzZXQoYmxvY2tzKTtcblxuXHQgICAgICAgIGlmIChpcygnU3RyaW5nJywgZGF0YSkpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2tlbnMgPSBUd2lnLnByZXBhcmUuYXBwbHkodGhpcywgW2RhdGFdKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLnRva2VucyA9IGRhdGE7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgVHdpZy5UZW1wbGF0ZXMuc2F2ZSh0aGlzKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICBUd2lnLlRlbXBsYXRlLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uKGJsb2Nrcykge1xuXHQgICAgICAgIFR3aWcubG9nLmRlYnVnKFwiVHdpZy5UZW1wbGF0ZS5yZXNldFwiLCBcIlJlc2V0aW5nIHRlbXBsYXRlIFwiICsgdGhpcy5pZCk7XG5cdCAgICAgICAgdGhpcy5ibG9ja3MgPSB7fTtcblx0ICAgICAgICB0aGlzLmltcG9ydGVkQmxvY2tzID0gW107XG5cdCAgICAgICAgdGhpcy5vcmlnaW5hbEJsb2NrVG9rZW5zID0ge307XG5cdCAgICAgICAgdGhpcy5jaGlsZCA9IHtcblx0ICAgICAgICAgICAgYmxvY2tzOiBibG9ja3MgfHwge31cblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMuZXh0ZW5kID0gbnVsbDtcblx0ICAgIH07XG5cblx0ICAgIFR3aWcuVGVtcGxhdGUucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIChjb250ZXh0LCBwYXJhbXMsIGFsbG93X2FzeW5jKSB7XG5cdCAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuXG5cdCAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuXG5cdCAgICAgICAgICAgIC8vIFN0b3JlIGFueSBlcnJvciB0aGF0IG1pZ2h0IGJlIHRocm93biBieSB0aGUgcHJvbWlzZSBjaGFpbi5cblx0ICAgICAgICAgICAgZXJyID0gbnVsbCxcblxuXHQgICAgICAgICAgICAvLyBUaGlzIHdpbGwgYmUgc2V0IHRvIGlzX2FzeW5jIGlmIHRlbXBsYXRlIHJlbmRlcnMgc3luY2hyb25vdXNseVxuXHQgICAgICAgICAgICBpc19hc3luYyA9IHRydWUsXG5cdCAgICAgICAgICAgIHByb21pc2UgPSBudWxsLFxuXG5cdCAgICAgICAgICAgIHJlc3VsdCxcblx0ICAgICAgICAgICAgdXJsO1xuXG5cdCAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dCB8fCB7fTtcblxuXHQgICAgICAgIC8vIENsZWFyIGFueSBwcmV2aW91cyBzdGF0ZVxuXHQgICAgICAgIHRoaXMucmVzZXQoKTtcblx0ICAgICAgICBpZiAocGFyYW1zLmJsb2Nrcykge1xuXHQgICAgICAgICAgICB0aGlzLmJsb2NrcyA9IHBhcmFtcy5ibG9ja3M7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChwYXJhbXMubWFjcm9zKSB7XG5cdCAgICAgICAgICAgIHRoaXMubWFjcm9zID0gcGFyYW1zLm1hY3Jvcztcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB2Y
46184XIgY2IgPSBmdW5jdGlvbihvdXRwdXQpIHtcblx0ICAgICAgICAgICAgLy8gRG9lcyB0aGlzIHRlbXBsYXRlIGV4dGVuZCBhbm90aGVyXG5cdCAgICAgICAgICAgIGlmICh0aGF0LmV4dGVuZCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGV4dF90ZW1wbGF0ZTtcblxuXHQgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHRlbXBsYXRlIGlzIHByb3ZpZGVkIGlubGluZVxuXHQgICAgICAgICAgICAgICAgaWYgKCB0aGF0Lm9wdGlvbnMuYWxsb3dJbmxpbmVJbmNsdWRlcyApIHtcblx0ICAgICAgICAgICAgICAgICAgICBleHRfdGVtcGxhdGUgPSBUd2lnLlRlbXBsYXRlcy5sb2FkKHRoYXQuZXh0ZW5kKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIGV4dF90ZW1wbGF0ZSApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXh0X3RlbXBsYXRlLm9wdGlvbnMgPSB0aGF0Lm9wdGlvbnM7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgdGhlIHRlbXBsYXRlIGZpbGUgdmlhIGluY2x1ZGVcblx0ICAgICAgICAgICAgICAgIGlmICghZXh0X3RlbXBsYXRlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdXJsID0gVHdpZy5wYXRoLnBhcnNlUGF0aCh0aGF0LCB0aGF0LmV4dGVuZCk7XG5cblx0ICAgICAgICAgICAgICAgICAgICBleHRfdGVtcGxhdGUgPSBUd2lnLlRlbXBsYXRlcy5sb2FkUmVtb3RlKHVybCwge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHRoYXQuZ2V0TG9hZGVyTWV0aG9kKCksXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6IHRoYXQuYmFzZSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmM6ICBmYWxzZSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICAgICB1cmwsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoYXQub3B0aW9uc1xuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICB0aGF0LnBhcmVudCA9IGV4dF90ZW1wbGF0ZTtcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQucGFyZW50LnJlbmRlckFzeW5jKHRoYXQuY29udGV4dCwge1xuXHQgICAgICAgICAgICAgICAgICAgIGJsb2NrczogdGhhdC5ibG9ja3Ncblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgaWYgKHBhcmFtcy5vdXRwdXQgPT0gJ2Jsb2NrcycpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGF0LmJsb2Nrcztcblx0ICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMub3V0cHV0ID09ICdtYWNyb3MnKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5tYWNyb3M7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblxuXHQgICAgICAgIHByb21pc2UgPSBUd2lnLnBhcnNlQXN5bmMuYXBwbHkodGhpcywgW3RoaXMudG9rZW5zLCB0aGlzLmNvbnRleHRdKVxuXHQgICAgICAgIC50aGVuKGNiKVxuXHQgICAgICAgIC50aGVuKGZ1bmN0aW9uKHYpIHtcblx0ICAgICAgICAgICAgaXNfYXN5bmMgPSBmYWxzZTtcblx0ICAgICAgICAgICAgcmVzdWx0ID0gdjtcblx0ICAgICAgICAgICAgcmV0dXJuIHY7XG5cdCAgICAgICAgfSlcblx0ICAgICAgICAuY2F0Y2goZnVuY3Rpb24oZSkge1xuXHQgICAgICAgICAgICBpZiAoYWxsb3dfYXN5bmMpXG5cdCAgICAgICAgICAgICAgICB0aHJvdyBlO1xuXG5cdCAgICAgICAgICAgIGVyciA9IGU7XG5cdCAgICAgICAgfSlcblxuXHQgICAgICAgIC8vIElmIGBhbGxvd19hc3luY2Agd2Ugd2lsbCBhbHdheXMgcmV0dXJuIGEgcHJvbWlzZSBzaW5jZSB3ZSBkbyBub3Rcblx0ICAgICAgICAvLyBrbm93IGluIGFkdmFuY2UgaWYgd2UgYXJlIGdvaW5nIHRvIHJ1biBhc3luY2hyb25vdXNseSBvciBub3QuXG5cdCAgICAgICAgaWYgKGFsbG93X2FzeW5jKVxuXHQgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcblxuXHQgICAgICAgIC8vIEhhbmRsZSBlcnJvcnMgaGVyZSBpZiB3ZSBmYWlsIHN5bmNocm9ub3VzbHkuXG5cdCAgICAgICAgaWYgKGVyciAhPT0gbnVsbClcblx0ICAgICAgICAgICAgdGhyb3cgZXJyO1xuXG5cdCAgICAgICAgLy8gSWYgYGFsbG93X2FzeW5jYCBpcyBub3QgdHJ1ZSB3ZSBzaG91bGQgbm90IGFsbG93IHRoZSB1c2VyXG5cdCAgICAgICAgLy8gdG8gdXNlIGFzeW5jaHJvbm91cyBmdW5jdGlvbnMgb3IgZmlsdGVycy5cblx0ICAgICAgICBpZiAoaXNfYXN5bmMpXG5cdCAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKCdZb3UgYXJlIHVzaW5nIFR3aWcuanMgaW4gc3luYyBtb2RlIGluIGNvbWJpbmF0aW9uIHdpdGggYXN5bmMgZXh0ZW5zaW9ucy4nKTtcblxuXHQgICAgICAgIHJldHVybiByZXN1bHQ7XG5cdCAgICB9O1xuXG5cdCAgICBUd2lnLlRlbXBsYXRlLnByb3RvdHlwZS5pbXBvcnRGaWxlID0gZnVuY3Rpb24oZmlsZSkge1xuXHQgICAgICAgIHZhciB1cmwsIHN1Yl90ZW1wbGF0ZTtcblx0ICAgICAgICBpZiAoIXRoaXMudXJsICYmIHRoaXMub3B0aW9ucy5hbGxvd0lubGluZUluY2x1ZGVzKSB7XG5cdCAgICAgICAgICAgIGZpbGUgPSB0aGlzLnBhdGggPyBUd2lnLnBhdGgucGFyc2VQYXRoKHRoaXMsIGZpbGUpIDogZmlsZTtcblx0ICAgICAgICAgICAgc3ViX3RlbXBsYXRlID0gVHdpZy5UZW1wbGF0ZXMubG9hZChmaWxlKTtcblxuXHQgICAgICAgICAgICBpZiAoIXN1Yl90ZW1wbGF0ZSkge1xuXHQgICAgICAgICAgICAgICAgc3ViX3RlbXBsYXRlID0gVHdpZy5UZW1wbGF0ZXMubG9hZFJlbW90ZSh1cmwsIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZDogZmlsZSxcblx0ICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHRoaXMuZ2V0TG9hZGVyTWV0aG9kKCksXG5cdCAgICAgICAgICAgICAgICAgICAgYXN5bmM6IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgICAgIHBhdGg6IGZpbGUsXG5cdCAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zXG5cdCAgICAgICAgICAgICAgICB9KTtcblxuXHQgICAgICAgICAgICAgICAgaWYgKCFzdWJfdGVtcGxhdGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcihcIlVuYWJsZSB0byBmaW5kIHRoZSB0ZW1wbGF0ZSBcIiArIGZpbGUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgc3ViX3RlbXBsYXRlLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHN1Yl90ZW1wbGF0ZTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB1cmwgPSBUd2lnLnBhdGgucGFyc2VQYXRoKHRoaXMsIGZpbGUpO1xuXG5cdCAgICAgICAgLy8gTG9hZCBibG9ja3MgZnJvbSBhbiBleHRlcm5hbCBmaWxlXG5cdCAgICAgICAgc3ViX3RlbXBsYXRlID0gVHdpZy5UZW1wbGF0ZXMubG9hZFJlbW90ZSh1cmwsIHtcblx0ICAgICAgICAgICAgbWV0aG9kOiB0aGlzLmdldExvYWRlck1ldGhvZCgpLFxuXHQgICAgICAgICAgICBiYXNlOiB0aGlzLmJhc2UsXG5cdCAgICAgICAgICAgIGFzeW5jOiBmYWxzZSxcblx0ICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuXHQgICAgICAgICAgICBpZDogdXJsXG5cdCAgICAgICAgfSk7XG5cblx0ICAgICAgICByZXR1cm4gc3ViX3RlbXBsYXRlO1xuXHQgICAgfTtcblxuXHQgICAgVHdpZy5UZW1wbGF0ZS5wcm90b3R5cGUuaW1wb3J0QmxvY2tzID0gZnVuY3Rpb24oZmlsZSwgb3ZlcnJpZGUpIHtcblx0ICAgICAgICB2Y
46184XIgc3ViX3RlbXBsYXRlID0gdGhpcy5pbXBvcnRGaWxlKGZpbGUpLFxuXHQgICAgICAgICAgICBjb250ZXh0ID0gdGhpcy5jb250ZXh0LFxuXHQgICAgICAgICAgICB0aGF0ID0gdGhpcyxcblx0ICAgICAgICAgICAga2V5O1xuXG5cdCAgICAgICAgb3ZlcnJpZGUgPSBvdmVycmlkZSB8fCBmYWxzZTtcblxuXHQgICAgICAgIHN1Yl90ZW1wbGF0ZS5yZW5kZXIoY29udGV4dCk7XG5cblx0ICAgICAgICAvLyBNaXhpbiBibG9ja3Ncblx0ICAgICAgICBUd2lnLmZvckVhY2goT2JqZWN0LmtleXMoc3ViX3RlbXBsYXRlLmJsb2NrcyksIGZ1bmN0aW9uKGtleSkge1xuXHQgICAgICAgICAgICBpZiAob3ZlcnJpZGUgfHwgdGhhdC5ibG9ja3Nba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICB0aGF0LmJsb2Nrc1trZXldID0gc3ViX3RlbXBsYXRlLmJsb2Nrc1trZXldO1xuXHQgICAgICAgICAgICAgICAgdGhhdC5pbXBvcnRlZEJsb2Nrcy5wdXNoKGtleSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgIH07XG5cblx0ICAgIFR3aWcuVGVtcGxhdGUucHJvdG90eXBlLmltcG9ydE1hY3JvcyA9IGZ1bmN0aW9uKGZpbGUpIHtcblx0ICAgICAgICB2YXIgdXJsID0gVHdpZy5wYXRoLnBhcnNlUGF0aCh0aGlzLCBmaWxlKTtcblxuXHQgICAgICAgIC8vIGxvYWQgcmVtb3RlIHRlbXBsYXRlXG5cdCAgICAgICAgdmFyIHJlbW90ZVRlbXBsYXRlID0gVHdpZy5UZW1wbGF0ZXMubG9hZFJlbW90ZSh1cmwsIHtcblx0ICAgICAgICAgICAgbWV0aG9kOiB0aGlzLmdldExvYWRlck1ldGhvZCgpLFxuXHQgICAgICAgICAgICBhc3luYzogZmFsc2UsXG5cdCAgICAgICAgICAgIGlkOiB1cmxcblx0ICAgICAgICB9KTtcblxuXHQgICAgICAgIHJldHVybiByZW1vdGVUZW1wbGF0ZTtcblx0ICAgIH07XG5cblx0ICAgIFR3aWcuVGVtcGxhdGUucHJvdG90eXBlLmdldExvYWRlck1ldGhvZCA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgIGlmICh0aGlzLnBhdGgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuICdmcyc7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLnVybCkge1xuXHQgICAgICAgICAgICByZXR1cm4gJ2FqYXgnO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5tZXRob2QgfHwgJ2ZzJztcblx0ICAgIH07XG5cblx0ICAgIFR3aWcuVGVtcGxhdGUucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbihvcHRpb25zKSB7XG5cdCAgICAgICAgLy8gY29tcGlsZSB0aGUgdGVtcGxhdGUgaW50byByYXcgSlNcblx0ICAgICAgICByZXR1cm4gVHdpZy5jb21waWxlci5jb21waWxlKHRoaXMsIG9wdGlvbnMpO1xuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBDcmVhdGUgc2FmZSBvdXRwdXRcblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge3N0cmluZ30gQ29udGVudCBzYWZlIHRvIG91dHB1dFxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1N0cmluZ30gQ29udGVudCB3cmFwcGVkIGludG8gYSBTdHJpbmdcblx0ICAgICAqL1xuXG5cdCAgICBUd2lnLk1hcmt1cCA9IGZ1bmN0aW9uKGNvbnRlbnQsIHN0cmF0ZWd5KSB7XG5cdCAgICAgICAgaWYodHlwZW9mIHN0cmF0ZWd5ID09ICd1bmRlZmluZWQnKSB7XG5cdCAgICAgICAgICAgIHN0cmF0ZWd5ID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnICYmIGNvbnRlbnQubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICBjb250ZW50ID0gbmV3IFN0cmluZyhjb250ZW50KTtcblx0ICAgICAgICAgICAgY29udGVudC50d2lnX21hcmt1cCA9IHN0cmF0ZWd5O1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gY29udGVudDtcblx0ICAgIH07XG5cblx0ICAgIHJldHVybiBUd2lnO1xuXG5cdH07XG5cblxuLyoqKi8gfSxcbi8qIDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vICMjIHR3aWcuY29tcGlsZXIuanNcblx0Ly9cblx0Ly8gVGhpcyBmaWxlIGhhbmRsZXMgY29tcGlsaW5nIHRlbXBsYXRlcyBpbnRvIEpTXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFR3aWcpIHtcblx0ICAgIC8qKlxuXHQgICAgICogTmFtZXNwYWNlIGZvciBjb21waWxhdGlvbi5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5jb21waWxlciA9IHtcblx0ICAgICAgICBtb2R1bGU6IHt9XG5cdCAgICB9O1xuXG5cdCAgICAvLyBDb21waWxlIGEgVHdpZyBUZW1wbGF0ZSB0byBvdXRwdXQuXG5cdCAgICBUd2lnLmNvbXBpbGVyLmNvbXBpbGUgPSBmdW5jdGlvbih0ZW1wbGF0ZSwgb3B0aW9ucykge1xuXHQgICAgICAgIC8vIEdldCB0b2tlbnNcblx0ICAgICAgICB2Y
46184XIgdG9rZW5zID0gSlNPTi5zdHJpbmdpZnkodGVtcGxhdGUudG9rZW5zKVxuXHQgICAgICAgICAgICAsIGlkID0gdGVtcGxhdGUuaWRcblx0ICAgICAgICAgICAgLCBvdXRwdXQ7XG5cblx0ICAgICAgICBpZiAob3B0aW9ucy5tb2R1bGUpIHtcblx0ICAgICAgICAgICAgaWYgKFR3aWcuY29tcGlsZXIubW9kdWxlW29wdGlvbnMubW9kdWxlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcihcIlVuYWJsZSB0byBmaW5kIG1vZHVsZSB0eXBlIFwiICsgb3B0aW9ucy5tb2R1bGUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIG91dHB1dCA9IFR3aWcuY29tcGlsZXIubW9kdWxlW29wdGlvbnMubW9kdWxlXShpZCwgdG9rZW5zLCBvcHRpb25zLnR3aWcpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIG91dHB1dCA9IFR3aWcuY29tcGlsZXIud3JhcChpZCwgdG9rZW5zKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIG91dHB1dDtcblx0ICAgIH07XG5cblx0ICAgIFR3aWcuY29tcGlsZXIubW9kdWxlID0ge1xuXHQgICAgICAgIGFtZDogZnVuY3Rpb24oaWQsIHRva2VucywgcGF0aFRvVHdpZykge1xuXHQgICAgICAgICAgICByZXR1cm4gJ2RlZmluZShbXCInICsgcGF0aFRvVHdpZyArICdcIl0sIGZ1bmN0aW9uIChUd2lnKSB7XFxuXFx0dmFyIHR3aWcsIHRlbXBsYXRlcztcXG50d2lnID0gVHdpZy50d2lnO1xcbnRlbXBsYXRlcyA9ICcgKyBUd2lnLmNvbXBpbGVyLndyYXAoaWQsIHRva2VucykgKyAnXFxuXFx0cmV0dXJuIHRlbXBsYXRlcztcXG59KTsnO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAsIG5vZGU6IGZ1bmN0aW9uKGlkLCB0b2tlbnMpIHtcblx0ICAgICAgICAgICAgcmV0dXJuICd2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWc7XFxuJ1xuXHQgICAgICAgICAgICAgICAgKyAnZXhwb3J0cy50ZW1wbGF0ZSA9ICcgKyBUd2lnLmNvbXBpbGVyLndyYXAoaWQsIHRva2Vucylcblx0ICAgICAgICB9XG5cdCAgICAgICAgLCBjanMyOiBmdW5jdGlvbihpZCwgdG9rZW5zLCBwYXRoVG9Ud2lnKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAnbW9kdWxlLmRlY2xhcmUoW3sgdHdpZzogXCInICsgcGF0aFRvVHdpZyArICdcIiB9XSwgZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkge1xcbidcblx0ICAgICAgICAgICAgICAgICAgICAgICAgKyAnXFx0dmFyIHR3aWcgPSByZXF1aXJlKFwidHdpZ1wiKS50d2lnO1xcbidcblx0ICAgICAgICAgICAgICAgICAgICAgICAgKyAnXFx0ZXhwb3J0cy50ZW1wbGF0ZSA9ICcgKyBUd2lnLmNvbXBpbGVyLndyYXAoaWQsIHRva2Vucylcblx0ICAgICAgICAgICAgICAgICAgICArICdcXG59KTsnXG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgVHdpZy5jb21waWxlci53cmFwID0gZnVuY3Rpb24oaWQsIHRva2Vucykge1xuXHQgICAgICAgIHJldHVybiAndHdpZyh7aWQ6XCInK2lkLnJlcGxhY2UoJ1wiJywgJ1xcXFxcIicpKydcIiwgZGF0YTonK3Rva2VucysnLCBwcmVjb21waWxlZDogdHJ1ZX0pO1xcbic7XG5cdCAgICB9O1xuXG5cdCAgICByZXR1cm4gVHdpZztcblx0fTtcblxuXG4vKioqLyB9LFxuLyogMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gIyMgdHdpZy5leHByZXNzaW9uLmpzXG5cdC8vXG5cdC8vIFRoaXMgZmlsZSBoYW5kbGVzIHRva2VuaXppbmcsIGNvbXBpbGluZyBhbmQgcGFyc2luZyBleHByZXNzaW9ucy5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVHdpZykge1xuXHQgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cblx0ICAgIGZ1bmN0aW9uIHBhcnNlUGFyYW1zKHRoaXNBcmcsIHBhcmFtcywgY29udGV4dCkge1xuXHQgICAgICAgIGlmIChwYXJhbXMpXG5cdCAgICAgICAgICAgIHJldHVybiBUd2lnLmV4cHJlc3Npb24ucGFyc2VBc3luYy5hcHBseSh0aGlzQXJnLCBbcGFyYW1zLCBjb250ZXh0XSk7XG5cblx0ICAgICAgICByZXR1cm4gVHdpZy5Qcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuXHQgICAgfVxuXG5cdCAgICAvKipcblx0ICAgICAqIE5hbWVzcGFjZSBmb3IgZXhwcmVzc2lvbiBoYW5kbGluZy5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5leHByZXNzaW9uID0geyB9O1xuXG5cdCAgICBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpKFR3aWcpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFJlc2VydmVkIHdvcmQgdGhhdCBjYW4ndCBiZSB1c2VkIGFzIHZhcmlhYmxlIG5hbWVzLlxuXHQgICAgICovXG5cdCAgICBUd2lnLmV4cHJlc3Npb24ucmVzZXJ2ZWRXb3JkcyA9IFtcblx0ICAgICAgICBcInRydWVcIiwgXCJmYWxzZVwiLCBcIm51bGxcIiwgXCJUUlVFXCIsIFwiRkFMU0VcIiwgXCJOVUxMXCIsIFwiX2NvbnRleHRcIiwgXCJhbmRcIiwgXCJiLWFuZFwiLCBcIm9yXCIsIFwiYi1vclwiLCBcImIteG9yXCIsIFwiaW5cIiwgXCJub3QgaW5cIiwgXCJpZlwiXG5cdCAgICBdO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFRoZSB0eXBlIG9mIHRva2VucyB1c2VkIGluIGV4cHJlc3Npb25zLlxuXHQgICAgICovXG5cdCAgICBUd2lnLmV4cHJlc3Npb24udHlwZSA9IHtcblx0ICAgICAgICBjb21tYTogICAgICAnVHdpZy5leHByZXNzaW9uLnR5cGUuY29tbWEnLFxuXHQgICAgICAgIG9wZXJhdG9yOiB7XG5cdCAgICAgICAgICAgIHVuYXJ5OiAgJ1R3aWcuZXhwcmVzc2lvbi50eXBlLm9wZXJhdG9yLnVuYXJ5Jyxcblx0ICAgICAgICAgICAgYmluYXJ5OiAnVHdpZy5leHByZXNzaW9uLnR5cGUub3BlcmF0b3IuYmluYXJ5J1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc3RyaW5nOiAgICAgJ1R3aWcuZXhwcmVzc2lvbi50eXBlLnN0cmluZycsXG5cdCAgICAgICAgYm9vbDogICAgICAgJ1R3aWcuZXhwcmVzc2lvbi50eXBlLmJvb2wnLFxuXHQgICAgICAgIHNsaWNlOiAgICAgICdUd2lnLmV4cHJlc3Npb24udHlwZS5zbGljZScsXG5cdCAgICAgICAgYXJyYXk6IHtcblx0ICAgICAgICAgICAgc3RhcnQ6ICAnVHdpZy5leHByZXNzaW9uLnR5cGUuYXJyYXkuc3RhcnQnLFxuXHQgICAgICAgICAgICBlbmQ6ICAgICdUd2lnLmV4cHJlc3Npb24udHlwZS5hcnJheS5lbmQnXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBvYmplY3Q6IHtcblx0ICAgICAgICAgICAgc3RhcnQ6ICAnVHdpZy5leHByZXNzaW9uLnR5cGUub2JqZWN0LnN0YXJ0Jyxcblx0ICAgICAgICAgICAgZW5kOiAgICAnVHdpZy5leHByZXNzaW9uLnR5cGUub2JqZWN0LmVuZCdcblx0ICAgICAgICB9LFxuXHQgICAgICAgI
46184HBhcmFtZXRlcjoge1xuXHQgICAgICAgICAgICBzdGFydDogICdUd2lnLmV4cHJlc3Npb24udHlwZS5wYXJhbWV0ZXIuc3RhcnQnLFxuXHQgICAgICAgICAgICBlbmQ6ICAgICdUd2lnLmV4cHJlc3Npb24udHlwZS5wYXJhbWV0ZXIuZW5kJ1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc3ViZXhwcmVzc2lvbjoge1xuXHQgICAgICAgICAgICBzdGFydDogICdUd2lnLmV4cHJlc3Npb24udHlwZS5zdWJleHByZXNzaW9uLnN0YXJ0Jyxcblx0ICAgICAgICAgICAgZW5kOiAgICAnVHdpZy5leHByZXNzaW9uLnR5cGUuc3ViZXhwcmVzc2lvbi5lbmQnXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBrZXk6IHtcblx0ICAgICAgICAgICAgcGVyaW9kOiAgICdUd2lnLmV4cHJlc3Npb24udHlwZS5rZXkucGVyaW9kJyxcblx0ICAgICAgICAgICAgYnJhY2tldHM6ICdUd2lnLmV4cHJlc3Npb24udHlwZS5rZXkuYnJhY2tldHMnXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBmaWx0ZXI6ICAgICAnVHdpZy5leHByZXNzaW9uLnR5cGUuZmlsdGVyJyxcblx0ICAgICAgICBfZnVuY3Rpb246ICAnVHdpZy5leHByZXNzaW9uLnR5cGUuX2Z1bmN0aW9uJyxcblx0ICAgICAgICB2YXJpYWJsZTogICAnVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGUnLFxuXHQgICAgICAgIG51bWJlcjogICAgICdUd2lnLmV4cHJlc3Npb24udHlwZS5udW1iZXInLFxuXHQgICAgICAgIF9udWxsOiAgICAgJ1R3aWcuZXhwcmVzc2lvbi50eXBlLm51bGwnLFxuXHQgICAgICAgIGNvbnRleHQ6ICAgICdUd2lnLmV4cHJlc3Npb24udHlwZS5jb250ZXh0Jyxcblx0ICAgICAgICB0ZXN0OiAgICAgICAnVHdpZy5leHByZXNzaW9uLnR5cGUudGVzdCdcblx0ICAgIH07XG5cblx0ICAgIFR3aWcuZXhwcmVzc2lvbi5zZXQgPSB7XG5cdCAgICAgICAgLy8gV2hhdCBjYW4gZm9sbG93IGFuIGV4cHJlc3Npb24gKGluIGdlbmVyYWwpXG5cdCAgICAgICAgb3BlcmF0aW9uczogW1xuXHQgICAgICAgICAgICBUd2lnLmV4cHJlc3Npb24udHlwZS5maWx0ZXIsXG5cdCAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLm9wZXJhdG9yLnVuYXJ5LFxuXHQgICAgICAgICAgICBUd2lnLmV4cHJlc3Npb24udHlwZS5vcGVyYXRvci5iaW5hcnksXG5cdCAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLmFycmF5LmVuZCxcblx0ICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUub2JqZWN0LmVuZCxcblx0ICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLmVuZCxcblx0ICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUuc3ViZXhwcmVzc2lvbi5lbmQsXG5cdCAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLmNvbW1hLFxuXHQgICAgICAgICAgICBUd2lnLmV4cHJlc3Npb24udHlwZS50ZXN0XG5cdCAgICAgICAgXSxcblx0ICAgICAgICBleHByZXNzaW9uczogW1xuXHQgICAgICAgICAgICBUd2lnLmV4cHJlc3Npb24udHlwZS5fZnVuY3Rpb24sXG5cdCAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLmJvb2wsXG5cdCAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLnN0cmluZyxcblx0ICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGUsXG5cdCAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLm51bWJlcixcblx0ICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUuX251bGwsXG5cdCAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLmNvbnRleHQsXG5cdCAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydCxcblx0ICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUuYXJyYXkuc3RhcnQsXG5cdCAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLm9iamVjdC5zdGFydCxcblx0ICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUuc3ViZXhwcmVzc2lvbi5zdGFydCxcblx0ICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUub3BlcmF0b3IudW5hcnlcblx0ICAgICAgICBdXG5cdCAgICB9O1xuXG5cdCAgICAvLyBNb3N0IGV4cHJlc3Npb25zIGFsbG93IGEgJy4nIG9yICdbJyBhZnRlciB0aGVtLCBzbyB3ZSBwcm92aWRlIGEgY29udmVuaWVuY2Ugc2V0XG5cdCAgICBUd2lnLmV4cHJlc3Npb24uc2V0Lm9wZXJhdGlvbnNfZXh0ZW5kZWQgPSBUd2lnLmV4cHJlc3Npb24uc2V0Lm9wZXJhdGlvbnMuY29uY2F0KFtcblx0ICAgICAgICAgICAgICAgICAgICBUd2lnLmV4cHJlc3Npb24udHlwZS5rZXkucGVyaW9kLFxuXHQgICAgICAgICAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLmtleS5icmFja2V0cyxcblx0ICAgICAgICAgICAgICAgICAgICBUd2lnLmV4cHJlc3Npb24udHlwZS5zbGljZV0pO1xuXG5cdCAgICAvLyBTb21lIGNvbW1vbmx5IHVzZWQgY29tcGlsZSBhbmQgcGFyc2UgZnVuY3Rpb25zLlxuXHQgICAgVHdpZy5leHByZXNzaW9uLmZuID0ge1xuXHQgICAgICAgIGNvbXBpbGU6IHtcblx0ICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24odG9rZW4sIHN0YWNrLCBvdXRwdXQpIHtcblx0ICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcHVzaF9ib3RoOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHBhcnNlOiB7XG5cdCAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgY29udGV4dCkge1xuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHB1c2hfdmFsdWU6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgY29udGV4dCkge1xuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0b2tlbi52YWx1ZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9ucyBhbmQgY29tcGlsZS9wYXJzZSBsb2dpYyB1c2VkIHRvIG1hdGNoIHRva2VucyBpbiBleHByZXNzaW9ucy5cblx0ICAgIC8vXG5cdCAgICAvLyBQcm9wZXJ0aWVzOlxuXHQgICAgLy9cblx0ICAgIC8vICAgICAgdHlwZTogIFRoZSB0eXBlIG9mIGV4cHJlc3Npb24gdGhpcyBtYXRjaGVzXG5cdCAgICAvL1xuXHQgICAgLy8gICAgICByZWdleDogT25lIG9yIG1vcmUgcmVndWxhciBleHByZXNzaW9ucyB0aGF0IG1hdGNoZSB0aGUgZm9ybWF0IG9mIHRoZSB0b2tlbi5cblx0ICAgIC8vXG5cdCAgICAvLyAgICAgIG5leHQ6ICBWYWxpZCB0b2tlbnMgdGhhdCBjYW4gb2NjdXIgbmV4dCBpbiB0aGUgZXhwcmVzc2lvbi5cblx0ICAgIC8vXG5cdCAgICAvLyBGdW5jdGlvbnM6XG5cdCAgICAvL1xuXHQgICAgLy8gICAgICBjb21waWxlOiBBIGZ1bmN0aW9uIHRoYXQgY29tcGlsZXMgdGhlIHJhdyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2ggaW50byBhIHRva2VuLlxuXHQgICAgLy9cblx0ICAgIC8vICAgICAgcGFyc2U6ICAgQSBmdW5jdGlvbiB0aGF0IHBhcnNlcyB0aGUgY29tcGlsZWQgdG9rZW4gaW50byBvdXRwdXQuXG5cdCAgICAvL1xuXHQgICAgVHdpZy5leHByZXNzaW9uLmRlZmluaXRpb25zID0gW1xuXHQgICAgICAgI
46184Htcblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUudGVzdCxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eaXNcXHMrKG5vdCk/XFxzKihbYS16QS1aX11bYS16QS1aMC05X10qKFxccz9hcyk/KS8sXG5cdCAgICAgICAgICAgIG5leHQ6IFR3aWcuZXhwcmVzc2lvbi5zZXQub3BlcmF0aW9ucy5jb25jYXQoW1R3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydF0pLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgdG9rZW4uZmlsdGVyICAgPSB0b2tlbi5tYXRjaFsyXTtcblx0ICAgICAgICAgICAgICAgIHRva2VuLm1vZGlmaWVyID0gdG9rZW4ubWF0Y2hbMV07XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4udmFsdWU7XG5cdCAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIGNvbnRleHQpIHtcblx0ICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHN0YWNrLnBvcCgpO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VQYXJhbXModGhpcywgdG9rZW4ucGFyYW1zLCBjb250ZXh0KVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocGFyYW1zKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFR3aWcudGVzdCh0b2tlbi5maWx0ZXIsIHZhbHVlLCBwYXJhbXMpO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLm1vZGlmaWVyID09ICdub3QnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goIXJlc3VsdCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChyZXN1bHQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLmNvbW1hLFxuXHQgICAgICAgICAgICAvLyBNYXRjaCBhIGNvbW1hXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXiwvLFxuXHQgICAgICAgICAgICBuZXh0OiBUd2lnLmV4cHJlc3Npb24uc2V0LmV4cHJlc3Npb25zLmNvbmNhdChbVHdpZy5leHByZXNzaW9uLnR5cGUuYXJyYXkuZW5kLCBUd2lnLmV4cHJlc3Npb24udHlwZS5vYmplY3QuZW5kXSksXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgb3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgaSA9IHN0YWNrLmxlbmd0aCAtIDEsXG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2tfdG9rZW47XG5cblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5tYXRjaDtcblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi52YWx1ZTtcblxuXHQgICAgICAgICAgICAgICAgLy8gcG9wIHRva2VucyBvZmYgdGhlIHN0YWNrIHVudGlsIHRoZSBzdGFydCBvZiB0aGUgb2JqZWN0XG5cdCAgICAgICAgICAgICAgICBmb3IoO2kgPj0gMDsgaS0tKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2tfdG9rZW4gPSBzdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tfdG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUub2JqZWN0LnN0YXJ0XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGFja190b2tlbi50eXBlID09PSBUd2lnLmV4cHJlc3Npb24udHlwZS5wYXJhbWV0ZXIuc3RhcnRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0YWNrX3Rva2VuLnR5cGUgPT09IFR3aWcuZXhwcmVzc2lvbi50eXBlLmFycmF5LnN0YXJ0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goc3RhY2tfdG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goc3RhY2tfdG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBNYXRjaCBhIG51bWJlciAoaW50ZWdlciBvciBkZWNpbWFsKVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUubnVtYmVyLFxuXHQgICAgICAgICAgICAvLyBtYXRjaCBhIG51bWJlclxuXHQgICAgICAgICAgICByZWdleDogL15cXC0/XFxkKyhcXC5cXGQrKT8vLFxuXHQgICAgICAgICAgICBuZXh0OiBUd2lnLmV4cHJlc3Npb24uc2V0Lm9wZXJhdGlvbnMsXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgb3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZSA9IE51bWJlcih0b2tlbi52YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBUd2lnLmV4cHJlc3Npb24uZm4ucGFyc2UucHVzaF92YWx1ZVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmV4cHJlc3Npb24udHlwZS5vcGVyYXRvci5iaW5hcnksXG5cdCAgICAgICAgICAgIC8vIE1hdGNoIGFueSBvZiA/OiwgKywgKiwgLywgLSwgJSwgfiwgPCwgPD0sID4sID49LCAhPSwgPT0sICoqLCA/LCA6LCBhbmQsIGItYW5kLCBvciwgYi1vciwgYi14b3IsIGluLCBub3QgaW5cblx0ICAgICAgICAgICAgLy8gYW5kLCBvciwgaW4sIG5vdCBpbiBjYW4gYmUgZm9sbG93ZWQgYnkgYSBzcGFjZSBvciBwYXJlbnRoZXNpc1xuXHQgICAgICAgICAgICByZWdleDogLyheXFw/XFw6fF4oYlxcLWFuZCl8XihiXFwtb3IpfF4oYlxcLXhvcil8XltcXCtcXC1+JVxcP118XltcXDpdKD8hXFxkXFxdKXxeWyE9XT09P3xeWyE8Pl09P3xeXFwqXFwqP3xeXFwvXFwvP3xeKGFuZClbXFwofFxccytdfF4ob3IpW1xcKHxcXHMrXXxeKGluKVtcXCh8XFxzK118Xihub3QgaW4pW1xcKHxcXHMrXXxeXFwuXFwuKS8sXG5cdCAgICAgICAgICAgIG5leHQ6IFR3aWcuZXhwcmVzc2lvbi5zZXQuZXhwcmVzc2lvbnMsXG5cdCAgICAgICAgICAgIHRyYW5zZm9ybTogZnVuY3Rpb24obWF0Y2gsIHRva2Vucykge1xuXHQgICAgICAgICAgICAgICAgc3dpdGNoKG1hdGNoWzBdKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAnYW5kKCc6XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAnb3IoJzpcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICdpbignOlxuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25vdCBpbignOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvL1N0cmlwIG9mZiB0aGUgKCBpZiBpdCBleGlzdHNcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXS52YWx1ZSA9IG1hdGNoWzJdO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hbMF07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24odG9rZW4sIHN0YWNrLCBvdXRwdXQpIHtcblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5tYXRjaDtcblxuXHQgICAgICAgICAgICAgICAgdG9rZW4udmFsdWUgPSB0b2tlbi52YWx1ZS50cmltKCk7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgdmFsdWUgPSB0b2tlbi52YWx1ZSxcblx0ICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sb29rdXAodmFsdWUsIHRva2VuKTtcblxuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2cudHJhY2UoXCJUd2lnLmV4cHJlc3Npb24uY29tcGlsZTogXCIsIFwiT3BlcmF0b3I6IFwiLCBvcGVyYXRvciwgXCIgZnJvbSBcIiwgdmFsdWUpO1xuXG5cdCAgICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgIChzdGFja1tzdGFjay5sZW5ndGgtMV0udHlwZSA9PSBUd2lnLmV4cHJlc3Npb24udHlwZS5vcGVyYXRvci51bmFyeSB8fCBzdGFja1tzdGFjay5sZW5ndGgtMV0udHlwZSA9PSBUd2lnLmV4cHJlc3Npb24udHlwZS5vcGVyYXRvci5iaW5hcnkpICYmXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wZXJhdG9yLmFzc29jaWF0aXZpdHkgPT09IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sZWZ0VG9SaWdodCAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvci5wcmVjaWRlbmNlICAgID49IHN0YWNrW3N0YWNrLmxlbmd0aC0xXS5wcmVjaWRlbmNlKSB8fFxuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wZXJhdG9yLmFzc29jaWF0aXZpdHkgPT09IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5yaWdodFRvTGVmdCAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvci5wcmVjaWRlbmNlICAgID4gIHN0YWNrW3N0YWNrLmxlbmd0aC0xXS5wcmVjaWRlbmNlKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICkge1xuXHQgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgdGVtcCA9IHN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0ZW1wKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBcIjpcIikge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSB0ZXJuYXJ5IG9yIG9iamVjdCBrZXkgYmVpbmcgc2V0XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdICYmIHN0YWNrW3N0YWNrLmxlbmd0aC0xXS52YWx1ZSA9PT0gXCI/XCIpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udGludWUgYXMgbm9ybWFsIGZvciBhIHRlcm5hcnlcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIHRlcm5hcnkgc28gd2UgcHVzaCB0aGUgdG9rZW4gdG8gdGhlIG91dHB1dCB3aGVyZSBpdCBjYW4gYmUgaGFuZGxlZFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHdoZW4gdGhlIGFzc29jYXRlZCBvYmplY3QgaXMgY2xvc2VkLlxuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5X3Rva2VuID0gb3V0cHV0LnBvcCgpO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlfdG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUuc3RyaW5nIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3Rva2VuLnR5cGUgPT09IFR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5rZXkgPSBrZXlfdG9rZW4udmFsdWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5X3Rva2VuLnR5cGUgPT09IFR3aWcuZXhwcmVzc2lvbi50eXBlLm51bWJlcikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBpbnRlZ2VyIGtleXMgaW50byBzdHJpbmcga2V5c1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4ua2V5ID0ga2V5X3Rva2VuLnZhbHVlLnRvU3RyaW5nKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5X3Rva2VuLmV4cHJlc3Npb24gJiZcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlfdG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLmVuZCB8fFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3Rva2VuLnR5cGUgPT0gVHdpZy5leHByZXNzaW9uLnR5cGUuc3ViZXhwcmVzc2lvbi5lbmQpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5wYXJhbXMgPSBrZXlfdG9rZW4ucGFyYW1zO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJVbmV4cGVjdGVkIHZhbHVlIGJlZm9yZSAnOicgb2YgXCIgKyBrZXlfdG9rZW4udHlwZSArIFwiID0gXCIgKyBrZXlfdG9rZW4udmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG9wZXJhdG9yKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgY29udGV4dCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRva2VuLmtleSkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB0ZXJuYXJ5ICc6JyBvcGVyYXRvclxuXHQgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbi5wYXJhbXMpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgXCJ7KGV4cHJlc3Npb24pOnZhbHVlfVwiXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jLmFwcGx5KHRoaXMsIFt0b2tlbi5wYXJhbXMsIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGtleSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5rZXkgPSBrZXk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godG9rZW4pO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgd2UncmUgaW4gYSBsb29wLCB3ZSBtaWdodCBuZWVkIHRva2VuLnBhcmFtcyBsYXRlciwgZXNwZWNpYWxseSBpbiB0aGlzIGZvcm0gb2YgXCIoZXhwcmVzc2lvbik6dmFsdWVcIlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQubG9vcCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlKHRva2VuLnBhcmFtcyk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLm9wZXJhdG9yLnBhcnNlKHRva2VuLnZhbHVlLCBzdGFjayk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUub3BlcmF0b3IudW5hcnksXG5cdCAgICAgICAgICAgIC8vIE1hdGNoIGFueSBvZiBub3Rcblx0ICAgICAgICAgICAgcmVnZXg6IC8oXm5vdFxccyspLyxcblx0ICAgICAgICAgICAgbmV4dDogVHdpZy5leHByZXNzaW9uLnNldC5leHByZXNzaW9ucyxcblx0ICAgICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24odG9rZW4sIHN0YWNrLCBvdXRwdXQpIHtcblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5tYXRjaDtcblxuXHQgICAgICAgICAgICAgICAgdG9rZW4udmFsdWUgPSB0b2tlbi52YWx1ZS
4618450cmltKCk7XG5cdCAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0b2tlbi52YWx1ZSxcblx0ICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sb29rdXAodmFsdWUsIHRva2VuKTtcblxuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2cudHJhY2UoXCJUd2lnLmV4cHJlc3Npb24uY29tcGlsZTogXCIsIFwiT3BlcmF0b3I6IFwiLCBvcGVyYXRvciwgXCIgZnJvbSBcIiwgdmFsdWUpO1xuXG5cdCAgICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgIChzdGFja1tzdGFjay5sZW5ndGgtMV0udHlwZSA9PSBUd2lnLmV4cHJlc3Npb24udHlwZS5vcGVyYXRvci51bmFyeSB8fCBzdGFja1tzdGFjay5sZW5ndGgtMV0udHlwZSA9PSBUd2lnLmV4cHJlc3Npb24udHlwZS5vcGVyYXRvci5iaW5hcnkpICYmXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wZXJhdG9yLmFzc29jaWF0aXZpdHkgPT09IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sZWZ0VG9SaWdodCAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvci5wcmVjaWRlbmNlICAgID49IHN0YWNrW3N0YWNrLmxlbmd0aC0xXS5wcmVjaWRlbmNlKSB8fFxuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wZXJhdG9yLmFzc29jaWF0aXZpdHkgPT09IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5yaWdodFRvTGVmdCAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvci5wcmVjaWRlbmNlICAgID4gIHN0YWNrW3N0YWNrLmxlbmd0aC0xXS5wcmVjaWRlbmNlKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICkge1xuXHQgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgdGVtcCA9IHN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0ZW1wKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChvcGVyYXRvcik7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIGNvbnRleHQpIHtcblx0ICAgICAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5wYXJzZSh0b2tlbi52YWx1ZSwgc3RhY2spO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBNYXRjaCBhIHN0cmluZy4gVGhpcyBpcyBhbnl0aGluZyBiZXR3ZWVuIGEgcGFpciBvZiBzaW5nbGUgb3IgZG91YmxlIHF1b3Rlcy5cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLnN0cmluZyxcblx0ICAgICAgICAgICAgLy8gU2VlOiBodHRwOi8vYmxvZy5zdGV2ZW5sZXZpdGhhbi5jb20vYXJjaGl2ZXMvbWF0Y2gtcXVvdGVkLXN0cmluZ1xuXHQgICAgICAgICAgICByZWdleDogL14oW1wiJ10pKD86KD89KFxcXFw/KSlcXDJbXFxzXFxTXSkqP1xcMS8sXG5cdCAgICAgICAgICAgIG5leHQ6IFR3aWcuZXhwcmVzc2lvbi5zZXQub3BlcmF0aW9uc19leHRlbmRlZCxcblx0ICAgICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24odG9rZW4sIHN0YWNrLCBvdXRwdXQpIHtcblx0ICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRva2VuLnZhbHVlO1xuXHQgICAgICAgICAgICAgICAgZGVsZXRlIHRva2VuLm1hdGNoXG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcXVvdGVzIGZyb20gdGhlIHN0cmluZ1xuXHQgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN1YnN0cmluZygwLCAxKSA9PT0gJ1wiJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnXFxcXFwiJywgJ1wiJyk7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShcIlxcXFwnXCIsIFwiJ1wiKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aC0xKS5yZXBsYWNlKCAvXFxcXG4vZywgXCJcXG5cIiApLnJlcGxhY2UoIC9cXFxcci9nLCBcIlxcclwiICk7XG5cdCAgICAgICAgICAgICAgICBUd2lnLmxvZy50cmFjZShcIlR3aWcuZXhwcmVzc2lvbi5jb21waWxlOiBcIiwgXCJTdHJpbmcgdmFsdWU6IFwiLCB0b2tlbi52YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBUd2lnLmV4cHJlc3Npb24uZm4ucGFyc2UucHVzaF92YWx1ZVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogTWF0Y2ggYSBzdWJleHByZXNzaW9uIHNldCBzdGFydC5cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLnN1YmV4cHJlc3Npb24uc3RhcnQsXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXlxcKC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFR3aWcuZXhwcmVzc2lvbi5zZXQuZXhwcmVzc2lvbnMuY29uY2F0KFtUd2lnLmV4cHJlc3Npb24udHlwZS5zdWJleHByZXNzaW9uLmVuZF0pLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgdG9rZW4udmFsdWUgPSAnKCc7XG5cdCAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IFR3aWcuZXhwcmVzc2lvbi5mbi5wYXJzZS5wdXNoXG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBNYXRjaCBhIHN1YmV4cHJlc3Npb24gc2V0IGVuZC5cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLnN1YmV4cHJlc3Npb24uZW5kLFxuXHQgICAgICAgICAgICByZWdleDogL15cXCkvLFxuXHQgICAgICAgICAgICBuZXh0OiBUd2lnLmV4cHJlc3Npb24uc2V0Lm9wZXJhdGlvbnNfZXh0ZW5kZWQsXG5cdCAgICAgICAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbihtYXRjaCwgdG9rZW5zKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBJdGVyYXRlIGJhY2sgdGhyb3VnaCBwcmV2aW91cyB0b2tlbnMgdG8gZW5zdXJlIHdlIGZvbGxvdyBhIHN1YmV4cHJlc3Npb24gc3RhcnRcblx0ICAgICAgICAgICAgICAgIHZhciBpID0gdG9rZW5zLmxlbmd0aCAtIDEsXG5cdCAgICAgICAgICAgICAgICAgICAgZm91bmRfc3ViZXhwcmVzc2lvbl9zdGFydCA9IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgICAgIG5leHRfc3ViZXhwcmVzc2lvbl9zdGFydF9pbnZhbGlkID0gZmFsc2UsXG5cdCAgICAgICAgICAgICAgICAgICAgdW5jbG9zZWRfcGFyYW1ldGVyX2NvdW50ID0gMDtcblxuXHQgICAgICAgICAgICAgICAgd2hpbGUoIWZvdW5kX3N1YmV4cHJlc3Npb25fc3RhcnQgJiYgaSA+PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgZm91bmRfc3ViZXhwcmVzc2lvbl9zdGFydCA9IHRva2VuLnR5cGUgPT09IFR3aWcuZXhwcmVzc2lvbi50eXBlLnN1YmV4cHJlc3Npb24uc3RhcnQ7XG5cblx0ICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHByZXZpb3VzbHkgZm91bmQgYSBzdWJleHByZXNzaW9uIGVuZCwgdGhlbiB0aGlzIHN1YmV4cHJlc3Npb24gc3RhcnQgaXMgdGhlIHN0YXJ0IG9mXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBzdWJleHByZXNzaW9uLCBub3QgdGhlI
46184HN1YmV4cHJlc3Npb24gd2UgYXJlIHNlYXJjaGluZyBmb3Jcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRfc3ViZXhwcmVzc2lvbl9zdGFydCAmJiBuZXh0X3N1YmV4cHJlc3Npb25fc3RhcnRfaW52YWxpZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3N1YmV4cHJlc3Npb25fc3RhcnRfaW52YWxpZCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9zdWJleHByZXNzaW9uX3N0YXJ0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gQ291bnQgcGFyYW1ldGVyIHRva2VucyB0byBlbnN1cmUgd2UgZG9udCByZXR1cm4gdHJ1dGh5IGZvciBhIHBhcmFtZXRlciBvcGVuZXJcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLnN0YXJ0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHVuY2xvc2VkX3BhcmFtZXRlcl9jb3VudCsrO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLmVuZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB1bmNsb3NlZF9wYXJhbWV0ZXJfY291bnQtLTtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IFR3aWcuZXhwcmVzc2lvbi50eXBlLnN1YmV4cHJlc3Npb24uZW5kKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfc3ViZXhwcmVzc2lvbl9zdGFydF9pbnZhbGlkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICBpLS07XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIElmIHdlIGZvdW5kIHVuY2xvc2VkIHBhcmFtZXRlcnMsIHJldHVybiBmYWxzZVxuXHQgICAgICAgICAgICAgICAgLy8gSWYgd2UgZGlkbnQgZmluZCBzdWJleHByZXNzaW9uIHN0YXJ0LCByZXR1cm4gZmFsc2Vcblx0ICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSByZXR1cm4gdHJ1ZVxuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gKGZvdW5kX3N1YmV4cHJlc3Npb25fc3RhcnQgJiYgKHVuY2xvc2VkX3BhcmFtZXRlcl9jb3VudCA9PT0gMCkpO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBiYXNpY2FsbHkgYSBjb3B5IG9mIHBhcmFtZXRlciBlbmQgY29tcGlsYXRpb25cblx0ICAgICAgICAgICAgICAgIHZhciBzdGFja190b2tlbixcblx0ICAgICAgICAgICAgICAgICAgICBlbmRfdG9rZW4gPSB0b2tlbjtcblxuXHQgICAgICAgICAgICAgICAgc3RhY2tfdG9rZW4gPSBzdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgICAgIHdoaWxlKHN0YWNrLmxlbmd0aCA+IDAgJiYgc3RhY2tfdG9rZW4udHlwZSAhPSBUd2lnLmV4cHJlc3Npb24udHlwZS5zdWJleHByZXNzaW9uLnN0YXJ0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goc3RhY2tfdG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgIHN0YWNrX3Rva2VuID0gc3RhY2sucG9wKCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIE1vdmUgY29udGVudHMgb2YgcGFyZW5zIGludG8gcHJlY2VkaW5nIGZpbHRlclxuXHQgICAgICAgICAgICAgICAgdmFyIHBhcmFtX3N0YWNrID0gW107XG5cdCAgICAgICAgICAgICAgICB3aGlsZSh0b2tlbi50eXBlICE9PSBUd2lnLmV4cHJlc3Npb24udHlwZS5zdWJleHByZXNzaW9uLnN0YXJ0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRva2VuIHRvIGFyZ3VtZW50cyBzdGFja1xuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtX3N0YWNrLnVuc2hpZnQodG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgIHRva2VuID0gb3V0cHV0LnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBwYXJhbV9zdGFjay51bnNoaWZ0KHRva2VuKTtcblxuXHQgICAgICAgICAgICAgICAgdmFyIGlzX2V4cHJlc3Npb24gPSBmYWxzZTtcblxuXHQgICAgICAgICAgICAgICAgLy9JZiB0aGUgdG9rZW4gYXQgdGhlIHRvcCBvZiB0aGUgKnN0YWNrKiBpcyBhIGZ1bmN0aW9uIHRva2VuLCBwb3AgaXQgb250byB0aGUgb3V0cHV0IHF1ZXVlLlxuXHQgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB0b2tlbiBwcmVjZWRpbmcgdGhlIHBhcmFtZXRlcnNcblx0ICAgICAgICAgICAgICAgIHN0YWNrX3Rva2VuID0gc3RhY2tbc3RhY2subGVuZ3RoLTFdO1xuXG5cdCAgICAgICAgICAgICAgICBpZiAoc3RhY2tfdG9rZW4gPT09IHVuZGVmaW5lZCB8fFxuXHQgICAgICAgICAgICAgICAgICAgIChzdGFja190b2tlbi50eXBlICE9PSBUd2lnLmV4cHJlc3Npb24udHlwZS5fZnVuY3Rpb24gJiZcblx0ICAgICAgICAgICAgICAgICAgICBzdGFja190b2tlbi50eXBlICE9PSBUd2lnLmV4cHJlc3Npb24udHlwZS5maWx0ZXIgJiZcblx0ICAgICAgICAgICAgICAgICAgICBzdGFja190b2tlbi50eXBlICE9PSBUd2lnLmV4cHJlc3Npb24udHlwZS50ZXN0ICYmXG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2tfdG9rZW4udHlwZSAhPT0gVHdpZy5leHByZXNzaW9uLnR5cGUua2V5LmJyYWNrZXRzKSkge1xuXG5cdCAgICAgICAgICAgICAgICAgICAgZW5kX3Rva2VuLmV4cHJlc3Npb24gPSB0cnVlO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHN0YXJ0IGFuZCBlbmQgdG9rZW4gZnJvbSBzdGFja1xuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtX3N0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtX3N0YWNrLnNoaWZ0KCk7XG5cblx0ICAgICAgICAgICAgICAgICAgICBlbmRfdG9rZW4ucGFyYW1zID0gcGFyYW1fc3RhY2s7XG5cblx0ICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChlbmRfdG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBiZSBoaXRcblx0ICAgICAgICAgICAgICAgICAgICBlbmRfdG9rZW4uZXhwcmVzc2lvbiA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgI
46184HN0YWNrX3Rva2VuLnBhcmFtcyA9IHBhcmFtX3N0YWNrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBwYXJzZTogZnVuY3Rpb24odG9rZW4sIHN0YWNrLCBjb250ZXh0KSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgbmV3X2FycmF5ID0gW10sXG5cdCAgICAgICAgICAgICAgICAgICAgYXJyYXlfZW5kZWQgPSBmYWxzZSxcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG5cblx0ICAgICAgICAgICAgICAgIGlmICh0b2tlbi5leHByZXNzaW9uKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jLmFwcGx5KHRoaXMsIFt0b2tlbi5wYXJhbXMsIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcihcIlVuZXhwZWN0ZWQgc3ViZXhwcmVzc2lvbiBlbmQgd2hlbiB0b2tlbiBpcyBub3QgbWFya2VkIGFzIGFuIGV4cHJlc3Npb25cIik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIE1hdGNoIGEgcGFyYW1ldGVyIHNldCBzdGFydC5cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydCxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eXFwoLyxcblx0ICAgICAgICAgICAgbmV4dDogVHdpZy5leHByZXNzaW9uLnNldC5leHByZXNzaW9ucy5jb25jYXQoW1R3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5lbmRdKSxcblx0ICAgICAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKG1hdGNoLCB0b2tlbnMpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBsYXN0X3Rva2VuID0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXTtcblx0ICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IHVzZSB0aGUgcmVnZXggdG8gdGVzdCBpZiB3ZSBmb2xsb3cgYSBzcGFjZSBiZWNhdXNlIGV4cHJlc3Npb24gaXMgdHJpbW1lZFxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RfdG9rZW4gJiYgKFR3aWcuaW5kZXhPZihUd2lnLmV4cHJlc3Npb24ucmVzZXJ2ZWRXb3JkcywgbGFzdF90b2tlbi52YWx1ZS50cmltKCkpIDwgMCk7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IFR3aWcuZXhwcmVzc2lvbi5mbi5jb21waWxlLnB1c2hfYm90aCxcblx0ICAgICAgICAgICAgcGFyc2U6IFR3aWcuZXhwcmVzc2lvbi5mbi5wYXJzZS5wdXNoXG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBNYXRjaCBhIHBhcmFtZXRlciBzZXQgZW5kLlxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLmVuZCxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eXFwpLyxcblx0ICAgICAgICAgICAgbmV4dDogVHdpZy5leHByZXNzaW9uLnNldC5vcGVyYXRpb25zX2V4dGVuZGVkLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIHN0YWNrX3Rva2VuLFxuXHQgICAgICAgICAgICAgICAgICAgIGVuZF90b2tlbiA9IHRva2VuO1xuXG5cdCAgICAgICAgICAgICAgICBzdGFja190b2tlbiA9IHN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgd2hpbGUoc3RhY2subGVuZ3RoID4gMCAmJiBzdGFja190b2tlbi50eXBlICE9IFR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydCkge1xuXHQgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHN0YWNrX3Rva2VuKTtcblx0ICAgICAgICAgICAgICAgICAgICBzdGFja190b2tlbiA9IHN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBNb3ZlIGNvbnRlbnRzIG9mIHBhcmVucyBpbnRvIHByZWNlZGluZyBmaWx0ZXJcblx0ICAgICAgICAgICAgICAgIHZhciBwYXJhbV9zdGFjayA9IFtdO1xuXHQgICAgICAgICAgICAgICAgd2hpbGUodG9rZW4udHlwZSAhPT0gVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLnN0YXJ0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRva2VuIHRvIGFyZ3VtZW50cyBzdGFja1xuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtX3N0YWNrLnVuc2hpZnQodG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgIHRva2VuID0gb3V0cHV0LnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgcGFyYW1fc3RhY2sudW5zaGlmdCh0b2tlbik7XG5cblx0ICAgICAgICAgICAgICAgIHZhciBpc19leHByZXNzaW9uID0gZmFsc2U7XG5cblx0ICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgdG9rZW4gcHJlY2VkaW5nIHRoZSBwYXJhbWV0ZXJzXG5cdCAgICAgICAgICAgICAgICB0b2tlbiA9IG91dHB1dFtvdXRwdXQubGVuZ3RoLTFdO1xuXG5cdCAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT09IHVuZGVmaW5lZCB8fFxuXHQgICAgICAgICAgICAgICAgICAgICh0b2tlbi50eXBlICE9PSBUd2lnLmV4cHJlc3Npb24udHlwZS5fZnVuY3Rpb24gJiZcblx0ICAgICAgICAgICAgICAgICAgICB0b2tlbi50eXBlICE9PSBUd2lnLmV4cHJlc3Npb24udHlwZS5maWx0ZXIgJiZcblx0ICAgICAgICAgICAgICAgICAgICB0b2tlbi50eXBlICE9PSBUd2lnLmV4cHJlc3Npb24udHlwZS50ZXN0ICYmXG5cdCAgICAgICAgICAgICAgICAgICAgdG9rZW4udHlwZSAhPT0gVHdpZy5leHByZXNzaW9uLnR5cGUua2V5LmJyYWNrZXRzKSkge1xuXG5cdCAgICAgICAgICAgICAgICAgICAgZW5kX3Rva2VuLmV4cHJlc3Npb24gPSB0cnVlO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHN0YXJ0IGFuZCBlbmQgdG9rZW4gZnJvbSBzdGFja1xuXHQgICAgICAgICAgICAgICAgICAgI
46184HBhcmFtX3N0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtX3N0YWNrLnNoaWZ0KCk7XG5cblx0ICAgICAgICAgICAgICAgICAgICBlbmRfdG9rZW4ucGFyYW1zID0gcGFyYW1fc3RhY2s7XG5cblx0ICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChlbmRfdG9rZW4pO1xuXG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGVuZF90b2tlbi5leHByZXNzaW9uID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgdG9rZW4ucGFyYW1zID0gcGFyYW1fc3RhY2s7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIGNvbnRleHQpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBuZXdfYXJyYXkgPSBbXSxcblx0ICAgICAgICAgICAgICAgICAgICBhcnJheV9lbmRlZCA9IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDtcblxuXHQgICAgICAgICAgICAgICAgaWYgKHRva2VuLmV4cHJlc3Npb24pIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5leHByZXNzaW9uLnBhcnNlQXN5bmMuYXBwbHkodGhpcywgW3Rva2VuLnBhcmFtcywgY29udGV4dF0pXG5cdCAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh2YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG5cdCAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHVzaCB2YWx1ZXMgaW50byB0aGUgYXJyYXkgdW50aWwgdGhlIHN0YXJ0IG9mIHRoZSBhcnJheVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUudHlwZSAmJiB2YWx1ZS50eXBlID09IFR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfZW5kZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2FycmF5LnVuc2hpZnQodmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIGlmICghYXJyYXlfZW5kZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJFeHBlY3RlZCBlbmQgb2YgcGFyYW1ldGVyIHNldC5cIik7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChuZXdfYXJyYXkpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLnNsaWNlLFxuXHQgICAgICAgICAgICByZWdleDogL15cXFsoXFxkKlxcOlxcZCopXFxdLyxcblx0ICAgICAgICAgICAgbmV4dDogVHdpZy5leHByZXNzaW9uLnNldC5vcGVyYXRpb25zX2V4dGVuZGVkLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIHNsaWNlUmFuZ2UgPSB0b2tlbi5tYXRjaFsxXS5zcGxpdCgnOicpO1xuXG5cdCAgICAgICAgICAgICAgICAvL3NsaWNlU3RhcnQgY2FuIGJlIHVuZGVmaW5lZCB3aGVuIHdlIHBhc3MgcGFyYW1ldGVycyB0byB0aGUgc2xpY2UgZmlsdGVyIGxhdGVyXG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgc2xpY2VTdGFydCA9IChzbGljZVJhbmdlWzBdKSA/IHBhcnNlSW50KHNsaWNlUmFuZ2VbMF0pIDogdW5kZWZpbmVkO1xuXHQgICAgICAgICAgICAgICAgdmFyIHNsaWNlRW5kID0gKHNsaWNlUmFuZ2VbMV0pID8gcGFyc2VJbnQoc2xpY2VSYW5nZVsxXSkgOiB1bmRlZmluZWQ7XG5cblx0ICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlID0gJ3NsaWNlJztcblx0ICAgICAgICAgICAgICAgIHRva2VuLnBhcmFtcyA9IFtzbGljZVN0YXJ0LCBzbGljZUVuZF07XG5cblx0ICAgICAgICAgICAgICAgIC8vc2xpY2VFbmQgY2FuJ3QgYmUgdW5kZWZpbmVkIGFzIHRoZSBzbGljZSBmaWx0ZXIgZG9lc24ndCBjaGVjayBmb3IgdGhpcywgYnV0IGl0IGRvZXMgY2hlY2sgdGhlIGxlbmd0aFxuXHQgICAgICAgICAgICAgICAgLy9vZiB0aGUgcGFyYW1zIGFycmF5LCBzbyBqdXN0IHNob3J0ZW4gaXQuXG5cdCAgICAgICAgICAgICAgICBpZiAoIXNsaWNlRW5kKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdG9rZW4ucGFyYW1zID0gW3NsaWNlU3RhcnRdO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIGNvbnRleHQpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9IHN0YWNrLnBvcCgpLFxuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHRva2VuLnBhcmFtcztcblxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChUd2lnLmZpbHRlci5hcHBseSh0aGlzLCBbdG9rZW4udmFsdWUsIGlucHV0LCBwYXJhbXNdKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIE1hdGNoIGFuIGFycmF5IHN0YXJ0LlxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUuYXJyYXkuc3RhcnQsXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXlxcWy8sXG5cdCAgICAgICAgICAgIG5leHQ6IFR3aWcuZXhwcmVzc2lvbi5zZXQuZXhwcmVzc2lvbnMuY29uY2F0KFtUd2lnLmV4cHJlc3Npb24udHlwZS5hcnJheS5lbmRdKSxcblx0ICAgICAgICAgICAgY29tcGlsZTogVHdpZy5leHByZXNzaW9uLmZuLmNvbXBpbGUucHVzaF9ib3RoLFxuXHQgICAgICAgICAgICBwYXJzZTogVHdpZy5leHByZXNzaW9uLmZuLnBhcnNlLnB1c2hcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIE1hdGNoIGFuIGFycmF5IGVuZC5cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLmFycmF5LmVuZCxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eXFxdLyxcblx0ICAgICAgICAgICAgbmV4dDogVHdpZy5leHByZXNzaW9uLnNldC5vcGVyYXRpb25zX2V4dGVuZGVkLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGkgPSBzdGFjay5sZW5ndGggLSAxLFxuXHQgICAgICAgICAgICAgICAgICAgIHN0YWNrX3Rva2VuO1xuXHQgICAgICAgICAgICAgICAgLy8gcG9wIHRva2VucyBvZmYgdGhlIHN0YWNrIHVudGlsIHRoZSBzdGFydCBvZiB0aGUgb2JqZWN0XG5cdCAgICAgICAgICAgICAgICBmb3IoO2kgPj0gMDsgaS0tKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2tfdG9rZW4gPSBzdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tfdG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUuYXJyYXkuc3RhcnQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHN0YWNrX3Rva2VuKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgY29udGV4dCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIG5ld19hcnJheSA9IFtdLFxuXHQgICAgICAgICAgICAgICAgICAgIGFycmF5X2VuZGVkI
46184D0gZmFsc2UsXG5cdCAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xuXG5cdCAgICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RhY2sucG9wKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gUHVzaCB2YWx1ZXMgaW50byB0aGUgYXJyYXkgdW50aWwgdGhlIHN0YXJ0IG9mIHRoZSBhcnJheVxuXHQgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlICYmIHZhbHVlLnR5cGUgPT0gVHdpZy5leHByZXNzaW9uLnR5cGUuYXJyYXkuc3RhcnQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfZW5kZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgbmV3X2FycmF5LnVuc2hpZnQodmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKCFhcnJheV9lbmRlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwiRXhwZWN0ZWQgZW5kIG9mIGFycmF5LlwiKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChuZXdfYXJyYXkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICAvLyBUb2tlbiB0aGF0IHJlcHJlc2VudHMgdGhlIHN0YXJ0IG9mIGEgaGFzaCBtYXAgJ30nXG5cdCAgICAgICAgLy9cblx0ICAgICAgICAvLyBIYXNoIG1hcHMgdGFrZSB0aGUgZm9ybTpcblx0ICAgICAgICAvLyAgICB7IFwia2V5XCI6ICd2YWx1ZScsIFwiYW5vdGhlcl9rZXlcIjogaXRlbSB9XG5cdCAgICAgICAgLy9cblx0ICAgICAgICAvLyBLZXlzIG11c3QgYmUgcXVvdGVkIChlaXRoZXIgc2luZ2xlIG9yIGRvdWJsZSkgYW5kIHZhbHVlcyBjYW4gYmUgYW55IGV4cHJlc3Npb24uXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmV4cHJlc3Npb24udHlwZS5vYmplY3Quc3RhcnQsXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXlxcey8sXG5cdCAgICAgICAgICAgIG5leHQ6IFR3aWcuZXhwcmVzc2lvbi5zZXQuZXhwcmVzc2lvbnMuY29uY2F0KFtUd2lnLmV4cHJlc3Npb24udHlwZS5vYmplY3QuZW5kXSksXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IFR3aWcuZXhwcmVzc2lvbi5mbi5jb21waWxlLnB1c2hfYm90aCxcblx0ICAgICAgICAgICAgcGFyc2U6IFR3aWcuZXhwcmVzc2lvbi5mbi5wYXJzZS5wdXNoXG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8vIFRva2VuIHRoYXQgcmVwcmVzZW50cyB0aGUgZW5kIG9mIGEgSGFzaCBNYXAgJ30nXG5cdCAgICAgICAgLy9cblx0ICAgICAgICAvLyBUaGlzIGlzIHdoZXJlIHRoZSBsb2dpYyBmb3IgYnVpbGRpbmcgdGhlIGludGVybmFsXG5cdCAgICAgICAgLy8gcmVwcmVzZW50YXRpb24gb2YgYSBoYXNoIG1hcCBpcyBkZWZpbmVkLlxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUub2JqZWN0LmVuZCxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eXFx9Lyxcblx0ICAgICAgICAgICAgbmV4dDogVHdpZy5leHByZXNzaW9uLnNldC5vcGVyYXRpb25zX2V4dGVuZGVkLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGkgPSBzdGFjay5sZW5ndGgtMSxcblx0ICAgICAgICAgICAgICAgICAgICBzdGFja190b2tlbjtcblxuXHQgICAgICAgICAgICAgICAgLy8gcG9wIHRva2VucyBvZmYgdGhlIHN0YWNrIHVudGlsIHRoZSBzdGFydCBvZiB0aGUgb2JqZWN0XG5cdCAgICAgICAgICAgICAgICBmb3IoO2kgPj0gMDsgaS0tKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2tfdG9rZW4gPSBzdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tfdG9rZW4gJiYgc3RhY2tfdG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUub2JqZWN0LnN0YXJ0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChzdGFja190b2tlbik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbihlbmRfdG9rZW4sIHN0YWNrLCBjb250ZXh0KSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgbmV3X29iamVjdCA9IHt9LFxuXHQgICAgICAgICAgICAgICAgICAgIG9iamVjdF9lbmRlZCA9IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgICAgIHRva2VuID0gbnVsbCxcblx0ICAgICAgICAgICAgICAgICAgICB0b2tlbl9rZXkgPSBudWxsLFxuXHQgICAgICAgICAgICAgICAgICAgIGhhc192YWx1ZSA9IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDtcblxuXHQgICAgICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIFB1c2ggdmFsdWVzIGludG8gdGhlIGFycmF5IHVudGlsIHRoZSBzdGFydCBvZiB0aGUgb2JqZWN0XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuICYmIHRva2VuLnR5cGUgJiYgdG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUub2JqZWN0LnN0YXJ0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9lbmRlZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSAmJiAodG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUub3BlcmF0b3IuYmluYXJ5IHx8IHRva2VuLnR5cGUgPT09IFR3aWcuZXhwcmVzc2lvbi50eXBlLm9wZXJhdG9yLnVuYXJ5KSAmJiB0b2tlbi5rZXkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNfdmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwiTWlzc2luZyB2YWx1ZSBmb3Iga2V5ICdcIiArIHRva2VuLmtleSArIFwiJyBpbiBvYmplY3QgZGVmaW5pdGlvbi5cIik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgbmV3X29iamVjdFt0b2tlbi5rZXldID0gdmFsdWU7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlc2VydmUgdGhlIG9yZGVyIHRoYXQgZWxlbWVudHMgYXJlIGFkZGVkIHRvIHRoZSBtYXBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWNlc3Nhcnkgc2luY2UgSmF2YVNjcmlwdCBvYmplY3RzIGRvbid0XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGUgb3JkZXIgb2Yga2V5c1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3X29iamVjdC5fa2V5cyA9PT0gdW5kZWZpbmVkKSBuZXdfb2JqZWN0Ll9rZXlzID0gW107XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG5ld19vYmplY3QuX2tleXMudW5zaGlmdCh0b2tlbi5rZXkpO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHZhbHVlIGNoZWNrXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaGFzX3ZhbHVlID0gZmFsc2U7XG5cblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBoYXNfdmFsdWUgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRva2VuO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICghb2JqZWN0X2VuZGVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJVbmV4cGVjdGVkIGVuZCBvZiBvYmplY3QuXCIpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ld19vYmplY3QpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8vIFRva2VuIHJlcHJlc2VudGluZyBhIGZpbHRlclxuXHQgICAgICAgIC8vXG5cdCAgICAgICAgLy8gRmlsdGVycyBjYW4gZm9sbG93IGFueSBleHByZXNzaW9uIGFuZCB0YWtlIHRoZSBmb3JtOlxuXHQgICAgICAgIC8vICAgIGV4cHJlc3Npb258ZmlsdGVyKG9wdGlvbmFsLCBhcmdzKVxuXHQgICAgICAgIC8vXG5cdCAgICAgICAgLy8gRmlsdGVyIHBhcnNpbmcgaXMgZG9uZSBpbiB0aGUgVHdpZy5maWx0ZXJzIG5hbWVzcGFjZS5cblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLmZpbHRlcixcblx0ICAgICAgICAgICAgLy8gbWF0Y2ggYSB8IHRoZW4gYSBsZXR0ZXIgb3IgXywgdGhlbiBhbnkgbnVtYmVyIG9mIGxldHRlcnMsIG51bWJlcnMsIF8gb3IgLVxuXHQgICAgICAgICAgICByZWdleDogL15cXHxcXHM/KFthLXpBLVpfXVthLXpBLVowLTlfXFwtXSopLyxcblx0ICAgICAgICAgICAgbmV4dDogVHdpZy5leHByZXNzaW9uLnNldC5vcGVyYXRpb25zX2V4dGVuZGVkLmNvbmNhdChbXG5cdCAgICAgICAgICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLnN0YXJ0XSksXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgb3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZSA9IHRva2VuLm1hdGNoWzFdO1xuXHQgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBwYXJzZTogZnVuY3Rpb24odG9rZW4sIHN0YWNrLCBjb250ZXh0KSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgdGhhdCA9IHRoaXMsXG5cdCAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBzdGFjay5wb3AoKTtcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlUGFyYW1zKHRoaXMsIHRva2VuLnBhcmFtcywgY29udGV4dClcblx0ICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHBhcmFtcykge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLmZpbHRlci5hcHBseSh0aGF0LCBbdG9rZW4udmFsdWUsIGlucHV0LCBwYXJhbXNdKTtcblx0ICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUuX2Z1bmN0aW9uLFxuXHQgICAgICAgICAgICAvLyBtYXRjaCBhbnkgbGV0dGVyIG9yIF8sIHRoZW4gYW55IG51bWJlciBvZiBsZXR0ZXJzLCBudW1iZXJzLCBfIG9yIC0gZm9sbG93ZWQgYnkgKFxuXHQgICAgICAgICAgICByZWdleDogL14oW2EtekEtWl9dW2EtekEtWjAtOV9dKilcXHMqXFwoLyxcblx0ICAgICAgICAgICAgbmV4dDogVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLnN0YXJ0LFxuXHQgICAgICAgICAgICB2YWxpZGF0ZTogZnVuY3Rpb24obWF0Y2gsIHRva2Vucykge1xuXHQgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgZnVuY3Rpb24gaXMgbm90IGEgcmVzZXJ2ZWQgd29yZFxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdICYmIChUd2lnLmluZGV4T2YoVHdpZy5leHByZXNzaW9uLnJlc2VydmVkV29yZHMsIG1hdGNoWzFdKSA8IDApO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICB0cmFuc2Zvcm06IGZ1bmN0aW9uKG1hdGNoLCB0b2tlbnMpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAnKCc7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgb3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgZm4gPSB0b2tlbi5tYXRjaFsxXTtcblx0ICAgICAgICAgICAgICAgIHRva2VuLmZuID0gZm47XG5cdCAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIHRva2VuXG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4udmFsdWU7XG5cblx0ICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgY29udGV4dCkge1xuXG5cdCAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG5cdCAgICAgICAgICAgICAgICAgICAgZm4gPSB0b2tlbi5mbixcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTtcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlUGFyYW1zKHRoaXMsIHRva2VuLnBhcmFtcywgY29udGV4dClcblx0ICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHBhcmFtcykge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChUd2lnLmZ1bmN0aW9uc1tmbl0pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBmdW5jdGlvbiBmcm9tIHRoZSBidWlsdC1pbiBmdW5jdGlvbnNcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBUd2lnLmZ1bmN0aW9uc1tmbl0uYXBwbHkodGhhdCwgcGFyYW1zKTtcblxuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRleHRbZm5dID09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBmdW5jdGlvbiBmcm9tIHRoZSB1c2VyL2NvbnRleHQgZGVmaW5lZCBmdW5jdGlvbnNcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb250ZXh0W2ZuXS5hcHBseShjb250ZXh0LCBwYXJhbXMpO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoZm4gKyAnIGZ1bmN0aW9uIGRvZXMgbm90IGV4aXN0IGFuZCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgY29udGV4dCcpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHJlc3VsdCk7XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvLyBUb2tlbiByZXByZXNlbnRpbmcgYSB2YXJpYWJsZS5cblx0ICAgICAgICAvL1xuXHQgICAgICAgIC8vIFZhcmlhYmxlcyBjYW4gY29udGFpbiBsZXR0ZXJzLCBudW1iZXJzLCB1bmRlcnNjb3JlcyBhbmRcblx0ICAgICAgICAvLyBkYXNoZXMsIGJ1dCBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgb3IgdW5kZXJzY29yZS5cblx0ICAgICAgICAvL1xuXHQgICAgICAgIC8vIFZhcmlhYmxlcyBhcmUgcmV0cmlldmVkIGZyb20gdGhlIHJlbmRlciBjb250ZXh0IGFuZCB0YWtlXG5cdCAgICAgICAgLy8gdGhlIHZhbHVlIG9mICd1bmRlZmluZWQnIGlmIHRoZSBnaXZlbiB2YXJpYWJsZSBkb2Vzbid0XG5cdCAgICAgICAgLy8gZXhpc3QgaW4gdGhlIGNvbnRleHQuXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZSxcblx0ICAgICAgICAgICAgLy8gbWF0Y2ggYW55IGxldHRlciBvciBfLCB0aGVuIGFueSBudW1iZXIgb2YgbGV0dGVycywgbnVtYmVycywgXyBvciAtXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXlthLXpBLVpfXVthLXpBLVowLTlfXSovLFxuXHQgICAgICAgICAgICBuZXh0OiBUd2lnLmV4cHJlc3Npb24uc2V0Lm9wZXJhdGlvbnNfZXh0ZW5kZWQuY29uY2F0KFtcblx0ICAgICAgICAgICAgICAgICAgICBUd2lnLmV4cHJlc3Npb24udHlwZS5wYXJhbWV0ZXIuc3RhcnRdKSxcblx0ICAgICAgICAgICAgY29tcGlsZTogVHdpZy5leHByZXNzaW9uLmZuLmNvbXBpbGUucHVzaCxcblx0ICAgICAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKG1hdGNoLCB0b2tlbnMpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAoVHdpZy5pbmRleE9mKFR3aWcuZXhwcmVzc2lvbi5yZXNlcnZlZFdvcmRzLCBtYXRjaFswXSkgPCAwKTtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgY29udGV4dCkge1xuXHQgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB2YXJpYWJsZSBmcm9tIHRoZSBjb250ZXh0XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5leHByZXNzaW9uLnJlc29sdmVBc3luYy5hcHBseSh0aGlzLCBbY29udGV4dFt0b2tlbi52YWx1ZV0sIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHZhbHVlKTtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLmtleS5wZXJpb2QsXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXlxcLihbYS16QS1aMC05X10rKS8sXG5cdCAgICAgICAgICAgIG5leHQ6IFR3aWcuZXhwcmVzc2lvbi5zZXQub3BlcmF0aW9uc19leHRlbmRlZC5jb25jYXQoW1xuXHQgICAgICAgICAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydF0pLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgdG9rZW4ua2V5ID0gdG9rZW4ubWF0Y2hbMV07XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4udmFsdWU7XG5cblx0ICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgY29udGV4dCwgbmV4dF90b2tlbikge1xuXHQgICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuXHQgICAgICAgICAgICAgICAgICAgIGtleSA9IHRva2VuLmtleSxcblx0ICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSBzdGFjay5wb3AoKSxcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTtcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlUGFyYW1zKHRoaXMsIHRva2VuLnBhcmFtcywgY29udGV4dClcblx0ICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHBhcmFtcykge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgPT09IG51bGwgfHwgb2JqZWN0ID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5zdHJpY3RfdmFyaWFibGVzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcihcIkNhbid0IGFjY2VzcyBhIGtleSBcIiArIGtleSArIFwiIG9uIGFuIG51bGwgb3IgdW5kZWZpbmVkIG9iamVjdC5cIik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgI
46184H0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYXBpdGFsaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuc3Vic3RyKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zdWJzdHIoMSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB2YXJpYWJsZSBmcm9tIHRoZSBjb250ZXh0XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBrZXkgaW4gb2JqZWN0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdFtcImdldFwiICsgY2FwaXRhbGl6ZShrZXkpXSAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtcImdldFwiICsgY2FwaXRhbGl6ZShrZXkpXTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3RbXCJpc1wiICsgY2FwaXRhbGl6ZShrZXkpXSAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtcImlzXCIgKyBjYXBpdGFsaXplKGtleSldO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHJlc29sdmluZyBhbiBleHByZXNzaW9uIHdlIG5lZWQgdG8gcGFzcyBuZXh0X3Rva2VuIGluIGNhc2UgdGhlIGV4cHJlc3Npb24gaXMgYSBmdW5jdGlvblxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLmV4cHJlc3Npb24ucmVzb2x2ZUFzeW5jLmFwcGx5KHRoYXQsIFt2YWx1ZSwgY29udGV4dCwgcGFyYW1zLCBuZXh0X3Rva2VuLCBvYmplY3RdKTtcblx0ICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHJlc3VsdCk7XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmV4cHJlc3Npb24udHlwZS5rZXkuYnJhY2tldHMsXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXlxcWyhbXlxcXVxcOl0qKVxcXS8sXG5cdCAgICAgICAgICAgIG5leHQ6IFR3aWcuZXhwcmVzc2lvbi5zZXQub3BlcmF0aW9uc19leHRlbmRlZC5jb25jYXQoW1xuXHQgICAgICAgICAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydF0pLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gdG9rZW4ubWF0Y2hbMV07XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4udmFsdWU7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFRoZSBleHByZXNzaW9uIHN0YWNrIGZvciB0aGUga2V5XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5zdGFjayA9IFR3aWcuZXhwcmVzc2lvbi5jb21waWxlKHtcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hcblx0ICAgICAgICAgICAgICAgIH0pLnN0YWNrO1xuXG5cdCAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIGNvbnRleHQsIG5leHRfdG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgIC8vIEV2YWx1YXRlIGtleVxuXHQgICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IG51bGwsXG5cdCAgICAgICAgICAgICAgICAgICAgb2JqZWN0LFxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VQYXJhbXModGhpcywgdG9rZW4ucGFyYW1zLCBjb250ZXh0KVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocGFyYW1ldGVycykge1xuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtZXRlcnM7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jLmFwcGx5KHRoYXQsIFt0b2tlbi5zdGFjaywgY29udGV4dF0pO1xuXHQgICAgICAgICAgICAgICAgfSlcblx0ICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGtleSkge1xuXHQgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IHN0YWNrLnBvcCgpO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCA9PT0gbnVsbCB8fCBvYmplY3QgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5vcHRpb25zLnN0cmljdF92YXJpYWJsZXMpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwiQ2FuJ3QgYWNjZXNzIGEga2V5IFwiICsga2V5ICsgXCIgb24gYW4gbnVsbCBvciB1bmRlZmluZWQgb2JqZWN0LlwiKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB2YXJpYWJsZSBmcm9tIHRoZSBjb250ZXh0XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIGtleSBpbiBvYmplY3QpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBvYmplY3Rba2V5XTtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiByZXNvbHZpbmcgYW4gZXhwcmVzc2lvbiB3ZSBuZWVkIHRvIHBhc3MgbmV4dF90b2tlbiBpbiBjYXNlIHRoZSBleHByZXNzaW9uIGlzIGEgZnVuY3Rpb25cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5leHByZXNzaW9uLnJlc29sdmVBc3luYy5hcHBseSh0aGF0LCBbdmFsdWUsIG9iamVjdCwgcGFyYW1zLCBuZXh0X3Rva2VuXSk7XG5cdCAgICAgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChyZXN1bHQpO1xuXHQgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgI
46184H1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIE1hdGNoIGEgbnVsbCB2YWx1ZS5cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLl9udWxsLFxuXHQgICAgICAgICAgICAvLyBtYXRjaCBhIG51bWJlclxuXHQgICAgICAgICAgICByZWdleDogL14obnVsbHxOVUxMfG5vbmV8Tk9ORSkvLFxuXHQgICAgICAgICAgICBuZXh0OiBUd2lnLmV4cHJlc3Npb24uc2V0Lm9wZXJhdGlvbnMsXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgb3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cdCAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZSA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBUd2lnLmV4cHJlc3Npb24uZm4ucGFyc2UucHVzaF92YWx1ZVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogTWF0Y2ggdGhlIGNvbnRleHRcblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLmNvbnRleHQsXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXl9jb250ZXh0Lyxcblx0ICAgICAgICAgICAgbmV4dDogVHdpZy5leHByZXNzaW9uLnNldC5vcGVyYXRpb25zX2V4dGVuZGVkLmNvbmNhdChbXG5cdCAgICAgICAgICAgICAgICAgICAgVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLnN0YXJ0XSksXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IFR3aWcuZXhwcmVzc2lvbi5mbi5jb21waWxlLnB1c2gsXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbih0b2tlbiwgc3RhY2ssIGNvbnRleHQpIHtcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goY29udGV4dCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIE1hdGNoIGEgYm9vbGVhblxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUuYm9vbCxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eKHRydWV8VFJVRXxmYWxzZXxGQUxTRSkvLFxuXHQgICAgICAgICAgICBuZXh0OiBUd2lnLmV4cHJlc3Npb24uc2V0Lm9wZXJhdGlvbnMsXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgb3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZSA9ICh0b2tlbi5tYXRjaFswXS50b0xvd2VyQ2FzZSggKSA9PT0gXCJ0cnVlXCIpO1xuXHQgICAgICAgICAgICAgICAgZGVsZXRlIHRva2VuLm1hdGNoO1xuXHQgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBwYXJzZTogVHdpZy5leHByZXNzaW9uLmZuLnBhcnNlLnB1c2hfdmFsdWVcblx0ICAgICAgICB9XG5cdCAgICBdO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFJlc29sdmUgYSBjb250ZXh0IHZhbHVlLlxuXHQgICAgICpcblx0ICAgICAqIElmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpdCBpcyBleGVjdXRlZCB3aXRoIGEgY29udGV4dCBwYXJhbWV0ZXIuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgY29udGV4dCBvYmplY3Qga2V5LlxuXHQgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgVGhlIHJlbmRlciBjb250ZXh0LlxuXHQgICAgICovXG5cdCAgICBUd2lnLmV4cHJlc3Npb24ucmVzb2x2ZUFzeW5jID0gZnVuY3Rpb24odmFsdWUsIGNvbnRleHQsIHBhcmFtcywgbmV4dF90b2tlbiwgb2JqZWN0KSB7XG5cdCAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgIHZhciBwcm9taXNlID0gVHdpZy5Qcm9taXNlLnJlc29sdmUocGFyYW1zKTtcblxuXHQgICAgICAgICAgICAvKlxuXHQgICAgICAgICAgICBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpdCB3aWxsIGhhdmUgYmVlbiBpbXBvc3NpYmxlIGR1cmluZyB0aGUgY29tcGlsZSBzdGFnZSB0byBkZXRlcm1pbmUgdGhhdCBhIGZvbGxvd2luZ1xuXHQgICAgICAgICAgICBzZXQgb2YgcGFyZW50aGVzZXMgd2VyZSBwYXJhbWV0ZXJzIGZvciB0aGlzIGZ1bmN0aW9uLlxuXG5cdCAgICAgICAgICAgIFRob3NlIHBhcmVudGhlc2VzIHdpbGwgaGF2ZSB0aGVyZWZvcmUgYmVlbiBtYXJrZWQgYXMgYW4gZXhwcmVzc2lvbiwgd2l0aCB0aGVpciBvd24gcGFyYW1ldGVycywgd2hpY2ggcmVhbGx5XG5cdCAgICAgICAgICAgIGJlbG9uZyB0byB0aGlzIGZ1bmN0aW9uLlxuXG5cdCAgICAgICAgICAgIFRob3NlIHBhcmFtZXRlcnMgd2lsbCBhbHNvIG5lZWQgcGFyc2luZyBpbiBjYXNlIHRoZXkgYXJlIGFjdHVhbGx5IGFuIGV4cHJlc3Npb24gdG8gcGFzcyBhcyBwYXJhbWV0ZXJzLlxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgaWYgKG5leHRfdG9rZW4gJiYgbmV4dF90b2tlbi50eXBlID09PSBUd2lnLmV4cHJlc3Npb24udHlwZS5wYXJhbWV0ZXIuZW5kKSB7XG5cdCAgICAgICAgICAgICAgICAvL1doZW4gcGFyc2luZyB0aGVzZSBwYXJhbWV0ZXJzLCB3ZSBuZWVkIHRvIGdldCB0aGVtIGFsbCBiYWNrLCBub3QganVzdCB0aGUgbGFzdCBpdGVtIG9uIHRoZSBzdGFjay5cblx0ICAgICAgICAgICAgICAgIHZhciB0b2tlbnNfYXJlX3BhcmFtZXRlcnMgPSB0cnVlO1xuXG5cdCAgICAgICAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0X3Rva2VuLnBhcmFtcyAmJiBUd2lnLmV4cHJlc3Npb24ucGFyc2VBc3luYy5hcHBseSh0aGlzLCBbbmV4dF90b2tlbi5wYXJhbXMsIGNvbnRleHQsIHRva2Vuc19hcmVfcGFyYW1ldGVyc10pO1xuXHQgICAgICAgICAgICAgICAgfSlcblx0ICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHApIHtcblx0ICAgICAgICAgICAgICAgICAgICAvL0NsZWFuIHVwIHRoZSBwYXJlbnRoZXNlcyB0b2tlbnMgb24gdGhlIG5leHQgbG9vcFxuXHQgICAgICAgICAgICAgICAgICAgIG5leHRfdG9rZW4uY2xlYW51cCA9IHRydWU7XG5cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDtcblx0ICAgICAgICAgICAgICAgI
46184H0pO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbihmdW5jdGlvbihwYXJhbXMpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5hcHBseShvYmplY3QgfHwgY29udGV4dCwgcGFyYW1zIHx8IFtdKTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFR3aWcuUHJvbWlzZS5yZXNvbHZlKHZhbHVlKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICBUd2lnLmV4cHJlc3Npb24ucmVzb2x2ZSA9IGZ1bmN0aW9uKHZhbHVlLCBjb250ZXh0LCBwYXJhbXMsIG5leHRfdG9rZW4sIG9iamVjdCkge1xuXHQgICAgICAgIHZhciBpc19hc3luYyA9IHRydWUsXG5cdCAgICAgICAgICAgIHJlc3VsdDtcblxuXHQgICAgICAgIFR3aWcuZXhwcmVzc2lvbi5yZXNvbHZlQXN5bmMuYXBwbHkodGhpcywgW3ZhbHVlLCBjb250ZXh0LCBwYXJhbXMsIG5leHRfdG9rZW4sIG9iamVjdF0pXG5cdCAgICAgICAgLnRoZW4oZnVuY3Rpb24ocikge1xuXHQgICAgICAgICAgICBpc19hc3luYyA9IGZhbHNlO1xuXHQgICAgICAgICAgICByZXN1bHQgPSByO1xuXHQgICAgICAgIH0pO1xuXG5cdCAgICAgICAgaWYgKGlzX2FzeW5jKVxuXHQgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcignWW91IGFyZSB1c2luZyBUd2lnLmpzIGluIHN5bmMgbW9kZSBpbiBjb21iaW5hdGlvbiB3aXRoIGFzeW5jIGV4dGVuc2lvbnMuJyk7XG5cblx0ICAgICAgICByZXR1cm4gcmVzdWx0O1xuXHQgICAgfVxuXG5cdCAgICAvKipcblx0ICAgICAqIFJlZ2lzdHJ5IGZvciBsb2dpYyBoYW5kbGVycy5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5leHByZXNzaW9uLmhhbmRsZXIgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBEZWZpbmUgYSBuZXcgZXhwcmVzc2lvbiB0eXBlLCBhdmFpbGFibGUgYXQgVHdpZy5sb2dpYy50eXBlLnt0eXBlfVxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBuYW1lIG9mIHRoZSBuZXcgdHlwZS5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5leHByZXNzaW9uLmV4dGVuZFR5cGUgPSBmdW5jdGlvbiAodHlwZSkge1xuXHQgICAgICAgIFR3aWcuZXhwcmVzc2lvbi50eXBlW3R5cGVdID0gXCJUd2lnLmV4cHJlc3Npb24udHlwZS5cIiArIHR5cGU7XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEV4dGVuZCB0aGUgZXhwcmVzc2lvbiBwYXJzaW5nIGZ1bmN0aW9uYWxpdHkgd2l0aCBhIG5ldyBkZWZpbml0aW9uLlxuXHQgICAgICpcblx0ICAgICAqIFRva2VuIGRlZmluaXRpb25zIGZvbGxvdyB0aGlzIGZvcm1hdDpcblx0ICAgICAqICB7XG5cdCAgICAgKiAgICAgIHR5cGU6ICAgICBPbmUgb2YgVHdpZy5leHByZXNzaW9uLnR5cGUuW3R5cGVdLCBlaXRoZXIgcHJlLWRlZmluZWQgb3IgYWRkZWQgdXNpbmdcblx0ICAgICAqICAgICAgICAgICAgICAgICAgICBUd2lnLmV4cHJlc3Npb24uZXh0ZW5kVHlwZVxuXHQgICAgICpcblx0ICAgICAqICAgICAgbmV4dDogICAgIEFycmF5IG9mIHR5cGVzIGZyb20gVHdpZy5leHByZXNzaW9uLnR5cGUgdGhhdCBjYW4gZm9sbG93IHRoaXMgdG9rZW4sXG5cdCAgICAgKlxuXHQgICAgICogICAgICByZWdleDogICAgQSByZWdleCBvciBhcnJheSBvZiByZWdleCdzIHRoYXQgc2hvdWxkIG1hdGNoIHRoZSB0b2tlbi5cblx0ICAgICAqXG5cdCAgICAgKiAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgb3V0cHV0KSBjYWxsZWQgd2hlbiB0aGlzIHRva2VuIGlzIGJlaW5nIGNvbXBpbGVkLlxuXHQgICAgICogICAgICAgICAgICAgICAgICAgU2hvdWxkIHJldHVybiBhbiBvYmplY3Qgd2l0aCBzdGFjayBhbmQgb3V0cHV0IHNldC5cblx0ICAgICAqXG5cdCAgICAgKiAgICAgIHBhcnNlOiAgIGZ1bmN0aW9uKHRva2VuLCBzdGFjaywgY29udGV4dCkgY2FsbGVkIHdoZW4gdGhpcyB0b2tlbiBpcyBiZWluZyBwYXJzZWQuXG5cdCAgICAgKiAgICAgICAgICAgICAgICAgICBTaG91bGQgcmV0dXJuIGFuIG9iamVjdCB3aXRoIHN0YWNrIGFuZCBjb250ZXh0IHNldC5cblx0ICAgICAqICB9XG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtPYmplY3R9IGRlZmluaXRpb24gQSB0b2tlbiBkZWZpbml0aW9uLlxuXHQgICAgICovXG5cdCAgICBUd2lnLmV4cHJlc3Npb24uZXh0ZW5kID0gZnVuY3Rpb24gKGRlZmluaXRpb24pIHtcblx0ICAgICAgICBpZiAoIWRlZmluaXRpb24udHlwZSkge1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcihcIlVuYWJsZSB0byBleHRlbmQgbG9naWMgZGVmaW5pdGlvbi4gTm8gdHlwZSBwcm92aWRlZCBmb3IgXCIgKyBkZWZpbml0aW9uKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgVHdpZy5leHByZXNzaW9uLmhhbmRsZXJbZGVmaW5pdGlvbi50eXBlXSA9IGRlZmluaXRpb247XG5cdCAgICB9O1xuXG5cdCAgICAvLyBFeHRlbmQgd2l0aCBidWlsdC1pbiBleHByZXNzaW9uc1xuXHQgICAgd2hpbGUgKFR3aWcuZXhwcmVzc2lvbi5kZWZpbml0aW9ucy5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgVHdpZy5leHByZXNzaW9uLmV4dGVuZChUd2lnLmV4cHJlc3Npb24uZGVmaW5pdGlvbnMuc2hpZnQoKSk7XG5cdCAgICB9XG5cblx0ICAgIC8qKlxuXHQgICAgICogQnJlYWsgYW4gZXhwcmVzc2lvbiBpbnRvIHRva2VucyBkZWZpbmVkIGluIFR3aWcuZXhwcmVzc2lvbi5kZWZpbml0aW9ucy5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBUaGUgc3RyaW5nIHRvIHRva2VuaXplLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiB0b2tlbnMuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcuZXhwcmVzc2lvbi50b2tlbml6ZSA9IGZ1bmN0aW9uIChleHByZXNzaW9uKSB7XG5cdCAgICAgICAgdmFyIHRva2VucyA9IFtdLFxuXHQgICAgICAgICAgICAvLyBLZWVwIGFuIG9mZnNldCBvZiB0aGUgbG9jYXRpb24gaW4gdGhlIGV4cHJlc3Npb24gZm9yIGVycm9yIG1lc3NhZ2VzLlxuXHQgICAgICAgICAgICBleHBfb2Zmc2V0ID0gMCxcblx0ICAgICAgICAgICAgLy8gVGhlIHZhbGlkIG5leHQgdG9rZW5zIG9mIHRoZSBwcmV2aW91cyB0b2tlblxuXHQgICAgICAgICAgICBuZXh0ID0gbnVsbCxcblx0ICAgICAgICAgICAgLy8gTWF0Y2ggaW5mb3JtYXRpb25cblx0ICAgICAgICAgICAgdHlwZSwgcmVnZXgsIHJlZ2V4X2FycmF5LFxuXHQgICAgICAgICAgICAvLyBUaGUgcG9zc2libGUgbmV4dCB0b2tlbiBmb3IgdGhlIG1hdGNoXG5cdCAgICAgICAgICAgI
46184HRva2VuX25leHQsXG5cdCAgICAgICAgICAgIC8vIEhhcyBhIG1hdGNoIGJlZW4gZm91bmQgZnJvbSB0aGUgZGVmaW5pdGlvbnNcblx0ICAgICAgICAgICAgbWF0Y2hfZm91bmQsIGludmFsaWRfbWF0Y2hlcyA9IFtdLCBtYXRjaF9mdW5jdGlvbjtcblxuXHQgICAgICAgIG1hdGNoX2Z1bmN0aW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgbWF0Y2ggPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSxcblx0ICAgICAgICAgICAgICAgIHN0cmluZyA9IG1hdGNoLnBvcCgpLFxuXHQgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbWF0Y2gucG9wKCk7XG5cblx0ICAgICAgICAgICAgVHdpZy5sb2cudHJhY2UoXCJUd2lnLmV4cHJlc3Npb24udG9rZW5pemVcIixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJNYXRjaGVkIGEgXCIsIHR5cGUsIFwiIHJlZ3VsYXIgZXhwcmVzc2lvbiBvZiBcIiwgbWF0Y2gpO1xuXG5cdCAgICAgICAgICAgIGlmIChuZXh0ICYmIFR3aWcuaW5kZXhPZihuZXh0LCB0eXBlKSA8IDApIHtcblx0ICAgICAgICAgICAgICAgIGludmFsaWRfbWF0Y2hlcy5wdXNoKFxuXHQgICAgICAgICAgICAgICAgICAgIHR5cGUgKyBcIiBjYW5ub3QgZm9sbG93IGEgXCIgKyB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLnR5cGUgK1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBhdCB0ZW1wbGF0ZTpcIiArIGV4cF9vZmZzZXQgKyBcIiBuZWFyICdcIiArIG1hdGNoWzBdLnN1YnN0cmluZygwLCAyMCkgK1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICBcIi4uLidcIlxuXHQgICAgICAgICAgICAgICAgKTtcblx0ICAgICAgICAgICAgICAgIC8vIE5vdCBhIG1hdGNoLCBkb24ndCBjaGFuZ2UgdGhlIGV4cHJlc3Npb25cblx0ICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaFswXTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoZSB0b2tlbiBpZiBhIHZhbGlkYXRpb24gZnVuY3Rpb24gaXMgcHJvdmlkZWRcblx0ICAgICAgICAgICAgaWYgKFR3aWcuZXhwcmVzc2lvbi5oYW5kbGVyW3R5cGVdLnZhbGlkYXRlICYmXG5cdCAgICAgICAgICAgICAgICAgICAgIVR3aWcuZXhwcmVzc2lvbi5oYW5kbGVyW3R5cGVdLnZhbGlkYXRlKG1hdGNoLCB0b2tlbnMpKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hbMF07XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBpbnZhbGlkX21hdGNoZXMgPSBbXTtcblxuXHQgICAgICAgICAgICB0b2tlbnMucHVzaCh7XG5cdCAgICAgICAgICAgICAgICB0eXBlOiAgdHlwZSxcblx0ICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFswXSxcblx0ICAgICAgICAgICAgICAgIG1hdGNoOiBtYXRjaFxuXHQgICAgICAgICAgICB9KTtcblxuXHQgICAgICAgICAgICBtYXRjaF9mb3VuZCA9IHRydWU7XG5cdCAgICAgICAgICAgIG5leHQgPSB0b2tlbl9uZXh0O1xuXHQgICAgICAgICAgICBleHBfb2Zmc2V0ICs9IG1hdGNoWzBdLmxlbmd0aDtcblxuXHQgICAgICAgICAgICAvLyBEb2VzIHRoZSB0b2tlbiBuZWVkIHRvIHJldHVybiBvdXRwdXQgYmFjayB0byB0aGUgZXhwcmVzc2lvbiBzdHJpbmdcblx0ICAgICAgICAgICAgLy8gZS5nLiBhIGZ1bmN0aW9uIG1hdGNoIG9mIGN5Y2xlKCBtaWdodCByZXR1cm4gdGhlICcoJyBiYWNrIHRvIHRoZSBleHByZXNzaW9uXG5cdCAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIGxvb2stYWhlYWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRva2VuIHR5cGVzIChlLmcuIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGUgbmFtZXMpXG5cdCAgICAgICAgICAgIGlmIChUd2lnLmV4cHJlc3Npb24uaGFuZGxlclt0eXBlXS50cmFuc2Zvcm0pIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLmV4cHJlc3Npb24uaGFuZGxlclt0eXBlXS50cmFuc2Zvcm0obWF0Y2gsIHRva2Vucyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuICcnO1xuXHQgICAgICAgIH07XG5cblx0ICAgICAgICBUd2lnLmxvZy5kZWJ1ZyhcIlR3aWcuZXhwcmVzc2lvbi50b2tlbml6ZVwiLCBcIlRva2VuaXppbmcgZXhwcmVzc2lvbiBcIiwgZXhwcmVzc2lvbik7XG5cblx0ICAgICAgICB3aGlsZSAoZXhwcmVzc2lvbi5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnRyaW0oKTtcblx0ICAgICAgICAgICAgZm9yICh0eXBlIGluIFR3aWcuZXhwcmVzc2lvbi5oYW5kbGVyKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoVHdpZy5leHByZXNzaW9uLmhhbmRsZXIuaGFzT3duUHJvcGVydHkodHlwZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0b2tlbl9uZXh0ID0gVHdpZy5leHByZXNzaW9uLmhhbmRsZXJbdHlwZV0ubmV4dDtcblx0ICAgICAgICAgICAgICAgICAgICByZWdleCA9IFR3aWcuZXhwcmVzc2lvbi5oYW5kbGVyW3R5cGVdLnJlZ2V4O1xuXHQgICAgICAgICAgICAgICAgICAgIFR3aWcubG9nLnRyYWNlKFwiQ2hlY2tpbmcgdHlwZSBcIiwgdHlwZSwgXCIgb24gXCIsIGV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChyZWdleCBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4X2FycmF5ID0gcmVnZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhfYXJyYXkgPSBbcmVnZXhdO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIG1hdGNoX2ZvdW5kID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlZ2V4X2FycmF5Lmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXggPSByZWdleF9hcnJheS5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ucmVwbGFjZShyZWdleCwgbWF0Y2hfZnVuY3Rpb24pO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAvLyBBbiBleHByZXNzaW9uIHRva2VuIGhhcyBiZWVuIG1hdGNoZWQuIEJyZWFrIHRoZSBmb3IgbG9vcCBhbmQgc3RhcnQgdHJ5aW5nIHRvXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gIG1hdGNoIHRoZSBuZXh0IHRlbXBsYXRlIChpZiBleHByZXNzaW9uIGlzbid0IGVtcHR5Lilcblx0ICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hfZm91bmQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICghbWF0Y2hfZm91bmQpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChpbnZhbGlkX21hdGNoZXMubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgI
46184HRocm93IG5ldyBUd2lnLkVycm9yKGludmFsaWRfbWF0Y2hlcy5qb2luKFwiIE9SIFwiKSk7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwiVW5hYmxlIHRvIHBhcnNlICdcIiArIGV4cHJlc3Npb24gKyBcIicgYXQgdGVtcGxhdGUgcG9zaXRpb25cIiArIGV4cF9vZmZzZXQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgVHdpZy5sb2cudHJhY2UoXCJUd2lnLmV4cHJlc3Npb24udG9rZW5pemVcIiwgXCJUb2tlbml6ZWQgdG8gXCIsIHRva2Vucyk7XG5cdCAgICAgICAgcmV0dXJuIHRva2Vucztcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogQ29tcGlsZSBhbiBleHByZXNzaW9uIHRva2VuLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7T2JqZWN0fSByYXdfdG9rZW4gVGhlIHVuY29tcGlsZWQgdG9rZW4uXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgY29tcGlsZWQgdG9rZW4uXG5cdCAgICAgKi9cblx0ICAgIFR3aWcuZXhwcmVzc2lvbi5jb21waWxlID0gZnVuY3Rpb24gKHJhd190b2tlbikge1xuXHQgICAgICAgIHZhciBleHByZXNzaW9uID0gcmF3X3Rva2VuLnZhbHVlLFxuXHQgICAgICAgICAgICAvLyBUb2tlbml6ZSBleHByZXNzaW9uXG5cdCAgICAgICAgICAgIHRva2VucyA9IFR3aWcuZXhwcmVzc2lvbi50b2tlbml6ZShleHByZXNzaW9uKSxcblx0ICAgICAgICAgICAgdG9rZW4gPSBudWxsLFxuXHQgICAgICAgICAgICBvdXRwdXQgPSBbXSxcblx0ICAgICAgICAgICAgc3RhY2sgPSBbXSxcblx0ICAgICAgICAgICAgdG9rZW5fdGVtcGxhdGUgPSBudWxsO1xuXG5cdCAgICAgICAgVHdpZy5sb2cudHJhY2UoXCJUd2lnLmV4cHJlc3Npb24uY29tcGlsZTogXCIsIFwiQ29tcGlsaW5nIFwiLCBleHByZXNzaW9uKTtcblxuXHQgICAgICAgIC8vIFB1c2ggdG9rZW5zIGludG8gUlBOIHN0YWNrIHVzaW5nIHRoZSBTaHVudGluZy15YXJkIGFsZ29yaXRobVxuXHQgICAgICAgIC8vIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NodW50aW5nX3lhcmRfYWxnb3JpdGhtXG5cblx0ICAgICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnMuc2hpZnQoKTtcblx0ICAgICAgICAgICAgdG9rZW5fdGVtcGxhdGUgPSBUd2lnLmV4cHJlc3Npb24uaGFuZGxlclt0b2tlbi50eXBlXTtcblxuXHQgICAgICAgICAgICBUd2lnLmxvZy50cmFjZShcIlR3aWcuZXhwcmVzc2lvbi5jb21waWxlOiBcIiwgXCJDb21waWxpbmcgXCIsIHRva2VuKTtcblxuXHQgICAgICAgICAgICAvLyBDb21waWxlIHRoZSB0ZW1wbGF0ZVxuXHQgICAgICAgICAgICB0b2tlbl90ZW1wbGF0ZS5jb21waWxlICYmIHRva2VuX3RlbXBsYXRlLmNvbXBpbGUodG9rZW4sIHN0YWNrLCBvdXRwdXQpO1xuXG5cdCAgICAgICAgICAgIFR3aWcubG9nLnRyYWNlKFwiVHdpZy5leHByZXNzaW9uLmNvbXBpbGU6IFwiLCBcIlN0YWNrIGlzXCIsIHN0YWNrKTtcblx0ICAgICAgICAgICAgVHdpZy5sb2cudHJhY2UoXCJUd2lnLmV4cHJlc3Npb24uY29tcGlsZTogXCIsIFwiT3V0cHV0IGlzXCIsIG91dHB1dCk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgd2hpbGUoc3RhY2subGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICBvdXRwdXQucHVzaChzdGFjay5wb3AoKSk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgVHdpZy5sb2cudHJhY2UoXCJUd2lnLmV4cHJlc3Npb24uY29tcGlsZTogXCIsIFwiRmluYWwgb3V0cHV0IGlzXCIsIG91dHB1dCk7XG5cblx0ICAgICAgICByYXdfdG9rZW4uc3RhY2sgPSBvdXRwdXQ7XG5cdCAgICAgICAgZGVsZXRlIHJhd190b2tlbi52YWx1ZTtcblxuXHQgICAgICAgIHJldHVybiByYXdfdG9rZW47XG5cdCAgICB9O1xuXG5cblx0ICAgIC8qKlxuXHQgICAgICogUGFyc2UgYW4gUlBOIGV4cHJlc3Npb24gc3RhY2sgd2l0aGluIGEgY29udGV4dC5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge0FycmF5fSB0b2tlbnMgQW4gYXJyYXkgb2YgY29tcGlsZWQgZXhwcmVzc2lvbiB0b2tlbnMuXG5cdCAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCBUaGUgcmVuZGVyIGNvbnRleHQgdG8gcGFyc2UgdGhlIHRva2VucyB3aXRoLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIHJlc3VsdCBvZiBwYXJzaW5nIGFsbCB0aGUgdG9rZW5zLiBUaGUgcmVzdWx0XG5cdCAgICAgKiAgICAgICAgICAgICAgICAgIGNhbiBiZSBhbnl0aGluZywgU3RyaW5nLCBBcnJheSwgT2JqZWN0LCBldGMuLi4gYmFzZWQgb25cblx0ICAgICAqICAgICAgICAgICAgICAgICAgdGhlIGdpdmVuIGV4cHJlc3Npb24uXG5cdCAgICAgKi9cblx0ICAgIFR3aWcuZXhwcmVzc2lvbi5wYXJzZSA9IGZ1bmN0aW9uICh0b2tlbnMsIGNvbnRleHQsIHRva2Vuc19hcmVfcGFyYW1ldGVycywgYWxsb3dfYXN5bmMpIHtcblx0ICAgICAgICB2Y
46184XIgdGhhdCA9IHRoaXM7XG5cblx0ICAgICAgICAvLyBJZiB0aGUgdG9rZW4gaXNuJ3QgYW4gYXJyYXksIG1ha2UgaXQgb25lLlxuXHQgICAgICAgIGlmICghKHRva2VucyBpbnN0YW5jZW9mIEFycmF5KSkge1xuXHQgICAgICAgICAgICB0b2tlbnMgPSBbdG9rZW5zXTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyBUaGUgb3V0cHV0IHN0YWNrXG5cdCAgICAgICAgdmFyIHN0YWNrID0gW10sXG5cdCAgICAgICAgICAgIG5leHRfdG9rZW4sXG5cdCAgICAgICAgICAgIG91dHB1dCA9IG51bGwsXG5cdCAgICAgICAgICAgIHByb21pc2UgPSBudWxsLFxuXHQgICAgICAgICAgICBpc19hc3luYyA9IHRydWUsXG5cdCAgICAgICAgICAgIHRva2VuX3RlbXBsYXRlID0gbnVsbCxcblx0ICAgICAgICAgICAgbG9vcF90b2tlbl9maXh1cHMgPSBbXTtcblxuXHQgICAgICAgIHByb21pc2UgPSBUd2lnLmFzeW5jLmZvckVhY2godG9rZW5zLCBmdW5jdGlvbiAodG9rZW4sIGluZGV4KSB7XG5cdCAgICAgICAgICAgIC8vSWYgdGhlIHRva2VuIGlzIG1hcmtlZCBmb3IgY2xlYW51cCwgd2UgZG9uJ3QgbmVlZCB0byBwYXJzZSBpdFxuXHQgICAgICAgICAgICBpZiAodG9rZW4uY2xlYW51cCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG51bGw7XG5cblx0ICAgICAgICAgICAgLy9EZXRlcm1pbmUgdGhlIHRva2VuIHRoYXQgZm9sbG93cyB0aGlzIG9uZSBzbyB0aGF0IHdlIGNhbiBwYXNzIGl0IHRvIHRoZSBwYXJzZXJcblx0ICAgICAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiBpbmRleCArIDEpIHtcblx0ICAgICAgICAgICAgICAgIG5leHRfdG9rZW4gPSB0b2tlbnNbaW5kZXggKyAxXTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHRva2VuX3RlbXBsYXRlID0gVHdpZy5leHByZXNzaW9uLmhhbmRsZXJbdG9rZW4udHlwZV07XG5cblx0ICAgICAgICAgICAgaWYgKHRva2VuX3RlbXBsYXRlLnBhcnNlKVxuXHQgICAgICAgICAgICAgICAgcmVzdWx0ID0gdG9rZW5fdGVtcGxhdGUucGFyc2UuYXBwbHkodGhhdCwgW3Rva2VuLCBzdGFjaywgY29udGV4dCwgbmV4dF90b2tlbl0pO1xuXG5cdCAgICAgICAgICAgIC8vU3RvcmUgYW55IGJpbmFyeSB0b2tlbnMgZm9yIGxhdGVyIGlmIHdlIGFyZSBpbiBhIGxvb3AuXG5cdCAgICAgICAgICAgIGlmIChjb250ZXh0Lmxvb3AgJiYgdG9rZW4udHlwZSA9PT0gVHdpZy5leHByZXNzaW9uLnR5cGUub3BlcmF0b3IuYmluYXJ5KSB7XG5cdCAgICAgICAgICAgICAgICBsb29wX3Rva2VuX2ZpeHVwcy5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG5cdCAgICAgICAgfSlcblx0ICAgICAgICAudGhlbihmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgLy9DaGVjayBldmVyeSBmaXh1cCBhbmQgcmVtb3ZlIFwia2V5XCIgYXMgbG9uZyBhcyB0aGV5IHN0aWxsIGhhdmUgXCJwYXJhbXNcIi4gVGhpcyBjb3ZlcnMgdGhlIHVzZSBjYXNlIHdoZXJlXG5cdCAgICAgICAgICAgIC8vYSBcIjpcIiBvcGVyYXRvciBpcyB1c2VkIGluIGEgbG9vcCB3aXRoIGEgXCIoZXhwcmVzc2lvbik6XCIgc3RhdGVtZW50LiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb25cblx0ICAgICAgICAgICAgVHdpZy5mb3JFYWNoKGxvb3BfdG9rZW5fZml4dXBzLCBmdW5jdGlvbiAobG9vcF90b2tlbl9maXh1cCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKGxvb3BfdG9rZW5fZml4dXAucGFyYW1zICYmIGxvb3BfdG9rZW5fZml4dXAua2V5KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGxvb3BfdG9rZW5fZml4dXBbXCJrZXlcIl07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0pO1xuXG5cdCAgICAgICAgICAgIC8vSWYgcGFyc2UgaGFzIGJlZW4gY2FsbGVkIHdpdGggYSBzZXQgb2YgdG9rZW5zIHRoYXQgYXJlIHBhcmFtZXRlcnMsIHdlIG5lZWQgdG8gcmV0dXJuIHRoZSB3aG9sZSBzdGFjayxcblx0ICAgICAgICAgICAgLy93cmFwcGVkIGluIGFuIEFycmF5LlxuXHQgICAgICAgICAgICBpZiAodG9rZW5zX2FyZV9wYXJhbWV0ZXJzKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgcGFyYW1zID0gW107XG5cdCAgICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtcy51bnNoaWZ0KHN0YWNrLnBvcCgpKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChwYXJhbXMpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgaWYgKGFsbG93X2FzeW5jKVxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcuUHJvbWlzZS5yZXNvbHZlKHN0YWNrLnBvcCgpKTtcblx0ICAgICAgICB9KVxuXHQgICAgICAgIC50aGVuKGZ1bmN0aW9uKHYpIHtcblx0ICAgICAgICAgICAgaXNfYXN5bmMgPSBmYWxzZTtcblx0ICAgICAgICAgICAgcmV0dXJuIHY7XG5cdCAgICAgICAgfSk7XG5cblx0ICAgICAgICBpZiAoYWxsb3dfYXN5bmMpXG5cdCAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuXG5cdCAgICAgICAgaWYgKGlzX2FzeW5jKVxuXHQgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcignWW91IGFyZSB1c2luZyBUd2lnLmpzIGluIHN5bmMgbW9kZSBpbiBjb21iaW5hdGlvbiB3aXRoIGFzeW5jIGV4dGVuc2lvbnMuJyk7XG5cblx0ICAgICAgICAvLyBQb3AgdGhlIGZpbmFsIHZhbHVlIG9mZiB0aGUgc3RhY2tcblx0ICAgICAgICByZXR1cm4gc3RhY2sucG9wKCk7XG5cdCAgICB9O1xuXG5cdCAgICByZXR1cm4gVHdpZztcblxuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiA0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyAjIyB0d2lnLmV4cHJlc3Npb24ub3BlcmF0b3IuanNcblx0Ly9cblx0Ly8gVGhpcyBmaWxlIGhhbmRsZXMgb3BlcmF0b3IgbG9va3VwcyBhbmQgcGFyc2luZy5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVHdpZykge1xuXHQgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cblx0ICAgIC8qKlxuXHQgICAgICogT3BlcmF0b3IgYXNzb2NpYXRpdml0eSBjb25zdGFudHMuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvciA9IHtcblx0ICAgICAgICBsZWZ0VG9SaWdodDogJ2xlZnRUb1JpZ2h0Jyxcblx0ICAgICAgICByaWdodFRvTGVmdDogJ3JpZ2h0VG9MZWZ0J1xuXHQgICAgfTtcblxuXHQgICAgdmFyIGNvbnRhaW5tZW50ID0gZnVuY3Rpb24oYSwgYikge1xuXHQgICAgICAgIGlmIChiID09PSB1bmRlZmluZWQgfHwgYiA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICByZXR1cm4gbnVsbDtcblx0ICAgICAgICB9IGVsc2UgaWYgKGIuaW5kZXhPZiAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIC8vIFN0cmluZ1xuXHQgICAgICAgICAgICByZXR1cm4gYSA9PT0gYiB8fCBhICE9PSAnJyAmJiBiLmluZGV4T2YoYSkgPiAtMTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB2Y
46184XIgZWw7XG5cdCAgICAgICAgICAgIGZvciAoZWwgaW4gYikge1xuXHQgICAgICAgICAgICAgICAgaWYgKGIuaGFzT3duUHJvcGVydHkoZWwpICYmIGJbZWxdID09PSBhKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogR2V0IHRoZSBwcmVjaWRlbmNlIGFuZCBhc3NvY2lhdGl2aXR5IG9mIGFuIG9wZXJhdG9yLiBUaGVzZSBmb2xsb3cgdGhlIG9yZGVyIHRoYXQgQy9DKysgdXNlLlxuXHQgICAgICogU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT3BlcmF0b3JzX2luX0NfYW5kX0MrKyBmb3IgdGhlIHRhYmxlIG9mIHZhbHVlcy5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5leHByZXNzaW9uLm9wZXJhdG9yLmxvb2t1cCA9IGZ1bmN0aW9uIChvcGVyYXRvciwgdG9rZW4pIHtcblx0ICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG5cdCAgICAgICAgICAgIGNhc2UgXCIuLlwiOlxuXHQgICAgICAgICAgICAgICAgdG9rZW4ucHJlY2lkZW5jZSA9IDIwO1xuXHQgICAgICAgICAgICAgICAgdG9rZW4uYXNzb2NpYXRpdml0eSA9IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sZWZ0VG9SaWdodDtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJywnOlxuXHQgICAgICAgICAgICAgICAgdG9rZW4ucHJlY2lkZW5jZSA9IDE4O1xuXHQgICAgICAgICAgICAgICAgdG9rZW4uYXNzb2NpYXRpdml0eSA9IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sZWZ0VG9SaWdodDtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIC8vIFRlcm5hcnlcblx0ICAgICAgICAgICAgY2FzZSAnPzonOlxuXHQgICAgICAgICAgICBjYXNlICc/Jzpcblx0ICAgICAgICAgICAgY2FzZSAnOic6XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5wcmVjaWRlbmNlID0gMTY7XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5hc3NvY2lhdGl2aXR5ID0gVHdpZy5leHByZXNzaW9uLm9wZXJhdG9yLnJpZ2h0VG9MZWZ0O1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnb3InOlxuXHQgICAgICAgICAgICAgICAgdG9rZW4ucHJlY2lkZW5jZSA9IDE0O1xuXHQgICAgICAgICAgICAgICAgdG9rZW4uYXNzb2NpYXRpdml0eSA9IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sZWZ0VG9SaWdodDtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJ2FuZCc6XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5wcmVjaWRlbmNlID0gMTM7XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5hc3NvY2lhdGl2aXR5ID0gVHdpZy5leHByZXNzaW9uLm9wZXJhdG9yLmxlZnRUb1JpZ2h0O1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnYi1vcic6XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5wcmVjaWRlbmNlID0gMTI7XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5hc3NvY2lhdGl2aXR5ID0gVHdpZy5leHByZXNzaW9uLm9wZXJhdG9yLmxlZnRUb1JpZ2h0O1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnYi14b3InOlxuXHQgICAgICAgICAgICAgICAgdG9rZW4ucHJlY2lkZW5jZSA9IDExO1xuXHQgICAgICAgICAgICAgICAgdG9rZW4uYXNzb2NpYXRpdml0eSA9IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sZWZ0VG9SaWdodDtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJ2ItYW5kJzpcblx0ICAgICAgICAgICAgICAgIHRva2VuLnByZWNpZGVuY2UgPSAxMDtcblx0ICAgICAgICAgICAgICAgIHRva2VuLmFzc29jaWF0aXZpdHkgPSBUd2lnLmV4cHJlc3Npb24ub3BlcmF0b3IubGVmdFRvUmlnaHQ7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICc9PSc6XG5cdCAgICAgICAgICAgIGNhc2UgJyE9Jzpcblx0ICAgICAgICAgICAgICAgIHRva2VuLnByZWNpZGVuY2UgPSA5O1xuXHQgICAgICAgICAgICAgICAgdG9rZW4uYXNzb2NpYXRpdml0eSA9IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sZWZ0VG9SaWdodDtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJzwnOlxuXHQgICAgICAgICAgICBjYXNlICc8PSc6XG5cdCAgICAgICAgICAgIGNhc2UgJz4nOlxuXHQgICAgICAgICAgICBjYXNlICc+PSc6XG5cdCAgICAgICAgICAgIGNhc2UgJ25vdCBpbic6XG5cdCAgICAgICAgICAgIGNhc2UgJ2luJzpcblx0ICAgICAgICAgICAgICAgIHRva2VuLnByZWNpZGVuY2UgPSA4O1xuXHQgICAgICAgICAgICAgICAgdG9rZW4uYXNzb2NpYXRpdml0eSA9IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sZWZ0VG9SaWdodDtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJ34nOiAvLyBTdHJpbmcgY29uY2F0aW5hdGlvblxuXHQgICAgICAgICAgICBjYXNlICcrJzpcblx0ICAgICAgICAgICAgY2FzZSAnLSc6XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5wcmVjaWRlbmNlID0gNjtcblx0ICAgICAgICAgICAgICAgIHRva2VuLmFzc29jaWF0aXZpdHkgPSBUd2lnLmV4cHJlc3Npb24ub3BlcmF0b3IubGVmdFRvUmlnaHQ7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICcvLyc6XG5cdCAgICAgICAgICAgIGNhc2UgJyoqJzpcblx0ICAgICAgICAgICAgY2FzZSAnKic6XG5cdCAgICAgICAgICAgIGNhc2UgJy8nOlxuXHQgICAgICAgICAgICBjYXNlICclJzpcblx0ICAgICAgICAgICAgICAgIHRva2VuLnByZWNpZGVuY2UgPSA1O1xuXHQgICAgICAgICAgICAgICAgdG9rZW4uYXNzb2NpYXRpdml0eSA9IFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5sZWZ0VG9SaWdodDtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJ25vdCc6XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5wcmVjaWRlbmNlID0gMztcblx0ICAgICAgICAgICAgICAgI
46184HRva2VuLmFzc29jaWF0aXZpdHkgPSBUd2lnLmV4cHJlc3Npb24ub3BlcmF0b3IucmlnaHRUb0xlZnQ7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJGYWlsZWQgdG8gbG9va3VwIG9wZXJhdG9yOiBcIiArIG9wZXJhdG9yICsgXCIgaXMgYW4gdW5rbm93biBvcGVyYXRvci5cIik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRva2VuLm9wZXJhdG9yID0gb3BlcmF0b3I7XG5cdCAgICAgICAgcmV0dXJuIHRva2VuO1xuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBIYW5kbGUgb3BlcmF0aW9ucyBvbiB0aGUgUlBOIHN0YWNrLlxuXHQgICAgICpcblx0ICAgICAqIFJldHVybnMgdGhlIHVwZGF0ZWQgc3RhY2suXG5cdCAgICAgKi9cblx0ICAgIFR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5wYXJzZSA9IGZ1bmN0aW9uIChvcGVyYXRvciwgc3RhY2spIHtcblx0ICAgICAgICBUd2lnLmxvZy50cmFjZShcIlR3aWcuZXhwcmVzc2lvbi5vcGVyYXRvci5wYXJzZTogXCIsIFwiSGFuZGxpbmcgXCIsIG9wZXJhdG9yKTtcblx0ICAgICAgICB2YXIgYSwgYiwgYztcblxuXHQgICAgICAgIGlmIChvcGVyYXRvciA9PT0gJz8nKSB7XG5cdCAgICAgICAgICAgIGMgPSBzdGFjay5wb3AoKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBiID0gc3RhY2sucG9wKCk7XG5cdCAgICAgICAgaWYgKG9wZXJhdG9yICE9PSAnbm90Jykge1xuXHQgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgaWYgKG9wZXJhdG9yICE9PSAnaW4nICYmIG9wZXJhdG9yICE9PSAnbm90IGluJykge1xuXHQgICAgICAgICAgICBpZiAoYSAmJiBBcnJheS5pc0FycmF5KGEpKSB7XG5cdCAgICAgICAgICAgICAgICBhID0gYS5sZW5ndGg7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBpZiAoYiAmJiBBcnJheS5pc0FycmF5KGIpKSB7XG5cdCAgICAgICAgICAgICAgICBiID0gYi5sZW5ndGg7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG5cdCAgICAgICAgICAgIGNhc2UgJzonOlxuXHQgICAgICAgICAgICAgICAgLy8gSWdub3JlXG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICc/Oic6XG5cdCAgICAgICAgICAgICAgICBpZiAoVHdpZy5saWIuYm9vbHZhbChhKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSk7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSAnPyc6XG5cdCAgICAgICAgICAgICAgICBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy9BbiBleHRlbmRlZCB0ZXJuYXJ5LlxuXHQgICAgICAgICAgICAgICAgICAgIGEgPSBiO1xuXHQgICAgICAgICAgICAgICAgICAgIGIgPSBjO1xuXHQgICAgICAgICAgICAgICAgICAgIGMgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIGlmIChUd2lnLmxpYi5ib29sdmFsKGEpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChiKTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChjKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJysnOlxuXHQgICAgICAgICAgICAgICAgYiA9IHBhcnNlRmxvYXQoYik7XG5cdCAgICAgICAgICAgICAgICBhID0gcGFyc2VGbG9hdChhKTtcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSArIGIpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnLSc6XG5cdCAgICAgICAgICAgICAgICBiID0gcGFyc2VGbG9hdChiKTtcblx0ICAgICAgICAgICAgICAgIGEgPSBwYXJzZUZsb2F0KGEpO1xuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhIC0gYik7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICcqJzpcblx0ICAgICAgICAgICAgICAgIGIgPSBwYXJzZUZsb2F0KGIpO1xuXHQgICAgICAgICAgICAgICAgYSA9IHBhcnNlRmxvYXQoYSk7XG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgKiBiKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJy8nOlxuXHQgICAgICAgICAgICAgICAgYiA9IHBhcnNlRmxvYXQoYik7XG5cdCAgICAgICAgICAgICAgICBhID0gcGFyc2VGbG9hdChhKTtcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSAvIGIpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnLy8nOlxuXHQgICAgICAgICAgICAgICAgYiA9IHBhcnNlRmxvYXQoYik7XG5cdCAgICAgICAgICAgICAgICBhID0gcGFyc2VGbG9hdChhKTtcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5mbG9vcihhIC8gYikpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnJSc6XG5cdCAgICAgICAgICAgICAgICBiID0gcGFyc2VGbG9hdChiKTtcblx0ICAgICAgICAgICAgICAgIGEgPSBwYXJzZUZsb2F0KGEpO1xuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhICUgYik7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICd+Jzpcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goIChhICE9IG51bGwgPyBhLnRvU3RyaW5nKCkgOiBcIlwiKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGIgIT0gbnVsbCA/IGIudG9TdHJpbmcoKSA6IFwiXCIpICk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICdub3QnOlxuXHQgICAgICAgICAgICBjYXNlICchJzpcblx0ICAgICAgICAgICAgICAgI
46184HN0YWNrLnB1c2goIVR3aWcubGliLmJvb2x2YWwoYikpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnPCc6XG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgPCBiKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJzw9Jzpcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSA8PSBiKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJz4nOlxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhID4gYik7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICc+PSc6XG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgPj0gYik7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICc9PT0nOlxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhID09PSBiKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJz09Jzpcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSA9PSBiKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJyE9PSc6XG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgIT09IGIpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnIT0nOlxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhICE9IGIpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnb3InOlxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhIHx8IGIpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnYi1vcic6XG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgfCBiKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJ2IteG9yJzpcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSBeIGIpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnYW5kJzpcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSAmJiBiKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGNhc2UgJ2ItYW5kJzpcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSAmIGIpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnKionOlxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaChNYXRoLnBvdyhhLCBiKSk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICdub3QgaW4nOlxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaCggIWNvbnRhaW5tZW50KGEsIGIpICk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICBjYXNlICdpbic6XG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKCBjb250YWlubWVudChhLCBiKSApO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgICAgY2FzZSAnLi4nOlxuXHQgICAgICAgICAgICAgICAgc3RhY2sucHVzaCggVHdpZy5mdW5jdGlvbnMucmFuZ2UoYSwgYikgKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIG9wZXJhdG9yOiBcIiArIG9wZXJhdG9yICsgXCIgaXMgYW4gdW5rbm93biBvcGVyYXRvci5cIik7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgcmV0dXJuIFR3aWc7XG5cblx0fTtcblxuXG4vKioqLyB9LFxuLyogNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Ly8gIyMgdHdpZy5maWx0ZXJzLmpzXG5cdC8vXG5cdC8vIFRoaXMgZmlsZSBoYW5kbGVzIHBhcnNpbmcgZmlsdGVycy5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVHdpZykge1xuXG5cdCAgICAvLyBEZXRlcm1pbmUgb2JqZWN0IHR5cGVcblx0ICAgIGZ1bmN0aW9uIGlzKHR5cGUsIG9iaikge1xuXHQgICAgICAgIHZhciBjbGFzID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikuc2xpY2UoOCwgLTEpO1xuXHQgICAgICAgIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgJiYgY2xhcyA9PT0gdHlwZTtcblx0ICAgIH1cblxuXHQgICAgVHdpZy5maWx0ZXJzID0ge1xuXHQgICAgICAgIC8vIFN0cmluZyBGaWx0ZXJzXG5cdCAgICAgICAgdXBwZXI6ICBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICBpZiAoIHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0ICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvVXBwZXJDYXNlKCk7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBsb3dlcjogZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgKSB7XG5cdCAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgY2FwaXRhbGl6ZTogZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgKSB7XG5cdCAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cigwLCAxKS50b1VwcGVyQ2FzZSgpICsgdmFsdWUudG9Mb3dlckNhc2UoKS5zdWJzdHIoMSk7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB0aXRsZTogZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgKSB7XG5cdCAgICAgICAgICAgICAgI
46184HJldHVybiB2YWx1ZTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoIC8oXnxcXHMpKFthLXpdKS9nICwgZnVuY3Rpb24obSwgcDEsIHAyKXtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBwMSArIHAyLnRvVXBwZXJDYXNlKCk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICBpZiAoVHdpZy5saWIuaXMoXCJBcnJheVwiLCB2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUubGVuZ3RoO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKFR3aWcubGliLmlzKFwiT2JqZWN0XCIsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHZhbHVlLl9rZXlzID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aDtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLl9rZXlzLmxlbmd0aDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAwO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8vIEFycmF5L09iamVjdCBGaWx0ZXJzXG5cdCAgICAgICAgcmV2ZXJzZTogZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgaWYgKGlzKFwiQXJyYXlcIiwgdmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUucmV2ZXJzZSgpO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKGlzKFwiU3RyaW5nXCIsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnNwbGl0KFwiXCIpLnJldmVyc2UoKS5qb2luKFwiXCIpO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKGlzKFwiT2JqZWN0XCIsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGtleXMgPSB2YWx1ZS5fa2V5cyB8fCBPYmplY3Qua2V5cyh2YWx1ZSkucmV2ZXJzZSgpO1xuXHQgICAgICAgICAgICAgICAgdmFsdWUuX2tleXMgPSBrZXlzO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzb3J0OiBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICBpZiAoaXMoXCJBcnJheVwiLCB2YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zb3J0KCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAoaXMoJ09iamVjdCcsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gU29ydGluZyBvYmplY3RzIGlzbid0IG9idmlvdXMgc2luY2UgdGhlIG9yZGVyIG9mXG5cdCAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBrZXlzIGlzbid0IGd1YXJhbnRlZWQgaW4gSmF2YVNjcmlwdC5cblx0ICAgICAgICAgICAgICAgIC8vIEJlY2F1c2Ugb2YgdGhpcyB3ZSB1c2UgYSBcImhpZGRlblwiIGtleSBjYWxsZWQgX2tleXMgdG9cblx0ICAgICAgICAgICAgICAgIC8vIHN0b3JlIHRoZSBrZXlzIGluIHRoZSBvcmRlciB3ZSB3YW50IHRvIHJldHVybiB0aGVtLlxuXG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdmFsdWUuX2tleXM7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKSxcblx0ICAgICAgICAgICAgICAgICAgICBzb3J0ZWRfa2V5cyA9IGtleXMuc29ydChmdW5jdGlvbihhLCBiKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhMSwgYTI7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgYSBhbmQgYiBhcmUgY29tcGFyYWJsZSwgd2UncmUgZmluZSA6LSlcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHZhbHVlW2FdID4gdmFsdWVbYl0pID09ICEodmFsdWVbYV0gPD0gdmFsdWVbYl0pKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbYV0gPiB2YWx1ZVtiXSA/IDEgOlxuXHRcdFx0XHQgICAgICAgICAgIHZhbHVlW2FdIDwgdmFsdWVbYl0gPyAtMSA6XG5cdFx0XHRcdFx0ICAgMDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBhIGFuZCBiIGNhbiBiZSBwYXJzZWQgYXMgbnVtYmVycywgd2UgY2FuIGNvbXBhcmVcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlaXIgbnVtZXJpYyB2YWx1ZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCFpc05hTihhMSA9IHBhcnNlRmxvYXQodmFsdWVbYV0pKSAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc05hTihiMSA9IHBhcnNlRmxvYXQodmFsdWVbYl0pKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGExID4gYjEgPyAxIDpcblx0XHRcdFx0ICAgICAgICAgICBhMSA8IGIxID8gLTEgOlxuXHRcdFx0XHRcdCAgIDA7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgb25lIG9mIHRoZSB2YWx1ZXMgaXMgYSBzdHJpbmcsIHdlIGNvbnZlcnQgdGhlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyIHZhbHVlIHRvIHN0cmluZyBhcyB3ZWxsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYodHlwZW9mIHZhbHVlW2FdID09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbYV0gPiB2YWx1ZVtiXS50b1N0cmluZygpID8gMSA6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVbYV0gPCB2YWx1ZVtiXS50b1N0cmluZygpID8gLTEgOlxuXHRcdFx0XHRcdCAgIDA7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZih0eXBlb2YgdmFsdWVbYl0gPT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVthXS50b1N0cmluZygpID4gdmFsdWVbYl0gPyAxIDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVthXS50b1N0cmluZygpIDwgdmFsdWVbYl0gPyAtMSA6XG5cdFx0XHRcdFx0ICAgMDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeXRoaW5nIGZhaWxlZCAtIHJldHVybiAnbnVsbCcgYXMgc2lnbiwgdGhhdFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdmFsdWVzIGFyZSBub3QgY29tcGFyYWJsZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZS5fa2V5cyA9IHNvcnRlZF9rZXlzO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBrZXlzOiBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCl7XG5cdCAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHZhciBrZXlzZXQgPSB2YWx1ZS5fa2V5cyB8fCBPYmplY3Qua2V5cyh2YWx1ZSksXG5cdCAgICAgICAgICAgICAgICBvdXRwdXQgPSBbXTtcblxuXHQgICAgICAgICAgICBUd2lnLmZvckVhY2goa2V5c2V0LCBmdW5jdGlvbihrZXkpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IFwiX2tleXNcIikgcmV0dXJuOyAvLyBJZ25vcmUgdGhlIF9rZXlzIHByb3BlcnR5XG5cdCAgICAgICAgICAgICAgICBpZiAodmFsdWUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHQgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGtleSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgdXJsX2VuY29kZTogZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpe1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG5cdCAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKFwiJ1wiLCBcIiUyN1wiKTtcblx0ICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGpvaW46IGZ1bmN0aW9uKHZhbHVlLCBwYXJhbXMpIHtcblx0ICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpe1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgdmFyIGpvaW5fc3RyID0gXCJcIixcblx0ICAgICAgICAgICAgICAgIG91dHB1dCA9IFtdLFxuXHQgICAgICAgICAgICAgICAga2V5c2V0ID0gbnVsbDtcblxuXHQgICAgICAgICAgICBpZiAocGFyYW1zICYmIHBhcmFtc1swXSkge1xuXHQgICAgICAgICAgICAgICAgam9pbl9zdHIgPSBwYXJhbXNbMF07XG5cdCAgICAgICAgICAgI
46184H1cblx0ICAgICAgICAgICAgaWYgKGlzKFwiQXJyYXlcIiwgdmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICBvdXRwdXQgPSB2YWx1ZTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGtleXNldCA9IHZhbHVlLl9rZXlzIHx8IE9iamVjdC5rZXlzKHZhbHVlKTtcblx0ICAgICAgICAgICAgICAgIFR3aWcuZm9yRWFjaChrZXlzZXQsIGZ1bmN0aW9uKGtleSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IFwiX2tleXNcIikgcmV0dXJuOyAvLyBJZ25vcmUgdGhlIF9rZXlzIHByb3BlcnR5XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godmFsdWVba2V5XSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIG91dHB1dC5qb2luKGpvaW5fc3RyKTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIFwiZGVmYXVsdFwiOiBmdW5jdGlvbih2YWx1ZSwgcGFyYW1zKSB7XG5cdCAgICAgICAgICAgIGlmIChwYXJhbXMgIT09IHVuZGVmaW5lZCAmJiBwYXJhbXMubGVuZ3RoID4gMSkge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJkZWZhdWx0IGZpbHRlciBleHBlY3RzIG9uZSBhcmd1bWVudFwiKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycgKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbXNbMF07XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIGpzb25fZW5jb2RlOiBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICBpZih2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gXCJudWxsXCI7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoKHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JykgJiYgKGlzKFwiQXJyYXlcIiwgdmFsdWUpKSkge1xuXHQgICAgICAgICAgICAgICAgb3V0cHV0ID0gW107XG5cblx0ICAgICAgICAgICAgICAgIFR3aWcuZm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24odikge1xuXHQgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKFR3aWcuZmlsdGVycy5qc29uX2VuY29kZSh2KSk7XG5cdCAgICAgICAgICAgICAgICB9KTtcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFwiW1wiICsgb3V0cHV0LmpvaW4oXCIsXCIpICsgXCJdXCI7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09ICdvYmplY3QnKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIga2V5c2V0ID0gdmFsdWUuX2tleXMgfHwgT2JqZWN0LmtleXModmFsdWUpLFxuXHQgICAgICAgICAgICAgICAgb3V0cHV0ID0gW107XG5cblx0ICAgICAgICAgICAgICAgIFR3aWcuZm9yRWFjaChrZXlzZXQsIGZ1bmN0aW9uKGtleSkge1xuXHQgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKEpTT04uc3RyaW5naWZ5KGtleSkgKyBcIjpcIiArIFR3aWcuZmlsdGVycy5qc29uX2VuY29kZSh2YWx1ZVtrZXldKSk7XG5cdCAgICAgICAgICAgICAgICB9KTtcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFwie1wiICsgb3V0cHV0LmpvaW4oXCIsXCIpICsgXCJ9XCI7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBtZXJnZTogZnVuY3Rpb24odmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgICAgICB2YXIgb2JqID0gW10sXG5cdCAgICAgICAgICAgICAgICBhcnJfaW5kZXggPSAwLFxuXHQgICAgICAgICAgICAgICAga2V5c2V0ID0gW107XG5cblx0ICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGFsbCB0aGUgb2JqZWN0cyBiZWluZyBtZXJnZWQgYXJlIGFycmF5c1xuXHQgICAgICAgICAgICBpZiAoIWlzKFwiQXJyYXlcIiwgdmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBDcmVhdGUgb2JqIGFzIGFuIE9iamVjdFxuXHQgICAgICAgICAgICAgICAgb2JqID0geyB9O1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgVHdpZy5mb3JFYWNoKHBhcmFtcywgZnVuY3Rpb24ocGFyYW0pIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIWlzKFwiQXJyYXlcIiwgcGFyYW0pKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IHsgfTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoIWlzKFwiQXJyYXlcIiwgb2JqKSkge1xuXHQgICAgICAgICAgICAgICAgb2JqLl9rZXlzID0gW107XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBpZiAoaXMoXCJBcnJheVwiLCB2YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgIFR3aWcuZm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24odmFsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5fa2V5cykgb2JqLl9rZXlzLnB1c2goYXJyX2luZGV4KTtcblx0ICAgICAgICAgICAgICAgICAgICBvYmpbYXJyX2luZGV4XSA9IHZhbDtcblx0ICAgICAgICAgICAgICAgICAgICBhcnJfaW5kZXgrKztcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAga2V5c2V0ID0gdmFsdWUuX2tleXMgfHwgT2JqZWN0LmtleXModmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgVHdpZy5mb3JFYWNoKGtleXNldCwgZnVuY3Rpb24oa2V5KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZVtrZXldO1xuXHQgICAgICAgICAgICAgICAgICAgIG9iai5fa2V5cy5wdXNoKGtleSk7XG5cblx0ICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgZWRnZSBjYXNlIHdoZXJlIGEgbnVtYmVyIGluZGV4IGluIGFuIG9iamVjdCBpcyBncmVhdGVyIHRoYW5cblx0ICAgICAgICAgICAgICAgICAgICAvLyAgIHRoZSBhcnJheSBjb3VudGVyLiBJbiBzdWNoIGEgY2FzZSwgdGhlIGFycmF5IGNvdW50ZXIgaXMgaW5jcmVhc2VkXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gICBvbmUgcGFzdCB0aGUgaW5kZXguXG5cdCAgICAgICAgICAgICAgICAgICAgLy9cblx0ICAgICAgICAgICAgICAgICAgICAvLyBFeGFtcGxlIHt7IFtcImFcIiwgXCJiXCJdfG1lcmdlKHtcIjRcIjpcInZhbHVlXCJ9LCBbXCJjXCIsIFwiZFwiXSlcblx0ICAgICAgICAgICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMsIGQgd291bGQgaGF2ZSBhbiBpbmRleCBvZiBcIjRcIiBhbmQgb3ZlcndyaXRlIHRoZSB2YWx1ZVxuXHQgICAgICAgICAgICAgICAgICAgIC8vICAgb2YgXCJ2YWx1ZVwiXG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGludF9rZXkgPSBwYXJzZUludChrZXksIDEwKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGludF9rZXkpICYmIGludF9rZXkgPj0gYXJyX2luZGV4KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGFycl9pbmRleCA9IGludF9rZXkgKyAxO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gbWl4aW4gdGhlIG1lcmdlIGFycmF5c1xuXHQgICAgICAgICAgICBUd2lnLmZvckVhY2gocGFyYW1zLCBmdW5jdGlvbihwYXJhbSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKGlzKFwiQXJyYXlcIiwgcGFyYW0pKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgVHdpZy5mb3JFYWNoKHBhcmFtLCBmdW5jdGlvbih2YWwpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5fa2V5cykgb2JqLl9rZXlzLnB1c2goYXJyX2luZGV4KTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb2JqW2Fycl9pbmRleF0gPSB2YWw7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGFycl9pbmRleCsrO1xuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBrZXlzZXQgPSBwYXJhbS5fa2V5cyB8fCBPYmplY3Qua2V5cyhwYXJhbSk7XG5cdCAgICAgICAgICAgICAgICAgICAgVHdpZy5mb3JFYWNoKGtleXNldCwgZnVuY3Rpb24oa2V5KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2JqW2tleV0pIG9iai5fa2V5cy5wdXNoKGtleSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG9ialtrZXldID0gcGFyYW1ba2V5XTtcblxuXHQgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIgaW50X2tleSA9IHBhcnNlSW50KGtleSwgMTApO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGludF9rZXkpICYmIGludF9rZXkgPj0gYXJyX2luZGV4KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJfaW5kZXggPSBpbnRfa2V5ICsgMTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwiRmlsdGVyIG1lcmdlIGV4cGVjdHMgYXQgbGVhc3Qgb25lIHBhcmFtZXRlclwiKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBvYmo7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBkYXRlOiBmdW5jdGlvbih2YWx1ZSwgcGFyYW1zKSB7XG5cdCAgICAgICAgICAgIHZhciBkYXRlID0gVHdpZy5mdW5jdGlvbnMuZGF0ZSh2YWx1ZSk7XG5cdCAgICAgICAgICAgIHZhciBmb3JtYXQgPSBwYXJhbXMgJiYgcGFyYW1zLmxlbmd0aCA/IHBhcmFtc1swXSA6ICdGIGosIFkgSDppJztcblx0ICAgICAgICAgICAgcmV0dXJuIFR3aWcubGliLmRhdGUoZm9ybWF0LCBkYXRlKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgZGF0ZV9tb2RpZnk6IGZ1bmN0aW9uKHZhbHVlLCBwYXJhbXMpIHtcblx0ICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zLmxlbmd0aCAhPT0gMSkge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJkYXRlX21vZGlmeSBmaWx0ZXIgZXhwZWN0cyAxIGFyZ3VtZW50XCIpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgdmFyIG1vZGlmeVRleHQgPSBwYXJhbXNbMF0sIHRpbWU7XG5cblx0ICAgICAgICAgICAgaWYgKFR3aWcubGliLmlzKFwiRGF0ZVwiLCB2YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgIHRpbWUgPSBUd2lnLmxpYi5zdHJ0b3RpbWUobW9kaWZ5VGV4dCwgdmFsdWUuZ2V0VGltZSgpIC8gMTAwMCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKFR3aWcubGliLmlzKFwiU3RyaW5nXCIsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgdGltZSA9IFR3aWcubGliLnN0cnRvdGltZShtb2RpZnlUZXh0LCBUd2lnLmxpYi5zdHJ0b3RpbWUodmFsdWUpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoVHdpZy5saWIuaXMoXCJOdW1iZXJcIiwgdmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICB0aW1lID0gVHdpZy5saWIuc3RydG90aW1lKG1vZGlmeVRleHQsIHZhbHVlKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aW1lICogMTAwMCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIHJlcGxhY2U6IGZ1bmN0aW9uKHZhbHVlLCBwYXJhbXMpIHtcblx0ICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWR8fHZhbHVlID09PSBudWxsKXtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHZhciBwYWlycyA9IHBhcmFtc1swXSxcblx0ICAgICAgICAgICAgICAgIHRhZztcblx0ICAgICAgICAgICAgZm9yICh0YWcgaW4gcGFpcnMpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChwYWlycy5oYXNPd25Qcm9wZXJ0eSh0YWcpICYmIHRhZyAhPT0gXCJfa2V5c1wiKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBUd2lnLmxpYi5yZXBsYWNlQWxsKHZhbHVlLCB0YWcsIHBhaXJzW3RhZ10pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgZm9ybWF0OiBmdW5jdGlvbih2YWx1ZSwgcGFyYW1zKSB7XG5cdCAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKXtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBUd2lnLmxpYi52c3ByaW50Zih2YWx1ZSwgcGFyYW1zKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgc3RyaXB0YWdzOiBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCl7XG5cdCAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gVHdpZy5saWIuc3RyaXBfdGFncyh2YWx1ZSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGVzY2FwZTogZnVuY3Rpb24odmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZHx8IHZhbHVlID09PSBudWxsKXtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHZhciBzdHJhdGVneSA9IFwiaHRtbFwiO1xuXHQgICAgICAgICAgICBpZihwYXJhbXMgJiYgcGFyYW1zLmxlbmd0aCAmJiBwYXJhbXNbMF0gIT09IHRydWUpXG5cdCAgICAgICAgICAgICAgICBzdHJhdGVneSA9IHBhcmFtc1swXTtcblxuXHQgICAgICAgICAgICBpZihzdHJhdGVneSA9PSBcImh0bWxcIikge1xuXHQgICAgICAgICAgICAgICAgdmFyIHJhd192YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvPC9nLCBcIiZsdDtcIilcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1wiL2csIFwiJnF1b3Q7XCIpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIiYjMDM5O1wiKTtcblx0ICAgICAgICAgICAgICAgI
46184HJldHVybiBUd2lnLk1hcmt1cChyYXdfdmFsdWUsICdodG1sJyk7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZihzdHJhdGVneSA9PSBcImpzXCIpIHtcblx0ICAgICAgICAgICAgICAgIHZhciByYXdfdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG5cblx0ICAgICAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCByYXdfdmFsdWUubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZihyYXdfdmFsdWVbaV0ubWF0Y2goL15bYS16QS1aMC05LFxcLl9dJC8pKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gcmF3X3ZhbHVlW2ldO1xuXHQgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hhcl9jb2RlID0gcmF3X3ZhbHVlLmNoYXJDb2RlQXQoaSk7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2hhcl9jb2RlIDwgMHg4MClcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIlxcXFx4XCIgKyBjaGFyX2NvZGUudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Vcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBUd2lnLmxpYi5zcHJpbnRmKFwiXFxcXHUlMDRzXCIsIGNoYXJfY29kZS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5NYXJrdXAocmVzdWx0LCAnanMnKTtcblx0ICAgICAgICAgICAgfSBlbHNlIGlmKHN0cmF0ZWd5ID09IFwiY3NzXCIpIHtcblx0ICAgICAgICAgICAgICAgIHZhciByYXdfdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG5cblx0ICAgICAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCByYXdfdmFsdWUubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZihyYXdfdmFsdWVbaV0ubWF0Y2goL15bYS16QS1aMC05XSQvKSlcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHJhd192YWx1ZVtpXTtcblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoYXJfY29kZSA9IHJhd192YWx1ZS5jaGFyQ29kZUF0KGkpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCJcXFxcXCIgKyBjaGFyX2NvZGUudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkgKyBcIiBcIjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLk1hcmt1cChyZXN1bHQsICdjc3MnKTtcblx0ICAgICAgICAgICAgfSBlbHNlIGlmKHN0cmF0ZWd5ID09IFwidXJsXCIpIHtcblx0ICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBUd2lnLmZpbHRlcnMudXJsX2VuY29kZSh2YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5NYXJrdXAocmVzdWx0LCAndXJsJyk7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZihzdHJhdGVneSA9PSBcImh0bWxfYXR0clwiKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgcmF3X3ZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcblx0ICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBcIlwiO1xuXG5cdCAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgcmF3X3ZhbHVlLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYocmF3X3ZhbHVlW2ldLm1hdGNoKC9eW2EtekEtWjAtOSxcXC5cXC1fXSQvKSlcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHJhd192YWx1ZVtpXTtcblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHJhd192YWx1ZVtpXS5tYXRjaCgvXlsmPD5cIl0kLykpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSByYXdfdmFsdWVbaV0ucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLz4vZywgXCImZ3Q7XCIpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1wiL2csIFwiJnF1b3Q7XCIpO1xuXHQgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hhcl9jb2RlID0gcmF3X3ZhbHVlLmNoYXJDb2RlQXQoaSk7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyByZXBsYWNlcyBjaGFyYWN0ZXJzIHVuZGVmaW5lZCBpbiBIVE1MIHdpdGhcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGhleCBlbnRpdHkgZm9yIHRoZSBVbmljb2RlIHJlcGxhY2VtZW50IGNoYXJhY3Rlci5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2hhcl9jb2RlIDw9IDB4MWYgJiYgY2hhcl9jb2RlICE9IDB4MDkgJiYgY2hhcl9jb2RlICE9IDB4MGEgJiYgY2hhcl9jb2RlICE9IDB4MGQpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCImI3hGRkZEO1wiO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGNoYXJfY29kZSA8IDB4ODApXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gVHdpZy5saWIuc3ByaW50ZihcIiYjeCUwMnM7XCIsIGNoYXJfY29kZS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Vcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBUd2lnLmxpYi5zcHJpbnRmKFwiJiN4JTA0cztcIiwgY2hhcl9jb2RlLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLk1hcmt1cChyZXN1bHQsICdodG1sX2F0dHInKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwiZXNjYXBlIHN0cmF0ZWd5IHVuc3VwcG9ydGVkXCIpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qIEFsaWFzIG9mIGVzY2FwZSAqL1xuXHQgICAgICAgIFwiZVwiOiBmdW5jdGlvbih2YWx1ZSwgcGFyYW1zKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBUd2lnLmZpbHRlcnMuZXNjYXBlKHZhbHVlLCBwYXJhbXMpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBubDJicjogZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpe1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHZhciBsaW5lYnJlYWtfdGFnID0gXCJCQUNLU0xBU0hfbl9yZXBsYWNlXCIsXG5cdCAgICAgICAgICAgICAgICBiciA9IFwiPGJyIC8+XCIgKyBsaW5lYnJlYWtfdGFnO1xuXG5cdCAgICAgICAgICAgIHZhbHVlID0gVHdpZy5maWx0ZXJzLmVzY2FwZSh2YWx1ZSlcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcclxcbi9nLCBicilcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcci9nLCBicilcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCBicik7XG5cblx0ICAgICAgICAgICAgdmFsdWUgPSBUd2lnLmxpYi5yZXBsYWNlQWxsKHZhbHVlLCBsaW5lYnJlYWtfdGFnLCBcIlxcblwiKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gVHdpZy5NYXJrdXAodmFsdWUpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBBZGFwdGVkIGZyb206IGh0dHA6Ly9waHBqcy5vcmcvZnVuY3Rpb25zL251bWJlcl9mb3JtYXQ6NDgxXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgbnVtYmVyX2Zvcm1hdDogZnVuY3Rpb24odmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgICAgICB2Y
46184XIgbnVtYmVyID0gdmFsdWUsXG5cdCAgICAgICAgICAgICAgICBkZWNpbWFscyA9IChwYXJhbXMgJiYgcGFyYW1zWzBdKSA/IHBhcmFtc1swXSA6IHVuZGVmaW5lZCxcblx0ICAgICAgICAgICAgICAgIGRlYyAgICAgID0gKHBhcmFtcyAmJiBwYXJhbXNbMV0gIT09IHVuZGVmaW5lZCkgPyBwYXJhbXNbMV0gOiBcIi5cIixcblx0ICAgICAgICAgICAgICAgIHNlcCAgICAgID0gKHBhcmFtcyAmJiBwYXJhbXNbMl0gIT09IHVuZGVmaW5lZCkgPyBwYXJhbXNbMl0gOiBcIixcIjtcblxuXHQgICAgICAgICAgICBudW1iZXIgPSAobnVtYmVyICsgJycpLnJlcGxhY2UoL1teMC05K1xcLUVlLl0vZywgJycpO1xuXHQgICAgICAgICAgICB2YXIgbiA9ICFpc0Zpbml0ZSgrbnVtYmVyKSA/IDAgOiArbnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgcHJlYyA9ICFpc0Zpbml0ZSgrZGVjaW1hbHMpID8gMCA6IE1hdGguYWJzKGRlY2ltYWxzKSxcblx0ICAgICAgICAgICAgICAgIHMgPSAnJyxcblx0ICAgICAgICAgICAgICAgIHRvRml4ZWRGaXggPSBmdW5jdGlvbiAobiwgcHJlYykge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBrID0gTWF0aC5wb3coMTAsIHByZWMpO1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJyArIE1hdGgucm91bmQobiAqIGspIC8gaztcblx0ICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIC8vIEZpeCBmb3IgSUUgcGFyc2VGbG9hdCgwLjU1KS50b0ZpeGVkKDApID0gMDtcblx0ICAgICAgICAgICAgcyA9IChwcmVjID8gdG9GaXhlZEZpeChuLCBwcmVjKSA6ICcnICsgTWF0aC5yb3VuZChuKSkuc3BsaXQoJy4nKTtcblx0ICAgICAgICAgICAgaWYgKHNbMF0ubGVuZ3RoID4gMykge1xuXHQgICAgICAgICAgICAgICAgc1swXSA9IHNbMF0ucmVwbGFjZSgvXFxCKD89KD86XFxkezN9KSsoPyFcXGQpKS9nLCBzZXApO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICgoc1sxXSB8fCAnJykubGVuZ3RoIDwgcHJlYykge1xuXHQgICAgICAgICAgICAgICAgc1sxXSA9IHNbMV0gfHwgJyc7XG5cdCAgICAgICAgICAgICAgICBzWzFdICs9IG5ldyBBcnJheShwcmVjIC0gc1sxXS5sZW5ndGggKyAxKS5qb2luKCcwJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIHMuam9pbihkZWMpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICB0cmltOiBmdW5jdGlvbih2YWx1ZSwgcGFyYW1zKSB7XG5cdCAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkfHwgdmFsdWUgPT09IG51bGwpe1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgdmFyIHN0ciA9IFR3aWcuZmlsdGVycy5lc2NhcGUoICcnICsgdmFsdWUgKSxcblx0ICAgICAgICAgICAgICAgIHdoaXRlc3BhY2U7XG5cdCAgICAgICAgICAgIGlmICggcGFyYW1zICYmIHBhcmFtc1swXSApIHtcblx0ICAgICAgICAgICAgICAgIHdoaXRlc3BhY2UgPSAnJyArIHBhcmFtc1swXTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHdoaXRlc3BhY2UgPSAnIFxcblxcclxcdFxcZlxceDBiXFx4YTBcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwYVxcdTIwMGJcXHUyMDI4XFx1MjAyOVxcdTMwMDAnO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAod2hpdGVzcGFjZS5pbmRleE9mKHN0ci5jaGFyQXQoaSkpID09PSAtMSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoaSk7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZm9yIChpID0gc3RyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAod2hpdGVzcGFjZS5pbmRleE9mKHN0ci5jaGFyQXQoaSkpID09PSAtMSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgaSArIDEpO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiB3aGl0ZXNwYWNlLmluZGV4T2Yoc3RyLmNoYXJBdCgwKSkgPT09IC0xID8gc3RyIDogJyc7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIHRydW5jYXRlOiBmdW5jdGlvbiAodmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgICAgICB2Y
46184XIgbGVuZ3RoID0gMzAsXG5cdCAgICAgICAgICAgICAgICBwcmVzZXJ2ZSA9IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgc2VwYXJhdG9yID0gJy4uLic7XG5cblx0ICAgICAgICAgICAgdmFsdWUgPSAgdmFsdWUgKyAnJztcblx0ICAgICAgICAgICAgaWYgKHBhcmFtcykge1xuXHQgICAgICAgICAgICAgICAgaWYgKHBhcmFtc1swXSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHBhcmFtc1swXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbMV0pIHtcblx0ICAgICAgICAgICAgICAgICAgICBwcmVzZXJ2ZSA9IHBhcmFtc1sxXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbMl0pIHtcblx0ICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IgPSBwYXJhbXNbMl07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gbGVuZ3RoKSB7XG5cblx0ICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHZhbHVlLmluZGV4T2YoJyAnLCBsZW5ndGgpO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPT09IC0xKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIHZhbHVlID0gIHZhbHVlLnN1YnN0cigwLCBsZW5ndGgpICsgc2VwYXJhdG9yO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBzbGljZTogZnVuY3Rpb24odmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChwYXJhbXMgPT09IHVuZGVmaW5lZCB8fCBwYXJhbXMubGVuZ3RoIDwgMSkge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJzbGljZSBmaWx0ZXIgZXhwZWN0cyBhdCBsZWFzdCAxIGFyZ3VtZW50XCIpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBzdGFydCBvZiBzdHJpbmdcblx0ICAgICAgICAgICAgdmFyIHN0YXJ0ID0gcGFyYW1zWzBdIHx8IDA7XG5cdCAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gbGVuZ3RoIG9mIHN0cmluZ1xuXHQgICAgICAgICAgICB2Y
46184XIgbGVuZ3RoID0gcGFyYW1zLmxlbmd0aCA+IDEgPyBwYXJhbXNbMV0gOiB2YWx1ZS5sZW5ndGg7XG5cdCAgICAgICAgICAgIC8vIGhhbmRsZSBuZWdhdGl2ZSBzdGFydCB2YWx1ZXNcblx0ICAgICAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSBzdGFydCA+PSAwID8gc3RhcnQgOiBNYXRoLm1heCggdmFsdWUubGVuZ3RoICsgc3RhcnQsIDAgKTtcblxuXHQgICAgICAgICAgICBpZiAoVHdpZy5saWIuaXMoXCJBcnJheVwiLCB2YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBvdXRwdXQgPSBbXTtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDwgc3RhcnRJbmRleCArIGxlbmd0aCAmJiBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh2YWx1ZVtpXSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKFR3aWcubGliLmlzKFwiU3RyaW5nXCIsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cihzdGFydEluZGV4LCBsZW5ndGgpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJzbGljZSBmaWx0ZXIgZXhwZWN0cyB2YWx1ZSB0byBiZSBhbiBhcnJheSBvciBzdHJpbmdcIik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgYWJzOiBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKHZhbHVlKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgZmlyc3Q6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdCAgICAgICAgICAgIGlmIChpcyhcIkFycmF5XCIsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlWzBdO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKGlzKFwiT2JqZWN0XCIsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKCdfa2V5cycgaW4gdmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbdmFsdWUuX2tleXNbMF1dO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuc3Vic3RyKDAsIDEpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBzcGxpdDogZnVuY3Rpb24odmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChwYXJhbXMgPT09IHVuZGVmaW5lZCB8fCBwYXJhbXMubGVuZ3RoIDwgMSB8fCBwYXJhbXMubGVuZ3RoID4gMikge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJzcGxpdCBmaWx0ZXIgZXhwZWN0cyAxIG9yIDIgYXJndW1lbnRcIik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKFR3aWcubGliLmlzKFwiU3RyaW5nXCIsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGRlbGltaXRlciA9IHBhcmFtc1swXSxcblx0ICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHBhcmFtc1sxXSxcblx0ICAgICAgICAgICAgICAgICAgICBzcGxpdCA9IHZhbHVlLnNwbGl0KGRlbGltaXRlcik7XG5cblx0ICAgICAgICAgICAgICAgIGlmIChsaW1pdCA9PT0gdW5kZWZpbmVkKSB7XG5cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3BsaXQ7XG5cblx0ICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGltaXQgPCAwKSB7XG5cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuc3BsaXQoZGVsaW1pdGVyLCBzcGxpdC5sZW5ndGggKyBsaW1pdCk7XG5cblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cblx0ICAgICAgICAgICAgICAgICAgICB2Y
46184XIgbGltaXRlZFNwbGl0ID0gW107XG5cblx0ICAgICAgICAgICAgICAgICAgICBpZiAoZGVsaW1pdGVyID09ICcnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5IGRlbGltaXRlclxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBcImFhYmJjY1wifHNwbGl0KCcnLCAyKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgLT4gWydhYScsICdiYicsICdjYyddXG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoc3BsaXQubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXAgPSBcIlwiO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPGxpbWl0ICYmIHNwbGl0Lmxlbmd0aCA+IDA7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgKz0gc3BsaXQuc2hpZnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ZWRTcGxpdC5wdXNoKHRlbXApO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tZW1wdHkgZGVsaW1pdGVyXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFwib25lLHR3byx0aHJlZSxmb3VyLGZpdmVcInxzcGxpdCgnLCcsIDMpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAtPiBbJ29uZScsICd0d28nLCAndGhyZWUsZm91cixmaXZlJ11cblxuXHQgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8bGltaXQtMSAmJiBzcGxpdC5sZW5ndGggPiAwOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ZWRTcGxpdC5wdXNoKHNwbGl0LnNoaWZ0KCkpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ZWRTcGxpdC5wdXNoKHNwbGl0LmpvaW4oZGVsaW1pdGVyKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRlZFNwbGl0O1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcihcInNwbGl0IGZpbHRlciBleHBlY3RzIHZhbHVlIHRvIGJlIGEgc3RyaW5nXCIpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBsYXN0OiBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICBpZiAoVHdpZy5saWIuaXMoJ09iamVjdCcsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGtleXM7XG5cblx0ICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5fa2V5cyA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAga2V5cyA9IHZhbHVlLl9rZXlzO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVba2V5c1trZXlzLmxlbmd0aCAtIDFdXTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIHN0cmluZ3xhcnJheVxuXHQgICAgICAgICAgICByZXR1cm4gdmFsdWVbdmFsdWUubGVuZ3RoIC0gMV07XG5cdCAgICAgICAgfSxcblx0ICAgICAgICByYXc6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBUd2lnLk1hcmt1cCh2YWx1ZSk7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBiYXRjaDogZnVuY3Rpb24oaXRlbXMsIHBhcmFtcykge1xuXHQgICAgICAgICAgICB2Y
46184XIgc2l6ZSA9IHBhcmFtcy5zaGlmdCgpLFxuXHQgICAgICAgICAgICAgICAgZmlsbCA9IHBhcmFtcy5zaGlmdCgpLFxuXHQgICAgICAgICAgICAgICAgcmVzdWx0LFxuXHQgICAgICAgICAgICAgICAgbGFzdCxcblx0ICAgICAgICAgICAgICAgIG1pc3Npbmc7XG5cblx0ICAgICAgICAgICAgaWYgKCFUd2lnLmxpYi5pcyhcIkFycmF5XCIsIGl0ZW1zKSkge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJiYXRjaCBmaWx0ZXIgZXhwZWN0cyBpdGVtcyB0byBiZSBhbiBhcnJheVwiKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIGlmICghVHdpZy5saWIuaXMoXCJOdW1iZXJcIiwgc2l6ZSkpIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwiYmF0Y2ggZmlsdGVyIGV4cGVjdHMgc2l6ZSB0byBiZSBhIG51bWJlclwiKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHNpemUgPSBNYXRoLmNlaWwoc2l6ZSk7XG5cblx0ICAgICAgICAgICAgcmVzdWx0ID0gVHdpZy5saWIuY2h1bmtBcnJheShpdGVtcywgc2l6ZSk7XG5cblx0ICAgICAgICAgICAgaWYgKGZpbGwgJiYgaXRlbXMubGVuZ3RoICUgc2l6ZSAhPSAwKSB7XG5cdCAgICAgICAgICAgICAgICBsYXN0ID0gcmVzdWx0LnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgbWlzc2luZyA9IHNpemUgLSBsYXN0Lmxlbmd0aDtcblxuXHQgICAgICAgICAgICAgICAgd2hpbGUgKG1pc3NpbmctLSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGxhc3QucHVzaChmaWxsKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobGFzdCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgcm91bmQ6IGZ1bmN0aW9uKHZhbHVlLCBwYXJhbXMpIHtcblx0ICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IFtdO1xuXG5cdCAgICAgICAgICAgIHZhciBwcmVjaXNpb24gPSBwYXJhbXMubGVuZ3RoID4gMCA/IHBhcmFtc1swXSA6IDAsXG5cdCAgICAgICAgICAgICAgICBtZXRob2QgPSBwYXJhbXMubGVuZ3RoID4gMSA/IHBhcmFtc1sxXSA6IFwiY29tbW9uXCI7XG5cblx0ICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcblxuXHQgICAgICAgICAgICBpZihwcmVjaXNpb24gJiYgIVR3aWcubGliLmlzKFwiTnVtYmVyXCIsIHByZWNpc2lvbikpIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwicm91bmQgZmlsdGVyIGV4cGVjdHMgcHJlY2lzaW9uIHRvIGJlIGEgbnVtYmVyXCIpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJjb21tb25cIikge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcubGliLnJvdW5kKHZhbHVlLCBwcmVjaXNpb24pO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgaWYoIVR3aWcubGliLmlzKFwiRnVuY3Rpb25cIiwgTWF0aFttZXRob2RdKSkge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJyb3VuZCBmaWx0ZXIgZXhwZWN0cyBtZXRob2QgdG8gYmUgJ2Zsb29yJywgJ2NlaWwnLCBvciAnY29tbW9uJ1wiKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBNYXRoW21ldGhvZF0odmFsdWUgKiBNYXRoLnBvdygxMCwgcHJlY2lzaW9uKSkgLyBNYXRoLnBvdygxMCwgcHJlY2lzaW9uKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICBUd2lnLmZpbHRlciA9IGZ1bmN0aW9uKGZpbHRlciwgdmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgIGlmICghVHdpZy5maWx0ZXJzW2ZpbHRlcl0pIHtcblx0ICAgICAgICAgICAgdGhyb3cgXCJVbmFibGUgdG8gZmluZCBmaWx0ZXIgXCIgKyBmaWx0ZXI7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBUd2lnLmZpbHRlcnNbZmlsdGVyXS5hcHBseSh0aGlzLCBbdmFsdWUsIHBhcmFtc10pO1xuXHQgICAgfTtcblxuXHQgICAgVHdpZy5maWx0ZXIuZXh0ZW5kID0gZnVuY3Rpb24oZmlsdGVyLCBkZWZpbml0aW9uKSB7XG5cdCAgICAgICAgVHdpZy5maWx0ZXJzW2ZpbHRlcl0gPSBkZWZpbml0aW9uO1xuXHQgICAgfTtcblxuXHQgICAgcmV0dXJuIFR3aWc7XG5cblx0fTtcblxuXG4vKioqLyB9LFxuLyogNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Ly8gIyMgdHdpZy5mdW5jdGlvbnMuanNcblx0Ly9cblx0Ly8gVGhpcyBmaWxlIGhhbmRsZXMgcGFyc2luZyBmaWx0ZXJzLlxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUd2lnKSB7XG5cdCAgICAvKipcblx0ICAgICAqIEBjb25zdGFudFxuXHQgICAgICogQHR5cGUge3N0cmluZ31cblx0ICAgICAqL1xuXHQgICAgdmFyIFRFTVBMQVRFX05PVF9GT1VORF9NRVNTQUdFID0gJ1RlbXBsYXRlIFwie25hbWV9XCIgaXMgbm90IGRlZmluZWQuJztcblxuXHQgICAgLy8gRGV0ZXJtaW5lIG9iamVjdCB0eXBlXG5cdCAgICBmdW5jdGlvbiBpcyh0eXBlLCBvYmopIHtcblx0ICAgICAgICB2Y
46184XIgY2xhcyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopLnNsaWNlKDgsIC0xKTtcblx0ICAgICAgICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsICYmIGNsYXMgPT09IHR5cGU7XG5cdCAgICB9XG5cblx0ICAgIFR3aWcuZnVuY3Rpb25zID0ge1xuXHQgICAgICAgIC8vICBhdHRyaWJ1dGUsIGJsb2NrLCBjb25zdGFudCwgZGF0ZSwgZHVtcCwgcGFyZW50LCByYW5kb20sLlxuXG5cdCAgICAgICAgLy8gUmFuZ2UgZnVuY3Rpb24gZnJvbSBodHRwOi8vcGhwanMub3JnL2Z1bmN0aW9ucy9yYW5nZTo0OTlcblx0ICAgICAgICAvLyBVc2VkIHVuZGVyIGFuIE1JVCBMaWNlbnNlXG5cdCAgICAgICAgcmFuZ2U6IGZ1bmN0aW9uIChsb3csIGhpZ2gsIHN0ZXApIHtcblx0ICAgICAgICAgICAgLy8gaHR0cDovL2tldmluLnZhbnpvbm5ldmVsZC5uZXRcblx0ICAgICAgICAgICAgLy8gKyAgIG9yaWdpbmFsIGJ5OiBXYWxkbyBNYWxxdWkgU2lsdmFcblx0ICAgICAgICAgICAgLy8gKiAgICAgZXhhbXBsZSAxOiByYW5nZSAoIDAsIDEyICk7XG5cdCAgICAgICAgICAgIC8vICogICAgIHJldHVybnMgMTogWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTJdXG5cdCAgICAgICAgICAgIC8vICogICAgIGV4YW1wbGUgMjogcmFuZ2UoIDAsIDEwMCwgMTAgKTtcblx0ICAgICAgICAgICAgLy8gKiAgICAgcmV0dXJucyAyOiBbMCwgMTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDgwLCA5MCwgMTAwXVxuXHQgICAgICAgICAgICAvLyAqICAgICBleGFtcGxlIDM6IHJhbmdlKCAnYScsICdpJyApO1xuXHQgICAgICAgICAgICAvLyAqICAgICByZXR1cm5zIDM6IFsnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knXVxuXHQgICAgICAgICAgICAvLyAqICAgICBleGFtcGxlIDQ6IHJhbmdlKCAnYycsICdhJyApO1xuXHQgICAgICAgICAgICAvLyAqICAgICByZXR1cm5zIDQ6IFsnYycsICdiJywgJ2EnXVxuXHQgICAgICAgICAgICB2Y
46184XIgbWF0cml4ID0gW107XG5cdCAgICAgICAgICAgIHZhciBpbml2YWwsIGVuZHZhbCwgcGx1cztcblx0ICAgICAgICAgICAgdmFyIHdhbGtlciA9IHN0ZXAgfHwgMTtcblx0ICAgICAgICAgICAgdmFyIGNoYXJzID0gZmFsc2U7XG5cblx0ICAgICAgICAgICAgaWYgKCFpc05hTihsb3cpICYmICFpc05hTihoaWdoKSkge1xuXHQgICAgICAgICAgICAgICAgaW5pdmFsID0gcGFyc2VJbnQobG93LCAxMCk7XG5cdCAgICAgICAgICAgICAgICBlbmR2YWwgPSBwYXJzZUludChoaWdoLCAxMCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOYU4obG93KSAmJiBpc05hTihoaWdoKSkge1xuXHQgICAgICAgICAgICAgICAgY2hhcnMgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgaW5pdmFsID0gbG93LmNoYXJDb2RlQXQoMCk7XG5cdCAgICAgICAgICAgICAgICBlbmR2YWwgPSBoaWdoLmNoYXJDb2RlQXQoMCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBpbml2YWwgPSAoaXNOYU4obG93KSA/IDAgOiBsb3cpO1xuXHQgICAgICAgICAgICAgICAgZW5kdmFsID0gKGlzTmFOKGhpZ2gpID8gMCA6IGhpZ2gpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcGx1cyA9ICgoaW5pdmFsID4gZW5kdmFsKSA/IGZhbHNlIDogdHJ1ZSk7XG5cdCAgICAgICAgICAgIGlmIChwbHVzKSB7XG5cdCAgICAgICAgICAgICAgICB3aGlsZSAoaW5pdmFsIDw9IGVuZHZhbCkge1xuXHQgICAgICAgICAgICAgICAgICAgIG1hdHJpeC5wdXNoKCgoY2hhcnMpID8gU3RyaW5nLmZyb21DaGFyQ29kZShpbml2YWwpIDogaW5pdmFsKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdmFsICs9IHdhbGtlcjtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHdoaWxlIChpbml2YWwgPj0gZW5kdmFsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbWF0cml4LnB1c2goKChjaGFycykgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGluaXZhbCkgOiBpbml2YWwpKTtcblx0ICAgICAgICAgICAgICAgICAgICBpbml2YWwgLT0gd2Fsa2VyO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIG1hdHJpeDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGN5Y2xlOiBmdW5jdGlvbihhcnIsIGkpIHtcblx0ICAgICAgICAgICAgdmFyIHBvcyA9IGkgJSBhcnIubGVuZ3RoO1xuXHQgICAgICAgICAgICByZXR1cm4gYXJyW3Bvc107XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBkdW1wOiBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgdmFyIEVPTCA9ICdcXG4nLFxuXHQgICAgICAgICAgICAgICAgaW5kZW50Q2hhciA9ICcgICcsXG5cdCAgICAgICAgICAgICAgICBpbmRlbnRUaW1lcyA9IDAsXG5cdCAgICAgICAgICAgICAgICBvdXQgPSAnJyxcblx0ICAgICAgICAgICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLFxuXHQgICAgICAgICAgICAgICAgaW5kZW50ID0gZnVuY3Rpb24odGltZXMpIHtcblx0ICAgICAgICAgICAgICAgICAgICB2Y
46184XIgaW5kICA9ICcnO1xuXHQgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0aW1lcyA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMtLTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaW5kICs9IGluZGVudENoYXI7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmQ7XG5cdCAgICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgICAgZGlzcGxheVZhciA9IGZ1bmN0aW9uKHZhcmlhYmxlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb3V0ICs9IGluZGVudChpbmRlbnRUaW1lcyk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YXJpYWJsZSkgPT09ICdvYmplY3QnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBWYXIodmFyaWFibGUpO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mKHZhcmlhYmxlKSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJ2Z1bmN0aW9uKCknICsgRU9MO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mKHZhcmlhYmxlKSA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICdzdHJpbmcoJyArIHZhcmlhYmxlLmxlbmd0aCArICcpIFwiJyArIHZhcmlhYmxlICsgJ1wiJyArIEVPTDtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZih2YXJpYWJsZSkgPT09ICdudW1iZXInKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnbnVtYmVyKCcgKyB2YXJpYWJsZSArICcpJyArIEVPTDtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZih2YXJpYWJsZSkgPT09ICdib29sZWFuJykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJ2Jvb2woJyArIHZhcmlhYmxlICsgJyknICsgRU9MO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICBkdW1wVmFyID0gZnVuY3Rpb24odmFyaWFibGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICB2Y
46184XIgaTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUgPT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICdOVUxMJyArIEVPTDtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICd1bmRlZmluZWQnICsgRU9MO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhcmlhYmxlID09PSAnb2JqZWN0Jykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gaW5kZW50KGluZGVudFRpbWVzKSArIHR5cGVvZih2YXJpYWJsZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudFRpbWVzKys7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnKCcgKyAoZnVuY3Rpb24ob2JqKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IDAsIGtleTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoa2V5IGluIG9iaikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKys7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpemU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0pKHZhcmlhYmxlKSArICcpIHsnICsgRU9MO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gdmFyaWFibGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSBpbmRlbnQoaW5kZW50VGltZXMpICsgJ1snICsgaSArICddPT4gJyArIEVPTDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlWYXIodmFyaWFibGVbaV0pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudFRpbWVzLS07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSBpbmRlbnQoaW5kZW50VGltZXMpICsgJ30nICsgRU9MO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlWYXIodmFyaWFibGUpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH07XG5cblx0ICAgICAgICAgICAgLy8gaGFuZGxlIG5vIGFyZ3VtZW50IGNhc2UgYnkgZHVtcGluZyB0aGUgZW50aXJlIHJlbmRlciBjb250ZXh0XG5cdCAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKSBhcmdzLnB1c2godGhpcy5jb250ZXh0KTtcblxuXHQgICAgICAgICAgICBUd2lnLmZvckVhY2goYXJncywgZnVuY3Rpb24odmFyaWFibGUpIHtcblx0ICAgICAgICAgICAgICAgIGR1bXBWYXIodmFyaWFibGUpO1xuXHQgICAgICAgICAgICB9KTtcblxuXHQgICAgICAgICAgICByZXR1cm4gb3V0O1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgZGF0ZTogZnVuY3Rpb24oZGF0ZSwgdGltZSkge1xuXHQgICAgICAgICAgICB2Y
46184XIgZGF0ZU9iajtcblx0ICAgICAgICAgICAgaWYgKGRhdGUgPT09IHVuZGVmaW5lZCB8fCBkYXRlID09PSBudWxsIHx8IGRhdGUgPT09IFwiXCIpIHtcblx0ICAgICAgICAgICAgICAgIGRhdGVPYmogPSBuZXcgRGF0ZSgpO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKFR3aWcubGliLmlzKFwiRGF0ZVwiLCBkYXRlKSkge1xuXHQgICAgICAgICAgICAgICAgZGF0ZU9iaiA9IGRhdGU7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAoVHdpZy5saWIuaXMoXCJTdHJpbmdcIiwgZGF0ZSkpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChkYXRlLm1hdGNoKC9eWzAtOV0rJC8pKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZGF0ZU9iaiA9IG5ldyBEYXRlKGRhdGUgKiAxMDAwKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGRhdGVPYmogPSBuZXcgRGF0ZShUd2lnLmxpYi5zdHJ0b3RpbWUoZGF0ZSkgKiAxMDAwKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSBlbHNlIGlmIChUd2lnLmxpYi5pcyhcIk51bWJlclwiLCBkYXRlKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gdGltZXN0YW1wXG5cdCAgICAgICAgICAgICAgICBkYXRlT2JqID0gbmV3IERhdGUoZGF0ZSAqIDEwMDApO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJVbmFibGUgdG8gcGFyc2UgZGF0ZSBcIiArIGRhdGUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBkYXRlT2JqO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgYmxvY2s6IGZ1bmN0aW9uKGJsb2NrKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm9yaWdpbmFsQmxvY2tUb2tlbnNbYmxvY2tdKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5sb2dpYy5wYXJzZS5hcHBseSh0aGlzLCBbdGhpcy5vcmlnaW5hbEJsb2NrVG9rZW5zW2Jsb2NrXSwgdGhpcy5jb250ZXh0XSkub3V0cHV0O1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tzW2Jsb2NrXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgcGFyZW50OiBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgLy8gQWRkIGEgcGxhY2Vob2xkZXJcblx0ICAgICAgICAgICAgcmV0dXJuIFR3aWcucGxhY2Vob2xkZXJzLnBhcmVudDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGF0dHJpYnV0ZTogZnVuY3Rpb24ob2JqZWN0LCBtZXRob2QsIHBhcmFtcykge1xuXHQgICAgICAgICAgICBpZiAoVHdpZy5saWIuaXMoJ09iamVjdCcsIG9iamVjdCkpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkobWV0aG9kKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0W21ldGhvZF0gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0W21ldGhvZF0uYXBwbHkodW5kZWZpbmVkLCBwYXJhbXMpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdFttZXRob2RdO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyBBcnJheSB3aWxsIHJldHVybiBlbGVtZW50IDAtaW5kZXhcblx0ICAgICAgICAgICAgcmV0dXJuIG9iamVjdFttZXRob2RdIHx8IHVuZGVmaW5lZDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIG1heDogZnVuY3Rpb24odmFsdWVzKSB7XG5cdCAgICAgICAgICAgIGlmKFR3aWcubGliLmlzKFwiT2JqZWN0XCIsIHZhbHVlcykpIHtcblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZXNbXCJfa2V5c1wiXTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLmxpYi5tYXgodmFsdWVzKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBUd2lnLmxpYi5tYXguYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIG1pbjogZnVuY3Rpb24odmFsdWVzKSB7XG5cdCAgICAgICAgICAgIGlmKFR3aWcubGliLmlzKFwiT2JqZWN0XCIsIHZhbHVlcykpIHtcblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZXNbXCJfa2V5c1wiXTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLmxpYi5taW4odmFsdWVzKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBUd2lnLmxpYi5taW4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHRlbXBsYXRlX2Zyb21fc3RyaW5nOiBmdW5jdGlvbih0ZW1wbGF0ZSkge1xuXHQgICAgICAgICAgICBpZiAodGVtcGxhdGUgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSAnJztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gVHdpZy5UZW1wbGF0ZXMucGFyc2Vycy50d2lnKHtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcblx0ICAgICAgICAgICAgICAgIGRhdGE6IHRlbXBsYXRlXG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgcmFuZG9tOiBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICB2Y
46184XIgTElNSVRfSU5UMzEgPSAweDgwMDAwMDAwO1xuXG5cdCAgICAgICAgICAgIGZ1bmN0aW9uIGdldFJhbmRvbU51bWJlcihuKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgcmFuZG9tID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTElNSVRfSU5UMzEpO1xuXHQgICAgICAgICAgICAgICAgdmFyIGxpbWl0cyA9IFswLCBuXTtcblx0ICAgICAgICAgICAgICAgIHZhciBtaW4gPSBNYXRoLm1pbi5hcHBseShudWxsLCBsaW1pdHMpLFxuXHQgICAgICAgICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4LmFwcGx5KG51bGwsIGxpbWl0cyk7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gbWluICsgTWF0aC5mbG9vcigobWF4IC0gbWluICsgMSkgKiByYW5kb20gLyBMSU1JVF9JTlQzMSk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBpZihUd2lnLmxpYi5pcyhcIk51bWJlclwiLCB2YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBnZXRSYW5kb21OdW1iZXIodmFsdWUpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgaWYoVHdpZy5saWIuaXMoXCJTdHJpbmdcIiwgdmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuY2hhckF0KGdldFJhbmRvbU51bWJlcih2YWx1ZS5sZW5ndGgtMSkpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgaWYoVHdpZy5saWIuaXMoXCJBcnJheVwiLCB2YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVtnZXRSYW5kb21OdW1iZXIodmFsdWUubGVuZ3RoLTEpXTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIGlmKFR3aWcubGliLmlzKFwiT2JqZWN0XCIsIHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVba2V5c1tnZXRSYW5kb21OdW1iZXIoa2V5cy5sZW5ndGgtMSldXTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBnZXRSYW5kb21OdW1iZXIoTElNSVRfSU5UMzEtMSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgb2YgYSB0ZW1wbGF0ZSB3aXRob3V0IHJlbmRlcmluZyBpdFxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG5cdCAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbaWdub3JlX21pc3Npbmc9ZmFsc2VdXG5cdCAgICAgICAgICogQHJldHVybnMge3N0cmluZ31cblx0ICAgICAgICAgKi9cblx0ICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uKG5hbWUsIGlnbm9yZV9taXNzaW5nKSB7XG5cdCAgICAgICAgICAgIHZhciB0ZW1wbGF0ZVNvdXJjZTtcblx0ICAgICAgICAgICAgdmFyIHRlbXBsYXRlRm91bmQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgdmFyIGlzTm9kZUVudmlyb25tZW50ID0gdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJztcblx0ICAgICAgICAgICAgdmFyIGxvYWRlcjtcblx0ICAgICAgICAgICAgdmFyIHBhdGg7XG5cblx0ICAgICAgICAgICAgLy9pZiB3ZSBhcmUgcnVubmluZyBpbiBhIG5vZGUuanMgZW52aXJvbm1lbnQsIHNldCB0aGUgbG9hZGVyIHRvICdmcycgYW5kIGVuc3VyZSB0aGVcblx0ICAgICAgICAgICAgLy8gcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgQ1dEIG9mIHRoZSBydW5uaW5nIHNjcmlwdFxuXHQgICAgICAgICAgICAvL2Vsc2UsIHNldCB0aGUgbG9hZGVyIHRvICdhamF4JyBhbmQgc2V0IHRoZSBwYXRoIHRvIHRoZSB2YWx1ZSBvZiBuYW1lXG5cdCAgICAgICAgICAgIGlmIChpc05vZGVFbnZpcm9ubWVudCkge1xuXHQgICAgICAgICAgICAgICAgbG9hZGVyID0gJ2ZzJztcblx0ICAgICAgICAgICAgICAgIHBhdGggPSBfX2Rpcm5hbWUgKyAnLycgKyBuYW1lO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgbG9hZGVyID0gJ2FqYXgnO1xuXHQgICAgICAgICAgICAgICAgcGF0aCA9IG5hbWU7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvL2J1aWxkIHRoZSBwYXJhbXMgb2JqZWN0XG5cdCAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7XG5cdCAgICAgICAgICAgICAgICBpZDogbmFtZSxcblx0ICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgsXG5cdCAgICAgICAgICAgICAgICBtZXRob2Q6IGxvYWRlcixcblx0ICAgICAgICAgICAgICAgIHBhcnNlcjogJ3NvdXJjZScsXG5cdCAgICAgICAgICAgICAgICBhc3luYzogZmFsc2UsXG5cdCAgICAgICAgICAgICAgICBmZXRjaFRlbXBsYXRlU291cmNlOiB0cnVlXG5cdCAgICAgICAgICAgIH07XG5cblx0ICAgICAgICAgICAgLy9kZWZhdWx0IGlnbm9yZV9taXNzaW5nIHRvIGZhbHNlXG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgaWdub3JlX21pc3NpbmcgPT09ICd1bmRlZmluZWQnKSB7XG5cdCAgICAgICAgICAgICAgICBpZ25vcmVfbWlzc2luZyA9IGZhbHNlO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy90cnkgdG8gbG9hZCB0aGUgcmVtb3RlIHRlbXBsYXRlXG5cdCAgICAgICAgICAgIC8vXG5cdCAgICAgICAgICAgIC8vb24gZXhjZXB0aW9uLCBsb2cgaXRcblx0ICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgIHRlbXBsYXRlU291cmNlID0gVHdpZy5UZW1wbGF0ZXMubG9hZFJlbW90ZShuYW1lLCBwYXJhbXMpO1xuXG5cdCAgICAgICAgICAgICAgICAvL2lmIHRoZSB0ZW1wbGF0ZSBpcyB1bmRlZmluZWQgb3IgbnVsbCwgc2V0IHRoZSB0ZW1wbGF0ZSB0byBhbiBlbXB0eSBzdHJpbmcgYW5kIGRvIE5PVCBmbGlwIHRoZVxuXHQgICAgICAgICAgICAgICAgLy8gYm9vbGVhbiBpbmRpY2F0aW5nIHdlIGZvdW5kIHRoZSB0ZW1wbGF0ZVxuXHQgICAgICAgICAgICAgICAgLy9cblx0ICAgICAgICAgICAgICAgIC8vZWxzZSwgYWxsIGlzIGdvb2QhIGZsaXAgdGhlIGJvb2xlYW4gaW5kaWNhdGluZyB3ZSBmb3VuZCB0aGUgdGVtcGxhdGVcblx0ICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGVTb3VyY2UgPT09ICd1bmRlZmluZWQnIHx8IHRlbXBsYXRlU291cmNlID09PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVTb3VyY2UgPSAnJztcblx0ICAgICAgICAgICAgICAgI
46184H0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVGb3VuZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9nLmRlYnVnKCdUd2lnLmZ1bmN0aW9ucy5zb3VyY2U6ICcsICdQcm9ibGVtIGxvYWRpbmcgdGVtcGxhdGUgICcsIGUpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy9pZiB0aGUgdGVtcGxhdGUgd2FzIE5PVCBmb3VuZCBBTkQgd2UgYXJlIG5vdCBpZ25vcmluZyBtaXNzaW5nIHRlbXBsYXRlcywgcmV0dXJuIHRoZSBzYW1lIG1lc3NhZ2Vcblx0ICAgICAgICAgICAgLy8gdGhhdCBpcyByZXR1cm5lZCBieSB0aGUgUEhQIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0d2lnIHNvdXJjZSgpIGZ1bmN0aW9uXG5cdCAgICAgICAgICAgIC8vXG5cdCAgICAgICAgICAgIC8vZWxzZSwgcmV0dXJuIHRoZSB0ZW1wbGF0ZSBzb3VyY2Vcblx0ICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZUZvdW5kICYmICFpZ25vcmVfbWlzc2luZykge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFRFTVBMQVRFX05PVF9GT1VORF9NRVNTQUdFLnJlcGxhY2UoJ3tuYW1lfScsIG5hbWUpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlU291cmNlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgVHdpZy5fZnVuY3Rpb24gPSBmdW5jdGlvbihfZnVuY3Rpb24sIHZhbHVlLCBwYXJhbXMpIHtcblx0ICAgICAgICBpZiAoIVR3aWcuZnVuY3Rpb25zW19mdW5jdGlvbl0pIHtcblx0ICAgICAgICAgICAgdGhyb3cgXCJVbmFibGUgdG8gZmluZCBmdW5jdGlvbiBcIiArIF9mdW5jdGlvbjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIFR3aWcuZnVuY3Rpb25zW19mdW5jdGlvbl0odmFsdWUsIHBhcmFtcyk7XG5cdCAgICB9O1xuXG5cdCAgICBUd2lnLl9mdW5jdGlvbi5leHRlbmQgPSBmdW5jdGlvbihfZnVuY3Rpb24sIGRlZmluaXRpb24pIHtcblx0ICAgICAgICBUd2lnLmZ1bmN0aW9uc1tfZnVuY3Rpb25dID0gZGVmaW5pdGlvbjtcblx0ICAgIH07XG5cblx0ICAgIHJldHVybiBUd2lnO1xuXG5cdH07XG5cblxuLyoqKi8gfSxcbi8qIDcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vICMjIHR3aWcubGliLmpzXG5cdC8vXG5cdC8vIFRoaXMgZmlsZSBjb250YWlucyAzcmQgcGFydHkgbGlicmFyaWVzIHVzZWQgd2l0aGluIHR3aWcuXG5cdC8vXG5cdC8vIENvcGllcyBvZiB0aGUgbGljZW5zZXMgZm9yIHRoZSBjb2RlIGluY2x1ZGVkIGhlcmUgY2FuIGJlIGZvdW5kIGluIHRoZVxuXHQvLyBMSUNFTlNFUy5tZCBmaWxlLlxuXHQvL1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oVHdpZykge1xuXG5cdCAgICAvLyBOYW1lc3BhY2UgZm9yIGxpYnJhcmllc1xuXHQgICAgVHdpZy5saWIgPSB7IH07XG5cblx0ICAgIFR3aWcubGliLnNwcmludGYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuXHQgICAgVHdpZy5saWIudnNwcmludGYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXHQgICAgVHdpZy5saWIucm91bmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcblx0ICAgIFR3aWcubGliLm1heCA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXHQgICAgVHdpZy5saWIubWluID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG5cdCAgICBUd2lnLmxpYi5zdHJpcF90YWdzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG5cdCAgICBUd2lnLmxpYi5zdHJ0b3RpbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KTtcblx0ICAgIFR3aWcubGliLmRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KTtcblx0ICAgIFR3aWcubGliLmJvb2x2YWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTtcblxuXHQgICAgVHdpZy5saWIuaXMgPSBmdW5jdGlvbih0eXBlLCBvYmopIHtcblx0ICAgICAgICB2Y
46184XIgY2xhcyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopLnNsaWNlKDgsIC0xKTtcblx0ICAgICAgICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsICYmIGNsYXMgPT09IHR5cGU7XG5cdCAgICB9O1xuXG5cdCAgICAvLyBzaGFsbG93LWNvcHkgYW4gb2JqZWN0XG5cdCAgICBUd2lnLmxpYi5jb3B5ID0gZnVuY3Rpb24oc3JjKSB7XG5cdCAgICAgICAgdmFyIHRhcmdldCA9IHt9LFxuXHQgICAgICAgICAgICBrZXk7XG5cdCAgICAgICAgZm9yIChrZXkgaW4gc3JjKVxuXHQgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHNyY1trZXldO1xuXG5cdCAgICAgICAgcmV0dXJuIHRhcmdldDtcblx0ICAgIH07XG5cblx0ICAgIFR3aWcubGliLmV4dGVuZCA9IGZ1bmN0aW9uIChzcmMsIGFkZCkge1xuXHQgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKSxcblx0ICAgICAgICAgICAgaTtcblxuXHQgICAgICAgIGkgPSBrZXlzLmxlbmd0aDtcblxuXHQgICAgICAgIHdoaWxlIChpLS0pIHtcblx0ICAgICAgICAgICAgc3JjW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHJldHVybiBzcmM7XG5cdCAgICB9O1xuXG5cdCAgICBUd2lnLmxpYi5yZXBsYWNlQWxsID0gZnVuY3Rpb24oc3RyaW5nLCBzZWFyY2gsIHJlcGxhY2UpIHtcblx0ICAgICAgICByZXR1cm4gc3RyaW5nLnNwbGl0KHNlYXJjaCkuam9pbihyZXBsYWNlKTtcblx0ICAgIH07XG5cblx0ICAgIC8vIGNodW5rIGFuIGFycmF5IChhcnIpIGludG8gYXJyYXlzIG9mIChzaXplKSBpdGVtcywgcmV0dXJucyBhbiBhcnJheSBvZiBhcnJheXMsIG9yIGFuIGVtcHR5IGFycmF5IG9uIGludmFsaWQgaW5wdXRcblx0ICAgIFR3aWcubGliLmNodW5rQXJyYXkgPSBmdW5jdGlvbiAoYXJyLCBzaXplKSB7XG5cdCAgICAgICAgdmFyIHJldHVyblZhbCA9IFtdLFxuXHQgICAgICAgICAgICB4ID0gMCxcblx0ICAgICAgICAgICAgbGVuID0gYXJyLmxlbmd0aDtcblxuXHQgICAgICAgIGlmIChzaXplIDwgMSB8fCAhVHdpZy5saWIuaXMoXCJBcnJheVwiLCBhcnIpKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBbXTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB3aGlsZSAoeCA8IGxlbikge1xuXHQgICAgICAgICAgICByZXR1cm5WYWwucHVzaChhcnIuc2xpY2UoeCwgeCArPSBzaXplKSk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcmV0dXJuIHJldHVyblZhbDtcblx0ICAgIH07XG5cblx0ICAgIHJldHVybiBUd2lnO1xuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiA4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzcHJpbnRmKCkge1xuXHQgIC8vICBkaXNjdXNzIGF0OiBodHRwOi8vbG9jdXR1cy5pby9waHAvc3ByaW50Zi9cblx0ICAvLyBvcmlnaW5hbCBieTogQXNoIFNlYXJsZSAoaHR0cDovL2hleG1lbi5jb20vYmxvZy8pXG5cdCAgLy8gaW1wcm92ZWQgYnk6IE1pY2hhZWwgV2hpdGUgKGh0dHA6Ly9nZXRzcHJpbmsuY29tKVxuXHQgIC8vIGltcHJvdmVkIGJ5OiBKYWNrXG5cdCAgLy8gaW1wcm92ZWQgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHA6Ly9rdnouaW8pXG5cdCAgLy8gaW1wcm92ZWQgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHA6Ly9rdnouaW8pXG5cdCAgLy8gaW1wcm92ZWQgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHA6Ly9rdnouaW8pXG5cdCAgLy8gaW1wcm92ZWQgYnk6IERqXG5cdCAgLy8gaW1wcm92ZWQgYnk6IEFsbGlkeWxsc1xuXHQgIC8vICAgIGlucHV0IGJ5OiBQYXVsbyBGcmVpdGFzXG5cdCAgLy8gICAgaW5wdXQgYnk6IEJyZXR0IFphbWlyIChodHRwOi8vYnJldHQtemFtaXIubWUpXG5cdCAgLy8gICBleGFtcGxlIDE6IHNwcmludGYoXCIlMDEuMmZcIiwgMTIzLjEpXG5cdCAgLy8gICByZXR1cm5zIDE6ICcxMjMuMTAnXG5cdCAgLy8gICBleGFtcGxlIDI6IHNwcmludGYoXCJbJTEwc11cIiwgJ21vbmtleScpXG5cdCAgLy8gICByZXR1cm5zIDI6ICdbICAgIG1vbmtleV0nXG5cdCAgLy8gICBleGFtcGxlIDM6IHNwcmludGYoXCJbJScjMTBzXVwiLCAnbW9ua2V5Jylcblx0ICAvLyAgIHJldHVybnMgMzogJ1sjIyMjbW9ua2V5XSdcblx0ICAvLyAgIGV4YW1wbGUgNDogc3ByaW50ZihcIiVkXCIsIDEyMzQ1Njc4OTAxMjM0NSlcblx0ICAvLyAgIHJldHVybnMgNDogJzEyMzQ1Njc4OTAxMjM0NSdcblx0ICAvLyAgIGV4YW1wbGUgNTogc3ByaW50ZignJS0wM3MnLCAnRScpXG5cdCAgLy8gICByZXR1cm5zIDU6ICdFMDAnXG5cblx0ICB2YXIgcmVnZXggPSAvJSV8JShcXGQrXFwkKT8oWy0rJyMwIF0qKShcXCpcXGQrXFwkfFxcKnxcXGQrKT8oPzpcXC4oXFwqXFxkK1xcJHxcXCp8XFxkKykpPyhbc2Nib3hYdWlkZUVmRmdHXSkvZztcblx0ICB2YXIgYSA9IGFyZ3VtZW50cztcblx0ICB2YXIgaSA9IDA7XG5cdCAgdmFyIGZvcm1hdCA9IGFbaSsrXTtcblxuXHQgIHZhciBfcGFkID0gZnVuY3Rpb24gX3BhZChzdHIsIGxlbiwgY2hyLCBsZWZ0SnVzdGlmeSkge1xuXHQgICAgaWYgKCFjaHIpIHtcblx0ICAgICAgY2hyID0gJyAnO1xuXHQgICAgfVxuXHQgICAgdmFyIHBhZGRpbmcgPSBzdHIubGVuZ3RoID49IGxlbiA/ICcnIDogbmV3IEFycmF5KDEgKyBsZW4gLSBzdHIubGVuZ3RoID4+PiAwKS5qb2luKGNocik7XG5cdCAgICByZXR1cm4gbGVmdEp1c3RpZnkgPyBzdHIgKyBwYWRkaW5nIDogcGFkZGluZyArIHN0cjtcblx0ICB9O1xuXG5cdCAgdmFyIGp1c3RpZnkgPSBmdW5jdGlvbiBqdXN0aWZ5KHZhbHVlLCBwcmVmaXgsIGxlZnRKdXN0aWZ5LCBtaW5XaWR0aCwgemVyb1BhZCwgY3VzdG9tUGFkQ2hhcikge1xuXHQgICAgdmFyIGRpZmYgPSBtaW5XaWR0aCAtIHZhbHVlLmxlbmd0aDtcblx0ICAgIGlmIChkaWZmID4gMCkge1xuXHQgICAgICBpZiAobGVmdEp1c3RpZnkgfHwgIXplcm9QYWQpIHtcblx0ICAgICAgICB2YWx1ZSA9IF9wYWQodmFsdWUsIG1pbldpZHRoLCBjdXN0b21QYWRDaGFyLCBsZWZ0SnVzdGlmeSk7XG5cdCAgICAgI
46184H0gZWxzZSB7XG5cdCAgICAgICAgdmFsdWUgPSBbdmFsdWUuc2xpY2UoMCwgcHJlZml4Lmxlbmd0aCksIF9wYWQoJycsIGRpZmYsICcwJywgdHJ1ZSksIHZhbHVlLnNsaWNlKHByZWZpeC5sZW5ndGgpXS5qb2luKCcnKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIHZhbHVlO1xuXHQgIH07XG5cblx0ICB2YXIgX2Zvcm1hdEJhc2VYID0gZnVuY3Rpb24gX2Zvcm1hdEJhc2VYKHZhbHVlLCBiYXNlLCBwcmVmaXgsIGxlZnRKdXN0aWZ5LCBtaW5XaWR0aCwgcHJlY2lzaW9uLCB6ZXJvUGFkKSB7XG5cdCAgICAvLyBOb3RlOiBjYXN0cyBuZWdhdGl2ZSBudW1iZXJzIHRvIHBvc2l0aXZlIG9uZXNcblx0ICAgIHZhciBudW1iZXIgPSB2YWx1ZSA+Pj4gMDtcblx0ICAgIHByZWZpeCA9IHByZWZpeCAmJiBudW1iZXIgJiYge1xuXHQgICAgICAnMic6ICcwYicsXG5cdCAgICAgICc4JzogJzAnLFxuXHQgICAgICAnMTYnOiAnMHgnXG5cdCAgICB9W2Jhc2VdIHx8ICcnO1xuXHQgICAgdmFsdWUgPSBwcmVmaXggKyBfcGFkKG51bWJlci50b1N0cmluZyhiYXNlKSwgcHJlY2lzaW9uIHx8IDAsICcwJywgZmFsc2UpO1xuXHQgICAgcmV0dXJuIGp1c3RpZnkodmFsdWUsIHByZWZpeCwgbGVmdEp1c3RpZnksIG1pbldpZHRoLCB6ZXJvUGFkKTtcblx0ICB9O1xuXG5cdCAgLy8gX2Zvcm1hdFN0cmluZygpXG5cdCAgdmFyIF9mb3JtYXRTdHJpbmcgPSBmdW5jdGlvbiBfZm9ybWF0U3RyaW5nKHZhbHVlLCBsZWZ0SnVzdGlmeSwgbWluV2lkdGgsIHByZWNpc2lvbiwgemVyb1BhZCwgY3VzdG9tUGFkQ2hhcikge1xuXHQgICAgaWYgKHByZWNpc2lvbiAhPT0gbnVsbCAmJiBwcmVjaXNpb24gIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHByZWNpc2lvbik7XG5cdCAgICB9XG5cdCAgICByZXR1cm4ganVzdGlmeSh2YWx1ZSwgJycsIGxlZnRKdXN0aWZ5LCBtaW5XaWR0aCwgemVyb1BhZCwgY3VzdG9tUGFkQ2hhcik7XG5cdCAgfTtcblxuXHQgIC8vIGRvRm9ybWF0KClcblx0ICB2YXIgZG9Gb3JtYXQgPSBmdW5jdGlvbiBkb0Zvcm1hdChzdWJzdHJpbmcsIHZhbHVlSW5kZXgsIGZsYWdzLCBtaW5XaWR0aCwgcHJlY2lzaW9uLCB0eXBlKSB7XG5cdCAgICB2YXIgbnVtYmVyLCBwcmVmaXgsIG1ldGhvZCwgdGV4dFRyYW5zZm9ybSwgdmFsdWU7XG5cblx0ICAgIGlmIChzdWJzdHJpbmcgPT09ICclJScpIHtcblx0ICAgICAgcmV0dXJuICclJztcblx0ICAgIH1cblxuXHQgICAgLy8gcGFyc2UgZmxhZ3Ncblx0ICAgIHZhciBsZWZ0SnVzdGlmeSA9IGZhbHNlO1xuXHQgICAgdmFyIHBvc2l0aXZlUHJlZml4ID0gJyc7XG5cdCAgICB2YXIgemVyb1BhZCA9IGZhbHNlO1xuXHQgICAgdmFyIHByZWZpeEJhc2VYID0gZmFsc2U7XG5cdCAgICB2YXIgY3VzdG9tUGFkQ2hhciA9ICcgJztcblx0ICAgIHZhciBmbGFnc2wgPSBmbGFncy5sZW5ndGg7XG5cdCAgICB2YXIgajtcblx0ICAgIGZvciAoaiA9IDA7IGogPCBmbGFnc2w7IGorKykge1xuXHQgICAgICBzd2l0Y2ggKGZsYWdzLmNoYXJBdChqKSkge1xuXHQgICAgICAgIGNhc2UgJyAnOlxuXHQgICAgICAgICAgcG9zaXRpdmVQcmVmaXggPSAnICc7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlICcrJzpcblx0ICAgICAgICAgIHBvc2l0aXZlUHJlZml4ID0gJysnO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSAnLSc6XG5cdCAgICAgICAgICBsZWZ0SnVzdGlmeSA9IHRydWU7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiJ1wiOlxuXHQgICAgICAgICAgY3VzdG9tUGFkQ2hhciA9IGZsYWdzLmNoYXJBdChqICsgMSk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlICcwJzpcblx0ICAgICAgICAgIHplcm9QYWQgPSB0cnVlO1xuXHQgICAgICAgICAgY3VzdG9tUGFkQ2hhciA9ICcwJztcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgJyMnOlxuXHQgICAgICAgICAgcHJlZml4QmFzZVggPSB0cnVlO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgLy8gcGFyYW1ldGVycyBtYXkgYmUgbnVsbCwgdW5kZWZpbmVkLCBlbXB0eS1zdHJpbmcgb3IgcmVhbCB2YWx1ZWRcblx0ICAgIC8vIHdlIHdhbnQgdG8gaWdub3JlIG51bGwsIHVuZGVmaW5lZCBhbmQgZW1wdHktc3RyaW5nIHZhbHVlc1xuXHQgICAgaWYgKCFtaW5XaWR0aCkge1xuXHQgICAgICBtaW5XaWR0aCA9IDA7XG5cdCAgICB9IGVsc2UgaWYgKG1pbldpZHRoID09PSAnKicpIHtcblx0ICAgICAgbWluV2lkdGggPSArYVtpKytdO1xuXHQgICAgfSBlbHNlIGlmIChtaW5XaWR0aC5jaGFyQXQoMCkgPT09ICcqJykge1xuXHQgICAgICBtaW5XaWR0aCA9ICthW21pbldpZHRoLnNsaWNlKDEsIC0xKV07XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBtaW5XaWR0aCA9ICttaW5XaWR0aDtcblx0ICAgIH1cblxuXHQgICAgLy8gTm90ZTogdW5kb2N1bWVudGVkIHBlcmwgZmVhdHVyZTpcblx0ICAgIGlmIChtaW5XaWR0aCA8IDApIHtcblx0ICAgICAgbWluV2lkdGggPSAtbWluV2lkdGg7XG5cdCAgICAgIGxlZnRKdXN0aWZ5ID0gdHJ1ZTtcblx0ICAgIH1cblxuXHQgICAgaWYgKCFpc0Zpbml0ZShtaW5XaWR0aCkpIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcHJpbnRmOiAobWluaW11bS0pd2lkdGggbXVzdCBiZSBmaW5pdGUnKTtcblx0ICAgIH1cblxuXHQgICAgaWYgKCFwcmVjaXNpb24pIHtcblx0ICAgICAgcHJlY2lzaW9uID0gJ2ZGZUUnLmluZGV4T2YodHlwZSkgPiAtMSA/IDYgOiB0eXBlID09PSAnZCcgPyAwIDogdW5kZWZpbmVkO1xuXHQgICAgfSBlbHNlIGlmIChwcmVjaXNpb24gPT09ICcqJykge1xuXHQgICAgICBwcmVjaXNpb24gPSArYVtpKytdO1xuXHQgICAgfSBlbHNlIGlmIChwcmVjaXNpb24uY2hhckF0KDApID09PSAnKicpIHtcblx0ICAgICAgcHJlY2lzaW9uID0gK2FbcHJlY2lzaW9uLnNsaWNlKDEsIC0xKV07XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBwcmVjaXNpb24gPSArcHJlY2lzaW9uO1xuXHQgICAgfVxuXG5cdCAgICAvLyBncmFiIHZhbHVlIHVzaW5nIHZhbHVlSW5kZXggaWYgcmVxdWlyZWQ/XG5cdCAgICB2YWx1ZSA9IHZhbHVlSW5kZXggPyBhW3ZhbHVlSW5kZXguc2xpY2UoMCwgLTEpXSA6IGFbaSsrXTtcblxuXHQgICAgc3dpdGNoICh0eXBlKSB7XG5cdCAgICAgIGNhc2UgJ3MnOlxuXHQgICAgICAgI
46184HJldHVybiBfZm9ybWF0U3RyaW5nKHZhbHVlICsgJycsIGxlZnRKdXN0aWZ5LCBtaW5XaWR0aCwgcHJlY2lzaW9uLCB6ZXJvUGFkLCBjdXN0b21QYWRDaGFyKTtcblx0ICAgICAgY2FzZSAnYyc6XG5cdCAgICAgICAgcmV0dXJuIF9mb3JtYXRTdHJpbmcoU3RyaW5nLmZyb21DaGFyQ29kZSgrdmFsdWUpLCBsZWZ0SnVzdGlmeSwgbWluV2lkdGgsIHByZWNpc2lvbiwgemVyb1BhZCk7XG5cdCAgICAgIGNhc2UgJ2InOlxuXHQgICAgICAgIHJldHVybiBfZm9ybWF0QmFzZVgodmFsdWUsIDIsIHByZWZpeEJhc2VYLCBsZWZ0SnVzdGlmeSwgbWluV2lkdGgsIHByZWNpc2lvbiwgemVyb1BhZCk7XG5cdCAgICAgIGNhc2UgJ28nOlxuXHQgICAgICAgIHJldHVybiBfZm9ybWF0QmFzZVgodmFsdWUsIDgsIHByZWZpeEJhc2VYLCBsZWZ0SnVzdGlmeSwgbWluV2lkdGgsIHByZWNpc2lvbiwgemVyb1BhZCk7XG5cdCAgICAgIGNhc2UgJ3gnOlxuXHQgICAgICAgIHJldHVybiBfZm9ybWF0QmFzZVgodmFsdWUsIDE2LCBwcmVmaXhCYXNlWCwgbGVmdEp1c3RpZnksIG1pbldpZHRoLCBwcmVjaXNpb24sIHplcm9QYWQpO1xuXHQgICAgICBjYXNlICdYJzpcblx0ICAgICAgICByZXR1cm4gX2Zvcm1hdEJhc2VYKHZhbHVlLCAxNiwgcHJlZml4QmFzZVgsIGxlZnRKdXN0aWZ5LCBtaW5XaWR0aCwgcHJlY2lzaW9uLCB6ZXJvUGFkKS50b1VwcGVyQ2FzZSgpO1xuXHQgICAgICBjYXNlICd1Jzpcblx0ICAgICAgICByZXR1cm4gX2Zvcm1hdEJhc2VYKHZhbHVlLCAxMCwgcHJlZml4QmFzZVgsIGxlZnRKdXN0aWZ5LCBtaW5XaWR0aCwgcHJlY2lzaW9uLCB6ZXJvUGFkKTtcblx0ICAgICAgY2FzZSAnaSc6XG5cdCAgICAgIGNhc2UgJ2QnOlxuXHQgICAgICAgIG51bWJlciA9ICt2YWx1ZSB8fCAwO1xuXHQgICAgICAgIC8vIFBsYWluIE1hdGgucm91bmQgZG9lc24ndCBqdXN0IHRydW5jYXRlXG5cdCAgICAgICAgbnVtYmVyID0gTWF0aC5yb3VuZChudW1iZXIgLSBudW1iZXIgJSAxKTtcblx0ICAgICAgICBwcmVmaXggPSBudW1iZXIgPCAwID8gJy0nIDogcG9zaXRpdmVQcmVmaXg7XG5cdCAgICAgICAgdmFsdWUgPSBwcmVmaXggKyBfcGFkKFN0cmluZyhNYXRoLmFicyhudW1iZXIpKSwgcHJlY2lzaW9uLCAnMCcsIGZhbHNlKTtcblx0ICAgICAgICByZXR1cm4ganVzdGlmeSh2YWx1ZSwgcHJlZml4LCBsZWZ0SnVzdGlmeSwgbWluV2lkdGgsIHplcm9QYWQpO1xuXHQgICAgICBjYXNlICdlJzpcblx0ICAgICAgY2FzZSAnRSc6XG5cdCAgICAgIGNhc2UgJ2YnOiAvLyBAdG9kbzogU2hvdWxkIGhhbmRsZSBsb2NhbGVzIChhcyBwZXIgc2V0bG9jYWxlKVxuXHQgICAgICBjYXNlICdGJzpcblx0ICAgICAgY2FzZSAnZyc6XG5cdCAgICAgIGNhc2UgJ0cnOlxuXHQgICAgICAgIG51bWJlciA9ICt2YWx1ZTtcblx0ICAgICAgICBwcmVmaXggPSBudW1iZXIgPCAwID8gJy0nIDogcG9zaXRpdmVQcmVmaXg7XG5cdCAgICAgICAgbWV0aG9kID0gWyd0b0V4cG9uZW50aWFsJywgJ3RvRml4ZWQnLCAndG9QcmVjaXNpb24nXVsnZWZnJy5pbmRleE9mKHR5cGUudG9Mb3dlckNhc2UoKSldO1xuXHQgICAgICAgIHRleHRUcmFuc2Zvcm0gPSBbJ3RvU3RyaW5nJywgJ3RvVXBwZXJDYXNlJ11bJ2VFZkZnRycuaW5kZXhPZih0eXBlKSAlIDJdO1xuXHQgICAgICAgIHZhbHVlID0gcHJlZml4ICsgTWF0aC5hYnMobnVtYmVyKVttZXRob2RdKHByZWNpc2lvbik7XG5cdCAgICAgICAgcmV0dXJuIGp1c3RpZnkodmFsdWUsIHByZWZpeCwgbGVmdEp1c3RpZnksIG1pbldpZHRoLCB6ZXJvUGFkKVt0ZXh0VHJhbnNmb3JtXSgpO1xuXHQgICAgICBkZWZhdWx0OlxuXHQgICAgICAgIHJldHVybiBzdWJzdHJpbmc7XG5cdCAgICB9XG5cdCAgfTtcblxuXHQgIHJldHVybiBmb3JtYXQucmVwbGFjZShyZWdleCwgZG9Gb3JtYXQpO1xuXHR9O1xuXHRcblxuLyoqKi8gfSxcbi8qIDkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0JztcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZzcHJpbnRmKGZvcm1hdCwgYXJncykge1xuXHQgIC8vICBkaXNjdXNzIGF0OiBodHRwOi8vbG9jdXR1cy5pby9waHAvdnNwcmludGYvXG5cdCAgLy8gb3JpZ2luYWwgYnk6IGVqc2FuZGVyc1xuXHQgIC8vICAgZXhhbXBsZSAxOiB2c3ByaW50ZignJTA0ZC0lMDJkLSUwMmQnLCBbMTk4OCwgOCwgMV0pXG5cdCAgLy8gICByZXR1cm5zIDE6ICcxOTg4LTA4LTAxJ1xuXG5cdCAgdmFyIHNwcmludGYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuXG5cdCAgcmV0dXJuIHNwcmludGYuYXBwbHkodGhpcywgW2Zvcm1hdF0uY29uY2F0KGFyZ3MpKTtcblx0fTtcblx0XG5cbi8qKiovIH0sXG4vKiAxMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcm91bmQodmFsdWUsIHByZWNpc2lvbiwgbW9kZSkge1xuXHQgIC8vICBkaXNjdXNzIGF0OiBodHRwOi8vbG9jdXR1cy5pby9waHAvcm91bmQvXG5cdCAgLy8gb3JpZ2luYWwgYnk6IFBoaWxpcCBQZXRlcnNvblxuXHQgIC8vICByZXZpc2VkIGJ5OiBPbm5vIE1hcnNtYW4gKGh0dHBzOi8vdHdpdHRlci5jb20vb25ub21hcnNtYW4pXG5cdCAgLy8gIHJldmlzZWQgYnk6IFQuV2lsZFxuXHQgIC8vICByZXZpc2VkIGJ5OiBSYWZhxYIgS3VrYXdza2kgKGh0dHA6Ly9ibG9nLmt1a2F3c2tpLnBsKVxuXHQgIC8vICAgIGlucHV0IGJ5OiBHcmVlbnNlZWRcblx0ICAvLyAgICBpbnB1dCBieTogbWVvXG5cdCAgLy8gICAgaW5wdXQgYnk6IFdpbGxpYW1cblx0ICAvLyAgICBpbnB1dCBieTogSm9zZXAgU2FueiAoaHR0cDovL3d3dy53czMuZXMvKVxuXHQgIC8vIGJ1Z2ZpeGVkIGJ5OiBCcmV0dCBaYW1pciAoaHR0cDovL2JyZXR0LXphbWlyLm1lKVxuXHQgIC8vICAgICAgbm90ZSAxOiBHcmVhdCB3b3JrLiBJZGVhcyBmb3IgaW1wcm92ZW1lbnQ6XG5cdCAgLy8gICAgICBub3RlIDE6IC0gY29kZSBtb3JlIGNvbXBsaWFudCB3aXRoIGRldmVsb3BlciBndWlkZWxpbmVzXG5cdCAgLy8gICAgICBub3RlIDE6IC0gZm9yIGltcGxlbWVudGluZyBQSFAgY29uc3RhbnQgYXJndW1lbnRzIGxvb2sgYXRcblx0ICAvLyAgICAgIG5vdGUgMTogdGhlI
46184HBhdGhpbmZvKCkgZnVuY3Rpb24sIGl0IG9mZmVycyB0aGUgZ3JlYXRlc3Rcblx0ICAvLyAgICAgIG5vdGUgMTogZmxleGliaWxpdHkgJiBjb21wYXRpYmlsaXR5IHBvc3NpYmxlXG5cdCAgLy8gICBleGFtcGxlIDE6IHJvdW5kKDEyNDE3NTcsIC0zKVxuXHQgIC8vICAgcmV0dXJucyAxOiAxMjQyMDAwXG5cdCAgLy8gICBleGFtcGxlIDI6IHJvdW5kKDMuNilcblx0ICAvLyAgIHJldHVybnMgMjogNFxuXHQgIC8vICAgZXhhbXBsZSAzOiByb3VuZCgyLjgzNSwgMilcblx0ICAvLyAgIHJldHVybnMgMzogMi44NFxuXHQgIC8vICAgZXhhbXBsZSA0OiByb3VuZCgxLjE3NDk5OTk5OTk5OTksIDIpXG5cdCAgLy8gICByZXR1cm5zIDQ6IDEuMTdcblx0ICAvLyAgIGV4YW1wbGUgNTogcm91bmQoNTg1NTEuNzk5OTk5OTk5OTk2LCAyKVxuXHQgIC8vICAgcmV0dXJucyA1OiA1ODU1MS44XG5cblx0ICB2YXIgbSwgZiwgaXNIYWxmLCBzZ247IC8vIGhlbHBlciB2YXJpYWJsZXNcblx0ICAvLyBtYWtpbmcgc3VyZSBwcmVjaXNpb24gaXMgaW50ZWdlclxuXHQgIHByZWNpc2lvbiB8PSAwO1xuXHQgIG0gPSBNYXRoLnBvdygxMCwgcHJlY2lzaW9uKTtcblx0ICB2YWx1ZSAqPSBtO1xuXHQgIC8vIHNpZ24gb2YgdGhlIG51bWJlclxuXHQgIHNnbiA9IHZhbHVlID4gMCB8IC0odmFsdWUgPCAwKTtcblx0ICBpc0hhbGYgPSB2YWx1ZSAlIDEgPT09IDAuNSAqIHNnbjtcblx0ICBmID0gTWF0aC5mbG9vcih2YWx1ZSk7XG5cblx0ICBpZiAoaXNIYWxmKSB7XG5cdCAgICBzd2l0Y2ggKG1vZGUpIHtcblx0ICAgICAgY2FzZSAnUEhQX1JPVU5EX0hBTEZfRE9XTic6XG5cdCAgICAgICAgLy8gcm91bmRzIC41IHRvd2FyZCB6ZXJvXG5cdCAgICAgICAgdmFsdWUgPSBmICsgKHNnbiA8IDApO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBjYXNlICdQSFBfUk9VTkRfSEFMRl9FVkVOJzpcblx0ICAgICAgICAvLyByb3VkcyAuNSB0b3dhcmRzIHRoZSBuZXh0IGV2ZW4gaW50ZWdlclxuXHQgICAgICAgIHZhbHVlID0gZiArIGYgJSAyICogc2duO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBjYXNlICdQSFBfUk9VTkRfSEFMRl9PREQnOlxuXHQgICAgICAgIC8vIHJvdW5kcyAuNSB0b3dhcmRzIHRoZSBuZXh0IG9kZCBpbnRlZ2VyXG5cdCAgICAgICAgdmFsdWUgPSBmICsgIShmICUgMik7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgLy8gcm91bmRzIC41IGF3YXkgZnJvbSB6ZXJvXG5cdCAgICAgICAgdmFsdWUgPSBmICsgKHNnbiA+IDApO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHJldHVybiAoaXNIYWxmID8gdmFsdWUgOiBNYXRoLnJvdW5kKHZhbHVlKSkgLyBtO1xuXHR9O1xuXHRcblxuLyoqKi8gfSxcbi8qIDExICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbWF4KCkge1xuXHQgIC8vICBkaXNjdXNzIGF0OiBodHRwOi8vbG9jdXR1cy5pby9waHAvbWF4L1xuXHQgIC8vIG9yaWdpbmFsIGJ5OiBPbm5vIE1hcnNtYW4gKGh0dHBzOi8vdHdpdHRlci5jb20vb25ub21hcnNtYW4pXG5cdCAgLy8gIHJldmlzZWQgYnk6IE9ubm8gTWFyc21hbiAoaHR0cHM6Ly90d2l0dGVyLmNvbS9vbm5vbWFyc21hbilcblx0ICAvLyBpbXByb3ZlZCBieTogSmFja1xuXHQgIC8vICAgICAgbm90ZSAxOiBMb25nIGNvZGUgY2F1c2Ugd2UncmUgYWltaW5nIGZvciBtYXhpbXVtIFBIUCBjb21wYXRpYmlsaXR5XG5cdCAgLy8gICBleGFtcGxlIDE6IG1heCgxLCAzLCA1LCA2LCA3KVxuXHQgIC8vICAgcmV0dXJucyAxOiA3XG5cdCAgLy8gICBleGFtcGxlIDI6IG1heChbMiwgNCwgNV0pXG5cdCAgLy8gICByZXR1cm5zIDI6IDVcblx0ICAvLyAgIGV4YW1wbGUgMzogbWF4KDAsICdoZWxsbycpXG5cdCAgLy8gICByZXR1cm5zIDM6IDBcblx0ICAvLyAgIGV4YW1wbGUgNDogbWF4KCdoZWxsbycsIDApXG5cdCAgLy8gICByZXR1cm5zIDQ6ICdoZWxsbydcblx0ICAvLyAgIGV4YW1wbGUgNTogbWF4KC0xLCAnaGVsbG8nKVxuXHQgIC8vICAgcmV0dXJucyA1OiAnaGVsbG8nXG5cdCAgLy8gICBleGFtcGxlIDY6IG1heChbMiwgNCwgOF0sIFsyLCA1LCA3XSlcblx0ICAvLyAgIHJldHVybnMgNjogWzIsIDUsIDddXG5cblx0ICB2YXIgYXI7XG5cdCAgdmFyIHJldFZhbDtcblx0ICB2YXIgaSA9IDA7XG5cdCAgdmFyIG4gPSAwO1xuXHQgIHZhciBhcmd2ID0gYXJndW1lbnRzO1xuXHQgIHZhciBhcmdjID0gYXJndi5sZW5ndGg7XG5cdCAgdmFyIF9vYmoyQXJyYXkgPSBmdW5jdGlvbiBfb2JqMkFycmF5KG9iaikge1xuXHQgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBBcnJheV0nKSB7XG5cdCAgICAgIHJldHVybiBvYmo7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB2YXIgYXIgPSBbXTtcblx0ICAgICAgZm9yICh2YXIgaSBpbiBvYmopIHtcblx0ICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGkpKSB7XG5cdCAgICAgICAgICBhci5wdXNoKG9ialtpXSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBhcjtcblx0ICAgIH1cblx0ICB9O1xuXHQgIHZhciBfY29tcGFyZSA9IGZ1bmN0aW9uIF9jb21wYXJlKGN1cnJlbnQsIG5leHQpIHtcblx0ICAgIHZhciBpID0gMDtcblx0ICAgIHZhciBuID0gMDtcblx0ICAgIHZhciB0bXAgPSAwO1xuXHQgICAgdmFyIG5sID0gMDtcblx0ICAgIHZhciBjbCA9IDA7XG5cblx0ICAgIGlmIChjdXJyZW50ID09PSBuZXh0KSB7XG5cdCAgICAgI
46184HJldHVybiAwO1xuXHQgICAgfSBlbHNlIGlmICgodHlwZW9mIGN1cnJlbnQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGN1cnJlbnQpKSA9PT0gJ29iamVjdCcpIHtcblx0ICAgICAgaWYgKCh0eXBlb2YgbmV4dCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YobmV4dCkpID09PSAnb2JqZWN0Jykge1xuXHQgICAgICAgIGN1cnJlbnQgPSBfb2JqMkFycmF5KGN1cnJlbnQpO1xuXHQgICAgICAgIG5leHQgPSBfb2JqMkFycmF5KG5leHQpO1xuXHQgICAgICAgIGNsID0gY3VycmVudC5sZW5ndGg7XG5cdCAgICAgICAgbmwgPSBuZXh0Lmxlbmd0aDtcblx0ICAgICAgICBpZiAobmwgPiBjbCkge1xuXHQgICAgICAgICAgcmV0dXJuIDE7XG5cdCAgICAgICAgfSBlbHNlIGlmIChubCA8IGNsKSB7XG5cdCAgICAgICAgICByZXR1cm4gLTE7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZvciAoaSA9IDAsIG4gPSBjbDsgaSA8IG47ICsraSkge1xuXHQgICAgICAgICAgdG1wID0gX2NvbXBhcmUoY3VycmVudFtpXSwgbmV4dFtpXSk7XG5cdCAgICAgICAgICBpZiAodG1wID09PSAxKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAxO1xuXHQgICAgICAgICAgfSBlbHNlIGlmICh0bXAgPT09IC0xKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAtMTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIDA7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIC0xO1xuXHQgICAgfSBlbHNlIGlmICgodHlwZW9mIG5leHQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG5leHQpKSA9PT0gJ29iamVjdCcpIHtcblx0ICAgICAgcmV0dXJuIDE7XG5cdCAgICB9IGVsc2UgaWYgKGlzTmFOKG5leHQpICYmICFpc05hTihjdXJyZW50KSkge1xuXHQgICAgICBpZiAoY3VycmVudCA9PT0gMCkge1xuXHQgICAgICAgIHJldHVybiAwO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBjdXJyZW50IDwgMCA/IDEgOiAtMTtcblx0ICAgIH0gZWxzZSBpZiAoaXNOYU4oY3VycmVudCkgJiYgIWlzTmFOKG5leHQpKSB7XG5cdCAgICAgIGlmIChuZXh0ID09PSAwKSB7XG5cdCAgICAgICAgcmV0dXJuIDA7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIG5leHQgPiAwID8gMSA6IC0xO1xuXHQgICAgfVxuXG5cdCAgICBpZiAobmV4dCA9PT0gY3VycmVudCkge1xuXHQgICAgICByZXR1cm4gMDtcblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIG5leHQgPiBjdXJyZW50ID8gMSA6IC0xO1xuXHQgIH07XG5cblx0ICBpZiAoYXJnYyA9PT0gMCkge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKCdBdCBsZWFzdCBvbmUgdmFsdWUgc2hvdWxkIGJlIHBhc3NlZCB0byBtYXgoKScpO1xuXHQgIH0gZWxzZSBpZiAoYXJnYyA9PT0gMSkge1xuXHQgICAgaWYgKF90eXBlb2YoYXJndlswXSkgPT09ICdvYmplY3QnKSB7XG5cdCAgICAgIGFyID0gX29iajJBcnJheShhcmd2WzBdKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcignV3JvbmcgcGFyYW1ldGVyIGNvdW50IGZvciBtYXgoKScpO1xuXHQgICAgfVxuXHQgICAgaWYgKGFyLmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZWxlbWVudCBmb3IgbWF4KCknKTtcblx0ICAgIH1cblx0ICB9IGVsc2Uge1xuXHQgICAgYXIgPSBhcmd2O1xuXHQgIH1cblxuXHQgIHJldFZhbCA9IGFyWzBdO1xuXHQgIGZvciAoaSA9IDEsIG4gPSBhci5sZW5ndGg7IGkgPCBuOyArK2kpIHtcblx0ICAgIGlmIChfY29tcGFyZShyZXRWYWwsIGFyW2ldKSA9PT0gMSkge1xuXHQgICAgICByZXRWYWwgPSBhcltpXTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICByZXR1cm4gcmV0VmFsO1xuXHR9O1xuXHRcblxuLyoqKi8gfSxcbi8qIDEyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbWluKCkge1xuXHQgIC8vICBkaXNjdXNzIGF0OiBodHRwOi8vbG9jdXR1cy5pby9waHAvbWluL1xuXHQgIC8vIG9yaWdpbmFsIGJ5OiBPbm5vIE1hcnNtYW4gKGh0dHBzOi8vdHdpdHRlci5jb20vb25ub21hcnNtYW4pXG5cdCAgLy8gIHJldmlzZWQgYnk6IE9ubm8gTWFyc21hbiAoaHR0cHM6Ly90d2l0dGVyLmNvbS9vbm5vbWFyc21hbilcblx0ICAvLyBpbXByb3ZlZCBieTogSmFja1xuXHQgIC8vICAgICAgbm90ZSAxOiBMb25nIGNvZGUgY2F1c2Ugd2UncmUgYWltaW5nIGZvciBtYXhpbXVtIFBIUCBjb21wYXRpYmlsaXR5XG5cdCAgLy8gICBleGFtcGxlIDE6IG1pbigxLCAzLCA1LCA2LCA3KVxuXHQgIC8vICAgcmV0dXJucyAxOiAxXG5cdCAgLy8gICBleGFtcGxlIDI6IG1pbihbMiwgNCwgNV0pXG5cdCAgLy8gICByZXR1cm5zIDI6IDJcblx0ICAvLyAgIGV4YW1wbGUgMzogbWluKDAsICdoZWxsbycpXG5cdCAgLy8gICByZXR1cm5zIDM6IDBcblx0ICAvLyAgIGV4YW1wbGUgNDogbWluKCdoZWxsbycsIDApXG5cdCAgLy8gICByZXR1cm5zIDQ6ICdoZWxsbydcblx0ICAvLyAgIGV4YW1wbGUgNTogbWluKC0xLCAnaGVsbG8nKVxuXHQgIC8vICAgcmV0dXJucyA1OiAtMVxuXHQgIC8vICAgZXhhbXBsZSA2OiBtaW4oWzIsIDQsIDhdLCBbMiwgNSwgN10pXG5cdCAgLy8gICByZXR1cm5zIDY6IFsyLCA0LCA4XVxuXG5cdCAgdmFyIGFyO1xuXHQgIHZhciByZXRWYWw7XG5cdCAgdmFyIGkgPSAwO1xuXHQgIHZhciBuID0gMDtcblx0ICB2YXIgYXJndiA9IGFyZ3VtZW50cztcblx0ICB2YXIgYXJnYyA9IGFyZ3YubGVuZ3RoO1xuXHQgIHZhciBfb2JqMkFycmF
461845ID0gZnVuY3Rpb24gX29iajJBcnJheShvYmopIHtcblx0ICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgQXJyYXldJykge1xuXHQgICAgICByZXR1cm4gb2JqO1xuXHQgICAgfVxuXHQgICAgdmFyIGFyID0gW107XG5cdCAgICBmb3IgKHZhciBpIGluIG9iaikge1xuXHQgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGkpKSB7XG5cdCAgICAgICAgYXIucHVzaChvYmpbaV0pO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gYXI7XG5cdCAgfTtcblxuXHQgIHZhciBfY29tcGFyZSA9IGZ1bmN0aW9uIF9jb21wYXJlKGN1cnJlbnQsIG5leHQpIHtcblx0ICAgIHZhciBpID0gMDtcblx0ICAgIHZhciBuID0gMDtcblx0ICAgIHZhciB0bXAgPSAwO1xuXHQgICAgdmFyIG5sID0gMDtcblx0ICAgIHZhciBjbCA9IDA7XG5cblx0ICAgIGlmIChjdXJyZW50ID09PSBuZXh0KSB7XG5cdCAgICAgIHJldHVybiAwO1xuXHQgICAgfSBlbHNlIGlmICgodHlwZW9mIGN1cnJlbnQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGN1cnJlbnQpKSA9PT0gJ29iamVjdCcpIHtcblx0ICAgICAgaWYgKCh0eXBlb2YgbmV4dCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YobmV4dCkpID09PSAnb2JqZWN0Jykge1xuXHQgICAgICAgIGN1cnJlbnQgPSBfb2JqMkFycmF5KGN1cnJlbnQpO1xuXHQgICAgICAgIG5leHQgPSBfb2JqMkFycmF5KG5leHQpO1xuXHQgICAgICAgIGNsID0gY3VycmVudC5sZW5ndGg7XG5cdCAgICAgICAgbmwgPSBuZXh0Lmxlbmd0aDtcblx0ICAgICAgICBpZiAobmwgPiBjbCkge1xuXHQgICAgICAgICAgcmV0dXJuIDE7XG5cdCAgICAgICAgfSBlbHNlIGlmIChubCA8IGNsKSB7XG5cdCAgICAgICAgICByZXR1cm4gLTE7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZvciAoaSA9IDAsIG4gPSBjbDsgaSA8IG47ICsraSkge1xuXHQgICAgICAgICAgdG1wID0gX2NvbXBhcmUoY3VycmVudFtpXSwgbmV4dFtpXSk7XG5cdCAgICAgICAgICBpZiAodG1wID09PSAxKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAxO1xuXHQgICAgICAgICAgfSBlbHNlIGlmICh0bXAgPT09IC0xKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAtMTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIDA7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIC0xO1xuXHQgICAgfSBlbHNlIGlmICgodHlwZW9mIG5leHQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG5leHQpKSA9PT0gJ29iamVjdCcpIHtcblx0ICAgICAgcmV0dXJuIDE7XG5cdCAgICB9IGVsc2UgaWYgKGlzTmFOKG5leHQpICYmICFpc05hTihjdXJyZW50KSkge1xuXHQgICAgICBpZiAoY3VycmVudCA9PT0gMCkge1xuXHQgICAgICAgIHJldHVybiAwO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBjdXJyZW50IDwgMCA/IDEgOiAtMTtcblx0ICAgIH0gZWxzZSBpZiAoaXNOYU4oY3VycmVudCkgJiYgIWlzTmFOKG5leHQpKSB7XG5cdCAgICAgIGlmIChuZXh0ID09PSAwKSB7XG5cdCAgICAgICAgcmV0dXJuIDA7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIG5leHQgPiAwID8gMSA6IC0xO1xuXHQgICAgfVxuXG5cdCAgICBpZiAobmV4dCA9PT0gY3VycmVudCkge1xuXHQgICAgICByZXR1cm4gMDtcblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIG5leHQgPiBjdXJyZW50ID8gMSA6IC0xO1xuXHQgIH07XG5cblx0ICBpZiAoYXJnYyA9PT0gMCkge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKCdBdCBsZWFzdCBvbmUgdmFsdWUgc2hvdWxkIGJlIHBhc3NlZCB0byBtaW4oKScpO1xuXHQgIH0gZWxzZSBpZiAoYXJnYyA9PT0gMSkge1xuXHQgICAgaWYgKF90eXBlb2YoYXJndlswXSkgPT09ICdvYmplY3QnKSB7XG5cdCAgICAgIGFyID0gX29iajJBcnJheShhcmd2WzBdKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcignV3JvbmcgcGFyYW1ldGVyIGNvdW50IGZvciBtaW4oKScpO1xuXHQgICAgfVxuXG5cdCAgICBpZiAoYXIubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcignQXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlbGVtZW50IGZvciBtaW4oKScpO1xuXHQgICAgfVxuXHQgIH0gZWxzZSB7XG5cdCAgICBhciA9IGFyZ3Y7XG5cdCAgfVxuXG5cdCAgcmV0VmFsID0gYXJbMF07XG5cblx0ICBmb3IgKGkgPSAxLCBuID0gYXIubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG5cdCAgICBpZiAoX2NvbXBhcmUocmV0VmFsLCBhcltpXSkgPT09IC0xKSB7XG5cdCAgICAgIHJldFZhbCA9IGFyW2ldO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHJldHVybiByZXRWYWw7XG5cdH07XG5cdFxuXG4vKioqLyB9LFxuLyogMTMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0JztcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHN0cmlwX3RhZ3MoaW5wdXQsIGFsbG93ZWQpIHtcblx0ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNhbWVsY2FzZVxuXHQgIC8vICBkaXNjdXNzIGF0OiBodHRwOi8vbG9jdXR1cy5pby9waHAvc3RyaXBfdGFncy9cblx0ICAvLyBvcmlnaW5hbCBieTogS2V2aW4gdmFuIFpvbm5ldmVsZCAoaHR0cDovL2t2ei5pbylcblx0ICAvLyBpbXByb3ZlZCBieTogTHVrZSBHb2RmcmV5XG5cdCAgLy8gaW1wcm92ZWQgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHA6Ly9rdnouaW8pXG5cdCAgLy8gICAgaW5wdXQgYnk6IFB1bFxuXHQgIC8vICAgIGlucHV0IGJ5OiBBbGV4XG5cdCAgLy8gICAgaW5wdXQgYnk6IE1hcmMgUGFsYXVcblx0ICAvLyAgICBpbnB1dCBieTogQnJldHQgWmFtaXIgKGh0dHA6Ly9icmV0dC16YW1pci5tZSlcblx0ICAvLyAgICBpbnB1dCBieTogQm9iYnkgRHJha2Vcblx0ICAvLyAgICBpbnB1dCBieTogRXZlcnRqYW4gR2FycmV0c2VuXG5cdCAgLy8gYnVnZml4ZWQgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHA6Ly9rdnouaW8pXG5cdCAgLy8gYnVnZml4ZWQgYnk6IE9ubm8gTWFyc21hbiAoaHR0cHM6Ly90d2l0dGVyLmNvbS9vbm5vbWFyc21hbilcblx0ICAvLyBidWdmaXhlZCBieTogS2V2aW4gdmFuIFpvbm5ldmVsZCAoaHR0cDovL2t2ei5pbylcblx0ICAvLyBidWdmaXhlZCBieTogS2V2aW4gdmFuIFpvbm5ldmVsZCAoaHR0cDovL2t2ei5pbylcblx0ICAvLyBidWdmaXhlZCBieTogRXJpY
46184yBOYWdlbFxuXHQgIC8vIGJ1Z2ZpeGVkIGJ5OiBLZXZpbiB2YW4gWm9ubmV2ZWxkIChodHRwOi8va3Z6LmlvKVxuXHQgIC8vIGJ1Z2ZpeGVkIGJ5OiBUb21hc3ogV2Vzb2xvd3NraVxuXHQgIC8vICByZXZpc2VkIGJ5OiBSYWZhxYIgS3VrYXdza2kgKGh0dHA6Ly9ibG9nLmt1a2F3c2tpLnBsKVxuXHQgIC8vICAgZXhhbXBsZSAxOiBzdHJpcF90YWdzKCc8cD5LZXZpbjwvcD4gPGJyIC8+PGI+dmFuPC9iPiA8aT5ab25uZXZlbGQ8L2k+JywgJzxpPjxiPicpXG5cdCAgLy8gICByZXR1cm5zIDE6ICdLZXZpbiA8Yj52YW48L2I+IDxpPlpvbm5ldmVsZDwvaT4nXG5cdCAgLy8gICBleGFtcGxlIDI6IHN0cmlwX3RhZ3MoJzxwPktldmluIDxpbWcgc3JjPVwic29tZWltYWdlLnBuZ1wiIG9ubW91c2VvdmVyPVwic29tZUZ1bmN0aW9uKClcIj52YW4gPGk+Wm9ubmV2ZWxkPC9pPjwvcD4nLCAnPHA+Jylcblx0ICAvLyAgIHJldHVybnMgMjogJzxwPktldmluIHZhbiBab25uZXZlbGQ8L3A+J1xuXHQgIC8vICAgZXhhbXBsZSAzOiBzdHJpcF90YWdzKFwiPGEgaHJlZj0naHR0cDovL2t2ei5pbyc+S2V2aW4gdmFuIFpvbm5ldmVsZDwvYT5cIiwgXCI8YT5cIilcblx0ICAvLyAgIHJldHVybnMgMzogXCI8YSBocmVmPSdodHRwOi8va3Z6LmlvJz5LZXZpbiB2YW4gWm9ubmV2ZWxkPC9hPlwiXG5cdCAgLy8gICBleGFtcGxlIDQ6IHN0cmlwX3RhZ3MoJzEgPCA1IDUgPiAxJylcblx0ICAvLyAgIHJldHVybnMgNDogJzEgPCA1IDUgPiAxJ1xuXHQgIC8vICAgZXhhbXBsZSA1OiBzdHJpcF90YWdzKCcxIDxici8+IDEnKVxuXHQgIC8vICAgcmV0dXJucyA1OiAnMSAgMSdcblx0ICAvLyAgIGV4YW1wbGUgNjogc3RyaXBfdGFncygnMSA8YnIvPiAxJywgJzxicj4nKVxuXHQgIC8vICAgcmV0dXJucyA2OiAnMSA8YnIvPiAxJ1xuXHQgIC8vICAgZXhhbXBsZSA3OiBzdHJpcF90YWdzKCcxIDxici8+IDEnLCAnPGJyPjxici8+Jylcblx0ICAvLyAgIHJldHVybnMgNzogJzEgPGJyLz4gMSdcblxuXHQgIC8vIG1ha2luZyBzdXJlIHRoZSBhbGxvd2VkIGFyZyBpcyBhIHN0cmluZyBjb250YWluaW5nIG9ubHkgdGFncyBpbiBsb3dlcmNhc2UgKDxhPjxiPjxjPilcblx0ICBhbGxvd2VkID0gKCgoYWxsb3dlZCB8fCAnJykgKyAnJykudG9Mb3dlckNhc2UoKS5tYXRjaCgvPFthLXpdW2EtejAtOV0qPi9nKSB8fCBbXSkuam9pbignJyk7XG5cblx0ICB2YXIgdGFncyA9IC88XFwvPyhbYS16XVthLXowLTldKilcXGJbXj5dKj4vZ2k7XG5cdCAgdmFyIGNvbW1lbnRzQW5kUGhwVGFncyA9IC88IS0tW1xcc1xcU10qPy0tPnw8XFw/KD86cGhwKT9bXFxzXFxTXSo/XFw/Pi9naTtcblxuXHQgIHJldHVybiBpbnB1dC5yZXBsYWNlKGNvbW1lbnRzQW5kUGhwVGFncywgJycpLnJlcGxhY2UodGFncywgZnVuY3Rpb24gKCQwLCAkMSkge1xuXHQgICAgcmV0dXJuIGFsbG93ZWQuaW5kZXhPZignPCcgKyAkMS50b0xvd2VyQ2FzZSgpICsgJz4nKSA+IC0xID8gJDAgOiAnJztcblx0ICB9KTtcblx0fTtcblx0XG5cbi8qKiovIH0sXG4vKiAxNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc3RydG90aW1lKHRleHQsIG5vdykge1xuXHQgIC8vICBkaXNjdXNzIGF0OiBodHRwOi8vbG9jdXR1cy5pby9waHAvc3RydG90aW1lL1xuXHQgIC8vIG9yaWdpbmFsIGJ5OiBDYWlvIEFyaWVkZSAoaHR0cDovL2NhaW9hcmllZGUuY29tKVxuXHQgIC8vIGltcHJvdmVkIGJ5OiBLZXZpbiB2YW4gWm9ubmV2ZWxkIChodHRwOi8va3Z6LmlvKVxuXHQgIC8vIGltcHJvdmVkIGJ5OiBDYWlvIEFyaWVkZSAoaHR0cDovL2NhaW9hcmllZGUuY29tKVxuXHQgIC8vIGltcHJvdmVkIGJ5OiBBLiBNYXTDrWFzIFF1ZXphZGEgKGh0dHA6Ly9hbWF0aWFzcS5jb20pXG5cdCAgLy8gaW1wcm92ZWQgYnk6IHByZXV0ZXJcblx0ICAvLyBpbXByb3ZlZCBieTogQnJldHQgWmFtaXIgKGh0dHA6Ly9icmV0dC16YW1pci5tZSlcblx0ICAvLyBpbXByb3ZlZCBieTogTWlya28gRmFiZXJcblx0ICAvLyAgICBpbnB1dCBieTogRGF2aWRcblx0ICAvLyBidWdmaXhlZCBieTogV2FnbmVyIEIuIFNvYXJlc1xuXHQgIC8vIGJ1Z2ZpeGVkIGJ5OiBBcnR1ciBUY2hlcm55Y2hldlxuXHQgIC8vIGJ1Z2ZpeGVkIGJ5OiBTdGVwaGFuIELDtnNjaC1QbGVwZWxpdHMgKGh0dHA6Ly9naXRodWIuY29tL3BsZXBlKVxuXHQgIC8vICAgICAgbm90ZSAxOiBFeGFtcGxlcyBhbGwgaGF2ZSBhIGZpeGVkIHRpbWVzdGFtcCB0byBwcmV2ZW50XG5cdCAgLy8gICAgICBub3RlIDE6IHRlc3RzIHRvIGZhaWwgYmVjYXVzZSBvZiB2YXJpYWJsZSB0aW1lKHpvbmVzKVxuXHQgIC8vICAgZXhhbXBsZSAxOiBzdHJ0b3RpbWUoJysxIGRheScsIDExMjk2MzMyMDApXG5cdCAgLy8gICByZXR1cm5zIDE6IDExMjk3MTk2MDBcblx0ICAvLyAgIGV4YW1wbGUgMjogc3RydG90aW1lKCcrMSB3ZWVrIDIgZGF5cyA0IGhvdXJzIDIgc2Vjb25kcycsIDExMjk2MzMyMDApXG5cdCAgLy8gICByZXR1cm5zIDI6IDExMzA0MjUyMDJcblx0ICAvLyAgIGV4YW1wbGUgMzogc3RydG90aW1lKCdsYXN0IG1vbnRoJywgMTEyOTYzMzIwMClcblx0ICAvLyAgIHJldHVybnMgMzogMTEyNzA0MTIwMFxuXHQgIC8vICAgZXhhbXBsZSA0OiBzdHJ0b3RpbWUoJzIwMDktMDUtMDQgMDg6MzA6MDAgR01UJylcblx0ICAvLyAgIHJldHVybnMgNDogMTI0MTQyNTgwMFxuXHQgIC8vICAgZXhhbXBsZSA1OiBzdHJ0b3RpbWUoJzIwMDktMDUtMDQgMDg6MzA6MDArMDAnKVxuXHQgIC8vICAgcmV0dXJucyA1OiAxMjQxNDI1ODAwXG5cdCAgLy8gICBleGFtcGxlIDY6IHN0cnRvdGltZSgnMjAwOS0wNS0wNCAwODozMDowMCswMjowMCcpXG5cdCAgLy8gICByZXR1cm5zIDY6IDEyNDE0MTg2MDBcblx0ICAvLyAgIGV4YW1wbGUgNzogc3RydG90aW1lKCcyMDA5LTA1LTA0VDA4OjMwOjAwWicpXG5cdCAgLy8gICByZXR1cm5zIDc6IDEyNDE0MjU4MDBcblxuXHQgIHZhciBwYXJzZWQ7XG5cdCAgdmFyIG1hdGNoO1xuXHQgIHZhciB0b2RheTtcblx0ICB2YXIgeWVhcjtcblx0ICB2YXIgZGF0ZTtcblx0ICB2YXIgZGF5cztcblx0ICB2YXIgcmFuZ2VzO1xuXHQgIHZhciBsZW47XG5cdCAgdmFyIHRpbWVzO1xuXHQgIHZhciByZWdleDtcblx0ICB2YXIgaTtcblx0ICB2YXIgZmFpbCA9IGZhbHNlO1xuXG5cdCAgaWYgKCF0ZXh0KSB7XG5cdCAgICByZXR1cm4gZmFpbDtcblx0ICB9XG5cblx0ICAvLyBVbmVjZXNzYXJ5IHNwYWNlc1xuXHQgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKS5yZXBsYWNlKC9cXHN7Mix9L2csICcgJykucmVwbGFjZSgvW1xcdFxcclxcbl0vZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cblx0ICAvLyBpbiBjb250cmFzdCB0byBwaHAsIGpzIERhdGUucGFyc2UgZnVuY3Rpb24gaW50ZXJwcmV0czpcblx0ICAvLyBkYXRlcyBnaXZlbiBhcyB5eXl5LW1tLWRkIGFzIGluIHRpbWV6b25lOiBVVEMsXG5cdCAgLy8gZGF0ZXMgd2l0aCBcIi5cIiBvciBcIi1cIiBhcyBNRFkgaW5zdGVhZCBvZiBETVlcblx0ICAvLyBkYXRlcyB3aXRoIHR3by1kaWdpdCB5ZWFycyBkaWZmZXJlbnRseVxuXHQgIC8vIGV0Yy4uLmV0Yy4uLlxuXHQgIC8vIC4uLnRoZXJlZm9yZSB3ZSBtYW51YWxseSBwYXJzZSBsb3RzIG9mIGNvbW1vbiBkYXRlIGZvcm1hdHNcblx0ICB2YXIgcGF0dGVybiA9IG5ldyBSZWdFeHAoWydeKFxcXFxkezEsNH0pJywgJyhbXFxcXC1cXFxcLlxcXFwvOl0pJywgJyhcXFxcZHsxLDJ9KScsICcoW1xcXFwtXFxcXC5cXFxcLzpdKScsICcoXFxcXGR7MSw0fSknLCAnKD86XFxcXHMoXFxcXGR7MSwyfSk6KFxcXFxkezJ9KT86PyhcXFxcZHsyfSk/KT8nLCAnKD86XFxcXHMoW0EtWl0rKT8pPyQnXS5qb2luKCcnKSk7XG5cdCAgbWF0Y2ggPSB0ZXh0Lm1hdGNoKHBhdHRlcm4pO1xuXG5cdCAgaWYgKG1hdGNoICYmIG1hdGNoWzJdID09PSBtYXRjaFs0XSkge1xuXHQgICAgaWYgKG1hdGNoWzFdID4gMTkwMSkge1xuXHQgICAgICBzd2l0Y2ggKG1hdGNoWzJdKSB7XG5cdCAgICAgICAgY2FzZSAnLSc6XG5cdCAgICAgICAgICAvLyBZWVlZLU0tRFxuXHQgICAgICAgICAgaWYgKG1hdGNoWzNdID4gMTIgfHwgbWF0Y2hbNV0gPiAzMSkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFpbDtcblx0ICAgICAgICAgI
46184H1cblxuXHQgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG1hdGNoWzFdLCBwYXJzZUludChtYXRjaFszXSwgMTApIC0gMSwgbWF0Y2hbNV0sIG1hdGNoWzZdIHx8IDAsIG1hdGNoWzddIHx8IDAsIG1hdGNoWzhdIHx8IDAsIG1hdGNoWzldIHx8IDApIC8gMTAwMDtcblx0ICAgICAgICBjYXNlICcuJzpcblx0ICAgICAgICAgIC8vIFlZWVkuTS5EIGlzIG5vdCBwYXJzZWQgYnkgc3RydG90aW1lKClcblx0ICAgICAgICAgIHJldHVybiBmYWlsO1xuXHQgICAgICAgIGNhc2UgJy8nOlxuXHQgICAgICAgICAgLy8gWVlZWS9NL0Rcblx0ICAgICAgICAgIGlmIChtYXRjaFszXSA+IDEyIHx8IG1hdGNoWzVdID4gMzEpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhaWw7XG5cdCAgICAgICAgICB9XG5cblx0ICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShtYXRjaFsxXSwgcGFyc2VJbnQobWF0Y2hbM10sIDEwKSAtIDEsIG1hdGNoWzVdLCBtYXRjaFs2XSB8fCAwLCBtYXRjaFs3XSB8fCAwLCBtYXRjaFs4XSB8fCAwLCBtYXRjaFs5XSB8fCAwKSAvIDEwMDA7XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSBpZiAobWF0Y2hbNV0gPiAxOTAxKSB7XG5cdCAgICAgIHN3aXRjaCAobWF0Y2hbMl0pIHtcblx0ICAgICAgICBjYXNlICctJzpcblx0ICAgICAgICAgIC8vIEQtTS1ZWVlZXG5cdCAgICAgICAgICBpZiAobWF0Y2hbM10gPiAxMiB8fCBtYXRjaFsxXSA+IDMxKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmYWlsO1xuXHQgICAgICAgICAgfVxuXG5cdCAgICAgICAgICByZXR1cm4gbmV3IERhdGUobWF0Y2hbNV0sIHBhcnNlSW50KG1hdGNoWzNdLCAxMCkgLSAxLCBtYXRjaFsxXSwgbWF0Y2hbNl0gfHwgMCwgbWF0Y2hbN10gfHwgMCwgbWF0Y2hbOF0gfHwgMCwgbWF0Y2hbOV0gfHwgMCkgLyAxMDAwO1xuXHQgICAgICAgIGNhc2UgJy4nOlxuXHQgICAgICAgICAgLy8gRC5NLllZWVlcblx0ICAgICAgICAgIGlmIChtYXRjaFszXSA+IDEyIHx8IG1hdGNoWzFdID4gMzEpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhaWw7XG5cdCAgICAgICAgICB9XG5cblx0ICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShtYXRjaFs1XSwgcGFyc2VJbnQobWF0Y2hbM10sIDEwKSAtIDEsIG1hdGNoWzFdLCBtYXRjaFs2XSB8fCAwLCBtYXRjaFs3XSB8fCAwLCBtYXRjaFs4XSB8fCAwLCBtYXRjaFs5XSB8fCAwKSAvIDEwMDA7XG5cdCAgICAgICAgY2FzZSAnLyc6XG5cdCAgICAgICAgICAvLyBNL0QvWVlZWVxuXHQgICAgICAgICAgaWYgKG1hdGNoWzFdID4gMTIgfHwgbWF0Y2hbM10gPiAzMSkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFpbDtcblx0ICAgICAgICAgIH1cblxuXHQgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG1hdGNoWzVdLCBwYXJzZUludChtYXRjaFsxXSwgMTApIC0gMSwgbWF0Y2hbM10sIG1hdGNoWzZdIHx8IDAsIG1hdGNoWzddIHx8IDAsIG1hdGNoWzhdIHx8IDAsIG1hdGNoWzldIHx8IDApIC8gMTAwMDtcblx0ICAgICAgfVxuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgc3dpdGNoIChtYXRjaFsyXSkge1xuXHQgICAgICAgIGNhc2UgJy0nOlxuXHQgICAgICAgICAgLy8gWVktTS1EXG5cdCAgICAgICAgICBpZiAobWF0Y2hbM10gPiAxMiB8fCBtYXRjaFs1XSA+IDMxIHx8IG1hdGNoWzFdIDwgNzAgJiYgbWF0Y2hbMV0gPiAzOCkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFpbDtcblx0ICAgICAgICAgIH1cblxuXHQgICAgICAgICAgeWVhciA9IG1hdGNoWzFdID49IDAgJiYgbWF0Y2hbMV0gPD0gMzggPyArbWF0Y2hbMV0gKyAyMDAwIDogbWF0Y2hbMV07XG5cdCAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgcGFyc2VJbnQobWF0Y2hbM10sIDEwKSAtIDEsIG1hdGNoWzVdLCBtYXRjaFs2XSB8fCAwLCBtYXRjaFs3XSB8fCAwLCBtYXRjaFs4XSB8fCAwLCBtYXRjaFs5XSB8fCAwKSAvIDEwMDA7XG5cdCAgICAgICAgY2FzZSAnLic6XG5cdCAgICAgICAgICAvLyBELk0uWVkgb3IgSC5NTS5TU1xuXHQgICAgICAgICAgaWYgKG1hdGNoWzVdID49IDcwKSB7XG5cdCAgICAgICAgICAgIC8vIEQuTS5ZWVxuXHQgICAgICAgICAgICBpZiAobWF0Y2hbM10gPiAxMiB8fCBtYXRjaFsxXSA+IDMxKSB7XG5cdCAgICAgICAgICAgICAgcmV0dXJuIGZhaWw7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUobWF0Y2hbNV0sIHBhcnNlSW50KG1hdGNoWzNdLCAxMCkgLSAxLCBtYXRjaFsxXSwgbWF0Y2hbNl0gfHwgMCwgbWF0Y2hbN10gfHwgMCwgbWF0Y2hbOF0gfHwgMCwgbWF0Y2hbOV0gfHwgMCkgLyAxMDAwO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgaWYgKG1hdGNoWzVdIDwgNjAgJiYgIW1hdGNoWzZdKSB7XG5cdCAgICAgICAgICAgIC8vIEguTU0uU1Ncblx0ICAgICAgICAgICAgaWYgKG1hdGNoWzFdID4gMjMgfHwgbWF0Y2hbM10gPiA1OSkge1xuXHQgICAgICAgICAgICAgIHJldHVybiBmYWlsO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSwgdG9kYXkuZ2V0RGF0ZSgpLCBtYXRjaFsxXSB8fCAwLCBtYXRjaFszXSB8fCAwLCBtYXRjaFs1XSB8fCAwLCBtYXRjaFs5XSB8fCAwKSAvIDEwMDA7XG5cdCAgICAgICAgICB9XG5cblx0ICAgICAgICAgIC8vIGludmFsaWQgZm9ybWF0LCBjYW5ub3QgYmUgcGFyc2VkXG5cdCAgICAgICAgICByZXR1cm4gZmFpbDtcblx0ICAgICAgICBjYXNlICcvJzpcblx0ICAgICAgICAgIC8vIE0vRC9ZWVxuXHQgICAgICAgICAgaWYgKG1hdGNoWzFdID4gMTIgfHwgbWF0Y2hbM10gPiAzMSB8fCBtYXRjaFs1XSA8IDcwICYmIG1hdGNoWzVdID4gMzgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhaWw7XG5cdCAgICAgICAgICB9XG5cblx0ICAgICAgICAgIHllYXIgPSBtYXRjaFs1XSA+PSAwICYmIG1hdGNoWzVdIDw9IDM4ID8gK21hdGNoWzVdICsgMjAwMCA6IG1hdGNoWzVdO1xuXHQgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIHBhcnNlSW50KG1hdGNoWzFdLCAxMCkgLSAxLCBtYXRjaFszXSwgbWF0Y2hbNl0gfHwgMCwgbWF0Y2hbN10gfHwgMCwgbWF0Y2hbOF0gfHwgMCwgbWF0Y2hbOV0gfHwgMCkgLyAxMDAwO1xuXHQgICAgICAgIGNhc2UgJzonOlxuXHQgICAgICAgICAgLy8gSEg6TU06U1Ncblx0ICAgICAgICAgIGlmIChtYXRjaFsxXSA+IDIzIHx8IG1hdGNoWzNdID4gNTkgfHwgbWF0Y2hbNV0gPiA1OSkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFpbDtcblx0ICAgICAgICAgI
46184H1cblxuXHQgICAgICAgICAgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuXHQgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIHRvZGF5LmdldERhdGUoKSwgbWF0Y2hbMV0gfHwgMCwgbWF0Y2hbM10gfHwgMCwgbWF0Y2hbNV0gfHwgMCkgLyAxMDAwO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgLy8gb3RoZXIgZm9ybWF0cyBhbmQgXCJub3dcIiBzaG91bGQgYmUgcGFyc2VkIGJ5IERhdGUucGFyc2UoKVxuXHQgIGlmICh0ZXh0ID09PSAnbm93Jykge1xuXHQgICAgcmV0dXJuIG5vdyA9PT0gbnVsbCB8fCBpc05hTihub3cpID8gbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwIHwgMCA6IG5vdyB8IDA7XG5cdCAgfVxuXHQgIGlmICghaXNOYU4ocGFyc2VkID0gRGF0ZS5wYXJzZSh0ZXh0KSkpIHtcblx0ICAgIHJldHVybiBwYXJzZWQgLyAxMDAwIHwgMDtcblx0ICB9XG5cdCAgLy8gQnJvd3NlcnMgIT09IENocm9tZSBoYXZlIHByb2JsZW1zIHBhcnNpbmcgSVNPIDg2MDEgZGF0ZSBzdHJpbmdzLCBhcyB0aGV5IGRvXG5cdCAgLy8gbm90IGFjY2VwdCBsb3dlciBjYXNlIGNoYXJhY3RlcnMsIHNwYWNlLCBvciBzaG9ydGVuZWQgdGltZSB6b25lcy5cblx0ICAvLyBUaGVyZWZvcmUsIGZpeCB0aGVzZSBwcm9ibGVtcyBhbmQgdHJ5IGFnYWluLlxuXHQgIC8vIEV4YW1wbGVzOlxuXHQgIC8vICAgMjAxNS0wNC0xNSAyMDozMzo1OSswMlxuXHQgIC8vICAgMjAxNS0wNC0xNSAyMDozMzo1OXpcblx0ICAvLyAgIDIwMTUtMDQtMTV0MjA6MzM6NTkrMDI6MDBcblx0ICBwYXR0ZXJuID0gbmV3IFJlZ0V4cChbJ14oWzAtOV17NH0tWzAtOV17Mn0tWzAtOV17Mn0pJywgJ1sgdF0nLCAnKFswLTldezJ9OlswLTldezJ9OlswLTldezJ9KFxcXFwuWzAtOV0rKT8pJywgJyhbXFxcXCstXVswLTldezJ9KDpbMC05XXsyfSk/fHopJ10uam9pbignJykpO1xuXHQgIG1hdGNoID0gdGV4dC5tYXRjaChwYXR0ZXJuKTtcblx0ICBpZiAobWF0Y2gpIHtcblx0ICAgIC8vIEB0b2RvOiB0aW1lIHpvbmUgaW5mb3JtYXRpb25cblx0ICAgIGlmIChtYXRjaFs0XSA9PT0gJ3onKSB7XG5cdCAgICAgIG1hdGNoWzRdID0gJ1onO1xuXHQgICAgfSBlbHNlIGlmIChtYXRjaFs0XS5tYXRjaCgvXihbKy1dWzAtOV17Mn0pJC8pKSB7XG5cdCAgICAgIG1hdGNoWzRdID0gbWF0Y2hbNF0gKyAnOjAwJztcblx0ICAgIH1cblxuXHQgICAgaWYgKCFpc05hTihwYXJzZWQgPSBEYXRlLnBhcnNlKG1hdGNoWzFdICsgJ1QnICsgbWF0Y2hbMl0gKyBtYXRjaFs0XSkpKSB7XG5cdCAgICAgIHJldHVybiBwYXJzZWQgLyAxMDAwIHwgMDtcblx0ICAgIH1cblx0ICB9XG5cblx0ICBkYXRlID0gbm93ID8gbmV3IERhdGUobm93ICogMTAwMCkgOiBuZXcgRGF0ZSgpO1xuXHQgIGRheXMgPSB7XG5cdCAgICAnc3VuJzogMCxcblx0ICAgICdtb24nOiAxLFxuXHQgICAgJ3R1ZSc6IDIsXG5cdCAgICAnd2VkJzogMyxcblx0ICAgICd0aHUnOiA0LFxuXHQgICAgJ2ZyaSc6IDUsXG5cdCAgICAnc2F0JzogNlxuXHQgIH07XG5cdCAgcmFuZ2VzID0ge1xuXHQgICAgJ3llYSc6ICdGdWxsWWVhcicsXG5cdCAgICAnbW9uJzogJ01vb
46184nRoJyxcblx0ICAgICdkYXknOiAnRGF0ZScsXG5cdCAgICAnaG91JzogJ0hvdXJzJyxcblx0ICAgICdtaW4nOiAnTWludXRlcycsXG5cdCAgICAnc2VjJzogJ1NlY29uZHMnXG5cdCAgfTtcblxuXHQgIGZ1bmN0aW9uIGxhc3ROZXh0KHR5cGUsIHJhbmdlLCBtb2RpZmllcikge1xuXHQgICAgdmFyIGRpZmY7XG5cdCAgICB2YXIgZGF5ID0gZGF5c1tyYW5nZV07XG5cblx0ICAgIGlmICh0eXBlb2YgZGF5ICE9PSAndW5kZWZpbmVkJykge1xuXHQgICAgICBkaWZmID0gZGF5IC0gZGF0ZS5nZXREYXkoKTtcblxuXHQgICAgICBpZiAoZGlmZiA9PT0gMCkge1xuXHQgICAgICAgIGRpZmYgPSA3ICogbW9kaWZpZXI7XG5cdCAgICAgIH0gZWxzZSBpZiAoZGlmZiA+IDAgJiYgdHlwZSA9PT0gJ2xhc3QnKSB7XG5cdCAgICAgICAgZGlmZiAtPSA3O1xuXHQgICAgICB9IGVsc2UgaWYgKGRpZmYgPCAwICYmIHR5cGUgPT09ICduZXh0Jykge1xuXHQgICAgICAgIGRpZmYgKz0gNztcblx0ICAgICAgfVxuXG5cdCAgICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIGRpZmYpO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIGZ1bmN0aW9uIHByb2Nlc3ModmFsKSB7XG5cdCAgICAvLyBAdG9kbzogUmVjb25jaWxlIHRoaXMgd2l0aCByZWdleCB1c2luZyBcXHMsIHRha2luZyBpbnRvIGFjY291bnRcblx0ICAgIC8vIGJyb3dzZXIgaXNzdWVzIHdpdGggc3BsaXQgYW5kIHJlZ2V4ZXNcblx0ICAgIHZhciBzcGx0ID0gdmFsLnNwbGl0KCcgJyk7XG5cdCAgICB2YXIgdHlwZSA9IHNwbHRbMF07XG5cdCAgICB2YXIgcmFuZ2UgPSBzcGx0WzFdLnN1YnN0cmluZygwLCAzKTtcblx0ICAgIHZhciB0eXBlSXNOdW1iZXIgPSAvXFxkKy8udGVzdCh0eXBlKTtcblx0ICAgIHZhciBhZ28gPSBzcGx0WzJdID09PSAnYWdvJztcblx0ICAgIHZhciBudW0gPSAodHlwZSA9PT0gJ2xhc3QnID8gLTEgOiAxKSAqIChhZ28gPyAtMSA6IDEpO1xuXG5cdCAgICBpZiAodHlwZUlzTnVtYmVyKSB7XG5cdCAgICAgIG51bSAqPSBwYXJzZUludCh0eXBlLCAxMCk7XG5cdCAgICB9XG5cblx0ICAgIGlmIChyYW5nZXMuaGFzT3duUHJvcGVydHkocmFuZ2UpICYmICFzcGx0WzFdLm1hdGNoKC9ebW9uKGRheXxcXC4pPyQvaSkpIHtcblx0ICAgICAgcmV0dXJuIGRhdGVbJ3NldCcgKyByYW5nZXNbcmFuZ2VdXShkYXRlWydnZXQnICsgcmFuZ2VzW3JhbmdlXV0oKSArIG51bSk7XG5cdCAgICB9XG5cblx0ICAgIGlmIChyYW5nZSA9PT0gJ3dlZScpIHtcblx0ICAgICAgcmV0dXJuIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIG51bSAqIDcpO1xuXHQgICAgfVxuXG5cdCAgICBpZiAodHlwZSA9PT0gJ25leHQnIHx8IHR5cGUgPT09ICdsYXN0Jykge1xuXHQgICAgICBsYXN0TmV4dCh0eXBlLCByYW5nZSwgbnVtKTtcblx0ICAgIH0gZWxzZSBpZiAoIXR5cGVJc051bWJlcikge1xuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiB0cnVlO1xuXHQgIH1cblxuXHQgIHRpbWVzID0gJyh5ZWFycz98bW9udGhzP3x3ZWVrcz98ZGF5cz98aG91cnM/fG1pbnV0ZXM/fG1pbnxzZWNvbmRzP3xzZWMnICsgJ3xzdW5kYXl8c3VuXFxcXC4/fG1vbmRheXxtb25cXFxcLj98dHVlc2RheXx0dWVcXFxcLj98d2VkbmVzZGF5fHdlZFxcXFwuPycgKyAnfHRodXJzZGF5fHRodVxcXFwuP3xmcmlkYXl8ZnJpXFxcXC4/fHNhdHVyZGF5fHNhdFxcXFwuPyknO1xuXHQgIHJlZ2V4ID0gJyhbKy1dP1xcXFxkK1xcXFxzJyArIHRpbWVzICsgJ3wnICsgJyhsYXN0fG5leHQpXFxcXHMnICsgdGltZXMgKyAnKShcXFxcc2Fnbyk/JztcblxuXHQgIG1hdGNoID0gdGV4dC5tYXRjaChuZXcgUmVnRXhwKHJlZ2V4LCAnZ2knKSk7XG5cdCAgaWYgKCFtYXRjaCkge1xuXHQgICAgcmV0dXJuIGZhaWw7XG5cdCAgfVxuXG5cdCAgZm9yIChpID0gMCwgbGVuID0gbWF0Y2gubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgIGlmICghcHJvY2VzcyhtYXRjaFtpXSkpIHtcblx0ICAgICAgcmV0dXJuIGZhaWw7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpIC8gMTAwMDtcblx0fTtcblx0XG5cbi8qKiovIH0sXG4vKiAxNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGF0ZShmb3JtYXQsIHRpbWVzdGFtcCkge1xuXHQgIC8vICBkaXNjdXNzIGF0OiBodHRwOi8vbG9jdXR1cy5pby9waHAvZGF0ZS9cblx0ICAvLyBvcmlnaW5hbCBieTogQ2FybG9zIFIuIEwuIFJvZHJpZ3VlcyAoaHR0cDovL3d3dy5qc2Zyb21oZWxsLmNvbSlcblx0ICAvLyBvcmlnaW5hbCBieTogZ2V0dGltZW9mZGF5XG5cdCAgLy8gICAgcGFydHMgYnk6IFBldGVyLVBhdWwgS29jaCAoaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9qcy9iZWF0Lmh0bWwpXG5cdCAgLy8gaW1wcm92ZWQgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHA6Ly9rdnouaW8pXG5cdCAgLy8gaW1wcm92ZWQgYnk6IE1lRXRjIChodHRwOi8veWFzcy5tZWV0Y3dlYi5jb20pXG5cdCAgLy8gaW1wcm92ZWQgYnk6IEJyYWQgVG91ZXNuYXJkXG5cdCAgLy8gaW1wcm92ZWQgYnk6IFRpbSBXaWVsXG5cdCAgLy8gaW1wcm92ZWQgYnk6IEJyeWFuIEVsbGlvdHRcblx0ICAvLyBpbXByb3ZlZCBieTogRGF2aWQgUmFuZGFsbFxuXHQgIC8vIGltcHJvdmVkIGJ5OiBUaGVyaWF1bHQgKGh0dHBzOi8vZ2l0aHViLmNvbS9UaGVyaWF1bHQpXG5cdCAgLy8gaW1wcm92ZWQgYnk6IFRoZXJpYXVsdCAoaHR0cHM6Ly9naXRodWIuY29tL1RoZXJpYXVsdClcblx0ICAvLyBpbXByb3ZlZCBieTogQnJldHQgWmFtaXIgKGh0dHA6Ly9icmV0dC16YW1pci5tZSlcblx0ICAvLyBpbXByb3ZlZCBieTogVGhlcmlhdWx0IChodHRwczovL2dpdGh1Yi5jb20vVGhlcmlhdWx0KVxuXHQgIC8vIGltcHJvdmVkIGJ5OiBUaG9tYXMgQmVhdWNvdXJ0IChodHRwOi8vd3d3LndlYmFwcC5mcilcblx0ICAvLyBpbXByb3ZlZCBieTogSlRcblx0ICAvLyBpbXByb3ZlZCBieTogVGhlcmlhdWx0IChodHRwczovL2dpdGh1Yi5jb20vVGhlcmlhdWx0KVxuXHQgIC8vIGltcHJvdmVkIGJ5OiBSYWZhxYIgS3VrYXdza2kgKGh0dHA6Ly9ibG9nLmt1a2F3c2tpLnBsKVxuXHQgIC8vIGltcHJvdmVkIGJ5OiBUaGVyaWF1bHQgKGh0dHBzOi8vZ2l0aHViLmNvbS9UaGVyaWF1bHQpXG5cdCAgLy8gICAgaW5wdXQgYnk6IEJyZXR0IFphbWlyIChodHRwOi8vYnJldHQtemFtaXIubWUpXG5cdCAgLy8gICAgaW5wdXQgYnk6IG1hamFrXG5cdCAgLy8gICAgaW5wdXQgYnk6IEFsZXhcblx0ICAvLyAgICBpbnB1dCBieTogTWFydGluXG5cdCAgLy8gICAgaW5wdXQgYnk6IEFsZXggV2lsc29uXG5cdCAgLy8gICAgaW5wdXQgYnk6IEhhcmF2aWtrXG5cdCAgLy8gYnVnZml4ZWQgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHA6Ly9rdnouaW8pXG5cdCAgLy8gYnVnZml4ZWQgYnk6IG1hamFrXG5cdCAgLy8gYnVnZml4ZWQgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHA6Ly9rdnouaW8pXG5cdCAgLy8gYnVnZml4ZWQgYnk6IEJyZXR0IFphbWlyIChodHRwOi8vYnJldHQtemFtaXIubWUpXG5cdCAgLy8gYnVnZml4ZWQgYnk6IG9taWQgKGh0dHA6Ly9sb2N1dHVzLmlvL3BocC8zODA6MzgwI2NvbW1lbnRfMTM3MTIyKVxuXHQgIC8vIGJ1Z2ZpeGVkIGJ5OiBDaHJpcyAoaHR0cDovL3d3dy5kZXZvdGlzLm5sLylcblx0ICAvLyAgICAgIG5vdGUgMTogVXNlcyBnbG9iYWw6IGxvY3V0dXMgdG8gc3RvcmUgdGhlIGRlZmF1bHQgdGltZXpvbmVcblx0ICAvLyAgICAgIG5vdGUgMTogQWx0aG91Z2ggdGhlIGZ1bmN0aW9uIHBvdGVudGlhbGx5IGFsbG93cyB0aW1lem9uZSBpbmZvXG5cdCAgLy8gICAgICBub3RlIDE6IChzZWUgbm90ZXMpLCBpdCBjdXJyZW50bHkgZG9lcyBub3Qgc2V0XG5cdCAgLy8gICAgICBub3RlIDE6IHBlciBhIHRpbWV6b25lIHNwZWNpZmllZCBieSBkYXRlX2RlZmF1bHRfdGltZXpvbmVfc2V0KCkuIEltcGxlbWVudGVycyBtaWdodCB1c2Vcblx0ICAvLyAgICAgIG5vdGUgMTogJGxvY3V0dXMuY3VycmVudFRpbWV6b25lT2Zmc2V0IGFuZFxuXHQgIC8vICAgICAgbm90ZSAxOiAkbG9jdXR1cy5jdXJyZW50VGltZXpvbmVEU1Qgc2V0IGJ5IHRoYXQgZnVuY3Rpb25cblx0ICAvLyAgICAgIG5vdGUgMTogaW4gb3JkZXIgdG8gYWRqdXN0IHRoZSBkYXRlcyBpbiB0aGlzIGZ1bmN0aW9uXG5cdCAgLy8gICAgICBub3RlIDE6IChvciBvdXIgb3RoZXIgZGF0ZSBmdW5jdGlvbnMhKSBhY2NvcmRpbmdseVxuXHQgIC8vICAgZXhhbXBsZSAxOiBkYXRlKCdIOm06cyBcXFxcbSBcXFxcaVxcXFxzIFxcXFxtXFxcXG9cXFxcblxcXFx0XFxcXGgnLCAxMDYyNDAyNDAwKVxuXHQgIC8vICAgcmV0dXJucyAxOiAnMDc6MDk6NDAgbSBpcyBtb250aCdcblx0ICAvLyAgIGV4YW1wbGUgMjogZGF0ZSgnRiBqLCBZLCBnOmkgYScsIDEwNjI0NjI0MDApXG5cdCAgLy8gICByZXR1cm5zIDI6ICdTZXB0ZW1iZXIgMiwgMjAwMywgMTI6MjYgYW0nXG5cdCAgLy8gICBleGFtcGxlIDM6IGRhdGUoJ1kgVyBvJywgMTA2MjQ2MjQwMClcblx0ICAvLyAgIHJldHVybnMgMzogJzIwMDMgMzYgMjAwMydcblx0ICAvLyAgIGV4YW1wbGUgNDogdmFyICR4ID0gZGF0ZSgnWSBtIGQnLCAobmV3IERhdGUoKSkuZ2V0VGltZSgpIC8gMTAwMClcblx0ICAvLyAgIGV4YW1wbGUgNDogJHggPSAkeCArICcnXG5cdCAgLy8gICBleGFtcGxlIDQ6IHZhciAkcmVzdWx0ID0gJHgubGVuZ3RoIC8vIDIwMDkgMDEgMDlcblx0ICAvLyAgIHJldHVybnMgNDogMTBcblx0ICAvLyAgIGV4YW1wbGUgNTogZGF0ZSgnVycsIDExMDQ1MzQwMDApXG5cdCAgLy8gICByZXR1cm5zIDU6ICc1Midcblx0ICAvLyAgIGV4YW1wbGUgNjogZGF0ZSgnQiB0JywgMTEwNDUzNDAwMClcblx0ICAvLyAgIHJldHVybnMgNjogJzk5OSAzMSdcblx0ICAvLyAgIGV4YW1wbGUgNzogZGF0ZSgnVyBVJywgMTI5Mzc1MDAwMC44Mik7IC8vIDIwMTAtMTItMzFcblx0ICAvLyAgIHJldHVybnMgNzogJzUyIDEyOTM3NTAwMDAnXG5cdCAgLy8gICBleGFtcGxlIDg6IGRhdGUoJ1cnLCAxMjkzODM2NDAwKTsgLy8gMjAxMS0wMS0wMVxuXHQgIC8vICAgcmV0dXJucyA4OiAnNTInXG5cdCAgLy8gICBleGFtcGxlIDk6IGRhdGUoJ1cgWS1tLWQnLCAxMjkzOTc0MDU0KTsgLy8gMjAxMS0wMS0wMlxuXHQgIC8vICAgcmV0dXJucyA5OiAnNTIgMjAxMS0wMS0wMidcblx0ICAvLyAgICAgICAgdGVzdDogc2tpcC0xIHNraXAtMiBza2lwLTVcblxuXHQgIHZhciBqc2RhdGUsIGY7XG5cdCAgLy8gS2VlcCB0aGlzIGhlcmUgKHdvcmtzLCBidXQgZm9yIGNvZGUgY29tbWVudGVkLW91dCBiZWxvdyBmb3IgZmlsZSBzaXplIHJlYXNvbnMpXG5cdCAgLy8gdmFyIHRhbD0gW107XG5cdCAgdmFyIHR4dFdvcmRzID0gWydTdW4nLCA
46184nTW9uJywgJ1R1ZXMnLCAnV2VkbmVzJywgJ1RodXJzJywgJ0ZyaScsICdTYXR1cicsICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ107XG5cdCAgLy8gdHJhaWxpbmcgYmFja3NsYXNoIC0+IChkcm9wcGVkKVxuXHQgIC8vIGEgYmFja3NsYXNoIGZvbGxvd2VkIGJ5IGFueSBjaGFyYWN0ZXIgKGluY2x1ZGluZyBiYWNrc2xhc2gpIC0+IHRoZSBjaGFyYWN0ZXJcblx0ICAvLyBlbXB0eSBzdHJpbmcgLT4gZW1wdHkgc3RyaW5nXG5cdCAgdmFyIGZvcm1hdENociA9IC9cXFxcPyguPykvZ2k7XG5cdCAgdmFyIGZvcm1hdENockNiID0gZnVuY3Rpb24gZm9ybWF0Q2hyQ2IodCwgcykge1xuXHQgICAgcmV0dXJuIGZbdF0gPyBmW3RdKCkgOiBzO1xuXHQgIH07XG5cdCAgdmFyIF9wYWQgPSBmdW5jdGlvbiBfcGFkKG4sIGMpIHtcblx0ICAgIG4gPSBTdHJpbmcobik7XG5cdCAgICB3aGlsZSAobi5sZW5ndGggPCBjKSB7XG5cdCAgICAgIG4gPSAnMCcgKyBuO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIG47XG5cdCAgfTtcblx0ICBmID0ge1xuXHQgICAgLy8gRGF5XG5cdCAgICBkOiBmdW5jdGlvbiBkKCkge1xuXHQgICAgICAvLyBEYXkgb2YgbW9udGggdy9sZWFkaW5nIDA7IDAxLi4zMVxuXHQgICAgICByZXR1cm4gX3BhZChmLmooKSwgMik7XG5cdCAgICB9LFxuXHQgICAgRDogZnVuY3Rpb24gRCgpIHtcblx0ICAgICAgLy8gU2hvcnRoYW5kIGRheSBuYW1lOyBNb24uLi5TdW5cblx0ICAgICAgcmV0dXJuIGYubCgpLnNsaWNlKDAsIDMpO1xuXHQgICAgfSxcblx0ICAgIGo6IGZ1bmN0aW9uIGooKSB7XG5cdCAgICAgIC8vIERheSBvZiBtb250aDsgMS4uMzFcblx0ICAgICAgcmV0dXJuIGpzZGF0ZS5nZXREYXRlKCk7XG5cdCAgICB9LFxuXHQgICAgbDogZnVuY3Rpb24gbCgpIHtcblx0ICAgICAgLy8gRnVsbCBkYXkgbmFtZTsgTW9uZGF5Li4uU3VuZGF5XG5cdCAgICAgIHJldHVybiB0eHRXb3Jkc1tmLncoKV0gKyAnZGF5Jztcblx0ICAgIH0sXG5cdCAgICBOOiBmdW5jdGlvbiBOKCkge1xuXHQgICAgICAvLyBJU08tODYwMSBkYXkgb2Ygd2VlazsgMVtNb25dLi43W1N1bl1cblx0ICAgICAgcmV0dXJuIGYudygpIHx8IDc7XG5cdCAgICB9LFxuXHQgICAgUzogZnVuY3Rpb24gUygpIHtcblx0ICAgICAgLy8gT3JkaW5hbCBzdWZmaXggZm9yIGRheSBvZiBtb250aDsgc3QsIG5kLCByZCwgdGhcblx0ICAgICAgdmFyIGogPSBmLmooKTtcblx0ICAgICAgdmFyIGkgPSBqICUgMTA7XG5cdCAgICAgIGlmIChpIDw9IDMgJiYgcGFyc2VJbnQoaiAlIDEwMCAvIDEwLCAxMCkgPT09IDEpIHtcblx0ICAgICAgICBpID0gMDtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gWydzdCcsICduZCcsICdyZCddW2kgLSAxXSB8fCAndGgnO1xuXHQgICAgfSxcblx0ICAgIHc6IGZ1bmN0aW9uIHcoKSB7XG5cdCAgICAgIC8vIERheSBvZiB3ZWVrOyAwW1N1bl0uLjZbU2F0XVxuXHQgICAgICByZXR1cm4ganNkYXRlLmdldERheSgpO1xuXHQgICAgfSxcblx0ICAgIHo6IGZ1bmN0aW9uIHooKSB7XG5cdCAgICAgIC8vIERheSBvZiB5ZWFyOyAwLi4zNjVcblx0ICAgICAgdmFyIGEgPSBuZXcgRGF0ZShmLlkoKSwgZi5uKCkgLSAxLCBmLmooKSk7XG5cdCAgICAgIHZhciBiID0gbmV3IERhdGUoZi5ZKCksIDAsIDEpO1xuXHQgICAgICByZXR1cm4gTWF0aC5yb3VuZCgoYSAtIGIpIC8gODY0ZTUpO1xuXHQgICAgfSxcblxuXHQgICAgLy8gV2Vla1xuXHQgICAgVzogZnVuY3Rpb24gVygpIHtcblx0ICAgICAgLy8gSVNPLTg2MDEgd2VlayBudW1iZXJcblx0ICAgICAgdmFyIGEgPSBuZXcgRGF0ZShmLlkoKSwgZi5uKCkgLSAxLCBmLmooKSAtIGYuTigpICsgMyk7XG5cdCAgICAgIHZhciBiID0gbmV3IERhdGUoYS5nZXRGdWxsWWVhcigpLCAwLCA0KTtcblx0ICAgICAgcmV0dXJuIF9wYWQoMSArIE1hdGgucm91bmQoKGEgLSBiKSAvIDg2NGU1IC8gNyksIDIpO1xuXHQgICAgfSxcblxuXHQgICAgLy8gTW9udGhcblx0ICAgIEY6IGZ1bmN0aW9uIEYoKSB7XG5cdCAgICAgIC8vIEZ1bGwgbW9udGggbmFtZTsgSmFudWFyeS4uLkRlY2VtYmVyXG5cdCAgICAgIHJldHVybiB0eHRXb3Jkc1s2ICsgZi5uKCldO1xuXHQgICAgfSxcblx0ICAgIG06IGZ1bmN0aW9uIG0oKSB7XG5cdCAgICAgIC8vIE1vbnRoIHcvbGVhZGluZyAwOyAwMS4uLjEyXG5cdCAgICAgIHJldHVybiBfcGFkKGYubigpLCAyKTtcblx0ICAgIH0sXG5cdCAgICBNOiBmdW5jdGlvbiBNKCkge1xuXHQgICAgICAvLyBTaG9ydGhhbmQgbW9udGggbmFtZTsgSmFuLi4uRGVjXG5cdCAgICAgIHJldHVybiBmLkYoKS5zbGljZSgwLCAzKTtcblx0ICAgIH0sXG5cdCAgICBuOiBmdW5jdGlvbiBuKCkge1xuXHQgICAgICAvLyBNb250aDsgMS4uLjEyXG5cdCAgICAgIHJldHVybiBqc2RhdGUuZ2V0TW9udGgoKSArIDE7XG5cdCAgICB9LFxuXHQgICAgdDogZnVuY3Rpb24gdCgpIHtcblx0ICAgICAgLy8gRGF5cyBpbiBtb250aDsgMjguLi4zMVxuXHQgICAgICByZXR1cm4gbmV3IERhdGUoZi5ZKCksIGYubigpLCAwKS5nZXREYXRlKCk7XG5cdCAgICB9LFxuXG5cdCAgICAvLyBZZWFyXG5cdCAgICBMOiBmdW5jdGlvbiBMKCkge1xuXHQgICAgICAvLyBJcyBsZWFwIHllYXI/OyAwIG9yIDFcblx0ICAgICAgdmFyIGogPSBmLlkoKTtcblx0ICAgICAgcmV0dXJuIGogJSA0ID09PSAwICYgaiAlIDEwMCAhPT0gMCB8IGogJSA0MDAgPT09IDA7XG5cdCAgICB9LFxuXHQgICAgbzogZnVuY3Rpb24gbygpIHtcblx0ICAgICAgLy8gSVNPLTg2MDEgeWVhclxuXHQgICAgICB2YXIgbiA9IGYubigpO1xuXHQgICAgICB2YXIgVyA9IGYuVygpO1xuXHQgICAgICB2YXIgWSA9IGYuWSgpO1xuXHQgICAgICByZXR1cm4gWSArIChuID09PSAxMiAmJiBXIDwgOSA/IDEgOiBuID09PSAxICYmIFcgPiA5ID8gLTEgOiAwKTtcblx0ICAgIH0sXG5cdCAgICBZOiBmdW5jdGlvbiBZKCkge1xuXHQgICAgICAvLyBGdWxsIHllYXI7IGUuZy4gMTk4MC4uLjIwMTBcblx0ICAgICAgcmV0dXJuIGpzZGF0ZS5nZXRGdWxsWWVhcigpO1xuXHQgICAgfSxcblx0ICAgIHk6IGZ1bmN0aW9uIHkoKSB7XG5cdCAgICAgIC8vIExhc3QgdHdvIGRpZ2l0cyBvZiB5ZWFyOyAwMC4uLjk5XG5cdCAgICAgI
46184HJldHVybiBmLlkoKS50b1N0cmluZygpLnNsaWNlKC0yKTtcblx0ICAgIH0sXG5cblx0ICAgIC8vIFRpbWVcblx0ICAgIGE6IGZ1bmN0aW9uIGEoKSB7XG5cdCAgICAgIC8vIGFtIG9yIHBtXG5cdCAgICAgIHJldHVybiBqc2RhdGUuZ2V0SG91cnMoKSA+IDExID8gJ3BtJyA6ICdhbSc7XG5cdCAgICB9LFxuXHQgICAgQTogZnVuY3Rpb24gQSgpIHtcblx0ICAgICAgLy8gQU0gb3IgUE1cblx0ICAgICAgcmV0dXJuIGYuYSgpLnRvVXBwZXJDYXNlKCk7XG5cdCAgICB9LFxuXHQgICAgQjogZnVuY3Rpb24gQigpIHtcblx0ICAgICAgLy8gU3dhdGNoIEludGVybmV0IHRpbWU7IDAwMC4uOTk5XG5cdCAgICAgIHZhciBIID0ganNkYXRlLmdldFVUQ0hvdXJzKCkgKiAzNmUyO1xuXHQgICAgICAvLyBIb3Vyc1xuXHQgICAgICB2YXIgaSA9IGpzZGF0ZS5nZXRVVENNaW51dGVzKCkgKiA2MDtcblx0ICAgICAgLy8gTWludXRlc1xuXHQgICAgICAvLyBTZWNvbmRzXG5cdCAgICAgIHZhciBzID0ganNkYXRlLmdldFVUQ1NlY29uZHMoKTtcblx0ICAgICAgcmV0dXJuIF9wYWQoTWF0aC5mbG9vcigoSCArIGkgKyBzICsgMzZlMikgLyA4Ni40KSAlIDFlMywgMyk7XG5cdCAgICB9LFxuXHQgICAgZzogZnVuY3Rpb24gZygpIHtcblx0ICAgICAgLy8gMTItSG91cnM7IDEuLjEyXG5cdCAgICAgIHJldHVybiBmLkcoKSAlIDEyIHx8IDEyO1xuXHQgICAgfSxcblx0ICAgIEc6IGZ1bmN0aW9uIEcoKSB7XG5cdCAgICAgIC8vIDI0LUhvdXJzOyAwLi4yM1xuXHQgICAgICByZXR1cm4ganNkYXRlLmdldEhvdXJzKCk7XG5cdCAgICB9LFxuXHQgICAgaDogZnVuY3Rpb24gaCgpIHtcblx0ICAgICAgLy8gMTItSG91cnMgdy9sZWFkaW5nIDA7IDAxLi4xMlxuXHQgICAgICByZXR1cm4gX3BhZChmLmcoKSwgMik7XG5cdCAgICB9LFxuXHQgICAgSDogZnVuY3Rpb24gSCgpIHtcblx0ICAgICAgLy8gMjQtSG91cnMgdy9sZWFkaW5nIDA7IDAwLi4yM1xuXHQgICAgICByZXR1cm4gX3BhZChmLkcoKSwgMik7XG5cdCAgICB9LFxuXHQgICAgaTogZnVuY3Rpb24gaSgpIHtcblx0ICAgICAgLy8gTWludXRlcyB3L2xlYWRpbmcgMDsgMDAuLjU5XG5cdCAgICAgIHJldHVybiBfcGFkKGpzZGF0ZS5nZXRNaW51dGVzKCksIDIpO1xuXHQgICAgfSxcblx0ICAgIHM6IGZ1bmN0aW9uIHMoKSB7XG5cdCAgICAgIC8vIFNlY29uZHMgdy9sZWFkaW5nIDA7IDAwLi41OVxuXHQgICAgICByZXR1cm4gX3BhZChqc2RhdGUuZ2V0U2Vjb25kcygpLCAyKTtcblx0ICAgIH0sXG5cdCAgICB1OiBmdW5jdGlvbiB1KCkge1xuXHQgICAgICAvLyBNaWNyb3NlY29uZHM7IDAwMDAwMC05OTkwMDBcblx0ICAgICAgcmV0dXJuIF9wYWQoanNkYXRlLmdldE1pbGxpc2Vjb25kcygpICogMTAwMCwgNik7XG5cdCAgICB9LFxuXG5cdCAgICAvLyBUaW1lem9uZVxuXHQgICAgZTogZnVuY3Rpb24gZSgpIHtcblx0ICAgICAgLy8gVGltZXpvbmUgaWRlbnRpZmllcjsgZS5nLiBBdGxhbnRpYy9Bem9yZXMsIC4uLlxuXHQgICAgICAvLyBUaGUgZm9sbG93aW5nIHdvcmtzLCBidXQgcmVxdWlyZXMgaW5jbHVzaW9uIG9mIHRoZSB2ZXJ5IGxhcmdlXG5cdCAgICAgIC8vIHRpbWV6b25lX2FiYnJldmlhdGlvbnNfbGlzdCgpIGZ1bmN0aW9uLlxuXHQgICAgICAvKiAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuZGF0ZV9kZWZhdWx0X3RpbWV6b25lX2dldCgpO1xuXHQgICAgICAgKi9cblx0ICAgICAgdmFyIG1zZyA9ICdOb3Qgc3VwcG9ydGVkIChzZWUgc291cmNlIGNvZGUgb2YgZGF0ZSgpIGZvciB0aW1lem9uZSBvbiBob3cgdG8gYWRkIHN1cHBvcnQpJztcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG5cdCAgICB9LFxuXHQgICAgSTogZnVuY3Rpb24gSSgpIHtcblx0ICAgICAgLy8gRFNUIG9ic2VydmVkPzsgMCBvciAxXG5cdCAgICAgIC8vIENvbXBhcmVzIEphbiAxIG1pbnVzIEphbiAxIFVUQyB0byBKdWwgMSBtaW51cyBKdWwgMSBVVEMuXG5cdCAgICAgIC8vIElmIHRoZXkgYXJlIG5vdCBlcXVhbCwgdGhlbiBEU1QgaXMgb2JzZXJ2ZWQuXG5cdCAgICAgIHZhciBhID0gbmV3IERhdGUoZi5ZKCksIDApO1xuXHQgICAgICAvLyBKYW4gMVxuXHQgICAgICB2YXIgYyA9IERhdGUuVVRDKGYuWSgpLCAwKTtcblx0ICAgICAgLy8gSmFuIDEgVVRDXG5cdCAgICAgIHZhciBiID0gbmV3IERhdGUoZi5ZKCksIDYpO1xuXHQgICAgICAvLyBKdWwgMVxuXHQgICAgICAvLyBKdWwgMSBVVENcblx0ICAgICAgdmFyIGQgPSBEYXRlLlVUQyhmLlkoKSwgNik7XG5cdCAgICAgIHJldHVybiBhIC0gYyAhPT0gYiAtIGQgPyAxIDogMDtcblx0ICAgIH0sXG5cdCAgICBPOiBmdW5jdGlvbiBPKCkge1xuXHQgICAgICAvLyBEaWZmZXJlbmNlIHRvIEdNVCBpbiBob3VyIGZvcm1hdDsgZS5nLiArMDIwMFxuXHQgICAgICB2YXIgdHpvID0ganNkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG5cdCAgICAgIHZhciBhID0gTWF0aC5hYnModHpvKTtcblx0ICAgICAgcmV0dXJuICh0em8gPiAwID8gJy0nIDogJysnKSArIF9wYWQoTWF0aC5mbG9vcihhIC8gNjApICogMTAwICsgYSAlIDYwLCA0KTtcblx0ICAgIH0sXG5cdCAgICBQOiBmdW5jdGlvbiBQKCkge1xuXHQgICAgICAvLyBEaWZmZXJlbmNlIHRvIEdNVCB3L2NvbG9uOyBlLmcuICswMjowMFxuXHQgICAgICB2YXIgTyA9IGYuTygpO1xuXHQgICAgICByZXR1cm4gTy5zdWJzdHIoMCwgMykgKyAnOicgKyBPLnN1YnN0cigzLCAyKTtcblx0ICAgIH0sXG5cdCAgICBUOiBmdW5jdGlvbiBUKCkge1xuXHQgICAgICAvLyBUaGUgZm9sbG93aW5nIHdvcmtzLCBidXQgcmVxdWlyZXMgaW5jbHVzaW9uIG9mIHRoZSB2ZXJ5XG5cdCAgICAgIC8vIGxhcmdlIHRpbWV6b25lX2FiYnJldmlhdGlvbnNfbGlzdCgpIGZ1bmN0aW9uLlxuXHQgICAgICAvKiAgICAgICAgICAgICAgdmFyIGFiYnIsIGksIG9zLCBfZGVmYXVsdDtcblx0ICAgICAgaWYgKCF0YWwubGVuZ3RoKSB7XG5cdCAgICAgICAgdGFsID0gdGhhdC50aW1lem9uZV9hYmJyZXZpYXRpb25zX2xpc3QoKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoJGxvY3V0dXMgJiYgJGxvY3V0dXMuZGVmYXVsdF90aW1lem9uZSkge1xuXHQgICAgICAgIF9kZWZhdWx0ID0gJGxvY3V0dXMuZGVmYXVsdF90aW1lem9uZTtcblx0ICAgICAgICBmb3IgKGFiYnIgaW4gdGFsKSB7XG5cdCAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGFsW2FiYnJdLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIGlmICh0YWxbYWJicl1baV0udGltZXpvbmVfaWQgPT09IF9kZWZhdWx0KSB7XG5cdCAgICAgICAgICAgICAgcmV0dXJuIGFiYnIudG9VcHBlckNhc2UoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgfVxuXHQgICAgICAgI
46184H1cblx0ICAgICAgfVxuXHQgICAgICBmb3IgKGFiYnIgaW4gdGFsKSB7XG5cdCAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhbFthYmJyXS5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgb3MgPSAtanNkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MDtcblx0ICAgICAgICAgIGlmICh0YWxbYWJicl1baV0ub2Zmc2V0ID09PSBvcykge1xuXHQgICAgICAgICAgICByZXR1cm4gYWJici50b1VwcGVyQ2FzZSgpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICAqL1xuXHQgICAgICByZXR1cm4gJ1VUQyc7XG5cdCAgICB9LFxuXHQgICAgWjogZnVuY3Rpb24gWigpIHtcblx0ICAgICAgLy8gVGltZXpvbmUgb2Zmc2V0IGluIHNlY29uZHMgKC00MzIwMC4uLjUwNDAwKVxuXHQgICAgICByZXR1cm4gLWpzZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpICogNjA7XG5cdCAgICB9LFxuXG5cdCAgICAvLyBGdWxsIERhdGUvVGltZVxuXHQgICAgYzogZnVuY3Rpb24gYygpIHtcblx0ICAgICAgLy8gSVNPLTg2MDEgZGF0ZS5cblx0ICAgICAgcmV0dXJuICdZLW0tZFxcXFxUSDppOnNQJy5yZXBsYWNlKGZvcm1hdENociwgZm9ybWF0Q2hyQ2IpO1xuXHQgICAgfSxcblx0ICAgIHI6IGZ1bmN0aW9uIHIoKSB7XG5cdCAgICAgIC8vIFJGQyAyODIyXG5cdCAgICAgIHJldHVybiAnRCwgZCBNIFkgSDppOnMgTycucmVwbGFjZShmb3JtYXRDaHIsIGZvcm1hdENockNiKTtcblx0ICAgIH0sXG5cdCAgICBVOiBmdW5jdGlvbiBVKCkge1xuXHQgICAgICAvLyBTZWNvbmRzIHNpbmNlIFVOSVggZXBvY2hcblx0ICAgICAgcmV0dXJuIGpzZGF0ZSAvIDEwMDAgfCAwO1xuXHQgICAgfVxuXHQgIH07XG5cblx0ICB2YXIgX2RhdGUgPSBmdW5jdGlvbiBfZGF0ZShmb3JtYXQsIHRpbWVzdGFtcCkge1xuXHQgICAganNkYXRlID0gdGltZXN0YW1wID09PSB1bmRlZmluZWQgPyBuZXcgRGF0ZSgpIC8vIE5vdCBwcm92aWRlZFxuXHQgICAgOiB0aW1lc3RhbXAgaW5zdGFuY2VvZiBEYXRlID8gbmV3IERhdGUodGltZXN0YW1wKSAvLyBKUyBEYXRlKClcblx0ICAgIDogbmV3IERhdGUodGltZXN0YW1wICogMTAwMCkgLy8gVU5JWCB0aW1lc3RhbXAgKGF1dG8tY29udmVydCB0byBpbnQpXG5cdCAgICA7XG5cdCAgICByZXR1cm4gZm9ybWF0LnJlcGxhY2UoZm9ybWF0Q2hyLCBmb3JtYXRDaHJDYik7XG5cdCAgfTtcblxuXHQgIHJldHVybiBfZGF0ZShmb3JtYXQsIHRpbWVzdGFtcCk7XG5cdH07XG5cdFxuXG4vKioqLyB9LFxuLyogMTYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0JztcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJvb2x2YWwobWl4ZWRWYXIpIHtcblx0ICAvLyBvcmlnaW5hbCBieTogV2lsbCBSb3dlXG5cdCAgLy8gICBleGFtcGxlIDE6IGJvb2x2YWwodHJ1ZSlcblx0ICAvLyAgIHJldHVybnMgMTogdHJ1ZVxuXHQgIC8vICAgZXhhbXBsZSAyOiBib29sdmFsKGZhbHNlKVxuXHQgIC8vICAgcmV0dXJucyAyOiBmYWxzZVxuXHQgIC8vICAgZXhhbXBsZSAzOiBib29sdmFsKDApXG5cdCAgLy8gICByZXR1cm5zIDM6IGZhbHNlXG5cdCAgLy8gICBleGFtcGxlIDQ6IGJvb2x2YWwoMC4wKVxuXHQgIC8vICAgcmV0dXJucyA0OiBmYWxzZVxuXHQgIC8vICAgZXhhbXBsZSA1OiBib29sdmFsKCcnKVxuXHQgIC8vICAgcmV0dXJucyA1OiBmYWxzZVxuXHQgIC8vICAgZXhhbXBsZSA2OiBib29sdmFsKCcwJylcblx0ICAvLyAgIHJldHVybnMgNjogZmFsc2Vcblx0ICAvLyAgIGV4YW1wbGUgNzogYm9vbHZhbChbXSlcblx0ICAvLyAgIHJldHVybnMgNzogZmFsc2Vcblx0ICAvLyAgIGV4YW1wbGUgODogYm9vbHZhbCgnJylcblx0ICAvLyAgIHJldHVybnMgODogZmFsc2Vcblx0ICAvLyAgIGV4YW1wbGUgOTogYm9vbHZhbChudWxsKVxuXHQgIC8vICAgcmV0dXJucyA5OiBmYWxzZVxuXHQgIC8vICAgZXhhbXBsZSAxMDogYm9vbHZhbCh1bmRlZmluZWQpXG5cdCAgLy8gICByZXR1cm5zIDEwOiBmYWxzZVxuXHQgIC8vICAgZXhhbXBsZSAxMTogYm9vbHZhbCgndHJ1ZScpXG5cdCAgLy8gICByZXR1cm5zIDExOiB0cnVlXG5cblx0ICBpZiAobWl4ZWRWYXIgPT09IGZhbHNlKSB7XG5cdCAgICByZXR1cm4gZmFsc2U7XG5cdCAgfVxuXG5cdCAgaWYgKG1peGVkVmFyID09PSAwIHx8IG1peGVkVmFyID09PSAwLjApIHtcblx0ICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cblx0ICBpZiAobWl4ZWRWYXIgPT09ICcnIHx8IG1peGVkVmFyID09PSAnMCcpIHtcblx0ICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cblx0ICBpZiAoQXJyYXkuaXNBcnJheShtaXhlZFZhcikgJiYgbWl4ZWRWYXIubGVuZ3RoID09PSAwKSB7XG5cdCAgICByZXR1cm4gZmFsc2U7XG5cdCAgfVxuXG5cdCAgaWYgKG1peGVkVmFyID09PSBudWxsIHx8IG1peGVkVmFyID09PSB1bmRlZmluZWQpIHtcblx0ICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cblx0ICByZXR1cm4gdHJ1ZTtcblx0fTtcblx0XG5cbi8qKiovIH0sXG4vKiAxNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihUd2lnKSB7XG5cdCAgICAndXNlIHN0cmljdCc7XG5cblx0ICAgIFR3aWcuVGVtcGxhdGVzLnJlZ2lzdGVyTG9hZGVyKCdhamF4JywgZnVuY3Rpb24obG9jYXRpb24sIHBhcmFtcywgY2FsbGJhY2ssIGVycm9yX2NhbGxiYWNrKSB7XG5cdCAgICAgICAgdmFyIHRlbXBsYXRlLFxuXHQgICAgICAgICAgICB4bWxodHRwLFxuXHQgICAgICAgICAgICBwcmVjb21waWxlZCA9IHBhcmFtcy5wcmVjb21waWxlZCxcblx0ICAgICAgICAgICAgcGFyc2VyID0gdGhpcy5wYXJzZXJzW3BhcmFtcy5wYXJzZXJdIHx8IHRoaXMucGFyc2VyLnR3aWc7XG5cblx0ICAgICAgICBpZiAodHlwZW9mIFhNTEh0dHBSZXF1
46184ZXN0ID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdCAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKCdVbnN1cHBvcnRlZCBwbGF0Zm9ybTogVW5hYmxlIHRvIGRvIGFqYXggcmVxdWVzdHMgJyArXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZWNhdXNlIHRoZXJlIGlzIG5vIFwiWE1MSFRUUFJlcXVlc3RcIiBpbXBsZW1lbnRhdGlvbicpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHhtbGh0dHAgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblx0ICAgICAgICB4bWxodHRwLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICB2YXIgZGF0YSA9IG51bGw7XG5cblx0ICAgICAgICAgICAgaWYoeG1saHR0cC5yZWFkeVN0YXRlID09PSA0KSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoeG1saHR0cC5zdGF0dXMgPT09IDIwMCB8fCAod2luZG93LmNvcmRvdmEgJiYgeG1saHR0cC5zdGF0dXMgPT0gMCkpIHtcblx0ICAgICAgICAgICAgICAgICAgICBUd2lnLmxvZy5kZWJ1ZyhcIkdvdCB0ZW1wbGF0ZSBcIiwgeG1saHR0cC5yZXNwb25zZVRleHQpO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHByZWNvbXBpbGVkID09PSB0cnVlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHhtbGh0dHAucmVzcG9uc2VUZXh0KTtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0geG1saHR0cC5yZXNwb25zZVRleHQ7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnVybCA9IGxvY2F0aW9uO1xuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5kYXRhID0gZGF0YTtcblxuXHQgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gcGFyc2VyLmNhbGwodGhpcywgcGFyYW1zKTtcblxuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodGVtcGxhdGUpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlcnJvcl9jYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jYWxsYmFjayh4bWxodHRwKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9O1xuXHQgICAgICAgIHhtbGh0dHAub3BlbihcIkdFVFwiLCBsb2NhdGlvbiwgISFwYXJhbXMuYXN5bmMpO1xuXHQgICAgICAgIHhtbGh0dHAuc2VuZCgpO1xuXG5cdCAgICAgICAgaWYgKHBhcmFtcy5hc3luYykge1xuXHQgICAgICAgICAgICAvLyBUT0RPOiByZXR1cm4gZGVmZXJyZWQgcHJvbWlzZVxuXHQgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0fTtcblxuXG4vKioqLyB9LFxuLyogMTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oVHdpZykge1xuXHQgICAgJ3VzZSBzdHJpY3QnO1xuXG5cdCAgICB2YXIgZnMsIHBhdGg7XG5cblx0ICAgIHRyeSB7XG5cdCAgICBcdC8vIHJlcXVpcmUgbGliIGRlcGVuZGVuY2llcyBhdCBydW50aW1lXG5cdCAgICBcdGZzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSk7XG5cdCAgICBcdHBhdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTtcblx0ICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgIFx0Ly8gTk9URTogdGhpcyBpcyBpbiBhIHRyeS9jYXRjaCB0byBhdm9pZCBlcnJvcnMgY3Jvc3MgcGxhdGZvcm1cblx0ICAgIH1cblxuXHQgICAgVHdpZy5UZW1wbGF0ZXMucmVnaXN0ZXJMb2FkZXIoJ2ZzJywgZnVuY3Rpb24obG9jYXRpb24sIHBhcmFtcywgY2FsbGJhY2ssIGVycm9yX2NhbGxiYWNrKSB7XG5cdCAgICAgICAgdmFyIHRlbXBsYXRlLFxuXHQgICAgICAgICAgICBkYXRhID0gbnVsbCxcblx0ICAgICAgICAgICAgcHJlY29tcGlsZWQgPSBwYXJhbXMucHJlY29tcGlsZWQsXG5cdCAgICAgICAgICAgIHBhcnNlciA9IHRoaXMucGFyc2Vyc1twYXJhbXMucGFyc2VyXSB8fCB0aGlzLnBhcnNlci50d2lnO1xuXG5cdCAgICAgICAgaWYgKCFmcyB8fCAhcGF0aCkge1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcignVW5zdXBwb3J0ZWQgcGxhdGZvcm06IFVuYWJsZSB0byBsb2FkIGZyb20gZmlsZSAnICtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JlY2F1c2UgdGhlcmUgaXMgbm8gXCJmc1wiIG9yIFwicGF0aFwiIGltcGxlbWVudGF0aW9uJyk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgdmFyIGxvYWRUZW1wbGF0ZUZuID0gZnVuY3Rpb24oZXJyLCBkYXRhKSB7XG5cdCAgICAgICAgICAgIGlmIChlcnIpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXJyb3JfY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICBlcnJvcl9jYWxsYmFjayhlcnIpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgaWYgKHByZWNvbXBpbGVkID09PSB0cnVlKSB7XG5cdCAgICAgICAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHBhcmFtcy5kYXRhID0gZGF0YTtcblx0ICAgICAgICAgICAgcGFyYW1zLnBhdGggPSBwYXJhbXMucGF0aCB8fCBsb2NhdGlvbjtcblxuXHQgICAgICAgICAgICAvLyB0ZW1wbGF0ZSBpcyBpbiBkYXRhXG5cdCAgICAgICAgICAgIHRlbXBsYXRlID0gcGFyc2VyLmNhbGwodGhpcywgcGFyYW1zKTtcblxuXHQgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICBjYWxsYmFjayh0
46184ZW1wbGF0ZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9O1xuXHQgICAgICAgIHBhcmFtcy5wYXRoID0gcGFyYW1zLnBhdGggfHwgbG9jYXRpb247XG5cblx0ICAgICAgICBpZiAocGFyYW1zLmFzeW5jKSB7XG5cdCAgICAgICAgICAgIGZzLnN0YXQocGFyYW1zLnBhdGgsIGZ1bmN0aW9uIChlcnIsIHN0YXRzKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoZXJyIHx8ICFzdGF0cy5pc0ZpbGUoKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXJyb3JfY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY2FsbGJhY2sobmV3IFR3aWcuRXJyb3IoJ1VuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGZpbGUgJyArIHBhcmFtcy5wYXRoKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGZzLnJlYWRGaWxlKHBhcmFtcy5wYXRoLCAndXRmOCcsIGxvYWRUZW1wbGF0ZUZuKTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIC8vIFRPRE86IHJldHVybiBkZWZlcnJlZCBwcm9taXNlXG5cdCAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoIWZzLnN0YXRTeW5jKHBhcmFtcy5wYXRoKS5pc0ZpbGUoKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKCdVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBmaWxlICcgKyBwYXJhbXMucGF0aCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoJ1VuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGZpbGUgJyArIHBhcmFtcy5wYXRoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBkYXRhID0gZnMucmVhZEZpbGVTeW5jKHBhcmFtcy5wYXRoLCAndXRmOCcpO1xuXHQgICAgICAgICAgICBsb2FkVGVtcGxhdGVGbih1bmRlZmluZWQsIGRhdGEpO1xuXHQgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGVcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiAxOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnNcIik7XG5cbi8qKiovIH0sXG4vKiAyMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicGF0aFwiKTtcblxuLyoqKi8gfSxcbi8qIDIxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyAjIyB0d2lnLmxvZ2ljLmpzXG5cdC8vXG5cdC8vIFRoaXMgZmlsZSBoYW5kbGVzIHRva2VuaXppbmcsIGNvbXBpbGluZyBhbmQgcGFyc2luZyBsb2dpYyB0b2tlbnMuIHslIC4uLiAlfVxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUd2lnKSB7XG5cdCAgICBcInVzZSBzdHJpY3RcIjtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBOYW1lc3BhY2UgZm9yIGxvZ2ljIGhhbmRsaW5nLlxuXHQgICAgICovXG5cdCAgICBUd2lnLmxvZ2ljID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogTG9naWMgdG9rZW4gdHlwZXMuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcubG9naWMudHlwZSA9IHtcblx0ICAgICAgICBpZl86ICAgICAgICdUd2lnLmxvZ2ljLnR5cGUuaWYnLFxuXHQgICAgICAgIGVuZGlmOiAgICAgJ1R3aWcubG9naWMudHlwZS5lbmRpZicsXG5cdCAgICAgICAgZm9yXzogICAgICAnVHdpZy5sb2dpYy50eXBlLmZvcicsXG5cdCAgICAgICAgZW5kZm9yOiAgICAnVHdpZy5sb2dpYy50eXBlLmVuZGZvcicsXG5cdCAgICAgICAgZWxzZV86ICAgICAnVHdpZy5sb2dpYy50eXBlLmVsc2UnLFxuXHQgICAgICAgIGVsc2VpZjogICAgJ1R3aWcubG9naWMudHlwZS5lbHNlaWYnLFxuXHQgICAgICAgIHNldDogICAgICAgJ1R3aWcubG9naWMudHlwZS5zZXQnLFxuXHQgICAgICAgIHNldGNhcHR1cmU6J1R3aWcubG9naWMudHlwZS5zZXRjYXB0dXJlJyxcblx0ICAgICAgICBlbmRzZXQ6ICAgICdUd2lnLmxvZ2ljLnR5cGUuZW5kc2V0Jyxcblx0ICAgICAgICBmaWx0ZXI6ICAgICdUd2lnLmxvZ2ljLnR5cGUuZmlsdGVyJyxcblx0ICAgICAgICBlbmRmaWx0ZXI6ICdUd2lnLmxvZ2ljLnR5cGUuZW5kZmlsdGVyJyxcblx0ICAgICAgICBzaG9ydGJsb2NrOiAnVHdpZy5sb2dpYy50eXBlLnNob3J0YmxvY2snLFxuXHQgICAgICAgIGJsb2NrOiAgICAgJ1R3aWcubG9naWMudHlwZS5ibG9jaycsXG5cdCAgICAgICAgZW5kYmxvY2s6ICAnVHdpZy5sb2dpYy50eXBlLmVuZGJsb2NrJyxcblx0ICAgICAgICBleHRlbmRzXzogICdUd2lnLmxvZ2ljLnR5cGUuZXh0ZW5kcycsXG5cdCAgICAgICAgdXNlOiAgICAgICAnVHdpZy5sb2dpYy50eXBlLnVzZScsXG5cdCAgICAgICAgaW5jbHVkZTogICAnVHdpZy5sb2dpYy50eXBlLmluY2x1ZGUnLFxuXHQgICAgICAgIHNwYWNlbGVzczogJ1R3aWcubG9naWMudHlwZS5zcGFjZWxlc3MnLFxuXHQgICAgICAgIGVuZHNwYWNlbGVzczogJ1R3aWcubG9naWMudHlwZS5lbmRzcGFjZWxlc3MnLFxuXHQgICAgICAgIG1hY3JvOiAgICAgJ1R3aWcubG9naWMudHlwZS5tYWNybycsXG5cdCAgICAgICAgZW5kbWFjcm86ICAnVHdpZy5sb2dpYy50eXBlLmVuZG1hY3JvJyxcblx0ICAgICAgICBpbXBvcnRfOiAgICdUd2lnLmxvZ2ljLnR5cGUuaW1wb3J0Jyxcblx0ICAgICAgICBmcm9tOiAgICAgICdUd2lnLmxvZ2ljLnR5cGUuZnJvbScsXG5cdCAgICAgICAgZW1iZWQ6ICAgICAnVHdpZy5sb2dpYy50eXBlLmVtYmVkJyxcblx0ICAgICAgICBlbmRlbWJlZDogICdUd2lnLmxvZ2ljLnR5cGUuZW5kZW1iZWQnXG5cdCAgICB9O1xuXG5cblx0ICAgIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGhhbmRsaW5nIGxvZ2ljIHRva2Vucy5cblx0ICAgIC8vXG5cdCAgICAvLyBQcm9wZXJ0aWVzOlxuXHQgICAgLy9cblx0ICAgIC8vICAgICAgdHlwZTogIFRoZSB0eXBlIG9mIGV4cHJlc3Npb24gdGhpcyBtYXRjaGVzXG5cdCAgICAvL1xuXHQgICAgLy8gICAgICByZWdleDogQSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtY
46184XRjaGVzIHRoZSBmb3JtYXQgb2YgdGhlIHRva2VuXG5cdCAgICAvL1xuXHQgICAgLy8gICAgICBuZXh0OiAgV2hhdCBsb2dpYyB0b2tlbnMgKGlmIGFueSkgcG9wIHRoaXMgdG9rZW4gb2ZmIHRoZSBsb2dpYyBzdGFjay4gSWYgZW1wdHksIHRoZVxuXHQgICAgLy8gICAgICAgICAgICAgbG9naWMgdG9rZW4gaXMgYXNzdW1lZCB0byBub3QgcmVxdWlyZSBhbiBlbmQgdGFnIGFuZCBpc24ndCBwdXNoIG9udG8gdGhlIHN0YWNrLlxuXHQgICAgLy9cblx0ICAgIC8vICAgICAgb3BlbjogIERvZXMgdGhpcyB0YWcgb3BlbiBhIGxvZ2ljIGV4cHJlc3Npb24gb3IgaXMgaXQgc3RhbmRhbG9uZS4gRm9yIGV4YW1wbGUsXG5cdCAgICAvLyAgICAgICAgICAgICB7JSBlbmRpZiAlfSBjYW5ub3QgZXhpc3Qgd2l0aG91dCBhbiBvcGVuaW5nIHslIGlmIC4uLiAlfSB0YWcsIHNvIG9wZW4gPSBmYWxzZS5cblx0ICAgIC8vXG5cdCAgICAvLyAgRnVuY3Rpb25zOlxuXHQgICAgLy9cblx0ICAgIC8vICAgICAgY29tcGlsZTogQSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgY29tcGlsaW5nIHRoZSB0b2tlbiBpbnRvIGFuIG91dHB1dCB0b2tlbiByZWFkeSBmb3Jcblx0ICAgIC8vICAgICAgICAgICAgICAgcGFyc2luZyB3aXRoIHRoZSBwYXJzZSBmdW5jdGlvbi5cblx0ICAgIC8vXG5cdCAgICAvLyAgICAgIHBhcnNlOiAgIEEgZnVuY3Rpb24gdGhhdCBwYXJzZXMgdGhlIGNvbXBpbGVkIHRva2VuIGludG8gb3V0cHV0IChIVE1MIC8gd2hhdGV2ZXIgdGhlXG5cdCAgICAvLyAgICAgICAgICAgICAgIHRlbXBsYXRlIHJlcHJlc2VudHMpLlxuXHQgICAgVHdpZy5sb2dpYy5kZWZpbml0aW9ucyA9IFtcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBJZiB0eXBlIGxvZ2ljIHRva2Vucy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogIEZvcm1hdDogeyUgaWYgZXhwcmVzc2lvbiAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLmlmXyxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eaWZcXHMrKFtcXHNcXFNdKykkLyxcblx0ICAgICAgICAgICAgbmV4dDogW1xuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2dpYy50eXBlLmVsc2VfLFxuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2dpYy50eXBlLmVsc2VpZixcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9naWMudHlwZS5lbmRpZlxuXHQgICAgICAgICAgICBdLFxuXHQgICAgICAgICAgICBvcGVuOiB0cnVlLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gdG9rZW4ubWF0Y2hbMV07XG5cdCAgICAgICAgICAgICAgICAvLyBDb21waWxlIHRoZSBleHByZXNzaW9uLlxuXHQgICAgICAgICAgICAgICAgdG9rZW4uc3RhY2sgPSBUd2lnLmV4cHJlc3Npb24uY29tcGlsZS5hcHBseSh0aGlzLCBbe1xuXHQgICAgICAgICAgICAgICAgICAgIHR5cGU6ICBUd2lnLmV4cHJlc3Npb24udHlwZS5leHByZXNzaW9uLFxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBleHByZXNzaW9uXG5cdCAgICAgICAgICAgICAgICB9XSkuc3RhY2s7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodG9rZW4sIGNvbnRleHQsIGNoYWluKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgdGhhdCA9IHRoaXM7XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLmV4cHJlc3Npb24ucGFyc2VBc3luYy5hcHBseSh0aGlzLCBbdG9rZW4uc3RhY2ssIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY2hhaW4gPSB0cnVlO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKFR3aWcubGliLmJvb2x2YWwocmVzdWx0KSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjaGFpbiA9IGZhbHNlO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLnBhcnNlQXN5bmMuYXBwbHkodGhhdCwgW3Rva2VuLm91dHB1dCwgY29udGV4dF0pO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcblx0ICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihvdXRwdXQpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjaGFpbjogY2hhaW4sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogb3V0cHV0XG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBFbHNlIGlmIHR5cGUgbG9naWMgdG9rZW5zLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgRm9ybWF0OiB7JSBlbHNlaWYgZXhwcmVzc2lvbiAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLmVsc2VpZixcblx0ICAgICAgICAgICAgcmVnZXg6IC9eZWxzZWlmXFxzKyhbXlxcc10uKikkLyxcblx0ICAgICAgICAgICAgbmV4dDogW1xuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2dpYy50eXBlLmVsc2VfLFxuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2dpYy50eXBlLmVsc2VpZixcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9naWMudHlwZS5lbmRpZlxuXHQgICAgICAgICAgICBdLFxuXHQgICAgICAgICAgICBvcGVuOiBmYWxzZSxcblx0ICAgICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgZXhwcmVzc2lvbiA9IHRva2VuLm1hdGNoWzFdO1xuXHQgICAgICAgICAgICAgICAgLy8gQ29tcGlsZSB0aGUgZXhwcmVzc2lvbi5cblx0ICAgICAgICAgICAgICAgIHRva2VuLnN0YWNrID0gVHdpZy5leHByZXNzaW9uLmNvbXBpbGUuYXBwbHkodGhpcywgW3tcblx0ICAgICAgICAgICAgICAgICAgICB0eXBlOiAgVHdpZy5leHByZXNzaW9uLnR5cGUuZXhwcmVzc2lvbixcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZXhwcmVzc2lvblxuXHQgICAgICAgICAgICAgICAgfV0pLnN0YWNrO1xuXHQgICAgICAgICAgICAgICAgZGVsZXRlIHRva2VuLm1hdGNoO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBwYXJzZTogZnVuY3Rpb24gKHRva2VuLCBjb250ZXh0LCBjaGFpbikge1xuXHQgICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5leHByZXNzaW9uLnBhcnNlQXN5bmMuYXBwbHkodGhpcywgW3Rva2VuLnN0YWNrLCBjb250ZXh0XSlcblx0ICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChjaGFpbiAmJiBUd2lnLmxpYi5ib29sdmFsKHJlc3VsdCkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW4gPSBmYWxzZTtcblxuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5wYXJzZUFzeW5jLmFwcGx5KHRoYXQsIFt0b2tlbi5vdXRwdXQsIGNvbnRleHRdKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG5cdCAgICAgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ob3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW46IGNoYWluLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IG91dHB1dFxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBFbHNlIGlmIHR5cGUgbG9naWMgdG9rZW5zLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgRm9ybWF0OiB7JSBlbHNlaWYgZXhwcmVzc2lvbiAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLmVsc2VfLFxuXHQgICAgICAgICAgICByZWdleDogL15lbHNlJC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFtcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9naWMudHlwZS5lbmRpZixcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9naWMudHlwZS5lbmRmb3Jcblx0ICAgICAgICAgICAgXSxcblx0ICAgICAgICAgICAgb3BlbjogZmFsc2UsXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodG9rZW4sIGNvbnRleHQsIGNoYWluKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgcHJvbWlzZSA9IFR3aWcuUHJvbWlzZS5yZXNvbHZlKCcnKTtcblxuXHQgICAgICAgICAgICAgICAgaWYgKGNoYWluKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IFR3aWcucGFyc2VBc3luYy5hcHBseSh0aGlzLCBbdG9rZW4ub3V0cHV0LCBjb250ZXh0XSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oZnVuY3Rpb24ob3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW46IGNoYWluLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IG91dHB1dFxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogRW5kIGlmIHR5cGUgbG9naWMgdG9rZW5zLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgRm9ybWF0OiB7JSBlbmRpZiAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLmVuZGlmLFxuXHQgICAgICAgICAgICByZWdleDogL15lbmRpZiQvLFxuXHQgICAgICAgICAgICBuZXh0OiBbIF0sXG5cdCAgICAgICAgICAgIG9wZW46IGZhbHNlXG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBGb3IgdHlwZSBsb2dpYyB0b2tlbnMuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICBGb3JtYXQ6IHslIGZvciBleHByZXNzaW9uICV9XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUuZm9yXyxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eZm9yXFxzKyhbYS16QS1aMC05XyxcXHNdKylcXHMraW5cXHMrKFteXFxzXS4qPykoPzpcXHMraWZcXHMrKFteXFxzXS4qKSk/JC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFtcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9naWMudHlwZS5lbHNlXyxcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9naWMudHlwZS5lbmRmb3Jcblx0ICAgICAgICAgICAgXSxcblx0ICAgICAgICAgICAgb3BlbjogdHJ1ZSxcblx0ICAgICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIga2V5X3ZhbHVlID0gdG9rZW4ubWF0Y2hbMV0sXG5cdCAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IHRva2VuLm1hdGNoWzJdLFxuXHQgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsID0gdG9rZW4ubWF0Y2hbM10sXG5cdCAgICAgICAgICAgICAgICAgICAga3Zfc3BsaXQgPSBudWxsO1xuXG5cdCAgICAgICAgICAgICAgICB0b2tlbi5rZXlfdmFyID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlX3ZhciA9IG51bGw7XG5cblx0ICAgICAgICAgICAgICAgIGlmIChrZXlfdmFsdWUuaW5kZXhPZihcIixcIikgPj0gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGt2X3NwbGl0ID0ga2V5X3ZhbHVlLnNwbGl0KCcsJyk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGt2X3NwbGl0Lmxlbmd0aCA9PT0gMikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5rZXlfdmFyID0ga3Zfc3BsaXRbMF0udHJpbSgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZV92YXIgPSBrdl9zcGxpdFsxXS50cmltKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJJbnZhbGlkIGV4cHJlc3Npb24gaW4gZm9yIGxvb3A6IFwiICsga2V5X3ZhbHVlKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlX3ZhciA9IGtleV92YWx1ZTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gVmFsaWQgZXhwcmVzc2lvbnMgZm9yIGEgZm9yIGxvb3Bcblx0ICAgICAgICAgICAgICAgIC8vICAgZm9yIGl0ZW0gICAgIGluIGV4cHJlc3Npb25cblx0ICAgICAgICAgICAgICAgIC8vICAgZm9yIGtleSxpdGVtIGluIGV4cHJlc3Npb25cblxuXHQgICAgICAgICAgICAgICAgLy8gQ29tcGlsZSB0aGUgZXhwcmVzc2lvbi5cblx0ICAgICAgICAgICAgICAgIHRva2VuLmV4cHJlc3Npb24gPSBUd2lnLmV4cHJlc3Npb24uY29tcGlsZS5hcHBseSh0aGlzLCBbe1xuXHQgICAgICAgICAgICAgICAgICAgIHR5cGU6ICBUd2lnLmV4cHJlc3Npb24udHlwZS5leHByZXNzaW9uLFxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBleHByZXNzaW9uXG5cdCAgICAgICAgICAgICAgICB9XSkuc3RhY2s7XG5cblx0ICAgICAgICAgICAgICAgIC8vIENvbXBpbGUgdGhlIGNvbmRpdGlvbmFsIChpZiBhdmFpbGFibGUpXG5cdCAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uYWwpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0b2tlbi5jb25kaXRpb25hbCA9IFR3aWcuZXhwcmVzc2lvbi5jb21waWxlLmFwcGx5KHRoaXMsIFt7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICBUd2lnLmV4cHJlc3Npb24udHlwZS5leHByZXNzaW9uLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY29uZGl0aW9uYWxcblx0ICAgICAgICAgICAgICAgICAgICB9XSkuc3RhY2s7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5tYXRjaDtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uICh0b2tlbiwgY29udGV4dCwgY29udGludWVfY2hhaW4pIHtcblx0ICAgICAgICAgICAgICAgIC8vIFBhcnNlIGV4cHJlc3Npb25cblx0ICAgICAgICAgICAgICAgIHZhciBvdXRwdXQgPSBbXSxcblx0ICAgICAgICAgICAgICAgICAgICBsZW4sXG5cdCAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAwLFxuXHQgICAgICAgICAgICAgICAgICAgIGtleXNldCxcblx0ICAgICAgICAgICAgICAgICAgICB0aGF0ID0gdGhpcyxcblx0ICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25hbCA9IHRva2VuLmNvbmRpdGlvbmFsLFxuXHQgICAgICAgICAgICAgICAgICAgIGJ1aWxkTG9vcCA9IGZ1bmN0aW9uKGluZGV4LCBsZW4pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzQ29uZGl0aW9uYWwgPSBjb25kaXRpb25hbCAhPT0gdW5kZWZpbmVkO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4KzEsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDA6IGluZGV4LFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2aW5kZXg6IGlzQ29uZGl0aW9uYWw/dW5kZWZpbmVkOmxlbi1pbmRleCxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmluZGV4MDogaXNDb25kaXRpb25hbD91bmRlZmluZWQ6bGVuLWluZGV4LTEsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdDogKGluZGV4ID09PSAwKSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Q6IGlzQ29uZGl0aW9uYWw/dW5kZWZpbmVkOihpbmRleCA9PT0gbGVuLTEpLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBpc0NvbmRpdGlvbmFsP3VuZGVmaW5lZDpsZW4sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGNvbnRleHRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgICAgICAgIC8vIHJ1biBvbmNlIGZvciBlYWNoIGl0ZXJhdGlvbiBvZiB0aGUgbG9vcFxuXHQgICAgICAgICAgICAgICAgICAgIGxvb3AgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbm5lcl9jb250ZXh0ID0gVHdpZy5DaGlsZENvbnRleHQoY29udGV4dCk7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJfY29udGV4dFt0b2tlbi52YWx1ZV92YXJdID0gdmFsdWU7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLmtleV92YXIpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyX2NvbnRleHRbdG9rZW4ua2V5X3Zhcl0gPSBrZXk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgI
46184H1cblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb29wIG9iamVjdFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBpbm5lcl9jb250ZXh0Lmxvb3AgPSBidWlsZExvb3AoaW5kZXgsIGxlbik7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSBjb25kaXRpb25hbCA9PT0gdW5kZWZpbmVkID9cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aWcuUHJvbWlzZS5yZXNvbHZlKHRydWUpIDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jLmFwcGx5KHRoYXQsIFtjb25kaXRpb25hbCwgaW5uZXJfY29udGV4dF0pO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbihjb25kaXRpb24pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29uZGl0aW9uKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcucGFyc2VBc3luYy5hcHBseSh0aGF0LCBbdG9rZW4ub3V0cHV0LCBpbm5lcl9jb250ZXh0XSlcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKG8pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChvKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVsZXRlIGxvb3AtcmVsYXRlZCB2YXJpYWJsZXMgZnJvbSB0aGUgY29udGV4dFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGlubmVyX2NvbnRleHRbJ2xvb3AnXTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpbm5lcl9jb250ZXh0W3Rva2VuLnZhbHVlX3Zhcl07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgaW5uZXJfY29udGV4dFt0b2tlbi5rZXlfdmFyXTtcblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVyZ2UgaW4gdmFsdWVzIHRoYXQgZXhpc3QgaW4gY29udGV4dCBidXQgaGF2ZSBjaGFuZ2VkXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBpbm5lcl9jb250ZXh0LlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpZy5tZXJnZShjb250ZXh0LCBpbm5lcl9jb250ZXh0LCB0cnVlKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblxuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5leHByZXNzaW9uLnBhcnNlQXN5bmMuYXBwbHkodGhpcywgW3Rva2VuLmV4cHJlc3Npb24sIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKFR3aWcubGliLmlzKCdBcnJheScsIHJlc3VsdCkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gcmVzdWx0Lmxlbmd0aDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgVHdpZy5hc3luYy5mb3JFYWNoKHJlc3VsdCwgZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
46184XIga2V5ID0gaW5kZXg7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb29wKGtleSwgdmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFR3aWcubGliLmlzKCdPYmplY3QnLCByZXN1bHQpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuX2tleXMgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c2V0ID0gcmVzdWx0Ll9rZXlzO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c2V0ID0gT2JqZWN0LmtleXMocmVzdWx0KTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBrZXlzZXQubGVuZ3RoO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBUd2lnLmZvckVhY2goa2V5c2V0LCBmdW5jdGlvbihrZXkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSB0aGUgX2tleXMgcHJvcGVydHksIGl0J3MgaW50ZXJuYWwgdG8gdHdpZy5qc1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gXCJfa2V5c1wiKSByZXR1cm47XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3Aoa2V5LCAgcmVzdWx0W2tleV0pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGFsbG93IGVsc2Ugc3RhdGVtZW50cyBpZiBubyBvdXRwdXQgd2FzIGdlbmVyYXRlZFxuXHQgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlX2NoYWluID0gKG91dHB1dC5sZW5ndGggPT09IDApO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW46IGNvbnRpbnVlX2NoYWluLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IFR3aWcub3V0cHV0LmFwcGx5KHRoYXQsIFtvdXRwdXRdKVxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogRW5kIGlmIHR5cGUgbG9naWMgdG9rZW5zLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgRm9ybWF0OiB7JSBlbmRpZiAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLmVuZGZvcixcblx0ICAgICAgICAgICAgcmVnZXg6IC9eZW5kZm9yJC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFsgXSxcblx0ICAgICAgICAgICAgb3BlbjogZmFsc2Vcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIFNldCB0eXBlIGxvZ2ljIHRva2Vucy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogIEZvcm1hdDogeyUgc2V0IGtleSA9IGV4cHJlc3Npb24gJX1cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcubG9naWMudHlwZS5zZXQsXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXnNldFxccysoW2EtekEtWjAtOV8sXFxzXSspXFxzKj1cXHMqKFtcXHNcXFNdKykkLyxcblx0ICAgICAgICAgICAgbmV4dDogWyBdLFxuXHQgICAgICAgICAgICBvcGVuOiB0cnVlLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgIHZhciBrZXkgPSB0b2tlbi5tYXRjaFsxXS50cmltKCksXG5cdCAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IHRva2VuLm1hdGNoWzJdLFxuXHQgICAgICAgICAgICAgICAgICAgIC8vIENvbXBpbGUgdGhlIGV4cHJlc3Npb24uXG5cdCAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl9zdGFjayAgPSBUd2lnLmV4cHJlc3Npb24uY29tcGlsZS5hcHBseSh0aGlzLCBbe1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgVHdpZy5leHByZXNzaW9uLnR5cGUuZXhwcmVzc2lvbixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGV4cHJlc3Npb25cblx0ICAgICAgICAgICAgICAgICAgICB9XSkuc3RhY2s7XG5cblx0ICAgICAgICAgICAgICAgIHRva2VuLmtleSA9IGtleTtcblx0ICAgICAgICAgICAgICAgIHRva2VuLmV4cHJlc3Npb24gPSBleHByZXNzaW9uX3N0YWNrO1xuXG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodG9rZW4sIGNvbnRleHQsIGNvbnRpbnVlX2NoYWluKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIga2V5ID0gdG9rZW4ua2V5O1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5leHByZXNzaW9uLnBhcnNlQXN5bmMuYXBwbHkodGhpcywgW3Rva2VuLmV4cHJlc3Npb24sIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IGNvbnRleHQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLyogIElmIHN0b3JpbmcgdGhlIGNvbnRleHQgaW4gYSB2YXJpYWJsZSwgaXQgbmVlZHMgdG8gYmUgYSBjbG9uZSBvZiB0aGUgY3VycmVudCBzdGF0ZSBvZiBjb250ZXh0LlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIHdlIGhhdmUgYSBjb250ZXh0IHdpdGggaW5maW5pdGUgcmVjdXJzaW9uLlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4ZXMgIzM0MVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFR3aWcubGliLmNvcHkodmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIGNvbnRleHRba2V5XSA9IHZhbHVlO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW46IGNvbnRpbnVlX2NoYWluLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0XG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBTZXQgY2FwdHVyZSB0eXBlIGxvZ2ljIHRva2Vucy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogIEZvcm1hdDogeyUgc2V0IGtleSAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLnNldGNhcHR1cmUsXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXnNldFxccysoW2EtekEtWjAtOV8sXFxzXSspJC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFtcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9naWMudHlwZS5lbmRzZXRcblx0ICAgICAgICAgICAgXSxcblx0ICAgICAgICAgICAgb3BlbjogdHJ1ZSxcblx0ICAgICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIga2V5ID0gdG9rZW4ubWF0Y2hbMV0udHJpbSgpO1xuXG5cdCAgICAgICAgICAgICAgICB0b2tlbi5rZXkgPSBrZXk7XG5cblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5tYXRjaDtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uICh0b2tlbiwgY29udGV4dCwgY29udGludWVfY2hhaW4pIHtcblx0ICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcblx0ICAgICAgICAgICAgICAgICAgICBrZXkgPSB0b2tlbi5rZXk7XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLnBhcnNlQXN5bmMuYXBwbHkodGhpcywgW3Rva2VuLm91dHB1dCwgY29udGV4dF0pXG5cdCAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIHNldCBvbiBib3RoIHRoZSBnbG9iYWwgYW5kIGxvY2FsIGNvbnRleHRcblx0ICAgICAgICAgICAgICAgICAgICB0aGF0LmNvbnRleHRba2V5XSA9IHZhbHVlO1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnRleHRba2V5XSA9IHZhbHVlO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW46IGNvbnRpbnVlX2NoYWluLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0XG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBFbmQgc2V0IHR5cGUgYmxvY2sgbG9naWMgdG9rZW5zLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgRm9ybWF0OiB7JSBlbmRzZXQgJX1cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcubG9naWMudHlwZS5lbmRzZXQsXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXmVuZHNldCQvLFxuXHQgICAgICAgICAgICBuZXh0OiBbIF0sXG5cdCAgICAgICAgICAgIG9wZW46IGZhbHNlXG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBGaWx0ZXIgbG9naWMgdG9rZW5zLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgRm9ybWF0OiB7JSBmaWx0ZXIgdXBwZXIgJX0gb3IgeyUgZmlsdGVyIGxvd2VyfGVzY2FwZSAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLmZpbHRlcixcblx0ICAgICAgICAgICAgcmVnZXg6IC9eZmlsdGVyXFxzKyguKykkLyxcblx0ICAgICAgICAgICAgbmV4dDogW1xuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2dpYy50eXBlLmVuZGZpbHRlclxuXHQgICAgICAgICAgICBdLFxuXHQgICAgICAgICAgICBvcGVuOiB0cnVlLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gXCJ8XCIgKyB0b2tlbi5tYXRjaFsxXS50cmltKCk7XG5cdCAgICAgICAgICAgICAgICAvLyBDb21waWxlIHRoZSBleHByZXNzaW9uLlxuXHQgICAgICAgICAgICAgICAgdG9rZW4uc3RhY2sgPSBUd2lnLmV4cHJlc3Npb24uY29tcGlsZS5hcHBseSh0aGlzLCBbe1xuXHQgICAgICAgICAgICAgICAgICAgIHR5cGU6ICBUd2lnLmV4cHJlc3Npb24udHlwZS5leHByZXNzaW9uLFxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBleHByZXNzaW9uXG5cdCAgICAgICAgICAgICAgICB9XSkuc3RhY2s7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodG9rZW4sIGNvbnRleHQsIGNoYWluKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5wYXJzZUFzeW5jLmFwcGx5KHRoaXMsIFt0b2tlbi5vdXRwdXQsIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24odW5maWx0ZXJlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBzdGFjayA9IFt7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFR3aWcuZXhwcmVzc2lvbi50eXBlLnN0cmluZyxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuZmlsdGVyZWRcblx0ICAgICAgICAgICAgICAgICAgICB9XS5jb25jYXQodG9rZW4uc3RhY2spO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jLmFwcGx5KHRoYXQsIFtzdGFjaywgY29udGV4dF0pO1xuXHQgICAgICAgICAgICAgICAgfSlcblx0ICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKG91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNoYWluOiBjaGFpbixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiBvdXRwdXRcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogRW5kIGZpbHRlciBsb2dpYyB0b2tlbnMuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICBGb3JtYXQ6IHslIGVuZGZpbHRlciAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLmVuZGZpbHRlcixcblx0ICAgICAgICAgICAgcmVnZXg6IC9eZW5kZmlsdGVyJC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFsgXSxcblx0ICAgICAgICAgICAgb3BlbjogZmFsc2Vcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEJsb2NrIGxvZ2ljIHRva2Vucy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogIEZvcm1hdDogeyUgYmxvY2sgdGl0bGUgJX1cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgI
46184HR5cGU6IFR3aWcubG9naWMudHlwZS5ibG9jayxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eYmxvY2tcXHMrKFthLXpBLVowLTlfXSspJC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFtcblx0ICAgICAgICAgICAgICAgIFR3aWcubG9naWMudHlwZS5lbmRibG9ja1xuXHQgICAgICAgICAgICBdLFxuXHQgICAgICAgICAgICBvcGVuOiB0cnVlLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgIHRva2VuLmJsb2NrID0gdG9rZW4ubWF0Y2hbMV0udHJpbSgpO1xuXHQgICAgICAgICAgICAgICAgZGVsZXRlIHRva2VuLm1hdGNoO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBwYXJzZTogZnVuY3Rpb24gKHRva2VuLCBjb250ZXh0LCBjaGFpbikge1xuXHQgICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuXHQgICAgICAgICAgICAgICAgICAgIGJsb2NrX291dHB1dCxcblx0ICAgICAgICAgICAgICAgICAgICBvdXRwdXQsXG5cdCAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IFR3aWcuUHJvbWlzZS5yZXNvbHZlKCksXG5cdCAgICAgICAgICAgICAgICAgICAgaXNJbXBvcnRlZCA9IFR3aWcuaW5kZXhPZih0aGlzLmltcG9ydGVkQmxvY2tzLCB0b2tlbi5ibG9jaykgPiAtMSxcblx0ICAgICAgICAgICAgICAgICAgICBoYXNQYXJlbnQgPSB0aGlzLmJsb2Nrc1t0b2tlbi5ibG9ja10gJiYgVHdpZy5pbmRleE9mKHRoaXMuYmxvY2tzW3Rva2VuLmJsb2NrXSwgVHdpZy5wbGFjZWhvbGRlcnMucGFyZW50KSA+IC0xO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBEb24ndCBvdmVycmlkZSBwcmV2aW91cyBibG9ja3MgdW5sZXNzIHRoZXkncmUgaW1wb3J0ZWQgd2l0aCBcInVzZVwiXG5cdCAgICAgICAgICAgICAgICAvLyBMb29wcyBzaG91bGQgYmUgZXhlbXB0ZWQgYXMgd2VsbC5cblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLmJsb2Nrc1t0b2tlbi5ibG9ja10gPT09IHVuZGVmaW5lZCB8fCBpc0ltcG9ydGVkIHx8IGhhc1BhcmVudCB8fCBjb250ZXh0Lmxvb3AgfHwgdG9rZW4ub3ZlcndyaXRlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLmV4cHJlc3Npb24pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jLmFwcGx5KHRoaXMsIFt0b2tlbi5vdXRwdXQsIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jLmFwcGx5KHRoYXQsIFt7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUuc3RyaW5nLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgY29udGV4dF0pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gVHdpZy5wYXJzZUFzeW5jLmFwcGx5KHRoaXMsIFt0b2tlbi5vdXRwdXQsIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jLmFwcGx5KHRoYXQsIFt7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUuc3RyaW5nLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgY29udGV4dF0pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGZ1bmN0aW9uKGJsb2NrX291dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNJbXBvcnRlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25jZSB0aGUgYmxvY2sgaXMgb3ZlcnJpZGRlbiwgcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3Qgb2YgaW1wb3J0ZWQgYmxvY2tzXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0LmltcG9ydGVkQmxvY2tzLnNwbGljZSh0aGF0LmltcG9ydGVkQmxvY2tzLmluZGV4T2YodG9rZW4uYmxvY2spLCAxKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQYXJlbnQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuYmxvY2tzW3Rva2VuLmJsb2NrXSA9IFR3aWcuTWFya3VwKHRoYXQuYmxvY2tzW3Rva2VuLmJsb2NrXS5yZXBsYWNlKFR3aWcucGxhY2Vob2xkZXJzLnBhcmVudCwgYmxvY2tfb3V0cHV0KSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0LmJsb2Nrc1t0b2tlbi5ibG9ja10gPSBibG9ja19vdXRwdXQ7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm9yaWdpbmFsQmxvY2tUb2tlbnNbdG9rZW4uYmxvY2tdID0ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdG9rZW4udHlwZSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrOiB0b2tlbi5ibG9jayxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogdG9rZW4ub3V0cHV0LFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcndyaXRlOiB0cnVlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgI
46184HJldHVybiBwcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYSBjaGlsZCBibG9jayBoYXMgYmVlbiBzZXQgZnJvbSBhIHRlbXBsYXRlIGV4dGVuZGluZyB0aGlzIG9uZS5cblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5jaGlsZC5ibG9ja3NbdG9rZW4uYmxvY2tdKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IHRoYXQuY2hpbGQuYmxvY2tzW3Rva2VuLmJsb2NrXTtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSB0aGF0LmJsb2Nrc1t0b2tlbi5ibG9ja107XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW46IGNoYWluLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IG91dHB1dFxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogQmxvY2sgc2hvcnRoYW5kIGxvZ2ljIHRva2Vucy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogIEZvcm1hdDogeyUgYmxvY2sgdGl0bGUgZXhwcmVzc2lvbiAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLnNob3J0YmxvY2ssXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXmJsb2NrXFxzKyhbYS16QS1aMC05X10rKVxccysoLispJC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFsgXSxcblx0ICAgICAgICAgICAgb3BlbjogdHJ1ZSxcblx0ICAgICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5leHByZXNzaW9uID0gdG9rZW4ubWF0Y2hbMl0udHJpbSgpO1xuXG5cdCAgICAgICAgICAgICAgICB0b2tlbi5vdXRwdXQgPSBUd2lnLmV4cHJlc3Npb24uY29tcGlsZSh7XG5cdCAgICAgICAgICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUuZXhwcmVzc2lvbixcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdG9rZW4uZXhwcmVzc2lvblxuXHQgICAgICAgICAgICAgICAgfSkuc3RhY2s7XG5cblx0ICAgICAgICAgICAgICAgIHRva2VuLmJsb2NrID0gdG9rZW4ubWF0Y2hbMV0udHJpbSgpO1xuXHQgICAgICAgICAgICAgICAgZGVsZXRlIHRva2VuLm1hdGNoO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBwYXJzZTogZnVuY3Rpb24gKHRva2VuLCBjb250ZXh0LCBjaGFpbikge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcubG9naWMuaGFuZGxlcltUd2lnLmxvZ2ljLnR5cGUuYmxvY2tdLnBhcnNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEVuZCBibG9jayBsb2dpYyB0b2tlbnMuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICBGb3JtYXQ6IHslIGVuZGJsb2NrICV9XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUuZW5kYmxvY2ssXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXmVuZGJsb2NrKD86XFxzKyhbYS16QS1aMC05X10rKSk/JC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFsgXSxcblx0ICAgICAgICAgICAgb3BlbjogZmFsc2Vcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEJsb2NrIGxvZ2ljIHRva2Vucy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogIEZvcm1hdDogeyUgZXh0ZW5kcyBcInRlbXBsYXRlLnR3aWdcIiAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLmV4dGVuZHNfLFxuXHQgICAgICAgICAgICByZWdleDogL15leHRlbmRzXFxzKyguKykkLyxcblx0ICAgICAgICAgICAgbmV4dDogWyBdLFxuXHQgICAgICAgICAgICBvcGVuOiB0cnVlLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gdG9rZW4ubWF0Y2hbMV0udHJpbSgpO1xuXHQgICAgICAgICAgICAgICAgZGVsZXRlIHRva2VuLm1hdGNoO1xuXG5cdCAgICAgICAgICAgICAgICB0b2tlbi5zdGFjayAgID0gVHdpZy5leHByZXNzaW9uLmNvbXBpbGUuYXBwbHkodGhpcywgW3tcblx0ICAgICAgICAgICAgICAgICAgICB0eXBlOiAgVHdpZy5leHByZXNzaW9uLnR5cGUuZXhwcmVzc2lvbixcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZXhwcmVzc2lvblxuXHQgICAgICAgICAgICAgICAgfV0pLnN0YWNrO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodG9rZW4sIGNvbnRleHQsIGNoYWluKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgdGVtcGxhdGUsXG5cdCAgICAgICAgICAgICAgICAgICAgdGhhdCA9IHRoaXMsXG5cdCAgICAgICAgICAgICAgICAgICAgaW5uZXJDb250ZXh0ID0gVHdpZy5DaGlsZENvbnRleHQoY29udGV4dCk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgZmlsZW5hbWVcblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLmV4cHJlc3Npb24ucGFyc2VBc3luYy5hcHBseSh0aGlzLCBbdG9rZW4uc3RhY2ssIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oZmlsZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIFNldCBwYXJlbnQgdGVtcGxhdGVcblx0ICAgICAgICAgICAgICAgICAgICB0aGF0LmV4dGVuZCA9IGZpbGU7XG5cblx0ICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSBpbnN0YW5jZW9mIFR3aWcuVGVtcGxhdGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBmaWxlO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIEltcG9ydCBmaWxlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGhhdC5pbXBvcnRGaWxlKGZpbGUpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIC8vIFJlbmRlciB0aGUgdGVtcGxhdGUgaW4gY2FzZSBpdCBwdXRzIGFueXRoaW5nIGluIGl0cyBjb250ZXh0XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlLnJlbmRlckFzeW5jKGlubmVyQ29udGV4dCk7XG5cdCAgICAgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gRXh0ZW5kIHRoZSBwYXJlbnQgY29udGV4dCB3aXRoIHRoZSBleHRlbmRlZCBjb250ZXh0XG5cdCAgICAgICAgICAgICAgICAgICAgVHdpZy5saWIuZXh0ZW5kKGNvbnRleHQsIGlubmVyQ29udGV4dCk7XG5cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjaGFpbjogY2hhaW4sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogJydcblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEJsb2NrIGxvZ2ljIHRva2Vucy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogIEZvcm1hdDogeyUgdXNlIFwidGVtcGxhdGUudHdpZ1wiICV9XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUudXNlLFxuXHQgICAgICAgICAgICByZWdleDogL151c2VcXHMrKC4rKSQvLFxuXHQgICAgICAgICAgICBuZXh0OiBbIF0sXG5cdCAgICAgICAgICAgIG9wZW46IHRydWUsXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uICh0b2tlbikge1xuXHQgICAgICAgICAgICAgICAgdmFyIGV4cHJlc3Npb24gPSB0b2tlbi5tYXRjaFsxXS50cmltKCk7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cblx0ICAgICAgICAgICAgICAgIHRva2VuLnN0YWNrID0gVHdpZy5leHByZXNzaW9uLmNvbXBpbGUuYXBwbHkodGhpcywgW3tcblx0ICAgICAgICAgICAgICAgICAgICB0eXBlOiAgVHdpZy5leHByZXNzaW9uLnR5cGUuZXhwcmVzc2lvbixcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZXhwcmVzc2lvblxuXHQgICAgICAgICAgICAgICAgfV0pLnN0YWNrO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodG9rZW4sIGNvbnRleHQsIGNoYWluKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgdGhhdCA9IHRoaXM7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgZmlsZW5hbWVcblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLmV4cHJlc3Npb24ucGFyc2VBc3luYy5hcHBseSh0aGlzLCBbdG9rZW4uc3RhY2ssIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oZmlsZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIEltcG9ydCBibG9ja3Ncblx0ICAgICAgICAgICAgICAgICAgICB0aGF0LmltcG9ydEJsb2NrcyhmaWxlKTtcblxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNoYWluOiBjaGFpbixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiAnJ1xuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogQmxvY2sgbG9naWMgdG9rZW5zLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgRm9ybWF0OiB7JSBpbmNsdWRlcyBcInRlbXBsYXRlLnR3aWdcIiBbd2l0aCB7c29tZTogJ3ZhbHVlcyd9IG9ubHldICV9XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUuaW5jbHVkZSxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eaW5jbHVkZVxccysoLis/KSg/Olxcc3wkKShpZ25vcmUgbWlzc2luZyg/Olxcc3wkKSk/KD86d2l0aFxccysoW1xcU1xcc10rPykpPyg/Olxcc3wkKShvbmx5KT8kLyxcblx0ICAgICAgICAgICAgbmV4dDogWyBdLFxuXHQgICAgICAgICAgICBvcGVuOiB0cnVlLFxuXHQgICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IHRva2VuLm1hdGNoLFxuXHQgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBtYXRjaFsxXS50cmltKCksXG5cdCAgICAgICAgICAgICAgICAgICAgaWdub3JlTWlzc2luZyA9IG1hdGNoWzJdICE9PSB1bmRlZmluZWQsXG5cdCAgICAgICAgICAgICAgICAgICAgd2l0aENvbnRleHQgPSBtYXRjaFszXSxcblx0ICAgICAgICAgICAgICAgICAgICBvbmx5ID0gKChtYXRjaFs0XSAhPT0gdW5kZWZpbmVkKSAmJiBtYXRjaFs0XS5sZW5ndGgpO1xuXG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW4ubWF0Y2g7XG5cblx0ICAgICAgICAgICAgICAgIHRva2VuLm9ubHkgPSBvbmx5O1xuXHQgICAgICAgICAgICAgICAgdG9rZW4uaWdub3JlTWlzc2luZyA9IGlnbm9yZU1pc3Npbmc7XG5cblx0ICAgICAgICAgICAgICAgIHRva2VuLnN0YWNrID0gVHdpZy5leHByZXNzaW9uLmNvbXBpbGUuYXBwbHkodGhpcywgW3tcblx0ICAgICAgICAgICAgICAgICAgICB0eXBlOiAgVHdpZy5leHByZXNzaW9uLnR5cGUuZXhwcmVzc2lvbixcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZXhwcmVzc2lvblxuXHQgICAgICAgICAgICAgICAgfV0pLnN0YWNrO1xuXG5cdCAgICAgICAgICAgICAgICBpZiAod2l0aENvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRva2VuLndpdGhTdGFjayA9IFR3aWcuZXhwcmVzc2lvbi5jb21waWxlLmFwcGx5KHRoaXMsIFt7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICBUd2lnLmV4cHJlc3Npb24udHlwZS5leHByZXNzaW9uLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogd2l0aENvbnRleHQudHJpbSgpXG5cdCAgICAgICAgICAgICAgICAgICAgfV0pLnN0YWNrO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodG9rZW4sIGNvbnRleHQsIGNoYWluKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIGZpbGVuYW1lXG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgaW5uZXJDb250ZXh0ID0ge30sXG5cdCAgICAgICAgICAgICAgICAgICAgaSxcblx0ICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSxcblx0ICAgICAgICAgICAgICAgICAgICB0aGF0ID0gdGhpcyxcblx0ICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gVHdpZy5Qcm9taXNlLnJlc29sdmUoKTtcblxuXHQgICAgICAgICAgICAgICAgaWYgKCF0b2tlbi5vbmx5KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5uZXJDb250ZXh0ID0gVHdpZy5DaGlsZENvbnRleHQoY29udGV4dCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIGlmICh0b2tlbi53aXRoU3RhY2sgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSBUd2lnLmV4cHJlc3Npb24ucGFyc2VBc3luYy5hcHBseSh0aGlzLCBbdG9rZW4ud2l0aFN0YWNrLCBjb250ZXh0XSlcblx0ICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbih3aXRoQ29udGV4dCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gd2l0aENvbnRleHQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aXRoQ29udGV4dC5oYXNPd25Qcm9wZXJ0eShpKSlcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNvbnRleHRbaV0gPSB3aXRoQ29udGV4dFtpXTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jLmFwcGx5KHRoYXQsIFt0b2tlbi5zdGFjaywgY29udGV4dF0pO1xuXHQgICAgICAgICAgICAgICAgfSlcblx0ICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGZpbGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSBpbnN0YW5jZW9mIFR3aWcuVGVtcGxhdGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBmaWxlO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIEltcG9ydCBmaWxlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoYXQuaW1wb3J0RmlsZShmaWxlKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4uaWdub3JlTWlzc2luZykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlLnJlbmRlckFzeW5jKGlubmVyQ29udGV4dCk7XG5cdCAgICAgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ob3V0cHV0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW46IGNoYWluLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IG91dHB1dFxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUuc3BhY2VsZXNzLFxuXHQgICAgICAgICAgICByZWdleDogL15zcGFjZWxlc3MkLyxcblx0ICAgICAgICAgICAgbmV4dDogW1xuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2dpYy50eXBlLmVuZHNwYWNlbGVzc1xuXHQgICAgICAgICAgICBdLFxuXHQgICAgICAgICAgICBvcGVuOiB0cnVlLFxuXG5cdCAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBodG1sIGFuZCByZXR1cm4gaXQgd2l0aG91dCBhbnkgc3BhY2VzIGJldHdlZW4gdGFnc1xuXHQgICAgICAgICAgICBwYXJzZTogZnVuY3Rpb24gKHRva2VuLCBjb250ZXh0LCBjaGFpbikge1xuXHQgICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIG91dHB1dCB3aXRob3V0IGFueSBmaWx0ZXJcblx0ICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLnBhcnNlQXN5bmMuYXBwbHkodGhpcywgW3Rva2VuLm91dHB1dCwgY29udGV4dF0pXG5cdCAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbih1bmZpbHRlcmVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIC8vIEEgcmVndWxhciBleHByZXNzaW9uIHRvIGZpbmQgY2xvc2luZyBhbmQgb3BlbmluZyB0YWdzIHdpdGggc3BhY2VzIGJldHdlZW4gdGhlbVxuXHQgICAgICAgICAgICAgICAgICAgICAgICByQmV0d2VlblRhZ1NwYWNlcyA9IC8+XFxzKzwvZyxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBhbGwgc3BhY2UgYmV0d2VlbiBjbG9zaW5nIGFuZCBvcGVuaW5nIGh0bWwgdGFnc1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSB1bmZpbHRlcmVkLnJlcGxhY2UockJldHdlZW5UYWdTcGFjZXMsJz48JykudHJpbSgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXdyYXAgb3V0cHV0IGFzIGEgVHdpZy5NYXJrdXBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gVHdpZy5NYXJrdXAob3V0cHV0KTtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjaGFpbjogY2hhaW4sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogb3V0cHV0XG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8vIEFkZCB0aGUgeyUgZW5kc3BhY2VsZXNzICV9IHRva2VuXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eX
46184BlOiBUd2lnLmxvZ2ljLnR5cGUuZW5kc3BhY2VsZXNzLFxuXHQgICAgICAgICAgICByZWdleDogL15lbmRzcGFjZWxlc3MkLyxcblx0ICAgICAgICAgICAgbmV4dDogWyBdLFxuXHQgICAgICAgICAgICBvcGVuOiBmYWxzZVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogTWFjcm8gbG9naWMgdG9rZW5zLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBGb3JtYXQ6IHslIG1hcm8gaW5wdXQobmFtZSwgdmFsdWUsIHR5cGUsIHNpemUpICV9XG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUubWFjcm8sXG5cdCAgICAgICAgICAgIHJlZ2V4OiAvXm1hY3JvXFxzKyhbYS16QS1aMC05X10rKVxccypcXChcXHMqKCg/OlthLXpBLVowLTlfXSsoPzosXFxzKik/KSopXFxzKlxcKSQvLFxuXHQgICAgICAgICAgICBuZXh0OiBbXG5cdCAgICAgICAgICAgICAgICBUd2lnLmxvZ2ljLnR5cGUuZW5kbWFjcm9cblx0ICAgICAgICAgICAgXSxcblx0ICAgICAgICAgICAgb3BlbjogdHJ1ZSxcblx0ICAgICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgbWFjcm9OYW1lID0gdG9rZW4ubWF0Y2hbMV0sXG5cdCAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyA9IHRva2VuLm1hdGNoWzJdLnNwbGl0KC9bXFxzLF0rLyk7XG5cblx0ICAgICAgICAgICAgICAgIC8vVE9ETzogQ2xlYW4gdXAgZHVwbGljYXRlIGNoZWNrXG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8cGFyYW1ldGVycy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajxwYXJhbWV0ZXJzLmxlbmd0aDsgaisrKXtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnNbaV0gPT09IHBhcmFtZXRlcnNbal0gJiYgaSAhPT0gaikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJEdXBsaWNhdGUgYXJndW1lbnRzIGZvciBwYXJhbWV0ZXI6IFwiKyBwYXJhbWV0ZXJzW2ldKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgdG9rZW4ubWFjcm9OYW1lID0gbWFjcm9OYW1lO1xuXHQgICAgICAgICAgICAgICAgdG9rZW4ucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG5cblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5tYXRjaDtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uICh0b2tlbiwgY29udGV4dCwgY2hhaW4pIHtcblx0ICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHRoaXM7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm1hY3Jvc1t0b2tlbi5tYWNyb05hbWVdID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBnbG9iYWwgY29udGV4dCBhbmQgb3RoZXIgbWFjcm9zXG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIG1hY3JvQ29udGV4dCA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGY6IHRlbXBsYXRlLm1hY3Jvc1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAvLyBBZGQgcGFyYW1ldGVycyBmcm9tIGNvbnRleHQgdG8gbWFjcm9Db250ZXh0XG5cdCAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRva2VuLnBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3AgPSB0b2tlbi5wYXJhbWV0ZXJzW2ldO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgYXJndW1lbnRzW2ldICE9PSAndW5kZWZpbmVkJykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9Db250ZXh0W3Byb3BdID0gYXJndW1lbnRzW2ldO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9Db250ZXh0W3Byb3BdID0gdW5kZWZpbmVkO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gUmVuZGVyXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcucGFyc2VBc3luYy5hcHBseSh0ZW1wbGF0ZSwgW3Rva2VuLm91dHB1dCwgbWFjcm9Db250ZXh0XSk7XG5cdCAgICAgICAgICAgICAgICB9O1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgICAgIGNoYWluOiBjaGFpbixcblx0ICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6ICcnXG5cdCAgICAgICAgICAgICAgICB9O1xuXG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEVuZCBtYWNybyBsb2dpYyB0b2tlbnMuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEZvcm1hdDogeyUgZW5kbWFjcm8gJX1cblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUuZW5kbWFjcm8sXG5cdCAgICAgICAgICAgICByZWdleDogL15lbmRtYWNybyQvLFxuXHQgICAgICAgICAgICAgbmV4dDogWyBdLFxuXHQgICAgICAgICAgICAgb3BlbjogZmFsc2Vcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgLypcblx0ICAgICAgICAgICAgKiBpbXBvcnQgbG9naWMgdG9rZW5zLlxuXHQgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICogRm9ybWF0OiB7JSBpbXBvcnQgXCJ0ZW1wbGF0ZS50d2lnXCIgYXMgZm9ybSAlfVxuXHQgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUuaW1wb3J0Xyxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eaW1wb3J0XFxzKyguKylcXHMrYXNcXHMrKFthLXpBLVowLTlfXSspJC8sXG5cdCAgICAgICAgICAgIG5leHQ6IFsgXSxcblx0ICAgICAgICAgICAgb3BlbjogdHJ1ZSxcblx0ICAgICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgZXhwcmVzc2lvbiA9IHRva2VuLm1hdGNoWzFdLnRyaW0oKSxcblx0ICAgICAgICAgICAgICAgICAgICBjb250ZXh0TmFtZSA9IHRva2VuLm1hdGNoWzJdLnRyaW0oKTtcblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5tYXRjaDtcblxuXHQgICAgICAgICAgICAgICAgdG9rZW4uZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5jb250ZXh0TmFtZSA9IGNvbnRleHROYW1lO1xuXG5cdCAgICAgICAgICAgICAgICB0b2tlbi5zdGFjayA9IFR3aWcuZXhwcmVzc2lvbi5jb21waWxlLmFwcGx5KHRoaXMsIFt7XG5cdCAgICAgICAgICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUuZXhwcmVzc2lvbixcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZXhwcmVzc2lvblxuXHQgICAgICAgICAgICAgICAgfV0pLnN0YWNrO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodG9rZW4sIGNvbnRleHQsIGNoYWluKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG5cdCAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0geyBjaGFpbjogY2hhaW4sIG91dHB1dDogJycgfTtcblxuXHQgICAgICAgICAgICAgICAgaWYgKHRva2VuLmV4cHJlc3Npb24gPT09ICdfc2VsZicpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjb250ZXh0W3Rva2VuLmNvbnRleHROYW1lXSA9IHRoaXMubWFjcm9zO1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBUd2lnLlByb21pc2UucmVzb2x2ZShvdXRwdXQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5leHByZXNzaW9uLnBhcnNlQXN5bmMuYXBwbHkodGhpcywgW3Rva2VuLnN0YWNrLCBjb250ZXh0XSlcblx0ICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGZpbGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5pbXBvcnRGaWxlKGZpbGUgfHwgdG9rZW4uZXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24odGVtcGxhdGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjb250ZXh0W3Rva2VuLmNvbnRleHROYW1lXSA9IHRlbXBsYXRlLnJlbmRlckFzeW5jKHt9LCB7b3V0cHV0OiAnbWFjcm9zJ30pO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qXG5cdCAgICAgICAgICAgICogZnJvbSBsb2dpYyB0b2tlbnMuXG5cdCAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgKiBGb3JtYXQ6IHslIGZyb20gXCJ0ZW1wbGF0ZS50d2lnXCIgaW1wb3J0IGZ1bmMgYXMgZm9ybSAlfVxuXHQgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUuZnJvbSxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eZnJvbVxccysoLispXFxzK2ltcG9ydFxccysoW2EtekEtWjAtOV8sIF0rKSQvLFxuXHQgICAgICAgICAgICBuZXh0OiBbIF0sXG5cdCAgICAgICAgICAgIG9wZW46IHRydWUsXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uICh0b2tlbikge1xuXHQgICAgICAgICAgICAgICAgdmFyIGV4cHJlc3Npb24gPSB0b2tlbi5tYXRjaFsxXS50cmltKCksXG5cdCAgICAgICAgICAgICAgICAgICAgbWFjcm9FeHByZXNzaW9ucyA9IHRva2VuLm1hdGNoWzJdLnRyaW0oKS5zcGxpdCgvXFxzKixcXHMqLyksXG5cdCAgICAgICAgICAgICAgICAgICAgbWFjcm9OYW1lcyA9IHt9O1xuXG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8bWFjcm9FeHByZXNzaW9ucy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciByZXMgPSBtYWNyb0V4cHJlc3Npb25zW2ldO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2ggZnVuY3Rpb24gYXMgdmFyaWFibGVcblx0ICAgICAgICAgICAgICAgICAgICB2Y
46184XIgbWFjcm9NYXRjaCA9IHJlcy5tYXRjaCgvXihbYS16QS1aMC05X10rKVxccythc1xccysoW2EtekEtWjAtOV9dKykkLyk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKG1hY3JvTWF0Y2gpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9OYW1lc1ttYWNyb01hdGNoWzFdLnRyaW0oKV0gPSBtYWNyb01hdGNoWzJdLnRyaW0oKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzLm1hdGNoKC9eKFthLXpBLVowLTlfXSspJC8pKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvTmFtZXNbcmVzXSA9IHJlcztcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbXBvcnRcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgZGVsZXRlIHRva2VuLm1hdGNoO1xuXG5cdCAgICAgICAgICAgICAgICB0b2tlbi5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcblx0ICAgICAgICAgICAgICAgIHRva2VuLm1hY3JvTmFtZXMgPSBtYWNyb05hbWVzO1xuXG5cdCAgICAgICAgICAgICAgICB0b2tlbi5zdGFjayA9IFR3aWcuZXhwcmVzc2lvbi5jb21waWxlLmFwcGx5KHRoaXMsIFt7XG5cdCAgICAgICAgICAgICAgICAgICAgdHlwZTogVHdpZy5leHByZXNzaW9uLnR5cGUuZXhwcmVzc2lvbixcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZXhwcmVzc2lvblxuXHQgICAgICAgICAgICAgICAgfV0pLnN0YWNrO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodG9rZW4sIGNvbnRleHQsIGNoYWluKSB7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgdGhhdCA9IHRoaXMsXG5cdCAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IFR3aWcuUHJvbWlzZS5yZXNvbHZlKHRoaXMubWFjcm9zKTtcblxuXHQgICAgICAgICAgICAgICAgaWYgKHRva2VuLmV4cHJlc3Npb24gIT09IFwiX3NlbGZcIikge1xuXHQgICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSBUd2lnLmV4cHJlc3Npb24ucGFyc2VBc3luYy5hcHBseSh0aGlzLCBbdG9rZW4uc3RhY2ssIGNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGZpbGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuaW1wb3J0RmlsZShmaWxlIHx8IHRva2VuLmV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24odGVtcGxhdGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlLnJlbmRlckFzeW5jKHt9LCB7b3V0cHV0OiAnbWFjcm9zJ30pO1xuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVxuXHQgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24obWFjcm9zKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbWFjcm9OYW1lIGluIHRva2VuLm1hY3JvTmFtZXMpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hY3Jvcy5oYXNPd25Qcm9wZXJ0eShtYWNyb05hbWUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0W3Rva2VuLm1hY3JvTmFtZXNbbWFjcm9OYW1lXV0gPSBtYWNyb3NbbWFjcm9OYW1lXTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNoYWluOiBjaGFpbixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiAnJ1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBUaGUgZW1iZWQgdGFnIGNvbWJpbmVzIHRoZSBiZWhhdmlvdXIgb2YgaW5jbHVkZSBhbmQgZXh0ZW5kcy5cblx0ICAgICAgICAgICAgICogSXQgYWxsb3dzIHlvdSB0byBpbmNsdWRlIGFub3RoZXIgdGVtcGxhdGUncyBjb250ZW50cywganVzdCBsaWtlIGluY2x1ZGUgZG9lcy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogIEZvcm1hdDogeyUgZW1iZWQgXCJ0ZW1wbGF0ZS50d2lnXCIgW3dpdGgge3NvbWU6ICd2YWx1ZXMnfSBvbmx5XSAlfVxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdHlwZTogVHdpZy5sb2dpYy50eXBlLmVtYmVkLFxuXHQgICAgICAgICAgICByZWdleDogL15lbWJlZFxccysoLis/KSg/Olxcc3wkKShpZ25vcmUgbWlzc2luZyg/Olxcc3wkKSk/KD86d2l0aFxccysoW1xcU1xcc10rPykpPyg/Olxcc3wkKShvbmx5KT8kLyxcblx0ICAgICAgICAgICAgbmV4dDogW1xuXHQgICAgICAgICAgICAgICAgVHdpZy5sb2dpYy50eXBlLmVuZGVtYmVkXG5cdCAgICAgICAgICAgIF0sXG5cdCAgICAgICAgICAgIG9wZW46IHRydWUsXG5cdCAgICAgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uICh0b2tlbikge1xuXHQgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gdG9rZW4ubWF0Y2gsXG5cdCAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IG1hdGNoWzFdLnRyaW0oKSxcblx0ICAgICAgICAgICAgICAgICAgICBpZ25vcmVNaXNzaW5nID0gbWF0Y2hbMl0gIT09IHVuZGVmaW5lZCxcblx0ICAgICAgICAgICAgICAgICAgICB3aXRoQ29udGV4dCA9IG1hdGNoWzNdLFxuXHQgICAgICAgICAgICAgICAgICAgIG9ubHkgPSAoKG1hdGNoWzRdICE9PSB1bmRlZmluZWQpICYmIG1hdGNoWzRdLmxlbmd0aCk7XG5cblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5tYXRjaDtcblxuXHQgICAgICAgICAgICAgICAgdG9rZW4ub25seSA9IG9ubHk7XG5cdCAgICAgICAgICAgICAgICB0b2tlbi5pZ25vcmVNaXNzaW5nID0gaWdub3JlTWlzc2luZztcblxuXHQgICAgICAgICAgICAgICAgdG9rZW4uc3RhY2sgPSBUd2lnLmV4cHJlc3Npb24uY29tcGlsZS5hcHBseSh0aGlzLCBbe1xuXHQgICAgICAgICAgICAgICAgICAgIHR5cGU6ICBUd2lnLmV4cHJlc3Npb24udHlwZS5leHByZXNzaW9uLFxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBleHByZXNzaW9uXG5cdCAgICAgICAgICAgICAgICB9XSkuc3RhY2s7XG5cblx0ICAgICAgICAgICAgICAgIGlmICh3aXRoQ29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdG9rZW4ud2l0aFN0YWNrID0gVHdpZy5leHByZXNzaW9uLmNvbXBpbGUuYXBwbHkodGhpcywgW3tcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogIFR3aWcuZXhwcmVzc2lvbi50eXBlLmV4cHJlc3Npb24sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB3aXRoQ29udGV4dC50cmltKClcblx0ICAgICAgICAgICAgICAgICAgICB9XSkuc3RhY2s7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uICh0b2tlbiwgY29udGV4dCwgY2hhaW4pIHtcblx0ICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgZmlsZW5hbWVcblx0ICAgICAgICAgICAgICAgIHZhciBpbm5lckNvbnRleHQgPSB7fSxcblx0ICAgICAgICAgICAgICAgICAgICB0aGF0ID0gdGhpcyxcblx0ICAgICAgICAgICAgICAgICAgICBpLFxuXHQgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLFxuXHQgICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSBUd2lnLlByb21pc2UucmVzb2x2ZSgpO1xuXG5cdCAgICAgICAgICAgICAgICBpZiAoIXRva2VuLm9ubHkpIHtcblx0ICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gY29udGV4dCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5oYXNPd25Qcm9wZXJ0eShpKSlcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyQ29udGV4dFtpXSA9IGNvbnRleHRbaV07XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBpZiAodG9rZW4ud2l0aFN0YWNrICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gVHdpZy5leHByZXNzaW9uLnBhcnNlQXN5bmMuYXBwbHkodGhpcywgW3Rva2VuLndpdGhTdGFjaywgY29udGV4dF0pXG5cdCAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24od2l0aENvbnRleHQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpIGluIHdpdGhDb250ZXh0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2l0aENvbnRleHQuaGFzT3duUHJvcGVydHkoaSkpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJDb250ZXh0W2ldID0gd2l0aENvbnRleHRbaV07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgI
46184H1cblx0ICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbihmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHdpZy5leHByZXNzaW9uLnBhcnNlQXN5bmMuYXBwbHkodGhhdCwgW3Rva2VuLnN0YWNrLCBpbm5lckNvbnRleHRdKTtcblx0ICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihmaWxlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBUd2lnLlRlbXBsYXRlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gZmlsZTtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbXBvcnQgZmlsZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0LmltcG9ydEZpbGUoZmlsZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLmlnbm9yZU1pc3NpbmcpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHByZXZpb3VzIGJsb2Nrc1xuXHQgICAgICAgICAgICAgICAgICAgIHRoYXQuYmxvY2tzID0ge307XG5cblx0ICAgICAgICAgICAgICAgICAgICAvLyBwYXJzZSB0b2tlbnMuIG91dHB1dCB3aWxsIGJlIG5vdCB1c2VkXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR3aWcucGFyc2VBc3luYy5hcHBseSh0aGF0LCBbdG9rZW4ub3V0cHV0LCBpbm5lckNvbnRleHRdKVxuXHQgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5kZXIgdGVtcGFsdGUgd2l0aCBibG9ja3MgZGVmaW5lZCBpbiBlbWJlZCBibG9ja1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGUucmVuZGVyQXN5bmMoaW5uZXJDb250ZXh0LCB7J2Jsb2Nrcyc6dGhhdC5ibG9ja3N9KTtcblx0ICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihvdXRwdXQpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjaGFpbjogY2hhaW4sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogb3V0cHV0XG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICAvKiBBZGQgdGhlIHslIGVuZGVtYmVkICV9IHRva2VuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKi9cblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6IFR3aWcubG9naWMudHlwZS5lbmRlbWJlZCxcblx0ICAgICAgICAgICAgcmVnZXg6IC9eZW5kZW1iZWQkLyxcblx0ICAgICAgICAgICAgbmV4dDogWyBdLFxuXHQgICAgICAgICAgICBvcGVuOiBmYWxzZVxuXHQgICAgICAgIH1cblxuXHQgICAgXTtcblxuXG5cdCAgICAvKipcblx0ICAgICAqIFJlZ2lzdHJ5IGZvciBsb2dpYyBoYW5kbGVycy5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5sb2dpYy5oYW5kbGVyID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogRGVmaW5lIGEgbmV3IHRva2VuIHR5cGUsIGF2YWlsYWJsZSBhdCBUd2lnLmxvZ2ljLnR5cGUue3R5cGV9XG5cdCAgICAgKi9cblx0ICAgIFR3aWcubG9naWMuZXh0ZW5kVHlwZSA9IGZ1bmN0aW9uICh0eXBlLCB2YWx1ZSkge1xuXHQgICAgICAgIHZhbHVlID0gdmFsdWUgfHwgKFwiVHdpZy5sb2dpYy50eXBlXCIgKyB0eXBlKTtcblx0ICAgICAgICBUd2lnLmxvZ2ljLnR5cGVbdHlwZV0gPSB2YWx1ZTtcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogRXh0ZW5kIHRoZSBsb2dpYyBwYXJzaW5nIGZ1bmN0aW9uYWxpdHkgd2l0aCBhIG5ldyB0b2tlbiBkZWZpbml0aW9uLlxuXHQgICAgICpcblx0ICAgICAqIC8vIERlZmluZSBhIG5ldyB0YWdcblx0ICAgICAqIFR3aWcubG9naWMuZXh0ZW5kKHtcblx0ICAgICAqICAgICB0eXBlOiBUd2lnLmxvZ2ljLnR5cGUue3R5cGV9LFxuXHQgICAgICogICAgIC8vIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIGZvciB0aGlzIHRva2VuXG5cdCAgICAgKiAgICAgcmVnZXg6IC4uLixcblx0ICAgICAqICAgICAvLyBXaGF0IHRva2VuIHR5cGVzIGNhbiBmb2xsb3cgdGhpcyB0b2tlbiwgbGVhdmUgYmxhbmsgaWYgYW55LlxuXHQgICAgICogICAgIG5leHQ6IFsgLi4uIF1cblx0ICAgICAqICAgICAvLyBDcmVhdGUgYW5kIHJldHVybiBjb21waWxlZCB2ZXJzaW9uIG9mIHRoZSB0b2tlblxuXHQgICAgICogICAgIGNvbXBpbGU6IGZ1bmN0aW9uKHRva2VuKSB7IC4uLiB9XG5cdCAgICAgKiAgICAgLy8gUGFyc2UgdGhlIGNvbXBpbGVkIHRva2VuIHdpdGggdGhlIGNvbnRleHQgcHJvdmlkZWQgYnkgdGhlIHJlbmRlciBjYWxsXG5cdCAgICAgKiAgICAgLy8gICBhbmQgd2hldGhlciB0aGlzIHRva2VuIGNoYWluIGlzIGNvbXBsZXRlLlxuXHQgICAgICogICAgIHBhcnNlOiBmdW5jdGlvbih0b2tlbiwgY29udGV4dCwgY2hhaW4pIHsgLi4uIH1cblx0ICAgICAqIH0pO1xuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZWZpbml0aW9uIFRoZSBuZXcgbG9naWMgZXhwcmVzc2lvbi5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5sb2dpYy5leHRlbmQgPSBmdW5jdGlvbiAoZGVmaW5pdGlvbikge1xuXG5cdCAgICAgICAgaWYgKCFkZWZpbml0aW9uLnR5cGUpIHtcblx0ICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoXCJVbmFibGUgdG8gZXh0ZW5kIGxvZ2ljIGRlZmluaXRpb24uIE5vIHR5cGUgcHJvdmlkZWQgZm9yIFwiICsgZGVmaW5pdGlvbik7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgVHdpZy5sb2dpYy5leHRlbmRUeXBlKGRlZmluaXRpb24udHlwZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIFR3aWcubG9naWMuaGFuZGxlcltkZWZpbml0aW9uLnR5cGVdID0gZGVmaW5pdGlvbjtcblx0ICAgIH07XG5cblx0ICAgIC8vIEV4dGVuZCB3aXRoIGJ1aWx0LWluIGV4cHJlc3Npb25zXG5cdCAgICB3aGlsZSAoVHdpZy5sb2dpYy5kZWZpbml0aW9ucy5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgVHdpZy5sb2dpYy5leHRlbmQoVHdpZy5sb2dpYy5kZWZpbml0aW9ucy5zaGlmdCgpKTtcblx0ICAgIH1cblxuXHQgICAgLyoqXG5cdCAgICAgKiBDb21waWxlIGEgbG9naWMgdG9rZW4gaW50byBhbiBvYmplY3QgcmVhZHkgZm9yIHBhcnNpbmcuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtPYmplY3R9IHJhd190b2tlbiBBbiB1bmNvbXBpbGVkIGxvZ2ljIHRva2VuLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge09iamVjdH0gQSBjb21waWxlZCBsb2dpYyB0b2tlbiwgcmVhZHkgZm9yIHBhcnNpbmcuXG5cdCAgICAgKi9cblx0ICAgIFR3aWcubG9naWMuY29tcGlsZSA9IGZ1bmN0aW9uIChyYXdfdG9rZW4pIHtcblx0ICAgICAgICB2Y
46184XIgZXhwcmVzc2lvbiA9IHJhd190b2tlbi52YWx1ZS50cmltKCksXG5cdCAgICAgICAgICAgIHRva2VuID0gVHdpZy5sb2dpYy50b2tlbml6ZS5hcHBseSh0aGlzLCBbZXhwcmVzc2lvbl0pLFxuXHQgICAgICAgICAgICB0b2tlbl90ZW1wbGF0ZSA9IFR3aWcubG9naWMuaGFuZGxlclt0b2tlbi50eXBlXTtcblxuXHQgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0b2tlbiBuZWVkcyBjb21waWxpbmdcblx0ICAgICAgICBpZiAodG9rZW5fdGVtcGxhdGUuY29tcGlsZSkge1xuXHQgICAgICAgICAgICB0b2tlbiA9IHRva2VuX3RlbXBsYXRlLmNvbXBpbGUuYXBwbHkodGhpcywgW3Rva2VuXSk7XG5cdCAgICAgICAgICAgIFR3aWcubG9nLnRyYWNlKFwiVHdpZy5sb2dpYy5jb21waWxlOiBcIiwgXCJDb21waWxlZCBsb2dpYyB0b2tlbiB0byBcIiwgdG9rZW4pO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHJldHVybiB0b2tlbjtcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogVG9rZW5pemUgbG9naWMgZXhwcmVzc2lvbnMuIFRoaXMgZnVuY3Rpb24gbWF0Y2hlcyB0b2tlbiBleHByZXNzaW9ucyBhZ2FpbnN0IHJlZ3VsYXJcblx0ICAgICAqIGV4cHJlc3Npb25zIHByb3ZpZGVkIGluIHRva2VuIGRlZmluaXRpb25zIHByb3ZpZGVkIHdpdGggVHdpZy5sb2dpYy5leHRlbmQuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gdGhlIGxvZ2ljIHRva2VuIGV4cHJlc3Npb24gdG8gdG9rZW5pemVcblx0ICAgICAqICAgICAgICAgICAgICAgIChpLmUuIHdoYXQncyBiZXR3ZWVuIHslIGFuZCAlfSlcblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBtYXRjaGVkIHRva2VuIHdpdGggdHlwZSBzZXQgdG8gdGhlIHRva2VuIHR5cGUgYW5kIG1hdGNoIHRvIHRoZSByZWdleCBtYXRjaC5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5sb2dpYy50b2tlbml6ZSA9IGZ1bmN0aW9uIChleHByZXNzaW9uKSB7XG5cdCAgICAgICAgdmFyIHRva2VuID0ge30sXG5cdCAgICAgICAgICAgIHRva2VuX3RlbXBsYXRlX3R5cGUgPSBudWxsLFxuXHQgICAgICAgICAgICB0b2tlbl90eXBlID0gbnVsbCxcblx0ICAgICAgICAgICAgdG9rZW5fcmVnZXggPSBudWxsLFxuXHQgICAgICAgICAgICByZWdleF9hcnJheSA9IG51bGwsXG5cdCAgICAgICAgICAgIHJlZ2V4ID0gbnVsbCxcblx0ICAgICAgICAgICAgbWF0Y2ggPSBudWxsO1xuXG5cdCAgICAgICAgLy8gSWdub3JlIHdoaXRlc3BhY2UgYXJvdW5kIGV4cHJlc3Npb25zLlxuXHQgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnRyaW0oKTtcblxuXHQgICAgICAgIGZvciAodG9rZW5fdGVtcGxhdGVfdHlwZSBpbiBUd2lnLmxvZ2ljLmhhbmRsZXIpIHtcblx0ICAgICAgICAgICAgaWYgKFR3aWcubG9naWMuaGFuZGxlci5oYXNPd25Qcm9wZXJ0eSh0b2tlbl90ZW1wbGF0ZV90eXBlKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB0eXBlIGFuZCByZWdleCBmb3IgdGhpcyB0ZW1wbGF0ZSB0eXBlXG5cdCAgICAgICAgICAgICAgICB0b2tlbl90eXBlID0gVHdpZy5sb2dpYy5oYW5kbGVyW3Rva2VuX3RlbXBsYXRlX3R5cGVdLnR5cGU7XG5cdCAgICAgICAgICAgICAgICB0b2tlbl9yZWdleCA9IFR3aWcubG9naWMuaGFuZGxlclt0b2tlbl90ZW1wbGF0ZV90eXBlXS5yZWdleDtcblxuXHQgICAgICAgICAgICAgICAgLy8gSGFuZGxlIG11bHRpcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgcGVyIHR5cGUuXG5cdCAgICAgICAgICAgICAgICByZWdleF9hcnJheSA9IFtdO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRva2VuX3JlZ2V4IGluc3RhbmNlb2YgQXJyYXkpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZWdleF9hcnJheSA9IHRva2VuX3JlZ2V4O1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICByZWdleF9hcnJheS5wdXNoKHRva2VuX3JlZ2V4KTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gQ2hlY2sgcmVndWxhciBleHByZXNzaW9ucyBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHNwZWNpZmllZCBpbiB0aGUgZGVmaW5pdGlvbi5cblx0ICAgICAgICAgICAgICAgIHdoaWxlIChyZWdleF9hcnJheS5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVnZXggPSByZWdleF9hcnJheS5zaGlmdCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gcmVnZXguZXhlYyhleHByZXNzaW9uLnRyaW0oKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLnR5cGUgID0gdG9rZW5fdHlwZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4ubWF0Y2ggPSBtYXRjaDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgVHdpZy5sb2cudHJhY2UoXCJUd2lnLmxvZ2ljLnRva2VuaXplOiBcIiwgXCJNYXRjaGVkIGEgXCIsIHRva2VuX3R5cGUsIFwiIHJlZ3VsYXIgZXhwcmVzc2lvbiBvZiBcIiwgbWF0Y2gpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8gTm8gcmVnZXggbWF0Y2hlc1xuXHQgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKFwiVW5hYmxlIHRvIHBhcnNlICdcIiArIGV4cHJlc3Npb24udHJpbSgpICsgXCInXCIpO1xuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBQYXJzZSBhIGxvZ2ljIHRva2VuIHdpdGhpbiBhIGdpdmVuIGNvbnRleHQuXG5cdCAgICAgKlxuXHQgICAgICogV2hhdCBhcmUgbG9naWMgY2hhaW5zP1xuXHQgICAgICogICAgICBMb2dpYyBjaGFpbnMgcmVwcmVzZW50IGEgc2VyaWVzIG9mIHRva2VucyB0aGF0IGFyZSBjb25uZWN0ZWQsXG5cdCAgICAgKiAgICAgICAgICBmb3IgZXhhbXBsZTpcblx0ICAgICAqICAgICAgICAgIHslIGlmIC4uLiAlfSB7JSBlbHNlICV9IHslIGVuZGlmICV9XG5cdCAgICAgKlxuXHQgICAgICogICAgICBUaGUgY2hhaW4gcGFyYW1ldGVyIGlzIHVzZWQgdG8gc2lnbmlmeSBpZiBhIGNoYWluIGlzIG9wZW4gb2YgY2xvc2VkLlxuXHQgICAgICogICAgICBvcGVuOlxuXHQgICAgICogICAgICAgICAgTW9yZSB0b2tlbnMgaW4gdGhpcyBjaGFpbiBzaG91bGQgYmUgcGFyc2VkLlxuXHQgICAgICogICAgICBjbG9zZWQ6XG5cdCAgICAgKiAgICAgICAgICBUaGlzIHRva2VuIGNoYWluIGhhcyBjb21wbGV0ZWQgcGFyc2luZyBhbmQgYW55IGFkZGl0aW9uYWxcblx0ICAgICAqICAgICAgICAgI
46184HRva2VucyAoZWxzZSwgZWxzZWlmLCBldGMuLi4pIHNob3VsZCBiZSBpZ25vcmVkLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0b2tlbiBUaGUgY29tcGlsZWQgdG9rZW4uXG5cdCAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCBUaGUgcmVuZGVyIGNvbnRleHQuXG5cdCAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNoYWluIElzIHRoaXMgYW4gb3BlbiBsb2dpYyBjaGFpbi4gSWYgZmFsc2UsIHRoYXQgbWVhbnMgYVxuXHQgICAgICogICAgICAgICAgICAgICAgICAgICAgICBjaGFpbiBpcyBjbG9zZWQgYW5kIG5vIGZ1cnRoZXIgY2FzZXMgc2hvdWxkIGJlIHBhcnNlZC5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5sb2dpYy5wYXJzZSA9IGZ1bmN0aW9uICh0b2tlbiwgY29udGV4dCwgY2hhaW4sIGFsbG93X2FzeW5jKSB7XG5cdCAgICAgICAgdmFyIG91dHB1dCA9ICcnLFxuXHQgICAgICAgICAgICBwcm9taXNlLFxuXHQgICAgICAgICAgICBpc19hc3luYyA9IHRydWUsXG5cdCAgICAgICAgICAgIHRva2VuX3RlbXBsYXRlO1xuXG5cdCAgICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgeyB9O1xuXG5cdCAgICAgICAgVHdpZy5sb2cuZGVidWcoXCJUd2lnLmxvZ2ljLnBhcnNlOiBcIiwgXCJQYXJzaW5nIGxvZ2ljIHRva2VuIFwiLCB0b2tlbik7XG5cblx0ICAgICAgICB0b2tlbl90ZW1wbGF0ZSA9IFR3aWcubG9naWMuaGFuZGxlclt0b2tlbi50eXBlXTtcblxuXHQgICAgICAgIGlmICh0b2tlbl90ZW1wbGF0ZS5wYXJzZSkge1xuXHQgICAgICAgICAgICBvdXRwdXQgPSB0b2tlbl90ZW1wbGF0ZS5wYXJzZS5hcHBseSh0aGlzLCBbdG9rZW4sIGNvbnRleHQsIGNoYWluXSk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcHJvbWlzZSA9IFR3aWcuaXNQcm9taXNlKG91dHB1dCkgPyBvdXRwdXQgOiBUd2lnLlByb21pc2UucmVzb2x2ZShvdXRwdXQpO1xuXG5cdCAgICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKG8pIHtcblx0ICAgICAgICAgICAgaXNfYXN5bmMgPSBmYWxzZTtcblx0ICAgICAgICAgICAgb3V0cHV0ID0gbztcblx0ICAgICAgICB9KTtcblxuXHQgICAgICAgIGlmIChhbGxvd19hc3luYylcblx0ICAgICAgICAgICAgcmV0dXJuIHByb21pc2UgfHwgVHdpZy5Qcm9taXNlLnJlc29sdmUob3V0cHV0KTtcblxuXHQgICAgICAgIGlmIChpc19hc3luYylcblx0ICAgICAgICAgICAgdGhyb3cgbmV3IFR3aWcuRXJyb3IoJ1lvdSBhcmUgdXNpbmcgVHdpZy5qcyBpbiBzeW5jIG1vZGUgaW4gY29tYmluYXRpb24gd2l0aCBhc3luYyBleHRlbnNpb25zLicpO1xuXG5cdCAgICAgICAgcmV0dXJuIG91dHB1dDtcblx0ICAgIH07XG5cblx0ICAgIHJldHVybiBUd2lnO1xuXG5cdH07XG5cblxuLyoqKi8gfSxcbi8qIDIyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKFR3aWcpIHtcblx0ICAgICd1c2Ugc3RyaWN0JztcblxuXHQgICAgVHdpZy5UZW1wbGF0ZXMucmVnaXN0ZXJQYXJzZXIoJ3NvdXJjZScsIGZ1bmN0aW9uKHBhcmFtcykge1xuXHQgICAgICAgIHJldHVybiBwYXJhbXMuZGF0YSB8fCAnJztcblx0ICAgIH0pO1xuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiAyMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihUd2lnKSB7XG5cdCAgICAndXNlIHN0cmljdCc7XG5cblx0ICAgIFR3aWcuVGVtcGxhdGVzLnJlZ2lzdGVyUGFyc2VyKCd0d2lnJywgZnVuY3Rpb24ocGFyYW1zKSB7XG5cdCAgICAgICAgcmV0dXJuIG5ldyBUd2lnLlRlbXBsYXRlKHBhcmFtcyk7XG5cdCAgICB9KTtcblx0fTtcblxuXG4vKioqLyB9LFxuLyogMjQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vICMjIHR3aWcucGF0aC5qc1xuXHQvL1xuXHQvLyBUaGlzIGZpbGUgaGFuZGxlcyBwYXRoIHBhcnNpbmdcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVHdpZykge1xuXHQgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cblx0ICAgIC8qKlxuXHQgICAgICogTmFtZXNwYWNlIGZvciBwYXRoIGhhbmRsaW5nLlxuXHQgICAgICovXG5cdCAgICBUd2lnLnBhdGggPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBHZW5lcmF0ZSB0aGUgY2Fub25pY2FsIHZlcnNpb24gb2YgYSB1cmwgYmFzZWQgb24gdGhlIGdpdmVuIGJhc2UgcGF0aCBhbmQgZmlsZSBwYXRoIGFuZCBpblxuXHQgICAgICogdGhlIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBuYW1lc3BhY2VzLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSAge3N0cmluZ30gdGVtcGxhdGUgVGhlIFR3aWcgVGVtcGxhdGVcblx0ICAgICAqIEBwYXJhbSAge3N0cmluZ30gZmlsZSAgICAgVGhlIGZpbGUgcGF0aCwgbWF5IGJlIHJlbGF0aXZlIGFuZCBtYXkgY29udGFpbiBuYW1lc3BhY2VzLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgVGhlIGNhbm9uaWNhbCB2ZXJzaW9uIG9mIHRoZSBwYXRoXG5cdCAgICAgKi9cblx0ICAgICBUd2lnLnBhdGgucGFyc2VQYXRoID0gZnVuY3Rpb24odGVtcGxhdGUsIGZpbGUpIHtcblx0ICAgICAgICB2Y
46184XIgbmFtZXNwYWNlcyA9IG51bGwsXG5cdCAgICAgICAgICAgIGZpbGUgPSBmaWxlIHx8IFwiXCI7XG5cblx0ICAgICAgICBpZiAodHlwZW9mIHRlbXBsYXRlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdGVtcGxhdGUub3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcblx0ICAgICAgICAgICAgbmFtZXNwYWNlcyA9IHRlbXBsYXRlLm9wdGlvbnMubmFtZXNwYWNlcztcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBpZiAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdvYmplY3QnICYmIChmaWxlLmluZGV4T2YoJzo6JykgPiAwKSB8fCBmaWxlLmluZGV4T2YoJ0AnKSA+PSAwKXtcblx0ICAgICAgICAgICAgZm9yICh2YXIgayBpbiBuYW1lc3BhY2VzKXtcblx0ICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VzLmhhc093blByb3BlcnR5KGspKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGZpbGUucmVwbGFjZShrICsgJzo6JywgbmFtZXNwYWNlc1trXSk7XG5cdCAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGZpbGUucmVwbGFjZSgnQCcgKyBrLCBuYW1lc3BhY2VzW2tdKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBmaWxlO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHJldHVybiBUd2lnLnBhdGgucmVsYXRpdmVQYXRoKHRlbXBsYXRlLCBmaWxlKTtcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogR2VuZXJhdGUgdGhlIHJlbGF0aXZlIGNhbm9uaWNhbCB2ZXJzaW9uIG9mIGEgdXJsIGJhc2VkIG9uIHRoZSBnaXZlbiBiYXNlIHBhdGggYW5kIGZpbGUgcGF0aC5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1R3aWcuVGVtcGxhdGV9IHRlbXBsYXRlIFRoZSBUd2lnLlRlbXBsYXRlLlxuXHQgICAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGUgVGhlIGZpbGUgcGF0aCwgcmVsYXRpdmUgdG8gdGhlIGJhc2UgcGF0aC5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjYW5vbmljYWwgdmVyc2lvbiBvZiB0aGUgcGF0aC5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5wYXRoLnJlbGF0aXZlUGF0aCA9IGZ1bmN0aW9uKHRlbXBsYXRlLCBmaWxlKSB7XG5cdCAgICAgICAgdmFyIGJhc2UsXG5cdCAgICAgICAgICAgIGJhc2VfcGF0aCxcblx0ICAgICAgICAgICAgc2VwX2NociA9IFwiL1wiLFxuXHQgICAgICAgICAgICBuZXdfcGF0aCA9IFtdLFxuXHQgICAgICAgICAgICBmaWxlID0gZmlsZSB8fCBcIlwiLFxuXHQgICAgICAgICAgICB2YWw7XG5cblx0ICAgICAgICBpZiAodGVtcGxhdGUudXJsKSB7XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUuYmFzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0ICAgICAgICAgICAgICAgIGJhc2UgPSB0ZW1wbGF0ZS5iYXNlICsgKCh0ZW1wbGF0ZS5iYXNlLmNoYXJBdCh0ZW1wbGF0ZS5iYXNlLmxlbmd0aC0xKSA9PT0gJy8nKSA/ICcnIDogJy8nKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGJhc2UgPSB0ZW1wbGF0ZS51cmw7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2UgaWYgKHRlbXBsYXRlLnBhdGgpIHtcblx0ICAgICAgICAgICAgLy8gR2V0IHRoZSBzeXN0ZW0tc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3Jcblx0ICAgICAgICAgICAgdmFyIHBhdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKSxcblx0ICAgICAgICAgICAgICAgIHNlcCA9IHBhdGguc2VwIHx8IHNlcF9jaHIsXG5cdCAgICAgICAgICAgICAgICByZWxhdGl2ZSA9IG5ldyBSZWdFeHAoXCJeXFxcXC57MSwyfVwiICsgc2VwLnJlcGxhY2UoXCJcXFxcXCIsIFwiXFxcXFxcXFxcIikpO1xuXHQgICAgICAgICAgICBmaWxlID0gZmlsZS5yZXBsYWNlKC9cXC8vZywgc2VwKTtcblxuXHQgICAgICAgICAgICBpZiAodGVtcGxhdGUuYmFzZSAhPT0gdW5kZWZpbmVkICYmIGZpbGUubWF0Y2gocmVsYXRpdmUpID09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgIGZpbGUgPSBmaWxlLnJlcGxhY2UodGVtcGxhdGUuYmFzZSwgJycpO1xuXHQgICAgICAgICAgICAgICAgYmFzZSA9IHRlbXBsYXRlLmJhc2UgKyBzZXA7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBiYXNlID0gcGF0aC5ub3JtYWxpemUodGVtcGxhdGUucGF0aCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBiYXNlID0gYmFzZS5yZXBsYWNlKHNlcCtzZXAsIHNlcCk7XG5cdCAgICAgICAgICAgIHNlcF9jaHIgPSBzZXA7XG5cdCAgICAgICAgfSBlbHNlIGlmICgodGVtcGxhdGUubmFtZSB8fCB0ZW1wbGF0ZS5pZCkgJiYgdGVtcGxhdGUubWV0aG9kICYmIHRlbXBsYXRlLm1ldGhvZCAhPT0gJ2ZzJyAmJiB0ZW1wbGF0ZS5tZXRob2QgIT09ICdhamF4Jykge1xuXHQgICAgICAgICAgICAvLyBDdXN0b20gcmVnaXN0ZXJlZCBsb2FkZXJcblx0ICAgICAgICAgICAgYmFzZSA9IHRlbXBsYXRlLmJhc2UgfHwgdGVtcGxhdGUubmFtZSB8fCB0ZW1wbGF0ZS5pZDtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcihcIkNhbm5vdCBleHRlbmQgYW4gaW5saW5lIHRlbXBsYXRlLlwiKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBiYXNlX3BhdGggPSBiYXNlLnNwbGl0KHNlcF9jaHIpO1xuXG5cdCAgICAgICAgLy8gUmVtb3ZlIGZpbGUgZnJvbSB1cmxcblx0ICAgICAgICBiYXNlX3BhdGgucG9wKCk7XG5cdCAgICAgICAgYmFzZV9wYXRoID0gYmFzZV9wYXRoLmNvbmNhdChmaWxlLnNwbGl0KHNlcF9jaHIpKTtcblxuXHQgICAgICAgIHdoaWxlIChiYXNlX3BhdGgubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICB2YWwgPSBiYXNlX3BhdGguc2hpZnQoKTtcblx0ICAgICAgICAgICAgaWYgKHZhbCA9PSBcIi5cIikge1xuXHQgICAgICAgICAgICAgICAgLy8gSWdub3JlXG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsID09IFwiLi5cIiAmJiBuZXdfcGF0aC5sZW5ndGggPiAwICYmIG5ld19wYXRoW25ld19wYXRoLmxlbmd0aC0xXSAhPSBcIi4uXCIpIHtcblx0ICAgICAgICAgICAgICAgIG5ld19wYXRoLnBvcCgpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgbmV3X3BhdGgucHVzaCh2YWwpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcmV0dXJuIG5ld19wYXRoLmpvaW4oc2VwX2Nocik7XG5cdCAgICB9O1xuXG5cdCAgICByZXR1cm4gVHdpZztcblx0fTtcblxuXG4vKioqLyB9LFxuLyogMjUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vICMjIHR3aWcudGVzdHMuanNcblx0Ly9cblx0Ly8gVGhpcyBmaWxlIGhhbmRsZXMgZXhwcmVzc2lvbiB0ZXN0cy4gKGlzIGVtcHR5LCBpcyBub3QgZGVmaW5lZCwgZXRjLi4uKVxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUd2lnKSB7XG5cdCAgICBcInVzZSBzdHJpY3RcIjtcblx0ICAgIFR3aWcudGVzdHMgPSB7XG5cdCAgICAgICAgZW1wdHk6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdCAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICAgICAgLy8gSGFuZGxlciBudW1iZXJzXG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybi
46184BmYWxzZTsgLy8gbnVtYmVycyBhcmUgbmV2ZXIgXCJlbXB0eVwiXG5cdCAgICAgICAgICAgIC8vIEhhbmRsZSBzdHJpbmdzIGFuZCBhcnJheXNcblx0ICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPiAwKSByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICAgIC8vIEhhbmRsZSBvYmplY3RzXG5cdCAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KGtleSkpIHJldHVybiBmYWxzZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIG9kZDogZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHZhbHVlICUgMiA9PT0gMTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGV2ZW46IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB2YWx1ZSAlIDIgPT09IDA7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBkaXZpc2libGVieTogZnVuY3Rpb24odmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgICAgICByZXR1cm4gdmFsdWUgJSBwYXJhbXNbMF0gPT09IDA7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBkZWZpbmVkOiBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIG5vbmU6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgICdudWxsJzogZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9uZSh2YWx1ZSk7IC8vIEFsaWFzIG9mIG5vbmVcblx0ICAgICAgICB9LFxuXHQgICAgICAgICdzYW1lIGFzJzogZnVuY3Rpb24odmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IHBhcmFtc1swXTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNhbWVhczogZnVuY3Rpb24odmFsdWUsIHBhcmFtcykge1xuXHQgICAgICAgICAgICBjb25zb2xlLndhcm4oJ2BzYW1lYXNgIGlzIGRlcHJlY2F0ZWQgdXNlIGBzYW1lIGFzYCcpO1xuXHQgICAgICAgICAgICByZXR1cm4gVHdpZy50ZXN0c1snc2FtZSBhcyddKHZhbHVlLCBwYXJhbXMpO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgaXRlcmFibGU6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB2YWx1ZSAmJiAoVHdpZy5saWIuaXMoXCJBcnJheVwiLCB2YWx1ZSkgfHwgVHdpZy5saWIuaXMoXCJPYmplY3RcIiwgdmFsdWUpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLypcblx0ICAgICAgICBjb25zdGFudCA/XG5cdCAgICAgICAgICovXG5cdCAgICB9O1xuXG5cdCAgICBUd2lnLnRlc3QgPSBmdW5jdGlvbih0ZXN0LCB2YWx1ZSwgcGFyYW1zKSB7XG5cdCAgICAgICAgaWYgKCFUd2lnLnRlc3RzW3Rlc3RdKSB7XG5cdCAgICAgICAgICAgIHRocm93IFwiVGVzdCBcIiArIHRlc3QgKyBcIiBpcyBub3QgZGVmaW5lZC5cIjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIFR3aWcudGVzdHNbdGVzdF0odmFsdWUsIHBhcmFtcyk7XG5cdCAgICB9O1xuXG5cdCAgICBUd2lnLnRlc3QuZXh0ZW5kID0gZnVuY3Rpb24odGVzdCwgZGVmaW5pdGlvbikge1xuXHQgICAgICAgIFR3aWcudGVzdHNbdGVzdF0gPSBkZWZpbml0aW9uO1xuXHQgICAgfTtcblxuXHQgICAgcmV0dXJuIFR3aWc7XG5cdH07XG5cblxuLyoqKi8gfSxcbi8qIDI2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyAjIyB0d2lnLmFzeW5jLmpzXG5cdC8vXG5cdC8vIFRoaXMgZmlsZSBoYW5kbGVzIGFzeW5jaHJvbm91cyB0YXNrcyB3aXRoaW4gdHdpZy5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVHdpZykge1xuXHQgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cblx0ICAgIFR3aWcucGFyc2VBc3luYyA9IGZ1bmN0aW9uICh0b2tlbnMsIGNvbnRleHQpIHtcblx0ICAgICAgICByZXR1cm4gVHdpZy5wYXJzZS5hcHBseSh0aGlzLCBbdG9rZW5zLCBjb250ZXh0LCB0cnVlXSk7XG5cdCAgICB9XG5cblx0ICAgIFR3aWcuZXhwcmVzc2lvbi5wYXJzZUFzeW5jID0gZnVuY3Rpb24gKHRva2VucywgY29udGV4dCwgdG9rZW5zX2FyZV9wYXJhbWV0ZXJzKSB7XG5cdCAgICAgICAgcmV0dXJuIFR3aWcuZXhwcmVzc2lvbi5wYXJzZS5hcHBseSh0aGlzLCBbdG9rZW5zLCBjb250ZXh0LCB0b2tlbnNfYXJlX3BhcmFtZXRlcnMsIHRydWVdKTtcblx0ICAgIH1cblxuXHQgICAgVHdpZy5sb2dpYy5wYXJzZUFzeW5jID0gZnVuY3Rpb24gKHRva2VuLCBjb250ZXh0LCBjaGFpbikge1xuXHQgICAgICAgIHJldHVybiBUd2lnLmxvZ2ljLnBhcnNlLmFwcGx5KHRoaXMsIFt0b2tlbiwgY29udGV4dCwgY2hhaW4sIHRydWVdKTtcblx0ICAgIH1cblxuXHQgICAgVHdpZy5UZW1wbGF0ZS5wcm90b3R5cGUucmVuZGVyQXN5bmMgPSBmdW5jdGlvbiAoY29udGV4dCwgcGFyYW1zKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKGNvbnRleHQsIHBhcmFtcywgdHJ1ZSk7XG5cdCAgICB9XG5cblx0ICAgIFR3aWcuYXN5bmMgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBDaGVja3MgZm9yIGB0aGVuYWJsZWAgb2JqZWN0c1xuXHQgICAgICovXG5cdCAgICBUd2lnLmlzUHJvbWlzZSA9IGZ1bmN0aW9uKG9iaikge1xuXHQgICAgICAgIHJldHVybiBvYmogJiYgKHR5cGVvZiBvYmoudGhlbiA9PSAnZnVuY3Rpb24nKTtcblx0ICAgIH1cblxuXHQgICAgLyoqXG5cdCAgICAgKiBBbiBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gb2YgYSBQcm9taXNlIHRoYXQgZG9lcyBub3QgZnVsbHkgZm9sbG93XG5cdCAgICAgKiB0aGUgc3BlYywgYnV0IGluc3RlYWQgd29ya3MgZnVsbHkgc3luY2hyb25vdXMgd2hpbGUgc3RpbGwgYmVpbmdcblx0ICAgICAqIHRoZW5hYmxlLlxuXHQgICAgICpcblx0ICAgICAqIFRoZXNlIHByb21pc2VzIGNhbiBiZSBtaXhlZCB3aXRoIHJlZ3VsYXIgcHJvbWlzZXMgYXQgd2hpY2ggcG9pbnRcblx0ICAgICAqIHRoZSBzeW5jaHJvbm91cyBiZWhhdmlvdXIgaXMgbG9zdC5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5Qcm9taXNlID0gZnVuY3Rpb24oZXhlY3V0b3IpIHtcblx0ICAgICAgICAvLyBTdGF0ZVxuXHQgICAgICAgI
46184HZhciBzdGF0ZSA9ICd1bmtub3duJztcblx0ICAgICAgICB2YXIgdmFsdWUgPSBudWxsO1xuXHQgICAgICAgIHZhciBoYW5kbGVycyA9IG51bGw7XG5cblx0ICAgICAgICBmdW5jdGlvbiBjaGFuZ2VTdGF0ZShuZXdTdGF0ZSwgdikge1xuXHQgICAgICAgICAgICBzdGF0ZSA9IG5ld1N0YXRlO1xuXHQgICAgICAgICAgICB2YWx1ZSA9IHY7XG5cdCAgICAgICAgICAgIG5vdGlmeSgpO1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgZnVuY3Rpb24gb25SZXNvbHZlKHYpIHsgY2hhbmdlU3RhdGUoJ3Jlc29sdmUnLCB2KTsgfVxuXHQgICAgICAgIGZ1bmN0aW9uIG9uUmVqZWN0KGUpIHsgY2hhbmdlU3RhdGUoJ3JlamVjdCcsIGUpOyB9XG5cblx0ICAgICAgICBmdW5jdGlvbiBub3RpZnkoKSB7XG5cdCAgICAgICAgICAgIGlmICghaGFuZGxlcnMpIHJldHVybjtcblxuXHQgICAgICAgICAgICBUd2lnLmZvckVhY2goaGFuZGxlcnMsIGZ1bmN0aW9uKGgpIHtcblx0ICAgICAgICAgICAgICAgIGFwcGVuZChoLnJlc29sdmUsIGgucmVqZWN0KTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIGhhbmRsZXJzID0gbnVsbDtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBmdW5jdGlvbiBhcHBlbmQob25SZXNvbHZlZCwgb25SZWplY3RlZCkge1xuXHQgICAgICAgICAgICB2YXIgaCA9IHtcblx0ICAgICAgICAgICAgICAgIHJlc29sdmU6IG9uUmVzb2x2ZWQsXG5cdCAgICAgICAgICAgICAgICByZWplY3Q6IG9uUmVqZWN0ZWRcblx0ICAgICAgICAgICAgfTtcblxuXHQgICAgICAgICAgICAvLyBUaGUgcHJvbWlzZSBoYXMgeWV0IHRvIGJlIHJlamVjdGVkIG9yIHJlc29sdmVkLlxuXHQgICAgICAgICAgICBpZiAoc3RhdGUgPT0gJ3Vua25vd24nKSB7XG5cdCAgICAgICAgICAgICAgICBoYW5kbGVycyA9IGhhbmRsZXJzIHx8IFtdO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJzLnB1c2goaCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBUaGUgc3RhdGUgaGFzIGJlZW4gY2hhbmdlZCB0byBlaXRoZXIgcmVzb2x2ZSwgb3IgcmVqZWN0XG5cdCAgICAgICAgICAgIC8vIHdoaWNoIG1lYW5zIHdlIHNob3VsZCBjYWxsIHRoZSBoYW5kbGVyLlxuXHQgICAgICAgICAgICBpZiAoaFtzdGF0ZV0pXG5cdCAgICAgICAgICAgICAgICBoW3N0YXRlXSh2YWx1ZSk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgZnVuY3Rpb24gcnVuKGZuLCByZXNvbHZlLCByZWplY3QpIHtcblx0ICAgICAgICAgICAgdmFyIGRvbmUgPSBmYWxzZTtcblx0ICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uKHYpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkgcmV0dXJuO1xuXHQgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodik7XG5cdCAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHJldHVybjtcblx0ICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfSBjYXRjaChlKSB7XG5cdCAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIHJlamVjdChlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGZ1bmN0aW9uIHJlYWR5KHJlc3VsdCkge1xuXHQgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgaWYgKCFUd2lnLmlzUHJvbWlzZShyZXN1bHQpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uUmVzb2x2ZShyZXN1bHQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBydW4ocmVzdWx0LnRoZW4uYmluZChyZXN1bHQpLCByZWFkeSwgb25SZWplY3QpO1xuXHQgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgICAgICAgICAgICBvblJlamVjdChlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHJ1bihleGVjdXRvciwgcmVhZHksIG9uUmVqZWN0KTtcblxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIHRoZW46IGZ1bmN0aW9uKG9uUmVzb2x2ZWQsIG9uUmVqZWN0ZWQpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBoYXNSZXNvbHZlZCA9IHR5cGVvZiBvblJlc29sdmVkID09ICdmdW5jdGlvbic7XG5cdCAgICAgICAgICAgICAgICB2Y
46184XIgaGFzUmVqZWN0ZWQgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFR3aWcuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0ICAgICAgICAgICAgICAgICAgICBhcHBlbmQoZnVuY3Rpb24ocmVzdWx0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZXNvbHZlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG9uUmVzb2x2ZWQocmVzdWx0KSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZWplY3RlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG9uUmVqZWN0ZWQoZXJyKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBjYXRjaDogZnVuY3Rpb24ob25SZWplY3RlZCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBvblJlamVjdGVkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICB9XG5cblx0ICAgIFR3aWcuUHJvbWlzZS5yZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgICAgICByZXR1cm4gbmV3IFR3aWcuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG5cdCAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgfTtcblxuXHQgICAgVHdpZy5Qcm9taXNlLnJlamVjdCA9IGZ1bmN0aW9uKGUpIHtcblx0ICAgICAgICByZXR1cm4gbmV3IFR3aWcuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0ICAgICAgICAgICAgcmVqZWN0KGUpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgfTtcblxuXHQgICAgVHdpZy5Qcm9taXNlLmFsbCA9IGZ1bmN0aW9uKHByb21pc2VzKSB7XG5cdCAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcblxuXHQgICAgICAgIHJldHVybiBUd2lnLmFzeW5jLmZvckVhY2gocHJvbWlzZXMsIGZ1bmN0aW9uKHAsIGluZGV4KSB7XG5cdCAgICAgICAgICAgIGlmICghVHdpZy5pc1Byb21pc2UocCkpIHtcblx0ICAgICAgICAgICAgICAgIHJlc3VsdHNbaW5kZXhdID0gcDtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBwLnRoZW4oZnVuY3Rpb24odikge1xuXHQgICAgICAgICAgICAgICAgcmVzdWx0c1tpbmRleF0gPSB2O1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9KVxuXHQgICAgICAgIC50aGVuKGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcblx0ICAgICAgICB9KTtcblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgKiBHbyBvdmVyIGVhY2ggaXRlbSBpbiBhIGZhc2hpb24gY29tcGF0aWJsZSB3aXRoIFR3aWcuZm9yRWFjaCxcblx0ICAgICogYWxsb3cgdGhlIGZ1bmN0aW9uIHRvIHJldHVybiBhIHByb21pc2Ugb3IgY2FsbCB0aGUgdGhpcmQgYXJndW1lbnRcblx0ICAgICogdG8gc2lnbmFsIGl0IGlzIGZpbmlzaGVkLlxuXHQgICAgKlxuXHQgICAgKiBFYWNoIGl0ZW0gaW4gdGhlIGFycmF5IHdpbGwgYmUgY2FsbGVkIHNlcXVlbnRpYWxseS5cblx0ICAgICovXG5cdCAgICBUd2lnLmFzeW5jLmZvckVhY2ggPSBmdW5jdGlvbiBmb3JFYWNoQXN5bmMoYXJyLCBjYWxsYmFjaykge1xuXHQgICAgICAgIHZhciBhcmdfaW5kZXggPSAwO1xuXHQgICAgICAgIHZhciBjYWxsYmFja3MgPSB7fTtcblx0ICAgICAgICB2Y
46184XIgcHJvbWlzZSA9IG5ldyBUd2lnLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdCAgICAgICAgICAgIGNhbGxiYWNrcyA9IHtcblx0ICAgICAgICAgICAgICAgIHJlc29sdmU6IHJlc29sdmUsXG5cdCAgICAgICAgICAgICAgICByZWplY3Q6IHJlamVjdFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH0pO1xuXG5cdCAgICAgICAgZnVuY3Rpb24gZmFpbChlcnIpIHtcblx0ICAgICAgICAgICAgY2FsbGJhY2tzLnJlamVjdChlcnIpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGZ1bmN0aW9uIG5leHQodmFsdWUpIHtcblx0ICAgICAgICAgICAgaWYgKCFUd2lnLmlzUHJvbWlzZSh2YWx1ZSkpXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0ZSgpO1xuXG5cdCAgICAgICAgICAgIHZhbHVlLnRoZW4obmV4dCwgZmFpbCk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgZnVuY3Rpb24gaXRlcmF0ZSgpIHtcblx0ICAgICAgICAgICAgdmFyIGluZGV4ID0gYXJnX2luZGV4Kys7XG5cblx0ICAgICAgICAgICAgaWYgKGluZGV4ID09IGFyci5sZW5ndGgpIHtcblx0ICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5yZXNvbHZlKCk7XG5cdCAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBuZXh0KGNhbGxiYWNrKGFycltpbmRleF0sIGluZGV4KSk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgaXRlcmF0ZSgpO1xuXG5cdCAgICAgICAgcmV0dXJuIHByb21pc2U7XG5cdCAgICB9O1xuXG5cdCAgICByZXR1cm4gVHdpZztcblxuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiAyNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Ly8gIyMgdHdpZy5leHBvcnRzLmpzXG5cdC8vXG5cdC8vIFRoaXMgZmlsZSBwcm92aWRlcyBleHRlbnNpb24gcG9pbnRzIGFuZCBvdGhlciBob29rcyBpbnRvIHRoZSB0d2lnIGZ1bmN0aW9uYWxpdHkuXG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVHdpZykge1xuXHQgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cdCAgICBUd2lnLmV4cG9ydHMgPSB7XG5cdCAgICAgICAgVkVSU0lPTjogVHdpZy5WRVJTSU9OXG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIENyZWF0ZSBhbmQgY29tcGlsZSBhIHR3aWcuanMgdGVtcGxhdGUuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtIFBhcmFtdGVyZXMgZm9yIGNyZWF0aW5nIGEgVHdpZyB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtUd2lnLlRlbXBsYXRlfSBBIFR3aWcgdGVtcGxhdGUgcmVhZHkgZm9yIHJlbmRlcmluZy5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5leHBvcnRzLnR3aWcgPSBmdW5jdGlvbiB0d2lnKHBhcmFtcykge1xuXHQgICAgICAgICd1c2Ugc3RyaWN0Jztcblx0ICAgICAgICB2Y
46184XIgaWQgPSBwYXJhbXMuaWQsXG5cdCAgICAgICAgICAgIG9wdGlvbnMgPSB7XG5cdCAgICAgICAgICAgICAgICBzdHJpY3RfdmFyaWFibGVzOiBwYXJhbXMuc3RyaWN0X3ZhcmlhYmxlcyB8fCBmYWxzZSxcblx0ICAgICAgICAgICAgICAgIC8vIFRPRE86IHR1cm4gYXV0b3NjYXBlIG9uIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb25cblx0ICAgICAgICAgICAgICAgIGF1dG9lc2NhcGU6IHBhcmFtcy5hdXRvZXNjYXBlICE9IG51bGwgJiYgcGFyYW1zLmF1dG9lc2NhcGUgfHwgZmFsc2UsXG5cdCAgICAgICAgICAgICAgICBhbGxvd0lubGluZUluY2x1ZGVzOiBwYXJhbXMuYWxsb3dJbmxpbmVJbmNsdWRlcyB8fCBmYWxzZSxcblx0ICAgICAgICAgICAgICAgIHJldGhyb3c6IHBhcmFtcy5yZXRocm93IHx8IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgbmFtZXNwYWNlczogcGFyYW1zLm5hbWVzcGFjZXNcblx0ICAgICAgICAgICAgfTtcblxuXHQgICAgICAgIGlmIChUd2lnLmNhY2hlICYmIGlkKSB7XG5cdCAgICAgICAgICAgIFR3aWcudmFsaWRhdGVJZChpZCk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgaWYgKHBhcmFtcy5kZWJ1ZyAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIFR3aWcuZGVidWcgPSBwYXJhbXMuZGVidWc7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChwYXJhbXMudHJhY2UgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICBUd2lnLnRyYWNlID0gcGFyYW1zLnRyYWNlO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGlmIChwYXJhbXMuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBUd2lnLlRlbXBsYXRlcy5wYXJzZXJzLnR3aWcoe1xuXHQgICAgICAgICAgICAgICAgZGF0YTogcGFyYW1zLmRhdGEsXG5cdCAgICAgICAgICAgICAgICBwYXRoOiBwYXJhbXMuaGFzT3duUHJvcGVydHkoJ3BhdGgnKSA/IHBhcmFtcy5wYXRoIDogdW5kZWZpbmVkLFxuXHQgICAgICAgICAgICAgICAgbW9kdWxlOiBwYXJhbXMubW9kdWxlLFxuXHQgICAgICAgICAgICAgICAgaWQ6ICAgaWQsXG5cdCAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG5cdCAgICAgICAgICAgIH0pO1xuXG5cdCAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMucmVmICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgaWYgKHBhcmFtcy5pZCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHdpZy5FcnJvcihcIkJvdGggcmVmIGFuZCBpZCBjYW5ub3QgYmUgc2V0IG9uIGEgdHdpZy5qcyB0ZW1wbGF0ZS5cIik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIFR3aWcuVGVtcGxhdGVzLmxvYWQocGFyYW1zLnJlZik7XG5cdCAgICAgICAgXG5cdCAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMubWV0aG9kICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgaWYgKCFUd2lnLlRlbXBsYXRlcy5pc1JlZ2lzdGVyZWRMb2FkZXIocGFyYW1zLm1ldGhvZCkpIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBUd2lnLkVycm9yKCdMb2FkZXIgZm9yIFwiJyArIHBhcmFtcy5tZXRob2QgKyAnXCIgaXMgbm90IGRlZmluZWQuJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIFR3aWcuVGVtcGxhdGVzLmxvYWRSZW1vdGUocGFyYW1zLm5hbWUgfHwgcGFyYW1zLmhyZWYgfHwgcGFyYW1zLnBhdGggfHwgaWQgfHwgdW5kZWZpbmVkLCB7XG5cdCAgICAgICAgICAgICAgICBpZDogaWQsXG5cdCAgICAgICAgICAgICAgICBtZXRob2Q6IHBhcmFtcy5tZXRob2QsXG5cdCAgICAgICAgICAgICAgICBwYXJzZXI6IHBhcmFtcy5wYXJzZXIgfHwgJ3R3aWcnLFxuXHQgICAgICAgICAgICAgICAgYmFzZTogcGFyYW1zLmJhc2UsXG5cdCAgICAgICAgICAgICAgICBtb2R1bGU6IHBhcmFtcy5tb2R1bGUsXG5cdCAgICAgICAgICAgICAgICBwcmVjb21waWxlZDogcGFyYW1zLnByZWNvbXBpbGVkLFxuXHQgICAgICAgICAgICAgICAgYXN5bmM6IHBhcmFtcy5hc3luYyxcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcblxuXHQgICAgICAgICAgICB9LCBwYXJhbXMubG9hZCwgcGFyYW1zLmVycm9yKTtcblxuXHQgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLmhyZWYgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICByZXR1cm4gVHdpZy5UZW1wbGF0ZXMubG9hZFJlbW90ZShwYXJhbXMuaHJlZiwge1xuXHQgICAgICAgICAgICAgICAgaWQ6IGlkLFxuXHQgICAgICAgICAgICAgICAgbWV0aG9kOiAnYWpheCcsXG5cdCAgICAgICAgICAgICAgICBwYXJzZXI6IHBhcmFtcy5wYXJzZXIgfHwgJ3R3aWcnLFxuXHQgICAgICAgICAgICAgICAgYmFzZTogcGFyYW1zLmJhc2UsXG5cdCAgICAgICAgICAgICAgICBtb2R1bGU6IHBhcmFtcy5tb2R1bGUsXG5cdCAgICAgICAgICAgICAgICBwcmVjb21waWxlZDogcGFyYW1zLnByZWNvbXBpbGVkLFxuXHQgICAgICAgICAgICAgICAgYXN5bmM6IHBhcmFtcy5hc3luYyxcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcblxuXHQgICAgICAgICAgICB9LCBwYXJhbXMubG9hZCwgcGFyYW1zLmVycm9yKTtcblxuXHQgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnBhdGggIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICByZXR1cm4gVHdpZy5UZW1wbGF0ZXMubG9hZFJlbW90ZShwYXJhbXMucGF0aCwge1xuXHQgICAgICAgICAgICAgICAgaWQ6IGlkLFxuXHQgICAgICAgICAgICAgICAgbWV0aG9kOiAnZnMnLFxuXHQgICAgICAgICAgICAgICAgcGFyc2VyOiBwYXJhbXMucGFyc2VyIHx8ICd0d2lnJyxcblx0ICAgICAgICAgICAgICAgIGJhc2U6IHBhcmFtcy5iYXNlLFxuXHQgICAgICAgICAgICAgICAgbW9kdWxlOiBwYXJhbXMubW9kdWxlLFxuXHQgICAgICAgICAgICAgICAgcHJlY29tcGlsZWQ6IHBhcmFtcy5wcmVjb21waWxlZCxcblx0ICAgICAgICAgICAgICAgIGFzeW5jOiBwYXJhbXMuYXN5bmMsXG5cdCAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG5cblx0ICAgICAgICAgICAgfSwgcGFyYW1zLmxvYWQsIHBhcmFtcy5lcnJvcik7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLy8gRXh0ZW5kIFR3aWcgd2l0aCBhIG5ldyBmaWx0ZXIuXG5cdCAgICBUd2lnLmV4cG9ydHMuZXh0ZW5kRmlsdGVyID0gZnVuY3Rpb24oZmlsdGVyLCBkZWZpbml0aW9uKSB7XG5cdCAgICAgICAgVHdpZy5maWx0ZXIuZXh0ZW5kKGZpbHRlciwgZGVmaW5pdGlvbik7XG5cdCAgICB9O1xuXG5cdCAgICAvLyBFeHRlbmQgVHdpZyB3aXRoIGEgbmV3IGZ1bmN0aW9uLlxuXHQgICAgVHdpZy5leHBvcnRzLmV4dGVuZEZ1bmN0aW9uID0gZnVuY3Rpb24oZm4sIGRlZmluaXRpb24pIHtcblx0ICAgICAgICBUd2lnLl9mdW5jdGlvbi5leHRlbmQoZm4sIGRlZmluaXRpb24pO1xuXHQgICAgfTtcblxuXHQgICAgLy8gRXh0ZW5kIFR3aWcgd2l0aCBhIG5ldyB0ZXN0LlxuXHQgICAgVHdpZy5leHBvcnRzLmV4dGVuZFRlc3QgPSBmdW5jdGlvbih0ZXN0LCBkZWZpbml0aW9uKSB7XG5cdCAgICAgICAgVHdpZy50ZXN0LmV4dGVuZCh0ZXN0LCBkZWZpbml0aW9uKTtcblx0ICAgIH07XG5cblx0ICAgIC8vIEV4dGVuZCBUd2lnIHdpdGggYSBuZXcgZGVmaW5pdGlvbi5cblx0ICAgIFR3aWcuZXhwb3J0cy5leHRlbmRUYWcgPSBmdW5jdGlvbihkZWZpbml0aW9uKSB7XG5cdCAgICAgICAgVHdpZy5sb2dpYy5leHRlbmQoZGVmaW5pdGlvbik7XG5cdCAgICB9O1xuXG5cdCAgICAvLyBQcm92aWRlIGFuIGVudmlyb25tZW50IGZvciBleHRlbmRpbmcgVHdpZyBjb3JlLlxuXHQgICAgLy8gQ2FsbHMgZm4gd2l0aCB0aGUgaW50ZXJuYWwgVHdpZyBvYmplY3QuXG5cdCAgICBUd2lnLmV4cG9ydHMuZXh0ZW5kID0gZnVuY3Rpb24oZm4pIHtcblx0ICAgICAgICBmbihUd2lnKTtcblx0ICAgIH07XG5cblxuXHQgICAgLyoqXG5cdCAgICAgKiBQcm92aWRlIGFuIGV4dGVuc2lvbiBmb3IgdXNlIHdpdGggZXhwcmVzcyAyLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgVGhlIHRlbXBsYXRlIG1hcmt1cC5cblx0ICAgICAqIEBwYXJhbSB7YXJyYXl9IG9wdGlvbnMgVGhlIGV4cHJlc3Mgb3B0aW9ucy5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSByZW5kZXJlZCB0ZW1wbGF0ZS5cblx0ICAgICAqL1xuXHQgICAgVHdpZy5leHBvcnRzLmNvbXBpbGUgPSBmdW5jdGlvbihtY
46184XJrdXAsIG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgaWQgPSBvcHRpb25zLmZpbGVuYW1lLFxuXHQgICAgICAgICAgICBwYXRoID0gb3B0aW9ucy5maWxlbmFtZSxcblx0ICAgICAgICAgICAgdGVtcGxhdGU7XG5cblx0ICAgICAgICAvLyBUcnkgdG8gbG9hZCB0aGUgdGVtcGxhdGUgZnJvbSB0aGUgY2FjaGVcblx0ICAgICAgICB0ZW1wbGF0ZSA9IG5ldyBUd2lnLlRlbXBsYXRlKHtcblx0ICAgICAgICAgICAgZGF0YTogbWFya3VwLFxuXHQgICAgICAgICAgICBwYXRoOiBwYXRoLFxuXHQgICAgICAgICAgICBpZDogaWQsXG5cdCAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnMuc2V0dGluZ3NbJ3R3aWcgb3B0aW9ucyddXG5cdCAgICAgICAgfSk7IC8vIFR3aWcuVGVtcGxhdGVzLmxvYWQoaWQpIHx8XG5cblx0ICAgICAgICByZXR1cm4gZnVuY3Rpb24oY29udGV4dCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGUucmVuZGVyKGNvbnRleHQpO1xuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIFByb3ZpZGUgYW4gZXh0ZW5zaW9uIGZvciB1c2Ugd2l0aCBleHByZXNzIDMuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIGxvY2F0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBmaWxlIG9uIGRpc2suXG5cdCAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gVGhlIG9wdGlvbnMgb3IgY2FsbGJhY2suXG5cdCAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBjYWxsYmFjay5cblx0ICAgICAqIFxuXHQgICAgICogQHRocm93cyBUd2lnLkVycm9yXG5cdCAgICAgKi9cblx0ICAgIFR3aWcuZXhwb3J0cy5yZW5kZXJGaWxlID0gZnVuY3Rpb24ocGF0aCwgb3B0aW9ucywgZm4pIHtcblx0ICAgICAgICAvLyBoYW5kbGUgY2FsbGJhY2sgaW4gb3B0aW9uc1xuXHQgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICBmbiA9IG9wdGlvbnM7XG5cdCAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHQgICAgICAgIHZhciBzZXR0aW5ncyA9IG9wdGlvbnMuc2V0dGluZ3MgfHwge307XG5cblx0ICAgICAgICB2Y
46184XIgcGFyYW1zID0ge1xuXHQgICAgICAgICAgICBwYXRoOiBwYXRoLFxuXHQgICAgICAgICAgICBiYXNlOiBzZXR0aW5ncy52aWV3cyxcblx0ICAgICAgICAgICAgbG9hZDogZnVuY3Rpb24odGVtcGxhdGUpIHtcblx0ICAgICAgICAgICAgICAgIC8vIHJlbmRlciBhbmQgcmV0dXJuIHRlbXBsYXRlIGFzIGEgc2ltcGxlIHN0cmluZywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2lnanMvdHdpZy5qcy9wdWxsLzM0OCBmb3IgbW9yZSBpbmZvcm1hdGlvblxuXHQgICAgICAgICAgICAgICAgZm4obnVsbCwgJycgKyB0ZW1wbGF0ZS5yZW5kZXIob3B0aW9ucykpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblxuXHQgICAgICAgIC8vIG1peGluIGFueSBvcHRpb25zIHByb3ZpZGVkIHRvIHRoZSBleHByZXNzIGFwcC5cblx0ICAgICAgICB2YXIgdmlld19vcHRpb25zID0gc2V0dGluZ3NbJ3R3aWcgb3B0aW9ucyddO1xuXG5cdCAgICAgICAgaWYgKHZpZXdfb3B0aW9ucykge1xuXHQgICAgICAgICAgICBmb3IgKHZhciBvcHRpb24gaW4gdmlld19vcHRpb25zKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodmlld19vcHRpb25zLmhhc093blByb3BlcnR5KG9wdGlvbikpIHtcblx0ICAgICAgICAgICAgICAgICAgICBwYXJhbXNbb3B0aW9uXSA9IHZpZXdfb3B0aW9uc1tvcHRpb25dO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgVHdpZy5leHBvcnRzLnR3aWcocGFyYW1zKTtcblx0ICAgIH07XG5cblx0ICAgIC8vIEV4cHJlc3MgMyBoYW5kbGVyXG5cdCAgICBUd2lnLmV4cG9ydHMuX19leHByZXNzID0gVHdpZy5leHBvcnRzLnJlbmRlckZpbGU7XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2hvdWQgVHdpZy5qcyBjYWNoZSB0ZW1wbGF0ZXMuXG5cdCAgICAgKiBEaXNhYmxlIGR1cmluZyBkZXZlbG9wbWVudCB0byBzZWUgY2hhbmdlcyB0byB0ZW1wbGF0ZXMgd2l0aG91dFxuXHQgICAgICogcmVsb2FkaW5nLCBhbmQgZGlzYWJsZSBpbiBwcm9kdWN0aW9uIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtib29sZWFufSBjYWNoZVxuXHQgICAgICovXG5cdCAgICBUd2lnLmV4cG9ydHMuY2FjaGUgPSBmdW5jdGlvbihjYWNoZSkge1xuXHQgICAgICAgIFR3aWcuY2FjaGUgPSBjYWNoZTtcblx0ICAgIH07XG5cblx0ICAgIC8vV2UgbmVlZCB0byBleHBvcnQgdGhlIHBhdGggbW9kdWxlIHNvIHdlIGNhbiBlZmZlY3RpdmVseSB0ZXN0IGl0XG5cdCAgICBUd2lnLmV4cG9ydHMucGF0aCA9IFR3aWcucGF0aDtcblxuXHQgICAgLy9FeHBvcnQgb3VyIGZpbHRlcnMuXG5cdCAgICAvL1Jlc29sdmVzICMzMDdcblx0ICAgIFR3aWcuZXhwb3J0cy5maWx0ZXJzID0gVHdpZy5maWx0ZXJzO1xuXG5cdCAgICByZXR1cm4gVHdpZztcblx0fTtcblxuXG4vKioqLyB9XG4vKioqKioqLyBdKVxufSk7XG47IiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0aWYgKCFtb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XG5cdFx0bW9kdWxlLnBhdGhzID0gW107XG5cdFx0Ly8gbW9kdWxlLnBhcmVudCA9IHVuZGVmaW5lZCBieSBkZWZhdWx0XG5cdFx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwibG9hZGVkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJpZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xuXHR9XG5cdHJldHVybiBtb2R1bGU7XG59O1xuIiwiaW1wb3J0ICcuLi9zdHlsZXMvYXBwLnNjc3MnO1xuXG5pbXBvcnQgSGVhZGVyIGZyb20gJ2NvbXBvbmVudHMvbW9iaWxlLWhlYWRlci9pbmRleCc7XG5pbXBvcnQgSG92ZXJFZmZlY3QgZnJvbSAnY29tcG9uZW50cy9ob3Zlci1lZmZlY3QnO1xuaW1wb3J0IElucHV0VGVsZXBob25lIGZyb20gJ2NvbXBvbmVudHMvZm9ybXMvdGVsZXBob25lJztcbmltcG9ydCBNZWRpYXRvciBmcm9tICdjb21tb24vc2NyaXB0cy9tZWRpYXRvcic7XG5pbXBvcnQgTmV3cyBmcm9tICdjb21wb25lbnRzL25ld3MnO1xuaW1wb3J0IFBvcHVwIGZyb20gJ2NvbXBvbmVudHMvcG9wdXAnO1xuaW1wb3J0IHBvcHVwSW5saW5lVGVtcGxhdGUgZnJvbSAnY29tcG9uZW50cy9wb3B1cC9pbmxpbmUtcG9wdXAudHdpZyc7XG5pbXBvcnQgcG9wdXBNYXBUbXBsIGZyb20gJ2NvbXBvbmVudHMvcG9wdXAvbWFwLXBvcHVwLnR3aWcnO1xuaW1wb3J0IFByZWxvYWRlciBmcm9tICdjb21wb25lbnRzL3ByZWxvYWRlcic7XG5pbXBvcnQgU2xpZGVyIGZyb20gJ2NvbXBvbmVudHMvc2xpZGVyJztcbmltcG9ydCBTdWJtaXQgZnJvbSAnY29tcG9uZW50cy9mb3Jtcy9zdWJtaXQnO
461841xuaW1wb3J0IFRhYnMgZnJvbSAnY29tcG9uZW50cy90YWJzL2luZGV4JztcbmltcG9ydCBUZWFtUG9wdXAgZnJvbSAnY29tcG9uZW50cy90ZWFtJztcbmltcG9ydCBVdGlscyBmcm9tICdjb21tb24vc2NyaXB0cy91dGlscyc7XG5pbXBvcnQgVmFsaWRhdGlvbiBmcm9tICdjb21wb25lbnRzL2Zvcm1zL3ZhbGlkYXRpb24nO1xuaW1wb3J0IFlhbmRleE1hcCBmcm9tICdjb21wb25lbnRzL3lhbmRleC1tYXAnO1xuaW1wb3J0IHlhbmRleE1hcExvYWQgZnJvbSAnY29tcG9uZW50cy95YW5kZXgtbWFwL2xvYWQnO1xuXG5jb25zdCB0YWJsZXRQb3J0cmFpdCA9IDY3MDtcbmNvbnN0IHRhYmxldExhbmRzY2FwZSA9IDk2MDtcbmNvbnN0IGxhcHRvcFdpZHRoID0gMTI4MDtcbmNvbnN0IHdhaXRUaW1lID0gMjAwO1xuY29uc3QgbWluV2FpdFRpbWUgPSAxMDA7XG5jb25zdCBoZWFkZXIgPSBuZXcgSGVhZGVyKCk7XG5jb25zdCBtZWRpYXRvciA9IG5ldyBNZWRpYXRvcigpO1xuY29uc3QgYm9yZGVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qLWFuaW1hdGVkLWJvcmRlcnMnKTtcbmNvbnN0IGJvcmRlcnNTZXBhcmF0ZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuai1hbmltYXRlZC1ib3JkZXJzX19zZXBhcmF0ZWQnKTtcbmNvbnN0IGJvcmRlcnNTZWVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qLXNlZW1zLWJvcmRlcnMnKTtcbmNvbnN0IHZlcnRpY2FsQm9yZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmotYW5pbWF0ZWQtdmVydGljYWwtYm9yZGVyJyk7XG5jb25zdCBob3Jpem9udGFsQm9yZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmotYW5pbWF0ZWQtaG9yaXpvbnRhbC1ib3JkZXInKTtcbmNvbnN0IGZhY3RvaWRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmItbWFpbi1mYWN0b2lkcycpO1xuY29uc3QgbWFpbkFuaW1hdGVkVGl0bGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmItbWFpbi1zbGlkZXNfX3NwYW4tc2Vjb25kJyk7XG5jb25zdCBtYWluc2xpZGVyQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmotbWFpbi1zbGlkZXInKTtcbmNvbnN0IGRpc2FwcGVhcmluZ0ltYWdlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmotc2Nyb2xsLWltYWdlLWVmZmVjdCcpO1xuY29uc3Qgd2luZG93V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbmxldCB0YWJzRGV2ZWxvcHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuai10YWJzLWRldmVsb3AnKTtcbmxldCB0YWJzUHJvamVjdHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuai10YWJzLXByb2plY3RzJyk7XG5cbmhlYWRlci5pbml0KHtcbiAgICBlbGVtZW50ICAgICAgICAgICAgICAgIDogJy5qLWhlYWRlcicsXG4gICAgYXV0b0ZpeGVkICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgIGF1dG9Qb3NpdGlvbkNsb3NlQnV0dG9uOiB0cnVlLFxuICAgIHJldHVyblBvc2l0aW9uICAgICAgICAgOiB0cnVlXG59KTtcblxuLyoqXG4gKiDQn9C+0L/QsNC/INC40L3Qu9Cw0LnQvdC+0LLRi9C5XG4gKi9cbmNvbnN0IGlubGluZVBvcHVwcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmotaW5saW5lLXBvcHVwJykpO1xuXG5pZiAoaW5saW5lUG9wdXBzLmxlbmd0aCkge1xuICAgIGlubGluZVBvcHVwcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvcHVwID0gbmV3IFBvcHVwKCk7XG5cbiAgICAgICAgcG9wdXAuaW5pdCh7XG4gICAgICAgICAgICB0YXJnZXQgIDogaXRlbSxcbiAgICAgICAgICAgIHRlbXBsYXRlOiBwb3B1cElubGluZVRlbXBsYXRlXG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqINCf0L7Qv9Cw0L8g0LrQsNGA0YLQsFxuICovXG5jb25zdCBtYXBQb3B1cHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qLXByb2plY3QtcG9wdXAtbWFwJykpO1xuXG5pZiAobWFwUG9wdXBzLmxlbmd0aCkge1xuICAgIG1hcFBvcHVwcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvcHVwID0gbmV3IFBvcHVwKCk7XG5cbiAgICAgICAgcG9wdXAuaW5pdCh7XG4gICAgICAgICAgICB0YXJnZXQgIDogaXRlbSxcbiAgICAgICAgICAgIHRlbXBsYXRlOiBwb3B1cE1hcFRtcGxcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBtZWRpYXRvci5zdWJzY3JpYmUoJ29wZW5Qb3B1cCcsIChwb3B1cCkgPT4ge1xuICAgICAgICBpZiAocG9wdXAudHlwZSA9PT0gJ21hcCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hcFNlbGVjdG9yID0gcG9wdXAucG9wdXAucXVlcnlTZWxlY3RvcignLmotcHJvamVjdC1tYXAnKTtcblxuICAgICAgICAgICAgaWYgKG1hcFNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgeWFuZGV4TWFwTG9hZCgpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCh5bWFwcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeWFuZGV4TWFwID0gbmV3IFlhbmRleE1hcCh5bWFwcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHlhbmRleE1hcC5pbml0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyICAgICAgICAgIDogbWFwU2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tWm9vbUNvbnRyb2w6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kICAgICAgICAgICA6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGDQn9GA0Lgg0LfQsNCz0YDRg9C30LrQtSDRj9C90LTQtdC60YEg0LrQsNGA0YIg0L/RgNC+0LjQt9C+0YjQu9CwINC+0YjQuNCx0LrQsDogJHtlcnJvcn1gKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuXG4vKipcbiAqINCh0LvQsNC50LTQtdGAINC/0YDQtdC40LzRg9GJ0LXRgdGC0LIg0L3QsCDQs9C70LDQstC90L7QuSDRgdGC0YDQsNC90LjRhtC1XG4gKiBAdHlwZSB7U2xpZGVyfVxuICovXG5jb25zdCBiZW5lZml0cyA9IG5ldyBTbGlkZXIoKTtcbmNvbnN0IGJlbmVmaXRzU2xpZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmotYmVuZWZpdHMt
46184c2xpZGVyJyk7XG5cbmlmIChiZW5lZml0c1NsaWRlciAmJiB3aW5kb3cuc2NyZWVuLmF2YWlsV2lkdGggPCBsYXB0b3BXaWR0aCkge1xuICAgIGJlbmVmaXRzLmluaXQoe1xuICAgICAgICB0YXJnZXQgICAgICAgOiBiZW5lZml0c1NsaWRlcixcbiAgICAgICAgYXV0b3BsYXkgICAgIDogdHJ1ZSxcbiAgICAgICAgaW5maW5pdGUgICAgIDogZmFsc2UsXG4gICAgICAgIGF1dG9wbGF5U3BlZWQ6IDcwMDBcbiAgICB9KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gY29uc3QgbmV4dEJ0biA9IGJlbmVmaXRzU2xpZGVyLnF1ZXJ5U2VsZWN0b3IoJy5zbGlkZXJfX2Fycm93LXJpZ2h0Jyk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vIG5leHRCdG4uY2xpY2soKTtcbiAgICB9LCBtaW5XYWl0VGltZSk7XG59XG5cbi8qKlxuICog0YHQu9Cw0LnQtNC10YDRiyDRgSDQvtC00L3QuNC8INCy0LjQtNC40LzRi9C8INGB0LvQsNC50LTQvtC8XG4gKi9cbmNvbnN0IG9uZVNsaWRlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuai1vbmVzbGlkZS1zbGlkZXInKTtcblxuaWYgKG9uZVNsaWRlcnMpIHtcbiAgICBvbmVTbGlkZXJzLmZvckVhY2goKHNsaWRlKSA9PiB7XG4gICAgICAgIGNvbnN0IG9uZVNsaWRlciA9IG5ldyBTbGlkZXIoKTtcblxuICAgICAgICBvbmVTbGlkZXIuaW5pdCh7dGFyZ2V0OiBzbGlkZX0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqINCh0LvQsNC50LTQtdGAINGD0YHQv9C10YjQvdGL0YUg0L/RgNC+0LXQutGC0L7QslxuICovXG5jb25zdCBjb2x1bW5TbGlkZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmotY29sdW1ucy1zbGlkZXInKTtcblxuaWYgKGNvbHVtblNsaWRlcnMgJiYgd2luZG93LnNjcmVlbi5hdmFpbFdpZHRoIDwgbGFwdG9wV2lkdGgpIHtcbiAgICBjb2x1bW5TbGlkZXJzLmZvckVhY2goKHNsaWRlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtblNsaWRlciA9IG5ldyBTbGlkZXIoKTtcblxuICAgICAgICBjb2x1bW5TbGlkZXIuaW5pdCh7dGFyZ2V0OiBzbGlkZX0pO1xuICAgIH0pO1xufVxuXG5jb25zdCBkZWNsYXJhdGlvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuai1kZWNsYXJhdGlvbi1zbGlkZXInKTtcblxuaWYgKGRlY2xhcmF0aW9ucyAmJiB3aW5kb3cuc2NyZWVuLmF2YWlsV2lkdGggPCB0YWJsZXRQb3J0cmFpdCkge1xuICAgIGRlY2xhcmF0aW9ucy5mb3JFYWNoKChzbGlkZSkgPT4ge1xuICAgICAgICBjb25zdCBkZWNsYXJhdGlvblNsaWRlciA9IG5ldyBTbGlkZXIoKTtcblxuICAgICAgICBkZWNsYXJhdGlvblNsaWRlci5pbml0KHt0YXJnZXQ6IHNsaWRlfSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICog0KHQu9Cw0LnQtNC10YAg0YEg0YPRh9Cw0YHRgtC90LjQutCw0LzQuCDQutC+0LzQsNC90LTRi1xuICovXG5jb25zdCB0ZWFtID0gbmV3IFNsaWRlcigpO1xuY29uc3QgdGVhbVBvcHVwID0gbmV3IFRlYW1Qb3B1cCgpO1xuY29uc3QgdGVhbVNsaWRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qLXRlYW0tc2xpZGVyJyk7XG5cbmlmICh0ZWFtU2xpZGVyKSB7XG4gICAgdGVhbS5pbml0KHtcbiAgICAgICAgdGFyZ2V0ICAgICAgICA6IHRlYW1TbGlkZXIsXG4gICAgICAgIHRyYW5zaXRpb25UaW1lOiAxNTBcbiAgICB9KTtcbiAgICB0ZWFtUG9wdXAuaW5pdCh0ZWFtU2xpZGVyKTtcbn1cblxuY29uc3QgdGVhbU1hbnVhbCA9IG5ldyBTbGlkZXIoKTtcbmNvbnN0IHRlYW1TbGlkZXJNYW51YWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuai10ZWFtLXNsaWRlci1tYW51YWwnKTtcblxuaWYgKHRlYW1TbGlkZXJNYW51YWwpIHtcbiAgICB0ZWFtTWFudWFsLmluaXQoe1xuICAgICAgICB0YXJnZXQgICAgICAgIDogdGVhbVNsaWRlck1hbnVhbCxcbiAgICAgICAgdHJhbnNpdGlvblRpbWU6IDE1MFxuICAgIH0pO1xufVxuXG4vKipcbiAqINCh0LvQsNC50LTQtdGAINGBINC70L7Qs9C+0YLQuNC/0LDQvNC4INC/0LDRgNGC0L3QtdGA0L7QslxuICovXG5jb25zdCBwYXJ0bmVycyA9IG5ldyBTbGlkZXIoKTtcbmNvbnN0IHBhcnRuZXJzU2xpZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmotcHJvamVjdHMtc2xpZGVyJyk7XG5cbmlmIChwYXJ0bmVyc1NsaWRlcikge1xuICAgIHBhcnRuZXJzLmluaXQoe3RhcmdldDogcGFydG5lcnNTbGlkZXJ9KTtcbn1cblxuY29uc3QgcHJpbmNpcGVzU2xpZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmotcHJpbmNpcGVzLXNsaWRlcicpO1xuXG5pZiAocHJpbmNpcGVzU2xpZGVyKSB7XG4gICAgcHJpbmNpcGVzU2xpZGVyLmZvckVhY2goKHNsaWRlcikgPT4ge1xuICAgICAgICBjb25zdCBwcmluY2lwZXMgPSBuZXcgU2xpZGVyKCk7XG5cbiAgICAgICAgcHJpbmNpcGVzLmluaXQoe3RhcmdldDogc2xpZGVyfSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICog0KHQu9Cw0LnQtNC10YAg0L/RgNC10LjQvNGD0YnQtdGB0YLQsiDQv9GA0L7QtdC60YLQvtCyINCb0LDRgNGD0YHQsFxuICovXG5jb25zdCBsYXJ1c0ZlYXR1cmVzID0gbmV3IFNsaWRlcigpO1xuY29uc3QgbGFydXNGZWF0dXJlc1NsaWRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qLWxhcnVzLXByb2plY3QtZmVhdHVyZS1zbGlkZXInKTtcblxuaWYgKGxhcnVzRmVhdHVyZXNTbGlkZXIgJiYgd2luZG93LnNjcmVlbi5hdmFpbFdpZHRoIDwgdGFibGV0TGFuZHNjYXBlKSB7XG4gICAgbGFydXNGZWF0dXJlcy5pbml0KHt0YXJnZXQ6IGxhcnVzRmVhdHVyZXNTbGlkZXJ9KTtcbn1cblxuLyoqXG4gKiDRgNC10LjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXQvCDRgdC70LDQudC00LXRgCwg0LXRgdC70Lgg0L7QvSDQsiDRgtCw0LHQtVxuICovXG5tZWRpYXRvci5zdWJzY3JpYmUoJ2NoYW5nZVRhYnMnLCAoZWxlbWVudCkgPT4ge1xuICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnaXMtc2xpZGVyJykpIHtcbiAgICAgICAgY29uc3QgZ2FsbGVyeVdyYXAgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qLXByb2plY3RzLXNsaWRlcicpO1xuXG4gICAgICAgIGlmIChnYWxsZXJ5V3JhcC5jbGFzc0xpc3QuY29udGFpbnMoJ2Itc2xpZGVyX2lzX3JlYWR5JykpIHtcbiAgICAgICAgICAgI
46184HJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdhbGxlcnkgPSBuZXcgU2xpZGVyKCk7XG5cbiAgICAgICAgZ2FsbGVyeS5pbml0KHt0YXJnZXQ6IGdhbGxlcnlXcmFwfSk7XG4gICAgfVxufSk7XG5cbi8qKlxuICog0LjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0YLQsNCx0L7QslxuICovXG5pZiAodGFic0RldmVsb3BzKSB7XG4gICAgdGFic0RldmVsb3BzID0gbmV3IFRhYnMoKTtcbiAgICB0YWJzRGV2ZWxvcHMuaW5pdCh7ZWxlbWVudDogJy5qLXRhYnMtZGV2ZWxvcCd9KTtcbn1cblxuaWYgKHRhYnNQcm9qZWN0cykge1xuICAgIHRhYnNQcm9qZWN0cyA9IG5ldyBUYWJzKCk7XG4gICAgdGFic1Byb2plY3RzLmluaXQoe2VsZW1lbnQ6ICcuai10YWJzLXByb2plY3RzJ30pO1xufVxuXG5jb25zdCB0YWJzUHJvamVjdHNDb2xsYXBzZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuai10YWJzLXByb2plY3RzJyk7XG5cbmlmICh3aW5kb3cuc2NyZWVuLmF2YWlsV2lkdGggPCB0YWJsZXRMYW5kc2NhcGUgJiYgdGFic1Byb2plY3RzQ29sbGFwc2VkKSB7XG4gICAgbGV0IG9wZW5lZCA9IGZhbHNlO1xuXG4gICAgdGFic1Byb2plY3RzQ29sbGFwc2VkLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICBpZiAob3BlbmVkKSB7XG4gICAgICAgICAgICB0YWJzUHJvamVjdHMudGFic1BhcmVudC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1vcGVuZWQnKTtcbiAgICAgICAgICAgIHRhYnNQcm9qZWN0cy50YWJzLmZvckVhY2goKGxpbmspID0+IHtcbiAgICAgICAgICAgICAgICBsaW5rLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9wZW5lZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFic1Byb2plY3RzLnRhYnNQYXJlbnQuY2xhc3NMaXN0LmFkZCgnaXMtb3BlbmVkJyk7XG4gICAgICAgICAgICB0YWJzUHJvamVjdHMudGFicy5mb3JFYWNoKChsaW5rKSA9PiB7XG4gICAgICAgICAgICAgICAgbGluay5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xuICAgICAgICAgICAgICAgIGxpbmsuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGFic1Byb2plY3RzLnRhYnMuZm9yRWFjaCgobGluaykgPT4ge1xuICAgICAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBsaW5rLnN0eWxlLndpZHRoID0gJzAnO1xuICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnN0eWxlLndpZHRoID0gJ21heC1jb250ZW50JztcbiAgICAgICAgICAgIG9wZW5lZCA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vLyDQlNCy0LjQttC10L3QuNC1INGE0LDQutGC0L7QuNC00L7QslxuaWYgKGZhY3RvaWRzICYmIHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aCA8IGxhcHRvcFdpZHRoKSB7XG4gICAgbGV0IGJlbmVmaXRQb3NpdGlvbiA9IDA7XG4gICAgbGV0IGZpcnN0U2xpZGUgPSAwO1xuICAgIGNvbnN0IHplcm8gPSAwO1xuICAgIGNvbnN0IG9uZSA9IDE7XG4gICAgY29uc3QgdHdvID0gMjtcbiAgICBjb25zdCBmb3VyID0gNDtcbiAgICBjb25zdCBmYWN0b2lkID0gZmFjdG9pZHMucXVlcnlTZWxlY3RvcignLmItbWFpbi1mYWN0b2lkc19faXRlbScpO1xuICAgIGNvbnN0IG1haW5JbWFnZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYi1tYWluLXNsaWRlc19faW1nIGltZycpO1xuICAgIGNvbnN0IHNsaWRlV2lkdGggPSBmYWN0b2lkLm9mZnNldFdpZHRoO1xuICAgIGNvbnN0IG1ha2VWaXNpYmxlID0gKG51bWJlcikgPT4ge1xuICAgICAgICBpZiAobWFpbkltYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIG1haW5JbWFnZXNbbnVtYmVyXS5jbGFzc0xpc3QuYWRkKCdiLW1haW4tc2xpZGVzX19pbWctc2NhbGluZycpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBtYWtlSGlkZGVuID0gKCkgPT4ge1xuICAgICAgICBtYWluSW1hZ2VzLmZvckVhY2goKGltYWdlKSA9PiB7XG4gICAgICAgICAgICBpbWFnZS5jbGFzc0xpc3QucmVtb3ZlKCdiLW1haW4tc2xpZGVzX19pbWctc2NhbGluZycpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IGNsZWFyVGl0bGVBbmltYXRpb24gPSAoKSA9PiB7XG4gICAgICAgIG1haW5BbmltYXRlZFRpdGxlcy5mb3JFYWNoKCh0aXRsZSkgPT4ge1xuICAgICAgICAgICAgdGl0bGUuY2xhc3NMaXN0LnJlbW92ZSgnaXMtZ29lcy1sZWZ0X19sb25nJyk7XG4gICAgICAgICAgICB0aXRsZS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1nb2VzLXJpZ2h0X19sb25nJyk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBtYWluc2xpZGVyQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2lzLWF1dG9wbGF5Jyk7XG5cbiAgICBtYWtlSGlkZGVuKCk7XG4gICAgbWFrZVZpc2libGUoZmlyc3RTbGlkZSk7XG4gICAgbWFpbkFuaW1hdGVkVGl0bGVzW2ZpcnN0U2xpZGVdLmNsYXNzTGlzdC5hZGQoJ2lzLWdvZXMtbGVmdF9fbG9uZycpO1xuICAgIGZhY3RvaWRzLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7YmVuZWZpdFBvc2l0aW9ufXB4KWA7XG5cbiAgICBtZWRpYXRvci5zdWJzY3JpYmUoJ2JlbmVmaXRHb2VzTGVmdCcsIChhY3RpdmVTbGlkZSkgPT4ge1xuICAgICAgICBmaXJzdFNsaWRlID0gZmlyc3RTbGlkZSAtIG9uZTtcbiAgICAgICAgaWYgKHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aCA+PSB0YWJsZXRMYW5kc2NhcGUpIHtcbiAgICAgICAgICAgIGJlbmVmaXRQb3NpdGlvbiA9IHplcm87XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBiZW5lZml0UG9zaXRpb24gPSBiZW5lZml0UG9zaXRpb24gKyBzbGlkZVdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhY3RpdmVTbGlkZSA9PT0gZm91cikge1xuICAgICAgICAgICAgZmlyc3RTbGlkZSA9IHR3bztcbiAgICAgICAgICAgIGJlbmVmaXRQb3NpdGlvbiA9IC1zbGlkZVdpZHRoICogdHdvO1xuICAgICAgICB9XG4gICAgICAgIG1ha2VIaWRkZW4oKTtcbiAgICAgICAgbWFrZVZpc2libGUoZmlyc3RTbGlkZSk7XG5cbiAgICAgICAgZmFjdG9pZHMuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHtiZW5lZml0UG9zaXRpb259cHgpYDtcbiAgICAgICAgY2xlYXJUaXRsZUFuaW1hdGlvbigpO1xuICAgICAgICBtYWluQW5pbWF0ZWRUaXRsZXNbZmlyc3RTbGlkZV0uY2xhc3NMaXN0LnJlbW92ZSgnaXMtZ29lcy1yaWdodF9fbG9uZycpO1xuICAgICAgICBtYWluQW5pbWF0ZWRUaXRsZXNbZmlyc3RTbGlkZV0uY2xhc3NMaXN0LmFkZCgnaXMtZ29lcy1yaWdodF9fbG9uZycpO1xuICAgIH0pO1xuICAgIG1lZGlhdG9yLnN1YnNjcmliZSgnYmVuZWZpdEdvZXNSaWdodCcsIChwYXJhbWV0ZXJzKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcGFyYW1ldGVycy5wb3NpdGlvbjtcbiAgICAgICAgY29uc3QgYWN0aXZlU2xpZGUgPSBwYXJhbWV0ZXJzLnNsaWRlO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gemVybykge1xuICAgICAgICAgICAgZmlyc3RTbGlkZSA9IHplcm87XG4gICAgICAgICAgICBiZW5lZml0UG9zaXRpb24gPSB6ZXJvO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aCA+PSB0YWJsZXRMYW5kc2NhcGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlU2xpZGUgIT09IHR3bykge1xuICAgICAgICAgICAgICAgICAgICBiZW5lZml0UG9zaXRpb24gPSAtc2xpZGVXaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJlbmVmaXRQb3NpdGlvbiA9IGJlbmVmaXRQb3NpdGlvbiAtIHNsaWRlV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaXJzdFNsaWRlID0gZmlyc3RTbGlkZSArIG9uZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1ha2VIaWRkZW4oKTtcbiAgICAgICAgbWFrZVZpc2libGUoZmlyc3RTbGlkZSk7XG4gICAgICAgIGZhY3RvaWRzLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7YmVuZWZpdFBvc2l0aW9ufXB4KWA7XG4gICAgICAgIGNsZWFyVGl0bGVBbmltYXRpb24oKTtcbiAgICAgICAgbWFpbkFuaW1hdGVkVGl0bGVzW2ZpcnN0U2xpZGVdLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWdvZXMtbGVmdF9fbG9uZycpO1xuICAgICAgICBtYWluQW5pbWF0ZWRUaXRsZXNbZmlyc3RTbGlkZV0uY2xhc3NMaXN0LmFkZCgnaXMtZ29lcy1sZWZ0X19sb25nJyk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogaG92ZXIg0Y3RhNGE0LXQutGCXG4gKi9cbmNvbnN0IGhvdmVyQmxvY2tzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmotaG92ZXItaGlnaGxpZ2h0Jyk7XG5cbmlmIChob3ZlckJsb2NrcyAmJiB3aW5kb3cuc2NyZWVuLmF2YWlsV2lkdGggPj0gbGFwdG9wV2lkdGgpIHtcbiAgICBob3ZlckJsb2Nrcy5mb3JFYWNoKChibG9jaykgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IEhvdmVyRWZmZWN0KGJsb2NrKTtcbiAgICB9KTtcbn1cblxubWVkaWF0b3Iuc3Vic2NyaWJlKCdyZWNlaXZlZE5ld3MnLCAoKSA9PiB7XG4gICAgY29uc3QgbmV3c0Jsb2NrcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qLWhvdmVyLWhpZ2hsaWdodCcpO1xuXG4gICAgaWYgKG5ld3NCbG9ja3MgJiYgd2luZG93LnNjcmVlbi5hdmFpbFdpZHR
46184oID49IGxhcHRvcFdpZHRoKSB7XG4gICAgICAgIG5ld3NCbG9ja3MuZm9yRWFjaCgoYmxvY2spID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSG92ZXJFZmZlY3QoYmxvY2spO1xuICAgICAgICB9KTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiDQmtCw0YDRgtCwINC90LAg0LPQu9Cw0LLQvdC+0Lkg0YHRgtGA0LDQvdC40YbQtVxuICovXG5jb25zdCBtYXBTZWxlY3RvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qLW1haW4tbWFwJyk7XG5cbmlmIChtYXBTZWxlY3Rvcikge1xuICAgIHlhbmRleE1hcExvYWQoKVxuICAgICAgICAudGhlbigoeW1hcHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHlhbmRleE1hcCA9IG5ldyBZYW5kZXhNYXAoeW1hcHMpO1xuXG4gICAgICAgICAgICB5YW5kZXhNYXAuaW5pdCh7XG4gICAgICAgICAgICAgICAgd3JhcHBlciAgICAgICAgICA6IG1hcFNlbGVjdG9yLFxuICAgICAgICAgICAgICAgIGN1c3RvbVpvb21Db250cm9sOiB0cnVlLFxuICAgICAgICAgICAgICAgIGxlZ2VuZCAgICAgICAgICAgOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGDQn9GA0Lgg0LfQsNCz0YDRg9C30LrQtSDRj9C90LTQtdC60YEg0LrQsNGA0YIg0L/RgNC+0LjQt9C+0YjQu9CwINC+0YjQuNCx0LrQsDogJHtlcnJvcn1gKTtcbiAgICAgICAgfSk7XG59XG5cbi8qKlxuICog0JrQsNGA0YLQsCDQvdCwINGB0YLRgNCw0L3QuNGG0LUg0LrQvtC90YLQsNC60YLQvtCyXG4gKi9cbmNvbnN0IG1hcENvbnRhY3RzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmotY29udGFjdHMtbWFwJyk7XG5cbmlmIChtYXBDb250YWN0cykge1xuICAgIHlhbmRleE1hcExvYWQoKVxuICAgICAgICAudGhlbigoeW1hcHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHlhbmRleE1hcCA9IG5ldyBZYW5kZXhNYXAoeW1hcHMpO1xuXG4gICAgICAgICAgICB5YW5kZXhNYXAuaW5pdCh7XG4gICAgICAgICAgICAgICAgd3JhcHBlciAgICAgICAgICA6IG1hcENvbnRhY3RzLFxuICAgICAgICAgICAgICAgIGN1c3RvbVpvb21Db250cm9sOiB0cnVlLFxuICAgICAgICAgICAgICAgIGdwcyAgICAgICAgICAgICAgOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGDQn9GA0Lgg0LfQsNCz0YDRg9C30LrQtSDRj9C90LTQtdC60YEg0LrQsNGA0YIg0L/RgNC+0LjQt9C+0YjQu9CwINC+0YjQuNCx0LrQsDogJHtlcnJvcn1gKTtcbiAgICAgICAgfSk7XG59XG5cbi8qKlxuICog0L7QsdC70LDRgdGC0Ywg0LLQuNC00LjQvNC+0YHRgtC4XG4gKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCAtINC/0YDQvtGB0LzQsNGC0YDQuNCy0LDQtdC80YvQuSDRjdC70LXQvNC10L3RglxuICogQHJldHVybnMge2Jvb2xlYW59IC0g0LLQvtC30LLRgNCw0YnQsNC10YIgdHJ1ZSwg0LXRgdC70Lgg0Y3Qu9C10LzQtdC90YIg0L3QsNGF0L7QtNC40YLRgdGPINCyINC+0LHQu9Cw0YHRgtC4INCy0LjQtNC40LzQvtGB0YLQuFxuICovXG5jb25zdCBpc1Njcm9sbGVkSW50b1ZpZXcgPSAoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGRvY1ZpZXdUb3AgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gICAgY29uc3QgZG9jVmlld0JvdHRvbSA9IGRvY1ZpZXdUb3AgKyB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgY29uc3QgZWxlbVRvcCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtcbiAgICBjb25zdCBlbGVtQm90dG9tID0gZWxlbVRvcCArIGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuXG4gICAgcmV0dXJuIChlbGVtQm90dG9tIDw9IGRvY1ZpZXdCb3R0b20pICYmIChlbGVtVG9wID49IGRvY1ZpZXdUb3ApO1xufTtcblxuLyoqXG4gKiDQvtCx0LvQsNGB0YLRjCDQstC40LTQuNC80L7RgdGC0LhcbiAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IC0g0L/RgNC+0YHQvNCw0YLRgNC40LLQsNC10LzRi9C5INGN0LvQtdC80LXQvdGCXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0g0J7RgtGB0YLRg9C/INGB0LLQtdGA0YXRgyDQsiDQv9GA0L7RhtC10L3RgtCw0YVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtINCy0L7Qt9Cy0YDQsNGJ0LDQtdGCIHRydWUsINC10YHQu9C4INGN0LvQtdC80LXQvdGCINC90LDRhdC+0LTQuNGC0YHRjyDQsiDQvtCx0LvQsNGB0YLQuCDQstC40LTQuNC80L7RgdGC0LhcbiAqL1xuY29uc3QgaXNTY3JvbGxlZEludG9Ub3AgPSAoZWxlbWVudCwgb2Zmc2V0KSA9PiB7XG4gICAgY29uc3QgaHVuZHJlZCA9IDEwMDtcbiAgICBjb25zdCBkb2NWaWV3Qm90dG9tID0gd2luZG93LnBhZ2VZT2Zmc2V0ICsgd2luZG93LmlubmVySGVpZ2h0O1xuICAgIGNvbnN0IGVsZW1lbnRCb3VuZGluZyA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZWxlbVRvcCA9IGVsZW1lbnRCb3VuZGluZy50b3AgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgIGxldCBvZmZzZXRQeCA9IDA7XG5cbiAgICBpZiAob2Zmc2V0KSB7XG4gICAgICAgIG9mZnNldFB4ID0gZWxlbWVudEJvdW5kaW5nLmhlaWdodCAqIG9mZnNldCAvIGh1bmRyZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvY1ZpZXdCb3R0b20gPiAoZWxlbVRvcCArIG9mZnNldFB4KTtcbn07XG5cbi8qKlxuICog0LjQt9C80LXRgNGP0LXRgiDRgdC60L7RgNC+0YHRgtGMINGB0LrRgNC+0LvQu9CwXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG5jb25zdCBjaGVja1Njcm9sbFNwZWVkID0gKGZ1bmN0aW9uKHNldH
46184RpbmdzKSB7XG4gICAgc2V0dGluZ3MgPSBzZXR0aW5ncyB8fCB7fTtcblxuICAgIHZhciBsYXN0UG9zLCBuZXdQb3MsIHRpbWVyLCBkZWx0YSxcbiAgICAgICAgZGVsYXkgPSBzZXR0aW5ncy5kZWxheSB8fCA1MDsgLy8gaW4gXCJtc1wiIChoaWdoZXIgbWVhbnMgbG93ZXIgZmlkZWxpdHkgKVxuXG4gICAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICAgIGxhc3RQb3MgPSBudWxsO1xuICAgICAgICBkZWx0YSA9IDA7XG4gICAgfVxuXG4gICAgY2xlYXIoKTtcblxuICAgIHJldHVybiBmdW5jdGlvbigpe1xuICAgICAgICBuZXdQb3MgPSB3aW5kb3cuc2Nyb2xsWTtcbiAgICAgICAgaWYgKCBsYXN0UG9zICE9IG51bGwgKXsgLy8gJiYgbmV3UG9zIDwgbWF4U2Nyb2xsXG4gICAgICAgICAgICBkZWx0YSA9IG5ld1BvcyAtICBsYXN0UG9zO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RQb3MgPSBuZXdQb3M7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dChjbGVhciwgZGVsYXkpO1xuICAgICAgICByZXR1cm4gZGVsdGE7XG4gICAgfTtcbn0pKCk7XG4vKiBlc2xpbnQtZW5hYmxlICovXG5cbi8qKlxuICog0LDQvdC40LzQsNGG0LjRjyDQv9GA0Lgg0YHQutGA0L7Qu9C70LUg0YHRgtGA0LDQvdC40YZcbiAqL1xuY29uc3QgZmFkZVN0b3AgPSAzNTA7XG5cbndpbmRvdy5vbnNjcm9sbCA9ICgpID0+IHtcbiAgICAvLyDQsNC90LjQvNCw0YbQuNGPINC70LjQvdC40LlcbiAgICBpZiAod2luZG93LnNjcmVlbi5hdmFpbFdpZHRoID49IHRhYmxldExhbmRzY2FwZSkge1xuICAgICAgICBib3JkZXJzLmZvckVhY2goKGRpdikgPT4ge1xuICAgICAgICAgICAgaWYgKGlzU2Nyb2xsZWRJbnRvVmlldyhkaXYpKSB7XG4gICAgICAgICAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ2ItYW5pbWF0ZS1ib3JkZXJzX19ob3Jpem9udGFsJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJvcmRlcnNTZXBhcmF0ZWQuZm9yRWFjaCgoZGl2KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0b3AgPSAxMDtcbiAgICAgICAgICAgIGNvbnN0IG1pZGRsZSA9IDUwO1xuICAgICAgICAgICAgY29uc3QgYm90dG9tID0gMTAwO1xuXG4gICAgICAgICAgICBpZiAoaXNTY3JvbGxlZEludG9Ub3AoZGl2LCB0b3ApKSB7XG4gICAgICAgICAgICAgICAgLy8g0KHRjtC00LAg0LDQvdC40LzQsNGP0YbQuNGPINC00LvRjyDQstC10YXQvdC10LPQviDQsdC+0YDQtNC10YDQsFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNTY3JvbGxlZEludG9Ub3AoZGl2LCBtaWRkbGUpKSB7XG4gICAgICAgICAgICAgICAgLy8g0KHRjtC00LAg0LDQvdC40LzQsNGP0YbQuNGPINC00LvRjyDQsdC+0LrQvtCy0L7Qs9C+INCx0L7RgNC00LXRgNCwXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc1Njcm9sbGVkSW50b1RvcChkaXYsIGJvdHRvbSkpIHtcbiAgICAgICAgICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgnYi1hbmltYXRlLWJvcmRlcnNfX3NlcGFyYXRlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2ZXJ0aWNhbEJvcmRlci5mb3JFYWNoKChkaXYpID0+IHtcbiAgICAgICAgICAgIGlmIChpc1Njcm9sbGVkSW50b1ZpZXcoZGl2KSkge1xuICAgICAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCdiLWFuaW1hdGUtYm9yZGVyc19fdmVydGljYWwtYm9yZGVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGhvcml6b250YWxCb3JkZXIuZm9yRWFjaCgoZGl2KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNTY3JvbGxlZEludG9WaWV3KGRpdikpIHtcbiAgICAgICAgICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgnYi1hbmltYXRlLWJvcmRlcnNfX2hvcml6b250YWwtYm9yZGVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDQsNC90LjQvNCw0YbQuNGPINC90LAg0YHRgtGA0LDQvdC40YbQtSBcItC/0YDQvtC10LrRgiDQm9Cw0YDRg9GB0LBcIlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGRpc2FwcGVhcmluZ0ltYWdlKSB7XG4gICAgICAgICAgICBjb25zdCBmYWRlVW50aWwgPSBjaGVja1Njcm9sbFNwZWVkKCkgPiAxMDAgPyB3aW5kb3cucGFnZVlPZmZzZXQgOiAzMDA7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgICAgIGNvbnN0IG9uZSA9IDE7XG4gICAgICAgICAgICBjb25zdCBzY2FsZVVudGlsID0gMjEwMDtcbiAgICAgICAgICAgIGNvbnN0IGltZyA9IGRpc2FwcGVhcmluZ0ltYWdlLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuXG4gICAgICAgICAgICBpZiAod2luZG93LnBhZ2VZT2Zmc2V0IDw9IGZhZGVTdG9wKSB7XG4gICAgICAgICAgICAgICAgZGlzYXBwZWFyaW5nSW1hZ2Uuc3R5bGUub3BhY2l0eSA9IG9uZSAtICh3aW5kb3cucGFnZVlPZmZzZXQgLyBmYWRlVW50aWwpO1xuICAgICAgICAgICAgICAgIGltZy5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHtvbmUgKyAod2luZG93LnBhZ2VZT2Zmc2V0IC8gc2NhbGVVbnRpbCl9KWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpc2FwcGVhcmluZ0ltYWdlLnN0eWxlLm9wYWNpdHkgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuaWYgKHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aCA+PSB0YWJsZXRMYW5kc2NhcGUpIHtcbiAgICBib3JkZXJzU2VlbXMuZm9yRWFjaCgoZGl2KSA9PiB7XG4gICAgICAgIGlmIChpc1Njcm9sbGVkSW50b1ZpZXcoZGl2KSkge1xuICAgICAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ2ItYW5pbWF0ZS1ib3JkZXJzX19zZXBhcmF0ZWQnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGRpc2FwcGVhcmluZ0ltYWdlICYmIHdpbmRvdy5wYWdlWU9mZnNldCA+IGZhZGVTdG9wKSB7XG4gICAgICAgIGRpc2FwcGVhcmluZ0ltYWdlLmNsYXNzTGlzdC5hZGQoJ2lzLXNjcm9sbGVkJyk7XG4gICAgfVxufVxuXG4vKipcbiAqINC90L7QstC+0YHRgtC4XG4gKi9cbmNvbnN0IG5ld3NGb3JtID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcign
46184I25ld3NGb3JtJyk7XG5cbmlmIChuZXdzRm9ybSkge1xuICAgIGNvbnN0IG5ld3MgPSBuZXcgTmV3cygpO1xuXG4gICAgbmV3cy5pbml0KG5ld3NGb3JtKTtcbn1cblxuLyoqXG4gKiDQvdC+0LLQvtGB0YLQuCDQvdCwINCz0LvQsNCy0L3QvtC5INGB0YLRgNCw0L3QuNGG0LVcbiAqIEB0eXBlIHtFbGVtZW50fVxuICovXG5jb25zdCBuZXdzTWFpbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNuZXdzTWFpbnBhZ2UnKTtcblxuaWYgKG5ld3NNYWluKSB7XG4gICAgLyoqXG4gICAgICog0LLRi9GH0LjRgdC70Y/QtdGCINC/0L7Qt9C40YbQuNGOINCx0LvQvtC60LAg0L3QvtCy0L7RgdGC0LgsINC00L7QsdCw0LLQu9GP0Y8g0L3QtdC+0LHRhdC+0LTQuNC80YvQuSDQutC70LDRgdGBXG4gICAgICog0LTQu9GPINGB0LrRgNGL0YLQuNGPINCz0YDQsNC90LjRhlxuICAgICAqL1xuICAgIGNvbnN0IG5ld3NCbG9jayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5iLW5ld19fYmxhbmsnKTtcbiAgICBjb25zdCBuZXdzTWFpblBvc2l0aW9uID0gbmV3c01haW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbGVmdE1pbiA9IDA7XG4gICAgY29uc3QgcmlnaHRNaW4gPSAtMTtcbiAgICBjb25zdCBkZXN0cm95Qm9yZGVyID0gKGRpdikgPT4ge1xuICAgICAgICBjb25zdCBib3JkZXJFbGVtZW50cyA9IGRpdi5xdWVyeVNlbGVjdG9yQWxsKCdbY2xhc3MqPWJvcmRlcl0nKTtcblxuICAgICAgICBib3JkZXJFbGVtZW50cy5mb3JFYWNoKChib3JkZXIpID0+IHtcbiAgICAgICAgICAgIFV0aWxzLnJlbW92ZUVsZW1lbnQoYm9yZGVyKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIG5ld3NCbG9jay5mb3JFYWNoKChkaXYpID0+IHtcbiAgICAgICAgY29uc3QgYmxvY2tQb3NpdGlvbiA9IGRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgbGVmdERpZmZlcmVuY2UgPSBibG9ja1Bvc2l0aW9uLmxlZnQgLSBuZXdzTWFpblBvc2l0aW9uLmxlZnQ7XG4gICAgICAgIGNvbnN0IHJpZ2h0RGlmZmVyZW5jZSA9IGJsb2NrUG9zaXRpb24ucmlnaHQgLSBuZXdzTWFpblBvc2l0aW9uLnJpZ2h0O1xuXG4gICAgICAgIGlmIChsZWZ0RGlmZmVyZW5jZSA9PT0gbGVmdE1pbikge1xuICAgICAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ2lzLWxlZnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChNYXRoLnJvdW5kKHJpZ2h0RGlmZmVyZW5jZSkgPj0gcmlnaHRNaW4pIHtcbiAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCdpcy1yaWdodCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aCA8IHRhYmxldExhbmRzY2FwZSkge1xuICAgICAgICAgICAgZGVzdHJveUJvcmRlcihkaXYpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8qKlxuICog0JLQsNC70LjQtNCw0YbQuNGPINC40L3Qv9GD0YLQvtCyXG4gKi9cblxuY29uc3QgaW5wdXRzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuai1pbnB1dCcpKTtcblxuaWYgKGlucHV0cy5sZW5ndGgpIHtcbiAgICBpbnB1dHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dFZhbGlkYXRpb24gPSBuZXcgVmFsaWRhdGlvbigpO1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBpdGVtLmRhdGFzZXQuZXJyb3I7XG5cbiAgICAgICAgaW5wdXRWYWxpZGF0aW9uLmluaXQoe1xuICAgICAgICAgICAgdGFyZ2V0OiBpdGVtLFxuICAgICAgICAgICAgZXJyb3IgOiBlcnJvck1lc3NhZ2VcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICog0JzQsNGB0LrQsCDQtNC70Y8g0LjQvdC/0YPRgtCwINGBINGC0LXQu9C10YTQvtC90L7QvFxuICovXG5jb25zdCBpbnB1dFRlbCA9IG5ldyBJbnB1dFRlbGVwaG9uZSgpO1xuY29uc3QgcGhvbmVJbnB1dHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9XCJ0ZWxcIl0nKSk7XG5cbmlmIChwaG9uZUlucHV0cy5sZW5ndGgpIHtcbiAgICBpbnB1dFRlbC5pbml0KHtpbnB1dDogcGhvbmVJbnB1dHN9KTtcbn1cblxubWVkaWF0b3Iuc3Vic2NyaWJlKCdvcGVuUG9wdXAnLCAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXRUZWxJblBvcHVwID0gbmV3IElucHV0VGVsZXBob25lKCk7XG4gICAgY29uc3QgcGhvbmVJbnB1dHNJblBvcHVwID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPVwidGVsXCJdJykpO1xuXG4gICAgaWYgKHBob25lSW5wdXRzSW5Qb3B1cC5sZW5ndGgpIHtcbiAgICAgICAgaW5wdXRUZWxJblBvcHVwLmluaXQoe2lucHV0OiBwaG9uZUlucHV0c0luUG9wdXB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dHNJblBvcHVwID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuai1pbnB1dCcpKTtcblxuICAgIGlmIChpbnB1dHNJblBvcHVwLmxlbmd0aCkge1xuICAgICAgICBpbnB1dHNJblBvcHVwLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0VmFsaWRhdGlvbkluUG9wdXAgPSBuZXcgVmFsaWRhdGlvbigpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3JJblBvcHVwID0gaXRlbS5kYXRhc2V0LmVycm9yO1xuXG4gICAgICAgICAgICBpbnB1dFZhbGlkYXRpb25JblBvcHVwLmluaXQoe1xuICAgICAgICAgICAgICAgIHRhcmdldDogaXRlbSxcbiAgICAgICAgICAgICAgICBlcnJvciA6IGVycm9ySW5Qb3B1cFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHN1Ym1pdFNlbGVjdG9ySW5Qb3B1cCA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmotaW5wdXQtc3VibWl0JykpO1xuXG4gICAgaWYgKHN1Ym1pdFNlbGVjdG9ySW5Qb3B1cC5sZW5ndGgpIHtcbiAgICAgICAgc3VibWl0U2VsZWN0b3JJblBvcHVwLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN1Ym1pdElucHV0c0luUG9wdXAgPSBuZXcgU3VibWl0KCk7XG5cbiAgICAgICAgICAgIHN1Ym1pdElucHV0c0luUG9wdXAuaW5pdCh7dGFyZ2V0OiBpdGVtfSk7XG4gICAgICAgI
46184H0pO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqINCe0LHRgNCw0LHQvtGC0YfQuNC6INC+0YLQv9GA0LDQstC60Lgg0YTQvtGA0LzRiyDQuCDQstCw0LvQuNC00LDRhtC40Y8g0L/RgNC4INGB0LDQsdC80LjRgtC1XG4gKi9cbmNvbnN0IHN1Ym1pdFNlbGVjdG9yID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuai1pbnB1dC1zdWJtaXQnKSk7XG5cbmlmIChzdWJtaXRTZWxlY3Rvci5sZW5ndGgpIHtcbiAgICBzdWJtaXRTZWxlY3Rvci5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHN1Ym1pdElucHV0cyA9IG5ldyBTdWJtaXQoKTtcblxuICAgICAgICBzdWJtaXRJbnB1dHMuaW5pdCh7dGFyZ2V0OiBpdGVtfSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICog0LTQu9GPINGA0LXQuNC90LjRhtC40LDQu9C40LfQsNGG0LjQuCDRgdC70LDQudC00LXRgNC+0LIg0L/RgNC4INGA0LXRgdCw0LnQt9C1INC+0LrQvdCwXG4gKi9cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBVdGlscy5kZWJvdW5jZSgoKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoICE9PSB3aW5kb3dXaWR0aCkge1xuICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTtcbiAgICB9XG59LCB3YWl0VGltZSkpO1xuXG5cbmlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuai1wcmVsb2FkZXInKSkge1xuICAgIG5ldyBQcmVsb2FkZXIoKS5pbml0KCk7XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBjb25zaXN0ZW50LXRoaXMgKi9cbmxldCBpbnN0YW5jZSA9IG51bGw7XG5cbmNsYXNzIE1lZGlhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICAgICAgaW5zdGFuY2UgPSB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGFubmVscyA9IHt9O1xuXG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmUoY2hhbm5lbCwgZm4pIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoYW5uZWxzW2NoYW5uZWxdKSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5uZWxzW2NoYW5uZWxdID0gW107XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoYW5uZWxzW2NoYW5uZWxdLnB1c2goe1xuICAgICAgICAgICAgY29udGV4dCA6IHRoaXMsXG4gICAgICAgICAgICBjYWxsYmFjazogZm5cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGlzaChjaGFubmVsKSB7XG4gICAgICAgIGlmICghdGhpcy5jaGFubmVsc1tjaGFubmVsXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RBcmd1bWVudCA9IDE7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIGZpcnN0QXJndW1lbnQpO1xuXG4gICAgICAgIHRoaXMuY2hhbm5lbHNbY2hhbm5lbF0uZm9yRWFjaCgoc3Vic2NyaXB0aW9uKSA9PiB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24uY2FsbGJhY2suYXBwbHkoc3Vic2NyaXB0aW9uLmNvbnRleHQsIGFyZ3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpbnN0YWxsVG8ob2JqKSB7XG4gICAgICAgIG9iai5jaGFubmVscyA9IHt9O1xuXG4gICAgICAgIG9iai5wdWJsaXNoID0gdGhpcy5wdWJsaXNoO1xuICAgICAgICBvYmouc3Vic2NyaWJlID0gdGhpcy5zdWJzY3JpYmU7XG4gICAgfVxuXG4gICAgdW5zdWJzY3JpYmUoY2hhbm5lbCkge1xuICAgICAgICBpZiAoIXRoaXMuY2hhbm5lbHNbY2hhbm5lbF0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hhbm5lbHNbY2hhbm5lbF0gPSBudWxsO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWVkaWF0b3I7XG4vKiBlc2xpbnQtZW5hYmxlIGNvbnNpc3RlbnQtdGhpcyAqL1xuIiwiLyoqXG4gKiBAdmVyc2lvbiAxLjRcbiAqIEBhdXRob3IgS2VsbmlrIFN0dWRpb3Mge2h0dHA6Ly9rZWxuaWsucnV9XG4gKiBAbGluayBodHRwczovL2tlbG5pay5naXRib29rcy5pby9rZWxuaWstZG9jdW1lbnRhdGlvbi9jb250ZW50L2Zyb250LWVuZC9jb21wb25lbnRzL3V0aWxzLmh0bWwgZG9jdW1lbnRhdGlvblxuICovXG5cbi8qKlxuICogREVQRU5ERU5DSUVTXG4gKi9cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbmNsYXNzIFV0aWxzIHtcbiAgICAvKipcbiAgICAgKiDQnNC10YLQvtC0INGD0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINC60L7QvNGE0L7RgNC90YPRjiDQt9Cw0LTQtdGA0LbQutGDINCy0YvQv9C+0LvQvdC10L3QuNGPINCw0L3QuNC80LDRhtC40LguXG4gICAgICogQHJldHVybiB7TnVtYmVyfSBjb21mb3J0YWJsZUFuaW1hdGlvblRpbWVWYWx1ZSAtINC30L3QsNGH0LXQvdC40LUg0LIg0LzRgS5cbiAgICAgKi9cbiAgICBzdGF0aWMgY29tZm9ydGFibGVBbmltYXRpb25UaW1lKCkge1xuICAgICAgICBjb25zdCBjb21mb3J0YWJsZUFuaW1hdGlvblRpbWVWYWx1ZSA9IDMwMDtcblxuICAgICAgICByZXR1cm4gY29tZm9ydGFibGVBbmltYXRpb25UaW1lVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JzQtdGC0L7QtCDQv9C+0LvQvdC+0YHRgtGM0Y4g0L7Rh9C40YnQsNC10YIg0LLQtdGB0YwgaHRtbCDRjdC70LXQvNC10L3Rgi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCAtIERPTS3RjdC70LXQvNC10L3Rgiwg0LrQvtGC0L7RgNGL0Lkg0L3QtdC+0LHRhdC+0LTQuNC80L4g0L7Rh9C40YHRgtC40YLRjC5cbiAgICAgKi9cbiAgICBzdGF0aWMgY2xlYXJIdG1sKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQnNC10YLQvtC0INCy0YHRgtCw0LLQu9GP0LXRgiDRgdC+0LTQtdGA0LbQuNC80L7QtSDQsiDQsdC70L7Qui5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCAtINGN0LvQtdC80LXQvdGCINCyINC60L7RgtC+0YDRi9C5INC90YPQttC90L4g0LLRgdGC0LDQstC40YLRjC5cbiAgICAgKiBAcGFyYW0ge09iamVjdC9zdHJpbmd9IGNvbnRlbnQgLSDQstGB0YLQsNCy0LvRj9C10LzRi9C5INC60L7QvdGC0LXQvdGCLlxuICAgICAqL1xuICAgIHN0YXRpYyBpbnNldENvbnRlbnQoZWxlbWVudCwgY29udGVudCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbGVtZW50Lmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgY29udGVudCk7XG4gICAgICAgI
46184H0gZWxzZSBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JzQtdGC0L7QtCDQv9C+0LvQvdC+0YHRgtGM0Y4g0YPQtNCw0LvRj9C10YIg0Y3Qu9C10LzQtdC90YIg0LjQtyBET00t0LTQtdGA0LXQstCwLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IC0g0Y3Qu9C10LzQtdC90YIsINC60L7RgtC+0YDRi9C5INC90LXQvtCx0YXQvtC00LjQvNC+INGD0LTQsNC70LjRgtGMLlxuICAgICAqL1xuICAgIHN0YXRpYyByZW1vdmVFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgLy8gbm9kZS5yZW1vdmUoKSDQvdC1INGA0LDQsdC+0YLQsNC10YIg0LIgSUUxMVxuICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiDQnNC10YLQvtC0INC/0L7QutCw0LfRi9Cy0LDQtdGCINGN0LvQtdC80LXQvdGCLlxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCAtINGN0LvQtdC80LXQvdGCLCDQutC+0YLQvtGA0YvQuSDQvdC10L7QsdGF0L7QtNC40LzQviDQv9C+0LrQsNC30LDRgtGMLlxuICAgICAqL1xuICAgIHN0YXRpYyBzaG93KGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQnNC10YLQvtC0INGB0LrRgNGL0LLQsNC10YIg0Y3Qu9C10LzQtdC90YIuXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50IC0g0Y3Qu9C10LzQtdC90YIsINC60L7RgtC+0YDRi9C5INC90LXQvtCx0YXQvtC00LjQvNC+INGB0LrRgNGL0YLRjC5cbiAgICAgKi9cbiAgICBzdGF0aWMgaGlkZShlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQnNC10YLQvtC0INC+0YLQv9GA0LDQstC70Y/QtdGCIGFqYXgg0LfQsNC/0YDQvtGBINC90LAg0YHQtdGA0LLQtdGALlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0g0L7RgtC/0YDQsNCy0LvRj9C10LzRi9C1INC00LDQvdC90YvQtS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0g0LzQsNGA0YjRgNGD0YIg0L/QviDQutC+0YLQvtGA0L7QvNGDINC90YPQttC90L4g0L/RgNC+0LjQt9Cy0LXRgdGC0Lgg0LfQsNC/0YDQvtGBLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gINGE0YPQvdC60YbQuNGPINC+0LHRgNCw0YLQvdC+0LPQviDQstGL0LfQvtCy0LAsINC60L7RgtC+0YDQsNGPINC/0YDQuCDRg9GB0L/QtdGF0LUg0LLRi9C30L7QstC10YIgc3VjY2Vzcywg0LAg0L/RgNC4INC+0YjQuNCx0LrQtSBlcnJvci5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kIC0g0LzQtdGC0L7QtCDQt9Cw0L/RgNC+0YHQsFxuICAgICAqL1xuICAgIHN0YXRpYyBzZW5kKGRhdGEsIHVybCwgY2FsbGJhY2sgPSBmdW5jdGlvbigpIHt9LCBtZXRob2QgPSAnUE9TVCcpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgY29uc3Qgc3RhdHVzU3VjY2VzcyA9IDIwMDtcbiAgICAgICAgbGV0IGRhdGFUb1NlbmQgPSBkYXRhO1xuXG4gICAgICAgIHhoci5vcGVuKG1ldGhvZCwgdXJsKTtcblxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcigneC1yZXF1ZXN0ZWQtd2l0aCcsICdYTUxIdHRwUmVxdWVzdCcpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YVRvU2VuZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGRhdGFUb1NlbmQgPSAkLnBhcmFtKGRhdGFUb1NlbmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgeGhyLnNlbmQoZGF0YVRvU2VuZCk7XG5cbiAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uIFhIUigpIHtcbiAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSBzdGF0dXNTdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxID0gSlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG5cbiAgICAgICAgICAgICAgICBjYWxsYmFjay5zdWNjZXNzKHJlcSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVycm9yKHhoci5zdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCc0LXRgtC+0LQg0L/RgNC+0LLQtdGA0Y/QtdGCINC90LDQu9C40YfQuNC1INC40L3RgtC10YDQvdC10YLQsFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IC0g0J/RgNC4INC90LDQu9C40YfQuNC4INGA0LXQt9GD0LvRjNGC0LDRgtC+0Lwg0LHRg9C00LXRgiB0cnVlLCDQsCDQv9GA0Lgg0L7RgtGB0YPRgtGB0LLQuNC4IGZhbHNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBjaGVja0ludGVybmV0Q29ubmVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5vbkxpbmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JzQtdGC0L7QtCDQv9GA0L7QstC10YDRj9C10YIg0L/RgNC40YHRg9GC0YHRgtCy0YPQtdGCINC70Lgg0LrQu9GO0Ycg0LIg0L7QsdGK0LXQutGC0LVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IC0g0L/RgNC+0LLQtdGA0Y/QtdC8INC+0LHRitC10LrRglxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgLSDQutC70Y7Rhywg0L3QsNC70LjRh9C40LUg0LrQvtGC0L7RgNC+0LPQviDQv9GA0L7QstC10YDRj9C10YIg0LIg0L7QsdGK0LXQutGC0LVcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSAtINC/0YDQuNGB0YPRgtGB0YLQstGD0LXRgiDQuNC70Lgg0L3QtdGCINC60LvRjtGHINCyINC+0LHRitC10LrRgtC1XG4gICAgICovXG4gICAgc3RhdGljIGtleUV4aXN0KG9iamVjdCwga2V5KSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCc0LXRgtC+0LQg0L/RgNC+0LLQtdGA0Y/QtdGCINC/0YPRgdGC0L7QuSDQvtCx0YrQtdC60YIg0LjQu9C4INC90LXRglxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgLSDQvtCx0YrQtdC60YIg0L/RgNC+0LLQtdGA0Y/QtdC80YvQuSDQvdCwINC/0YPRgdGC0L7RgtGDXG4gICAgICogQHJldHVybi
46184B7Ym9vbGVhbn0gLSB0cnVlINC10YHQu9C4INC/0YPRgdGC0L7QuSDQuCBmYWxzZSDQtdGB0LvQuCDQv9C+0LvQvdGL0LlcbiAgICAgKi9cbiAgICBzdGF0aWMgaXNFbXB0eU9iamVjdChvYmplY3QpIHtcbiAgICAgICAgY29uc3QgZW1wdHkgPSAwO1xuXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3QpLmxlbmd0aCA9PT0gZW1wdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC+0LLQtdGA0Y/QtdGCINC/0LXRgNC10LTQsNC90L3Ri9C1INC00LDQvdC90YvQtSDQvdCwINGB0YLRgNC+0LrRg1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgLSDQtNCw0L3QvdGL0LUg0L3QsCDQv9GA0L7QstC10YDQutGDXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gLSDQstC+0LfRgNCw0YnQsNC10YIgdHJ1ZSwg0LXRgdC70Lgg0YHRgtGA0L7QutCwLCDQuCBmYWxzZSDQvdCw0L7QsdC+0YDQvtGCXG4gICAgICovXG4gICAgc3RhdGljIGlzU3RyaW5nKHN0cmluZykge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHN0cmluZyA9PT0gJ3N0cmluZyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KPQt9C90LDQtdGCIGluZGV4INGN0LvQtdC80LXQvdGC0LAg0LIg0YDQvtC00LjRgtC10LvRjNGB0LrQvtC5INGN0LvQtdC80LXQvdGCXG4gICAgICog0JDQvdCw0LvQvtCzIGpxdWVyeS5pbmRleCgpXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50IC0g0LjRgdC60L7QvNGL0Lkg0Y3Qu9C10LzQtdC90YJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0g0L/QvtGA0Y/QtNC60L7QstGL0Lkg0L3QvtC80LXRgCAo0LjQvdC00LXQutGBKSDQsiDRgNC+0LTQuNGC0LXQu9GM0YHQutC+0Lwg0Y3Qu9C10LzQtdC90YLQtVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRFbGVtZW50SW5kZXgoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlbGVtZW50LnBhcmVudE5vZGUuY2hpbGRyZW4pLmluZGV4T2YoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC+0LLQtdGA0Y/QtdGCLCDQv9C+0LTQtNC10YDQttC40LLQsNC10YIg0LvQuCDRg9GB0YLRgNC+0LnRgdGC0LLQviB0b3VjaC3RgdC+0LHRi9GC0LjRj1xuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IC0g0LLQvtC30YDQsNGJ0LDQtdGCIHRydWUsINC10YHQu9C4IFRvdWNoLdGD0YHRgtGA0L7QudGB0YLQstC+LCDQuCBmYWxzZSDQvdCw0L7QsdC+0YDQvtGCXG4gICAgICovXG4gICAgc3RhdGljIGlzVG91Y2goKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93IHx8XG4gICAgICAgICAgICAgICAgKHdpbmRvdy5Eb2N1bWVudFRvdWNoICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuRG9jdW1lbnRUb3VjaCkpKSB8fFxuICAgICAgICAgICAgQm9vbGVhbih0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiAobmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzIHx8IG5hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KPQt9C90LDQtdGCINC90LDRhdC+0LTQuNGC0YHRjyDQu9C4INGN0LvQtdC80LXQvdGCINCy0L4g0LLRjNGO0L/QvtGA0YLQtVxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCAtINC40YHQutC+0LzRi9C5INGN0LvQtdC80LXQvdGCXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gLSDQstC+0LfRgNCw0YnQsNC10YIgdHJ1ZSwg0LXRgdC70Lgg0Y3Qu9C10LzQtdC90YIg0LLQuNC00LXQvSDQvdCwINGN0LrRgNCw0L3QtSwg0LggZmFsc2Ug0L3QsNC+0LHQvtGA0L7RglxuICAgICAqL1xuICAgIHN0YXRpYyBpc0luVmlld3BvcnQoZWxlbWVudCkge1xuICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3Qgd2luZG93SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICAgIGNvbnN0IHdpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGggfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgICBjb25zdCBiZWxvd1ZpZXdwb3J0ID0gMDtcblxuICAgICAgICBjb25zdCB2ZXJ0aWNhbEluVmlldyA9IChyZWN0LnRvcCA8PSB3aW5kb3dIZWlnaHQpICYmICgocmVjdC50b3AgKyByZWN0LmhlaWdodCkgPj0gYmVsb3dWaWV3cG9ydCk7XG4gICAgICAgIGNvbnN0IGhvcml6b250YWxJblZpZXcgPSAocmVjdC5sZWZ0IDw9IHdpbmRvd1dpZHRoKSAmJiAoKHJlY3QubGVmdCArIHJlY3Qud2lkdGgpID49IGJlbG93Vmlld3BvcnQpO1xuXG4gICAgICAgIHJldHVybiB2ZXJ0aWNhbEluVmlldyAmJiBob3Jpem9udGFsSW5WaWV3O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC/0LXRgNC10LTQsNCy0LDQtdC80YPRjiDRhNGD0L3QutGG0LjRjiDQvdC1INGH0LDRidC1LCDRh9C10Lwg0YDQsNC3INCyIHdhaXQg0LzRgVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmdW5jIC0g0YTRg9C90LrRhtC40Y9cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCAtINCy0YDQtdC80Y8g0L7QttC40LTQsNC90LjRjywg0LzRgVxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gLSBmdW5jXG4gICAgICovXG4gICAgc3RhdGljIGRlYm91bmNlKGZ1bmMsIHdhaXQpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgKi9cbiAgICAgICAgbGV0IHRpbWVvdXQ7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgfSwgd2FpdCk7XG4gICAgICAgI
46184H07XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgICB9XG5cbiAgICBzdGF0aWMgY2xvc2VzdChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgICAgICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdCA9IDA7XG4gICAgICAgIGNvbnN0IGZvdW5kRWxlbWVudHMgPSAkKGVsZW1lbnQpLmNsb3Nlc3Qoc2VsZWN0b3IpO1xuXG4gICAgICAgIGlmICghZm91bmRFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3VuZEVsZW1lbnRzW2ZpcnN0XTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFV0aWxzO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0IHN1Y2Nlc3NUcGwgZnJvbSAnY29tcG9uZW50cy9mb3Jtcy92YWxpZGF0aW9uL3ZhbGlkYXRpb24udHdpZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnY29tbW9uL3NjcmlwdHMvdXRpbHMnO1xuaW1wb3J0IFZhbGlkYXRpb24gZnJvbSAnY29tcG9uZW50cy9mb3Jtcy92YWxpZGF0aW9uJztcblxuY2xhc3MgU3VibWl0IHtcbiAgICBpbml0KG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy50YXJnZXQgPSBvcHRpb25zLnRhcmdldDtcbiAgICAgICAgdGhpcy5mb3JtID0gdGhpcy50YXJnZXQuY2xvc2VzdCgnZm9ybScpO1xuICAgICAgICB0aGlzLmZvcm1XcmFwID0gdGhpcy50YXJnZXQuY2xvc2VzdCgnLmItY2FsbGJhY2tfX2Zvcm0nKTtcbiAgICAgICAgdGhpcy5yZXBseVdyYXAgPSB0aGlzLmZvcm1XcmFwLm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgdGhpcy51cmwgPSB0aGlzLmZvcm0uZ2V0QXR0cmlidXRlKCdhY3Rpb24nKTtcbiAgICAgICAgdGhpcy5tZXRob2QgPSB0aGlzLmZvcm0uZ2V0QXR0cmlidXRlKCdtZXRob2QnKTtcbiAgICAgICAgdGhpcy5pbnB1dHMgPSB0aGlzLmZvcm0ucXVlcnlTZWxlY3RvckFsbCgnLmotaW5wdXQnKTtcbiAgICAgICAgdGhpcy5ub0Vycm9ycyA9IDA7XG5cbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgYmluZEV2ZW50cygpIHtcbiAgICAgICAgdGhpcy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25DaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB2YWxpZGF0aW9uQ2hlY2soKSB7XG4gICAgICAgIHRoaXMuaW5wdXRzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0VmFsaWRhdGlvbiA9IG5ldyBWYWxpZGF0aW9uKCk7XG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBpdGVtLmRhdGFzZXQuZXJyb3I7XG5cbiAgICAgICAgICAgIGlucHV0VmFsaWRhdGlvbi5pbml0KHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IGl0ZW0sXG4gICAgICAgICAgICAgICAgZXJyb3IgOiBlcnJvck1lc3NhZ2VcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpbnB1dFZhbGlkYXRpb24udmFsaWRhdGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oYXMtZXJyb3InKS5sZW5ndGggPT09IHRoaXMubm9FcnJvcnMpIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VuZCgpIHtcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gJCh0aGlzLmZvcm0pLnNlcmlhbGl6ZSgpO1xuXG4gICAgICAgIFV0aWxzLnNlbmQoZm9ybURhdGEsXG4gICAgICAgICAgICB0aGlzLnVybCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzKHJlc3BvbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5zaG93U3VjY2Vzc01lc3NhZ2UocmVzcG9uZCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcihlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGDQvtGI0LjQsdC60LAg0L3QsCDRgdC10YDQstC10YDQtTogJHtlcnJvcn1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aGlzLm1ldGhvZCk7XG4gICAgfVxuXG4gICAgc2hvd1N1Y2Nlc3NNZXNzYWdlKGRhdGEpIHtcbiAgICAgICAgdGhpcy5mb3JtV3JhcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBVdGlscy5pbnNldENvbnRlbnQodGhpcy5yZXBseVdyYXAsIHN1Y2Nlc3NUcGwoZGF0YS5kYXRhKSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTdWJtaXQ7XG4iLCIvKipcbiAqIEB2ZXJzaW9uIDEuMGFscGhhXG4gKiBAYXV0aG9yIEtlbG5payBTdHVkaW9zIHtodHRwOi8va2VsbmlrLnJ1fVxuICogQGxpbmsgaHR0cHM6Ly9rZWxuaWsuZ2l0Ym9va3MuaW8va2VsbmlrLWRvY3VtZW50YXRpb24vY29udGVudC9mcm9udC1lbmQvY29tcG9uZW50cy9mb3Jtcy9pbnB1dC10ZWwuaHRtbCBkb2N1bWVudGF0aW9uXG4gKi9cblxuLyoqXG4gKiBEZXBlbmRlbmNpZXNcbiAqL1xuXG5pbXBvcnQgaW5wdXRtYXNrIGZyb20gJ2lucHV0bWFzayc7XG5cbi8qKlxuICog0JzQvtC00YPQu9GMINCy0LLQtdGI0LDQtdGCINC80LDRgdC60YMg0L3QsCBpbnB1dCDRgtC40L/QvtC8IHRlbFxuICovXG5jbGFzcyBJbnB1dFRlbGVwaG9uZSB7XG4gICAgaW5pdChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBvcHRpb25zLmlucHV0O1xuICAgICAgICB0aGlzLm1hc2sgPSBvcHRpb25zLm1hc2sgfHwgJys3KDk5OSkgOTk5LTk5LTk5JztcblxuICAgICAgICB0aGlzLnNldE1hc2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9GB0YLQsNC90LDQstC70LjQstCw0LXQvCDQvNCw0YHQutGDINC90LAg0LjQvdC/0YPRglxuICAgICAqL1xuICAgIHNldE1hc2soKSB7XG4gICAgICAgIGlucHV0bWFzayh7bWFzazogdGhpcy5tYXNrfSkubWFzayh0aGlzLmlucHV0KTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IElucHV0VGVsZXBob25lO1xuIiwiLyoqXG4gKiBEZXBlbmRlbmNpZXNcbiAqL1xuXG5pbXBvcnQgaHlwZXJmb3JtIGZyb20gJ2h5cGVyZm9ybSc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnY29tbW9uL3NjcmlwdHMvdXRpbHMnO1xuY29uc3QgZm9jdXNDbGFzcyA9ICdpcy1mb2N1c2VkJztcblxuY2xhc3MgVmFsaWRhdGlvbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgI
46184HRoaXMuZXJyb3JDbGFzcyA9ICdoYXMtZXJyb3InO1xuICAgICAgICB0aGlzLmVycm9yV3JhcENsYXNzID0gJ2ItZm9ybS1lcnJvcic7XG4gICAgfVxuXG4gICAgaW5pdChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBvcHRpb25zLnRhcmdldDtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBvcHRpb25zLmVycm9yIHx8ICfQktCy0LXQtNC40YLQtSDRgtC10LrRgdGCINCyINC/0L7Qu9C1INCy0LLQvtC00LAnO1xuICAgICAgICB0aGlzLmlucHV0V3JhcCA9IHRoaXMuaW5wdXQuY2xvc2VzdCgnZGl2Jyk7XG4gICAgICAgIHRoaXMuZXJyb3JXcmFwID0gdGhpcy5pbnB1dFdyYXAucXVlcnlTZWxlY3RvcihgLiR7dGhpcy5lcnJvcldyYXBDbGFzc31gKTtcblxuICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICB9XG5cbiAgICBiaW5kRXZlbnRzKCkge1xuICAgICAgICB0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLnZhbGlkYXRlLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdGhpcy52YWxpZGF0ZS5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBjcmVhdGVFcnJvcldyYXAoKSB7XG4gICAgICAgIGlmICh0aGlzLmVycm9yV3JhcCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgVXRpbHMuaW5zZXRDb250ZW50KHRoaXMuaW5wdXRXcmFwLCBgPGRpdiBjbGFzcz1cIiR7dGhpcy5lcnJvcldyYXBDbGFzc31cIj48L2Rpdj5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVycm9yV3JhcCA9IHRoaXMuaW5wdXRXcmFwLnF1ZXJ5U2VsZWN0b3IoYC4ke3RoaXMuZXJyb3JXcmFwQ2xhc3N9YCk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGUoKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlRXJyb3JXcmFwKCk7XG4gICAgICAgIHRoaXMubGFiZWxDb25kdWN0KCk7XG5cbiAgICAgICAgaWYgKGh5cGVyZm9ybS53aWxsVmFsaWRhdGUodGhpcy5pbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSBoeXBlcmZvcm0uVmFsaWRpdHlTdGF0ZSh0aGlzLmlucHV0KS52YWxpZDsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4gICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIFV0aWxzLmNsZWFySHRtbCh0aGlzLmVycm9yV3JhcCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dFdyYXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmVycm9yQ2xhc3MpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBVdGlscy5jbGVhckh0bWwodGhpcy5lcnJvcldyYXApO1xuICAgICAgICAgICAgICAgIFV0aWxzLmluc2V0Q29udGVudCh0aGlzLmVycm9yV3JhcCwgdGhpcy5lcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRXcmFwLmNsYXNzTGlzdC5hZGQodGhpcy5lcnJvckNsYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxhYmVsQ29uZHVjdCgpIHtcbiAgICAgICAgdGhpcy5sYWJlbCA9IHRoaXMuaW5wdXQubmV4dFNpYmxpbmcubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgaWYgKHRoaXMuaW5wdXQudmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLmxhYmVsLmNsYXNzTGlzdC5yZW1vdmUoZm9jdXNDbGFzcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxhYmVsLmNsYXNzTGlzdC5hZGQoZm9jdXNDbGFzcyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZhbGlkYXRpb247XG4iLCJ2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCI5MjY2MGQzYzQ2NTQ3ZTg5YTQzNDA1MmI2NWM2YWIyMmY1YmQzMDZiZDhmYjRlZTJjZjYyMjQzZTY2YmRmOTdkM2RmNWJiOGViOTZlMjE2ZDZkNjk2NjVhY2VkYzQwMTg2ODIzZGI2YzRiMjdjMGNiYmQ3ZjY3ZDc2YTk4OTRlMFwiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8aDQgY2xhc3M9XFxcImItY2FsbGJhY2stcmVwbHlfX3RpdGxlXFxcIj5cIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcInRpdGxlXCIsXCJtYXRjaFwiOltcInRpdGxlXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIjwvaDQ+XFxuPGRpdiBjbGFzcz1cXFwiYi1jYWxsYmFjay1yZXBseV9fdGV4dFxcXCI+XCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJtZXNzYWdlXCIsXCJtYXRjaFwiOltcIm1lc3NhZ2VcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiPC9kaXY+XFxuPGRpdiBjbGFzcz1cXFwiYi1jYWxsYmFjay1yZXBseV9faWNvblxcXCI+XFxuICAgIDxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB4bWxuczp4bGluaz1cXFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1xcXCIgd2lkdGg9XFxcIjE1MlxcXCIgaGVpZ2h0PVxcXCIxNTJcXFwiIHZpZXdCb3g9XFxcIjAgMCAxNTIgMTUyXFxcIj48ZGVmcz48cGF0aCBpZD1cXFwidnY5M2FcXFwiIGQ9XFxcIk02NDQgNDc1YzAtNDEuOTc0IDM0LjAyNi03NiA3Ni03NnM3NiAzNC4wMjYgNzYgNzYtMzQuMDI2IDc2LTc2IDc2LTc2LTM0LjAyNi03Ni03NnpcXFwiLz48cGF0aCBpZD1cXFwidnY5M2JcXFwiIGQ9XFxcIk03MTYuMjUgNDc3LjVsMTcuNS0xNy41IDYuMjUgNi4yNUw3MTYuMjUgNDkwIDcwMCA0NzMuNzVsNi4yNS02LjI1elxcXCIvPjwvZGVmcz48Zz48ZyBvcGFjaXR5PVxcXCIuMlxcXCIgdHJhbnNmb3JtPVxcXCJ0cmFuc2xhdGUoLTY0NCAtMzk5KVxcXCI+PHVzZSBmaWxsPVxcXCIjZDY5ZDNhXFxcIiB4bGluazpocmVmPVxcXCIjdnY5M2FcXFwiLz48L2c+PGcgdHJhbnNmb3JtPVxcXCJ0cmFuc2xhdGUoLTY0NCAtMzk5KVxcXCI+PHVzZSBmaWxsPVxcXCIjZDY5ZDNhXFxcIiB4bGluazpocmVmPVxcXCIjdnY5M2JcXFwiLz48L2c+PC9nPjwvc3ZnPlxcbjwvZGl2PlxcblwifV0sXCJhbGxvd0lubGluZUluY2x1ZGVzXCI6dHJ1ZSxcInJldGhyb3dcIjp0cnVlfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oY29udGV4dCkgeyByZXR1cm4gdGVtcGxhdGUucmVuZGVyKGNvbnRleHQpOyB9IiwiY29uc3QgZGVmYXVsdFBvc2l0aW9uID0gMDtcbmNvbnN0IGhhbGYgPSAyO1xuY29uc3QgcmlnaHRDbGFzc0luID0gJ2lzLWdvZXMtcmlnaHQnO1xuY29uc3QgbGVmdENsYXNzSW4gPSAnaXMtZ29lcy1sZWZ0JztcbmNvbnN0IHJpZ2h0Q2xhc3NPdXQgPSAnaXMtZ29lcy1yaWdodF9fb3V0JztcbmNvbnN0IGxlZnRDbGFzc091dCA9ICdpcy1nb2VzLWxlZnRfX291dCc7XG5jb25zdCBpdGVtV2l0aEJnSW1nID0gJ2lzLWdvZXMtd2l0aC1pbWFnZSc7XG5cbmNsYXNzIEhvdmVyRWZmZWN0IHtcbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgICAgI
46184HRoaXMud2lkdGggPSBlbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICB0aGlzLnRpdGxlID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbY2xhc3MqPXR0bF0nKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdiLWhpZ2hsaWdodC1wYXJlbnQnKTtcbiAgICAgICAgLy8g0JXRgdC70Lgg0YTQvtC9INGBINC40LfQvtCx0YDQsNC20LXQvdC40LXQvCDRgtC+INC00LXQu9Cw0LXQvCDQutC70LjQvyDQuCDQvdCwINGB0LDQvCDRgtC10LrRgdGCXG4gICAgICAgIHRoaXMud2l0aEJnSW1nID0gZWxlbWVudC5kYXRhc2V0LndpdGhCZ0ltZztcbiAgICAgICAgdGhpcy5jcmVhdGVMYXllcihlbGVtZW50KTtcbiAgICAgICAgdGhpcy5jaGVja0VsZW1lbnRXaXRoQmcodGhpcy50aXRsZSk7XG4gICAgICAgIHRoaXMuX2xvYWRFdmVudHMoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQvtC30LTQsNC10YIg0YHQu9C+0Lkt0LzQsNGB0LrRg1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IC0gZGl2XG4gICAgICovXG4gICAgY3JlYXRlTGF5ZXIoZWxlbWVudCkge1xuICAgICAgICB0aGlzLmxheWVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMubGF5ZXIuY2xhc3NOYW1lID0gJ2ItaGlnaGxpZ2h0LWxheWVyJztcblxuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHRoaXMubGF5ZXIpO1xuICAgIH1cblxuICAgIF9sb2FkRXZlbnRzKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxheWVyLnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgICAgICAgICB0aGlzLmdldEN1cnNvckRpcmVjdGlvbihldmVudCk7XG4gICAgICAgICAgICB0aGlzLm1vdmVMYXllckluKHRoaXMuZGlyZWN0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5nZXRDdXJzb3JEaXJlY3Rpb24oZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy5tb3ZlTGF5ZXJPdXQodGhpcy5kaXJlY3Rpb24pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRDdXJzb3JEaXJlY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSBldmVudC5vZmZzZXRYO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmRpcmVjdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQv9C10YDQtdC80LXRidCw0LXRgiDRgdC+0LfQtNCw0L3QvdGL0Lkg0YHQu9C+0Lkg0L/QvtCy0LXRgNGFINGA0L7QtNC40YLQtdC70YzRgdC60L7Qs9C+INCx0LvQvtC60LBcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gY29vcmRYIC0g0LfQvdCw0YfQtdC90LjQtSDQutC+0L7RgNC00LjQvdCw0YLRiyB4INC60YPRgNGB0L7RgNCwXG4gICAgICovXG4gICAgbW92ZUxheWVySW4oY29vcmRYKSB7XG4gICAgICAgIGlmIChjb29yZFggPiB0aGlzLndpZHRoIC8gaGFsZikge1xuICAgICAgICAgICAgdGhpcy50aXRsZS5jbGFzc0xpc3QuYWRkKHJpZ2h0Q2xhc3NJbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRpdGxlLmNsYXNzTGlzdC5hZGQobGVmdENsYXNzSW4pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGl0bGUuY2xhc3NMaXN0LnJlbW92ZShyaWdodENsYXNzT3V0KTtcbiAgICAgICAgdGhpcy50aXRsZS5jbGFzc0xpc3QucmVtb3ZlKGxlZnRDbGFzc091dCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0L/QtdGA0LXQvNC10YnQsNC10YIg0YHQvtC30LTQsNC90L3Ri9C5INGB0LvQvtC5INC30LAg0L/RgNC10LTQtdC70Ysg0YDQvtC00LjRgtC10LvRjNGB0LrQvtCz0L4g0LHQu9C+0LrQsFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjb29yZFggLSDQt9C90LDRh9C10L3QuNC1INC60L7QvtGA0LTQuNC90LDRgtGLIHgg0LrRg9GA0YHQvtGA0LBcbiAgICAgKi9cbiAgICBtb3ZlTGF5ZXJPdXQoY29vcmRYKSB7XG4gICAgICAgIGlmIChjb29yZFggPiBkZWZhdWx0UG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMubGF5ZXIuc3R5bGUubGVmdCA9ICcxMDAlJztcbiAgICAgICAgICAgIHRoaXMudGl0bGUuY2xhc3NMaXN0LmFkZCgnaXMtZ29lcy1sZWZ0X19vdXQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGF5ZXIuc3R5bGUubGVmdCA9ICctMTAwJSc7XG4gICAgICAgICAgICB0aGlzLnRpdGxlLmNsYXNzTGlzdC5hZGQoJ2lzLWdvZXMtcmlnaHRfX291dCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50aXRsZS5jbGFzc0xpc3QucmVtb3ZlKHJpZ2h0Q2xhc3NJbik7XG4gICAgICAgIHRoaXMudGl0bGUuY2xhc3NMaXN0LnJlbW92ZShsZWZ0Q2xhc3NJbik7XG4gICAgfVxuXG4gICAgY2hlY2tFbGVtZW50V2l0aEJnKHRpdGxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy53aXRoQmdJbWcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aXRsZS5jbGFzc0xpc3QuYWRkKGl0ZW1XaXRoQmdJbWcpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBIb3ZlckVmZmVjdDtcbiIsIi8qKlxuICogQHZlcnNpb24gMS4xYWxwaGFcbiAqIEBhdXRob3IgS2VsbmlrIFN0dWRpb3Mge2h0dHA6Ly9rZWxuaWsucnV9XG4gKiBAbGluayBodHRwczovL2tlbG5pay5naXRib29rcy5pby9rZWxuaWstZG9jdW1lbnRhdGlvbi9jb250ZW50L2Zyb250LWVuZC9jb21wb25lbnRzL21vYmlsZS1oZWFkZXIuaHRtbCBkb2N1bWVudGF0aW9uXG4gKi9cblxuLyoqXG4gKiBEZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0ICcuL21vYmlsZS1oZWFkZXIuc2Nzcyc7XG5pbXBvcnQgSGFtbWVyIGZyb20gJ2hhbW1lcmpzJztcblxuXG4vKipcbiAqIENvbXBvbmVudFxuICovXG5jbGFzcyBIZWFkZXIge1xuICAgIGluaXQob3B0aW9ucykge1xuICAgICAgICB0aGlzLmhlYWRlclBhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iob3B0aW9ucy5lbGVtZW50KSB8fCBudWxsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDQn9GA0L7QstC10YDQutCwINC90LAg0L3QsNC70LjRh9C40LUg0YXRjdC00LXRgNCwXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoIXRoaXMuaGVhZGVyUGFyZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdOZWVkIHRhcmdldCBlbGVtZW50IC0gaHR0cHM6Ly9rZWxuaWsuZ2l0Ym9va3MuaW8va2VsbmlrLWRvY3VtZW50YXRpb24vY29udGVudC9mcm9udC1lbmQvY29tcG9uZW50cy9tb2JpbGUtaGVhZGVyLmh0bWwnKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ib2R5ID0gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgdGhpcy5oZWFkZXIgPSB0aGlzLmhlYWRlclBhcmVudC5xdWVyeVNlbGVjdG9yKCcuYi1oZWFkZXItd3JhcCcpO1xuICAgICAgICB0aGlzLm1lbnUgPSB0aGlzLmhlYWRlclBhcmVudC5xdWVyeVNlbGVjdG9yKCcuYi1oZWFkZXJfX21vYmlsZS1tZW51Jyk7XG4gICAgICAgI
46184HRoaXMub3BlbkJ1dHRvbiA9IHRoaXMuaGVhZGVyUGFyZW50LnF1ZXJ5U2VsZWN0b3IoJy5iLWhlYWRlcl9fb3Blbi1tZW51Jyk7XG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b24gPSB0aGlzLmhlYWRlclBhcmVudC5xdWVyeVNlbGVjdG9yKCcuYi1oZWFkZXJfX21vYmlsZS1tZW51LWNsb3NlJyk7XG4gICAgICAgIHRoaXMuc2Nyb2xsUG9zaXRpb24gPSAwO1xuICAgICAgICB0aGlzLmF1dG9GaXhlZCA9IG9wdGlvbnMuYXV0b0ZpeGVkO1xuICAgICAgICB0aGlzLmF1dG9Qb3NpdGlvbkNsb3NlQnV0dG9uID0gb3B0aW9ucy5hdXRvUG9zaXRpb25DbG9zZUJ1dHRvbjtcbiAgICAgICAgdGhpcy5yZXR1cm5Qb3NpdGlvbiA9IG9wdGlvbnMucmV0dXJuUG9zaXRpb247XG4gICAgICAgIHRoaXMuc3dpcGVEaXJlY3Rpb24gPSBvcHRpb25zLnN3aXBlRGlyZWN0aW9uIHx8ICdyaWdodCc7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqINCf0YDQvtCy0LXRgNC60LAg0L3QsCDQutC+0YDRgNC10LrRgtC90L7QtSDRg9C60LDQt9Cw0L3QuNC1INC90LDQv9GA0LDQstC70LXQvdC40Y8g0LTQu9GPINGB0LLQsNC50L/QsCAo0LTQvtGB0YLRg9C/0L3QviDRgtC+0LvRjNC60L4g0YHQu9C10LLQsCDQvdCw0L/RgNCw0LLQviwg0Lgg0YHQv9GA0LDQstCwINC90LDQu9C10LLQvilcbiAgICAgICAgICovXG4gICAgICAgIGlmICh0aGlzLnN3aXBlRGlyZWN0aW9uICE9PSAnbGVmdCcgJiYgdGhpcy5zd2lwZURpcmVjdGlvbiAhPT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignV3JvbmcgZGlyZWN0aW9uIHN3aXBlIC0gaHR0cHM6Ly9rZWxuaWsuZ2l0Ym9va3MuaW8va2VsbmlrLWRvY3VtZW50YXRpb24vY29udGVudC9mcm9udC1lbmQvY29tcG9uZW50cy9tb2JpbGUtaGVhZGVyLmh0bWwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXNlT3B0aW9ucygpO1xuICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICAgICAgdGhpcy5zZXRIZWlnaHRIZWFkZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LHRi9GC0LjRj1xuICAgICAqL1xuICAgIGJpbmRFdmVudHMoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBD0L7QsdGL0YLQuNGPINC00LvRjyDQv9C+0LfQuNGG0LjQvtC90LjRgNC+0LLQsNC90LjRjyDQutC90L7Qv9C60Lgg0LfQsNC60YDRi9GC0Ywg0Lgg0YPRgdGC0LDQvdC+0LLQutC4INCy0YvRgdC+0YLRiyDRhdGN0LTQtdGA0YNcbiAgICAgICAgICovXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLmNoYW5nZVBvc2l0aW9uQ2xvc2VCdXR0b24uYmluZCh0aGlzKSk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnNldEhlaWdodEhlYWRlci5iaW5kKHRoaXMpKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ9C+0LHRi9GC0LjRjyDQtNC70Y8g0L7RgtC60YDRi9GC0LjRjy/Qt9Cw0LrRgNGL0YLQuNGPINC80LXQvdGOXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9wZW5CdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9wZW5NZW51LmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmNsb3NlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbG9zZU1lbnUuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqINCX0LDQutGA0YvRgtC40LUg0LzQtdC90Y4g0L/QviDRgdCy0LDQudC/0YMgKNC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOIC0g0YHQu9C10LLQsCDQvdCw0L/RgNCw0LLQvilcbiAgICAgICAgICovXG4gICAgICAgIG5ldyBIYW1tZXIodGhpcy5tZW51KS5vbihgc3dpcGUke3RoaXMuc3dpcGVEaXJlY3Rpb259YCwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbG9zZU1lbnUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JzQtdGC0L7QtCDQv9GA0LjQvNC10L3QtdC90LjRjyDQvdCw0YHRgtGA0L7QtdC6XG4gICAgICovXG4gICAgdXNlT3B0aW9ucygpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqINCX0LDQv9GD0YHQuiDRgdC60YDQuNC/0YLQsCDRgdC60YDQvtC70LvQsCDQv9GA0Lgg0L3QsNGB0YLRgNC+0LnQutC1IGF1dG9GaXhlZDogdHJ1ZVxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGlmICh0aGlzLmF1dG9GaXhlZCkge1xuICAgICAgICAgICAgdGhpcy5oZWFkZXIuY2xhc3NMaXN0LmFkZCgnYi1oZWFkZXJfcG9zaXRpb25fZml4ZWQnKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlUG9zaXRpb25IZWFkZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCc0LXRgtC+0LQg0YDQtdCw0LvQuNC30LDRhtC40Lgg0L/QvtGP0LLQu9C10L3QuNGPL9GB0LrRgNGL0YLQuNGPINGF0Y3QtNC10YDQsFxuICAgICAqL1xuICAgIGNoYW5nZVBvc2l0aW9uSGVhZGVyKCkge1xuICAgICAgICAvLyDRiNCw0LMg0LLRgNC10LzQtdC90Lgg0LfQsNC00LXRgNC20LrQuCDQvtGC0YDQsNCx0LDRgtGL0LLQsNC90LjRjyDRhNGD0L3QutGG0LjQuCDRgdC60YDRi9GC0LjRjyDRhdGN0LTQtdGA0LBcbiAgICAgICAgY29uc3Qgc3RlcFNjcm9sbFRvcCA9IC01O1xuICAgICAgICAvLyDRiNCw0LMg0LLRgNC10LzQtdC90Lgg0LfQsNC00LXRgNC20LrQuCDQvtGC0YDQsNCx0LDRgtGL0LLQsNC90LjRjyDRhNGD0L3QutGG0LjQuCDQvtGC0L7QsdGA0LDQttC10L3QuNGPINGF0Y3QtNC10YDQsFxuICAgICAgICBjb25zdCBzdGVwU2Nyb2xsQm90dG9tID0gNTtcbiAgICAgICAgY29uc3QgaGVpZ2h0SGVhZGVyID0gdGhpcy5oZWFkZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAvLyDRgtC10LrRg9GJ0LDRjyDQv9C+0LfQuNGG0LjRjyDRgdC60YDQvtC70LvQsFxuICAgICAgICBsZXQgc2Nyb2xsUG9zaXRpb24gPSAwO1xuICAgICAgICBjb25zdCBtaW5TY3JvbGxQb3NpdGlvbiA9IDA7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4ge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiDQntGC0LrQu9GO0YfQtdC90LjQtSDQvNC10YLQvtC00LAg0LXRgdC70Lgg0LzQtdC90Y4g0L7RgtC60YDRi9GC0L5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKHRoaXMubWVudS5jbGFzc0xpc3QuY29udGFpbnMoJ2ItaGVhZGVyX19tb2JpbGUtbWVudV9zdGF0ZV9vcGVuJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFRvcFBvc2l0aW9uID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEPQutGA0L7Qu9C7INCy0L3QuNC3INC/0YDQuCDRg9GB0LvQvtCy0LjQuCwg0YfRgtC+INC/0YDQvtGI0LvQsCDQv9C+0LvQvtCy0LjQvdCwINCy0YvRgdC+0YLRiyDRhdGN0LTQtdGA0LBcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKChzY3JvbGxUb3BQb3NpdGlvbiA+IGhlaWdodEhlYWRlcikgJiYgKHNjcm9sbFRvcFBvc2l0aW9uIC0gc2Nyb2xsUG9zaXRpb24pID4gc3RlcFNjcm9sbEJvdHRvbSkge1xuICAgICAgICAgICAgICAgI
46184HRoaXMuaGVhZGVyLmNsYXNzTGlzdC5hZGQoJ2ItaGVhZGVyX3Bvc2l0aW9uX2ZpeGVkJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFkZXIuY2xhc3NMaXN0LmFkZCgnYi1oZWFkZXJfcG9zaXRpb25faGlkZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEPQutGA0L7Qu9C7INCy0LLQtdGA0YVcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKChzY3JvbGxUb3BQb3NpdGlvbiAtIHNjcm9sbFBvc2l0aW9uKSA8IHN0ZXBTY3JvbGxUb3ApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlci5jbGFzc0xpc3QucmVtb3ZlKCdiLWhlYWRlcl9wb3NpdGlvbl9oaWRlJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICog0J7RgtGA0LjRhtCw0YLQtdC70YzQvdGL0Lkg0YHQutGA0L7Qu9C7ICjQv9GA0L7QutGA0YPRgtC60LAg0LLQstC10YDRhSwg0L3QsNGF0L7QtNGP0YHRjCDQv9GA0Lgg0Y3RgtC+0Lwg0LIg0YHQsNC80L7QuSDQstC10YDRhdC90LXQuSDRgtC+0YfQutC1KVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAoc2Nyb2xsVG9wUG9zaXRpb24gPCBtaW5TY3JvbGxQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyLmNsYXNzTGlzdC5yZW1vdmUoJ2ItaGVhZGVyX3Bvc2l0aW9uX2ZpeGVkJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsVG9wUG9zaXRpb247XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCc0LXRgtC+0LQg0L7RgtC60YDRi9GC0LjRjyDQvNC10L3RjlxuICAgICAqL1xuICAgIG9wZW5NZW51KCkge1xuICAgICAgICB0aGlzLnNjcm9sbFBvc2l0aW9uID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuICAgICAgICB0aGlzLm1lbnUuY2xhc3NMaXN0LmFkZCgnYi1oZWFkZXJfX21vYmlsZS1tZW51X3N0YXRlX29wZW4nKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VQb3NpdGlvbkNsb3NlQnV0dG9uKCk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRTcGVlZCA9IDMwMDtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYm9keS5jbGFzc0xpc3QuYWRkKCdib2R5LWZpeGVkJyk7XG4gICAgICAgIH0sIGRlZmF1bHRTcGVlZCk7XG4gICAgICAgIC8vIHRoaXMuc2V0SGVpZ2h0TWVudSgpOyAvLyFCVUdcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQnNC10YLQvtC0INC30LDQutGA0YvRgtC40Y8g0LzQtdC90Y5cbiAgICAgKi9cbiAgICBjbG9zZU1lbnUoKSB7XG4gICAgICAgIHRoaXMubWVudS5jbGFzc0xpc3QucmVtb3ZlKCdiLWhlYWRlcl9fbW9iaWxlLW1lbnVfc3RhdGVfb3BlbicpO1xuICAgICAgICB0aGlzLmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnYm9keS1maXhlZCcpO1xuICAgICAgICB0aGlzLnJldHVybkNvbnRlbnRQb3NpdGlvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCc0LXRgtC+0LQg0LLQvtC30LLRgNCw0YLQsCDQv9C+0LfQuNGG0LjQuCDQutC+0L3RgtC10L3RgtCwINC/0YDQuCDQt9Cw0LrRgNGL0YLQuNC4INC80LXQvdGOXG4gICAgICovXG4gICAgcmV0dXJuQ29udGVudFBvc2l0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMucmV0dXJuUG9zaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3BTY3JvbGxQb3NpdGlvbiA9IDA7XG5cbiAgICAgICAgd2luZG93LnNjcm9sbEJ5KHRvcFNjcm9sbFBvc2l0aW9uLCB0aGlzLnNjcm9sbFBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQnNC10YLQvtC0INC/0L7Qt9C40YbQuNC+0L3QuNGA0L7QstCw0L3QuNGPINC60L3QvtC/0LrQuCDQt9Cw0LrRgNGL0YLQuNGPXG4gICAgICovXG4gICAgY2hhbmdlUG9zaXRpb25DbG9zZUJ1dHRvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmF1dG9Qb3NpdGlvbkNsb3NlQnV0dG9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9zaXRpb25PcGVuQnV0dG9uVG9wID0gdGhpcy5vcGVuQnV0dG9uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgICAgY29uc3QgcG9zaXRpb25PcGVuQnV0dG9uTGVmdCA9IHRoaXMub3BlbkJ1dHRvbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuXG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b24uc3R5bGUubGVmdCA9IGAke3Bvc2l0aW9uT3BlbkJ1dHRvbkxlZnR9cHhgO1xuICAgICAgICB0aGlzLmNsb3NlQnV0dG9uLnN0eWxlLnRvcCA9IGAke3Bvc2l0aW9uT3BlbkJ1dHRvblRvcH1weGA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JzQtdGC0L7QtCDRg9GB0YLQsNC90L7QstC60Lgg0LLRi9GB0L7RgtGLINGF0Y3QtNC10YDRg1xuICAgICAqL1xuICAgIHNldEhlaWdodEhlYWRlcigpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJQYXJlbnQuc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5oZWFkZXIub2Zmc2V0SGVpZ2h0fXB4YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCVUchINCc0LXRgtC+0LQg0YPRgdGC0LDQvdC+0LLQutC4INCy0YvRgdC+0YLRiyDQvNC10L3RjiDQuNGB0YXQvtC00Y8g0LjQtyDQstGL0YHQvtGC0Ysg0LLQuNC00LjQvNC+0Lkg0L7QsdC70LDRgdGC0Lgg0Y3QutGA0LDQvdCwXG4gICAgICovXG4gICAgc2V0SGVpZ2h0TWVudSgpIHtcbiAgICAgICAgY29uc3QgaGVpZ2h0U2NyZWVuID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcblxuICAgICAgICB0aGlzLm1lbnUuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0U2NyZWVufXB4YDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEhlYWRlcjtcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsInZhciB0d2lnID0gcmVxdWlyZShcInR3aWdcIikudHdpZyxcbiAgICB0ZW1wbGF0ZSA9IHR3aWcoe1wiaWRcIjpcIjEyNzhkNTUxY2I3MTU3OTcxMDcwNjViZjIwZWQyMzc5N2RhMzJlOWVmMzA2NTAzM2U0NWVjYWYyMDBkNGU5ZDhhMTQwY2NiNzZhMDQ2YmU1NWJjNjQyMmE5ZmEwODRjNmViZWQ0ZDZiYWUyN2UwZjZhYTY4Njg0ZTIxZGJjODFhXCIsXCJkYXRhXCI6W3tcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIjxhIGhyZWY9XFxcIlwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwibGlua1wiLFwibWF0Y2hcIjpbXCJsaW5rXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIlxcXCIgY2xhc3M9XFxcImItbmV3X19ibGFuayBiLWFuaW1hdGUtYm9yZGVyc19fc2VwYXJhdGVkIGotaG92ZXItaGlnaGxpZ2h0XFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYi10b3AtYm9yZGVyXFxcIj48L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYi1sZWZ0LWJvcmRlclxcXCI+PC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImItcmlnaHQtYm9yZGVyXFxcIj48L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYi1ib3R0b20tYm9yZGVyXFxcIj48L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYi1uZXdfX2RhdGVcXFwiPlwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwiZGF0ZVwiLFwibWF0Y2hcIjpbXCJkYXRlXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIjwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJiLW5ld19fdHRsXFxcIiBkYXRhLXRleHQ9XFxcIlwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwidGl0bGVcIixcIm1hdGNoXCI6W1widGl0bGVcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxcIj5cIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcInRpdGxlXCIsXCJtYXRjaFwiOltcInRpdGxlXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIjwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJiLW5ld19fdGV4dFxcXCI+XCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJhbm5vdW5jZVwiLFwibWF0Y2hcIjpbXCJhbm5vdW5jZVwiXX1dfSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8L2Rpdj5cXG48L2E+XFxuXCJ9XSxcImFsbG93SW5saW5lSW5jbHVkZXNcIjp0cnVlLFwicmV0aHJvd1wiOnRydWV9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb250ZXh0KSB7IHJldHVybi
46184B0ZW1wbGF0ZS5yZW5kZXIoY29udGV4dCk7IH0iLCJ2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCJiZGI0ODBlNzY0MTg2YWYyYWEwOWNhMzVjZDUxYTc0OTEwZGUzYzExYzBiM2E5NzA1ZTlkNGIxYjUzZTE5MzU1NTc0NjRiMzQ0ZGZmOWM2MjgzZWM3NGUxODI5MGQ5YThhNzM3ZWI0OTZmYTI0YzYyYjM5ZGQ0NzJlY2IxMTY1N1wiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8YSBocmVmPVxcXCJcIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcImxpbmtcIixcIm1hdGNoXCI6W1wibGlua1wiXX1dfSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCJcXFwiIGNsYXNzPVxcXCJiLW5ld19fYmFja2dyb3VuZCBqLWhvdmVyLWhpZ2hsaWdodFxcXCIgZGF0YS13aXRoLWJnLWltZyBzdHlsZT1cXFwiYmFja2dyb3VuZC1pbWFnZTogdXJsKCdcIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcImltYWdlXCIsXCJtYXRjaFwiOltcImltYWdlXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIicpXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYi1uZXdfX2RhdGVcXFwiPlwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwiZGF0ZVwiLFwibWF0Y2hcIjpbXCJkYXRlXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIjwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJiLW5ld19fdHRsXFxcIiBkYXRhLXRleHQ9XFxcIlwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwidGl0bGVcIixcIm1hdGNoXCI6W1widGl0bGVcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxcIj48c3Bhbj5cIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcInRpdGxlXCIsXCJtYXRjaFwiOltcInRpdGxlXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIjwvc3Bhbj48L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYi1uZXdfX3RleHRcXFwiPlwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwiYW5ub3VuY2VcIixcIm1hdGNoXCI6W1wiYW5ub3VuY2VcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiPC9kaXY+XFxuPC9hPlxcblwifV0sXCJhbGxvd0lubGluZUluY2x1ZGVzXCI6dHJ1ZSxcInJldGhyb3dcIjp0cnVlfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oY29udGV4dCkgeyByZXR1cm4gdGVtcGxhdGUucmVuZGVyKGNvbnRleHQpOyB9IiwiaW1wb3J0IGJhc2ljVGVtcGxhdGUgZnJvbSAnY29tcG9uZW50cy9uZXdzL2Jhc2ljVGVtcGxhdGUudHdpZyc7XG5pbXBvcnQgaW1hZ2VUZW1wbGF0ZSBmcm9tICdjb21wb25lbnRzL25ld3MvaW1hZ2VUZW1wbGF0ZS50d2lnJztcbmltcG9ydCBNZWRpYXRvciBmcm9tICdjb21tb24vc2NyaXB0cy9tZWRpYXRvcic7XG5pbXBvcnQgVXRpbHMgZnJvbSAnY29tbW9uL3NjcmlwdHMvdXRpbHMnO1xuXG5jb25zdCBtZWRpYXRvciA9IG5ldyBNZWRpYXRvcigpO1xuY29uc3QgdGFibGV0TGFuZHNjYXBlID0gOTYwO1xuY29uc3QgaGlkZGVuQ2xhc3MgPSAnaXMtaGlkZGVuJztcblxuY2xhc3MgTmV3cyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubW9yZUJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qLWxvYWQtbW9yZScpO1xuICAgICAgICB0aGlzLmZpbHRlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuai1uZXdzLWZpbHRlcicpO1xuICAgICAgICB0aGlzLnBhZ2VJbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwYWdlJyk7XG4gICAgICAgIHRoaXMucGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI25ld3MnKTtcbiAgICAgICAgdGhpcy5tb3JlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYWdlSW5wdXQudmFsdWUrKzsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICAgICAgdGhpcy5zZW5kKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZpbHRlcnMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckNoYW5nZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluaXQoZm9ybSkge1xuICAgICAgICB0aGlzLmZvcm0gPSBmb3JtO1xuICAgICAgICB0aGlzLnVybCA9IHRoaXMuZm9ybS5nZXRBdHRyaWJ1dGUoJ2FjdGlvbicpO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IHRoaXMuZm9ybS5nZXRBdHRyaWJ1dGUoJ21ldGhvZCcpO1xuICAgICAgICB0aGlzLnNlbmQoKTtcbiAgICB9XG5cbiAgICBmaWx0ZXJDaGFuZ2UoKSB7XG4gICAgICAgIFV0aWxzLmNsZWFySHRtbCh0aGlzLnBhcmVudCk7XG4gICAgICAgIHRoaXMucGFnZUlucHV0LnZhbHVlID0gMTtcbiAgICAgICAgdGhpcy5zZW5kKCk7XG4gICAgfVxuXG4gICAgc2VuZCgpIHtcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy5kYXRhVG9TZW5kID0gJCh0aGlzLmZvcm0pLnNlcmlhbGl6ZSgpO1xuICAgICAgICBVdGlscy5zZW5kKHRoaXMuZGF0YVRvU2VuZCwgdGhpcy51cmwsIHtcbiAgICAgICAgICAgIHN1Y2Nlc3MocmVzcG9uZCkge1xuICAgICAgICAgICAgICAgIHJlc3BvbmQuZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgI
46184HRoYXQuaW5zZXJ0VGVtcGxhdGUoaXRlbSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhhdC5nZXRCbG9ja1Bvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbmQucmVxdWVzdC5pc0xhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5oaWRlQnRuKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5zaG93QnRuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1lZGlhdG9yLnB1Ymxpc2goJ3JlY2VpdmVkTmV3cycpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihg0L7RiNC40LHQutCwINC90LAg0YHQtdGA0LLQtdGA0LU6ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluc2VydFRlbXBsYXRlKGRhdGEpIHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBkYXRhLmltYWdlID8gaW1hZ2VUZW1wbGF0ZSA6IGJhc2ljVGVtcGxhdGU7XG5cbiAgICAgICAgdGhpcy5wYXJlbnQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCB0ZW1wbGF0ZShkYXRhKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0LLRi9GH0LjRgdC70Y/QtdGCINC/0L7Qt9C40YbQuNGOINCx0LvQvtC60LAg0L3QvtCy0L7RgdGC0LgsINC00L7QsdCw0LLQu9GP0Y8g0L3QtdC+0LHRhdC+0LTQuNC80YvQuSDQutC70LDRgdGBXG4gICAgICog0LTQu9GPINGB0LrRgNGL0YLQuNGPINCz0YDQsNC90LjRhlxuICAgICAqL1xuICAgIGdldEJsb2NrUG9zaXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGJsb2NrID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmItbmV3X19ibGFuaycpO1xuICAgICAgICBjb25zdCBwYXJlbnRQb3NpdGlvbiA9IHRoaXMucGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBsZWZ0TWluID0gMDtcbiAgICAgICAgY29uc3QgcmlnaHRNaW4gPSAtMTtcblxuICAgICAgICBibG9jay5mb3JFYWNoKChkaXYpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrUG9zaXRpb24gPSBkaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0RGlmZmVyZW5jZSA9IGJsb2NrUG9zaXRpb24ubGVmdCAtIHBhcmVudFBvc2l0aW9uLmxlZnQ7XG4gICAgICAgICAgICBjb25zdCByaWdodERpZmZlcmVuY2UgPSBibG9ja1Bvc2l0aW9uLnJpZ2h0IC0gcGFyZW50UG9zaXRpb24ucmlnaHQ7XG5cbiAgICAgICAgICAgIGlmIChsZWZ0RGlmZmVyZW5jZSA9PT0gbGVmdE1pbikge1xuICAgICAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCdpcy1sZWZ0Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKHJpZ2h0RGlmZmVyZW5jZSkgPj0gcmlnaHRNaW4pIHtcbiAgICAgICAgICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgnaXMtcmlnaHQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aCA8IHRhYmxldExhbmRzY2FwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveUJvcmRlcihkaXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkZXN0cm95Qm9yZGVyKGRpdikge1xuICAgICAgICBjb25zdCBib3JkZXJzID0gZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tjbGFzcyo9Ym9yZGVyXScpO1xuXG4gICAgICAgIGJvcmRlcnMuZm9yRWFjaCgoYm9yZGVyKSA9PiB7XG4gICAgICAgICAgICBVdGlscy5yZW1vdmVFbGVtZW50KGJvcmRlcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNob3dCdG4oKSB7XG4gICAgICAgIHRoaXMubW9yZUJ0bi5jbGFzc0xpc3QucmVtb3ZlKGhpZGRlbkNsYXNzKTtcbiAgICB9XG5cbiAgICBoaWRlQnRuKCkge1xuICAgICAgICB0aGlzLm1vcmVCdG4uY2xhc3NMaXN0LmFkZChoaWRkZW5DbGFzcyk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBOZXdzO1xuIiwiLyoqXG4gKiBAdmVyc2lvbiAxLjFiZXRhXG4gKiBAYXV0aG9yIEtlbG5payBTdHVkaW9zIHtodHRwOi8va2VsbmlrLnJ1fVxuICogQGxpbmsgaHR0cHM6Ly9rZWxuaWsuZ2l0Ym9va3MuaW8va2VsbmlrLWRvY3VtZW50YXRpb24vY29udGVudC9mcm9udC1lbmQvY29tcG9uZW50cy9wb3B1cC5odG1sIGRvY3VtZW50YXRpb25cbiAqL1xuXG4vKipcbiAqIERFUEVOREVOQ0lFU1xuICovXG5pbXBvcnQgTWVkaWF0b3IgZnJvbSAnY29tbW9uL3NjcmlwdHMvbWVkaWF0b3InO1xuaW1wb3J0IHRlbXBsYXRlIGZyb20gJ2NvbXBvbmVudHMvcG9wdXAvcG9wdXAudHdpZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnY29tbW9uL3NjcmlwdHMvdXRpbHMnO1xuXG5jb25zdCBtZWRpYXRvciA9IG5ldyBNZWRpYXRvcigpO1xuXG5jbGFzcyBQb3B1cCB7XG4gICAgaW5pdChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBvcHRpb25zLnRlbXBsYXRlIHx8IHRlbXBsYXRlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlQ29udGVudCA9IG9wdGlvbnMudGVtcGxhdGVDb250ZW50IHx8IGZhbHNlO1xuICAgICAgICB0aGlzLnRhcmdldCA9IG9wdGlvbnMudGFyZ2V0O1xuICAgICAgICB0aGlzLmNsb3NlQnV0dG9uQXJpYUxhYmVsID0gb3B0aW9ucy5jbG9zZUJ1dHRvbkFyaWFMYWJlbCB8fCAn0JfQsNC60YDRi9GC0Ywg0LLRgdC/0LvRi9Cy0LDRjtGJ0LXQtSDQvtC60L3Qvic7XG4gICAgICAgIHRoaXMuc3RhdGVDbGFzcyA9ICdiLXBvcHVwX3N0YXRlX29wZW4nO1xuICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktC10YjQsNC10Lwg0YHQu9GD0YjQsNGC0LXQu9C10Lkg0YHQvtCx0YvRgtC40LlcbiAgICAgKi9cbiAgICBiaW5kRXZlbnRzKCkge1xuICAgICAgICB0aGlzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMubWFrZU9wZW4uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbG9zZU9uUHJlc3NCdXR0b24oZWxlbWVudCk7XG4gICAgICAgI
46184H0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCR0LDQudC90LQg0YHQvtCx0YvRgtC40Lkg0L/QvtGB0LvQtSDRgdC+0LfQtNCw0L3QuNGPIHBvcHVwLlxuICAgICAqL1xuICAgIGJpbmRFdmVudHNBZnRlck9wZW4oKSB7XG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsb3NlLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLnBvcHVwLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VPbkNsaWNrT3ZlcmxheShlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JTQvtCx0LDQstC70Y/QtdGCIGJvZHkgcG9zaXRpb246Zml4ZWQsINC00LDQsdGLINC40LfQsdC10LbQsNGC0Ywg0L/RgNC+0LrRgNGD0YLQutC4INGB0YLRgNCw0L3QuNGG0Ysg0L/RgNC4INC+0YLQutGA0YvRgtC+0Lwg0L/QvtC/0LDQv9C1LlxuICAgICAqINCa0L7Qs9C00LAt0L3QuNCx0YPQtNGMINC/0LXRgNC10L3QtdGB0LXQvCDQsiBNZWRpYXRvci5cbiAgICAgKi9cbiAgICBmaXhlZEJvZHkoKSB7XG4gICAgICAgIHRoaXMuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdib2R5LWZpeGVkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JfQsNC/0YPRgdC6INC/0L7Qv9Cw0L/QsCDQv9GA0Lgg0LrQu9C40LrQtSDQvdCwINC60L3QvtC/0LrRgy5cbiAgICAgKi9cbiAgICBtYWtlT3BlbigpIHtcbiAgICAgICAgdGhpcy5jb250ZW50VHlwZUNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC+0LLQtdGA0LrQsCDRgtC40L/QsCDQv9C+0L/QsNC/0LAgLSDRgdGC0LDRgtC40LrQsC9hamF4LlxuICAgICAqL1xuICAgIGNvbnRlbnRUeXBlQ2hlY2soKSB7XG4gICAgICAgIGNvbnN0IGRhdGFBdHRyaWJ1dGVIcmVmID0gdGhpcy50YXJnZXQuZGF0YXNldC5ocmVmO1xuICAgICAgICBjb25zdCBkYXRhQXR0cmlidXRlQWpheCA9IHRoaXMudGFyZ2V0LmRhdGFzZXQuYWpheDtcbiAgICAgICAgY29uc3QgZGF0YUF0dHJpYnV0ZUFqYXhEYXRhID0gJC5wYXJhbSh0aGlzLnRhcmdldC5kYXRhc2V0KTtcblxuICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLnRhcmdldC5kYXRhc2V0LnR5cGUgfHwgJ2RlZmF1bHQnO1xuXG4gICAgICAgIGlmIChkYXRhQXR0cmlidXRlSHJlZikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudElkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGF0YUF0dHJpYnV0ZUhyZWYpO1xuXG4gICAgICAgICAgICBpZiAoIWNvbnRlbnRJZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYNCh0L7Qt9C00LDQuSDQutC+0L3RgtC10L3RgtC90YvQuSDQsdC70L7QuiDQv9C+0L/QsNC/0LAg0YEgaWQgXCIke2RhdGFBdHRyaWJ1dGVIcmVmfVwiYCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHN0YXRpY0NvbnRlbnQgPSBjb250ZW50SWQuaW5uZXJIVE1MO1xuXG4gICAgICAgICAgICB0aGlzLm91dHB1dE9uRGlzcGxheShzdGF0aWNDb250ZW50KTtcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGFBdHRyaWJ1dGVBamF4KSB7XG4gICAgICAgICAgICB0aGlzLm91dHB1dE9uRGlzcGxheSgpO1xuICAgICAgICAgICAgdGhpcy5zZW5kKGRhdGFBdHRyaWJ1dGVBamF4RGF0YSwgdGhpcy5vcGVuLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLRi9Cy0L7QtCDQv9C+0L/QsNC/0LAg0L3QsCDRjdC60YDQsNC9LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50IC0g0LrQvtC90YLQtdC90YIg0LjQtyDRgdGC0LDRgtC40LrQuCDQuNC70Lgg0LjQtyBqc29uLlxuICAgICAqL1xuICAgIG91dHB1dE9uRGlzcGxheShjb250ZW50KSB7XG4gICAgICAgIHRoaXMuc2V0RGF0YShjb250ZW50KTtcbiAgICAgICAgdGhpcy5pbnNlcnRUZW1wbGF0ZSgpO1xuICAgICAgICB0aGlzLmdldEVsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/QvtC00LPQvtGC0L7QstC60LAg0LTQsNC90L3Ri9GFINC00LvRjyDRiNCw0LHQu9C+0L3QsFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50IC0g0LrQvtC90YLQtdC90YIg0LjQtyDRgdGC0LDRgtC40LrQuCDQuNC70Lgg0LjQtyBqc29uLlxuICAgICAqL1xuICAgIHNldERhdGEoY29udGVudCkge1xuICAgICAgICB0aGlzLmRhdGEgPSB7XG4gICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgYnV0dG9uQXJpYUxhYmVsOiB0aGlzLmNsb3NlQnV0dG9uQXJpYUxhYmVsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLRgdGC0LDQstC60LAg0YjQsNCx0LvQvtC90LAuXG4gICAgICovXG4gICAgaW5zZXJ0VGVtcGxhdGUoKSB7XG4gICAgICAgIHRoaXMuYm9keS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLCB0aGlzLnRlbXBsYXRlKHRoaXMuZGF0YSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0L7Qu9GD0YfQsNC10Lwg0L/QvtC/0LDQvyDQuCDQtdCz0L4g0Y3Qu9C10LzQtdC90YLRiywg0LLQtdGI0LDQtdC8INGB0L7QsdGL0YLQuNGPLlxuICAgICAqL1xuICAgIGdldEVsZW1lbnRzKCkge1xuICAgICAgICB0aGlzLnBvcHVwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmItcG9wdXAnKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmItcG9wdXBfX2NvbnRlbnQnKTtcbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbiA9IHRoaXMucG9wdXAucXVlcnlTZWxlY3RvcignLmItcG9wdXBfX2Nsb3NlJyk7XG4gICAgICAgIHRoaXMub3ZlcmxheSA9IHRoaXMucG9wdXAucXVlcnlTZWxlY3RvcignLmItcG9wdXBfX292ZXJsYXknKTtcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzQWZ0ZXJPcGVuKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLRgdGC0LDQstC60LAg0LrQvtC90YLQtdC90YLQsFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwb3B1cCAtINGN0LvQtdC80LXQvdGCLCDQutGD0LTQsCDQstGB0YLQsNCy0LvRj9C10YLRgdGPINC60L7QvdGC0LXQvdGCLiAo0L3QtSDRgdCw0Lwg0L/QvtC/0LDQvywg0LAg0LXQs9C+INC60L7QvdGC0LXQvdGC0L3QsNGPINGH0LDRgdGC0YwhKVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50IC0g0LLRgdGC0LDQstC70Y/QtdC80YvQuSDQutC+0L3RgtC10L3Rgi5cbiAgICAgKi9cbiAgICBzdGF0aWMgaW5zZXRDb250ZW50KHBvcHVwLCBjb250ZW50KSB7XG4gICAgICAgIFV0aWxzLmNsZWFySHRtbChwb3B1cCk7XG4gICAgICAgIFV0aWxzLmluc2V0Q29udGVudChwb3B1cCwgY29udGVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JzQtdGC0L7QtCDQvtGC0L/RgNCw0LLQutC4IGFqYXgg0LfQsNC/0YDQvtGB0LBcbiAgICAgKiBAcGFyYW0ge09
46184iamVjdH0gc2VudERhdGEgLSDQvtGC0L/RgNCw0LLQu9GP0LXQvNGL0LUg0LTQsNC90L3Ri9C1LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBsZXRlIC0g0YTRg9C90LrRhtC40Y8g0L7RgtC60YDRi9GC0LjRjyDQv9C+0L/QsNC/0LBcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSAtIGZhbHNlIC0g0LXRgdC70Lgg0L3QtdGCINC40L3RgtC10YDQvdC10YLQsCwg0LfQsNC/0YDQvtGBINC/0YDQtdGA0YvQstCw0LXRgtGB0Y8uXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gLSB0cnVlIC0g0YPRgdC/0LXRiNC90L7QtSDQstGL0L/QvtC70L3QtdC90LjQtSDQt9Cw0L/RgNC+0YHQsC5cbiAgICAgKi9cbiAgICBzZW5kKHNlbnREYXRhLCBjb21wbGV0ZSA9IGZ1bmN0aW9uKCkge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrSW50ZXJuZXQoKSkge1xuICAgICAgICAgICAgdGhpcy5yZXNlbmRpbmcoc2VudERhdGEpO1xuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy50YXJnZXQuZGF0YXNldC5hamF4O1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IHtcbiAgICAgICAgICAgIHN1Y2Nlc3MocmVxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcS5yZXF1ZXN0LnJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC50ZW1wbGF0ZUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFBvcHVwLmluc2V0Q29udGVudCh0aGF0LmNvbnRlbnQsIHRoYXQudGVtcGxhdGVDb250ZW50KHJlcS5kYXRhKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBQb3B1cC5pbnNldENvbnRlbnQodGhhdC5jb250ZW50LCByZXEuZGF0YS5jb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5lcnJvckhhbmRsZXIoJ2RhdGEnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZXEucmVx
46184dWVzdC5lcnJvcnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGVycm9yKGVycikge1xuICAgICAgICAgICAgICAgIHRoYXQuZXJyb3JIYW5kbGVyKCdzZXJ2ZXInKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBzZXJ2ZXIgZXJyb3IgJHtlcnJ9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgVXRpbHMuc2VuZChzZW50RGF0YSwgdXJsLCBjYWxsYmFjayk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JzQtdGC0L7QtCDQt9Cw0LrRgNGL0YLQuNGPINC/0L7Qv9Cw0L/QsCDQv9C+INC60LvQuNC60YMg0L3QsCDQvtCy0LXRgNC70LXQuS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCAtINGN0LvQtdC80LXQvdGCINC/0L4g0LrQvtGC0L7RgNC+0LzRgyDQv9GA0L7QuNC30L7RiNC70L4g0YHQvtCx0YvRgtC40LUuIEPQvC4g0LzQtdGC0L7QtCBiaW5kRXZlbnRzQWZ0ZXJPcGVuXG4gICAgICovXG4gICAgY2xvc2VPbkNsaWNrT3ZlcmxheShlbGVtZW50KSB7XG4gICAgICAgIGlmIChlbGVtZW50LnRhcmdldCA9PT0gdGhpcy5vdmVybGF5KSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQnNC10YLQvtC0INC30LDQutGA0YvRgtC40Y8g0L/QvtC/0LDQv9CwINC/0L4g0L3QsNC20LDRgtC40Y4g0L3QsCBFU0NcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCAtINGN0LvQtdC80LXQvdGCINC/0L4g0LrQvtGC0L7RgNC+0LzRgyDQv9GA0L7QuNC30L7RiNC70L4g0YHQvtCx0YvRgtC40LUuIEPQvC4g0LzQtdGC0L7QtCBiaW5kRXZlbnRzXG4gICAgICovXG4gICAgY2xvc2VPblByZXNzQnV0dG9uKGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3Qga2V5Q29kZUVTQyA9IDI3O1xuXG4gICAgICAgIGlmIChlbGVtZW50LmtleUNvZGUgPT09IGtleUNvZGVFU0MpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCc0LXRgtC+0LQg0L7RgtC60YDRi9Cy0LDQtdGCINC/0L7Qv9Cw0L9cbiAgICAgKi9cbiAgICBvcGVuKCkge1xuICAgICAgICB0aGlzLnBvcHVwLmNsYXNzTGlzdC5hZGQodGhpcy5zdGF0ZUNsYXNzKTtcbiAgICAgICAgdGhpcy5maXhlZEJvZHkoKTtcblxuICAgICAgICBtZWRpYXRvci5wdWJsaXNoKCdvcGVuUG9wdXAnLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQnNC10YLQvtC0INC30LDQutGA0YvQstCw0LXRgiDQv9C+0L/QsNC/XG4gICAgICovXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMucG9wdXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLnN0YXRlQ2xhc3MpO1xuICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLmZpeGVkQm9keSgpO1xuXG4gICAgICAgIG1lZGlhdG9yLnB1Ymxpc2goJ2Nsb3NlUG9wdXAnLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9C00LDQu9C10L3QuNC1INC/0L7Qv9Cw0L/QsCDRgdC+INGB0YLRgNCw0L3QuNGG0YsuXG4gICAgICovXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICBVdGlscy5yZW1vdmVFbGVtZW50KHRoaXMucG9wdXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCc0LXRgtC+0LQg0L7QsdGA0LDQsdC+0YLQutC4INC+0YjQuNCx0L7Qui5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZUVycm9yIC0g0YLQuNC/INC+0YjQuNCx0LrQuC5cbiAgICAgKi9cbiAgICBlcnJvckhhbmRsZXIodHlwZUVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTGlzdCA9IFt7XG4gICAgICAgICAgICB0eXBlOiAnaW50ZXJuZXQnLFxuICAgICAgICAgICAgaHRtbDogJzxoMT7QktGLINC90LUg0L/QvtC00LrQu9GO0YfQtdC90Ysg0Log0LjQvdGC0LXRgNC90LXRgtGDLiDQn9C+0LLRgtC+0YDQuNGC0LUg0LfQsNC/0YDQvtGBINC/0L7Qt9C00L3QtdC1PC9oMT4nXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHR5cGU6ICdzZXJ2ZXInLFxuICAgICAgICAgICAgaHRtbDogJzxoMT7QndCwINGB0LXRgNCy0LXRgNC1INC/0YDQvtC40LfQvtGI0LvQsCDQvtGI0LjQsdC60LAuINCf0L7QstGC0L7RgNC40YLQtSDQt9Cw0L/RgNC+0YEg0L/QvtC30LTQvdC10LU8L2gxPidcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgdHlwZTogJ2RhdGEnLFxuICAgICAgICAgICAgaHRtbDogJzxoMT7QndCwINGB0LXRgNCy0LXRgNC1INC/0YDQvtC40LfQvtGI0LvQsCDQvtGI0LjQsdC60LAuINCf0L7QstGC0L7RgNC40YLQtSDQt9Cw0L/RgNC+0YEg0L/QvtC30LTQvdC10LU8L2gxPidcbiAgICAgICAgfV07XG5cbiAgICAgICAgZXJyb3JMaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlRXJyb3IgPT09IGl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICAgIFBvcHVwLmluc2V0Q29udGVudCh0aGlzLmNvbnRlbnQsIGl0ZW0uaHRtbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0YDQvtCy0LXRgNC60LAg0L3QsCDQvdCw0LvQuNGH0LjQtSDQuNC90YLQtdGA0L3QtdGC0LAuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSAtINC40L3RgtC10YDQvdC10YIg0LXRgdGC0YwuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gZmFsc2UgLSDQuNC90YLQtdGA0L3QtdGCYSDQvdC10YIuXG4gICAgICovXG4gICAgY2hlY2tJbnRlcm5ldCgpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnNldEludGVydmFsKTtcbiAgICAgICAgaWYgKCFVdGlscy5jaGVja0ludGVybmV0Q29ubmVjdGlvbigpKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9ySGFuZGxlcignaW50ZXJuZXQnKTtcblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/QvtCy0YLQvtGA0L3Ri9C5INC30LDQv9GA0L7RgSDQvdCwINGB0LXRgNCy0LXRgC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gc2VudERhdGEgLSDQvtGC0YDQv9GA0LDQstC70Y/QtdC80YvQtS
46184DQtNCw0L3QvdGL0LUuXG4gICAgICpcbiAgICAgKi9cbiAgICByZXNlbmRpbmcoc2VudERhdGEpIHtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSA1MDAwO1xuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcblxuICAgICAgICB0aGlzLnNldEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgdGhhdC5zZW5kKHNlbnREYXRhKTtcbiAgICAgICAgfSwgaW50ZXJ2YWwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUG9wdXA7XG4iLCJ2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCJjZTgxNWEyMGIyZGM4ZmQyNzA2NDgyYmE3MWI1NzA5YzQ5ZTJkMjNiNjNjMjZiOTRjOGQwYTViNWNlNGVjNWQwZDViNzcxMTQ4YmNkOTY3NmQwN2MwODYxM2NiNWVjYzM1YzZmMzMwNGY1MDJiOTIzZjczZmVhZjIzYmUxMzAyNFwiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8ZGl2IGNsYXNzPVxcXCJiLXBvcHVwXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYi1wb3B1cF9fb3ZlcmxheVxcXCI+PC9kaXY+XFxuXFxuICAgIDxkaXYgY2xhc3M9XFxcImItcG9wdXBfX2lubGluZS13cmFwXFxcIj5cXG4gICAgICAgIDxidXR0b24gY2xhc3M9XFxcImItcG9wdXBfX2Nsb3NlXFxcIlxcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVxcXCJcIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcImJ1dHRvbkFyaWFMYWJlbFwiLFwibWF0Y2hcIjpbXCJidXR0b25BcmlhTGFiZWxcIl19LHtcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLmZpbHRlclwiLFwidmFsdWVcIjpcImRlZmF1bHRcIixcIm1hdGNoXCI6W1wifGRlZmF1bHRcIixcImRlZmF1bHRcIl0sXCJwYXJhbXNcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLnN0YXJ0XCIsXCJ2YWx1ZVwiOlwiKFwiLFwibWF0Y2hcIjpbXCIoXCJdfSx7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS5zdHJpbmdcIixcInZhbHVlXCI6XCLQl9Cw0LrRgNGL0YLRjCDQstGB0L/Qu9GL0LLQsNGO0YnQtdC1INC+0LrQvdC+XCJ9LHtcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5lbmRcIixcInZhbHVlXCI6XCIpXCIsXCJtYXRjaFwiOltcIilcIl0sXCJleHByZXNzaW9uXCI6ZmFsc2V9XX1dfSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCJcXFwiPlxcbiAgICAgICAgICAgIFwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLl9mdW5jdGlvblwiLFwiZm5cIjpcInNvdXJjZVwiLFwicGFyYW1zXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydFwiLFwidmFsdWVcIjpcIihcIixcIm1hdGNoXCI6W1wiKFwiXX0se1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUuc3RyaW5nXCIsXCJ2YWx1ZVwiOlwiL2ljb25zL3BvcHVwL21lZGlhL2Nsb3NlLnN2Z1wifSx7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS5wYXJhbWV0ZXIuZW5kXCIsXCJ2YWx1ZVwiOlwiKVwiLFwibWF0Y2hcIjpbXCIpXCJdLFwiZXhwcmVzc2lvblwiOmZhbHNlfV19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxuICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImItcG9wdXBfX2lubGluZS1jb250ZW50XFxcIj5cXG4gICAgICAgICAgICBcIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcImNvbnRlbnRcIixcIm1hdGNoXCI6W1wiY29udGVudFwiXX1dfSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCJcXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG5cIn1dLFwiYWxsb3dJbmxpbmVJbmNsdWRlc1wiOnRydWUsXCJyZXRocm93XCI6dHJ1ZX0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGNvbnRleHQpIHsgcmV0dXJuIHRlbXBsYXRlLnJlbmRlcihjb250ZXh0KTsgfSIsInJlcXVpcmUoXCIuL21lZGlhL2Nsb3NlLnN2Zy50d2lnXCIpO1xuXG52YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCIyOThkODE5ZmEyYzk2YWQwNTRiZjE1NjRiYTYxMjU2MGNmODYzZDJhYWVlNGEwZTQ2ZWNlNzVlNzk3NGE4NTZhNjljOWYzMGYwOGMyMTE1OGJiZWU1YTY3Y2RhNjJhYjE5NThiM2FjOTJiN2JmMGZiNjU3ZDJmMjlmYTY0ZDE2YVwiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8ZGl2IGNsYXNzPVxcXCJiLXBvcHVwIGItcG9wdXBfZm9yX21hcFxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImItcG9wdXBfX292ZXJsYXlcXFwiPjwvZGl2PlxcblxcbiAgICA8ZGl2IGNsYXNzPVxcXCJiLXBvcHVwX19pbmxpbmUtd3JhcFxcXCI+XFxuICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJiLXBvcHVwX19jbG9zZVxcXCJcXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cXFwiXCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJidXR0b25BcmlhTGFiZWxcIixcIm1hdGNoXCI6W1wiYnV0dG9uQXJpYUxhYmVsXCJdfSx7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS5maWx0ZXJcIixcInZhbHVlXCI6XCJkZWZhdWx0XCIsXCJtYXRjaFwiOltcInxkZWZhdWx0XCIsXCJkZWZhdWx0XCJdLFwicGFyYW1zXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydFwiLFwidmFsdWVcIjpcIihcIixcIm1hdGNoXCI6W1wiKFwiXX0se1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUuc3RyaW5nXCIsXCJ2YWx1ZVwiOlwi0JfQsNC60YDRi9GC0Ywg0LLRgdC/0LvRi9Cy0LDRjtGJ0LXQtSDQvtC60L3QvlwifSx7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS5wYXJhbWV0ZXIuZW5kXCIsXCJ2YWx1ZVwiOlwiKVwiLFwibWF0Y2hcIjpbXCIpXCJdLFwiZXhwcmVzc2lvblwiOmZhbHNlfV19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxcIj5cXG4gICAgICAgICAgICBcIn0se1widHlwZVwiOlwibG9naWNcIixcInRva2VuXCI6e1widHlwZVwiOlwiVHdpZy5sb2dpYy50eXBlLmluY2x1ZGVcIixcIm9ubHlcIjpmYWxzZSxcImlnbm9yZU1pc3NpbmdcIjpmYWxzZSxcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnN0cmluZ1wiLFwidmFsdWVcIjpcImFlODlmZjkyNjE3MzkxMTNkOTRiZjcyNDZhY2YxMWU1ODEyMzY0YjljYTJiMDZhNDcwYjY0NmE4N2M2YzY3ODNiZmYyM2FmYWVlOTZhN2FmODk4NTQxZGJkYjgyNmZmYzY5Y2NjODdmNDc0MzJmYThjNzRlMjViNjNjZmNjYjM2XCJ9XX19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIiAgICAgICAgPC9idXR0b24+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJiLXBvcHVwX19pbmxpbmUtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgXCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJjb250ZW50XCIsXCJtYXRjaFwiOltcImNvbnRlbn
46184RcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuXCJ9XSxcImFsbG93SW5saW5lSW5jbHVkZXNcIjp0cnVlLFwicmV0aHJvd1wiOnRydWV9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb250ZXh0KSB7IHJldHVybiB0ZW1wbGF0ZS5yZW5kZXIoY29udGV4dCk7IH0iLCJ2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCJhZTg5ZmY5MjYxNzM5MTEzZDk0YmY3MjQ2YWNmMTFlNTgxMjM2NGI5Y2EyYjA2YTQ3MGI2NDZhODdjNmM2NzgzYmZmMjNhZmFlZTk2YTdhZjg5ODU0MWRiZGI4MjZmZmM2OWNjYzg3ZjQ3NDMyZmE4Yzc0ZTI1YjYzY2ZjY2IzNlwiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8c3ZnIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgeG1sbnM6eGxpbms9XFxcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcXFwiIHdpZHRoPVxcXCIyNlxcXCIgaGVpZ2h0PVxcXCIyNlxcXCIgdmlld0JveD1cXFwiMCAwIDI2IDI2XFxcIj48ZGVmcz48cGF0aCBpZD1cXFwiNzNodGFcXFwiIGQ9XFxcIk0xMDUxLjQ0NCA3M0wxMDUwIDcxLjU1NiAxMDYxLjU1NiA2MCAxMDUwIDQ4LjQ0NGwxLjQ0NC0xLjQ0NEwxMDYzIDU4LjU1NiAxMDc0LjU1NiA0N2wxLjQ0NCAxLjQ0NEwxMDY0LjQ0NCA2MCAxMDc2IDcxLjU1NiAxMDc0LjU1NiA3MyAxMDYzIDYxLjQ0NHpcXFwiLz48L2RlZnM+PGc+PGcgdHJhbnNmb3JtPVxcXCJ0cmFuc2xhdGUoLTEwNTAgLTQ3KVxcXCI+PHVzZSB4bGluazpocmVmPVxcXCIjNzNodGFcXFwiLz48L2c+PC9nPjwvc3ZnPlxcblwifV0sXCJhbGxvd0lubGluZUluY2x1ZGVzXCI6dHJ1ZSxcInJldGhyb3dcIjp0cnVlfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oY29udGV4dCkgeyByZXR1cm4gdGVtcGxhdGUucmVuZGVyKGNvbnRleHQpOyB9IiwidmFyIHR3aWcgPSByZXF1aXJlKFwidHdpZ1wiKS50d2lnLFxuICAgIHRlbXBsYXRlID0gdHdpZyh7XCJpZFwiOlwiMTBmNzVkMzJkMDYzMDc5NDE0YTlkOTEyYTVkYzcwZjRhNDNhYTYzNWIxMzVhYTBjMDBjMzRlZGM1YmFkNzVlZDJkODlmNTM5ZTVkYmQ1MzNmYTM1MjMwYmU0ZTFmNjcwMmZmZjgwYTBjYTUzZWRkYmMyNzdjYTFmN2EwN2ZkMzVcIixcImRhdGFcIjpbe1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiPGRpdiBjbGFzcz1cXFwiYi1wb3B1cFxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImItcG9wdXBfX292ZXJsYXlcXFwiPjwvZGl2PlxcblxcbiAgICA8YnV0dG9uIGNsYXNzPVxcXCJiLXBvcHVwX19jbG9zZVxcXCIgYXJpYS1sYWJlbD1cXFwiXCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJidXR0b25BcmlhTGFiZWxcIixcIm1hdGNoXCI6W1wiYnV0dG9uQXJpYUxhYmVsXCJdfSx7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS5maWx0ZXJcIixcInZhbHVlXCI6XCJkZWZhdWx0XCIsXCJtYXRjaFwiOltcInxkZWZhdWx0XCIsXCJkZWZhdWx0XCJdLFwicGFyYW1zXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydFwiLFwidmFsdWVcIjpcIihcIixcIm1hdGNoXCI6W1wiKFwiXX0se1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUuc3RyaW5nXCIsXCJ2YWx1ZVwiOlwi0JfQsNC60YDRi9GC0Ywg0LLRgdC/0LvRi9Cy0LDRjtGJ0LXQtSDQvtC60L3QvlwifSx7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS5wYXJhbWV0ZXIuZW5kXCIsXCJ2YWx1ZVwiOlwiKVwiLFwibWF0Y2hcIjpbXCIpXCJdLFwiZXhwcmVzc2lvblwiOmZhbHNlfV19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxcIj5cXG4gICAgICAgIFwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLl9mdW5jdGlvblwiLFwiZm5cIjpcInNvdXJjZVwiLFwicGFyYW1zXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnBhcmFtZXRlci5zdGFydFwiLFwidmFsdWVcIjpcIihcIixcIm1hdGNoXCI6W1wiKFwiXX0se1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUuc3RyaW5nXCIsXCJ2YWx1ZVwiOlwiL2ltYWdlcy9wb3B1cC9jbG9zZS5zdmdcIn0se1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUucGFyYW1ldGVyLmVuZFwiLFwidmFsdWVcIjpcIilcIixcIm1hdGNoXCI6W1wiKVwiXSxcImV4cHJlc3Npb25cIjpmYWxzZX1dfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIlxcbiAgICA8L2J1dHRvbj5cXG5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYi1wb3B1cF9fd3JhcFxcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJiLXBvcHVwX19jb250ZW50XFxcIj5cXG4gICAgICAgICAgICBcIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcImNvbnRlbnRcIixcIm1hdGNoXCI6W1wiY29udGVudFwiXX1dfSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCJcXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG5cIn1dLFwiYWxsb3dJbmxpbmVJbmNsdWRlc1wiOnRydWUsXCJyZXRocm93XCI6dHJ1ZX0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGNvbnRleHQpIHsgcmV0dXJuIHRlbXBsYXRlLnJlbmRlcihjb250ZXh0KTsgfSIsImltcG9ydCBVdGlscyBmcm9tICcuLi8uLi9jb21tb24vc2NyaXB0cy91dGlscyc7XG5cbmNsYXNzIFByZWxvYWRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucHJlbG9hZGVyU2VsZWN0b3IgPSAnLmotcHJlbG9hZGVyJztcbiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IDMwMDtcbiAgICB9XG5cbiAgICBpbml0KCkge1xuICAgICAgICB0aGlzLl9pbml0RWxlbWVudHMoKTtcblxuICAgICAgICBpZiAoIXRoaXMucHJlbG9hZGVyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBQcmVsb2FkZXIgJyR7dGhpcy5wcmVsb2FkZXJTZWxlY3Rvcn0nIG5vdCBmb3VuZGApO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgI
46184H1cblxuICAgICAgICBpZiAodGhpcy5faXNOb3RGaXJzdExvYWQoKSkge1xuICAgICAgICAgICAgdGhpcy5faGlkZVByZWxvYWRlcigpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9iaW5kRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgX2luaXRFbGVtZW50cygpIHtcbiAgICAgICAgdGhpcy5wcmVsb2FkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMucHJlbG9hZGVyU2VsZWN0b3IpO1xuICAgIH1cblxuICAgIF9iaW5kRXZlbnRzKCkge1xuICAgICAgICB3aW5kb3cub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc2F2ZUluU3RvcmUoKTtcbiAgICAgICAgICAgIHRoaXMuX2hpZGVQcmVsb2FkZXIoKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBfaXNOb3RGaXJzdExvYWQoKSB7XG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGFnZUxvYWRlZCcpID09PSAndHJ1ZSc7XG4gICAgfVxuXG4gICAgX2hpZGVQcmVsb2FkZXIoKSB7XG4gICAgICAgIHRoaXMucHJlbG9hZGVyLmNsYXNzTGlzdC5hZGQoJ2lzLWhpZGUnKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIFV0aWxzLmhpZGUodGhpcy5wcmVsb2FkZXIpO1xuICAgICAgICB9LCB0aGlzLmR1cmF0aW9uKTtcbiAgICB9XG5cbiAgICBfc2F2ZUluU3RvcmUoKSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdwYWdlTG9hZGVkJywgJ3RydWUnKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFByZWxvYWRlcjtcblxuIiwiLyoqXG4gKiBAdmVyc2lvbiAyLjBhbHBoYVxuICogQGF1dGhvciBLZWxuaWsgU3R1ZGlvcyB7aHR0cDovL2tlbG5pay5ydX1cbiAqIEBsaW5rIGh0dHBzOi8va2VsbmlrLmdpdGJvb2tzLmlvL2tlbG5pay1kb2N1bWVudGF0aW9uL2NvbnRlbnQvZnJvbnQtZW5kL2NvbXBvbmVudHMv0L/QvtC60LAg0L3QtdGCIGRvY3VtZW50YXRpb25cbiAqL1xuXG4vKipcbiAqIERFUEVOREVOQ0lFU1xuICovXG5cbi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgTWVkaWF0b3IgZnJvbSAnY29tbW9uL3NjcmlwdHMvbWVkaWF0b3InO1xuaW1wb3J0IEhhbW1lciBmcm9tICdoYW1tZXJqcyc7XG5pbXBvcnQgc2xpZGVyVGVtcGxhdGUgZnJvbSAnLi9zbGlkZXIudHdpZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnY29tbW9uL3NjcmlwdHMvdXRpbHMnO1xuXG5jb25zdCBtZWRpYXRvciA9IG5ldyBNZWRpYXRvcigpO1xuXG5jbGFzcyBTbGlkZXIge1xuICAgIC8qKlxuICAgICAqINCY0L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPINC/0LDRgNCw0LzQtdGC0YDQvtCyXG4gICAgICovXG4gICAgaW5pdChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZ2FsbGVyeSA9IG9wdGlvbnMudGFyZ2V0O1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25UaW1lID0gb3B0aW9ucy50cmFuc2l0aW9uVGltZSB8fCAzMDA7XG4gICAgICAgIHRoaXMuaW5maW5pdGUgPSBvcHRpb25zLmluZmluaXRlIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLmF1dG9wbGF5ID0gb3B0aW9ucy5hdXRvcGxheSB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5hdXRvcGxheVR1cm4gPSAncmlnaHQnO1xuICAgICAgICB0aGlzLmF1dG9wbGF5U3BlZWQgPSBvcHRpb25zLmF1dG9wbGF5U3BlZWQgfHwgMzAwMDtcbiAgICAgICAgdGhpcy5kb3RzID0gb3B0aW9ucy5kb3RzIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLmNoaWxkcmVucyA9IEFycmF5LmZyb20odGhpcy5nYWxsZXJ5LmNoaWxkcmVuKTtcbiAgICAgICAgdGhpcy5pdGVtc0NvdW50ID0gdGhpcy5jaGlsZHJlbnMubGVuZ3RoO1xuICAgICAgICB0aGlzLmFjdGl2ZVNsaWRlID0gMTtcbiAgICAgICAgdGhpcy53aWR0aCA9IDA7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSAwO1xuICAgICAgICB0aGlzLmZsZXhIZWlnaHQgPSBmYWxzZTtcblxuICAgICAgICAvLyBVdGlscy5jbGVhckh0bWwodGhpcy5nYWxsZXJ5KTsgLy/Qv9C+0YfQtdC80YMg0YLQviDQsiBJRSDQvtGH0LjRidCw0LXRgiAtIHRoaXMuY2hpbGRyZW5zXG5cbiAgICAgICAgdGhpcy5jcmVhdGVHYWxsZXJ5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JPQu9Cw0LLQvdGL0Lkg0LzQtdGC0L7QtC4g0KHQvtC30LTQsNC10YIg0LLQtdGB0Ywg0YHQu9Cw0LnQtNC10YAuXG4gICAgICovXG4gICAgY3JlYXRlR2FsbGVyeSgpIHtcbiAgICAgICAgVXRpbHMuaW5zZXRDb250ZW50KHRoaXMuZ2FsbGVyeSwgc2xpZGVyVGVtcGxhdGUoKSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmdhbGxlcnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ9Ci0LDQutC+0LPQviDQutC+0L3RgtC10LnQvdC10YDQsCDQtNC70Y8g0YHQu9Cw0LnQtNC10YDQsCDQvdC1INGB0YPRidC10YHRgtCy0YPQtdGCIScpO1xuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdldEVsZW1lbnRzKCk7XG4gICAgICAgIGlmICh0aGlzLmRvdHMpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRG90cygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xuICAgICAgICB0aGlzLmFwcGVuZENoaWxkcygpO1xuICAgICAgICB0aGlzLnNldEhlaWdodCgpO1xuICAgICAgICB0aGlzLmRvdEFjdGl2YXRlKCk7XG4gICAgICAgIHRoaXMucmVhZHkoKTtcbiAgICAgICAgdGhpcy5hdXRvcGxheVN0YXJ0KCk7XG4gICAgICAgIHRoaXMuY3JlYXRlQ291bnRlcigpO1xuICAgICAgICB0aGlzLnN3aXBlRmFjdG9pZHMoKTtcblxuICAgICAgICBpZiAodGhpcy5pdGVtc0NvdW50ID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBjb3VudGVyID0gdGhpcy5nYWxsZXJ5LnF1ZXJ5U2VsZWN0b3IoJy5iLXNsaWRlcl9fY291bnRlcicpO1xuICAgICAgICAgICAgY29uc3QgYXJyb3dzID0gdGhpcy5nYWxsZXJ5LnF1ZXJ5U2VsZWN0b3IoJy5iLXNsaWRlcl9fYXJyb3dzJyk7XG5cbiAgICAgICAgICAgIGNvdW50ZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIGFycm93cy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZ2FsbGVyeS5jbGFzc0xpc3QuY29udGFpbnMoJ2ItcHJpbmNpcGUtY2Fyb3VzZWwtdmlldy0yJykpIHtcbiAgICAgICAgICAgIC8vINGDINGN0YLQvtCz0L4g0YHQu9Cw0LnQtNC10YDQsCDQvtGB0L7QsdC+0LUg0L/QvtC70L7QttC10L3QuNC1INGB0YLRgNC10LvQvtC6XG4gICAgICAgICAgICB0aGlzLnNldEFycm93c0N1c3RvbVBvc2l0aW9uKCk7XG4gICAgICAgI
46184H1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9C+0LvRg9GH0LDQtdC8INGN0LvQtdC80LXQvdGC0Ysg0YHQu9Cw0LnQtNC10YDQsC5cbiAgICAgKi9cbiAgICBnZXRFbGVtZW50cygpIHtcbiAgICAgICAgdGhpcy5kb3RzV3JhcHBlciA9IHRoaXMuZ2FsbGVyeS5xdWVyeVNlbGVjdG9yKCcuYi1zbGlkZXJfX2RvdHMnKTtcbiAgICAgICAgdGhpcy53cmFwcGVyID0gdGhpcy5nYWxsZXJ5LnF1ZXJ5U2VsZWN0b3IoJy5iLXNsaWRlcl9fd3JhcHBlcicpO1xuICAgICAgICB0aGlzLmFycm93TGVmdCA9IHRoaXMuZ2FsbGVyeS5xdWVyeVNlbGVjdG9yKCcuc2xpZGVyX19hcnJvdy1sZWZ0Jyk7XG4gICAgICAgIHRoaXMuYXJyb3dSaWdodCA9IHRoaXMuZ2FsbGVyeS5xdWVyeVNlbGVjdG9yKCcuc2xpZGVyX19hcnJvdy1yaWdodCcpO1xuICAgICAgICB0aGlzLmNvdW50QWN0aXZlID0gdGhpcy5nYWxsZXJ5LnF1ZXJ5U2VsZWN0b3IoJy5iLXNsaWRlcl9fY291bnRlci1hY3RpdmUnKTtcbiAgICAgICAgdGhpcy5jb3VudEFsbCA9IHRoaXMuZ2FsbGVyeS5xdWVyeVNlbGVjdG9yKCcuYi1zbGlkZXJfX2NvdW50ZXItYWxsJyk7XG4gICAgfVxuXG4gICAgc3dpcGVGYWN0b2lkcygpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5nYWxsZXJ5LmNsb3Nlc3QoJy5qLW1haW4tc2xpZGVyJyk7XG5cbiAgICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmFjdG9pZHNXcmFwcGVyID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5qLWZhY3RvaWRzLXdyYXBwZXInKTtcblxuXG4gICAgICAgIGNvbnN0IHRvdWNoRXZlbnQgPSBuZXcgSGFtbWVyKHRoaXMuZmFjdG9pZHNXcmFwcGVyKTtcblxuICAgICAgICB0b3VjaEV2ZW50Lm9uKCdzd2lwZXJpZ2h0JywgdGhpcy5pc1NsaWRlTGVmdC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdG91Y2hFdmVudC5vbignc3dpcGVsZWZ0JywgdGhpcy5pc1NsaWRlUmlnaHQuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgY3JlYXRlQ291bnRlcigpIHtcbiAgICAgICAgdGhpcy5jb3VudEFjdGl2ZS5pbm5lckhUTUwgPSB0aGlzLm51bWJlckZvcm1hdCh0aGlzLmFjdGl2ZVNsaWRlKTtcbiAgICAgICAgdGhpcy5jb3VudEFsbC5pbm5lckhUTUwgPSB0aGlzLm51bWJlckZvcm1hdCh0aGlzLml0ZW1zQ291bnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINGH0LjRgdC70L4g0LIg0YTQvtGA0LzQsNGC0LUgMDAgKNC00LjQt9Cw0LnQvSlcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbnVtYmVyIC0g0YfQuNGB0LvQvlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgbnVtYmVyRm9ybWF0KG51bWJlcikge1xuICAgICAgICByZXR1cm4gKCcwJyArIG51bWJlcikuc2xpY2UoLTIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0L7Qt9C00LDRkdGCINGC0L7Rh9C60Lgg0LIgaHRtbC5cbiAgICAgKi9cbiAgICBjcmVhdGVEb3RzKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaXRlbXNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmRvdHNXcmFwcGVyLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRG90KCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQvtC30LTQsNGR0YIg0YLQvtGH0LrRgy5cbiAgICAgKiBAcmV0dXJuIHtIVE1MQnV0dG9uRWxlbWVudH1cbiAgICAgKi9cbiAgICBjcmVhdGVEb3QoKSB7XG4gICAgICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuXG4gICAgICAgIGRvdC5jbGFzc0xpc3QuYWRkKCdiLXNsaWRlcl9fZG90Jyk7XG5cbiAgICAgICAgcmV0dXJuIGRvdDtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqINCd0LDQstC10YjQuNCy0LDQtdGCINGB0L7QsdGL0YLQuNGPINC90LAg0LrQvtC90YLRgNC+0LvRi1xuICAgICAqL1xuICAgIGJpbmRFdmVudHMoKSB7XG4gICAgICAgIGNvbnN0IHRvdWNoRXZlbnQgPSBuZXcgSGFtbWVyKHRoaXMuZ2FsbGVyeSk7XG5cbiAgICAgICAgdG91Y2hFdmVudC5vbignc3dpcGVyaWdodCcsIHRoaXMuaXNTbGlkZUxlZnQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRvdWNoRXZlbnQub24oJ3N3aXBlbGVmdCcsIHRoaXMuaXNTbGlkZVJpZ2h0LmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuYXJyb3dMZWZ0LmNsYXNzTGlzdC5hZGQoJ2lzLWxhc3QnKTtcblxuICAgICAgICB0aGlzLmFycm93TGVmdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaXNTbGlkZUxlZnQuYmluZCh0aGlzKSwgZmFsc2UpO1xuICAgICAgICB0aGlzLmFycm93UmlnaHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmlzU2xpZGVSaWdodC5iaW5kKHRoaXMpLCBmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5kb3RzV3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBVdGlscy5nZXRFbGVtZW50SW5kZXgoZXZlbnQudGFyZ2V0KSArIDE7XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aXZlU2xpZGUgPSBpbmRleDtcbiAgICAgICAgICAgIHRoaXMuZG90QWN0aXZhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuc2xpZGVUbyh0aGlzLmdvVG8oaW5kZXgpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZWZyZXNoKCkge1xuICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5nYWxsZXJ5LnF1ZXJ5U2VsZWN0b3JBbGwoJy5iLXNsaWRlcl9faXRlbScpW3RoaXMuYWN0aXZlU2xpZGVdLm9mZnNldFdpZHRoO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gLSh0aGlzLndpZHRoICogKHRoaXMuYWN0aXZlU2xpZGUgLSAxKSk7XG4gICAgICAgIHRoaXMuc2xpZGVUbyh0aGlzLnBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy5zZXRIZWlnaHQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQlNC+0LHQsNCy0LvRj9C10YIg0YHQu9Cw0LnQtNGLLlxuICAgICAqL1xuICAgIGFwcGVuZENoaWxkcygpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoJ2Itc2xpZGVyX19pdGVtJyk7XG4gICAgICAgICAgICBpdGVtLmFwcGVuZENoaWxkKHRoaXMuY2hpbGRyZW5zW2ldKTtcblxuICAgICAgICAgICAgdGhpcy53cmFwcGVyLmFwcGVuZENoaWxkKGl0ZW0pO1xuICAgICAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMud3JhcHBlci5vZmZzZXRXaWR0aCAtIHRoaXMuZ2V0U2Nyb2xsYmFyV2lkdGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFNjcm9sbGJhcldpZHRoKCkge1xuICAgICAgICBjb25zdCBvdXRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIG91
46184dGVyLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgb3V0ZXIuc3R5bGUud2lkdGggPSAnMTAwcHgnO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG91dGVyKTtcblxuICAgICAgICBjb25zdCB3aWR0aE5vU2Nyb2xsID0gb3V0ZXIub2Zmc2V0V2lkdGg7XG5cbiAgICAgICAgb3V0ZXIuc3R5bGUub3ZlcmZsb3cgPSAnc2Nyb2xsJztcblxuICAgICAgICBjb25zdCBpbm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGlubmVyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICBvdXRlci5hcHBlbmRDaGlsZChpbm5lcik7XG5cbiAgICAgICAgY29uc3Qgd2lkdGhXaXRoU2Nyb2xsID0gaW5uZXIub2Zmc2V0V2lkdGg7XG5cbiAgICAgICAgb3V0ZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvdXRlcik7XG5cbiAgICAgICAgcmV0dXJuIHdpZHRoTm9TY3JvbGwgLSB3aWR0aFdpdGhTY3JvbGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7Qv9GA0LXQtNC10LvRj9C10YIg0LzQsNC60YHQuNC80LDQu9GM0L3Rg9GOINCy0YvRgdC+0YLRgyDRgdC70LDQudC00L7Qsiwg0Lgg0YPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIg0LXQtSDQvtCx0LXRgNGC0LrQtSAoKS5cbiAgICAgKi9cbiAgICBzZXRIZWlnaHQoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTbGlkZSA9IHRoaXMud3JhcHBlci5xdWVyeVNlbGVjdG9yKGAuYi1zbGlkZXJfX2l0ZW06bnRoLWNoaWxkKCR7dGhpcy5hY3RpdmVTbGlkZX0pYCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbWcgPSBjdXJyZW50U2xpZGUucXVlcnlTZWxlY3RvcignaW1nJyk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRJbWcpIHtcbiAgICAgICAgICAgIGN1cnJlbnRJbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNsaWRlSGVpZ2h0ID0gY3VycmVudFNsaWRlLm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgICAgICB0aGlzLndyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoJ2hlaWdodCcsIGAke3NsaWRlSGVpZ2h0fXB4YCwgJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JzQtdC90Y/QtdGCINCw0LrRgtC40LLQvdC+0LUg0LfQvdCw0YfQtdC90LjQtSDRgyDRgtC+0YfQutC4LlxuICAgICAqL1xuICAgIGRvdEFjdGl2YXRlKCkge1xuICAgICAgICB0aGlzLmFsbERvdHMgPSBBcnJheS5mcm9tKHRoaXMuZ2FsbGVyeS5xdWVyeVNlbGVjdG9yQWxsKCcuYi1zbGlkZXJfX2RvdCcpKTtcbiAgICAgICAgY29uc3QgYWN0aXZlRG90Q2xhc3MgPSAnYi1zbGlkZXJfX2RvdF9pc19hY3RpdmUnO1xuXG4gICAgICAgIHRoaXMuYWxsRG90cy5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlU2xpZGUgLSAxID09PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChhY3RpdmVEb3RDbGFzcyk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uQ29udHJvbCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoYWN0aXZlRG90Q2xhc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9C+0LrQsNC30YvQstCw0LXRgiDRgdC70LDQudC00LXRgCDQutC+0LPQtNCwINCy0YHQtSDQvNC10YLQvtC00Ysg0LLRi9C/0L7Qu9C90Y/RgtGB0Y8uXG4gICAgICovXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIHRoaXMuZ2FsbGVyeS5jbGFzc0xpc3QuYWRkKCdiLXNsaWRlcl9pc19yZWFkeScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0LXRgNC10LvQuNGB0YLRi9Cy0LDQtdGCINC6INC/0LXRgNC10LTQsNC90L3QvtC5INC/0L7Qt9C40YbQuNC4LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0b1Bvc2l0aW9uIC0g0L/QvtC30LjRhtC40Y8g0YHQu9Cw0LnQtNC10YDQsCDQv9C+IFgg0L7RgdC4LlxuICAgICAqL1xuICAgIHNsaWRlVG8odG9Qb3NpdGlvbikge1xuICAgICAgICB0aGlzLndyYXBwZXIuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHt0b1Bvc2l0aW9ufXB4KWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JvQuNGB0YLQsNC10YIg0YHQu9Cw0LnQtNC10YAg0LLQv9GA0LDQstC+LlxuICAgICAqL1xuICAgIHNsaWRlTGVmdCgpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uQ29udHJvbCgpO1xuICAgICAgICB0aGlzLnNsaWRlVG8odGhpcy5wb3NpdGlvbik7XG4gICAgICAgIHRoaXMuYWN0aXZlU2xpZGUgLT0gMTtcbiAgICAgICAgdGhpcy5kb3RBY3RpdmF0ZSgpO1xuICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQm9C40YHRgtCw0LXRgiDRgdC70LDQudC00LXRgCDQstC70LXQstC+LlxuICAgICAqL1xuICAgIHNsaWRlUmlnaHQoKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvbkNvbnRyb2woKTtcbiAgICAgICAgdGhpcy5zbGlkZVRvKHRoaXMucG9zaXRpb24pO1xuICAgICAgICB0aGlzLmFjdGl2ZVNsaWRlICs9IDE7XG4gICAgICAgIHRoaXMuZG90QWN0aXZhdGUoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC+0LLQtdGA0Y/QtdGCINC80L7QttC90L4g0LvQuCDQu9C40YHRgtCw0YLRjCDQstC70LXQstC+ICjQtdGB0LvQuCDQvdC1INC90YPQttC10L0g0LjQvdGE0LjQvdC40YLQuCDRgdC60YDQvtC70LssINGC0L4g0LIgaWYg0L/RgNC+0YHRgtC+INCy0LXRgNC90YPRgtGMIGZhbHNlKS5cbiAgICAgKi9cbiAgICBpc1NsaWRlTGVmdCgpIHtcbiAgICAgICAgdGhpcy5hcnJvd1JpZ2h0LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWxhc3QnKTtcblxuICAgICAgICB0aGlzLmNsZWFyQXV0b3BsYXkoKTtcblxuICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA+PSAwKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5maW5pdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gLSgodGhpcy5pdGVtc0NvdW50IC0gMSkgKiB0aGlzLndpZHRoKTtcbiAgICAgICAgICAgI
46184HRoaXMuYWN0aXZlU2xpZGUgPSB0aGlzLml0ZW1zQ291bnQgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiArPSB0aGlzLndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdhbGxlcnkuY2xhc3NMaXN0LmNvbnRhaW5zKCdqLWJlbmVmaXRzLXNsaWRlcicpKSB7XG4gICAgICAgICAgICBtZWRpYXRvci5wdWJsaXNoKCdiZW5lZml0R29lc0xlZnQnLCB0aGlzLmFjdGl2ZVNsaWRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVNsaWRlID09PSAyKSB7XG4gICAgICAgICAgICB0aGlzLmFycm93TGVmdC5jbGFzc0xpc3QuYWRkKCdpcy1sYXN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvdW50QWN0aXZlLmlubmVySFRNTCA9IHRoaXMubnVtYmVyRm9ybWF0KHRoaXMuYWN0aXZlU2xpZGUgLSAxKTtcbiAgICAgICAgdGhpcy5zbGlkZUxlZnQoKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0L7QstC10YDRj9C10YIg0LzQvtC20L3QviDQu9C4INC70LjRgdGC0LDRgtGMINCy0L/RgNCw0LLQviAo0LXRgdC70Lgg0L3QtSDQvdGD0LbQtdC9INC40L3RhNC40L3QuNGC0Lgg0YHQutGA0L7Qu9C7LCDRgtC+INCyIGlmINC/0YDQvtGB0YLQviDQstC10YDQvdGD0YLRjCBmYWxzZSkuXG4gICAgICovXG4gICAgaXNTbGlkZVJpZ2h0KCkge1xuICAgICAgICBjb25zdCBwYXJlbnRXaWR0aCA9IHRoaXMuZ2FsbGVyeS5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3Qgc2xpZGVXaWR0aCA9IHRoaXMuZ2FsbGVyeS5xdWVyeVNlbGVjdG9yKCcuYi1zbGlkZXJfX2l0ZW0nKS5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3Qgc2xpZGVTdG9wID0gTWF0aC5yb3VuZChwYXJlbnRXaWR0aCAvIHNsaWRlV2lkdGgpO1xuXG4gICAgICAgIHRoaXMuYXJyb3dMZWZ0LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWxhc3QnKTtcblxuICAgICAgICB0aGlzLmNsZWFyQXV0b3BsYXkoKTtcblxuICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA8PSAtKHRoaXMud2lkdGggKiAodGhpcy5pdGVtc0NvdW50IC0gc2xpZGVTdG9wKSkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmZpbml0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTbGlkZSA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uIC09IHRoaXMud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZ2FsbGVyeS5jbGFzc0xpc3QuY29udGFpbnMoJ2otYmVuZWZpdHMtc2xpZGVyJykpIHtcbiAgICAgICAgICAgIG1lZGlhdG9yLnB1Ymxpc2goJ2JlbmVmaXRHb2VzUmlnaHQnLCB7cG9zaXRpb246IHRoaXMucG9zaXRpb24sIHNsaWRlOiB0aGlzLmFjdGl2ZVNsaWRlfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hY3RpdmVTbGlkZSA9PT0gKHRoaXMuaXRlbXNDb3VudCAtIDEpKSB7XG4gICAgICAgICAgICB0aGlzLmFycm93UmlnaHQuY2xhc3NMaXN0LmFkZCgnaXMtbGFzdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb3VudEFjdGl2ZS5pbm5lckhUTUwgPSB0aGlzLm51bWJlckZvcm1hdCh0aGlzLmFjdGl2ZVNsaWRlICsgMSk7XG4gICAgICAgIHRoaXMuc2xpZGVSaWdodCgpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0L/RgNC10LTQtdC70Y/QtdGCINC90L7QstGD0Y4g0L/QvtC30LjRhtC40Y4g0YHQu9Cw0LnQtNCwINCyINC30LDQstC40YHQuNC80L7RgdGC0Lgg0L3QsCDQutCw0LrRg9GOINGC0L7Rh9C60YMg0L3QsNC20LDQu9C4LlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7bnVtYmVyfSAtINCf0L7RgNGP0LTQutC+0LLRi9C5INC90L7QvNC10YAg0YHQu9Cw0LnQtNCwLlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLSDQndC+0LLQsNGPINC/0L7Qt9C40YbQuNGPLlxuICAgICAqL1xuICAgIGdvVG8odmFsdWUpIHtcbiAgICAgICAgY29uc3QgbmV3UG9zaXRpb24gPSAtKHRoaXMud2lkdGggKiAodmFsdWUgLSAxKSk7XG5cbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG5ld1Bvc2l0aW9uO1xuXG4gICAgICAgIHJldHVybiBuZXdQb3NpdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQlNC+0LHQsNCy0LvRj9C10YIgdHJhbnNpdGlvbiDRgtC+0LvRjNC60L4g0L3QsCDQstGA0LXQvNGPINGB0LvQsNC50LTQsCAo0YfRgtC+0LHRiyDQvdC10LHRi9C70L4g0LDQvdC40LzQsNGG0LjQuCDQv9GA0Lgg0YDQtdGB0LDQudC30LUpXG4gICAgICovXG4gICAgdHJhbnNpdGlvbkNvbnRyb2woKSB7XG4gICAgICAgIHRoaXMud3JhcHBlci5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBgJHsxMDAgLyB0aGlzLnRyYW5zaXRpb25UaW1lfXNgO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLnJlbW92ZVByb3BlcnR5KCd0cmFuc2l0aW9uLWR1cmF0aW9uJyk7XG4gICAgICAgIH0sIHRoaXMudHJhbnNpdGlvblRpbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCc0LXRgtC+0LQg0LDQstGC0L7Qv9GA0L7Qu9C40YHRgtGL0LLQsNC90LjRjyDRgdC70LDQudC00L7Qsi5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSAtINC10YHQu9C4INCw0LLRgtC+0L/Qu9GN0Lkg0L3QtSDQt9Cw0LTQsNC9INC70LjQsdC+IGZhbHNlLCDRgtC+INGB0LXRgtC40L3RgtC10YDQstCw0Lsg0L3QtSDRgNCw0LHQvtGC0LDQtdGCXG4gICAgICovXG4gICAgYXV0b3BsYXlTdGFydCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmF1dG9wbGF5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmF1dG9wbGF5VGltZSA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmF1dG9wbGF5VHVybiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1NsaWRlUmlnaHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9wbGF5VHVybiA9ICdsZWZ0JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1NsaWRlTGVmdCgpO1xuICAgICAgICAgICAgICAgI
46184H1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2xpZGVMZWZ0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRvcGxheVR1cm4gPSAnbGVmdCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTbGlkZVJpZ2h0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sIHRoaXMuYXV0b3BsYXlTcGVlZCk7XG4gICAgfVxuXG4gICAgY2xlYXJBdXRvcGxheSgpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmF1dG9wbGF5VGltZSk7XG5cbiAgICAgICAgdGhpcy5hdXRvcGxheVN0YXJ0KCk7XG4gICAgfVxuXG4gICAgc2V0QXJyb3dzQ3VzdG9tUG9zaXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGFycm93cyA9IHRoaXMuZ2FsbGVyeS5xdWVyeVNlbGVjdG9yKCcuYi1zbGlkZXJfX2Fycm93cycpO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmdhbGxlcnkucXVlcnlTZWxlY3RvcignLmItcHJpbmNpcGUtY2Fyb3VzZWxfX2ltZycpLm9mZnNldEhlaWdodDtcblxuICAgICAgICBhcnJvd3Muc3R5bGUudG9wID0gYCR7aGVpZ2h0fXB4YDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNsaWRlcjtcbi8qIGVzbGludC1lbmFibGUgKi9cbiIsInZhciB0d2lnID0gcmVxdWlyZShcInR3aWdcIikudHdpZyxcbiAgICB0ZW1wbGF0ZSA9IHR3aWcoe1wiaWRcIjpcImZlOTg3OWZkZDY4ZmU5MDMyY2Q3NDk3MjYyZmUxMGQ5YjE1OTA4YTljMjI2MjFmMTM5NjhkZmM4OTRjYjJmNGZjM2UwOWEyYjI1ZDFiZmNjNTIzNmJiODdmNzBiYWViNWYzNzM0NGJmZWQzYTM0Y2YwZTZiZmZlYTUzM2FjMjJjXCIsXCJkYXRhXCI6W3tcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIjxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB4bWxuczp4bGluaz1cXFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1xcXCIgd2lkdGg9XFxcIjE3XFxcIiBoZWlnaHQ9XFxcIjE2XFxcIlxcbiAgICAgdmlld0JveD1cXFwiMCAwIDE3IDE2XFxcIj5cXG4gICAgPGRlZnM+XFxuICAgICAgICA8cGF0aCBpZD1cXFwiczZlN2FcXFwiIGQ9XFxcIk0yNzIuNDMxIDIyMC44di0xLjI2aC0xNC4xOTNsNi42NS02LjY1MUwyNjQgMjEybC04IDggOCA4IC44ODktLjg4OS02LjMxMS02LjMxMXpcXFwiLz5cXG4gICAgPC9kZWZzPlxcbiAgICA8Zz5cXG4gICAgICAgIDxnIHRyYW5zZm9ybT1cXFwidHJhbnNsYXRlKC0yNTYgLTIxMilcXFwiPlxcbiAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cXFwiI3M2ZTdhXFxcIi8+XFxuICAgICAgICA8L2c+XFxuICAgIDwvZz5cXG48L3N2Zz5cXG5cIn1dLFwiYWxsb3dJbmxpbmVJbmNsdWRlc1wiOnRydWUsXCJyZXRocm93XCI6dHJ1ZX0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGNvbnRleHQpIHsgcmV0dXJuIHRlbXBsYXRlLnJlbmRlcihjb250ZXh0KTsgfSIsInZhciB0d2lnID0gcmVxdWlyZShcInR3aWdcIikudHdpZyxcbiAgICB0ZW1wbGF0ZSA9IHR3aWcoe1wiaWRcIjpcImFhMmIwYmE2ZjI1NWY4NDA0MzA4NTU4ZjM2Yjk2YTA4ZGUxY2FjNWI4YTJhN2RmZGVkMmI3NWU2OWJiOTBjOWIxZDU4MzQ3NTk2ZmQ0MzFjZDZlYzUzOTFlMDcxNTRiYTkwNGYwYjU4MmYwODAzNDM0ZTc5M2JiNDhmNWMxYjIzXCIsXCJkYXRhXCI6W3tcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIjxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB4bWxuczp4bGluaz1cXFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1xcXCIgd2lkdGg9XFxcIjE3XFxcIiBoZWlnaHQ9XFxcIjE2XFxcIlxcbiAgICAgdmlld0JveD1cXFwiMCAwIDE3IDE2XFxcIj5cXG4gICAgPGRlZnM+XFxuICAgICAgICA8cGF0aCBpZD1cXFwiZHpvemFcXFwiIGQ9XFxcIk0yODYgMjIwLjh2LTEuMjZoMTQuMTk0bC02LjY1Mi02LjY1MS44OS0uODg5IDggOC04IDgtLjg5LS44ODkgNi4zMTItNi4zMTF6XFxcIi8+XFxuICAgIDwvZGVmcz5cXG4gICAgPGc+XFxuICAgICAgICA8ZyB0cmFuc2Zvcm09XFxcInRyYW5zbGF0ZSgtMjg2IC0yMTIpXFxcIj5cXG4gICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XFxcIiNkem96YVxcXCIvPlxcbiAgICAgICAgPC9nPlxcbiAgICA8L2c+XFxuPC9zdmc+XFxuXCJ9XSxcImFsbG93SW5saW5lSW5jbHVkZXNcIjp0cnVlLFwicmV0aHJvd1wiOnRydWV9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb250ZXh0KSB7IHJldHVybiB0ZW1wbGF0ZS5yZW5kZXIoY29udGV4dCk7IH0iLCJyZXF1aXJlKFwiLi9tZWRpYS9hcnJvdy1yaWdodC5zdmcudHdpZ1wiKTtcblxucmVxdWlyZShcIi4vbWVkaWEvYXJyb3ctbGVmdC5zdmcudHdpZ1wiKTtcblxudmFyIHR3aWcgPSByZXF1aXJlKFwidHdpZ1wiKS50d2lnLFxuICAgIHRlbXBsYXRlID0gdHdpZyh7XCJpZFwiOlwiNDRlNDY0Mzg3OGE0NGMxZTc3YTgyNDNhNmQyNzA1YWQ0N2NmNzc3MzNhZjZhZWYxYzM2MmFhNGVhZmZmOWYyNDQ1MWU0ZGM4NjE4MTRhODk0MjZhZTMyZTRiMzk1ZDAxMzNlMDJhNjFjNjU1NzI4NWFjMjRlNzlkYTI1YmJlODhcIixcImRhdGFcIjpbe1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxuPGRpdiBjbGFzcz1cXFwiYi1zbGlkZXJfX3dyYXBwZXJcXFwiPlxcblxcbjwvZGl2PlxcblxcblwifSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCJcXG48ZGl2IGNsYXNzPVxcXCJiLXNsaWRlcl9fY291bnRlclxcXCI+XFxuICAgIDxzcGFuIGNsYXNzPVxcXCJiLXNsaWRlcl9fY291bnRlci1hY3RpdmVcXFwiPjwvc3Bhbj5cXG4gICAgPHNwYW4+Lzwvc3Bhbj5cXG4gICAgPHNwYW4gY2xhc3M9XFxcImItc2xpZGVyX19jb3VudGVyLWFsbFxcXCI+PC9zcGFuPlxcbjwvZGl2PlxcblxcblwifSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCJcXG48ZGl2IGNsYXNzPVxcXCJiLXNsaWRlcl9fYXJyb3dzXFxcIj5cXG4gICAgPGJ1dHRvbiBjbGFzcz1cXFwiYi1zbGlkZXJfX2Fycm93IHNsaWRlcl9fYXJyb3ctbGVmdFxcXCI+XFxuICAgICAgICBcIn0se1widHlwZVwiOlwibG9naWNcIixcInRva2VuXCI6e1widHlwZVwiOlwiVHdpZy5sb2dpYy50eXBlLmluY2x1ZGVcIixcIm9ubHlcIjpmYWxzZSxcImlnbm9yZU1pc3NpbmdcIjpmYWxzZSxcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnN0cmluZ1wiLFwidmFsdWVcIjpcImZlOTg3OWZkZDY4ZmU5MDMyY2Q3NDk3MjYyZmUxMGQ5YjE1OTA4YTljMjI2MjFmMTM5NjhkZmM4OTRjYjJmNGZjM2UwOWEyYjI1ZDFiZmNjNTIzNmJiODdmNzBiYWViNWYzNzM0NGJmZWQzYTM0Y2YwZTZiZmZlYTUzM2FjMjJjXCJ9XX19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIiAgICA8L2J1dHRvbj5cXG4gICAgPGJ1dHRvbiBjbGFzcz1cXFwiYi1zbGlkZXJfX2Fycm93IHNsaWRlcl9fYXJyb3ctcmlnaHRcXFwiPlxcbiAgICAgICAgXCJ9LHtcInR5cGVcIjpcImxvZ2ljXCIsXCJ0b2tlblwiOntcInR5cGVcIjpcIlR3aWcubG9naWMudHlwZS5pbmNsdWRlXCIsXCJvbmx5XCI6ZmFsc2UsXCJpZ25vcmVNaXNzaW5nXCI6ZmFsc2UsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS5zdHJpbmdcIixcInZhbHVlXCI6XCJhYTJi
46184MGJhNmYyNTVmODQwNDMwODU1OGYzNmI5NmEwOGRlMWNhYzViOGEyYTdkZmRlZDJiNzVlNjliYjkwYzliMWQ1ODM0NzU5NmZkNDMxY2Q2ZWM1MzkxZTA3MTU0YmE5MDRmMGI1ODJmMDgwMzQzNGU3OTNiYjQ4ZjVjMWIyM1wifV19fSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCIgICAgPC9idXR0b24+XFxuPC9kaXY+XFxuXCJ9LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIlxcbjxkaXYgY2xhc3M9XFxcImItc2xpZGVyX19kb3RzXFxcIiBzdHlsZT1cXFwiZGlzcGxheTogbm9uZTtcXFwiPlxcblxcbjwvZGl2PlxcblwifV0sXCJhbGxvd0lubGluZUluY2x1ZGVzXCI6dHJ1ZSxcInJldGhyb3dcIjp0cnVlfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oY29udGV4dCkgeyByZXR1cm4gdGVtcGxhdGUucmVuZGVyKGNvbnRleHQpOyB9IiwiLyoqXG4gKiBAdmVyc2lvbiAyLjBhbHBoYVxuICogQGF1dGhvciBLZWxuaWsgU3R1ZGlvcyB7aHR0cDovL2tlbG5pay5ydX1cbiAqL1xuXG4vKipcbiAqIERlcGVuZGVuY2llc1xuICovXG4vLyBpbXBvcnQgdGVtcGxhdGUgZnJvbSAnLi90ZW1wbGF0ZS9jb250ZW50LnR3aWcnO1xuLy8gaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL2NvbW1vbi9zY3JpcHRzL3V0aWxzJztcbmltcG9ydCBNZWRpYXRvciBmcm9tICdjb21tb24vc2NyaXB0cy9tZWRpYXRvcic7XG5cbi8qKlxuICogVmFyaWFibGVzICYmIGNvbnN0YW50c1xuICovXG4vLyDQvNCw0YHRgdC40LIgZ2V0INC/0LDRgNCw0LzQtdGC0YDQvtCyINC40Lcg0YPRgNC70LAuINCR0YPQtNC10Lwg0YHRgNCw0LLQvdC40LLQsNGC0Ywg0LTQsNGC0LAg0YLQsNCxINCw0YLRgNC40LHRg9GC0Ysg0YLQsNCx0L7QsiDQuNC3INCy0YHQtdGFINGN0LrQt9C10LzQv9C70Y/RgNC+0LIg0LrQu9Cw0YHRgdCwINGBINC00LDQvdC90YvQvNC4INC40Ldcbi8vINC80LDRgdGB0LjQstCwLCDRh9GC0L4g0LHRiyDQvtGC0LrRgNGL0LLQsNGC0Ywg0L3Rg9C20L3Ri9C1INGC0LDQsdGLINC/0YDQuCDQvtGC0LrRgNGL0YLQuNC4INGB0YLRgNCw0L3QuNGG0Ysg0L/QviDRgdGB0YvQu9C60LVcbi8vIGxldCB1cmxBcnJheSA9IFtdO1xuXG4vKipcbiAqINCi0LDQsdGLXG4gKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCAtINC+0LHQtdGA0LDRgtC60LAg0LLRgdC10LPQviDQsdC70L7QutCwXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuY2xhc3MgVGFicyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubWVkaWF0b3IgPSBuZXcgTWVkaWF0b3IoKTtcbiAgICAgICAgLy8g0L3QvtC00LAg0YDQvtC00LjRgtC10LvRjyDRgtCw0LHQvtCyICjRjdC70LXQvNC10L3RgtC+0LIg0L/QtdGA0LXQutC70Y7Rh9C10L3QuNGPINGC0LDQsdC+0LIpXG4gICAgICAgIHRoaXMudGFic1BhcmVudCA9IHt9O1xuXG4gICAgICAgIC8vINC80LDRgdGB0LjQsiDRgtCw0LHQvtCyICjRjdC70LXQvNC10L3RgtC+0LIg0L/QtdGA0LXQutC70Y7Rh9C10L3QuNGPINGC0LDQsdC+0LIpXG4gICAgICAgIHRoaXMudGFicyA9IFtdO1xuXG4gICAgICAgIC8vINC90L7QtNCwINGA0L7QtNC40YLQtdC70Y8g0LrQvtC90YLQtdC90YLQsCDRgtCw0LHQvtCyXG4gICAgICAgIHRoaXMuY29udGVudHNQYXJlbnQgPSB7fTtcblxuICAgICAgICAvLyDQvNCw0YHRgdC40LIg0Y3Qu9C10LzQtdC90YLQvtCyINGBINC60L7QvdGC0LXQvdGC0L7QsiDRgtCw0LHQvtCyXG4gICAgICAgIHRoaXMuY29udGVudHMgPSBbXTtcblxuICAgICAgICAvLyDQt9Cw0L/QuNGB0YvQstCw0LXQvCDQtNCw0L3QvdGL0LUg0YLQsNCx0LAg0L3QsCDQutC+0YLQvtGA0L7QvCDQv9GA0L7QuNC30L7RiNC70L4g0YHQvtCx0YvRgtC40LUg0LrQu9C40LrQsFxuICAgICAgICB0aGlzLmRhdGFUYWIgPSB7fTtcblxuICAgICAgICAvLyDQmtC70LDRgdGBINCw0LrRgtC40LLQvdC+0LPQvijQstGL0LHRgNCw0L3QvdC+0LPQvikg0YLQsNCx0LBcbiAgICAgICAgdGhpcy5hY3RpdmUgPSAnaXMtYWN0aXZlJztcblxuICAgICAgICAvLyDQmtC70LDRgdGBINC30LDQtNC40YHQsNCx0LvQtdC90L3QvtCz0L4g0YLQsNCx0LBcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9ICdpcy1kaXNhYmxlZCc7XG4gICAgfVxuXG4gICAgaW5pdChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMudGFic1BhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iob3B0aW9ucy5lbGVtZW50KSB8fCBudWxsO1xuXG4gICAgICAgIC8vINCf0YDQvtCy0LXRgNC60LAg0L3QsCDQvdCw0LvQuNGH0LjQtSDRgtCw0LHQvtCyXG4gICAgICAgIGlmICghdGhpcy50YWJzUGFyZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdOZWVkIHRhcmdldCBlbGVtZW50IC0gJyArXG4gICAgICAgICAgICAgICAgJ2h0dHBzOi8va2VsbmlrLmdpdGJvb2tzLmlvL2tlbG5pay1kb2N1bWVudGF0aW9uL2Zyb250LWVuZC9jb21wb25lbnRzL3RhYnMuaHRtbCcpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyDQvdCw0YXQvtC00LjQvCDQstGB0LUg0YLQsNCx0Ysg0Lgg0L/RgNC40LLQvtC00LjQvCDQutC+0LvQu9C10LrRhtC40Y4g0L3QvtC0INC6INC80LDRgdGB0LjQstGDLiDQlNC70Y8g0YDQsNCx0L7RgtGLINGBIGZvckVhY2gg0LIg0JjQlS5cbiAgICAgICAgdGhpcy50YWJzID0gQXJyYXkuZnJvbSh0aGlzLnRhYnNQYXJlbnQucXVlcnlTZWxlY3RvckFsbCgnLmItdGFic19faXRlbScpKTtcblxuICAgICAgICB0aGlzLmNvbnRlbnRzUGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7dGhpcy50YWJzUGFyZW50LmRhdGFzZXQuY29udGVudH1gKTtcblxuICAgICAgICAvLyDQvdCw0YXQvtC00LjQvCDQstGB0LUg0Y3Qu9C10LzQtdC90YLRiyDQutC+0L3RgtC10L3RgtCwINC4INC/0YDQuNCy0L7QtNC40Lwg0LrQvtC70LvQtdC60YbQuNGOINC90L7QtCDQuiDQvNCw0YHRgdC40LLRgy4g0JTQu9GPINGA0LDQsdC+0YLRiyDRgSBmb3JFYWNoINCyINCY0JUuXG4gICAgICAgIHRoaXMuY29udGVudHMgPSBBcnJheS5mcm9tKHRoaXMuY29udGVudHNQYXJlbnQucXVlcnlTZWxlY3RvckFsbCgnLmItdGFicy1jb250ZW50X19pdGVtJykpO1xuXG4gICAgICAgI
46184HRoaXMuYmluZEV2ZW50cygpO1xuICAgICAgICAvLyB0aGlzLmNoZWNrVXJsUGFyYW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktC10YjQsNC10Lwg0YHQu9GD0YjQsNGC0LXQu9GMINC90LAg0YLQsNCx0YtcbiAgICAgKi9cbiAgICBiaW5kRXZlbnRzKCkge1xuICAgICAgICB0aGlzLnRhYnMuZm9yRWFjaCgodGFiKSA9PiB7XG4gICAgICAgICAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnRvZ2dsZVRhYi5iaW5kKHRoaXMpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/QtdGA0LXQutC70Y7Rh9Cw0LXQvCDRgtCw0LHRi1xuICAgICAqIEBwYXJhbSB7ZXZlbnR9IGV2ZW50IC0g0L/QtdGA0LXQtNCw0LXQvCDRgdC+0LHRi9GC0LjQtVxuICAgICAqL1xuICAgIHRvZ2dsZVRhYihldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCB0YWIgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuXG4gICAgICAgIGlmICh0YWIuY2xhc3NMaXN0LmNvbnRhaW5zKHRoaXMuZGlzYWJsZWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldERhdGEodGFiKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VTdGF0ZSgpO1xuICAgICAgICAvLyB0aGlzLnN0YXRlVXJsKHRhYik7XG4gICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCgndGFiU3dpdGNoZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9C+0LvRg9GH0LDQtdC8INC30L3QsNGH0LXQvdC40Y8gZGF0YSDQsNGC0YDQuNCx0YPRgtC+0LIg0YLQsNCx0LBcbiAgICAgKiBAcGFyYW0ge25vZGV9IGFjdGl2ZVRhYiAtINC90L7QtNCwINGC0LDQsdCwINC/0L4g0LrQvtGC0L7RgNC+0LzRgyDQv9GA0L7QuNC30L7RiNC70L4g0YHQvtCx0YvRgtC40LUg0LrQu9C40LrQsFxuICAgICAqL1xuICAgIHNldERhdGEoYWN0aXZlVGFiKSB7XG4gICAgICAgIHRoaXMuZGF0YVRhYiA9IHtcbiAgICAgICAgICAgIHRhYiA6IGFjdGl2ZVRhYixcbiAgICAgICAgICAgIGlkICA6IGFjdGl2ZVRhYi5kYXRhc2V0LnRhYixcbiAgICAgICAgICAgIHVybCA6IGFjdGl2ZVRhYi5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSxcbiAgICAgICAgICAgIGFqYXg6IGFjdGl2ZVRhYi5kYXRhc2V0LmFqYXhcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0L7QstC10YDRj9C10Lwg0LXRgdGC0Ywg0LvQuCDQsiB1cmwnZSDQv9Cw0YDQsNC80LXRgtGA0YsuXG4gICAgICovXG4gICAgLy8gY2hlY2tVcmxQYXJhbSgpIHtcbiAgICAvLyAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAvLyAgICAgICAgIHRoaXMuZ2V0VXJsUGFyYW1zKCk7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0L7QstC10YDRj9C10Lwg0L3QsNC70LjRh9C40LUg0LIgaHJlZiDRgdGB0YvQu9C60LggKNC20LzQsNC60L3Rg9GC0YvQuSDRgtCw0LEpINC90LDQu9C40YfQuNC1INGB0YLRgNC+0LrQuCDRgSDQsNC00YDQtdGB0L7QvC5cbiAgICAgKiDQv9GA0L7QstC10YDRj9C10YLRgdGPINGB0LDQvCDRhNCw0LrRgiDQvdCw0LvQuNGH0LjRjyDQsdC+0LvQtdC1INC+0LTQvdC+0LPQviDRgdC40LzQstC+0LvQsCAo0LIg0L/Rg9GB0YLQvtC5INGB0YHRi9C70LrQtSDQstGB0LXQs9C00LAg0LTQvtC70LbQtdC9INCx0YvRgtGMICMpXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgb3IgZmFsc2VcbiAgICAgKi9cbiAgICBpc0xpbmsoKSB7XG4gICAgICAgIGNvbnN0IGFyclNsaWNlID0ge1xuICAgICAgICAgICAgYmVnaW46IDAsXG4gICAgICAgICAgICBlbmQgIDogLTFcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhVGFiLnVybC5zbGljZShhcnJTbGljZS5iZWdpbiwgYXJyU2xpY2UuZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0L7QstC10YDRj9C10Lwg0L3QsNC70LjRh9C40LUg0LrQu9Cw0YHRgdCwIGlzLWRpc2FibGVkINGDINC20LzQsNC60L3Rg9GC0L7Qs9C+INGC0LDQsdCwXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGZhbHNlIG9yIHRydWVcbiAgICAgKi9cbiAgICBpc0Rpc2FibGVUYWIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFUYWIudGFiLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLmRpc2FibGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQnNC10L3Rj9C10Lwg0YHQvtGB0YLQvtGP0L3QuNC1INGC0LDQsdC+0LJcbiAgICAgKi9cbiAgICBjaGFuZ2VTdGF0ZSgpIHtcbiAgICAgICAgLy8g0L3QuNGH0LXQs9C+INC90LUg0LTQtdC70LDQtdC8INC10YHQu9C4INGC0LDQsSDQvdC10LDQutGC0LjQstC10L1cbiAgICAgICAgaWYgKHRoaXMuaXNEaXNhYmxlVGFiKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vINC/0LXRgNC10YXQvtC00LjQvCDQv9C+INGB0YHRi9C70LrQtSDQsiDRgtCw0LHQtSDQv9GA0Lgg0LXQtSDQvdCw0LvQuNGH0LjQuFxuICAgICAgICBpZiAodGhpcy5pc0xpbmsoKSkge1xuICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9IHRoaXMuZGF0YVRhYi51cmw7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vINC30LDQutGA0YPQttCw0LXQvCDQutC+0L3RgtC10L3RgiBhamF4J9C+0LxcbiAgICAgICAgLy8gaWYgKHRoaXMuZGF0YVRhYi5hamF4KSB7XG4gICAgICAgIC8vICAgICB0aGlzLmFqYXhMb2FkKCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyDQvNC10L3Rj9C10Lwg0YHQvtGB0YLQvtGP0L3QuNC1INGC0LDQsdC+0LJcbiAgICAgICAgdGhpcy50YWJzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmRhdGFzZXQudGFiID09PSB0aGlzLmRhdGFUYWIuaWQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQodGhpcy5hY3RpdmUpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuYWN0aXZlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8g0Lgg0L/QvtC60LDQt9GL0LLQsNC10Lwg0L3Rg9C20L3Ri9C5INC60L7QvdGC0LXQvdGCXG4gICAgICAgI
46184HRoaXMuY29udGVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGF0YXNldC50YWJDb250ZW50ID09PSB0aGlzLmRhdGFUYWIuaWQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQodGhpcy5hY3RpdmUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKCdjaGFuZ2VUYWJzJywgZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5hY3RpdmUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodGA0LDQstC90LjQstCw0LXQvCBnZXQg0L/QsNGA0LDQvNC10YLRgNGLINC40LcgVXJsJ2Eg0YHQviDQt9C90LDRh9C10L3QuNGP0LzQuCBkYXRhLXRhYiDQsNGC0YDQuNCx0YPRgtCwINC20LzQsNC60L3Rg9GC0L7Qs9C+INGC0LDQsdCwXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFjdGl2ZVRhYiAtINGC0LDQsSDQvdCwINC60L7RgtC+0YDQvtC8INC/0YDQvtC40LfQvtGI0LvQviDRgdC+0LHRi9GC0LjQtSDQutC70LjQulxuICAgICAqL1xuICAgIC8vINC30LDQsdGL0LsgSlNET0MgLSDRh9GC0L4g0YLQsNC60L7QtSBhY3RpdmVUYXY/INC40Lcg0L3QsNC30LLQsNC90LjRjyDQv9C+0L3Rj9GC0L3Qviwg0L3QviDRgSBKU0RPQyDQu9GD0YfRiNC1XG4gICAgLy8g0LzQtdGC0L7QtCDQvtGH0LXQvdGMINCx0L7Qu9GM0YjQvtC5INC90LUg0L/QvtC90Y/RgtC90L4sINGH0YLQviDRj9Cy0LvRj9C10YLRgdGPINGA0LXQt9GD0LvRjNGC0LDRgtC8INGA0LDQsdC+0YLRiyDQvNC10YLQvtC00LBcbiAgICAvLyDQv9C+INC40LTQtdC1INGA0LDQtyDRgdGA0LDQstC90LjQstCw0LXRgiAsINGC0L4g0LTQvtC70LbQtdC9INCy0LXRgNC90YPRgtGMIHRydWUg0LjQu9C4IGZhbHNlXG4gICAgLy8gc3RhdGVVcmwoYWN0aXZlVGFiKSB7XG4gICAgLy8gICAgIC8vIGNvbnN0IHRhYklkID0gYWN0aXZlVGFiLmRhdGFzZXQudGFiO1xuICAgIC8vICAgICBjb25zdCB0YWJJZCA9IHRoaXMuZGF0YVRhYi5pZDtcbiAgICAvLyAgICAgY29uc3QgdGFiVXJsID0gYWN0aXZlVGFiLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICAgIC8vICAgICBjb25zdCBnZXRVcmwgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnNsaWNlKDEpO1xuICAgIC8vICAgICBjb25zdCBnZXRBcnJheSA9IGdldFVybC5zcGxpdCgnJicpO1xuICAgIC8vICAgICBsZXQgY29uZ3J1ZW5jZVRhYlVybCA9IHRydWU7XG4gICAgLy9cbiAgICAvLyAgICAgY29uc3QgYXJyU2xpY2UgPSB7XG4gICAgLy8gICAgICAgICBiZWdpbjogMCxcbiAgICAvLyAgICAgICAgIGVuZCAgOiAtMVxuICAgIC8vICAgICB9O1xuICAgIC8vXG4gICAgLy8gICAgIC8vINC/0YDQvtCy0LXRgNGP0LXQvCwg0LXRgdGC0Ywg0LvQuCB1cmwg0LIgaHJlZlxuICAgIC8vICAgICBpZiAodGFiVXJsLnNsaWNlKGFyclNsaWNlLmJlZ2luLCBhcnJTbGljZS5lbmQpKSB7XG4gICAgLy8gICAgICAgICByZXR1cm47XG4gICAgLy8gICAgIH1cbiAgICAvL1xuICAgIC8vICAgICAvLyDQv9GA0L7QstC10YDRj9C10LwsINC10YHRgtGMINC70LggZ2V0INC/0LDRgNCw0LzQtdGC0YAg0LIgdXJsJ2Ug0Lgg0LXRgdC70Lgg0LXQs9C+INC10YnQtSDQv9C+0LrQsCDQvdC10YIsINC/0LXRgNC10LTQsNC10Lwg0YLRg9C00LAg0LfQvdCw0YfQtdC90LjQtSBkYXRhLXRhYiDQsNGC0YDQuNCx0YPRgtCwXG4gICAgLy8gICAgIC8vINC20LzQsNC60L3Rg9GC0L7Qs9C+INGC0LDQsdCwXG4gICAgLy8gICAgIGlmICghZ2V0VXJsKSB7XG4gICAgLy8gICAgICAgICB1cmxBcnJheVt1cmxBcnJheS5sZW5ndGhdID0gdGFiSWQ7XG4gICAgLy8gICAgICAgICB0aGlzLmNoYW5nZVVybCgpO1xuICAgIC8vXG4gICAgLy8gICAgICAgICByZXR1cm47XG4gICAgLy8gICAgIH1cbiAgICAvL1xuICAgIC8vXG4gICAgLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2V0QXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAvLyAgICAgICAgIGlmIChnZXRBcnJheVtpXSA9PT0gdGFiSWQpIHtcbiAgICAvLyAgICAgICAgICAgICBpID0gZ2V0QXJyYXkubGVuZ3RoO1xuICAgIC8vXG4gICAgLy8gICAgICAgICAgICAgcmV0dXJuO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vXG4gICAgLy8gICAgICAgICBmb3IgKGxldCB0YWJJbmRleCA9IDA7IHRhYkluZGV4IDwgdGhpcy50YWJzLmxlbmd0aDsgdGFiSW5kZXgrKykge1xuICAgIC8vICAgICAgICAgICAgIGlmIChnZXRBcnJheVtpXSA9PT0gdGhpcy50YWJzW3RhYkluZGV4XS5kYXRhc2V0LnRhYikge1xuICAgIC8vICAgICAgICAgICAgICAgICB1cmxBcnJheVtnZXRBcnJheS5pbmRleE9mKGdldEFycmF5W2ldKV0gPSB0YWJJZDtcbiAgICAvLyAgICAgICAgICAgICAgICAgdGFiSW5kZXggPSB0aGlzLnRhYnMubGVuZ3RoO1xuICAgIC8vICAgICAgICAgICAgICAgICBpID0gZ2V0QXJyYXkubGVuZ3RoO1xuICAgIC8vICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVVybCgpO1xuICAgIC8vXG4gICAgLy8gICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAvLyAgICAgICAgICAgICB9XG4gICAgLy9cbiAgICAvLyAgICAgICAgICAgICBjb25ncnVlbmNlVGFiVXJsID0gZmFsc2U7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvL1xuICAgIC8vICAgICBpZiAoIWNvbmdydWVuY2VUYWJVcmwpIHtcbiAgICAvLyAgICAgICAgIHVybEFycmF5W3VybEFycmF5Lmxlbmd0aF0gPSB0YWJJZDtcbiAgICAvLyAgICAgICAgIHRoaXMuY2hhbmdlVXJsKCk7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICAvKipcbiAgICAgKiDQpNC+0YDQvNC40YDRg9C10Lwg0YHRgtGA0L7QutGDINGBIGdldCDQv9Cw0YDQsNC80LXRgtGA0LDQvNC4INC00LvRjyDRgdC80LXQvdGLIHVybCdhXG4gICAgICovXG4gICAgLy8gY2hhbmdlVXJsKCkge1xuICAgIC8vICAgICBjb25zdCB1cmxTdHJpbmcgPSB1cmxBcnJheS5qb2luKCcmJyk7XG4gICAgLy9cbiAgICAvLyAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKGA/JHt1cmxTdHJpbmd9YCwgbnVsbCwgYD8ke3VybFN0cmluZ31gKTtcbiAgICAvLyB9XG5cbiAgICAvLyAvKipcbiAgICAvLyAgKiDQn9C+0LTQs9GA0YPQttCw0LXQvCBhamF4XG4gICAgLy8gICovXG4gICAgLy8gYWpheExvYWQoKSB7XG4gICAgLy8gICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgIC8vICAgICBjb25zdCBhamF4VXJsID0gYC90ZXN0cy8ke3RoYXQuZGF0YVRhYi5hamF4fWA7XG4gICAgLy9cbiAgICAvLyAgICAgVXRpbHMuc2VuZChudWxsLCBhamF4VXJsLFxuICAgIC8vICAgICAgICAge1xuICAgIC8vICAgICAgICAgICAgI
46184HN1Y2Nlc3MocmVxKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgIHRoYXQuYWRkUGFnZUNvbnRlbnQocmVxLCB0aGF0LmRhdGFUYWIudGFiKTtcbiAgICAvLyAgICAgICAgICAgICB9LFxuICAgIC8vICAgICAgICAgICAgIGVycm9yKGVycikge1xuICAgIC8vICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGDQvtGI0LjQsdC60LAg0L3QsCDRgdC10YDQstC10YDQtTogJHtlcnJ9YCk7XG4gICAgLy8gICAgICAgICAgICAgfVxuICAgIC8vICAgICAgICAgfSk7XG4gICAgLy8gfVxuICAgIC8vXG4gICAgLy8gLyoqXG4gICAgLy8gICog0JTQvtCx0LDQstC70Y/QtdC8INC60L7QvdGC0LXQvdGCINC/0YDQuNGI0LXQtNGI0LjQuSDRgSDRgdC10YDQstC10YDQsCDQvdCwINGB0YLRgNCw0L3QuNGG0YNcbiAgICAvLyAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtINC+0YLQstC10YIg0L7RgiDRgdC10YDQstC10YDQsCDQv9GA0LggYWpheCDQt9Cw0L/RgNC+0YHQtVxuICAgIC8vICAqIEBwYXJhbSB7bm9kZX0gYWN0aXZlVGFiIC0g0YLQsNCxINC/0L4g0LrQvtGC0L7RgNC+0LzRgyDQv9GA0L7QuNC30L7RiNC10Lsg0LrQu9C40LpcbiAgICAvLyAgKi9cbiAgICAvLyBhZGRQYWdlQ29udGVudChkYXRhLCBhY3RpdmVUYWIpIHtcbiAgICAvLyAgICAgdGhpcy5jb250ZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgLy8gICAgICAgICBpZiAoZWxlbWVudC5kYXRhc2V0LnRhYkNvbnRlbnQgPT09IGFjdGl2ZVRhYi5kYXRhc2V0LnRhYikge1xuICAgIC8vICAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gdGVtcGxhdGUoZGF0YSk7XG4gICAgLy8gICAgICAgICAgICAgYWN0aXZlVGFiLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1hamF4Jyk7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH0pO1xuICAgIC8vIH1cblxuICAgIC8qKlxuICAgICAqINCf0YDQuCDRgdC+0LfQtNCw0L3QuNC4INGN0LrQt9C10LzQv9C70Y/RgNCwINC60LvQsNGB0YHQsCwg0L/RgNC+0LLQtdGA0Y/QtdC8INC10YHRgtGMINC70Lgg0YMg0L3QsNGBINC/0LDRgNCw0LzQtdGC0YDRiyDQsiDQsNC00YDQtdGB0L3QvtC5INGB0YLRgNC+0LrQtS5cbiAgICAgKiDQldGB0LvQuCDQtdGB0YLRjCAtINCy0YvRgtCw0YHQutC40LLQsNC10Lwg0LjRhSDQsiDQvNCw0YHRgdC40LIuXG4gICAgICovXG4gICAgLy8gZ2V0VXJsUGFyYW1zKCkge1xuICAgIC8vICAgICAvLyDQsdC10YDQtdC8INGB0YLRgNC+0LrRgyDQuNC3INGD0YDQu9CwINC4INC+0LHRgNC10LfQsNC10Lwg0LXQvNGDINC/0LXRgNCy0YvQuSDRgdC40LzQstC+0Lsg0Lgg0L/Qv9GA0LXQvtCx0YDQsNC30YPQtdC8INCyINC80LDRgdGB0LjQslxuICAgIC8vICAgICBjb25zdCBnZXRBcnJheSA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gucmVwbGFjZSgnPycsICcnKS5zcGxpdCgnJicpO1xuICAgIC8vXG4gICAgLy8gICAgIGlmIChnZXRBcnJheS5sZW5ndGgpIHtcbiAgICAvLyAgICAgICAgIC8vINC/0LXRgNC10LTQsNC10Lwg0LzQsNGB0YHQuNCyINC00LvRjyDRgdGA0LDQstC90LXQvdC40Y8g0YEgZGF0YS10YWIg0LDRgtC40LHRg9GC0LDQvNC4XG4gICAgLy8gICAgICAgICB0aGlzLmNvbXBhcmlzb25UYWJVcmwoZ2V0QXJyYXkpO1xuICAgIC8vICAgICAgICAgdXJsQXJyYXkgPSBnZXRBcnJheTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuICAgIC8qKlxuICAgICAqINCV0YHQu9C4INCyIGdldCDQv9Cw0YDQsNC80LXRgtGA0LDRhSB1cmwnYSDQtdGB0YLRjCDQt9C90LDRh9C10L3QuNGPINGB0L7QvtGC0LLQtdGC0YHRgtCy0YPRjtGJ0LjQtSDQt9C90LDRh9C10L3QuNGP0LwgZGF0YS10YWIg0LDRgtGA0LjQsdGD0YLQvtCyLCDRgtC+INC+0YLQutGA0YvQstCw0LXQvCDRjdGC0L7RgiDRgtCw0LFcbiAgICAgKiBAcGFyYW0ge2FycmF5fSBnZXRBcnJheSAtINC80LDRgdGB0LjQsiBnZXQg0L/QsNGA0LDQvNC10YLRgNC+0LIg0LjQtyB1cmwnYSDQtNC70Y8g0YHRgNCw0LLQvdC10L3QuNGPINGBINC30L3QsNGH0LXQvdC40Y/QvNC4IGRhdGEtdGFiINCw0YLRgNC40LHRg9GC0L7QslxuICAgICAqL1xuICAgIC8vIGNvbXBhcmlzb25UYWJVcmwoZ2V0QXJyYXkpIHtcbiAgICAvLyAgICAgLy8g0L/RgNC+0YXQvtC00LjQvCDQv9C+INC80LDRgdGB0LjQstGDINC40Lcg0LfQvdCw0YfQtdC90LjQuSDQstC30Y/RgtGL0YUg0LIg0YPRgNC70LVcbiAgICAvLyAgICAgZ2V0QXJyYXkuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIC8vICAgICAgICAgLy8g0L/RgNC+0YXQvtC00LjQvCDQv9C+INC80LDRgdGB0LjQstGDIGRhdGEtdGFiINGN0LvQtdC80LXQvdGC0L7QslxuICAgIC8vICAgICAgICAgdGhpcy50YWJzLmZvckVhY2goKHRhYikgPT4ge1xuICAgIC8vICAgICAgICAgICAgIC8vINC40YnQtdC8INGB0L7QstC/0LDQtNC10L3QuNC1INC30L3QsNGH0LXQvdC40LkgZGF0YS10YWIg0LDRgtC40YDRg9Cx0YLQvtCyINGB0L4g0LfQvdCw0YfQtdC90LjRj9C80Lgg0LjQtyDRg9GA0LvQsFxuICAgIC8vICAgICAgICAgICAgIGlmICh0YWIuZGF0YXNldC50YWIgPT09IGVsZW1lbnQpIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgLy8g0LLRi9C30YvQstCw0LXQvCDQvNC10YLQvtC0INGB0LzQtdC90Ysg0YLQsNCx0L7QsiDQsiDRgdC70YPRh9Cw0LUg0YHQvtCy0L/QsNC00LXQvdC40Y9cbiAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5zZXREYXRhKHRhYik7XG4gICAgLy8gICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlU3RhdGUoKTtcbiAgICAvLyAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICB9KTtcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUYWJzO1xuIiwiaW1wb3J0IHRlbXBsYXRlIGZyb20gJ2NvbXBvbmVudHMvdGVhbS9wb3B1cC50d2lnJztcbmltcG9ydCBVdGlscyBmcm9tICdjb21tb24vc2NyaXB0cy91dGlscyc7XG5cbmNsYXNzIHRlYW1Qb3B1cCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudGFiQnV0dG9ucyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmotdGVhbS10YWItYnV0dG9uJykpO1xuICAgICAgICB0aGlzLnRhYkNvbnRlbnRzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuai10ZWFtLXRhYi1jb250ZW50JykpO1xuICAgICAgICB0aGlzLnRhYkJ1dHRvbkFjdGl2ZSA9ICdiLXRlYW0tdGV4dF9fYnV0dG9uX2lzX2FjdGl2ZSc7XG4gICAgICAgI
46184HRoaXMudGFiQ29udGVudEhpZGUgPSAnYi10ZWFtLXRleHRfX3RhYl9pc19oaWRlJztcbiAgICB9XG5cbiAgICBpbml0KG9iamVjdCkge1xuICAgICAgICB0aGlzLmJvZHkgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICBjb25zdCBpdGVtcyA9IG9iamVjdC5xdWVyeVNlbGVjdG9yQWxsKCcuYi10ZWFtLXNsaWRlc19fbW9kYWwnKTtcblxuICAgICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBVdGlscy5jbG9zZXN0KGl0ZW0sICcuYi10ZWFtLXNsaWRlc19faXRlbScpO1xuXG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0YShjb250YWluZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0VGVtcGxhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpeGVkQm9keSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2JpbmRFdmVudHMoKTtcbiAgICB9XG5cbiAgICBfYmluZEV2ZW50cygpIHtcbiAgICAgICAgdGhpcy50YWJCdXR0b25zLmZvckVhY2goKHRhYkJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgdGFiQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0YWJCdXR0b24uY2xhc3NMaXN0LmNvbnRhaW5zKHRoaXMudGFiQnV0dG9uQWN0aXZlKSkge1xuICAgICAgICAgICAgICAgICAgICB0YWJCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSh0aGlzLnRhYkJ1dHRvbkFjdGl2ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGlkZVRhYkNvbnRlbnRzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZUFjdGl2ZUJ1dHRvbigpO1xuXG4gICAgICAgICAgICAgICAgdGFiQnV0dG9uLmNsYXNzTGlzdC5hZGQodGhpcy50YWJCdXR0b25BY3RpdmUpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaWRUYWJDb250ZW50ID0gdGFiQnV0dG9uLmRhdGFzZXQudGFiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYkNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZFRhYkNvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5faGlkZVRhYkNvbnRlbnRzKCk7XG5cbiAgICAgICAgICAgICAgICB0YWJDb250ZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy50YWJDb250ZW50SGlkZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3JlbW92ZUFjdGl2ZUJ1dHRvbigpIHtcbiAgICAgICAgdGhpcy50YWJCdXR0b25zLmZvckVhY2goKHRhYkJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgdGFiQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUodGhpcy50YWJCdXR0b25BY3RpdmUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfaGlkZVRhYkNvbnRlbnRzKCkge1xuICAgICAgICB0aGlzLnRhYkNvbnRlbnRzLmZvckVhY2goKHRhYkNvbnRlbnRzKSA9PiB7XG4gICAgICAgICAgICB0YWJDb250ZW50cy5jbGFzc0xpc3QuYWRkKHRoaXMudGFiQ29udGVudEhpZGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXREYXRhKGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgdGV4dEVsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5iLXRlYW0tc2xpZGVzX19sZWdlbmQnKTtcblxuICAgICAgICB0aGlzLmRhdGEgPSB7XG4gICAgICAgICAgICBuYW1lICAgIDogZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuYi10ZWFtLXNsaWRlc19fdHRsJykuaW5uZXJIVE1MLFxuICAgICAgICAgICAgc3RhdHVzICA6IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLmItdGVhbS1zbGlkZXNfX3RleHQnKS5pbm5lckhUTUwsXG4gICAgICAgICAgICBwb3NpdGlvbjogZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuYi10ZWFtLXNsaWRlc19fdGV4dC1oaWRkZW4nKS5pbm5lckhUTUwsXG4gICAgICAgICAgICB0ZXh0ICAgIDogdGV4dEVsZW1lbnQgPyB0ZXh0RWxlbWVudC5pbm5lckhUTUwgOiAnJyxcbiAgICAgICAgICAgIGltYWdlICAgOiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5iLXRlYW0tc2xpZGVzX19pbWcnKS5zcmNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpbnNlcnRUZW1wbGF0ZSgpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLCB0ZW1wbGF0ZSh0aGlzLmRhdGEpKTtcbiAgICAgICAgdGhpcy5pbml0Q2xvc2VCdG4oKTtcbiAgICB9XG5cbiAgICBpbml0Q2xvc2VCdG4oKSB7XG4gICAgICAgIGNvbnN0IGNsb3NlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmotcG9wdXAtY2xvc2UnKTtcblxuICAgICAgICBjbG9zZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveVBvcHVwKCk7XG4gICAgICAgICAgICB0aGlzLmZpeGVkQm9keSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkZXN0cm95UG9wdXAoKSB7XG4gICAgICAgIGNvbnN0IHBvcHVwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmItdGVhbS1wb3B1cCcpO1xuXG4gICAgICAgIFV0aWxzLnJlbW92ZUVsZW1lbnQocG9wdXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCU0L7QsdCw0LLQu9GP0LXRgiBib2R5IHBvc2l0aW9uOmZpeGVkLCDQtNCw0LHRiyDQuNC30LHQtdC20LDRgtGMINC/0YDQvtC60YDRg9GC0LrQuCDRgdGC0YDQsNC90LjRhtGLINC/0YDQuCDQvtGC0LrRgNGL0YLQvtC8INC/0L7Qv9Cw0L/QtS5cbiAgICAgKi9cbiAgICBmaXhlZEJvZHkoKSB7XG4gICAgICAgIHRoaXMuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdib2R5LWZpeGVkJyk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB0ZWFtUG9wdXA7XG4iLCJ2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCJjMDEzMDlmZWEwNTkxOGUwNjZjOWY1NjY2ZTVjMjY0NzkxMDRiOTRmNTM2NGM3MDI1ZDNjZmU1YzdhNmZhZGUwYTc0ZjQxOTA2MjI0ZDhkYmM3ODJkNjc2NDFkN2NlZTc1OTMwNzUwMjAxZjYwMDdlZDVlNDVjNzFkZTQwNDViZlwiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8ZGl2IGNsYXNzPVxcXCJiLXRlYW0tcG9wdXBcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJiLXRlYW0tcG9wdXBfX2lubGluZS13cmFwcGVyXFxcIj5cXG4gICAgICAgIDxidXR0b24gY2xhc3M9XFxcImItdGVhbS1wb3B1cF9fY2xvc2Ugai1wb3B1cC1jbG9zZVxcXCIgYXJpYS1sYWJlbD1cXFwi0JfQsNC60YDRi9GC0Ywg0LLRgdC/0LvRi9Cy0LDRjtGJ0LXQtSDQvtC60L3QvlxcXCI+XFxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHhtbG5zOnhsaW5rPVxcXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXFxcIiB3aWR0aD1cXFwiMjZcXFwiIGhlaWdodD1cXFwiMjZcXFwiIHZpZXdCb3g9XFxcIjAgMCAyNiAyNlxcXCI+PGRlZnM+PHBhdGggaWQ9XFxcIjczaHRhXFxcIiBkPVxcXCJNMTA1MS40NDQgNzNMMTA1MCA3MS41NTYgMTA2MS41NTYgNjAgMTA1MCA0OC40NDRsMS40NDQtMS40NDRMMTA2MyA1OC41NTYgMTA3NC41NTYgNDdsMS40NDQgMS40NDRMMTA2NC40NDQgNjAgMTA3NiA3MS41NTYgMTA3NC41NTYgNzMgMTA2MyA2MS40NDR6XFxcIi8+PC9kZWZzPjxnPjxnIHRyYW5zZm9ybT1cXFwidHJhbnNsYXRlKC0xMDUwIC00NylcXFwiPjx1c2UgZmlsbD1cXFwiI2ZmZlxcXCIgeGxpbms6aHJlZj1cXFwiIzczaHRhXFxcIi8+PC9nPjwvZz48L3N2Zz5cXG4gICAgICAgIDwvYnV0dG9uPlxcblxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYi10ZWFtLXBvcHVwX19oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImItdGVhbS1wb3B1cF9fbmFtZVxcXCI+XCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJuYW1lXCIsXCJtYXRjaFwiOltcIm5hbWVcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYi10ZWFtLXBvcHVwX19zdGF0dXNcXFwiPlwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwic3RhdHVzXCIsXCJtYXRjaFwiOltcInN0YXR1c1wiXX1dfSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJiLXRlYW0tcG9wdXBfX3Bvc2l0aW9uXFxcIj5cIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcInBvc2l0aW9uXCIsXCJtYXRjaFwiOltcInBvc2l0aW9uXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIjwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImItdGVhbS1wb3B1cF9faW1hZ2Utd3JhcFxcXCI+XFxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCJcIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcImltYWdlXCIsXCJtYXRjaFwiOltcImltYWdlXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIlxcXCIgY2xhc3M9XFxcImItdGVhbS1wb3B1cF9faW1hZ2VcXFwiIGFsdD1cXFwiXCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJuYW1lXCIsXCJtYXRjaFwiOltcIm5hbWVcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxcIj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgXCJ9LHtcInR5cGVcIjpcImxvZ2ljXCIsXCJ0b2tlblwiOntcInR5cGVcIjpcIlR3aWcubG9naWMudHlwZS5pZlwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJ0ZXh0XCIsXCJtYXRjaFwiOltcInRleHRcIl19XSxcIm91dHB1dFwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCIgICAgICAgIDxkaXYgY2xhc3M9XFxcImItdGVhbS1wb3B1cF9fYm9keVxcXCI+XFxuICAgICAgICAgICAgXCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJ0ZXh0XCIsXCJtYXRjaFwiOltcInRleHRcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIFwifV19fSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCIgICAgPC9kaXY+XFxuPC9kaXY+XFxuXCJ9XSxcImFsbG93SW5saW5lSW5jbHVkZXNcIjp0cnVlLFwicmV0aHJvd1wiOnRydWV9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb250ZXh0KSB7IHJldHVybi
46184B0ZW1wbGF0ZS5yZW5kZXIoY29udGV4dCk7IH0iLCIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG4vKipcbiAqIEB2ZXJzaW9uIDEuMFxuICogQGF1dGhvciBLZWxuaWsgU3R1ZGlvcyB7aHR0cDovL2tlbG5pay5ydX1cbiAqINCS0LfRj9GC0L4g0YEgaHR0cHM6Ly9naXRsYWIua2VsbmlrLnByby9zYW1vbGV0L2hpbWtpL2Jsb2IvZGV2L3NyYy9zY3JpcHRzL2FwcC95YW5kZXgtbWFwcy5qc1xuICovXG5cbmltcG9ydCBtYWluSHRtbE1hcmtlciBmcm9tICcuL3RlbXBsYXRlcy9tYXJrZXJzL21haW4udHdpZyc7XG5pbXBvcnQgc2Vjb25kYXJ5SHRtbE1hcmtlciBmcm9tICcuL3RlbXBsYXRlcy9tYXJrZXJzL3NlY29uZGFyeS50d2lnJztcbmltcG9ydCB0ZXh0SHRtbE1hcmtlciBmcm9tICcuL3RlbXBsYXRlcy9tYXJrZXJzL3RleHQudHdpZyc7XG5pbXBvcnQgbGlua0h0bWxCYWxsb29uIGZyb20gJy4vdGVtcGxhdGVzL2JhbGxvbnMvbGluay50d2lnJztcbmltcG9ydCBsZWdlbmRUZW1wbGF0ZSBmcm9tICcuL3RlbXBsYXRlcy9sZWdlbmQudHdpZyc7XG5pbXBvcnQgY29udHJvbHNUZW1wbGF0ZSBmcm9tICcuL3RlbXBsYXRlcy9jb250cm9scy50d2lnJztcbmltcG9ydCBVdGlscyBmcm9tICdjb21tb24vc2NyaXB0cy91dGlscyc7XG5pbXBvcnQgTWVkaWF0b3IgZnJvbSAnY29tbW9uL3NjcmlwdHMvbWVkaWF0b3InO1xuXG5jb25zdCBtZWRpYXRvciA9IG5ldyBNZWRpYXRvcigpO1xuXG5jbGFzcyBZYW5kZXhNYXAge1xuICAgIGNvbnN0cnVjdG9yKHltYXBzKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDQrdC60LfQtdC80L/Qu9GP0YAg0LfQsNCz0YDRg9C20LXQvdC90YvRhSDRj9C90LTQtdC60YEg0LrQsNGA0YIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnltYXBzID0geW1hcHM7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqINCS0YHQtSDQvdCw0YHRgtGA0L7QutC4INC60LDRgNGC0YtcbiAgICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSB7fTtcblxuICAgICAgICAvKipcbiAgICAgICAgICog0K/QvdC00LXQutGB0L7QstGL0Lkg0L7QsdGK0LXQutGCINC60LDRgNGC0YtcbiAgICAgICAgICogQHR5cGUge251bGx9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1hcCA9IHt9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVUkwg0L/QviDQutC+0YLQvtGA0L7QvNGDINCx0YPQtNC10YIg0LLRi9C/0L7Qu9C90LXQvSBhamF4INC30LDQv9GA0L7RgSDQt9CwINC00LDQvdC90YvQvNC4XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVybCA9ICcnO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDQmtC70LDRgdGB0LAgRE9NLdGN0LvQtdC80LXQvdGC0LAg0LIg0LrQvtGC0L7RgNGL0Lkg0LHRg9C00LXRgiDQstGB0YLQsNCy0LvQtdC90LAg0LrQsNGA0YLQsFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5iYXNlID0gJy5iLXlhbmRleC1tYXBfX2Jhc2UnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdXRlck9wdGlvbnMgLSDQvdCw0YHRgtGA0L7QudC60Lgg0LjQtyDQstC90LXRiNC90LXQs9C+INGE0LDQudC70LBcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbml0WWFuZGV4TWFwIC0g0YTRg9C90LrRhtC40Y8g0L7QsdGA0LDRgtC90L7Qs9C+INCy0YvQt9C+0LLQsCwg0YHRgNCw0LHQsNGC0YvQstCw0LXRgiwg0LrQvtCz0LTQsCDQutCw0YDRgtCwINGD0LbQtSDQt9Cw0LPRgNGD0LfQuNC70LDRgdGMXG4gICAgICog0Lgg0L/QvtC60LDQt9GL0LLQsNC10YLRgdGPXG4gICAgICovXG4gICAgaW5pdChvdXRlck9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5tYXBXcmFwcGVyID0gb3V0ZXJPcHRpb25zLndyYXBwZXI7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHRoaXMubWFwV3JhcHBlci5xdWVyeVNlbGVjdG9yKHRoaXMuYmFzZSk7XG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLmNvbnRlbnQuaWQ7XG4gICAgICAgIHRoaXMudXJsID0gdGhpcy5tYXBXcmFwcGVyLmRhdGFzZXQuYWpheDtcbiAgICAgICAgdGhpcy5qc29uID0gdGhpcy5tYXBXcmFwcGVyLmRhdGFzZXQuanNvbjtcblxuICAgICAgICBpZiAodGhpcy5qc29uKSB7XG4gICAgICAgICAgICB0aGlzLmpzb24gPSBKU09OLnBhcnNlKGF0b2IodGhpcy5qc29uKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbXBsZXRlU2V0dGluZ3Mob3V0ZXJPcHRpb25zLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmluaXRZYW5kZXhNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0U2Nyb2xsWm9vbSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdE1hcmtlcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRUYWJzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q2lyY2xlcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU1vYmlsZURyYWcoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRMZWdlbmQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRHUFMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCd0LXQv9C+0YHRgNC10LTRgdGC0LLQtdC90L3QvtC1INGB0L7Qt9C00LDQvdC40LUg0Y3QutC30LXQvNC/0LvRj9GA0LAg0K/QvdC00LXQutGBINCa0LDRgNGCXG4gICAgICogQHBhcmFtIGluaXRNYXBDYWxsYmFjayAtINC60L7Qu9C70LHRjdC6INC+0YHRgtCw0LvRjNC90YvRhSDQvNC10YLQvtC00L7QsiDQvNC+0LTRg9C70Y8uINCh0YDQsNCx0L7RgtCw0Y7RgiDRgtC+0LvRjNC60L4g0YLQvtCz0LTQsCwg0LrQvtCz0LTQsCDQutCw0YDRgtCwINCx0YPQtNC10YIg0L/QvtC70L3QvtGB0YLRjNGOINGB0L7Qt9C00LDQvdCwXG4gICAgICovXG4gICAgaW5pdFlhbmRleE1hcChpbml0TWFwQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHt9KSB7XG4gICAgICAgIHRoaXMubWFwID0gbmV3IHRoaXMueW1hcHMuTWFwKHRoaXMuaWQsIHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICBpbml0TWFwQ2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBpbml0TGVnZW5kKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3MubGVnZW5kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgI
46184H1cblxuICAgICAgICBjb25zdCBDdXN0b21Db250cm9sQ2xhc3MgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICAgICAgQ3VzdG9tQ29udHJvbENsYXNzLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuXyRjb250ZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2dlb2NvZGVyRGVmZXJyZWQgPSBudWxsO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vINC90LDRgdC70LXQtNGD0LXQvCDQvtGCIGNvbGxlY3Rpb24uSXRlbVxuICAgICAgICB5bWFwcy51dGlsLmF1Z21lbnQoQ3VzdG9tQ29udHJvbENsYXNzLCB5bWFwcy5jb2xsZWN0aW9uLkl0ZW0sIHtcbiAgICAgICAgICAgIG9uQWRkVG9NYXA6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgICAgICAgICBDdXN0b21Db250cm9sQ2xhc3Muc3VwZXJjbGFzcy5vbkFkZFRvTWFwLmNhbGwodGhpcywgbWFwKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0Q2VudGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmdldFBhcmVudCgpLmdldENoaWxkRWxlbWVudCh0aGlzKS50aGVuKHRoaXMuX29uR2V0Q2hpbGRFbGVtZW50LCB0aGlzKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG9uUmVtb3ZlRnJvbU1hcDogZnVuY3Rpb24gKG9sZE1hcCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RDZW50ZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl8kY29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl8kY29udGVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwRXZlbnRHcm91cC5yZW1vdmVBbGwoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQ3VzdG9tQ29udHJvbENsYXNzLnN1cGVyY2xhc3Mub25SZW1vdmVGcm9tTWFwLmNhbGwodGhpcywgb2xkTWFwKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIF9vbkdldENoaWxkRWxlbWVudDogZnVuY3Rpb24gKHBhcmVudERvbUNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIC8vINCh0L7Qt9C00LDQtdC8IEhUTUwt0Y3Qu9C10LzQtdC90YIg0YEg0YLQtdC60YHRgtC+0LwuXG4gICAgICAgICAgICAgICAgdGhpcy5fJGNvbnRlbnQgPSAkKGxlZ2VuZFRlbXBsYXRlKCkpLmFwcGVuZFRvKHBhcmVudERvbUNvbnRhaW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBjdXN0b21Db250cm9sID0gbmV3IEN1c3RvbUNvbnRyb2xDbGFzcygpO1xuICAgICAgICB0aGlzLm1hcC5jb250cm9scy5hZGQoY3VzdG9tQ29udHJvbCwge1xuICAgICAgICAgICAgZmxvYXQ6ICdub25lJyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgIGxlZnQ6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaW5pdEdQUygpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzLmdwcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vINCh0L7Qt9C00LDQtdC8INGB0L7QsdGB0YLQstC10L3QvdGL0Lkg0LrQu9Cw0YHRgS5cbiAgICAgICAgY29uc3QgR1BTQ2xhc3MgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICAgICAgR1BTQ2xhc3Muc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5fJGNvbnRlbnQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fZ2VvY29kZXJEZWZlcnJlZCA9IG51bGw7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8g0Jgg0L3QsNGB0LvQtdC00YPQtdC8INC10LPQviDQvtGCIGNvbGxlY3Rpb24uSXRlbS5cbiAgICAgICAgeW1hcHMudXRpbC5hdWdtZW50KEdQU0NsYXNzLCB5bWFwcy5jb2xsZWN0aW9uLkl0ZW0sIHtcbiAgICAgICAgICAgIG9uQWRkVG9NYXA6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgICAgICAgICBHUFNDbGFzcy5zdXBlcmNsYXNzLm9uQWRkVG9NYXAuY2FsbCh0aGlzLCBtYXApO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RDZW50ZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UGFyZW50KCkuZ2V0Q2hpbGRFbGVtZW50KHRoaXMpLnRoZW4odGhpcy5fb25HZXRDaGlsZEVsZW1lbnQsIHRoaXMpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgb25SZW1vdmVGcm9tTWFwOiBmdW5jdGlvbiAob2xkTWFwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdENlbnRlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuXyRjb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuXyRjb250ZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXBFdmVudEdyb3VwLnJlbW92ZUFsbCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBHUFNDbGFzcy5zdXBlcmNsYXNzLm9uUmVtb3ZlRnJvbU1hcC5jYWxsKHRoaXMsIG9sZE1hcCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBfb25HZXRDaGlsZEVsZW1lbnQ6IGZ1bmN0aW9uIChwYXJlbnREb21Db250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAvLyDQodC+0LfQtNCw0LXQvCBIVE1MLdGN0LvQtdC80LXQvdGCINGBINGC0LXQutGB0YLQvtC8LlxuICAgICAgICAgICAgICAgIHRoaXMuXyRjb250ZW50ID0gJCgnPGJ1dHRvbiBjbGFzcz1cImIteWFuZGV4LW1hcF9fZ3BzLWJ0biBqLWdldC1nZW9sb2NhdGlvblwiPjwvYnV0dG9uPicpLmFwcGVuZFRvKHBhcmVudERvbUNvbnRhaW5lcik7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5fbWFwRXZlbnRHcm91cCA9IHRoaXMuZ2V0TWFwKCkuZXZlbnRzLmdyb3VwKCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBfY3JlYXRlUmVxdWVzdDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxhc3RDZW50ZXIgPSB0aGlzLl9sYXN0Q2VudGVyID0gdGhpcy5nZXRNYXAoKS5nZXRDZW50ZXIoKS5qb2luKCcsJyk7XG4gICAgICAgICAgICAgICAgLy8g0JfQsNC/0YDQsNGI0LjQstCw0LXQvCDQuNC90YTQvtGA0LzQsNGG0LjRjiDQviDQvNC10YHRgtC1INC/0L4g0LrQvtC+0YDQtNC40L3QsNG
46184C0LDQvCDRhtC10L3RgtGA0LAg0LrQsNGA0YLRiy5cbiAgICAgICAgICAgICAgICB5bWFwcy5nZW9jb2RlKHRoaXMuX2xhc3RDZW50ZXIsIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g0KPQutCw0LfRi9Cy0LDQtdC8LCDRh9GC0L4g0L7RgtCy0LXRgiDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0LIg0YTQvtGA0LzQsNGC0LUgSlNPTi5cbiAgICAgICAgICAgICAgICAgICAganNvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgLy8g0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10Lwg0LvQuNC80LjRgiDQvdCwINC60L7Quy3QstC+INC30LDQv9C40YHQtdC5INCyINC+0YLQstC10YLQtS5cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0czogMVxuICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyDQkdGD0LTQtdC8INC+0LHRgNCw0LHQsNGC0YvQstCw0YLRjCDRgtC+0LvRjNC60L4g0L7RgtCy0LXRgiDQvtGCINC/0L7RgdC70LXQtNC90LXQs9C+INC30LDQv9GA0L7RgdCwLlxuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdENlbnRlciA9PSB0aGlzLl9sYXN0Q2VudGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblNlcnZlclJlc3BvbnNlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIF9vblNlcnZlclJlc3BvbnNlOiBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgLy8g0JTQsNC90L3Ri9C1INC+0YIg0YHQtdGA0LLQtdGA0LAg0LHRi9C70Lgg0L/QvtC70YPRh9C10L3RiyDQuCDRgtC10L/QtdGA0Ywg0LjRhSDQvdC10L7QsdGF0L7QtNC40LzQviDQvtGC0L7QsdGA0LDQt9C40YLRjC5cbiAgICAgICAgICAgICAgICAvLyDQntC/0LjRgdCw0L3QuNC1INC+0YLQstC10YLQsCDQsiDRhNC+0YDQvNCw0YLQtSBKU09OLlxuICAgICAgICAgICAgICAgIHZhciBtZW1iZXJzID0gcmVzdWx0Lkdlb09iamVjdENvbGxlY3Rpb24uZmVhdHVyZU1lbWJlcixcbiAgICAgICAgICAgICAgICAgICAgZ2VvT2JqZWN0RGF0YSA9IChtZW1iZXJzICYmIG1lbWJlcnMubGVuZ3RoKSA/IG1lbWJlcnNbMF0uR2VvT2JqZWN0IDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoZ2VvT2JqZWN0RGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl8kY29udGVudC50ZXh0KGdlb09iamVjdERhdGEubWV0YURhdGFQcm9wZXJ0eS5HZW9jb2Rlck1ldGFEYXRhLnRleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZ3BzID0gbmV3IEdQU0NsYXNzKCk7XG4gICAgICAgIHRoaXMubWFwLmNvbnRyb2xzLmFkZChncHMsIHtcbiAgICAgICAgICAgIGZsb2F0OiAnbm9uZScsXG4gICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHRvcDogKHRoaXMuc2V0dGluZ3MuaGVpZ2h0IC8gMikgKyAxNixcbiAgICAgICAgICAgICAgICByaWdodDogMTVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0R2VvTG9jYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGdlb2xvY2F0aW9uID0geW1hcHMuZ2VvbG9jYXRpb247XG5cbiAgICAgICAgLy8g0KHRgNCw0LLQvdC40Lwg0L/QvtC70L7QttC10L3QuNC1LCDQstGL0YfQuNGB0LvQtdC90L3QvtC1INC/0L4gaXAg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GPINC4XG4gICAgICAgIC8vINC/0L7Qu9C+0LbQtdC90LjQtSwg0LLRi9GH0LjRgdC70LXQvdC90L7QtSDRgdGA0LXQtNGB0YLQstCw0LzQuCDQsdGA0LDRg9C30LXRgNCwLlxuICAgICAgICBnZW9sb2NhdGlvbi5nZXQoe1xuICAgICAgICAgICAgcHJvdmlkZXI6ICd5YW5kZXgnLFxuICAgICAgICAgICAgbWFwU3RhdGVBdXRvQXBwbHk6IHRydWVcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAvLyDQmtGA0LDRgdC90YvQvCDRhtCy0LXRgtC+0Lwg0L/QvtC80LXRgtC40Lwg0L/QvtC70L7QttC10L3QuNC1LCDQstGL0YfQuNGB0LvQtdC90L3QvtC1INGH0LXRgNC10LcgaXAuXG4gICAgICAgICAgICByZXN1bHQuZ2VvT2JqZWN0cy5vcHRpb25zLnNldCgncHJlc2V0JywgJ2lzbGFuZHMjcmVkQ2lyY2xlSWNvbicpO1xuICAgICAgICAgICAgcmVzdWx0Lmdlb09iamVjdHMuZ2V0KDApLnByb3BlcnRpZXMuc2V0KHtcbiAgICAgICAgICAgICAgICBiYWxsb29uQ29udGVudEJvZHk6ICfQnNC+0LUg0LzQtdGB0YLQvtC/0L7Qu9C+0LbQtdC90LjQtSdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbXlNYXAuZ2VvT2JqZWN0cy5hZGQocmVzdWx0Lmdlb09iamVjdHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBnZW9sb2NhdGlvbi5nZXQoe1xuICAgICAgICAgICAgcHJvdmlkZXI6ICdicm93c2VyJyxcbiAgICAgICAgICAgIG1hcFN0YXRlQXV0b0FwcGx5OiB0cnVlXG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgLy8g0KHQuNC90LjQvCDRhtCy0LXRgtC+0Lwg0L/QvtC80LXRgtC40Lwg0L/QvtC70L7QttC10L3QuNC1LCDQv9C+0LvRg9GH0LXQvdC90L7QtSDRh9C10YDQtdC3INCx0YDQsNGD0LfQtdGALlxuICAgICAgICAgICAgLy8g0JXRgdC70Lgg0LHRgNCw0YPQt9C10YAg0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YIg0Y3RgtGDINGE0YPQvdC60YbQuNC+0L3QsNC70YzQvdC+0YHRgtGMLCDQvNC10YLQutCwINC90LUg0LHRg9C00LXRgiDQtNC+0LHQsNCy0LvQtdC90LAg0L3QsCDQutCw0YDRgtGDLlxuICAgICAgICAgICAgcmVzdWx0Lmdlb09iamVjdHMub3B0aW9ucy5zZXQoJ3ByZXNldCcsICdpc2xhbmRzI2JsdWVDaXJjbGVJY29uJyk7XG4gICAgICAgICAgICBteU1hcC5nZW9PYmplY3RzLmFkZChyZXN1bHQuZ2VvT2JqZWN0cyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0LrQu9C10LjQstCw0LXRgiDQstGB0LUg0L3QsNGB0YLRgNC+0LnQutC4INC60LDRgNGC0Ysg0LIg0L7QtNC90YMg0L/QtdGA0LzQtdC90L3Rg9GOXG4gICAgICovXG4gICAgY29tcGxldGVTZXR0aW5ncy
46184hvdXRlck9wdGlvbnMsIGluaXRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge30pIHtcblxuICAgICAgICBpZiAodGhpcy51cmwpIHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdFNldHRpbmdzKHRoaXMuc2V0RGVmYXVsdFNldHRpbmdzKCkpO1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0U2V0dGluZ3ModGhpcy5nZXRTY3JpcHRTZXR0aW5ncyhvdXRlck9wdGlvbnMpKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0U2VydmVyU2V0dGluZ3ModGhpcy51cmwsIGluaXRDYWxsYmFjayk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29ubmVjdFNldHRpbmdzKHRoaXMuc2V0RGVmYXVsdFNldHRpbmdzKCkpO1xuICAgICAgICB0aGlzLmNvbm5lY3RTZXR0aW5ncyh0aGlzLmdldFNjcmlwdFNldHRpbmdzKG91dGVyT3B0aW9ucykpO1xuICAgICAgICB0aGlzLmNvbm5lY3RTZXR0aW5ncyh0aGlzLmpzb24pO1xuICAgICAgICBpbml0Q2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9C+0LvRg9GH0LDQtdGCINC90LDRgdGC0YDQvtC50LrQuCDQvtGCINGB0LXRgNCy0LXRgNCwXG4gICAgICovXG4gICAgZ2V0U2VydmVyU2V0dGluZ3ModXJsLCBzZXJ2ZXJTdWNjZXNzID0gZnVuY3Rpb24gKCkge30pIHtcbiAgICAgICAgVXRpbHMuc2VuZCgnJywgdXJsLCB7XG4gICAgICAgICAgICBzdWNjZXNzOiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3RTZXR0aW5ncyhyZXNwb25zZS5kYXRhKTtcblxuICAgICAgICAgICAgICAgIHNlcnZlclN1Y2Nlc3MoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihg0J/RgNC4INC30LDQs9GA0YPQt9C60LUg0L3QsNGB0YLRgNC+0LXQuiDRgSDRgdC10YDQstC10YDQsCDQv9GA0L7QuNC30L7RiNC70LAg0L7RiNC40LHQutCwOiAke2Vycm9yfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAnR0VUJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQutC70LXQuNCy0LDQtdGCINC60L7QvdC60YDRgtC10L3Rg9GOINC90LDRgdGC0YDQvtC50LrRgyDQsiDQvtCx0YnRg9GOINC90LDRgdGC0YDQvtC50LrRgyDQstGB0LXQuSDQutCw0YDRgtGLXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG91dGVyU2V0dGluZ3MgLSDQvtCx0YrQtdC60YIg0L3QsNGB0YLRgNC+0LXQuiDQutCw0YDRgtGLXG4gICAgICovXG4gICAgY29ubmVjdFNldHRpbmdzKG91dGVyU2V0dGluZ3MpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvdXRlclNldHRpbmdzID09PSBgb2JqZWN0YCkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnNldHRpbmdzLCBvdXRlclNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCj0YHRgtCw0L3QsNC70LjQstCw0LXRgiDQvdCw0YHRgtGA0L7QudC60Lgg0L/QviDRg9C80L7Qu9GH0LDQvdC40Y5cbiAgICAgKiBAcmV0dXJuIHt7Y2VudGVyOiB7bGF0LCBsbmd9LCB6b29tOiBudW1iZXIsIG1pblpvb206IG51bWJlciwgbWF4Wm9vbTogbnVtYmVyLCB6b29tU3RlcDogbnVtYmVyfX0gLVxuICAgICAqINC+0LHRitC10LrRgiDQvdCw0YHRgtGA0L7QtdC6INC60LDRgNGC0YtcbiAgICAgKi9cbiAgICBzZXREZWZhdWx0U2V0dGluZ3MoKSB7XG4gICAgICAgIGNvbnN0IGxhdENlbnRlciA9IDU5LjkzOTAxNDtcbiAgICAgICAgY29uc3QgbG5nQ2VudGVyID0gMzAuMzE1NTQ1O1xuXG4gICAgICAgIC8vINCy0YvRgdGH0LjRgtGL0LLQsNC10Lwg0LLRi9GB0L7RgtGDINC+0LHQtdGA0YLQutC4INC60LDRgNGC0YssINCwINGA0LDQstC90L4g0LLRi9GB0L7RgtGDINC60LDRgNGC0YssINC00LvRjyDQv9C+0LfQuNGG0LjQvtC90LjRgNC+0LLQsNC90LjRjyDRjdC70LXQvNC10L3RgtC+0LIg0YPQv9GA0LDQstC70LXQvdC40Y9cbiAgICAgICAgY29uc3QgaGVpZ2h0TWFwID0gdGhpcy5jb250ZW50Lm9mZnNldEhlaWdodDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2VudGVyICAgICAgICAgICAgICAgICA6IFtsYXRDZW50ZXIsIGxuZ0NlbnRlcl0sXG4gICAgICAgICAgICBtYXBUeXBlQ29udHJvbCAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICB6b29tICAgICAgICAgICAgICAgICAgIDogMTIsXG4gICAgICAgICAgICBtaW5ab29tICAgICAgICAgICAgICAgIDogMTAsXG4gICAgICAgICAgICBtYXhab29tICAgICAgICAgICAgICAgIDogMTgsXG4gICAgICAgICAgICB6b29tU3RlcCAgICAgICAgICAgICAgIDogMSxcbiAgICAgICAgICAgIGNvbnRyb2xzICAgICAgICAgICAgICAgOiBbXSxcbiAgICAgICAgICAgIHpvb21Db250cm9sICAgICAgICAgICAgOiB0cnVlLFxuICAgICAgICAgICAgY3VzdG9tWm9vbUNvbnRyb2wgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgZnVsbFNjcmVlbkNvbnRyb2wgICAgICA6IHRydWUsXG4gICAgICAgICAgICBjdXN0b21GdWxsU2NyZWVuQ29udHJvbDogZmFsc2UsXG4gICAgICAgICAgICBoZWlnaHQgICAgICAgICAgICAgICAgIDogaGVpZ2h0TWFwLFxuICAgICAgICAgICAgem9vbVNjcm9sbCAgICAgICAgICAgICA6IGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9GB0YLQsNC90LDQu9C40LLQsNC10YIg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC40LUg0L3QsNGB0YLRgNC+0LnQutC4XG4gICAgICogQHJldHVybiB7b2JqZWN0fSAtINC+0LHRitC10LrRgiDQvdCw0YHRgtGA0L7QtdC6INC60LDRgNGC0Ysg0LjQtyDRgdC60YDQuNC/0YLQsCDRgdC+INGB0YLRgNCw0L3QuNGG0YtcbiAgICAgKi9cbiAgICBnZXRTY3JpcHRTZXR0aW5ncyhvdXRlck9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG91dGVyT3B0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQlNC+0LHQsNCy0LvRj9C10Lwg0Y3Qu9C10LzQtdC90YLRiyDRg9C/0YDQsNCy0LvQtdC90LjRjyDQvdCwINC60LDRgNGC0YNcbiAgICAgKi9cbiAgICBpbml0Q29udHJvbHMoKSB7XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5oZWlnaHQpIHtcbiAgICAgICAgICAgIG1lZGlhdG9yLnN1YnNjcmliZSgndGFiU3dpdGNoZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5oZWlnaHQgPSB0aGlzLm1hcFdyYXBwZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgICAgI
46184HRoaXMuYWRkWm9vbUNvbnRyb2woKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFkZFpvb21Db250cm9sKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRGdWxsU2NyZWVuQ29udHJvbCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICog0JTQvtCx0LDQstC70Y/QtdGCINGN0LvQtdC80LXQvdGCINGD0L/RgNCw0LLQu9C10L3QuNGPINC80LDRgdGI0YLQsNCx0L7QvCDQutCw0YDRgtGLXG4gICAgKi9cbiAgICBhZGRab29tQ29udHJvbCgpIHtcbiAgICAgICAgLy8g0J/RgNC+0LLQtdGA0Y/QtdC8INC+0YLQutC70Y7Rh9C10L0g0LvQuCDQv9C+0LrQsNC3INGN0LvQtdC80LXQvdGC0L7QsiDRg9C/0YDQsNCy0LvQtdC90LjRjyDQstC+0L7QsdGJ0LVcbiAgICAgICAgLy8g0JXRgdC70Lgg0LTQsCwg0YLQviDQvdC40YfQtdCz0L4g0L3QtSDQv9C+0LrQsNC30YvQstCw0LXQvFxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3Muem9vbUNvbnRyb2wgfHwgdGhpcy5hZGRab29tQ29udHJvbC5mbGFnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyDQn9GA0L7QstC10YDRj9C10Lwg0L3Rg9C20L3QviDQu9C4INC/0L7QutCw0LfRi9Cy0LDRgtGMINC60LDRgdGC0L7QvNC90YvQuSDRjdC70LXQvNC10L3RgiDRg9C/0YDQsNCy0LvQtdC90LjQtVxuICAgICAgICAvLyDQldGB0LvQuCDQvdC10YIg0YLQviDQv9C+0LrQsNC30YvQstCw0LXQvCDRgdGC0LDQvdC00LDRgNGC0L3Ri9C1XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5jdXN0b21ab29tQ29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5tYXAuY29udHJvbHMuYWRkKGB6b29tQ29udHJvbGApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g0J/QvtC60LDQt9GL0LLQsNC10Lwg0LrQsNGB0YLQvtC80L3Ri9C1INGN0LvQtdC80LXQvdGC0Ysg0YPQv9GA0LDQstC70LXQvdC40LVcbiAgICAgICAgY29uc3Qgem9vbUNvbnRyb2wgPSBuZXcgeW1hcHMuY29udHJvbC5ab29tQ29udHJvbCh7XG4gICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgbGF5b3V0OiB0aGlzLmNyZWF0ZUxheW91dFpvb21Db250cm9sKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWFwLmNvbnRyb2xzLmFkZCh6b29tQ29udHJvbCwge1xuICAgICAgICAgICAgZmxvYXQgICA6ICdub25lJyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgdG9wICA6ICh0aGlzLm1hcFdyYXBwZXIub2Zmc2V0SGVpZ2h0IC8gMikgLSA3MCxcbiAgICAgICAgICAgICAgICByaWdodDogJzE1cHgnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFkZFpvb21Db250cm9sLmZsYWcgPSB0cnVlO1xuICAgIH1cblxuICAgIGluaXRTY3JvbGxab29tKCkge1xuICAgICAgICBjb25zdCBzY3JvbGxab29tID0gdGhpcy5zZXR0aW5ncy56b29tU2Nyb2xsO1xuICAgICAgICBzd2l0Y2ggKHNjcm9sbFpvb20pIHtcbiAgICAgICAgICAgIGNhc2UgdHJ1ZTpcbiAgICAgICAgICAgICAgICB0aGlzLm1hcC5iZWhhdmlvcnMuZW5hYmxlKCdzY3JvbGxab29tJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGZhbHNlOlxuICAgICAgICAgICAgICAgIHRoaXMubWFwLmJlaGF2aW9ycy5kaXNhYmxlKCdzY3JvbGxab29tJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0LXQvCDQtNC40LfQsNC50L3QtdGA0YHQutC40Lkg0Y3Qu9C10LzQtdC90YIg0YPQv9GA0LDQstC70LXQvdC40Y8g0LrQsNGA0YLQvtC5XG4gICAgICogQHJldHVybiB7b2JqZWN0fSAtINC+0LHRitC10LrRgiDQutCw0YHRgtC+0LzQvdC+0LPQviDQvNCw0LrQtdGC0LAg0LrQvdC+0L/QvtC6INC30YPQvNC80LjRgNC+0LLQsNC90LjRjyDQutCw0YDRgtGLXG4gICAgICovXG4gICAgY3JlYXRlTGF5b3V0Wm9vbUNvbnRyb2woKSB7XG4gICAgICAgIC8vINC10YHQu9C4INC90LAg0YHRgtGA0LDQvdC40YbQtSDQsdC+0LvQtdC1INC+0LTQvdC+0Lkg0LrQsNGA0YLRiywg0YLQviBpZCDQutC90L7Qv9C+0Log0LfRg9C80LzQuNGA0L7QstCw0L3QuNGPINC00L7Qu9C20L3RiyDQvtGC0LvQuNGH0LDRgtGM0YHRj1xuICAgICAgICAvLyDQuNC90LDRh9C1INC30YPQvCDQsdGD0LTQtdGCINGB0YDQsNCx0LDRgtGL0LLQsNGC0Ywg0L7QtNC90L7QstGA0LXQvNC10L3QvdC+INC90LAg0LLRgdC10YUg0LrQsNGA0YLQsNGFXG4gICAgICAgIC8vIG1hcElkINC/0LXRgNC10LTQsNC10Lwg0LIg0YjQsNCx0LvQvtC90L3Rg9GOINGB0YLRgNC+0LrRgyDQtNC70Y8g0YHQvtC30LTQsNC90LjRjyDRg9C90LjQutCw0LvRjNC90YvRhSBpZCDQutC90L7Qv9C+0LpcbiAgICAgICAgY29uc3QgbWFwSWQgPSB0aGlzLmlkO1xuXG4gICAgICAgIC8vINCh0L7Qt9C00LDQtNC40Lwg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC40Lkg0LzQsNC60LXRgiDQv9C+0LvQt9GD0L3QutCwINC80LDRgdGI0YLQsNCx0LAuXG4gICAgICAgIGNvbnN0IHpvb21MYXlvdXQgPSB5bWFwcy50ZW1wbGF0ZUxheW91dEZhY3RvcnkuY3JlYXRlQ2xhc3MoY29udHJvbHNUZW1wbGF0ZSh7aWQ6IG1hcElkfSksIHtcblxuICAgICAgICAgICAgICAgIC8vINCf0LXRgNC10L7Qv9GA0LXQtNC10LvRj9C10Lwg0LzQtdGC0L7QtNGLINC80LDQutC10YLQsCwg0YfRgtC+0LHRiyDQstGL0L/QvtC70L3Rj9GC0Ywg0LTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSDQtNC10LnRgdGC0LLQuNGPXG4gICAgICAgICAgICAgICAgLy8g0L/RgNC4INC/0L7RgdGC0YDQvtC10L3QuNC4INC4INC+0YfQuNGB0YLQutC1INC80LDQutC10YLQsC5cbiAgICAgICAgICAgICAgICBidWlsZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vINCS0YvQt9GL0LLQsNC10Lwg0YDQvtC00LjRgtC10LvRjNGB0LrQuNC5INC80LXRgtC+0LQgYnVpbGQuXG4gICAgICAgICAgICAgICAgICAgIHpvb21MYXlvdXQuc3VwZXJjbGFzcy5idWlsZC5jYWxsKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vINCf0YDQuNCy0Y/Qt9GL0LLQsNC10Lwg0YTRg9C90LrRhtC40Lgt0L7QsdGA0LDQsdC+0YLRh9C40LrQuCDQuiDQutC+0L3RgtC10LrRgdGC0YMg0Lgg0YHQvtGF0YDQsNC90Y/QtdC8INGB0YHRi9C70LrQuFxuICAgICAgICAgICAgICAgICAgICAvLyDQvdCwINC90LjRhSwg0YfRgtC+0LHRiyDQv9C+0YLQvtC8INC+0YLQv9C40YHQsNGC0YzRgdGPINC+0YIg0YHQvtCx0YvRgtC40LkuXG4gICAgICAgICAgICAgICAgICAgI
46184HRoaXMuem9vbUluQ2FsbGJhY2sgPSB5bWFwcy51dGlsLmJpbmQodGhpcy56b29tSW4sIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb21PdXRDYWxsYmFjayA9IHltYXBzLnV0aWwuYmluZCh0aGlzLnpvb21PdXQsIHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vINCd0LDRh9C40L3QsNC10Lwg0YHQu9GD0YjQsNGC0Ywg0LrQu9C40LrQuCDQvdCwINC60L3QvtC/0LrQsNGFINC80LDQutC10YLQsC5cbiAgICAgICAgICAgICAgICAgICAgJChgIyR7bWFwSWR9LWluYCkuYmluZCgnY2xpY2snLCB0aGlzLnpvb21JbkNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgJChgIyR7bWFwSWR9LW91dGApLmJpbmQoJ2NsaWNrJywgdGhpcy56b29tT3V0Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBjbGVhcjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vINCh0L3QuNC80LDQtdC8INC+0LHRgNCw0LHQvtGC0YfQuNC60Lgg0LrQu9C40LrQvtCyLlxuICAgICAgICAgICAgICAgICAgICAkKGAjJHttYXBJZH0taW5gKS51bmJpbmQoJ2NsaWNrJywgdGhpcy56b29tSW5DYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgICQoYCMke21hcElkfS1vdXRgKS51bmJpbmQoJ2NsaWNrJywgdGhpcy56b29tT3V0Q2FsbGJhY2spO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vINCS0YvQt9GL0LLQsNC10Lwg0YDQvtC00LjRgtC10LvRjNGB0LrQuNC5INC80LXRgtC+0LQgY2xlYXIuXG4gICAgICAgICAgICAgICAgICAgIHpvb21MYXlvdXQuc3VwZXJjbGFzcy5jbGVhci5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICB6b29tSW46IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFwID0gdGhpcy5nZXREYXRhKCkuY29udHJvbC5nZXRNYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgbWFwLnNldFpvb20obWFwLmdldFpvb20oKSArIDEsIHtjaGVja1pvb21SYW5nZTogdHJ1ZX0pO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICB6b29tT3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hcCA9IHRoaXMuZ2V0RGF0YSgpLmNvbnRyb2wuZ2V0TWFwKCk7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5zZXRab29tKG1hcC5nZXRab29tKCkgLSAxLCB7Y2hlY2tab29tUmFuZ2U6IHRydWV9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHpvb21MYXlvdXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JTQvtCx0LDQstC70Y/QtdGCINC60L3QvtC/0LrRgyDQvtGC0LrRgNGL0YLQuNGPINC60LDRgNGC0Ysg0L3QsCDQv9C+0LvQvdGL0Lkg0Y3QutGA0LDQvVxuICAgICAqL1xuICAgIGFkZEZ1bGxTY3JlZW5Db250cm9sKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3MuZnVsbFNjcmVlbkNvbnRyb2wpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5jdXN0b21GdWxsU2NyZWVuQ29udHJvbCkge1xuICAgICAgICAgICAgbGV0IHRha2VPcHRpb25zID0ge307XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmZ1bGxTY3JlZW5Db250cm9sT3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHRha2VPcHRpb25zID0gdGhpcy5zZXR0aW5ncy5mdWxsU2NyZWVuQ29udHJvbE9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZ1bGxzY3JlZW5Db250cm9sID0gbmV3IHltYXBzLmNvbnRyb2wuRnVsbHNjcmVlbkNvbnRyb2woe1xuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRha2VPcHRpb25zXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5tYXAuY29udHJvbHMuYWRkKGZ1bGxzY3JlZW5Db250cm9sKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8v0YLRg9GCINCy0YvQt9GL0LLQsNC10Lwg0LzQtdGC0L7QtCDRgdC+0LfQtNCw0Y7RidC40Lkg0LrQsNGB0YLQvtC80L3Ri9C5INC60L7QvdGC0YDQvtC7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/QvtC60LDQt9GL0LLQsNC10Lwg0LzQsNGA0LrQtdGA0Ysg0L7QsdGK0LXQutGC0L7QsiDQuNC90YTRgNCw0YHRgtGA0YPQutGC0YPRgNGLINC90LAg0LrQsNGA0YLQtVxuICAgICAqL1xuICAgIGluaXRNYXJrZXJzKCkge1xuICAgICAgICBjb25zdCBtYXJrZXJzID0gdGhpcy5zZXR0aW5ncy5tYXJrZXJzO1xuXG4gICAgICAgIGlmICh0eXBlb2YgbWFya2VycyAhPT0gYG9iamVjdGApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmh0bWxNYXJrZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRIdG1sTWFya2VycygpO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFya2Vycy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAvLyDQv9GA0L7QstC10YDRj9C10Lwg0LXRgdGC0Ywg0LvQuCDRgdCy0L7QudGB0YLQstC+IG9mZnNldCDRgyDQvNCw0YDQutC10YDQsCwg0LXRgdC70Lgg0L3QtdGCXG4gICAgICAgICAgICAvLyDRgdC+0LfQtNCw0LXQvCDQvNCw0YHRgdC40LIg0LfQvdCw0YfQtdC90LjQuSDRgdC80LXRidC10L3QuNGPINC80LDRgNC60LXRgNCwINC90LAg0L/QvtC70L7QstC40L3RgyDRgdCy0L7QtdC5INGI0LjRgNC40L3RiyDQuCDQstGL0YHQvtGC0YtcbiAgICAgICAgICAgIC8vINC00LvRjyDRgtC+0LPQviwg0YfRgtC+INCx0Ysg0LrQvtC+0YDQtNC40L3QsNGC0LAg0LzQsNGA0LrQtdGA0LAg0Lgg0YbQtdC90YLRgCDQuNC60L7QvdC60Lgg0LzQsNGA0LrQtdGA0LAg0LHRi9C70Lgg0YHQvtCy0LzQtdGJ0LXQvdGLXG4gICAgICAgICAgICBjb25zdCBtYXJrZXJPZmZzZXQgPSBlbGVtZW50Lm9mZnNldCA/IGVsZW1lbnQub2Zmc2V0IDogZWxlbWVudC5zaXplLm1hcCgoc2l6ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAtKHNpemUgLyAyKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vINC/0YDQvtCy0LXRgNGP0LXQvCDRj9Cy0LvRj9C10YLRgdGPINC70Lgg0LzQsNGA0LrQtdGAINC80LDRgNC60LXRgNC+0Lwg0JbQmi5cbiAgICAgICAgICAgIGxldCBpY29uQmFsbG9vbiA9IGBgO1xuICAgICAgICAgICAgbGV0IG9iamVjdFR5cGUgPSBgYDtcbiAgICAgICAgICAgIGNvbnN0IGJhbGxvb25Mb2dvID0gZWxlbWVudC5sb2dvIHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgYmFsbG9vbkxpbmsgPSBlbGVtZW50LmxpbmsgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCBjb21wbGV4ID0gYGNvbXBsZXhgO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWNvbkJhbGxvb24gPSBlbGVtZW50Lmljb25CYWxsb29uO1xuICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPSBpY29uQmFsbG9vbiA/IGNvbXBsZXggOiBmYWxzZTtcbiAgICAgICAgICAgI
46184H0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWNvbkJhbGxvb24gPSBlbGVtZW50Lmljb25CYWxsb29uID8gZWxlbWVudC5pY29uQmFsbG9vbiA6IGVsZW1lbnQuaWNvbjtcbiAgICAgICAgICAgICAgICBvYmplY3RUeXBlID0gZWxlbWVudC5vYmplY3RUeXBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDQtdGB0LvQuCDQsiDQvtCx0YrQtdC60YLQtSDQvNCw0YDQutC10YDQsCDQvdC10YIg0L3QuCDRgtC10LrRgdGC0LAg0L3QuCDQt9Cw0LPQvtC70L7QstC60LAsINGC0L4g0LHQsNC70LvRg9C9INC90LUg0L/QvtC60LDQt9GL0LLQsNC10LxcbiAgICAgICAgICAgIGlmICghZWxlbWVudC50aXRsZSAmJiAhZWxlbWVudC50ZXh0KSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcmtlciA9IG5ldyB5bWFwcy5QbGFjZW1hcmsoZWxlbWVudC5jb29yZHMsIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogZWxlbWVudC50eXBlXG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBpY29uTGF5b3V0ICAgICA6ICdkZWZhdWx0I2ltYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgaWNvbkltYWdlSHJlZiAgOiBlbGVtZW50Lmljb24sXG4gICAgICAgICAgICAgICAgICAgIGljb25JbWFnZVNpemUgIDogZWxlbWVudC5zaXplLFxuICAgICAgICAgICAgICAgICAgICBpY29uSW1hZ2VPZmZzZXQ6IG1hcmtlck9mZnNldFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5tYXAuZ2VvT2JqZWN0cy5hZGQobWFya2VyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlQmFsbG9uT25DbGlja01hcCgpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDQstGL0LLQvtC00LjQvCDQutC70LDRgdGBINC80L7QtNC40YTQuNC60LDRgtC+0YAg0LTQu9GPINGA0LDQt9C80LXRgtC60Lgg0LHQsNC70LvRg9C90LAg0LzQsNGA0LrQtdGA0LAg0JbQmiwg0LLQvdC1INC30LDQstC40YHQuNC80L7RgdGC0LggLSDQtdGB0YLRjCDQsiDQvtCx0YrQtdC60YLQtSDQvNCw0YDQutC10YDQsFxuICAgICAgICAgICAgLy8gb2JqZWN0VHlwZSDQuNC70Lgg0L3QtdGCXG5cbiAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IG5ldyB5bWFwcy5QbGFjZW1hcmsoZWxlbWVudC5jb29yZHMsIHtcbiAgICAgICAgICAgICAgICB0eXBlICAgICAgICAgIDogZWxlbWVudC50eXBlLFxuICAgICAgICAgICAgICAgIGJhbGxvb25JY29uICAgOiAob2JqZWN0VHlwZSAhPT0gdW5kZWZpbmVkKT8gZWxlbWVudC5pbWFnZSA6IGljb25CYWxsb29uLFxuICAgICAgICAgICAgICAgIGJhbGxvb25IZWFkZXIgOiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgICAgICAgIGJhbGxvb25Db250ZW50OiBlbGVtZW50LnRleHQsXG4gICAgICAgICAgICAgICAgYmFsbG9vbkxvZ28gICA6IGJhbGxvb25Mb2dvLFxuICAgICAgICAgICAgICAgIGhpbnRDb250ZW50ICAgOiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGJhbGxvb25TaGFkb3cgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGJhbGxvb25MYXlvdXQgICAgICAgICA6IHRoaXMuY3JlYXRlQmFsbG9vbkxheW91dChvYmplY3RUeXBlKSxcbiAgICAgICAgICAgICAgICBiYWxsb29uQ29udGVudExheW91dCAgOiB0aGlzLmNyZWF0ZUJhbGxvb25Db250ZW50TGF5b3V0KGljb25CYWxsb29uLCBiYWxsb29uTG9nbywgYmFsbG9vbkxpbmspLFxuICAgICAgICAgICAgICAgIGJhbGxvb25QYW5lbE1heE1hcEFyZWE6IDAsXG4gICAgICAgICAgICAgICAgLy8gaGludExheW91dCAgICAgICAgICAgIDogdGhpcy5jcmVhdGVCYWxsb29uTGF5b3V0KG9iamVjdFR5cGUpLFxuICAgICAgICAgICAgICAgIC8vIGhpbnRDb250ZW50TGF5b3V0ICAgICA6IHRoaXMuY3JlYXRlQmFsbG9vbkNvbnRlbnRMYXlvdXQoaWNvbkJhbGxvb24pLFxuICAgICAgICAgICAgICAgIC8vINCd0LUg0YHQutGA0YvQstCw0LXQvCDQuNC60L7QvdC60YMg0L/RgNC4INC+0YLQutGA0YvRgtC+0Lwg0LHQsNC70YPQvdC1LlxuICAgICAgICAgICAgICAgIGhpZGVJY29uT25CYWxsb29uT3BlbiA6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGljb25MYXlvdXQgICAgICAgICAgICA6ICdkZWZhdWx0I2ltYWdlJyxcbiAgICAgICAgICAgICAgICBpY29uSW1hZ2VIcmVmICAgICAgICAgOiBlbGVtZW50Lmljb24sXG4gICAgICAgICAgICAgICAgaWNvbkltYWdlU2l6ZSAgICAgICAgIDogZWxlbWVudC5zaXplLFxuICAgICAgICAgICAgICAgIGljb25JbWFnZU9mZnNldCAgICAgICA6IG1hcmtlck9mZnNldFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMubWFwLmdlb09iamVjdHMuYWRkKG1hcmtlcik7XG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/QvtC60LDQt9GL0LLQsNC10LwgaHRtbCDQvNCw0YDQutC10YDRiyDQvtCx0YrQtdC60YLQvtCyINC40L3RhNGA0LDRgdGC0YDRg9C60YLRg9GA0Ysg0L3QsCDQutCw0YDRgtC1XG4gICAgICovXG4gICAgaW5pdEh0bWxNYXJrZXJzKCkge1xuICAgICAgICBjb25zdCBodG1sTWFya2VycyA9IHRoaXMuc2V0dGluZ3MuaHRtbE1hcmtlcnM7XG5cbiAgICAgICAgbGV0IHRlbXBsYXRlID0gbnVsbDtcblxuICAgICAgICBodG1sTWFya2Vycy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGVsZW1lbnQubGF5b3V0KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbWFpbic6XG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gbWFpbkh0bWxNYXJrZXI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NlY29uZGFyeSc6XG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gc2Vjb25kYXJ5SHRtbE1hcmtlcjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGV4dEh0bWxNYXJrZXI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgI
46184HRlbXBsYXRlID0gbWFpbkh0bWxNYXJrZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBlbGVtZW50OyAvL9Ca0LDQui3RgtC+INC/0L4g0LTRgNGD0LPQvtC80YMg0L/QtdGA0LXQtNCw0LLQsNGC0LDRgtGMINC90LDRgdGC0YDQvtC50LrQuFxuXG4gICAgICAgICAgICBjb25zdCBDdXN0b21MYXlvdXRDbGFzcyA9IHltYXBzLnRlbXBsYXRlTGF5b3V0RmFjdG9yeS5jcmVhdGVDbGFzcyh0ZW1wbGF0ZShwcm9wZXJ0aWVzKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBsYWNlbWFyayA9IG5ldyB5bWFwcy5QbGFjZW1hcmsoZWxlbWVudC5jb29yZHMsIHtcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBpY29uTGF5b3V0OiBDdXN0b21MYXlvdXRDbGFzc1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMubWFwLmdlb09iamVjdHMuYWRkKHBsYWNlbWFyayk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J3QsNCy0LXRiNC40LLQsNC10YIg0L7QsdGA0LDQsdC+0YLRh9C60Lgg0YHQvtCx0YvRgtC40Y8g0LrQu9C40Log0L/QviDQutCw0YDRgtC1INC4INCz0LXQvtCx0YrQtdC60YLQsNC8INC00LvRjyDQt9Cw0LrRgNGL0YLQuNGPINCx0LDQu9GD0L3QvtCyLlxuICAgICAqL1xuICAgIGNsb3NlQmFsbG9uT25DbGlja01hcCgpIHtcbiAgICAgICAgdGhpcy5tYXAuZ2VvT2JqZWN0cy5ldmVudHMuYWRkKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWFwLmJhbGxvb24uY2xvc2UoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5tYXAuZXZlbnRzLmFkZCgnY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1hcC5iYWxsb29uLmNsb3NlKCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGljb25CYWxsb29uIC0g0YHRgtGA0L7QutCwOiDQt9C90LDRh9C10L3QuNC1INGB0LLQvtC50YHRgtCy0LAgaWNvbkJhbGxvb24g0L7QsdGK0LXQutGC0LAg0LzQsNGA0LrQtdGA0LBcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtINC+0LHRitC10LrRgiDQvNCw0LrQtdGC0LAg0LrQvtC90YLQtdC90YLQsCDQsdCw0LvRg9C90LBcbiAgICAgKi9cbiAgICBjcmVhdGVCYWxsb29uQ29udGVudExheW91dChpY29uQmFsbG9vbiwgYmFsbG9vbkxvZ28sIGJhbGxvb25MaW5rKSB7XG4gICAgICAgIGxldCBpY29uSHRtbCA9IGBgO1xuICAgICAgICBsZXQgbG9nb0h0bWwgPSBgYDtcbiAgICAgICAgbGV0IGxpbmtIdG1sID0gYGA7XG5cbiAgICAgICAgaWYgKGljb25CYWxsb29uKSB7XG4gICAgICAgICAgICBpY29uSHRtbCA9IGA8aW1nIGNsYXNzPVwiYi15YW5kZXgtbWFwX19iYWxsb29uLWljb25cIiBzcmM9XCIkW3Byb3BlcnRpZXMuYmFsbG9vbkljb25dXCIgYWx0PVwiaWNvbiBtYXBcIj5gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJhbGxvb25Mb2dvKSB7XG4gICAgICAgICAgICBsb2dvSHRtbCA9IGA8aW1nIGNsYXNzPVwiYi15YW5kZXgtbWFwX19iYWxsb29uLWxvZ29cIiBzcmM9XCIkW3Byb3BlcnRpZXMuYmFsbG9vbkxvZ29dXCI+YFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJhbGxvb25MaW5rKSB7XG4gICAgICAgICAgICBsaW5rSHRtbCA9IGA8YSBocmVmPVwiJHtiYWxsb29uTGlua31cIiBjbGFzcz1cImIteWFuZGV4LW1hcF9fYmFsbG9vbi1saW5rXCI+JHtsaW5rSHRtbEJhbGxvb24oKX0g0J/QvtC00YDQvtCx0L3QtdC1PC9hPmA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImIteWFuZGV4LW1hcF9fYmFsbG9vbi1pbWctd3JhcFwiPlxuICAgICAgICAgICAgICAgICR7aWNvbkh0bWx9XG4gICAgICAgICAgICAgICAgJHtsb2dvSHRtbH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImIteWFuZGV4LW1hcF9fYmFsbG9vbi10aXRsZVwiPiRbcHJvcGVydGllcy5iYWxsb29uSGVhZGVyXTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImIteWFuZGV4LW1hcF9fYmFsbG9vbi1jb250ZW50XCI+JFtwcm9wZXJ0aWVzLmJhbGxvb25Db250ZW50XTwvZGl2PlxuICAgICAgICAgICAgJHtsaW5rSHRtbH1cbiAgICAgICAgICAgIGA7XG5cbiAgICAgICAgY29uc3QgYmFsbG9vbkNvbnRlbnRMYXlvdXQgPSB5bWFwcy50ZW1wbGF0ZUxheW91dEZhY3RvcnkuY3JlYXRlQ2xhc3MoaHRtbCk7XG5cbiAgICAgICAgcmV0dXJuIGJhbGxvb25Db250ZW50TGF5b3V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTW9kaWZ5IC0g0YHRgtGA0L7QutCwOiDQt9C90LDRh9C10L3QuNC1INGB0LLQvtC50YHRgtCy0LAgb2JqZWN0VHlwZSDQvtCx0YrQtdC60YLQsCDQvNCw0YDQutC10YDQsFxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IC0g0L7QsdGK0LXQutGCINC80LDQutC10YLQsCDQsdCw0LvQu9GD0L3QsFxuICAgICAqL1xuICAgIGNyZWF0ZUJhbGxvb25MYXlvdXQoY2xhc3NNb2RpZnkpIHtcbiAgICAgICAgY29uc3QgYmFsbG9vbkNsYXNzID0gYGIteWFuZGV4LW1hcF9fYmFsbG9vbmA7XG4gICAgICAgIGNvbnN0IGJhbGxvb21DbGFzc01vZGlmeSA9IGNsYXNzTW9kaWZ5ID8gYCR7YmFsbG9vbkNsYXNzfV90aGVtZV8ke2NsYXNzTW9kaWZ5fWAgOiBgYDtcbiAgICAgICAgY29uc3QgYmFsbG9vbkNsb3NlID0gYGItbWFwLWJhbGxvb25fX2Nsb3NlYDtcbiAgICAgICAgY29uc3QgYmFsbG9vbkFycm93ID0gYGItbWFwLWJhbGxvb25fX2Fycm93YDtcbiAgICAgICAgY29uc3QgYmFsbG9vbkNvbnRlbnRXcmFwID0gYGItbWFwLWJhbGxvb25fX2NvbnRlbnQtd3JhcGA7XG4gICAgICAgIGNvbnN0IGNsYXNzVGFiID0gYC5iLW1hcC10YWJzX19pdGVtYDtcbiAgICAgICAgY29uc3QgdGFiSXRlbXMgPSBbLi4udGhpcy5tYXBXcmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoY2xhc3NUYWIpXTtcbiAgICAgICAgY29uc3QgY3VzdG9tQmFsbG9vbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5iLXlhbmRleC1tYXBfX2luZm8nKTtcblxuICAgICAgICAvLyDQodC+0LfQtNCw0L3QuNC1INC80LDQutC10YLQsCDQsdCw0LvRg9C90LBcbiAgICAgICAgY29uc3QgYmFsbG9vbkxheW91dCA9IHltYXBzLnRlbXBsYXRlTGF5b3V0RmFjdG9yeS5jcmVhdGVDbGFzcyhcbiAgICAgICAgICAgIGA8ZGl2IGNsYXNzPVwiJHtiYWxsb29uQ2xhc3N9ICR7YmFsbG9vbUNsYXNzTW9kaWZ5fVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIke2JhbGxvb25DbG9zZX1cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiJHtiYWxsb29uQXJyb3d9XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiR7YmFsbG9vbkNvbnRlbnRXcmFwfVwiPlxuICAgICAgICAgICAgICAgICAgICAkW1tvcHRpb25zLmNvbn
46184RlbnRMYXlvdXRdXVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YCwge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqINCh0YLRgNC+0LjRgiDRjdC60LfQtdC80L/Qu9GP0YAg0LzQsNC60LXRgtCwINC90LAg0L7RgdC90L7QstC1INGI0LDQsdC70L7QvdCwINC4INC00L7QsdCw0LLQu9GP0LXRgiDQtdCz0L4g0LIg0YDQvtC00LjRgtC10LvRjNGB0LrQuNC5IEhUTUwt0Y3Qu9C10LzQtdC90YIuXG4gICAgICAgICAgICAgICAgICogQHNlZSBodHRwczovL2FwaS55YW5kZXgucnUvbWFwcy9kb2MvanNhcGkvMi4xL3JlZi9yZWZlcmVuY2UvbGF5b3V0LnRlbXBsYXRlQmFzZWQuQmFzZS54bWwjYnVpbGRcbiAgICAgICAgICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgKiBAbmFtZSBidWlsZFxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGJ1aWxkOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLnN1cGVyY2xhc3MuYnVpbGQuY2FsbCh0aGlzKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZWxlbWVudCA9ICQoYC4ke2JhbGxvb25DbGFzc31gLCB0aGlzLmdldFBhcmVudEVsZW1lbnQoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUVsZW1lbnRPZmZzZXQoKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZWxlbWVudC5maW5kKGAuJHtiYWxsb29uQ2xvc2V9YClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5vbignY2xpY2snLCAkLnByb3h5KHRoaXMub25DbG9zZUNsaWNrLCB0aGlzKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGFiSXRlbXMuZm9yRWFjaCgodGFiKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAkLnByb3h5KHRoaXMub25DbG9zZUNsaWNrLCB0aGlzKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21CYWxsb29uLmlubmVySFRNTCA9IHRoaXMuXyRlbGVtZW50WzBdLmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZUN1c3RvbUJhbGxvb24oKTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgY2xvc2VDdXN0b21CYWxsb29uKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbG9zZUJ0biA9IGN1c3RvbUJhbGxvb24ucXVlcnlTZWxlY3RvcignLmItbWFwLWJhbGxvb25fX2Nsb3NlJyk7XG4gICAgICAgICAgICAgICAgICAgIGNsb3NlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VCdG4ucGFyZW50RWxlbWVudC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqINCj0LTQsNC70Y/QtdGCINGB0L7QtNC10YDQttC40LzQvtC1INC80LDQutC10YLQsCDQuNC3IERPTS5cbiAgICAgICAgICAgICAgICAgKiBAc2VlIGh0dHBzOi8vYXBpLnlhbmRleC5ydS9tYXBzL2RvYy9qc2FwaS8yLjEvcmVmL3JlZmVyZW5jZS9sYXlvdXQudGVtcGxhdGVCYXNlZC
461845CYXNlLnhtbCNjbGVhclxuICAgICAgICAgICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY2xlYXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZWxlbWVudC5maW5kKGAuJHtiYWxsb29uQ2xvc2V9YClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5vZmYoJ2NsaWNrJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5zdXBlcmNsYXNzLmNsZWFyLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqINCc0LXRgtC+0LQg0LHRg9C00LXRgiDQstGL0LfQstCw0L0g0YHQuNGB0YLQtdC80L7QuSDRiNCw0LHQu9C+0L3QvtCyINCQ0J/QmCDQv9GA0Lgg0LjQt9C80LXQvdC10L3QuNC4INGA0LDQt9C80LXRgNC+0LIg0LLQu9C+0LbQtdC90L3QvtCz0L4g0LzQsNC60LXRgtCwLlxuICAgICAgICAgICAgICAgICAqIEBzZWUgaHR0cHM6Ly9hcGkueWFuZGV4LnJ1L21hcHMvZG9jL2pzYXBpLzIuMS9yZWYvcmVmZXJlbmNlL0lCYWxsb29uTGF5b3V0LnhtbCNldmVudC11c2VyY2xvc2VcbiAgICAgICAgICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgKiBAbmFtZSBvblN1YmxheW91dFNpemVDaGFuZ2VcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBvblN1YmxheW91dFNpemVDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBiYWxsb29uTGF5b3V0LnN1cGVyY2xhc3Mub25TdWJsYXlvdXRTaXplQ2hhbmdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0VsZW1lbnQodGhpcy5fJGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RWxlbWVudE9mZnNldCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzLmZpcmUoJ3NoYXBlY2hhbmdlJyk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqINCh0LTQstC40LPQsNC10Lwg0LHQsNC70YPQvSwg0YfRgtC+0LHRiyBcItGF0LLQvtGB0YLQuNC6XCIg0YPQutCw0LfRi9Cy0LDQuyDQvdCwINGC0L7Rh9C60YMg0L/RgNC40LLRj9C30LrQuC5cbiAgICAgICAgICAgICAgICAgKiBAc2VlIGh0dHBzOi8vYXBpLnlhbmRleC5ydS9tYXBzL2RvYy9qc2FwaS8yLjEvcmVmL3JlZmVyZW5jZS9JQmFsbG9vbkxheW91dC54bWwjZXZlbnQtdXNlcmNsb3NlXG4gICAgICAgICAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICogQG5hbWUgYXBwbHlFbGVtZW50T2Zmc2V0XG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgYXBwbHlFbGVtZW50T2Zmc2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fJGVsZW1lbnQuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qbGVmdDogLSh0aGlzLl8kZWxlbWVudFswXS5vZmZzZXRXaWR0aCAvIDIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wIDogLSh0aGlzLl8kZWxlbWVudFswXS5vZmZzZXRIZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRlbGVtZW50LmZpbmQoYC4ke2JhbGxvb25BcnJvd31gKVswXS5vZmZzZXRIZWlnaHQgKiAyKSovXG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJ1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICog0JfQsNC60YDRi9Cy0LDQtdGCINCx0LDQu9GD0L0g0L/RgNC4INC60LvQuNC60LUg0L3QsCDQutGA0LXRgdGC0LjQuiwg0LrQuNC00LDRjyDRgdC+0LHRi9GC0LjQtSBcInVzZXJjbG9zZVwiINC90LAg0LzQsNC60LXRgtC1LlxuICAgICAgICAgICAgICAgICAqIEBzZWUgaHR0cHM6Ly9hcGkueWFuZGV4LnJ1L21hcHMvZG9jL2pzYXBpLzIuMS9yZWYvcmVmZXJlbmNlL0lCYWxsb29uTGF5b3V0LnhtbCNldmVudC11c2VyY2xvc2VcbiAgICAgICAgICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0ge2V2ZW50fSBldmVudCAtINGB0L7QsdGL0YLQuNC1XG4gICAgICAgICAgICAgICAgICogQG5hbWUgb25DbG9zZUNsaWNrXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgb25DbG9zZUNsaWNrOiBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzLmZpcmUoJ3VzZXJjbG9zZScpO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiDQmNGB0L/QvtC70YzQt9GD0LXRgtGB0Y8g0LTQu9GPINCw0LLRgtC+0L/QvtC30LjRhtC40L7QvdC40YDQvtCy0LDQvdC40Y8gKGJhbGxvb25BdXRvUGFuKS5cbiAgICAgICAgICAgICAgICAgKiBAc2VlIGh0dHBzOi8vYXBpLnlhbmRleC5ydS9tYXBzL2RvYy9qc2FwaS8yLjEvcmVmL3JlZmVyZW5jZS9JTGF5b3V0LnhtbCNnZXRDbGllbnRCb3VuZHNcbiAgICAgICAgICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtINCa0L7QvtGA0LTQuNC90LDRgtGLINC70LXQstC+0LPQviDQstC10YDRhdC90LXQs9C+INC4INC/0YDQsNCy0L7Qs9C+INC90LjQttC90LXQs9C+INGD0LPQu9C+0LIg0YjQsNCx0LvQvtC90LAg0L7RgtC90L7RgdC40YLQtdC70YzQvdC+XG4gICAgICAgICAgICAgICAgICog0YLQvtGH0LrQuCDQv9GA0LjQstGP0LfQutC4LlxuICAgICAgICAgICAgICAgICAqIEBuYW1lIGdldFNoYXBlXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgZ2V0U2hhcGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lzRWxlbWVudCh0aGlzLl8kZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgI
46184HJldHVybiBiYWxsb29uTGF5b3V0LnN1cGVyY2xhc3MuZ2V0U2hhcGUuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuXyRlbGVtZW50LnBvc2l0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB5bWFwcy5zaGFwZS5SZWN0YW5nbGUobmV3IHltYXBzLmdlb21ldHJ5LnBpeGVsLlJlY3RhbmdsZShbXG4gICAgICAgICAgICAgICAgICAgICAgICBbcG9zaXRpb24ubGVmdCwgcG9zaXRpb24udG9wXSwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLmxlZnQgKyB0aGlzLl8kZWxlbWVudFswXS5vZmZzZXRXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi50b3AgKyB0aGlzLl8kZWxlbWVudFswXS5vZmZzZXRIZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRlbGVtZW50LmZpbmQoYC4ke2JhbGxvb25BcnJvd31gKVswXS5vZmZzZXRIZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgXSkpO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiDQn9GA0L7QstC10YDRj9C10Lwg0L3QsNC70LjRh9C40LUg0Y3Qu9C10LzQtdC90YLQsCAo0LIg0JjQlSDQuCDQntC/0LXRgNC1INC10LPQviDQtdGJ0LUg0LzQvtC20LXRgiDQvdC1INCx0YvRgtGMKS5cbiAgICAgICAgICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgICAgICAgICAqIEBuYW1lIF9pc0VsZW1lbnRcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0ge2pRdWVyeX0gW2VsZW1lbnRdINCt0LvQtdC80LXQvdGCLlxuICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSDQpNC70LDQsyDQvdCw0LvQuNGH0LjRjy5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBfaXNFbGVtZW50OiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnRbMF0gJiYgZWxlbWVudC5maW5kKGAuJHtiYWxsb29uQXJyb3d9YClbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBiYWxsb29uTGF5b3V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCY0L3QuNGG0LjQsNC70LjQt9C40YDRg9C10Lwg0YLQsNCx0YtcbiAgICAgKi9cbiAgICBpbml0VGFicygpIHtcbiAgICAgICAgY29uc3QgY2xhc3NUYWIgPSBgLmIteWFuZGV4LW1hcF9fdGFiLWl0ZW1gO1xuICAgICAgICBjb25zdCB0YWJJdGVtcyA9IHRoaXMubWFwV3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKGNsYXNzVGFiKTtcblxuICAgICAgICAvLyDQn9GA0L7QstC10YDRj9C10Lwg0L3QsNC70LjRh9C40LUg0YLQsNCx0L7QslxuICAgICAgICBpZiAoIXRhYkl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFic0FycmF5ID0gWy4uLnRhYkl0ZW1zXTtcblxuICAgICAgICB0YWJzQXJyYXkuZm9yRWFjaCgodGFiKSA9PiB7XG4gICAgICAgICAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcihgY2xpY2tgLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlVGFicyh0YWIpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTWFya2Vycyh0YWIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0L7QutCw0LfRi9Cy0LDQtdC8L9GB0LrRgNGL0LLQsNC10Lwg0LzQsNGA0LrQtdGA0Ysg0L3QsCDQutCw0YDRgtC1XG4gICAgICogQHBhcmFtIHtub2RlfSB0YWIgLSDQvdC+0LTQsCDRgtCw0LHQsCDQv9C+INC60L7RgtC+0YDQvtC80YMg0L/RgNC+0LjQt9C+0YjQvtC7INC60LvQuNC6XG4gICAgICovXG4gICAgdG9nZ2xlTWFya2Vycyh0YWIpIHtcbiAgICAgICAgY29uc3QgY2xhc3NMaW5rID0gYC5iLXlhbmRleC1tYXBfX3RhYi1saW5rYDtcblxuICAgICAgICBjb25zdCB0eXBlID0gcGFyc2VJbnQodGFiLnF1ZXJ5U2VsZWN0b3IoY2xhc3NMaW5rKS5kYXRhc2V0LnR5cGUpO1xuXG4gICAgICAgIHRoaXMubWFwLmdlb09iamVjdHMuZWFjaChmdW5jdGlvbihnZW9PYmplY3QpIHtcblxuICAgICAgICAgICAgY29uc3QgY3VycmVudFR5cGUgPSBwYXJzZUludChnZW9PYmplY3QucHJvcGVydGllcy5nZXQoJ3R5cGUnKSk7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50VHlwZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb09iamVjdC5vcHRpb25zLnNldCgndmlzaWJsZScsIHRydWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFR5cGUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvT2JqZWN0Lm9wdGlvbnMuc2V0KCd2aXNpYmxlJywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VHlwZSAhPT0gdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBnZW9PYmplY3Qub3B0aW9ucy5zZXQoJ3Zpc2libGUnLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvT2JqZWN0Lm9wdGlvbnMuc2V0KCd2aXNpYmxlJywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9C10YDQtdC60LvRjtGH0LDQtdC8INGC0LDQsdGLXG4gICAgICogQHBhcmFtIHtub2RlfSB0YWIgLSDQvdC+0LTQsCDRgtCw0LHQsCDQv9C+INC60L7RgtC+0YDQvtC80YMg0L/RgNC+0LjQt9C+0YjQvtC7INC60LvQuNC6XG4gICAgICovXG4gICAgdG9nZ2xlVGFicyh0YWIpIHtcbiAgICAgICAgY29uc3QgaXNBY3RpdmUgPSBgaXMtYWN0aXZlYDtcbiAgICAgICAgY29uc3QgY2xhc3NMaW5rID0gYC5iLXlhbmRleC1tYXBfX3RhYi1saW5rYDtcbiAgICAgICAgY29uc3QgY2xhc3NUYWIgPSBgLmIteWFuZGV4LW1hcF9fdGFiLWl0ZW1gO1xuXG4gICAgICAgIGNvbnN0IGFjdGl2ZVR5cGUgPSB0YWIucXVlcnlTZWxlY3RvcihjbGFzc0xpbmspLmRhdGFzZXQudHlwZTtcbiAgICAgICAgY29uc3QgdGFiSXRlbXMgPSBbLi4udGhpcy5tYXBXcmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoY2xhc3NUYWIpXTtcblxuICAgICAgICB0YWJJdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpdGVtVHlwZSA9IGl0ZW0ucXVlcnlTZWxlY3RvcihjbGFzc0xpbmspLmRhdGFzZXQudHlwZTtcbiAgICAgICAgICAgIGlmIChpdGVtVHlwZSA9PT0gYWN0aXZlVHlwZSkge1xuICAgICAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChpc0FjdGl2ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKGlzQWN0aXZlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0YDQsNC00LjRg9GB0L7QslxuICAgICAqL1xuICAgIGluaXRDaXJjbGVzKCkge1xuICAgICAgICBjb25zdCBjaXJjbGVzID0gdGhpcy5zZXR0aW5ncy5jaXJjbGVzO1xuXG5cbiAgICAgICAgaWYgKGNpcmNsZXMpIHtcbiAgICAgICAgICAgIGNpcmNsZXMuZm9yRWFjaCgoY2lyY2xlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlDaXJjbGUgP
46184SBuZXcgeW1hcHMuQ2lyY2xlKFtcbiAgICAgICAgICAgICAgICAgICAgY2lyY2xlLmNlbnRlciwgY2lyY2xlLnJhZGl1c1xuICAgICAgICAgICAgICAgIF0sIHt9LCB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogY2lyY2xlLmZpbGxDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IGNpcmNsZS5maWxsT3BhY2l0eSxcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IGNpcmNsZS5zdHJva2VDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlT3BhY2l0eTogY2lyY2xlLnN0cm9rZU9wYWNpdHksXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiBjaXJjbGUuc3Ryb2tlV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZVN0eWxlOiBjaXJjbGUuc3Ryb2tlU3R5bGVcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMubWFwLmdlb09iamVjdHMuYWRkKG15Q2lyY2xlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiDQntGC0LrQu9GO0YfQsNC10Lwg0L/QtdGA0LXRgtCw0YHQutC40LLQsNC90LjQtSDQutCw0YDRgtGLINC/0YDQuCDQv9GA0L7QutGA0YPRgtC60LUg0L7QtNC90LjQvCDQv9Cw0LvRjNGG0LXQvCDQvdCwINC80L7QsdC40LvQutC1XG4gICAgICovXG4gICAgLy8gVE9ETyDQn9C10YDQtdC/0LjRgdCw0YLRjCDQv9GA0LDQstC40LvRjNC90L4sINGH0YLQviDQsdGLINGD0LHRgNCw0YLRjCDQuNCz0L3QvtGA0LjRgNC+0LLQsNC90LjQtSDQu9C40L3RgtC+0LxcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgIGRpc2FibGVNb2JpbGVEcmFnKCkge1xuICAgICAgICBjb25zdCBpc01vYmlsZSA9IHtcbiAgICAgICAgICAgIEFuZHJvaWQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBCbGFja0JlcnJ5OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaU9TOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgT3BlcmE6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBXaW5kb3dzOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFueTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc01vYmlsZS5BbmRyb2lkKCkgfHwgaXNNb2JpbGUuQmxhY2tCZXJyeSgpIHx8IGlzTW9iaWxlLmlPUygpIHx8IGlzTW9iaWxlLk9wZXJhKCkgfHwgaXNNb2JpbGUuV2luZG93cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChpc01vYmlsZS5hbnkoKSkge1xuICAgICAgICAgICAgdGhpcy5tYXAuYmVoYXZpb3JzLmRpc2FibGUoJ2RyYWcnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgWWFuZGV4TWFwO1xuXG4vKiBlc2xpbnQtZW5hYmxlICovXG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcblxuICAgICAgICBzY3JpcHQuc3JjID0gYGh0dHBzOi8vYXBpLW1hcHMueWFuZGV4LnJ1LzIuMS8/bGFuZz1ydV9SVWA7XG4gICAgICAgIHNjcmlwdC5hc3luYyA9IHRydWU7XG4gICAgICAgIHNjcmlwdC5kZWZlciA9IHRydWU7XG4gICAgICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgICAgIHNjcmlwdC5vbmxvYWQgPSByZXNvbHZlO1xuICAgICAgICBzY3JpcHQub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfTtcblxuICAgICAgICBkb2
46184N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgd2luZG93LnltYXBzLnJlYWR5KHJlc29sdmUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xufVxuIiwidmFyIHR3aWcgPSByZXF1aXJlKFwidHdpZ1wiKS50d2lnLFxuICAgIHRlbXBsYXRlID0gdHdpZyh7XCJpZFwiOlwiMGJiNTg5MmJjZGUwMmMzYjQ2MzdkYmE5ODFkMjk2NjVhZmJlOGIxMzgxOTg2OThjNTQ1MTMzM2E2NDI1OGQ5YjUwYjJkZjMyY2JjMzMwNThiYTNmODFmNzIyMGE3YjFmMWExNDJkZmVmM2FjNmMxOTRiOGMzMmEzYjZkZWViZDhcIixcImRhdGFcIjpbe1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiPHN2ZyB3aWR0aD1cXFwiMjRcXFwiIGhlaWdodD1cXFwiMjRcXFwiIHZpZXdCb3g9XFxcIjAgMCAyNCAyNFxcXCI+XFxuICAgIDxwYXRoIGZpbGw9XFxcIiNENjlEM0FcXFwiXFxuICAgICAgICAgIGQ9XFxcIk0xMy42OTA2Mzk5LDE3LjA4NjI5MzEgQzE1LjA4MjI2OTYsMTIuMzEyNTQ2IDE5LjE1MjgxMzEsMTAuNzY1Mzc1NiAyNCwxMC4xMjEwMzM5IEwyNCw4IEMxOS42MzEzMDA3LDguNTE2OTMyMDMgMTUuNzA4NTQwOCw4Ljk4MDQyNzkyIDEzLjI3NzA2MDgsMTIuNzAyMzQ5OSBMMTEuOTk5NjY4LDE0LjY1NzY4NDIgTDEwLjcyMjc0MDcsMTIuNzAyMDQ1OSBDOC4yOTI2MDM0NSw4Ljk4MDI0NTAyIDQuMzY5ODc5Niw4LjUxNjc2ODYxIDAsOCBMMCwxMC4xMjA5OTUgQzQuODQ3NzY5MjQsMTAuNzY1MTg3OCA4LjkxNzg4Nzk0LDEyLjMxMTk4NTcgMTAuMzEwNTkyOCwxNy4wODYyOTMxIEwxMy42OTA2Mzk5LDE3LjA4NjI5MzEgWlxcXCI+XFxuICAgICAgICA8YW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPVxcXCJkXFxcIiBkdXI9XFxcIjI1MDBtc1xcXCIgcmVwZWF0Q291bnQ9XFxcImluZGVmaW5pdGVcXFwiIHZhbHVlcz1cXFwiTTEzLjY5MDYzOTksMTcuMDg2MjkzMSBDMTUuMDgyMjY5NiwxMi4zMTI1NDYgMTkuMTUyODEzMSwxMC43NjUzNzU2IDI0LDEwLjEyMTAzMzkgTDI0LDggQzE5LjYzMTMwMDcsOC41MTY5MzIwMyAxNS43MDg1NDA4LDguOTgwNDI3OTIgMTMuMjc3MDYwOCwxMi43MDIzNDk5IEwxMS45OTk2NjgsMTQuNjU3Njg0MiBMMTAuNzIyNzQwNywxMi43MDIwNDU5IEM4LjI5MjYwMzQ1LDguOTgwMjQ1MDIgNC4zNjk4Nzk2LDguNTE2NzY4NjEgMCw4IEwwLDEwLjEyMDk5NSBDNC44NDc3NjkyNCwxMC43NjUxODc4IDguOTE3ODg3OTQsMTIuMzExOTg1NyAxMC4zMTA1OTI4LDE3LjA4NjI5MzEgTDEzLjY5MDYzOTksMTcuMDg2MjkzMSBaO1xcbiAgICAgICAgICBNMTMuNjkwNjM5OSwxOC4wODYyOTMxIEMxNS4wODIyNjk2LDEzLjMxMjU0NiAxOC4xNTI4MTMxLDExLjc2NTM3NTYgMjMsMTEuMTIxMDMzOSBMMjQsOS4wMDAwNDk1NCBDMTkuNjMxMzAwNyw5LjUxNjkzMjAzIDE1LjcwODU0MDgsOS45ODA0Mjc5MiAxMy4yNzcwNjA4LDEzLjcwMjM0OTkgTDExLjk5OTY2OCwxNS42NTc2ODQyIEwxMC43MjI3NDA3LDEzLjcwMjA0NTkgQzguMDkwNTU4ODIsMTAuNTE2NzY4NiA0LjM2OTg3OTYsMTAuNTE2NzY4NiA0LjU0NzQ3MzUxZS0xMywxMCBMMSwxMi4xMjA5OTUgQzUuODQ3NzY5MjQsMTIuNzY1MTg3OCA4LjkxNzg4Nzk0LDEzLjMxMTk4NTcgMTAuMzEwNTkyOCwxOC4wODYyOTMxIEwxMy42OTA2Mzk5LDE4LjA4NjI5MzEgWjtcXG4gICAgICAgICAgTTEyLjY5MDYzOTksMTguMDg2MjkzMSBDMTQuMDgyMjY5NiwxMy4zMTI1NDYgMTkuMTUyODEzMSwxNC43NjUzNzU2IDI0LDE0LjEyMTAzMzkgTDI0LDEyLjAwMDA0OTUgQzE5LjYzMTMwMDcsMTIuNTE2OTMyIDE1LjcwODU0MDgsOS45ODA0Mjc5MiAxMy4yNzcwNjA4LDEzLjcwMjM0OTkgTDExLjk5OTY2OCwxNS42NTc2ODQyIEwxMC43MjI3NDA3LDEzLjcwMjA0NTkgQzguMjkyNjAzNDUsOS45ODAyNDUwMiA0LjM2OTg3OTYsMTIuNTE2NzY4NiA0LjU0NzQ3MzUxZS0xMywxMiBMMCwxNC4xMjA5OTUgQzQuODQ3NzY5MjQsMTQuNzY1MTg3OCA5LjkxNzg4Nzk0LDEzLjMxMTk4NTcgMTEuMzEwNTkyOCwxOC4wODYyOTMxIEwxMi42OTA2Mzk5LDE4LjA4NjI5MzEgWjtcXG4gICAgICAgICAgICAgIE0xMi42OTA2Mzk5LDE4LjA4NjI5MzEgQzE0LjA4MjI2OTYsMTMuMzEyNTQ2IDE4LjE1MjgxMzEsMTIuNzY1Mzc1NiAyMywxMi4xMjEwMzM5IEwyMywxMC4wMDAwNDk1IEMxOC42MzEzMDA3LDEwLjUxNjkzMiAxNS43MDg1NDA4LDkuOTgwNDI3OTIgMTMuMjc3MDYwOCwxMy43MDIzNDk5IEwxMS45OTk2NjgsMTUuNjU3Njg0MiBMMTAuNzIyNzQwNywxMy43MDIwNDU5IEM4LjI5MjYwMzQ1LDkuOTgwMjQ1MDIgNS4zNjk4Nzk2LDguNTE2NzY4NjEgMSw4IEwxLDEwLjEyMDk5NSBDNS44NDc3NjkyNCwxMC43NjUxODc4IDkuOTE3ODg3OTQsMTMuMzExOTg1NyAxMS4zMTA1OTI4LDE4LjA4NjI5MzEgTDEyLjY5MDYzOTksMTguMDg2MjkzMSBaO1xcbiAgICAgICAgIE0xMy42OTA2Mzk5LDE3LjA4NjI5MzEgQzE1LjA4MjI2OTYsMTIuMzEyNTQ2IDE5LjE1MjgxMzEsMTAuNzY1Mzc1NiAyNCwxMC4xMjEwMzM5IEwyNCw4IEMxOS42MzEzMDA3LDguNTE2OTMyMDMgMTUuNzA4NTQwOCw4Ljk4MDQyNzkyIDEzLjI3NzA2MDgsMTIuNzAyMzQ5OSBMMTEuOTk5NjY4LDE0LjY1NzY4NDIgTDEwLjcyMjc0MDcsMTIuNzAyMDQ1OSBDOC4yOTI2MDM0NSw4Ljk4MDI0NTAyIDQuMzY5ODc5Niw4LjUxNjc2ODYxIDAsOCBMMCwxMC4xMjA5OTUgQzQuODQ3NzY5MjQsMTAuNzY1MTg3OCA4LjkxNzg4Nzk0LDEyLjMxMTk4NTcgMTAuMzEwNTkyOCwxNy4wODYyOTMxIEwxMy42OTA2Mzk5LDE3LjA4NjI5MzEgWlxcXCI+PC9hbmltYXRlPlxcbiAgICA8L3BhdGg+XFxuPC9zdmc+XFxuXCJ9XSxcImFsbG93SW5saW5lSW5jbHVkZXNcIjp0cnVlLFwicmV0aHJvd1wiOnRydWV9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb250ZXh0KSB7IHJldHVybiB0ZW1wbGF0ZS5yZW5kZXIoY29udGV4dCk7IH0iLCJ2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCI2NTUyMDI0ZDU3NzQwYjBl
46184NTY5MzVlMjhiMjk1ZTEyMDkwOGQ4NWRjYjM2ZGU4NTI2ZDg3MDFiMTY1YzUxZGJhMDJhZWQ3MDM0MmNlZWEwODIwMGMyYzZkODU4NjM5ZTEzMjg4MTkzNjNlYzRiYzJmZGNiNDAzZTk0ODFhNjMyZVwiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8ZGl2IGNsYXNzPSdiLXlhbmRleC1tYXBfX3pvb20tY29udHJvbHMnPlxcbiAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgaWQ9XFxcIlwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwiaWRcIixcIm1hdGNoXCI6W1wiaWRcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiLWluXFxcIiBjbGFzcz1cXFwiYi15YW5kZXgtbWFwX196b29tLWJ0blxcXCI+XFxuICAgICAgICA8c3ZnIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCJcXG4gICAgICAgICAgICAgeG1sbnM6eGxpbms9XFxcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcXFwiXFxuICAgICAgICAgICAgIHdpZHRoPVxcXCIxMlxcXCJcXG4gICAgICAgICAgICAgaGVpZ2h0PVxcXCIxMlxcXCJcXG4gICAgICAgICAgICAgdmlld0JveD1cXFwiMCAwIDEyIDEyXFxcIlxcbiAgICAgICAgICAgICBjbGFzcz1cXFwiYi15YW5kZXgtbWFwX196b29tLWljb24gYi15YW5kZXgtbWFwX196b29tLWljb25fcGx1c19pY29uXFxcIj5cXG4gICAgICAgICAgICA8cGF0aCBpZD1cXFwiZDNsMGFcXFwiIGQ9XFxcIk0xNzcyIDEyNDdhMSAxIDAgMCAxIDIgMHYxMGExIDEgMCAwIDEtMiAwelxcXCI+PC9wYXRoPlxcbiAgICAgICAgICAgIDxwYXRoIGlkPVxcXCJkM2wwYlxcXCIgZD1cXFwiTTE3NzggMTI1MWExIDEgMCAwIDEgMCAyaC0xMGExIDEgMCAwIDEgMC0yelxcXCI+PC9wYXRoPlxcbiAgICAgICAgICAgIDxnIHRyYW5zZm9ybT1cXFwidHJhbnNsYXRlKC0xNzY3IC0xMjQ2KVxcXCI+XFxuICAgICAgICAgICAgICAgIDx1c2UgZmlsbD1cXFwiIzY2NlxcXCIgeGxpbms6aHJlZj1cXFwiI2QzbDBhXFxcIj48L3VzZT5cXG4gICAgICAgICAgICA8L2c+XFxuICAgICAgICAgICAgPGcgdHJhbnNmb3JtPVxcXCJ0cmFuc2xhdGUoLTE3NjcgLTEyNDYpXFxcIj5cXG4gICAgICAgICAgICAgICAgPHVzZSBmaWxsPVxcXCIjNjY2XFxcIiB4bGluazpocmVmPVxcXCIjZDNsMGJcXFwiPjwvdXNlPlxcbiAgICAgICAgICAgIDwvZz5cXG4gICAgICAgIDwvc3ZnPlxcbiAgICA8L2J1dHRvbj5cXG4gICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGlkPVxcXCJcIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcImlkXCIsXCJtYXRjaFwiOltcImlkXCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIi1vdXRcXFwiIGNsYXNzPVxcXCJiLXlhbmRleC1tYXBfX3pvb20tYnRuXFxcIj5cXG4gICAgICAgIDxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIlxcbiAgICAgICAgICAgICB4bWxuczp4bGluaz1cXFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1xcXCJcXG4gICAgICAgICAgICAgd2lkdGg9XFxcIjEyXFxcIlxcbiAgICAgICAgICAgICBoZWlnaHQ9XFxcIjEyXFxcIlxcbiAgICAgICAgICAgICB2aWV3Qm94PVxcXCIwIDAgMTIgMlxcXCJcXG4gICAgICAgICAgICAgY2xhc3M9XFxcImIteWFuZGV4LW1hcF9fem9vbS1pY29uIGIteWFuZGV4LW1hcF9fem9vbS1pY29uX21pbnVzX2ljb25cXFwiPlxcbiAgICAgICAgICAgIDxwYXRoIGlkPVxcXCJjaWhqYVxcXCIgZD1cXFwiTTE3NzggMTI4M2ExIDEgMCAwIDEgMCAyaC0xMGExIDEgMCAwIDEgMC0yelxcXCI+PC9wYXRoPlxcbiAgICAgICAgICAgIDxnIHRyYW5zZm9ybT1cXFwidHJhbnNsYXRlKC0xNzY3IC0xMjgzKVxcXCI+XFxuICAgICAgICAgICAgICAgIDx1c2UgZmlsbD1cXFwiIzY2NlxcXCIgeGxpbms6aHJlZj1cXFwiI2NpaGphXFxcIj48L3VzZT5cXG4gICAgICAgICAgICA8L2c+XFxuICAgICAgICA8L3N2Zz5cXG4gICAgPC9idXR0b24+XFxuPC9kaXY+XFxuXCJ9XSxcImFsbG93SW5saW5lSW5jbHVkZXNcIjp0cnVlLFwicmV0aHJvd1wiOnRydWV9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb250ZXh0KSB7IHJldHVybiB0ZW1wbGF0ZS5yZW5kZXIoY29udGV4dCk7IH0iLCJ2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCJjMTM1ODFhOWRhN2EyMTY5YmJhNmRkMGIyM2E4NDQzZmEzZDMxYzUzNDkxZTgwYTA4Y2EyZDQzMTBlNDAyN2U2ZTM3ZjhiZDBkODUxYjNiMjEwMmQ4NmI2ZDZhMmE4OTc2ZDlhNjNmNTFjN2UzZmEzYzc1OGExNGRhYWFkYjMxZFwiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8dWwgY2xhc3M9XFxcImItbGVnZW5kLWxpc3RcXFwiPlxcbiAgICA8bGk+XFxuICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy95YW5kZXgtbWFwL3Bpbi15ZWxsb3cucG5nXFxcIiBjbGFzcz1cXFwiYi1sZWdlbmQtbGlzdF9faW1nXFxcIiBhbHQ9XFxcItCi0LXQutGD0YnQuNC1INC/0YDQvtC10LrRgtGLXFxcIj5cXG4gICAgICAgINCi0LXQutGD0YnQuNC1INC/0YDQvtC10LrRgtGLXFxuICAgIDwvbGk+XFxuICAgIDxsaT5cXG4gICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL3lhbmRleC1tYXAvcGluLXdoaXRlLnBuZ1xcXCIgY2xhc3M9XFxcImItbGVnZW5kLWxpc3RfX2ltZ1xcXCIgYWx0PVxcXCLQoNC10LDQu9C40LfQvtCy0LDQvdC90YvQtSDQv9GA0L7QtdC60YLRi1xcXCI+XFxuICAgICAgICDQoNC10LDQu9C40LfQvtCy0LDQvdC90YvQtSDQv9GA0L7QtdC60YLRi1xcbiAgICA8L2xpPlxcbjwvdWw+XFxuXCJ9XSxcImFsbG93SW5saW5lSW5jbHVkZXNcIjp0cnVlLFwicmV0aHJvd1wiOnRydWV9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb250ZXh0KSB7IHJldHVybiB0ZW1wbGF0ZS5yZW5kZXIoY29udGV4dCk7IH0iLCJ2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCJhMzMwNDRlYzc2NTdiYWQ2YmI3YmM0MTc0MmY4MjU2NzJmZTM1ODQwYjEzMzc1Nzc2YmIyOTg4MTZiZDQzM2FjNmNmM2IzZWE1ZjlkODQ3OTgwNThjYzIzYmE0ZTM0M2VjYjlhNTA0ZGZhYjE5MzNjMzY1OGY4ODRlMzc2MTg3ZFwiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8ZGl2IGNsYXNzPVxcXCJiLXlhbmRleC1tYXBfX2h0bWwtbWFya2VyXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYi15YW5kZXgtbWFwX19odG1sLW1hcmtlci10aXRsZVxcXCI+IFwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwidGl0bGVcIixcIm1hdGNoXCI6W1widGl0bGVcIl19XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJiLXlhbmRleC1tYXBfX2h0bWwtbWFya2VyLXRleHRcXFwiPiBcIn0se1widHlwZVwiOlwib3V0cHV0XCIsXCJzdGFja1wiOlt7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS52YXJpYWJsZVwiLFwidmFsdWVcIjpcInRleHRcIixcIm1hdGNoXCI6W1widG
46184V4dFwiXX1dfSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCIgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImIteWFuZGV4LW1hcF9faHRtbC1tYXJrZXItaWNvblxcXCI+XFxuICAgICAgICA8aW1nIHNyYz1cXFwiXCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJpY29uXCIsXCJtYXRjaFwiOltcImljb25cIl19LHtcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLmtleS5wZXJpb2RcIixcImtleVwiOlwic3JjXCJ9XX0se1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiXFxcIiBhbHQ9XFxcIlwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwiaWNvblwiLFwibWF0Y2hcIjpbXCJpY29uXCJdfSx7XCJ0eXBlXCI6XCJUd2lnLmV4cHJlc3Npb24udHlwZS5rZXkucGVyaW9kXCIsXCJrZXlcIjpcImFsdFwifV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIlxcXCI+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlwifV0sXCJhbGxvd0lubGluZUluY2x1ZGVzXCI6dHJ1ZSxcInJldGhyb3dcIjp0cnVlfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oY29udGV4dCkgeyByZXR1cm4gdGVtcGxhdGUucmVuZGVyKGNvbnRleHQpOyB9IiwidmFyIHR3aWcgPSByZXF1aXJlKFwidHdpZ1wiKS50d2lnLFxuICAgIHRlbXBsYXRlID0gdHdpZyh7XCJpZFwiOlwiZjYwOTA2MWRiNDg1MGJiMDc4NTliOTAzMDQ0MDNlZDgwNWQxN2IxYjc3MWE5ZGY1Y2YwMTg2OTZiMjEyNTEyZTZkNjcxM2EyMjc1ZWFkNTljMDJhNjExOGJmYTE3YjE1MWFmNjhkNTY4MzM0MjNhMTFiNzg0NGFhZTAwYjVjNWZcIixcImRhdGFcIjpbe1widHlwZVwiOlwicmF3XCIsXCJ2YWx1ZVwiOlwiPGRpdiBjbGFzcz1cXFwiYi15YW5kZXgtbWFwX19odG1sLW1hcmtlci0yXFxcIj4gXCJ9LHtcInR5cGVcIjpcIm91dHB1dFwiLFwic3RhY2tcIjpbe1widHlwZVwiOlwiVHdpZy5leHByZXNzaW9uLnR5cGUudmFyaWFibGVcIixcInZhbHVlXCI6XCJ0aXRsZVwiLFwibWF0Y2hcIjpbXCJ0aXRsZVwiXX1dfSx7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCIgPC9kaXY+XCJ9XSxcImFsbG93SW5saW5lSW5jbHVkZXNcIjp0cnVlLFwicmV0aHJvd1wiOnRydWV9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb250ZXh0KSB7IHJldHVybiB0ZW1wbGF0ZS5yZW5kZXIoY29udGV4dCk7IH0iLCJ2YXIgdHdpZyA9IHJlcXVpcmUoXCJ0d2lnXCIpLnR3aWcsXG4gICAgdGVtcGxhdGUgPSB0d2lnKHtcImlkXCI6XCI5YzEzZjA4ZWQ3Njc0MTY2OTVmYjQ4NGI3ODk4ZWRjOWVmMzUzN2RlNjQ1ODM1M2Q2MGZkN2FkMGFiNDk3ZWIwM2E4MDkyYWUxOTBmODc4ZWVjMjA4MzgxMWUyNjY3NzFhNjU4YjQ1ODA4NDIzZDc3YTMwZDEyYWQ4ZmM1NDhmY1wiLFwiZGF0YVwiOlt7XCJ0eXBlXCI6XCJyYXdcIixcInZhbHVlXCI6XCI8ZGl2IGNsYXNzPVxcXCJiLXlhbmRleC1tYXBfX2h0bWwtdGV4dFxcXCI+XFxuICAgIFwifSx7XCJ0eXBlXCI6XCJvdXRwdXRcIixcInN0YWNrXCI6W3tcInR5cGVcIjpcIlR3aWcuZXhwcmVzc2lvbi50eXBlLnZhcmlhYmxlXCIsXCJ2YWx1ZVwiOlwidGV4dFwiLFwibWF0Y2hcIjpbXCJ0ZXh0XCJdfV19LHtcInR5cGVcIjpcInJhd1wiLFwidmFsdWVcIjpcIlxcbjwvZGl2PlwifV0sXCJhbGxvd0lubGluZUluY2x1ZGVzXCI6dHJ1ZSxcInJldGhyb3dcIjp0cnVlfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oY29udGV4dCkgeyByZXR1cm4gdGVtcGxhdGUucmVuZGVyKGNvbnRleHQpOyB9IiwiLyogKGlnbm9yZWQpICovIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDM0JBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7QUNEQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3pCQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFGQTtBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBSkE7QUFNQTtBQUNBO0FBWkE7QUFDQTtBQVlBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUMzQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUVBO0FBQ0E7Ozs7Ozs7Ozs7O0FDM0JBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBOzs7Ozs7Ozs7OztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDeEJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUdBOzs7Ozs7Ozs7OztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBN0NBO0FBK0NBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQVBBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFwSEE7Ozs7Ozs7Ozs7O0FDMUJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQW5CQTtBQXNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBaEJBO0FBa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFuQ0E7Ozs7Ozs7Ozs7OztBQ2hEQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7Ozs7Ozs7Ozs7O0FDcEZBO0FBQUE7QUFBQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNEQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFUQTtBQUNBO0FBVUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBOzs7Ozs7Ozs7Ozs7QUN6QkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNOQTtBQUNBOzs7Ozs7Ozs7OztBQ0RBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFDQTs7Ozs7Ozs7Ozs7QUNkQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7QUMxQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUNBOzs7Ozs7Ozs7OztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUZBO0FBR0E7QUFBQTtBQUVBO0FBTEE7QUFNQTtBQUFBO0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7O0FDL0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN0Q0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7QUN4QkE7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBR0E7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNQQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7O0FDREE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7O0FDRkE
461847QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQVRBO0FBQ0E7QUFVQTtBQUNBOzs7Ozs7Ozs7OztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0xBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ1BBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNYQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNaQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7O0FDcEVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7O0FDckJBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7QUNGQTs7Ozs7Ozs7Ozs7QUNBQTs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBTUE7QUFDQTs7Ozs7Ozs7Ozs7QUNUQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFZQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUhBO0FBQUE7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBOzs7Ozs7Ozs7Ozs7O0FDOUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBOzs7Ozs7Ozs7OztBQ3pDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3BFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUNBOzs7Ozs7Ozs7OztBQ2pDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7O0FDeENBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDZkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDZkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDbEJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDTkE7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7Ozs7Ozs7Ozs7O0FDWkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFFQTtBQUNBOzs7Ozs7Ozs7OztBQ2hCQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ05BOzs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7QUNUQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDZkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNUQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDUEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7Ozs7Ozs7Ozs7O0FDUEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM5QkE7QUFDQTs7O0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBbEJBO0FBbUJBOzs7Ozs7Ozs7Ozs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFMQTtBQU1BOzs7Ozs7Ozs7OztBQ1hBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQWZBOzs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFJQTs7Ozs7Ozs7Ozs7QUNaQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7Ozs7Ozs7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTs7Ozs7Ozs7Ozs7QUNoQkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ1BBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDbEJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDZkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7Ozs7OztBQ1hBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQzdCQTs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRkE7Ozs7Ozs7Ozs7O0FDaEZBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNMQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0xBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDWEE7QUFDQTs7O0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQXZFQTtBQUNBO0FBeUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVRBO0FBQ0E7QUFXQTtBQUNBO0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUlBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBREE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQVNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFDQTtBQU1BO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQURBO0FBSUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFFQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7O0FDL2RBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0F
46184BQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBbERBO0FBb0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFRQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNuUkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7Ozs7Ozs7Ozs7O0FDdEJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQUE7QUFFQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7O0FDUkE7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUdBOzs7Ozs7Ozs7OztBQ1BBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ0xBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBSkE7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFKQTs7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBSEE7QUFDQTtBQUlBOzs7Ozs7Ozs7Ozs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFIQTtBQUNBO0FBSUE7Ozs7Ozs7Ozs7OztBQ2JBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUpBOzs7Ozs7Ozs7Ozs7QUNMQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBekJBOzs7Ozs7Ozs7Ozs7QUNWQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFJQTtBQVBBOzs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7O0FDUEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFaQTs7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFKQTs7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQVRBOzs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUpBOzs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUpBOzs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQWZBOzs7Ozs7Ozs7Ozs7QUNYQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUpBOzs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBTkE7Ozs7Ozs7Ozs7O0FDZkE7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7Ozs7Ozs7Ozs7OztBQ0xBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BOzs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFBQTtBQUVBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBTkE7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBR0E7QUFMQTs7Ozs7Ozs7Ozs7QUNYQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7QUNUQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7QUNMQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQW5CQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBOzs7Ozs7Ozs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBTEE7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUhBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBOzs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFqREE7Ozs7Ozs7Ozs7OztBQy9EQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7Ozs7Ozs7Ozs7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7QUNGQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7O0FDRkE
461847QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ1BBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7QUNGQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNUQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBSkE7QUFPQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWZBO0FBQ0E7QUFnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXhDQTs7Ozs7Ozs7Ozs7QUNwUEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBOzs7Ozs7Ozs7OztBQ1RBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBTEE7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXpCQTs7Ozs7Ozs7Ozs7QUNwQkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBWEE7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7Ozs7Ozs7Ozs7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBOzs7Ozs7Ozs7OztBQ3JCQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBOzs7Ozs7Ozs7OztBQ0xBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBOzs7Ozs7Ozs7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFUQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ2hDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBSEE7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDMUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBREE7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFGQTs7Ozs7Ozs7Ozs7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBakJBO0FBQ0E7QUFrQkE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3JIQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7OztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBTUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7OztBQ3JJQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3hCQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7Ozs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7Ozs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBVkE7Ozs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFEQTtBQUNBO0FBZkE7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFKQTs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFaQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7Ozs7Ozs7Ozs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBUkE7Ozs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNOQTtBQUNBOzs7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUhBO0FBQ0E7QUFJQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBYkE7QUFnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFaQTtBQUNBO0FBZUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFkQTtBQUNBO0FBaUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN6T0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQWRBO0FBQ0E7QUFnQkE7Ozs7Ozs7Ozs7O0FDN0NBO0FBQ0E7QUFBQTtBQUNBO0FBREE7Ozs7Ozs7Ozs7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBWkE7QUFDQTtBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDM0RBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTs7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVRBO0FBQ0E7QUFXQTs7Ozs7Ozs7Ozs7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFDQTtBQVVBOzs7Ozs7Ozs7Ozs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBSEE7QUFDQTtBQUtBOzs7Ozs7Ozs7OztBQ1hBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7Ozs7Ozs7Ozs7O0FDREE7QUFDQTs7Ozs7Ozs7Ozs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUhBOzs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVhBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE
461847Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUhBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVhBOzs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUhBOzs7Ozs7Ozs7Ozs7QUNQQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUhBOzs7Ozs7Ozs7OztBQ1BBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBOzs7Ozs7Ozs7OztBQ0pBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQWJBOzs7Ozs7Ozs7Ozs7QUNQQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7Ozs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFSQTs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBREE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQXBEQTtBQUNBO0FBc0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFWQTtBQVlBO0FBQ0E7QUFyQkE7QUF3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBM0NBO0FBOENBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RNQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFYQTs7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFGQTs7Ozs7Ozs7Ozs7QUNMQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBOzs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUZBOzs7Ozs7Ozs7OztBQ2hCQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRkE7Ozs7Ozs7Ozs7O0FDZEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRkE7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBSEE7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFGQTs7Ozs7Ozs7Ozs7QUNiQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFIQTs7Ozs7Ozs7Ozs7QUNMQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBUkE7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTs7Ozs7Ozs7Ozs7QUNEQTtBQUNBOzs7Ozs7Ozs7OztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVRBOzs7Ozs7Ozs7Ozs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFIQTs7Ozs7Ozs7Ozs7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ05BOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBOzs7Ozs7Ozs7OztBQ0RBO0FBQ0E7Ozs7Ozs7Ozs7O0FDREE7QUFDQTs7Ozs7Ozs7Ozs7QUNEQTtBQUNBOzs7Ozs7Ozs7OztBQ0RBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBL0JBO0FBQ0E7QUFpQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDekRBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRkE7Ozs7Ozs7Ozs7O0FDRkE
461847QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUZBOzs7Ozs7Ozs7OztBQ2hCQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBOzs7Ozs7Ozs7Ozs7O0FDck1BOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBTUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7OztBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdkJBO0FBMEJBOzs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BO0FBRUE7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUVBOzs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQWhDQTtBQW1DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQS9DQTtBQWtEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUExQkE7QUE2QkE7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBT0E7QUFFQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFkQTtBQWlCQTs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUVBOzs7Ozs7Ozs7OztBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQS9CQTtBQUNBO0FBaUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQXhGQTtBQTJGQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQU1BO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FBT0E7QUFBQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBMU5BO0FBNk5BOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7Ozs7QUFJQTtBQUxBO0FBQ0E7QUFPQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBakRBO0F
46184Bb0RBOzs7Ozs7O0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQWhFQTtBQW1FQTs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBMUJBO0FBNkJBOzs7Ozs7O0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXZEQTtBQTBEQTs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFsQkE7QUFxQkE7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQVFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUEzQ0E7QUE4Q0E7Ozs7Ozs7Ozs7O0FBVUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFSQTtBQVVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXpGQTtBQTRGQTs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUVBOzs7OztBQUlBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOzs7Ozs7O0FBT0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBR0E7Ozs7O0FBS0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBOzs7Ozs7O0FBT0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBNUNBO0FBNURBO0FBNEdBO0FBQ0E7QUFFQTs7Ozs7OztBQU1BO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWpQQTtBQW9QQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsREE7QUFzREE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBLF
46184dBSUE7QUFFQTs7Ozs7Ozs7Ozs7O0FDbGxGQTtBQUFBO0FBR0E7Ozs7QUFHQTtBQUdBOzs7O0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQXJDQTtBQXlDQTs7Ozs7Ozs7Ozs7O0FDckRBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBR0E7Ozs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7OztBQ3JGQTtBQUFBO0FBQUE7QUFBQTtBQUdBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFuQkE7QUFEQTtBQXlCQTs7OztBQUdBO0FBR0E7Ozs7QUFHQTtBQUdBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3BGQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7Ozs7QUFHQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7Ozs7Ozs7QUFNQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBaERBO0FBbURBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUN4RUE7QUFBQTtBQUNBO0FBRUE7QUFHQTs7Ozs7OztBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBZkE7QUFtQkE7Ozs7Ozs7Ozs7OztBQy9CQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFHQTtBQUVBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUFBO0FBQ0E7QUFBQTs7O0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUExRUE7QUErRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBcEJBO0FBeUJBOzs7Ozs7Ozs7Ozs7QUNwSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQVFBO0FBQ0E7QUFEQTtBQUlBO0FBQ0E7QUFEQTtBQUlBO0FBQ0E7QUFEQTs7Ozs7Ozs7Ozs7O0FDekJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUVBOzs7QUFFQTtBQUVBOzs7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUdBO0FBRUE7Ozs7QUFHQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7O0FDL0JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUdBOzs7OztBQUlBO0FBRUE7O0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFPQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBS0E7QUFDQTs7O0FBR0E7QUFHQTs7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWxHQTtBQXVHQTs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN0TUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTs7Ozs7QUFHQTtBQWNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFGQTtBQUNBO0FBSUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDOUlBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7Ozs7Ozs7OztBQ2xDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFDQTtBQU9BO0FBQUE7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUdBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQUNBO0FBTUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDcEVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN4Q0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN4QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMzQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMzQkE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBR0E7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTs7Ozs7Ozs7Ozs7O0FDbEJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7QUFHQTtBQUNBO0FBRUE7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUVBOzs7OztBQUdBO0FBRUE7Ozs7Ozs7Ozs7OztBQ3JFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7O0FBS0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzdDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7O0FBS0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3ZEQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFHQTs7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDWEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7Ozs7Ozs7O0FBU0E7QUFDQTs7Ozs7Ozs7O0FBU0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFGQTtBQUlBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUdBOzs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7O0F
46184BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBR0E7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBTkE7QUFRQTtBQUdBOzs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQWZBO0FBaUJBO0FBR0E7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBNUJBO0FBOEJBO0FBR0E7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7O0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUdBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7Ozs7Ozs7O0FBT0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNyVEE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUdBOzs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNqQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUEvQkE7QUFDQTtBQXNDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNoRUE7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUZBO0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQWhCQTtBQWtCQTs7Ozs7Ozs7Ozs7O0FDdEJBO0FBQUE7QUFHQTs7Ozs7OztBQU1BO0FBR0E7Ozs7OztBQUtBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNuQkE7QUFBQTtBQUdBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbEJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBOzs7O0FBR0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzVGQTtBQUFBO0FBQUE7QUFHQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2ZBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFHQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNoQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBR0E7Ozs7Ozs7QUFNQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN2QkE7QUFBQTtBQUdBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2xDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBWUE7Ozs7Ozs7Ozs7OztBQ2ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTs7Ozs7OztBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFRQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzNGQTtBQUFBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3BCQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1pBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQURBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFEQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBREE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBREE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBREE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQURBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFEQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFJQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUZBO0FBSUE7QUFDQTtBQUFBO0FBQUE7QUFEQTtBQTlCQTtBQW1DQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3JFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzVCQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBR0E7Ozs7Ozs7Ozs7O0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0F
46184BRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzlEQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBR0E7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7QUM5QkE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUdBOzs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDdEJBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2pDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBR0E7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFqQ0E7QUFDQTtBQW1DQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNoREE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUdBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTs7Ozs7Ozs7Ozs7O0FDaEJBO0FBQUE7QUFBQTtBQUVBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMzREE7QUFBQTtBQUNBO0FBRUE7QUFHQTs7Ozs7O0FBS0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNiQTtBQUFBO0FBR0E7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNaQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBTUE7QUFHQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFmQTtBQUNBO0FBaUJBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFmQTtBQUNBO0FBaUJBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBR0E7QUFDQTtBQUlBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVhBOzs7Ozs7Ozs7Ozs7QUN4VEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUF4QkE7QUFDQTtBQTBCQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM5REE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ25DQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTs7OztBQUdBO0FBQ0E7QUFBQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2xDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTs7Ozs7Ozs7Ozs7O0FDbkNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBOzs7O0FBR0E7QUFDQTtBQUFBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNoQ0E7QUFBQTtBQUdBOzs7O0FBR0E7QUFDQTtBQU9BOzs7Ozs7Ozs7Ozs7QUNkQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBOzs7OztBQUtBO0FBT0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFPQTtBQWRBO0FBaUJBO0FBR0E7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDakVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7QUFJQTtBQUVBO0FBQ0E7QUFBQTtBQUVBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBcEVBO0FBQ0E7QUFxRUE7QUFDQTs7Ozs7Ozs7Ozs7O0FDdkdBO0F
46184BQUE7QUFDQTtBQUFBOzs7Ozs7Ozs7Ozs7O0FDREE7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFYQTtBQUFBO0FBQ0E7QUFVQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsQkE7QUFtQkE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQTVEQTtBQUFBO0FBQ0E7QUEyREE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBM0lBO0FBQ0E7QUE0SUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDNVNBOzs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNYQTs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBbERBO0FBQUE7QUFvREE7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVkE7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBRkE7QUFPQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFwRUE7QUFEQTtBQXdFQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDM1BBOzs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRkE7QUFUQTtBQWNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFUQTtBQURBO0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFsQkE7QUFvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQURBO0FBSkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQW5CQTtBQXFCQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQURBO0FBTUE7QUFDQTtBQVRBO0FBcERBO0FBZ0VBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNoR0E7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBeERBO0FBMERBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFEQTtBQVRBO0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFWQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBVUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBN0hBO0FBK0hBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQTVnQkE7QUFDQTtBQTZnQkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsQkE7QUFvQkE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVkE7QUFDQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBVkE7QUFZQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXhCQTtBQUNBO0FBd0JBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUN
46184BO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQXBDQTtBQUNBO0FBcUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBckZBO0FBdUZBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBcEJBO0FBc0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFqQ0E7QUFtQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTVZQTtBQUNBO0FBNllBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBbkJBO0FBcUJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBRkE7QUFNQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBL0ZBO0FBaUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUN4ckZBOzs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FJQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBREE7QUFIQTtBQVVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUdBO0FBQ0E7QUEzQ0E7QUE2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFMQTtBQU9BO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUE5REE7QUFnRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFkQTtBQS9FQTtBQWdHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFXQTtBQUNBO0FBN2RBO0FBK2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBVUE7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFWQTtBQWxmQTtBQStmQTtBQUNBOzs7Ozs7Ozs7OztBQ3hpQkE7QUFDQTt
46184BQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNKQTs7Ozs7Ozs7Ozs7OztBQWFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUNBO0FBS0E7QUFDQTtBQUVBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUlBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFUQTtBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBOUVBO0FBQ0E7QUFnRkE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUE5S0E7QUFDQTtBQWdMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7Ozs7O0FBVUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFhQTtBQWJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF1QkE7QUF2QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUErQkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBbkNBO0FBc0NBO0FBdENBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTZDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQXZEQTtBQUFBO0FBNkRBO0FBQ0E7QUE5REE7QUFpRUE7QUFqRUE7QUFvRUE7QUFFQTtBQUVBO0FBeEVBO0FBNkVBO0FBQ0E7QUFFQTtBQUVBO0FBbEZBO0FBc0ZBO0FBdEZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBa0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBWkE7QUFqR0E7QUFBQTtBQUFBO0FBQUE7QUF1SEE7QUF2SEE7QUFBQTtBQTRIQTtBQUNBO0FBN0hBO0FBK0hBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFJQTtBQUVBO0FBQ0E7QUExSUE7QUE2SUE7QUFDQTtBQTlJQTtBQWdKQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTdKQTtBQWdLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFyS0E7QUF5S0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBZkE7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU1BO0FBQ0E7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7OztBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBRUE7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7O0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFPQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBSUE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQUlBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFKQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7Ozs7Ozs7Ozs7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXhFQTtBQTJFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBUUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFHQTtBQUNBO0FBQ0E7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUdBO0FBS0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWpOQTtBQW9OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFJQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFqTUE7QUFuVEE7QUF3ZkE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQU5BO0FBU0E7QUFUQTtBQWVBO0FBR0E7QUFHQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT0E7QUFDQTtBQUNBO0FBVEE7QUFXQTtBQUNBO0FBWkE7QUFjQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBT0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPQTtBQVBBO0FBU0E7QUFUQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUFTQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQU9BO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUN
46184BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUtBO0FBekNBO0FBZ0RBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQVNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBRUE7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQU1BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBQ0E7QUFLQTtBQUVBO0FBQ0E7QUFHQTtBQTlFQTtBQUNBO0FBZ0ZBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBaERBO0FBa0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBREE7QUFJQTtBQUpBO0FBT0E7QUFQQTtBQVVBO0FBVkE7QUFhQTtBQWJBO0FBZ0JBO0FBaEJBO0FBbUJBO0FBbkJBO0FBc0JBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWhFQTtBQW1FQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBakhBO0FBQ0E7QUFtSEE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUpBO0FBQUE7QUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUdBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBRUE7QUFDQTtBQUNBO0FBT0E7QUFFQTtBQUNBO0FBRUE7QUFPQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUF6RUE7QUE0RUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFXQTtBQUNBO0FBVUE7QUFTQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXBOQTtBQVpBO0FBQ0E7QUFvT0E7QUFDQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFHQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBSEE7QUFNQTtBQU5BO0FBU0E7QUFUQTtBQUFBO0FBYUE7QUFiQTtBQWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF6VkE7QUE4VkE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUlBO0FBQ0E7QUFMQTtBQU9BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBM0JBO0FBOEJBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBOUlBO0FBZ0pBO0FBRUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFyQkE7QUF3QkE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFoRkE7QUFvRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUEvREE7QUFrRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQWpFQTtBQW1FQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBUkE7QUFBQTtBQUFBO0FBYUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBbkJBO0FBcUJBO0FBRUE7QUFFQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQWJBO0FBQ0E7QUFnQkE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFJQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7QUFFQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBQ0E7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFLQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUF2QkE7QUF5QkE7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUhBO0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFTQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFiQTtBQWdCQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUExQ0E7QUE1VkE7QUFDQTtBQWtaQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBSUE7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUlBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQW5DQTtBQUNBO0FBc0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF6REE7QUE2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQWxCQTtBQW9CQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBM0NBO0FBK0NBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBWkE7QUFlQTtBQWZBO0FBQ0E7QUFrQkE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQU9BO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTt
46184BQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBSUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBSUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUEvRUE7QUFrRkE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBeklBO0FBNElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXBCQTtBQXNCQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBWkE7QUFjQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFMQTtBQUFBO0FBT0E7QUFBQTtBQUFBO0FBQUE7QUFQQTtBQVNBO0FBQ0E7QUFGQTtBQVJBO0FBQUE7QUFDQTtBQWdCQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBU0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFEQTtBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWJBO0FBZ0JBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF2SkE7QUEwSkE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFZQTtBQUNBO0FBQUE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdERBO0FBd0RBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFkQTtBQUNBO0FBZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUF0QkE7QUFDQTtBQXlCQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBekNBO0FBNENBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBbENBO0FBREE7QUF3Q0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBVUE7QUFDQTtBQUVBO0FBS0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBUkE7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFMQTtBQUFBO0FBQUE7QUFDQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBMUNBO0FBNENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQXhDQTtBQTNDQTtBQUNBO0FBc0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFIQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBckNBO0FBQ0E7QUF1Q0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUpBO0FBQ0E7QUFPQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFPQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF4SEE7QUEySEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBTkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUxBO0FBVUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVRBO0FBWUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBWEE7QUFEQTtBQWdCQTtBQUNBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTVFQTtBQUNBO0FBK0VBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFWQTtBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBS0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVRBO0FBWUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXZCQTtBQURBO0FBNEJBO0FBQ0E7QUFDQTtBQUZBO0FBN0RBO0FBb0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF2QkE7QUF5QkE7QUFDQTtBQUNBO0FBWUE7QUFDQTtBQU1BO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE3SkE7QUFtS0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsRUE7QUFxRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVpBO0FBY0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQU1BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBdEVBO0FBZkE7QUFEQTtBQUNBO0FBMkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBRkE7QUFNQTtBQUNBO0FBaEtBO0FBb0tBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBWkE7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFyQkE7QUF1QkE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTt
46184BQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFNQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBbENBO0FBc0NBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPQTtBQVBBO0FBQUE7QUFDQTtBQVVBOzs7Ozs7Ozs7QUFTQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUEzQkE7QUE4QkE7QUE5QkE7QUFpQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUlBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQVpBO0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQTlEQTtBQW9FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFIQTtBQU1BO0FBTkE7QUFBQTtBQVVBO0FBVkE7QUFhQTtBQWJBO0FBZ0JBO0FBaEJBO0FBbUJBO0FBbkJBO0FBc0JBO0FBdEJBO0FBeUJBO0FBekJBO0FBNEJBO0FBNUJBO0FBK0JBO0FBL0JBO0FBa0NBO0FBbENBO0FBd0NBO0FBeENBO0FBQUE7QUE0Q0E7QUE1Q0E7QUErQ0E7QUEvQ0E7QUFBQTtBQW1EQTtBQW5EQTtBQXNEQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQXBFQTtBQUNBO0FBQ0E7QUFzRUE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQTFoQkE7QUE2aEJBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVRBO0FBV0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUEvREE7QUFDQTtBQWtFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUEE7QUFBQTtBQVdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBR0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFuSUE7QUFxSUE7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFJQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFSQTtBQUNBO0FBZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQU1BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXZCQTtBQXlCQTtBQUNBO0FBS0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQUNBO0FBU0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBU0E7QUFFQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7O0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQVdBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFHQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBakRBO0F
46184Bb0RBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXhHQTtBQUNBO0FBMkdBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUdBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBS0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFTQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBbEJBO0FBc0JBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFJQTtBQUdBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMzblVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzlOQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7OztBQ3ZMQTs7Ozs7Ozs7O0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUlBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBck1BO0FBdU1BO0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQzV0QkE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDRHQUlBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFMQTtBQU1BO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFGQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7Ozs7Ozs7QUFRQTtBQUNBO0FBREE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFJQTs7OztBQUdBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7O0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUlBO0FBRUE7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVkE7QUFhQTs7OztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQVFBOzs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUtBO0FBTEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBYUE7QUFiQTtBQUNBO0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7OztBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBRkE7QUFLQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFIQTtBQUFBO0FBQUE7QUFBQTtBQVNBO0FBVEE7QUFXQTtBQVhBO0FBYUE7QUFiQTtBQWVBO0FBZkE7QUFpQkE7QUFqQkE7QUFtQkE7QUFuQkE7QUFzQkE7QUF0QkE7QUFBQTtBQUNBO0FBeUJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVkE7QUFDQTtBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBeEZBO0FBQ0E7QUEwRkE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQVFBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFKQTtBQU9BO0FBUEE
461847QUFBQTtBQVdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBcENBO0FBc0NBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBSUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFqQkE7QUFvQkE7Ozs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7OztBQVdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFVQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFHQTtBQUhBO0FBTUE7QUFOQTtBQUFBO0FBQUE7QUFZQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBSUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBS0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFJQTtBQWJBO0FBQ0E7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBR0E7QUFJQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQW5DQTtBQXNDQTtBQUNBO0FBQ0E7QUFXQTtBQWJBO0FBQ0E7QUE2QkE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQVZBO0FBcUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXhCQTtBQTJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBeEJBO0FBMkJBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFaQTtBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQVZBO0FBWUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBNUZBO0FBK0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWhDQTtBQW1DQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF0QkE7QUF5QkE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVpBO0FBZUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF6R0E7QUE0R0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBYkE7QUFnQkE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBaEZBO0FBbUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUEzQkE7QUE4QkE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQVdBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdkNBO0FBMENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBM0RBO0FBK0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFyQkE7QUF3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUlBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBOUNBO0FBa0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBaEJBO0FBbUJBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFqREE7QUFvREE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFEQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFyREE7QUF3REE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBYkE7QUFnQkE7OztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBWEE7QUFjQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBWkE7QUFnQkE7Ozs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQVNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUVBOzs7OztBQUdBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUFBO0FBRUE7QUFGQTtBQUlBO0FBSkE7QUFNQTtBQU5BO0FBQUE7QUFBQTtBQVFBO0FBUkE7QUFVQTtBQVZBO0FBQUE7QUFDQTtBQVdBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUFBO0FBRUE7QUFGQTtBQUFBO0FBQUE7QUFBQTtBQVFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7Ozs7Ozs7Ozs7OztBQVVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsRkE7QUFDQTtBQW1GQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUEvSUE7QUFpSkE7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQU5BO0FBU0E7QUFHQTtBQUVBO0FBUEE7QUFTQTtBQUdBO0FBRUE7QUFHQTtBQUVBO0FBTkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFRQTtBQUdBO0FBQ0E7QUFBQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFBQTtBQUN
46184BO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsc0JBO0FBQ0E7QUFvc0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFaQTtBQWNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUExQkE7QUE0QkE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBL1JBO0FBQ0E7QUFpU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBbkJBO0FBcUJBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQXBDQTtBQXNDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQWZBO0FBaUJBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFqQkE7QUFtQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFyQkE7QUF1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE5Q0E
461847QUFnREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBOU5BO0FBQ0E7QUFnT0E7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUdBO0FBRUE7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBekJBO0FBOEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQTdDQTtBQWdEQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUEzQ0E7QUE4Q0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBMUJBO0FBNkJBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFZQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQVVBO0FBbEJBO0FBb0JBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBcEpBO0FBdUpBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFZQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBN0NBO0FBZ0RBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFuQ0E7QUFzQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFUQTtBQVlBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBdENBO0FBeUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFZQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQWhGQTtBQW1GQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBeEJBO0FBMkJBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFZQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQW5EQTtBQXNEQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQW5DQTtBQXNDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQXRGQTtBQXlGQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBeEJBO0FBNEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU9BOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBMURBO0FBNkRBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFZQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQTNDQTtBQThDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQXZFQTtBQTBFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQW5HQTtBQXFHQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBVUE7Ozs7QUFHQTtBQUVBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FBU0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBS0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFHQTtBQUVBOzs7Ozs7Ozs7O0FBU0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFRQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBekNBO0FBQ0E7QUE2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FBR0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQS9CQTtBQWlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBSUE7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUdBOzs7Ozs7Ozs7O0FBUUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBQ0E7QUF4aFBBO0FBMUNBO0FBbWtQQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7Ozs7O0FDOWtQQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7O0FDckJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUV
46184BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRUE7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeHJCQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUdBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekRBOzs7Ozs7QUFNQTs7O0FBR0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FBQ0E7Ozs7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQU1BO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUdBOzs7Ozs7Ozs7OztBQ3hOQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQVFBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBR0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqRUE
461847Ozs7OztBQU1BOzs7QUFJQTtBQUVBOzs7O0FBR0E7Ozs7Ozs7OztBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFDQTs7Ozs7O0FBR0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQy9CQTs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBR0E7Ozs7Ozs7Ozs7O0FDaEVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBR0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkZBOzs7Ozs7QUFNQTs7O0FBR0E7QUFDQTtBQUdBOzs7O0FBR0E7Ozs7Ozs7OztBQUNBO0FBQ0E7QUFFQTs7OztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFBQTs7O0FBR0E7QUFDQTtBQUVBOzs7O0FBR0E7QUFDQTtBQUVBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7Ozs7OztBQUdBOzs7Ozs7Ozs7OztBQzlNQTs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWZBO0FBaUJBOzs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7Ozs7OztBQUdBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsSEE7Ozs7OztBQU1BOzs7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBVUE7Ozs7Ozs7QUFPQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBbkJBO0FBc0JBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQXJKQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBcUpBOzs7Ozs7Ozs7Ozs7QUMvUkE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7Ozs7OztBQUdBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdERBOzs7Ozs7QUFNQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUdBOzs7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7Ozs7OztBQUdBO0FBQ0E7Ozs7Ozs7Ozs7O0FDaGFBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUEE7Ozs7O0FBS0E7OztBQUdBO0FBQ0E7QUFDQTtBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFLQTs7O0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7Ozs7OztBQUdBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JVQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7O0FBR0E7Ozs7Ozs7Ozs7O0FDekdBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFDQTtBQUFBO0FBQ0E7QUFBQTs7O0FBR0E7QUFFQTs7Ozs7QUFJQTtBQUVBOzs7OztBQUlBO0FBRUE7Ozs7QUFHQTtBQUVBOzs7O0FBR0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFLQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7OztBQUlBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQW5CQTtBQXNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUZBO0FBT0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE5Q0E
461847QUFpREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFGQTtBQU9BOzs7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQVVBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFiQTtBQWVBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBREE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFGQTtBQU9BO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBTEE7QUFPQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQW5DQTtBQXVDQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBQ0E7QUFNQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBWkE7QUFDQTtBQWNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFYQTtBQUNBO0FBYUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQURBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVVBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBUUE7Ozs7OztBQU1BO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTs7O0FBR0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTs7Ozs7OztBQU9BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQTdIQTtBQWlJQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUFHQTtBQUNBO0FBQUE7QUFDQTs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWxCQTtBQUNBO0FBb0JBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFHQTtBQUVBOzs7Ozs7Ozs7Ozs7O0FDNzRCQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNIQTs7OztBIiwic291cmNlUm9vdCI6IiJ9

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.